2014-01-05 133 views
-1

在我用C項目,我得到這些錯誤:錯誤在Visual Studio 2008中C++

error C2371: 'tDatabase' : redefinition; different basic types 
db.h(7) : see declaration of 'tDatabase' 
error C2223: left of '->numberOfCity' must point to struct/union 
error C2198: 'calloc' : too few arguments for call 

我初學C.我該如何解決呢?謝謝。

文件:DB.h

typedef struct Database { 
    int numberOfCity; 
    tListOfCity* list; 
    double **distances; 
} tDatabase; 

tDatabase *LoadDatabase(char* file); 

文件DB.c

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
#include "DB.h" 

typedef struct Database{ 
int numberOfCity; 
tListOfCity* list; 
double** distances; 
} tDatabase; //this line error C2371 

tDatabase* LoadDatabase(char* file) { 
FILE* fileName; 
tDatabase *input; 
char data[100]; 
int i, j, number = 0; 

input = (tDatabase*) calloc(1, sizeof (tDatabase)); 
input->list = NULL; 

fileName = fopen("file.txt", "r"); 
fscanf(fileName, "%d", &number);  
input->numberOfCity = number; 

input->distances = (double**) calloc(data->numberOfCity, sizeof (double*)); //this line Error C2223 and C2198 
for (i = 0; i < input->numberOfCity; i++) { 
    input->distances[i] = (double*) calloc(input->numberOfCity, sizeof (double)); 
} 

for (i = 0; i <= input->numberOfCity; i++) { 
    fgets(data, sizeof (data), fileName); 
    input->list = AddOnEnd(input->list, CreateCity(data)); 
} 

for (i = 0; i < input->numberOfCity; i++) { 
    for (j = 0; j < input->numberOfCity; j++) { 
     fscanf(fileName, "%f", &input->distances[i][j]); 
    } 

fclose(fileName); 
return input; 
} 
+1

您的編譯器告訴您不要重新定義該結構。你爲什麼這樣做? – Mat

+0

請告訴我們這些你不明白的錯誤信息。 SO的工作方式與您所設想的不同。您的問題標題完全不特定。您以後如何認爲這樣的問題標題可以被搜索以供其他人使用? –

+0

當我有幾個錯誤時,我應該如何命名標題? – user3161483

回答

1

刪除的struct Database你的代碼中定義;這是編譯器通過「重新定義」所表示的意思。你不需要它,因爲它已經在"DB.h"。 (也就是說,實際上頭文件是用於:爲了確保所有使用它的c文件使用相同的定義而不是「私有」文件)。

[另外:如果另一方面,該結構是專用的,也就是說,該結構的字段只能從"DB.c"中進行訪問,只是把類型定義,而不該結構體在頭文件"DB.h"

typedef struct Database tDatabase; 

然後定義與身體的結構(但沒有typedef)如"DB.c"所示:

struct Database { 
    int numberOfCity; 
    tListOfCity* list; 
    double **distances; 
}; 

在這種情況下,來自"DB.c"之外的代碼可以包含標頭,但只能使用指向tDatabase的指針而不會獲取數據。所有對這個不透明指針的訪問將通過在"DB.c"中定義的方法來完成。]

0

首先,你正在定義Database。因此,通過刪除DB.c文件中Database的定義來避免此問題。

其次,data->numberOfCity,是錯誤的,因爲data被聲明爲char arry,所以它沒有numberOfCity作爲類成員。