Синтаксическая проблема с некоторыми изменениями - PullRequest
1 голос
/ 25 сентября 2010

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

#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 - ожидаемое выражение перед равным1006 *

Ответы [ 4 ]

2 голосов
/ 25 сентября 2010

конфликтующие типы для 'getline'

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

слишком мало аргументов для функции 'getline'

Вы вызываете getline () в main () без каких-либо аргументов, но несколько строк над вами утверждают, что getline принимает char [] и int. назовите это как getline(line,sizeof line);

2 голосов
/ 25 сентября 2010

Сейчас я только пытаюсь заставить мою функцию getline () работать.

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

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


Edit1 : То:

#define ENDOFFILE = -1;

Должно быть

#define ENDOFFILE -1

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

1 голос
/ 25 сентября 2010

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

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

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

Правильный синтаксис:

#define ENDOFFILE -1
#define TOOMANYNUMS -2
#define LIMIT 256
0 голосов
/ 25 сентября 2010

вам нужно понять:

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