Неопределенный символ _getline в модуле C - PullRequest
1 голос
/ 16 июня 2020
#include <stdio.h>
#define MAXLINE 100

/* rudimentary calculator */
main() {
  double sum, atof(char []);
  char line[MAXLINE];
  int getline(char line[], int max);

  sum = 0;
  while(getline(line, MAXLINE) > 0)
      printf("\t%g\n", sum += atof(line));
  return 0;
}

Я учусь кодировать C из Ritch ie и Kernighan C Руководство по программированию.

Я использую компилятор borland turbo c.

Код предназначен для создания рудиментарного калькулятора.

Я получаю Ошибка компоновщика: неопределенный символ '_getline' в модуле

1 Ответ

2 голосов
/ 16 июня 2020

Вам необходимо предоставить определение функции для getline().

В вашей программе есть только объявление / прототип функции

int getline(char line[], int max);

для getline(), но нет определения функции .


Что касается вашей проблемы с K&R, вы пропустили следующее из предыдущей главы 4.1 «Основы функций» незадолго до упражнения с рудиментарным калькулятором:

« Механизм компиляции и загрузки программы C, которая находится в нескольких исходных файлах, варьируется от одной системы к другой. В системе UNIX, например, эту работу выполняет команда cc, упомянутая в главе 1. Предположим, что три функции хранятся в трех файлах: main. c, getline. c и strindex. c. Затем команда

cc main.c getline.c str index.c

компилирует три files ... "

Источник: язык программирования C (версия 1.), страница 61

, а также

" Там также немного другая версия getline; y Возможно, вам будет поучительно сравнить его с тем, что приведено в главе 1 "

Источник: Язык программирования C (1. версия), стр. 60

int getline (char s[], int lim)   
{       
    int c, i;       
    i = 0;       

    while (--lim > 0 && (c=getchar()) != EOF && c != '\n')           
       s[i++] = c;       

    if (c == '\n')           
       s[i++] = c;       

    s[i] = '\0';       

    return i;   
}

В примере требуется либо

  1. , которое вы связываете getline.c (с определением функции getline()) из главы 1 при вызове компилятора или
  2. Чтобы вы использовали другое определение getline() в одном из примеров программы (стр. 60) раньше.

Примечания:

  • Пожалуйста, переключитесь на современный и совместимый со стандартами компилятор, такой как g cc с MingW для Windows, если вас не заставляют сделать другое для класса.

    Turbo C очень старый, и я думаю, что он даже не соответствовал ANSI C (C89 / C90).

  • Сначала я искал «Второе издание» «Языка программирования C» и не нашел ваш процитированный пример на стр. 61-62.

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

    Вы можете получить его PDF-файл, здесь .

  • Относительно пункта 1 и пункт 2, main() также больше не соответствует действующим стандартам C. Это должно быть int main (void).

  • Обратите внимание, что есть функция POSIX с тем же именем getline(), доступная в некоторых реализациях. Вы можете получить сообщение об ошибке, если эта функция включена в вашу реализацию (но кажется, что это не так), поскольку обе функции (POSIX и K&R) имеют разные прототипы, и тогда вы попытаетесь переопределить функцию POSIX getline().

...