c - Visual Studio 2008 C++ 中的错误

标签 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;
}

最佳答案

从代码中删除struct Database的定义;这就是编译器所说的“重新定义”的意思。您不需要它,因为它已经在 "DB.h" 中。 (也就是说,实际上头文件的用途是:确保使用它的所有 c 文件都使用相同的定义,而不是“私有(private)”定义。)

[旁白:另一方面,如果您希望该结构是私有(private)的,即该结构的字段只能从 "DB.c" 内访问,只需将头文件中没有结构体的 typedef "DB.h":

typedef struct Database tDatabase;

然后像您所做的那样在 "DB.c" 中定义带有主体的结构(但没有 typedef):

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

在这种情况下,来自外部“DB.c”的代码可以包含 header ,但它只能使用指向tDatabase的指针,而不获取数据。对此不透明指针的所有访问都将通过“DB.c”中定义的方法完成。]

关于c - Visual Studio 2008 C++ 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20932058/

相关文章:

c - 在c中扫描数组的元素

c++ - 这个矩阵引用了什么?

char* 和 char[] 不是同一类型?

visual-studio-2010 - 在生产 Web 服务器上安装 Visual Studio 的原因

visual-studio - 如何防止 VS 2008 在发布过程中发布 .svn 文件夹?

c++ - Visual Studio 2008 编译 C++ 文件中的任何内容?

c - pthread_kill 导致的段错误

c - 使用 libcrypto 将哈希复制到字符数组

c - Visual Studio 2008 与转义序列的奇怪行为

c++ - 如何正确添加状态栏?