2014-02-13 48 views
2

在我的项目中,我有这2个文件。当我尝试编译它时,会得到一些我无法解决的特殊警告,尽管我的程序运行良好。我在编译时使用了-Wall和-Wextra参数。特殊警告C

//File: DataStructures.h 
    typedef struct EntryListPacketStruct EntryListPacket; 
     typedef struct IndexesPacketStruct IndexesPacket; 
     typedef struct MatchingQueriesResultStruct MatchingQueriesResult; 
     typedef struct DataPacketStruct* DataPacketPtr; 

     extern DataPacketPtr Packet; 

     EntryListPacket* allocateEntryListPacket(void); 

     void initializeDataPacket(DataPacketPtr); 
     void freeDataPacket(DataPacketPtr); 

     void initializeEntryListPacket(EntryListPacket*); 
     void freeEntryListsPacket(EntryListPacket*); 

我包括DataStructures.h在以下文件:

//File: DataStructures.c 
struct EntryListPacketStruct { 
     EntryList* exactTypeEntryList; 
     EntryList** editDistEntryLists; 
     EntryList** hammingDistEntryLists; 
    }; 

    struct DataPacketStruct { 
     struct EntryListPacket* entryLists; 
     struct IndexesPacket* indexes; 
     dllistptr matchingQResultList; 
    }; 

EntryListPacket* allocateEntryListPacket(void){ 
    EntryListPacket* temp=malloc(sizeof(EntryListPacket)); 
    return temp; 
} 

void initializeDataPacket(DataPacketPtr packet){ 
    DataPacketPtr temp; 

    temp=malloc(sizeof(struct DataPacketStruct)); 

    initializeEntryListPacket(temp->entryLists); 

    initializeIndexesPacket(temp->indexes); 

    packet=temp; 
} 

void freeDataPacket(DataPacketPtr packet){ 

    freeEntryListsPacket(packet->entryLists); 
    freeIndexesPacket(packet->indexes); 
    free(packet); 
} 

void initializeEntryListPacket(EntryListPacket* packet) { 

    packet->exactTypeEntryList = NULL; 

    packet->editDistEntryLists = malloc(sizeof (EntryList)*22); 
    int i; 
    for (i = 0; i < 22; i++) { 
     packet->editDistEntryLists[i] = NULL; 
    } 


    packet->hammingDistEntryLists = malloc(sizeof (EntryList)*27); 
    for (i = 0; i < 27; i++) { 
     packet->hammingDistEntryLists[i] = NULL; 
    } 
} 

void freeEntryListsPacket(EntryListPacket* packet){ 
    if(packet->exactTypeEntryList!=NULL) 
     DestroyEntryList(packet->exactTypeEntryList); 
    free(packet->exactTypeEntryList); 

    int i; 
    for(i=0;i<22;i++){ 
     if(packet->editDistEntryLists[i]!=NULL){ 
       printf("%d\n",i); 
      DestroyEntryList(packet->editDistEntryLists[i]); 

     } 
     free(packet->editDistEntryLists[i]);  
    } 
    free(packet->editDistEntryLists); 

    for(i=0;i<27;i++){ 
     if(packet->hammingDistEntryLists[i]!=NULL){  
       printf("%d\n",i); 
      DestroyEntryList(packet->hammingDistEntryLists[i]);    
     } 
     free(packet->hammingDistEntryLists[i]); 
    } 
    free(packet->hammingDistEntryLists); 
    free(packet); 
} 

//File:main.c

EntryListPacket *temp; 
    temp=allocateEntryListPacket(); 
    initializeEntryListPacket(temp); 

    freeEntryListsPacket(temp); 

而且我得到以下警告:

DataStructures.c: In function ‘initializeDataPacket’: 
    DataStructures.c:48:6: warning: passing argument 1 of ‘initializeEntryListPacket’ from incompatible pointer type [enabled by default] 
      initializeEntryListPacket(temp->entryLists); 
     ^
    In file included from DataStructures.c:6:0: 
    DataStructures.h:27:10: note: expected ‘struct EntryListPacket *’ but argument is of type ‘struct EntryListPacket *’ 
     void initializeEntryListPacket(EntryListPacket*); 
      ^
    DataStructures.c:50:6: warning: passing argument 1 of ‘initializeIndexesPacket’ from incompatible pointer type [enabled by default] 
      initializeIndexesPacket(temp->indexes); 
     ^
    In file included from DataStructures.c:6:0: 
    DataStructures.h:30:10: note: expected ‘struct IndexesPacket *’ but argument is of type ‘struct IndexesPacket *’ 
     void initializeIndexesPacket(IndexesPacket*); 
      ^
    DataStructures.c:43:42: warning: parameter ‘packet’ set but not used [-Wunused-but-set-parameter] 
     void initializeDataPacket(DataPacketPtr packet){ 
              ^
    DataStructures.c: In function ‘freeDataPacket’: 
    DataStructures.c:57:6: warning: passing argument 1 of ‘freeEntryListsPacket’ from incompatible pointer type [enabled by default] 
      freeEntryListsPacket(packet->entryLists); 
     ^
    In file included from DataStructures.c:6:0: 
    DataStructures.h:28:10: note: expected ‘struct EntryListPacket *’ but argument is of type ‘struct EntryListPacket *’ 
     void freeEntryListsPacket(EntryListPacket*); 
      ^
    DataStructures.c:58:6: warning: passing argument 1 of ‘freeIndexesPacket’ from incompatible pointer type [enabled by default] 
      freeIndexesPacket(packet->indexes); 
     ^
    In file included from DataStructures.c:6:0: 
    DataStructures.h:31:10: note: expected ‘struct IndexesPacket *’ but argument is of type ‘struct IndexesPacket *’ 
     void freeIndexesPacket(IndexesPacket*); 

我无法弄清楚我做错了什么,或者如果com因为这个例子,卡盘卡住了:DataStructures.h:28:10: note: expected ‘struct EntryListPacket *’ but argument is of type ‘struct EntryListPacket *’ 对我来说似乎不合理。 Thx提前!对于struct IndexesPacket* indexes;

struct DataPacketStruct { 
    struct EntryListPacketStruct* entryLists; 
    ... 

而且类似:

+0

你在使用什么编译器? – jbat100

+0

你是怎么调用这些函数的? – arunb2w

+0

@ jbat100我使用gcc。 – JmRag

回答

2

DataStructures.h,尝试更换此:

struct DataPacketStruct { 
    struct EntryListPacket* entryLists; 
    ... 

有了这个:

struct DataPacketStruct { 
    EntryListPacket* entryLists; 
    ... 

还是这个。编译器警告来自于丢失了typedef符号和struct符号本身。

+0

同样的问题'struct IndexesPacket *索引;'。 – alk

+0

@mbratch是这解决了我的问题,但他们为什么发生?由于我typedef结构不编译器知道他们是同一件事? – JmRag

+0

根据你的声明,这个'struct EntryListPacket * entryLists;'会以某种方式导致'struct struct EntryListPacketStruct * entryLists;'。 – alk

3

struct标签包括一个Struct后缀,但你忽略它,当你宣称:

struct DataPacketStruct { 
    struct EntryListPacket* entryLists; 
    struct IndexesPacket* indexes; 
    dllistptr matchingQResultList; 
}; 

它应该是:

struct DataPacketStruct { 
    struct EntryListPacketStruct* entryLists; 
    struct IndexesPacketStruct* indexes; 
    dllistptr matchingQResultList; 
}; 

或者只是:

struct DataPacketStruct { 
    EntryListPacket* entryLists; 
    IndexesPacket* indexes; 
    dllistptr matchingQResultList; 
}; 

而且,你的initializeDataPacket功能正在泄漏内存。将temp指定为packet不会返回值,因为packet是按值传递的,而不是通过引用传递的。

+0

实际上,从'initializeDataPacket'调用'initializeEntryListPacket'和'initializeIndexesPacket'很可能会导致崩溃,因为您正在取消引用指针从未在新分配的DataPacketStruct中初始化 – pat