LINUX.ORG.RU

Освоение программирования на C

 


1

1

У меня есть несколько вопросов: Вот моя первая программа:

system@ne-vlezay80-pc:/tmp$ cat ./2+2.c 
main()
{
	float two = 2;
	float two1 = 2;
	float res = (two + two1);
	printf("Result: %1.0f\n", res);
	return 0;
}
Компилятор выдает предупреждение при копмиляции:
system@ne-vlezay80-pc:/tmp$ gcc ./2+2.c 
./2+2.c: In function ‘main’:
./2+2.c:6:2: warning: incompatible implicit declaration of built-in function ‘printf’
  printf("Result: %1.0f\n", res);
  ^
Хотя, программа выполняется нормально:
system@ne-vlezay80-pc:/tmp$ ./a.out 
Result: 4

В C я новичек. Осваиваю язык по этой инструкции: http://linux.yaroslavl.ru/docs/prog/c/ch01.html

Вопросы:
1.Что не так в моей первой программе
2.Как можно создавать патчи к программам

★★★★★

2.Как можно создавать патчи к программам

Обычно программой diff

UVV ★★★★★ ()
#include <stdio.h>

забыл. У тебя не подключена библиотека ввода-вывода. GCC умный, понял что ты хочешь, но руганулся, ибо другую библиотеку он бы так не нашёл.

Deleted ()

K&R — это, конечно, хорошо. Но, блин 30 с фигом летом прошло. Язык развивался, стандарты обновлялись, компиляторы становились все строже. Пролистай для начала бегло какую-нибудь современную мурзилку, не вникая в детали. Просто чтобы научиться хелловорлды с -Wall -Wextra -Werror компилировать. А потом уже и Кернигана-Ритчи адаптировать к современным реалиям сможешь.

JaneDoe ()

Осваиваю язык по этой инструкции: http://linux.yaroslavl.ru/docs/prog/c/ch01.html

Вредная инструкция. Такая программа:

main()
{
        printf("hello, world\n");
}

когда-то была корректной, но те времена давно ушли. У функций должен быть указан тип возвращаемого значения. Пустой список аргументов требует явного указания void. Функциям с возвращаемым типом int очень желательно возвращать значение. Конкретно для main это не обязательно, но плохо начинать с исключений — в голове каша будет.

Не понимаю, почему все K&R боготворят.

i-rinat ★★★★★ ()

Перевод с англ.
В.В.Чуклова
Москва, 1982 г.

1982 г.

Это первое издание, лучше найти второе (оригинал 1988 года), оно ближе к стандарту.

xaizek ★★★★★ ()
Ответ на: комментарий от i-rinat

У функций должен быть указан тип возвращаемого значения. Пустой список аргументов требует явного указания void.

В ведре используется С90, поэтому там не требуется. Но ТС не об этом спрашивал, да.

UVV ★★★★★ ()
Ответ на: комментарий от i-rinat

Насколько я помню (а помню я не очень хорошо), в K&R было

int main() { ... return 0; }

Да и вопрос со списком аргументов main затрагивался довольно быстро.

UPD:

Мораль - не всё там так страшно, как ты рисуешь.

melkor217 ★★★★★ ()
Последнее исправление: melkor217 (всего исправлений: 1)
Ответ на: комментарий от UVV

С90, поэтому там не требуется

Э-э?

$ cat q1.c 
#include <stdio.h>
void func() { printf("hello\n"); }
int main() { func(42); return 0; }
$ cat q2.c
#include <stdio.h>
void func(void) { printf("hello\n"); }
int main() { func(42); return 0; }
$ gcc -std=c90 -Wall -pedantic q1.c 
$ gcc -std=c90 -Wall -pedantic q2.c 
q2.c: In function ‘main’:
q2.c:3:14: error: too many arguments to function ‘func’
 int main() { func(42); return 0; }
              ^
q2.c:2:6: note: declared here
 void func(void) { printf("hello\n"); }
      ^
$ 
i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Пустой список аргументов требует явного указания void.

А с чего ты взял, что ОП имел в виду пустой список?

anonymous ()

OMG, там еще и второй вопрос. Если кратко, то 'diff old.c new.c > patch'. Если развернуто, то очень зависит от проекта, его размещения и политики. А вообще, рановато с такими madskillz чужую работу патчить.

anonymous ()
Ответ на: комментарий от JaneDoe

Будто бы указатели поменяли цвет. Читать не последнее издание это конечно моветон.

anonymous ()
Ответ на: комментарий от flyshoot

и чем она лучше K&R? точно такие же ошибки

может кто порекомендовать действительно хорошую, современную книгу по С?

anonymous ()
Ответ на: комментарий от Deleted

GCC умный, понял что ты хочешь, но руганулся, ибо другую библиотеку он бы так не нашёл.

Лолшто?

anonymous ()
Ответ на: комментарий от melkor217

в K&R было

От издания зависит. В более старых будет main(){} Сейчас открыл книжку язык си 88-го года издания(а оригинал на английском 84-го) там везде main(){}

pawnhearts ★★★★★ ()
Ответ на: комментарий от arto

Из комментария там же:


And keep in mind, this is a reference, NOT a tutorial or 'for beginners' book. This is a complete description of the language and the standard library. If you are an experienced C programmer, then this will be an invaluable resource.


Тогда уж лучше стандарт почитать. K&R — это именно книжка для начинающих

Gvidon ★★★★ ()
Последнее исправление: Gvidon (всего исправлений: 1)

Осваиваю язык по этой инструкции:

Возьми лучше Подбельского с Фоминым и прочитай от корки до корки. Не будет таких глупых ситуаций.

batekman ★★★ ()
Ответ на: комментарий от i-rinat

Не понимаю, почему все K&R боготворят.

Возможно, потому что там хорошие задачи, которые очень полезны для начинающих. Я вот, хоть и не C-шник, на JS пишу, но считаю, что именно после прочтения этой книги я начал именно программировать, а не Ваньку валять.

xenohunter ()
Ответ на: комментарий от Deleted

GCC умный, понял что ты хочешь

Не пори чушь.

anonymous ()
Ответ на: комментарий от anonymous

Даа, глупость сказал.

Как ниже меня поправили, GCC по умолчанию линкует со стандартной библиотекой (а можно и отключить это), и лишь были не подключены объявления функций.

Deleted ()

Ты вызвал функцию, которая не определена
Компилятор автоматически подставил stdio.h, где есть определение этой функции
Ну и по-умолчанию код линкуется с libc, где и содержится эта функция

mystery ★★ ()

Главное работает, так всегда

Reedych ★☆ ()
Ответ на: комментарий от EXL

Я ошибся, а ты уже четвертый высказавшийся. Поздравляю, можешь начинать розоветь и вставать на 4 лапы.

Deleted ()
Ответ на: комментарий от i-rinat

HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89

Немножко путаницы вносите. HOST{CC,CFLAGS,итд} в ядре нужны для того чтобы построить вспомогательную утилиту под архетиктуру билд-хоста что-бы в процессе её запустить. Т.е. ею код ядра не собирают. Не думаю что можно по этому флагу судить о всем коде.

FeyFre ★★★★ ()
Ответ на: комментарий от Deleted

Слишком много ошибок на один пост. Возможно, тебе не следует давать советы по той теме, в которой ты разбираешься поверхностно.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

По моему, жиреть не надо. Да, я ошибся. Если ты так уж любишь спешить и отлично разбираешься в теме, то следовало изначально дать ответ на пост ТС, а не начинать искать ошибочные комментарии и мазать жиром форум.

Не требуется повторять одно и то же 4 раз.

Deleted ()
Ответ на: комментарий от Deleted

Не требуется повторять одно и то же 4 раз.

Да вот такой бред как у тебя форумчане повторять не стесняются. Кто хочет чему-то на лоре научиться ссзб

anonymous ()
Ответ на: комментарий от anonymous

Что ж ты сидишь на лоре? Может тебе уже пора?

Deleted ()
Ответ на: комментарий от mystery

По-моему, gcc действительно это делает, но только для стандартной библиотеки (т.е. не ищет по всем прописанным путям для всех либ сам).

anonymous ()

Качаешь самое последнее издание K&R. В отличии от «ЯП для чайников», эта книга плохому не научит;-) Досконально изучаешь материал и примеры. Книга научит думать головой и писать разумный программный код. Также, необходимо научиться читать ошибки компилятора. Варнинги также! Можно с помощью гугла. Заодно изучишь последние стандарты компилятора.

PS В оригинальной книге K&R 2009 присутствует строка #include <stdio.h>.
Warning тебя пошлёт, а гугл заставит добавить int main() и return 0.
Но, если не ошибаюсь, данные моменты раскрыты в книге в дальнейшем;-)

Ignatov ★★★ ()
Ответ на: комментарий от i-rinat

Не понимаю, почему все K&R боготворят.

Найдите книгу лучше! С такими же примерами, разбирая которые удивляешься их простоте и гениальности, а в умелых руках книга научит присать точно такие же строки. Кто лучше всего опишет свё детище, если не его автор? Предлагаете книгу для чайников? Итак полно чайников-говнокодеров, выучивших синтаксис, но не познавших «дзен» самого языка.

PS В наш век интернета не сложно найти работающий пример «hello world» на си в википедии и найти 5 отличий. Как никак, а прога-старт в любом ЯП. Что плохого, что книга в самом начале посылает в гугл? Любая техническая книга пошлёт туда! Часто по прямой ссылке.

PPS в оригинале 2009 года

#include <stdio.h> 

main()
{
        printf("hello, world\n");
}

Ignatov ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.