Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > книга Б.Кернигана


Автор: algorithm 25.3.2007, 21:42
Здравствуйте. Подскажите плиз на какой компилятор и на какую ОС расчитана книга "Язык программирования Си".  А то у меня примеры к ней не собираются

Автор: mr.Anderson 25.3.2007, 22:03
Насколько я знаю, эти примеры должны работать в большинстве компилеров, исключая только старые типа Borland C++ 3 и т.д. Эти примеры точно работают в Borland C++ Builder 5.0 - 6.0 и Visual C++ .

Автор: MAKCim 25.3.2007, 22:04
Я так полагаю, на ANSI-совместимый С-компилятор (если издание >= 3)
что за примеры?

Автор: algorithm 25.3.2007, 22:07
Вот такая программка выдаёт кучу ошибок в Visual C++. По мнению авторов она вроде должна работать...

Код

#include <stdio.h>

/* подсчет вводимых символов; 1-я версия */ 
main()
{
    long nc;
    nc = 0;

    while (getchar() != EOF)
        ++nc;
    printf(“%ld\n”, nc);
}



Автор: mr.Anderson 25.3.2007, 22:10
Во-первых, не указан тип функции main(). Обычно это int.
Не уверен насчет функции getchar() - вроде, она в conio.h или в iostream.h сидит.

Остальное вроде так.

Автор: Greeen 25.3.2007, 22:11
algorithm, бред. Скомпилировал.

Автор: codelord 25.3.2007, 22:14
на стандартный ANSI C
покажи код, часто видел в электронных вариантах функции в примерах  большими буквами написаны,
и в целом нет многих заголовков для примеров.
обычно используются хедеры 
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
может еще кое-чего.

Добавлено через 1 минуту и 39 секунд
о как быстро наотвечали smile я последний

Автор: algorithm 25.3.2007, 22:20
--------------------Configuration: Text1 - Win32 Debug--------------------
Compiling...
Text1.c

text1.c(9) : error C2018: unknown character '0x93'
text1.c(9) : error C2143: syntax error : missing ')' before '%'
: error C2198: 'printf' : too few actual parameters
: error C2017: illegal escape sequence
: error C2065: 'ld' : undeclared identifier
: error C2146: syntax error : missing ';' before identifier 'n'
: warning C4552: '%' : operator has no effect; expected operator with side-effect
: error C2018: unknown character '0x94'
: error C2065: 'n' : undeclared identifier
: error C2059: syntax error : ')'
Error executing cl.exe.

Text1.obj - 9 error(s), 1 warning(s)

Автор: mr.Anderson 25.3.2007, 22:22
algorithm, исправления, которые мы тут называли, внес?

Автор: Greeen 25.3.2007, 22:22
algorithm, ты поставь то нормальные кавычки в printf.
printf("%ld\n", nc);

Автор: mr.Anderson 25.3.2007, 22:23
И вообще мне очень не нравится вот это:
Код

while( getchar() != EOF )

EOF - это константа конца файла. Мы вроде как не с файлом работаем?

Добавлено через 1 минуту и 3 секунды
Greeen, а разве там кавычки не обычные? Что ни день, то что-то новенькое. smile Оказывается, кавычки имеют третий вариант написания?! smile

Автор: algorithm 25.3.2007, 22:26
Да, исправления внёс
Код

#include <stdio.h>
#include <iostream.h>
#include  <conio.h>
int main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf(“%ld\n”, nc);    
}

Автор: codelord 25.3.2007, 22:27
а так
у тебя кавычки кривые руками набери в редакторе
Код

#include <stdio.h>
int main(int argc, char **argv)
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
return 0;
}

Автор: Greeen 25.3.2007, 22:29
 smile вот человек, ему напишешь что исправить, а он все никак

Автор: mr.Anderson 25.3.2007, 22:30
codelord, а так, скорее всего, он получит предупреждение о неиспользуемых аргументах в функции. Тогда уж так:
Код

#include <stdio.h>

#pragma argsused
int main(int argc, char **argv)
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
return 0;
}

Автор: algorithm 25.3.2007, 22:30
mr.Anderson,
Цитата

И вообще мне очень не нравится вот это:

while( getchar() != EOF )

EOF - это константа конца файла. Мы вроде как не с файлом работаем?

Мне тоже  smile 
Просто в книге  вроде предполагается , что программа должна работать и так...

Автор: mr.Anderson 25.3.2007, 22:32
Ну, скомпилилось ли хоть? А то мы в этой теме быстро по 50 сообщений наберем... smile

Добавлено через 1 минуту и 22 секунды
А потом, кто вам мешает экспериментировать? Замените эту глупую EOF на, например, символ звездочки в одинарных кавычках. Вот так:
Код

while( getchar() != '*' )

Автор: Greeen 25.3.2007, 22:37
Необязательно с файлами... Для окончания ввода Ctrl+Z и Enter.
Цитата
эту глупую EOF
  smile 

Автор: codelord 25.3.2007, 22:38
Цитата(mr.Anderson @  25.3.2007,  18:30 Найти цитируемый пост)
codelord, а так, скорее всего, он получит предупреждение о неиспользуемых аргументах в функции. Тогда уж так:

а ты попробовал?

Автор: mr.Anderson 25.3.2007, 22:39
codelord, нет. Но вроде у меня в Билдере ворнинг выдавался... Не лучше ли перестраховаться? smile 

Цитата

эту глупую EOF
  smile 

Это я применительно к текущему случаю. smile

Автор: codelord 25.3.2007, 22:39
Цитата(mr.Anderson @  25.3.2007,  18:30 Найти цитируемый пост)
EOF - это константа конца файла. Мы вроде как не с файлом работаем?

си не отличает файл от стандартного потока ввода и вывода

Автор: Greeen 25.3.2007, 22:40
 smile фигасе дискуссия  smile 

Автор: MAKCim 25.3.2007, 22:42
Цитата(Greeen @  25.3.2007,  22:40 Найти цитируемый пост)
фигасе дискуссия

не о чем smile 

Автор: codelord 25.3.2007, 22:42
Цитата(mr.Anderson @  25.3.2007,  18:39 Найти цитируемый пост)
codelord, нет. Но вроде у меня в Билдере ворнинг выдавался... Не лучше ли перестраховаться?
 это если в компилере выбрано warning all
а так чистенько

Автор: Greeen 25.3.2007, 22:44
 smile А давайте все примеры из книжек (особенно такой сложности) также обсуждать  smile 

Автор: codelord 25.3.2007, 22:50
Greeen,  да ладно тебе
жалко чтоли  smile  
люди поговорить хотят  smile 

Автор: Greeen 25.3.2007, 22:51
codelord, да я всегда за..
А еще можно заменить while на do ... while

Автор: Любитель 25.3.2007, 23:56
Вообще ошибка была одна - кавычки, набранные в юникоде (или, что скорее скопипастенные из книги). int перед main - не обязателен, в сях сие по дефолту (не путать с плюсами). return 0 - нефиг, сам догадается smile (если компилер современный).

Автор: Kuvaldis 26.3.2007, 00:39
mr.Anderson, 
Цитата

А потом, кто вам мешает экспериментировать? Замените эту глупую EOF на, например, символ звездочки в одинарных кавычках.

Как раз таки EOF для данного случая очень даже хорошо: тогда не будет никакого ограничения на ввод ПЕЧАТАЕМЫХ символов. Можно, конечно, еще на признак конца ввода поставить другие КОМБИНАЦИИ.

Автор: mr.Anderson 26.3.2007, 09:35
О, да я гляжу, дискуссия вчера далеко не закончилась... smile 

codelord, ну, вот видите. smile Я ж говорю, что лучше честно ворнинга избежать. Чтобы нареканий не было. smile
Цитата

в сях сие по дефолту (не путать с плюсами)

А, а я от C++ отталкиваюсь. smile 
Цитата
Как раз таки EOF для данного случая очень даже хорошо: тогда не будет никакого ограничения на ввод ПЕЧАТАЕМЫХ символов

Тогда можно глупый вопрос? Чему равна эта константа?

Автор: Greeen 26.3.2007, 09:39
mr.Anderson, в stdio.h
#define EOF (-1)

Автор: Валерия 26.3.2007, 09:41
Цитата(mr.Anderson @  26.3.2007,  09:35 Найти цитируемый пост)
Тогда можно глупый вопрос? Чему равна эта константа? 

-1 вроде как smile 

Код

#include <iostream.h>

void main(){
cout << EOF;
}

Автор: Любитель 26.3.2007, 12:53
Цитата(mr.Anderson @  26.3.2007,  09:35 Найти цитируемый пост)
А, а я от C++ отталкиваюсь. 


Цитата(algorithm @  25.3.2007,  21:42 Найти цитируемый пост)
на какую ОС расчитана книга "Язык программирования Си"


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)