LINUX.ORG.RU

Программирование на С


21

16

Здравствуйте мои дорогие любители погромирования. Прочитал K&R «Язык программирования Си». Теперь нужна книга, которая расскажет как правильно писать код на С, общепринятые приёмы и стандартные алгоритмы решения типичных задач. Цель: пишу быдлокод для МК и хочу повысить свой скилл.

Перемещено mono из talks

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

человек уже может отличить int от char

Следующий этап — узнать, что int может быть от 6 до 64 бит; char — от ~4 до 32; а long и long long могут быть одинаковыми!

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

Вот тебе не подумать: http://bash.im/quote/420672

(По ссылке - копипаста про Петю и Васю)

Я довольно много думал над этой историей, когда ещё она не была баяном с бородой, достигающей пределов земной атмосферы. И вот что скажу.

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

История вроде как выставляет Петю неудачником. Ну-ну. Во-первых, он дёшево отделался. Не сел в тюрьму, не скрывается от кредиторов по тёмным углам, не получил от бандитов в подарок модную итальянскую обувку из цемента. Во-вторых, ему теперь не надо сношаться с налоговой - для этого есть Вася - и он может наконец проводить вечера с семьёй, или с любимым опенсорц-проектом, или по очереди. В-третьих, он может заниматься своим делом, и делать его хорошо. Чего и вам от всей души желаю.

А и да, при нынешней ситуации с кадрами в IT, «тестировщиком» - человека, в одно лицо поднявшего конкурирующий проект? По-моему, это случай так называемого вранья. У меня всё.

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

Не говоря о том, что чтение того же Шеня без открытого редактора с текстом, таки да, пустая трата времени.

Без открытого редактора с _кодом_, конечно же.

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

Были такие микроконтроллеры когда-то. Много чего было.

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

И какой смысл в том, что он реализованы, если я о них не знаю? А так заодно пойму как работают.

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

точно точно. Недавно как раз занимался переписыванием говнокода (тек, падал, тормозил) на Си на нормальный С++.

Си это такая весчь на которую уже все давно забили. Ядра и всякие железки не в счет. Для последних и то уже свои языки делают.

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

Естественно, надо забыть про всякие printf'ы

Это уже экстремизм какой-то. Скажи честно - ты просто не осилил доки к stdio.h и прикручивание уартов к потокам, в которые могут писать printf'ы.

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

Ты в курсе, сколько "весит" printf?

Ну и не нужно это в микроконтроллерах. Как и всякие strings и прочая хрень.

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

Ну, во-первых «стандартный» printf на МК является специально оптимизированной под МК версией printf, из которого ради экономии очень многое порезано (как раз самое жручее). В документации на стандартную библиотеку Си для МК про это написано, кстати. Ещё ни разу у меня из-за принтфа программа не начинала пухнуть. А вот форматированный вывод очень нужен для отладки, если в отладочных сообщениях не только «привет, мир, я запустилось», но и измеряемые/изменяемые в работе значения, например.

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

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

как ни начинаю писать на С - постоянно наступаю на грабли со строками. Я туп?

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

«стандартный» printf на МК является специально оптимизированной под МК версией printf, из которого ради экономии очень многое порезано (как раз самое жручее)

Это где такое? Я тебе про gcc говорю. Ему лишь нужно определить основные сисвызовы (на USART, USB, ethernet или экранчик).

А то, о чем ты говоришь, является своим собственным велосипедом. У меня тоже такое есть. Я не вижу смысла писать больше, чем короткие комментарии и значения целых переменных. Все равно ведь в окончательном варианте всегда данные в бинарном виде передаются.

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

Это где такое? Я тебе про gcc говорю.

Это не в gcc делается, а в стандартной библиотеке (libc).

А то, о чем ты говоришь, является своим собственным велосипедом.

Оно находится в стандартной библиотеке и поэтому не является велосипедом по определению. А твоё - да, является.

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

Ты, похоже, что-то не то делаешь.

неверное я не читаю страницами документацию по выделению памяти и не знаю на память, какие функции сами выделяют, а какие нет... ну и возвращение функцией нескольких переменных - та еще чехарда.

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

Вот как в аврах: Due to space constraints, some functionality has not been implemented at all (like some of the printf conversions that have been left out).

( http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#ga3e8cefeee... )

Вот как в армах (где libc от codesourcery, основанная на newlib): Depending on how newlib was configured, not all format specifiers are supported.

( https://sourceware.org/newlib/libc.html#sprintf )

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

В манах все написано, зачем наизусть учить?

чтобы больше времени проводить за написанием кода, а не за чтением манов.

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

Можно подумать, ты код строчишь со скоростью 400 символов в минуту! Одно только обдумывание алгоритма обычно процентов 90..99 времени занимает! А на клавотыкание совсем немного времени в общей массе уходит же!

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

Можно подумать, ты код строчишь со скоростью 400 символов в минуту! Одно только обдумывание алгоритма обычно процентов 90..99 времени занимает! А на клавотыкание совсем немного времени в общей массе уходит же!

вот в этом и дело. Я хочу 90% времени обдумывать алгоритм и 10% писать его. А не 40% обумывать, и 60% наступать на грабли и читать маны.

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

Маны на часто употребляемые функции подробно читать не надо: просто смотришь типы аргументов + какие инклюды указать. Ну, еще смотришь возвращаемое значение и что там еще.

Можно подумать, в плюсах или любом другом языке не надо читать маны на каждую функцию!

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

Маны на часто употребляемые функции подробно читать не надо: просто смотришь типы аргументов + какие инклюды указать. Ну, еще смотришь возвращаемое значение и что там еще.

Можно подумать, в плюсах или любом другом языке не надо читать маны на каждую функцию!

в плюсах еще больший геморрой наверное.

А у меня в том и беда, что на часто употребляемые функции приходится читать маны. Уж не знаб почему так. Как ни начну писать на Си - час отлавливаю сегфолты. Ну его в жопу. Лучше на пистоне или паскале писать, если на октаве не вкатывает.

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

Во-первых, огромную работу за тебя делает компилятор (если, конечно, ты не настолько ССЗБ, что не сказал ему "-Wall -Werror"). Во-вторых, внимательность нужна в любом ЯП: если в сях у тебя сегфолт, то это хорошо — в каком-нибудь пхытоне это может быть необъяснимым багом.

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

Во-первых, огромную работу за тебя делает компилятор (если, конечно, ты не настолько ССЗБ, что не сказал ему "-Wall -Werror").

не знаю... компилю просто без всяких ключей.

Во-вторых, внимательность нужна в любом ЯП: если в сях у тебя сегфолт, то это хорошо — в каком-нибудь пхытоне это может быть необъяснимым багом.

в пыхтоне или паскале это просто работает. Оно делает именно то, что я имею в виду. Там не надо с этими указателями трахаться. Это мой опыт так показал...

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

Как ты быстро перешёл от «ни в коем случае не использовать printf в микроконтроллерах» к «мне нинужно, поэтому я не пользуюсь».

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

Можно подумать, есть разница! Если мне не нужно, то не нужно никому! ☺

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

я кстати до сих пор не знаю, как нормально передать структуру в качестве результата функции, чтобы без всяких new или malloc. Ну или хотя бы просто _два_ разных числа. два float или два int например.

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

Сделай ее глобальной,

час от часу не легче :) Один костыль, чтобы другой не юзать.

если не хочешь malloc использовать. Но я не понимаю, откуда такая нелюбовь.

это ж блин следить надо за освобождением памяти и т.д. Да и вообще лишние отвлекающие строки.

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

это ж блин следить надо за освобождением памяти и т.д.

Можно подумать, тебе в плюсах или каком-нибудь пхытоне не надо за этим следить!

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

это ж блин следить надо за освобождением памяти и т.д.

Можно подумать, тебе в плюсах или каком-нибудь пхытоне не надо за этим следить!

плюсами я, слава Патрегу, не пользуюсь, а в пыхтоне да, не надо. Как и в Паскале - там тоже не надо.

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

Да ладно тебе! Если ты в пхытоне будешь по гигабайту выделять и не освобождать память, то тоже кранты наступят!

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

та фиг бы с ним, с free. Но без malloc все равно не обойдешься. А пистон кстати сам мусор собирает, там и с гигабайтами проблем не будет, афаик.

А я до сих пор не знаю, как на С написать примерно так (только без всяких mallocoв):

program test;

type
    TR = record
        a: integer;
        b: integer;
    end;

function f: TR;
begin
    f.a:=2;
    f.b:=3;
end;

var
    r: TR;

begin
    r:=f;
    writeln(r.a,' ',r.b);
end.
dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 2)
Ответ на: комментарий от Eddy_Em

ЯХЗ, у gcc в libc

хоспаде. кот ж тебя к клавиатуре-то подпустил?

anonymous
()

чистый код уже советовали?

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

Да запросто: в теле основной программы безо всяких маллоков объявляешь структуру, ее адрес передаешь в программу, которая эту структуру изменяет. Все ОК.

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

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

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

Я уже неоднократно говорил: АВРки никогда не использовал, поэтому ни хвалить, ни хаять их не имею права!

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