Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2011, 16:47   #1
anton200583
 
Регистрация: 16.05.2011
Сообщений: 3
По умолчанию Си (KERNIGHAN RITCHIE)1.9 Символьные массивы

Начал изучать Си по книге KERNIGHAN RITCHIE (3е издание исправленное)
Не работает код из учебника
Строки на которые указывает компилятор я обозначил.
Подскажите что надо исправить?
Код:
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[],int MAXLINE);                 /*КОМПИЛЯТОР РУГАЕТСЯ*/
void copy(char to[], char from[]);

/* печать самой длинной строки */
int main()
{
    int len; /* длина текущей строки */
    int max; /* длина максимальной из просмотренных строк */
    char line[MAXLINE]; /* текущая строка */
    char longest[MAXLINE]; /* самая длинная строка */

    max = 0;
    while ((len = getline(line, MAXLINE)) > 0)     /*КОМПИЛЯТОР РУГАЕТСЯ*/
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0) /* была ли хоть одна строка? */
        printf("%s", longest);
    return 0;
}


/* getline: читает строку в s, возвращает длину */
int getline(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;
}

/* copy: копирует из 'from' в 'to'; to достаточно большой */
void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}
anton200583 вне форума Ответить с цитированием
Старый 16.05.2011, 17:06   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Исправьте компилятор и будет вам счастье.
А вообще, указали бы еще как же ругается компилятор, а то код вставлять, проверять, что не так лениво как-то.
mMAg вне форума Ответить с цитированием
Старый 16.05.2011, 19:27   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
#define MAXLINE 1000
int getline(char line[],int MAXLINE);
После прохода препроцессора преобразуется в
Код:
int getline(char line[], int 1000);
что недопустимо с точки зрения компилятора.
Замените MAXLINE в декларации функции на что либо другое, или уберите вообще
Код:
int getline(char*, int);
netrino вне форума Ответить с цитированием
Старый 17.05.2011, 04:08   #4
anton200583
 
Регистрация: 16.05.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от mMAg Посмотреть сообщение
Исправьте компилятор и будет вам счастье.
А вообще, указали бы еще как же ругается компилятор, а то код вставлять, проверять, что не так лениво как-то.
Помощь студентам
Каждый из нас в чём-то "новичок", потому просьба писать в этот раздел, с подробным описанием вопроса в названии темы, а также просьбы о решении задач, следует постить сюда.


Если б я знал?
Как исправить компилятор (linux mint компиляторы стоят из коробки)?
Если вы читали (кернигана)то знаете что этот код из первой главы(т.е в начале книги)и если вы нормально знаете язык по моему вы на вскидку должны увидеть где косяк?!
(либо тогда я не понимаю зачем новичку такой код в начале книги давать?)

Компилятор кричит так:
Код:
gcc -Wall -c "1.c"(в каталоге: /home/anton)
Сборка завершилась с ошибкой.
1.c:3:29: error: expected ‘;’, ‘,’ or ‘)’ before numeric constant
1.c: In function ‘main’:
1.c:15:5: warning: passing argument 1 of ‘getline’ from incompatible pointer type
/usr/include/stdio.h:671:20: note: expected ‘char ** __restrict__’ but argument is of type ‘char *’
1.c:15:5: warning: passing argument 2 of ‘getline’ makes pointer from integer without a cast
/usr/include/stdio.h:671:20: note: expected ‘size_t * __restrict__’ but argument is of type ‘int’
1.c:15:5: error: too few arguments to function ‘getline’
/usr/include/stdio.h:671:20: note: declared here
1.c: At top level:
1.c:27:5: error: conflicting types for ‘getline’
/usr/include/stdio.h:671:20: note: previous declaration of ‘getline’ was here
И подчеркивает строки которые я указал выше :-((
anton200583 вне форума Ответить с цитированием
Старый 17.05.2011, 14:04   #5
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
Сообщение от anton200583 Посмотреть сообщение
Если вы читали (кернигана)то знаете что этот код из первой главы(т.е в начале книги)и если вы нормально знаете язык по моему вы на вскидку должны увидеть где косяк?!
(либо тогда я не понимаю зачем новичку такой код в начале книги давать?)
Я нормально знаю язык. И именно поэтому не вижу причин помнить какие-то там примеры из какой-то там книги. А еще я не имею понятия, почему Керригана называют Керниганом. И не всегда можно на вскидку определить в чем проблема. Я, например, на ваш дефайн вообще не глянул при просмотре.

По вашей проблеме: у вас описана функция
Код:
int getline(char line[],int MAXLINE);
а определена
Код:
int getline(char s[], int lim)
Вот на первый взгяд он на это ругается. Просто в определении напиши
Код:
int getline(char s[], int lim)
и вроде бы все должно быть пучком.
mMAg вне форума Ответить с цитированием
Старый 17.05.2011, 19:06   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Различные имена переменных в декларации и реализации функции не играют никакой роли, проблема была именно в том, что MAXLINE - это константа препроцессора. На что, собственно, и ругался компилятор.
И, кстати, всё же Керниган.
netrino вне форума Ответить с цитированием
Старый 25.05.2011, 04:42   #7
anton200583
 
Регистрация: 16.05.2011
Сообщений: 3
По умолчанию

Спасибо за подсказку убрал
#define MAXLINE 1000
Сменил название функции getline.
И все заработало.
anton200583 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Символьные массивы. Romario92 Общие вопросы C/C++ 2 29.10.2010 16:01
Символьные массивы aus Общие вопросы C/C++ 1 27.10.2010 12:31
символьные массивы и записи Cepgeich Паскаль, Turbo Pascal, PascalABC.NET 2 09.04.2010 00:01
Символьные массивы и строки. kGxDD Паскаль, Turbo Pascal, PascalABC.NET 1 24.04.2009 11:39
Одномерные символьные массивы chubakasun Помощь студентам 1 31.03.2009 02:26