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.Как можно создавать патчи к программам

★★★★★

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

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

ГЦЦ тут не причем, это CPP делает, он просто переносит содержимое хедера в сорс
Обычно в хедере декларируют функцию, но без тела, а уж сама функция отдельно от основного файла программы
Когда в гцц передаешь несколько файлов, то он их отдельно собирает в объектники и уже эти объектники в бинарник линкует
Но объектник может быть распаложен и в /lib/*.a
Если использовать функцию из хедера, но не линковать, то будет undeclared reference to function в момент линковки основного объектника
Я не бог Си, но очень интересен этот язык

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

Типы уже давно пора указывать. Аргументы функций вне скобок я не видел о-очень давно. Собственно, в реальном софте я их видел только в arpwatch, который в 90-х последний раз правился.

Начинать с древностей, которые кроме этой книжки больше нигде не встретятся — странно.

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

Аргументы функций вне скобок я не видел о-очень давно.

В актуальной версии k&r этот синтаксис не используется.

Типы уже давно пора указывать.

В этом хрупком и неоправданно сложном язычке очень много всяких «давно пора», так что одним нюансом больше, одним нюансом меньше — для вводного курса не роляет абсолютно. Лишь бы конпелялось.

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

main()
{                               /* fahrenheit-celsius
                                 * table */
        int fahr;
        for (fahr = 0; fahr <= 300; fahr = 20 + fahr)
                printf("%4d %6.1f\n",
                       fahr, (5.0 / 9.0) * (fahr - 32.0));
}



Как сделать, чтобы это приграмма показывала темпиратуры в обратную сторону?

ne-vlezay ★★★★★
() автор топика
Ответ на: комментарий от ne-vlezay

Как сделать, чтобы это приграмма показывала темпиратуры в обратную сторону?

Нанять программиста, чтобы он её поправил? :D

Нужно изменить цикл for(). Чтобы начиналось с 300, продолжалось пока больше или равно нулю, и в процессе работы не увеличивалось с шагом 20, а наоборот уменьшалось.

Manhunt ★★★★★
()
Ответ на: комментарий от ne-vlezay

Как сделать, чтобы это приграмма показывала темпиратуры в обратную сторону?

./приграмма | tac | rev
anonymous
()
Ответ на: комментарий от anonymous

CPP - препроцессор для Си
если ты пишешь #define MAX 50, то в коде просто все MAX будут заменены на число 50, во время препроцессинга
ЦПП возвращает Си файл с заменами, а уже Гцц его транслирует в Ассемблер, который линкуется и собирается в бинарный файл, где хранятся машинные коды
ГЦЦ не понимает всякие инклюды и дефайны, их преобразует ЦПП перед ГЦЦ
ГЦЦ всего-лишь транслирует код

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

Т.е. прежде чем код компилируется СС, он разбирается плюсовым препроцессором? А если я хочу сишную семантику, а не плюсовую?

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

Боже мой, как всё сложно. Спасибо, что объяснил. Т.е. это поведение, описанное в стандарте и повторяемое во всех компиляторах си и вовсе не особенность гццшного препроцессора?

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

И эта, получается CPP — не часть GCC? И зачем ты смешиваешь транслит с неправильной раскладкой, ты меня запутал.

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

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

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

Ну не пишите вы фигни, если не знаете!

Просто там тип с дефолтным совпадает в достаточной степени, вот оно и работает.

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

И эта, получается CPP — не часть GCC?

Часть (https://gcc.gnu.org/onlinedocs/cpp/), просто она идёт отдельным бинарником. Его, в теории, можно использовать для чего угодно:

$ cat foo
#define THRICE_ECHO(x) echo x; echo x; echo x;

THRICE_ECHO("hello")
$ cpp foo | sh
hello
hello
hello

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

Хотя именно сокращение GCC - это не GNU C Compiler, а GNU Compiler Collection.

Но когда ты пишешь gcc - по умолчанию считается, что ты обращаешься к C компилятору, а для компилятора C++ надо использовать g++.

Deleted
()
Последнее исправление: merhalak (всего исправлений: 1)
Ответ на: комментарий от anonymous

Т.е. это поведение, описанное в стандарте и повторяемое во всех компиляторах си и вовсе не особенность гццшного препроцессора?

Вообще не то. Когда cpp видит #include <что-то>, он ищет этот файл в стандартных include-путях и тупо копирует его в свой вывод. В stdio.h есть определение функции printf:

$ grep -w printf /usr/include/stdio.h
extern int printf (const char *__restrict __format, ...);
Оно нужно компилятору для того, чтобы он, во-первых, знал, как передаются параметры в функцию (какие — через стек, какие — через регистры (в этом я слабо разбираюсь, возможно, говорю что-то не то)), во-вторых — чтобы бить тебя по рукам, когда ты передаёшь что-то не то. Сам код функции printf не расположен в stdio.h и никуда не добавляется при подключении этого файла. Он находится в libc, с которой динамически линкуется твоя программа:
$ .ldd ./helloworld
	linux-vdso.so.1 (0x00007ffddd74c000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1cfda70000)
	/lib64/ld-linux-x86-64.so.2 (0x000055b99a8a8000)
Если компилятор не обнаруживает определение printf, то пытается угадать, как передавать параметры, выводит предупреждение об этом, и всё равно линкует с libc. Последние версии gcc умеют подсказывать, что именно ты забыл подключить:
$ gcc 2+2.c
2+2.c:1:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main()
 ^
2+2.c: In function ‘main’:
2+2.c:6:2: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
  printf("Result: %1.0f\n", res);
  ^
2+2.c:6:2: warning: incompatible implicit declaration of built-in function ‘printf’
2+2.c:6:2: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’

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

пытается угадать

по-моему тут объяснено лучше и это больше похоже на правду, т.е. это фича c89, но не корректное поведение для компилятора, поддерживающего более актуальные стандарты. Gcc считает это допустимым. В общем теперь понятно, да. Меня просто смутил факт того, что это работало для стандартной библиотеки, но не работало с левыми либами.

https://stackoverflow.com/questions/9182763/implicit-function-declarations-in...

anonymous
()
Ответ на: комментарий от Ignatov
#include <stdio.h> 

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

C -Wall тебе скажут что ты глубоко неправ, ибо main должен возвращать int.

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

как ни странно но по первому изданию(за исключением программы переводящей обьявление имени в её словесное обьяснение что во втором издании)С лучше понимается именно как перенносимый ассемблер - а не как универсальный язык программирования переполненый бюрократией как та java.

т.е очевидно писать промышленный код стоит в соответствии текущими стандартами и поэтому их стоит знать однако вот как раз изучать С стоит вот по такому:

http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/bc.y

ну и по http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/ls.c

вообще ТС'у:

вот http://minnie.tuhs.org/cgi-bin/utree.pl?file=V2/lib/printf.c как начальное приближение магии разбора формат строк у принтф-функций.

есть несколько книг по С/Linux(Unix) которые много лучше обычных методичек «дрессировка языку программирования $NAMEofPL не приходя в сознание за 21 день»

одна из которых авторства(http://www.skeeve.com/)(http://www.oreilly.com/pub/au/459)

Linux programming by Examples http://www.informit.com/store/linux-programming-by-example-the-fundamentals-9...

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

C -Wall тебе скажут что ты глубоко неправ, ибо main должен возвращать int.

Неправ ровно настолько, чтобы получить warning в ответ. Но hello world я получу! В команда компиляции -Wall не указан. Собирается командой $ cc ~/hello.c, как написано в учебнике. Так что этот пример ближе к истине, в отличии от примера учебника по ссылке в теме.
Гугл на warning отвечает, что необходимо добавить return 0;
И если я не ошибаюсь, то именно в этой книге дальше описывается этот warning и как с ним бороться.
Сложно?! Разумеется, что проще назвать книгу плохой и пойти говнокодить учить PHP.

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

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

несколько совместных причин из многих

С/Unix захватывал академию с 1976 годов и K&R1978 на долгие 3-4 года был единственным учебником по С

K&R(1ed) есть расширенное описание сделанное из

UNIX TM TIME-SHARING SYSTEM: UNIX PROGRAMMER’S MANUAL

Programming
14. The C Programming Language — Reference Manual. D. M. Ritchie.
Official statement of the syntax and semantics of C. Should be supplemented by The C
Programming Language, B. W. Kernighan and D. M. Ritchie, Prentice-Hall, 1978, which
contains a tutorial introduction and many examples.

при помощи которого(K&R) вкуривали http://wiki.tuhs.org/doku.php?id=publications:lions_commentary (http://wiki.tuhs.org/doku.php?id=publications:books)

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

имхо для некомпилерреализатора C Interfaces and Implementations: Techniques for Creating Reusable Software полезней как пример годного кода

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

PPS. и да - эффект атрактора - т.е когда об египте знают что пирамиды из всех римских владельцев империума - Цезаря помнят, из любой группы лиц-единемышленников через некоторое время все черты переносятся на оставшегся как культурный архетип персонажа с именем совпадающим с наиболее известным из таковой группы- такова мифологизация прошлого как механизм сжатия для практического использования знания о нём(прошлом)

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

вообщет если чел учится программированить -то либо K&R(1ed1978)либоK&D(2016)http://www.gopl.io/

т.е можно курить K&R(ну и стивенс для многопроцесности,сигналов и прочего что тогда не было сознательно включенно в язык а оставленно в виде сервисов операционной системы когда в го-лэнге начинаюся go-рутины) и чё нить про trap(из sh)(когда в голэнге касаются defer ) и K&D в параллель смотря как изменился габитус программиста потребного

В оригинальной книге K&R 2009

есть только K&R(1ed)1978

TCPL(anci 88|89|90) - это второе издание

и как ни покажется не относящимся к С(как языку)

http://www.gopl.io/ - как 3 издание учебника программирования предназначенного.

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

ващет в K&R слабо освещёно в смысле дзена в части почему есть -> (когда есть как в любом из тогда языков программирования обращение к полю . и разыименнование указателя * )

при том что хватило бы пары строк кода из уже имевщегося софта(в выше указаном Арнолдь Робинсе сырец ls v7unix):

http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/ls.c

register struct lbuf *p;
	register char *cp;

	p = ap;
	if (p->lnum == -1)

при том что ко 2ому изданию register стал устаревшем труднее стало понять не только удобство p->field в сравнении (*p).field

но и вообщет необходимость на железе где часть ячеек памяти может быть * но не может быть &

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

Начинать с древностей, которые кроме этой книжки больше нигде не встретятся — странно

при такой траектории освоения С верно .

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

т.е. С89 обюрократился по мере того как язык С сам по себе переставал быт исключительно инструментом исследования в высоколобых лабораториях/академиях а стал больше индусодружелюбней с потогонками в которых жава по причине ещё большей констрейн победила. ----------------------------

ежель курить старые сырцы - да даже minix 84-85 - который именно учебный код старый синтаксис стоит уметь понимать(как и старую ру-орфографию хотя бы 19 века - там и понятно что в начале 18 века современного русского языка просто до Пушкина не было)

qulinxao ★★☆
()
Ответ на: комментарий от ne-vlezay

используй shell скрипт

который затабулирует fahr-cels таблицу t f(t)

и grep для поиска по f(t)

и cut для извлечения t

ps. а был бы у тебя php&mysql ваще .

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

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

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

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

Да, так и есть
И ассемблер, и линковщик отдельно

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

лучшее понимание предшествующей эволюции помогает формулировать более 50% точные гипотезы о будущем(наука вот это вот всё)

ну и да на примере sh+c(1970ых)+re+остальные специализированные языки юникс среды середины 70ых ~=~ golang + re + несколько иной набор специализированных языков

и вот в части как часть вещей из шела авторы голэнга (опустили_подняли) в язык ....

кстати вон в топике который ща начал - чё подскажишь по системе реализованной на sh|c в которой по возможности в момент холодного старта системы минимальный бинарный(исполняемый код хост-машины) образ -а всё по сути система в !# файлах sh и с кода?

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

и ты ведь осознаешь что твой вопрос сам по себе очень как -бы корректно сказать «ротен»- дискуссионый ибо моё да/нет(в ответе на него) сводит к диалог к субъективности мнений и требований «show u f* code»

----------------

имхо Да - лучшее понимание помогает мне писать софт лучше.

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

Я же обратил внимание на примеры. Сложные и интересные примеры. Лично мне K&R как книга понравилась из-за наличия качественных примеров. Да, прогресс не стоит на месте. Раньше бились за мегабайты оперативы, а сейчас за наличие большинству нафиг не нужных плюшек. И я указал в своих сообщениях, что если книга на сегодня в самом начале посылает в гугл, значит и нужно там искать большую часть инфы, особенно если сам компилятор туда шлёт! Лично я так и изучаю в последнее время ЯП. Ищу доступный, качественный материал и изучаю совместно с гуглом. В чём я не прав?
PS в силу разработки сайта, как проект, в качестве последнего изучал PHP. Обшарил форумы, вики. При этом в качестве основного учебника использовал труд «создаем динамические веб-сйты» Р. Никсон.

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

show u f* code

Собственно, я видел твой код. Мне интересно только перешёл ли ты от «малой формы» к большой.

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

Есть ещё Object Oriented Programming with ANSI-C. Довольно неплохая, кстати.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Manhunt

я тоже это поддержу. для начинающего не нужны последние стандарты С. в конце концов, указать компилятору -ansi принудительно.

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.