2011-03-04 84 views
2

我不明白为什么我告诉我有一个无效的函数声明,当我只是声明一个变量。另外,我不明白为什么我的typedef不起作用。与typedef和函数声明的错误

 
[email protected] 388> g++ -Wall -pthread testHashT.cpp -o testHashT 
memHashT.h:22: error: invalid function declaration 
memHashT.h: In function âvoid memAccessUpdate(void*, unsigned int, pthread_t, bool)â: 
memHashT.h:114: error: cannot convert âmList*â to âlinkedMlist*â in assignment 
memHashT.h:119: error: cannot convert âlinkedMlist*â to âmList*â in assignment 
memHashT.h:128: error: âcountWSâ was not declared in this scope 
memHashT.h:133: error: âcountRAâ was not declared in this scope 
[email protected] 389> cat memHashT.h 
//Basic hash table for memory addresses, recommended size for program running is table indexed by a prime ~81281 


/************************************************************ 
* Structure of table: 
* Hash table indexed by memory address 
* at each entry a vector made of arrays with size 2 of void pointers 
* each vector entry will have the unique memory address and a pointer to a vector 
* the vector it points to will contain a list of all threads that accessed that location 
* 
* Overall:(currently being changed to HT=>LL=>LL 
* Hash Table => Vector => Vector Containing threads that accessed a given memory location 
*************************************************************/ 

#include <pthread.h>//same as bellow 
#include <stdlib.h>//watch out in case actual function contains this 
//using namespace std; 

//Global var 
unsigned int tableSize; //note this is best if it is a prime number 
unsigned long long countWA; 
unsigned long long countRA: 
unsigned long long countWS; 
unsigned long long countRS; 
//Linked Lists (thread, then mem) 
//added all information in T_list to the M list, can be deleted 
/*struct linkedT_list { 
    int threadID; 
    struct linkedT_list * nextT; 
}; 
typedef struct linkedT_list tList; 
tList * currT, * headT;*/ 


//For memory addresses 
struct linkedM_list { 
    void * memAddr; 

    //Details 
     bool shared; 
     pthread_t prevThread; 
     unsigned long long rCounter; 
     unsigned long long wCounter; 
    //End Details 
    struct linkedMlist * nextM; 
}; 
typedef struct linkedM_list mList; 
//mList * currM, * headM; 

mList ** hashTable; 

//computes the index of the hash table 
     //made its own function in case future implementation need to change how indexing is set up 
unsigned int getHTIndex (void * arg){ 
    return (unsigned int) ((unsigned long long)arg%tableSize); 
} 
//returns pointer to mList containing information 
     //NOT CORRECTLY IMPLEMENTED YET, NEED TO FIND RIGHT MEM ADDRESS, NOT JUST TOP MEM 
mList * getHTElement(void * arg){ 
    mList * tempM; 
    //tList * tempT = NULL; 
    unsigned int index = getHTIndex(arg); 
    tempM = hashTable[index]; 
    //tempT = tempM->threadList; 
    return tempM; 
} 
//remove a element 

void removeHTElement(void * memArg){ 
    //note no garbage collection yet 
    ; 
} 

//returns the number of threads to access a memery location 
int tLength(void * arg){ 
    return -1; 
} 
//Create the hash table 
int createHashTable(unsigned int num) { 
    tableSize = num; 
    hashTable = (mList **) malloc(sizeof(mList) * tableSize); 
    if (hashTable == NULL) 
    { 
     return 0; 
     //printf("Error: Memory could not be allocated"); 
    } 
    else { 
     unsigned int i; 

     for(i=0;i<tableSize;i++) 
     { 
      hashTable[i]=NULL; 
     } 
    } 
    return 1; 
} 

void destroyHashTable(){ 
    free(hashTable); 
} 

//adds a element to the hash table 
void memAccessUpdate(void * memArg, unsigned int thread, pthread_t thread_id, bool writeAccess){ 
    mList * headM = getHTElement(memArg); 
    mList * currM; 
    if (headM == NULL) 
    {//then create and new mList 
     currM = (mList *)malloc(sizeof(mList)); 
     //initialize values 
     currM->shared = false; 
     currM->prevThread = thread_id; 
     currM->rCounter = 0; 
     currM->wCounter = 0; 
     currM->nextM = hashTable[getHTIndex(memArg)]; 
     hashTable[getHTIndex(memArg)] = currM; 
    } 
    else {//change details in linked list and global var 
     //headM->nextM = (mList *)malloc(sizeof(mList)); 
     currM = headM->nextM; 
     if (thread_id != currM->prevThread){ 
      currM->shared = true; 
      currM->prevThread = thread_id; 
     } 
     if(writeAccess) 
     { 
      countWA++; 
      if(currM->shared){ 
       countWS++; 
      } 
      currM->wCounter++; 
     } 
     else{//mem read 
      countRA++; 
      if(currM->shared){ 
       countRS++; 
      } 
      currM->rCounter++; 
     } 
    } 
    //if (stuff) //possibly don't need 
    //else 
    // head = hashTable[index]; //note may be null 
    // curr = (mList *)malloc(sizeof(mList)); 
    // curr-> 
} 

我,为什么我得到这些错误很困惑。任何帮助表示赞赏。 (我知道在头文件中声明函数不是很好的做法,但现在我只是想纠正我的语法)。

+0

虽然不是你的问题的答案,但(假设这是来自MacOS X终端),如果你设置**终端 - >首选项 - >设置 - >高级 - >字符编码**到** Unocode(UTF-8)**,编译器的输出将更具可读性,因为''将被打印为引号字符。 – Lindydancer

回答

5

明白了!我花了一段时间,看着什么......仔细看看第22行的最后一个字符:-)

另外,决定是否要将它称为linkedMlistlinkedM_list。 (那个人的眼睛不那么硬)

+0

哦,哇,谢谢:) – technaj

+0

虽然为什么它看起来像编译器的函数声明,我不知道! –

+0

@Charles:必须是一个'C++'的东西:) – pmg

2

struct linkedMlist没有定义或声明,据我所看到

struct linkedM_list { 
    void * memAddr; 

    //Details 
     bool shared; 
     pthread_t prevThread; 
     unsigned long long rCounter; 
     unsigned long long wCounter; 
    //End Details 
    struct linkedMlist * nextM;    // <===== HERE 
}; 
+0

谢谢,我讨厌它时,我犯了一个小的愚蠢的错误... – technaj