2015-02-14 2 views
-1

ОК, я искал решение в течение двух дней, но я не смог найти, что не так с моим кодом. ; (Функция не распознает аргумент typedef

Задача проста: определить новый тип с помощью typedef и получить функцию, считывающую строки этого нового типа из файла в массив снова этого нового типа, поэтому мой typedef внутри заголовочного файла выглядит так: сейчас (ив попробовал несколько вариантов написания этого)

// filename: entries.h 
#ifndef ENTRIES_H_ 
#define ENTRIES_H_ 
#include<time.h> 

typedef struct{ 
    char Loginname[25]; 
    time_t RegDate; 
    unsigned long Highscore; 
    time_t Hdate; 
}typePlayerEntry; 

int readPlayerList(char *name, typePlayerEntry *feld); 

#endif /* ENTRIES_H_ */ 

main.c:

//filename: main.c 

#include <stdio.h> 
#include "entries.h" 


int main(void) { 
    char name[13]="numbers.txt"; 
    typePlayerEntry *pep; 

    readPlayerList(name, pep); 

    return 0; 
} 

моя функция файл выглядит следующим образом (и где Heres показано ошибка)

//filename: readPlayerList.c 

int readPlayerList(char *name, typePlayerEntry *feld) { 
return 0; 
} 

неуместный код полностью исключен. Проблема воспроизводится с отправленным кодом.

программа не компилируется, потому что тип второго аргумента в файле функции не может быть распознан, - что является нечетным, поскольку оно определено в файле заголовка и также может использоваться в основной функции. И эта ошибка каким-то образом связана с объявлением (в данном случае) указателем типа playerEntry в моем main.c. Поэтому, если я не объявляю об этом, theres нет ошибки, хотя я должен объявить его, чтобы фактически передать его функции. как получилось, что решение до сих пор заключается в том, чтобы включить записи.h в readPlayerList.c, который не был необходим для предыдущих функций?

im использование eclipse kepler с MinGW, в случае возникновения проблемы с компилятором.

исправил недостающее включение time.h и немного скорректировал код.

+0

кажется мне правильным. Являются ли объявления struct и typedef перед объявлением функции? – nneonneo

+2

Хорошо, вы заявили, что они появляются в файле заголовка ... но вы включили его в источник, где он используется? –

+0

@nneonneo yes, отредактировал мой вопрос, показывающий все используемые файлы, которые вызывают ошибку. – Matze

ответ

0

Вам не хватает #include <time.h> в entries.h.

// filename: entries.h 
#ifndef ENTRIES_H_ 
#define ENTRIES_H_ 

typedef struct { 
    char Loginname[25]; 
    time_t RegDate;     /* from <time.h> */ 
    unsigned long Highscore; 
    time_t Hdate;     /* from <time.h> */ 
} playerEntry; 

int readPlayerList(char *name, playerEntry *feld); 

#endif /* ENTRIES_H_ */ 

И вам нужно #include "entries.h" в readPlayerList.c

//filename: readPlayerList.c 

int readPlayerList(char *name, typePlayerEntry *feld) { 
/*        ^^^^^^^^^^^^^^^ from entries.h */ 
return 0; 
} 
+0

да, это решает проблему! Спасибо. но можете ли вы объяснить, почему это так? я никогда не должен был включать что-либо в свой function.c и действительно считал, что все это связано с main.c. почему это не так? – Matze

+0

Файлы .c в основном отличаются «единицами перевода». Каждый из них стоит сам по себе, и они только «сливаются» в последнем процессе создания исполняемого файла: состояние связывания. До этого каждый из них компилируется отдельно (ваш компилятор скрывает это для удобства использования), и каждый из них должен использовать правильные включения. – pmg

0

часть проблемы заключается в том, что компилятор видит (по крайней мере) два разных значения/определения для имени 'playerEntry'.

Предлагайте: 1) исключить «ЬурейеЕ» заявление (это просто загромождать код и запутанной компилятор)

2) правильно ссылаться на-структуру с помощью: «структура playerEntry» вместо «playerEntry»

в TheHeader.h файле:

struct playerEntry 
{ 
    char Loginname[25]; 
    time_t RegDate; 
    unsigned long Highscore; 
    time_t Hdate; 
}; 

int readPlayerList(char *name, struct playerEntry *feld); 

в исходном файле:

#include "TheHeader.h" 
int readPlayerList(char *name, struct playerEntry *feld) 
{ 
    return 0; 
} 
+0

Вопрос OP сказал * «Задача проста: определить новый тип, используя typedef» *. –

+0

, когда я попробую ваше решение, его плюют с другой ошибкой на меня и рассматривают второй аргумент «struct playerEntry * feld» как создание структуры в вызове функции, ну, по крайней мере, как я интерпретирую предупреждение ... плохо редактирую мой пост и вставьте туда полные файлы im, которые создают это поведение – Matze

Смежные вопросы