2010-09-25 3 views
1

Прямо сейчас я пытаюсь заставить свою функцию getline() работать. У меня есть код из книги, и, похоже, он идентичен, но я не могу его скомпилировать. Это домашнее задание, но эта часть должна быть просто скопирована из книги.c проблема синтаксиса с некоторыми изменениями сейчас

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

//error list 
#define ENDOFFILE = -1; 
#define TOOMANYNUMS = -2; 
#define LIMIT = 256; 

//functions declared 
int get_line(char line[], int); 

//main 
main(){ 
char line[255]; 
int num[6]; 
printf("Please input numbers %c: ", line); 
get_line(line,LIMIT); 


} 

//functions 
    int get_line(char s[],int lim){ 
    int c, i; 
    for (i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) 
    s[i] = c; 
if(c=='\n'){ 
s[i]=c; 
    ++i; 
} 
s[i]='\0'; 
return i; 
} 

Теперь (отредактированный в 10:22) я получаю только одну ошибку:

18 - ожидаемое выражение перед равным

+2

Не используйте '=' или ';' в '# define'. Это должно быть просто '#define TOOMANYNUMS -2'. – pmg

+0

Хорошо, спасибо. Новичок или нет, я, вероятно, должен был это знать. – pisfire

ответ

1

Проблема заключается в том, что система, с которой вы компилируете это, имеет уже определенную функцию getline(), и ваше определение противоречит этому. Похоже, что glibc, библиотека C, используемая в Linux, имеет нестандартную функцию getline(), объявленную в stdio.h. Он не должен определяться, если вы не включили строку, например #define _GNU_SOURCE, чтобы включить в нее нестандартные функции, но может быть, что это предопределено на основе того, как вы компилируете свой код.

Самое простое решение - переименовать свою функцию на что-то другое, но вы также можете попытаться найти в своих настройках компилятора, почему GNU-расширения включены.

Теперь, когда вы отредактировали код, ваша вторая проблема в том, что ваши строки #define неверны. Вам не нужна равная или точка с запятой; они обрабатываются preprocessor, который имеет другой синтаксис, чем C, и все, что вам нужно сделать, это написать #define NAME VALUE.

Правильный синтаксис будет:

#define ENDOFFILE -1 
#define TOOMANYNUMS -2 
#define LIMIT 256 
+0

Режим по умолчанию для gcc - gnu89. Чтобы изменить это, используйте параметр командной строки '-std ='. (http://tigcc.ticalc.org/doc/comopts.html#SEC6) – pmg

+0

отредактированный код после этих комментариев – pisfire

2

Right now I am only trying to get my getline() function to work.

getline() это имя функции Linux, заявил в stdio.h , Компилятор C жалуется, что есть две противоречащие друг другу объявления.

Просто передайте функцию getline() другому имени.


Edit1: Это:

#define ENDOFFILE = -1; 

Должно быть

#define ENDOFFILE -1 

Нет =, не ; необходимы для директив препроцессора.

+0

Вау, хорошо спасибо. – pisfire

+0

Но все еще остались ошибки, например «слишком мало аргументов» должно быть ясным, вы вызываете 'getline()', но должны быть два параметра. – schnaader

+0

@schnaader - Нет, ошибки связаны с тем, что предыдущее объявление (в stdio.h) имеет определение 'ssize_t getline (char ** lineptr, size_t * n, FILE * stream)' - конфликтующие типы в 'ssize' vs.' int' и 'char **' vs 'char *' и два аргумента: два против трех. Вызов getline() - отдельная проблема. –

2

conflicting types for 'getline'

getline может быть функцией в стандартной библиотеке, например. thisone. Если вы хотите переопределить его, дайте ему другое имя.

too few arguments to function 'getline'

Вы звоните GetLine() в основной() без каких-либо аргументов, но несколько строк выше Вы утверждаете, что GetLine принимает символ [] и Int. назовите его как getline(line,sizeof line);

+0

отредактировал код после этих комментариев – pisfire

0

вы должны понимать:

  1. это вообще ошибка писать #define макрос вроде того, что вы написали, потому что #define макрос просто строка замены, поэтому этот оператор get_line (строка, LIMIT) является фактически get_line (строка, = 256;) , обработанный компилятором, затем возникает ошибка компиляции красный. Только изменить #define LIMIT = 256; до #define LIMIT 256 будет в порядке.
  2. как указано в предыдущих ответах, никогда не записывайте коды, предоставленные библиотекой , getline - это функция, определенная в stdio.h.

надеюсь, что это поможет.