24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Stephen Prata "C Primer Plus, 6th Edition" (2014) Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002) Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) "Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
>>820954 Можно читать K&R, второе издание. Если чего-то вдруг не соберется (Pelles C не любит до-ансишный способ декларации функций), спросишь тут, да и все.
>>820659 (OP) Прохожу значит cs50 я и решил выложить код на кодревью, если кому-то захочется покритиковать код, буду очень рад.
Суть кода в том, чтобы залезть в card.raw файл, с которого по заданию были удалены jpg фотки и восстановить их в текущую директорию http://pastebin.com/804RAvLH комментарии есть (первый раз писал комменты реально). Код работает, интересны замечания в реализации.
>>821597 Ну первое то вообще фигня, второе я осилил еле еле, теперь читаю всю доступную литературу, сделал паузу пока. Потом вернусь, переделаю весь сет. Кстати, первое я тоже зафейлил, потмоу что думал что там Дэвид изображен а там рикролл
Подскажите, почему так? Запускаю "time ./heapsort < input", показывает 0.106 s, а второй и последующие разы 0.46 s, причем первый раз всегда зависит от размера input, а при повторном запуске время всегда 0.46 s. Можно от этого как-то избавиться? Это типа оптимизации какие-то?
>>821598 Во втором я на самом деле решение подсмотрел частично, у меня получилось увеличить изображение, но я увеличивал только по длине, а по ширине забывал, в итоге часть пикселей пропадало.
>>821577 > если кому-то захочется покритиковать код, буду очень рад. Что ты хочешь услышать? Насколько читабельный код или насколько правильно задание сделал? Если первое: 1. #define BUF_SIZE 512 нуу или хотя бы sizeof(buffer) вместо указывания размера при каждом использовании. Да и в целом все константы-имена мог бы и задефайнить. 2. Где блять проверка ошибок вызываемых библиотечных функций? 3. Глобальные переменные в main запихнуть зачем ты вообще решил сделать их глобальными? 4. Не используй sprintf если можно использовать snprintf 5. 99% комментариев не нужны, код и так понятен. 6. (-1 * 512 ) - нахуя так делать?
>>821613 >а в 6 не понял, а как еще сделать было? -sizeof(buffer)? Ну да, ебать, какой смысл добавлять умножение на единицу если нужно просто добавить минус.
>>821993 >>822012 Возьми pthreads, нахуй тебе winapi? Структуру можно создавать в стеке, ты же будешь дожидаться, пока треды не закончат работу (зделоешь join) и не выйдешь до этого из функции.
>>822305 Сравни "указатель на что угодно" и "указатель на указать на что угодно". Во втором случае есть конкретный тип, поэтому компилятор и ругается. Вот дереференснешь если - тогда не будет.
>>822403 Не бред. void ∗ - указатель на что угодно. По стандарту, ты можешь без каста присвоить void ∗ любому другому указателю плюс-минус квалификаторы (и обратно). Грубо говоря, если у тебя указатель на T, и T == void, есть магия. Если у тебя T == int, T == int ∗, T == struct ∗, T == void ∗, T == что-то еще, тогда магии нет.
>>822461 Ты ебанутый? Я же написал - разберись, что значит два плюсика перед переменной (преинкремент) и после (постинкремент). Копипасть инфу с книги я не буду, сам найдешь охуели вообще
>>822426 1. ты не хуя не объясняешь, а только путаешь.
2. нахуй ты мне объясняешь стандарт, я и так знаю что такое void@.
3. я говорю как было бы правильней, потому что так наглядней и меньше путает. и я не хочу писать всю структуру, чтобы иметь столько @ сколько захочу...
4. и вообще, если вспомнить asm... короче, плохо.
и ещё, я тут понял для чего нужен + в указании знака числу, чтобы конструкция вида #if (SOMEVER + 0 > 1) работала, даже если SOMEVER не объявлен.
>>822483 >и ещё, я тут понял для чего нужен + в указании знака числу, чтобы конструкция вида #if (SOMEVER + 0 > 1) работала, даже если SOMEVER не объявлен. Ну тут ты уже придираешься, препроцессор не должен вместо отсутствующей директивы лепить какого-то хуя 0).
>>822538 > препроцессор не должен Как раз таки должен. Все имена, которые #if не смог развернуть, он заменяет на литерал 0. Нахуя >>822483 воткнул +0 в #if - совершенно непонятно. #if (SOMEVER + 0 > 1) развернется в #if (0 + 0 > 1) если SOMEVER не определен, в #if (что-то + 0 > 1), если SOMEVER определен, ну или свалится, если SOMEVER не разворачивается в число или выражение.
>>822613 Но ведь он прав. Похожая проблема существует даже в более высокоуровневых языках, например, в жабе при работе с дженериками. Там никто никого гуманитариями не обзывает, но по-другому (не с помощью ебли с приведениями типов) красиво решить проблему в языке нельзя.
Попытался реализовать стек, через двусвязный список, все вроде ок компилится и работает, но валгринд ругается, причем не на утечку памяти, а хз на что, посмотри плиз, а то я не вижу явных косяков.
Аноны, совсем нубовопрос. Читаю K&R, и хочу спросить, есть такой кусок кода:
printf ("%2d", a)
Он должен выдать "a" в поле из двух позиций, да? Но оно выводит все число, и трехзначное и четырехзначное. Я предполагал, что мне выдаст два первых разряда только. Чего я не понимаю? Ткни носом, анон. Гугл не помог.
>>823317 Как минимум сделай человеческую проверку на ошибки malloc-а. Если malloc в push фейлится, то при pop будет обращение к нулевому указателю, на что, возможно, ругается valgrind. Ну и на счет free: temp = real_first;
while (real_first != NULL) { // ТЫ ТУТ ОСВОБОДИЛ память по указателю temp и real_first free(temp); // А ТУТ ТЫ ОБРАЩАЕШЬСЯ К ЭТОЙ ПАМЯТИ. ЕБАНУТЫЙ! real_first = real_first->next; temp = real_first;
>>823371 а может я и путаю, и небыло обязательного правила, и это причуда компилятора, хуй их знает на что они ворнинги выбрасывают, вон, на тот же & без скобочек - только так.
>>823345 >а что значит человеческая проверка? да в принципе я пересмотрел код, и так сойдет для начала. Важная ошибка в коде - ты не инициализируешь newptr->next когда делаешь push первого элемента (то бишь когда (first == NULL)), а надо делать newptr->next = NULL. В целом реализация алгоритма не очень красивая, подумай как лучше сделать
>>823436 Да исправил уже этот косяк, на самом деле только сейчас в курсе начались структуры данных, первый день и это по большей части эксперименты по реализации.
https://ideone.com/TAV3uO вот реализация, valgrind не жалуется, только тут я по типу очереди сделал, удаляет первые элементы, а не последние.
Лол, не заметил надпись "ПЕРЕКАТ!!!". Репощу сюда в легитимный >>823404
Пытаюсь написать интерпретатор/терминал/оболочку (не знаю как назвать) для парочки команд в микроконтроллер, чтобы через последовательный порт можно было заставлять его что-то делать прямым текстом (командами а-ля баш). Пока пишу под ПК на линуксе. Вопрос следующий: как перехватить стрелочки, чтобы не выводился мусор типа "^[[D", а каретка перемещалась по вводимой строке? Пробовал getchar() и scanf() с одинаковым результатом, но я понятия не имею как предотвратить вывод этого мусора. Остальное я представляю себе как реализовать. Обязательный момент - это использование только функций из страндартной библиотеки. И, кстати, вводимую строку пишу в массив символов - это нормально так делать или стоит переехать на указатели?
>>823486 > <termios.h>. noncanonical Ты хочешь сказать что этот хидер неканоничный? Как ни странно, на его включение компилятор под мой контроллер не ругнулся, значит им можно пользоваться. Я попробую. НО! Посмотрев исходный код fgetc(), я понял, что его вообще не ебёт, что там у меня отображается при вводе, потому что это просто поток символов, который он потом, будучи выполнен несколько раз в цикле, по одному символу проглотит. В таком случае я просто не буду пользоваться стрелками для перемещения каретки - только бекспейс. > > И, кстати... > что? Если не понятно выражаюсь, то здесь я имел в виду, что всё полученное через getchar() я складываю в массив char, чтобы потом использовать. Насколько я знаю, последовательность символов можно строкой записать по указателю. Возможно, я не прав или это совсем аутизм.
>>823500 >Ты хочешь сказать >неканоничный это режим терминала - не каноничный, там ты можешь что хочешь почти. и что такого сложного в этом потоке символов распарсить стрелочки, в esc последовательностях? там делов то, да и есть, наверно, какие-то функции. но стандарт ц тут нипричём.
> то совсем аутизм. вот ты ещё раз написал, и я снова нихуя не понял.
>>823500 > Ты хочешь сказать что этот хидер неканоничный? Как ни странно, на его включение компилятор под мой контроллер не ругнулся, значит им можно пользоваться. Я не понял, ты подключаешь клавиатуру к микроконтроллеру что ли?
>>823510 Не совсем. Я пользуюсь Serial Wire Debug JTAGом. Это просто последовательный порт для отладки исполняемой программы в мк, который, в том числе, работает... как терминал, ёпта. Всякие там printf'ы блекджек и шлюхи, всё включено.
>>823506 Я не понимаю слово "распарсить". Я просто хочу, чтобы у меня не было пикрилейтед при вводе с клавиатуры, когда я нажимаю стрелочки. Я хочу чтобы каретка двигалась! Мне теперь кажется, что программа что-то должна сообщить терминалу, чтобы он переключился в необходимый режим, который будет обрабатывать стрелочки как указание передвижения каретки, а не как символы и это будет решением.
> вот ты ещё раз написал, и я снова нихуя не понял. Ну и хрен с ним. Просто надеялся, что мне подскажут другой (возможно, более удобный или правильный) вариант хранения полученных данных из getchar или scanf, кроме как в массиве типа char для дальнейшей обработки.
>>823527 >кроме как в массиве типа char ну а как ты себе это представляешь? может, система сома должна под каждую эвалбл порцию данных выделять кусок памяти и на него выдавать указатель? что тебе хочется то?
>>823546 Хочется сома научиться писать правильный код. Я слышал про malloc, так что тут можно так и сказать, что она сама лично и будет мне выделять память. И никто иной кроме неё. Спасибо за терпение и ответы
Я новичок, прохожу cs50 и захотел перекатиться на полноценную ide, скачал visual studio 2015, но не понял, как там на си писать, создать пустой проект? И как остановить компиляцию, чтобы прочитать вывод в консоль? Вообще чет в печали, есть ли что-то попроще?
>>823500 > Посмотрев исходный код fgetc(), я понял, что его вообще не ебёт, что там у меня отображается при вводе Далеко ходишь. Достаточно поискать по pdf-ке стандарта слова типа "консоль" "терминал" или "отображается" (на английском, есс-но), чтобы понять, что C и его стандартная библиотека о таком не знают.
> Вопрос следующий: как перехватить стрелочки, чтобы не выводился мусор типа "^[[D", а каретка перемещалась по вводимой строке? gnu readline
>>823620 > gnu readline Спасибо, конечно, но, мне кажется, я не осилю портировать её на микроконтроллер. Сейчас читаю про termios.h. Похоже, что это то, что нужно, но трудно даже взять в толк что это вообще такое. Решил пока ограничиться избеганием нажатия стрелок. Моя поделка вряд ли кому-то ещё понадобится, а я могу и потерпеть это безобразие.
int c; while ((c = getchar()) != EOF) putchar (c);
В таком виде программа читает все символы что я ввожу и выводит все в терминал(xterm). При этом, при нажатии Enter, все что я вводил вставляется в новую строку, а писать я начинаю на третьей.
Если убрать скобки вокруг "c = getchar()", то судя по книге программа должна печатать нули либо единицы, но все что меняется у меня - перестает копироваться все что я ввел в строку на новую, при нажатии Enter. При этом, при нажатии EOF, текст становится нестираемым бэкспейсом и лишь при втором его нажатии программа завершает работу.
Обьясните кто-то что происходит. Вряд-ли это из-за эмулятора терминала. Пробовал Sakura и Urxvt - все так-же. Издание K&R - третье.
>>824290 Не для cs50, а вообще, я на будущее скачал, так как сей замечательный курс уже подходит к концу, эх... и нужно отправляться в свободное плавание по морям it океана.
Надо было в следующем году его проходить, будет версия для очков виртуальной реальности.
>>824203 Если ты уберешь скобки то получится (c = getchar() != EOF) и в этом случае сначала будет выполняться getchar() != EOF, а только после этого c = getchar(), из-за этого так и получается.
>>824508 Чегооо? Если убрать скобки, у != приоритет выше, поэтому выполнится getchar() значение сравнится с EOF, результат подвыражения будет 0 или 1, это результат запишется в c, результат выражения будет все тот же 0 или 1, и этот результат уже обработает while. Никаких спецэффектов быть не должно, проблема, скорее всего, в терминале.
>>824203 >Если убрать скобки вокруг "c = getchar()", то судя по книге программа должна печатать нули либо единицы лол, нет. она будет печатать символы с кодом 1, а потом когда будет 0, цикл завершится
>>824607 я знаю английский на уровне прочитать какую-нибудь книгу по программированию, иногда заглядывая в словарь. а в cs50 субтитры идут очень быстро и я не могу сразу прочитать и понять
>>824672 Ну тогда норм, хотя бы задачники в оригинале читай. Перевод от джаварашей в принципе норм, сам первые видео так смотрел, а потом они начали выпускать раз в 2 недели блин.
Много ли я потеряю, если буду заниматься реверсингом только под линуксом и использовать gcc и clang? Лениво переключаться на другой компьютер со студией.
>>824743 Почти ничего не потеряешь, если устраивает линуксячий софт - radare2 очень даже норм. А компилятор виндовый иногда пригодится (ну там, посмотреть, как он что-нибудь кодогенерит) - рипни его из студии (у них где-то build tools даже отдельно релизились недавно). Чаще всего вайна будет вполне достаточно, но какую-нибудь хитровыебанную защиту без реальной винды ты не снимешь.
>>824576 Выставляй static где можно, inline где нужно, не объявляй переменные с типом меньше int если тебе похуй на переполнение и т.п. А вообще, оптимизация - дело мутное и всё придет с опытом.
>>824897 Вот в том то и проблема! Я каким-то чудом скомпилил либу без OpenSSL, ну а для компиляции с ссл просто нету нужных заголовочных файлов (я тщательно искал на сайте OpenSSL, там только новые версии)
>Нихуя не понял. Новые версии чего? OpenSSL? Да. В своих поисках я случайно где-то наткнулся на туториал по компиляции, там кажется нужна была версия 1.0.1d или что-то такое. Полез на сайт, не нашёл нужной версии (1.0.2h скачал, хули), и обосрался при компиляции.
>>823527 Не страдай хернёй и используй стандартные реализации управление контроллером типа FreeModBus. Если функционала будет нехватать - просто расширь список выполняемых команд.
Хочу написать хелловорлд через прерывания биоса на си. чтобы совсем не использовать системные вызовы или вызовы библиотеки, а только прерывания. Какие подводные камни?
>>826604 Все равно основа - шаблоны, а шаблоны в сишечке достижимы только через #define T int #include "mymap.h" #undef T и прочие подобные извращения.
>>826594 делают двумя способами: на *void, но как следствие полностью выключает контроль типов, зато можно передавать через границы бинарных модулей второй способ - на макросах, это сохранит типизацию, но через бинарные модули уже не перекинуть будет дополнительно можно сэмулировать variant на структурах и объединениях, минус - типы будут изначально ограничены теми, что есть в variant еще способ - запилить компонентую инфраструктуру типа com или gobject и поверх этого уже делать обобщенные структуры и алгоритмы
>>826698 Ну, именно весь их функционал никто и не использует в 99% случаев. Автодополнение и базовая навигация прикручиваются куда угодно на раз-два (а в сишке большего и не надо при всём желании, разве что дебаггер, который тоже прикручивается), и студию с её 10+ гигами в самой базовой конфигурации и говном размазанным по всей системе ради этого тащить явно не нужно.
>>826709 Рефакторинг? Охуенный отладчик и профилировщик? Инкрементальная конпеляция? Edit & Continue? Без этого всего можно жить, но с этим жить приятнее.
>>826723 >Рефакторинг после встроенного в иде рефакторинга, получаешь неработоспособное говно, особенно с макросами >Охуенный отладчик и профилировщик юзают внешние тулзы
могу сказать, что большего говна чем VS я еще не видел, даже clion не таким уебищем кажется.
>>826723 >Рефакторинг? Есть в clang-analyzere, как и автокомплит и навигация. Тулзы есть для всех редакторов. >Охуенный отладчик и профилировщик? GDB, valgrind >Инкрементальная конпеляция? Voobshe ohuet. Даже мейк это умеет. >Edit & Continue? Спорная фича, но gdb умеет код патчить в рантайме.
>>826970 Но он удобный, хорошо, что в cs50 показали эти ништяки, а то думал, что пределами винды нет жизни, а нет, намного круче все сделать через командную строку, вот!
>>826949 > gdb умеет код патчить в рантайме. Ох, как же я проиграл.
Алсо, сравнивать GDB с любым отладчиком, у которого есть GUI, просто неприлично. Именно из-за отсутствия нормального отладчика в мире nix люди до сих пор предпочитают отлаживаться printf-ами. GDB хорош только тем, что он есть везде и для всего, ну и ядро отладить еще.
>>826986 >люди до сих пор предпочитают отлаживаться printf-ами Логи - это просто в принципе другой способ отладки, который хождение по брейкпойнтам с отладчиком дополняет. От задачи зависит. Где-то удобнее дамп памяти смотреть, где-то сложную динамику работы отслеживать. >у которого есть GUI, просто неприлично Гуй для GDB у всех ИДЕ есть, даже у емакса, плюс у самого GDB встроенный текстовый. Да и консольный режим там довольно удобный.
>>826986 >люди до сих пор предпочитают отлаживаться printf-ами. Они это делают не из-за того, что с gdb сложно работать, а потому что отладчик - зло, особенно на встраиваемом железе.
>>820659 (OP) > Классика от Отцов: В чём профит давать ссылку на кривой скан? У меня даже пекарня тормозит при открытии. Неужели в сети нет пдфа с нормальным форматированием?
>>827798 Лень искать, скину книгу в тред когда приду домой. Ну а ты пока проверь вот это http://www.cypress.com/file/56651/download, у меня вроде такая же. Охуенно, книга лежит на официальном сайте Cypress. Это вообще законно?
>>827807 Во-первых, в ОП-посте тоже английская версия, но в хуевом качестве. Во-вторых, не советую быть тупорылым сишником, который не может в английский ибо это - очень печально.
>>827815 Ну баг, ну добавят диагностику слегка более вменяемую. Это прекомпилированные заголовки - костыль, который создает множество странных проблем и имеет множество ограничений. Ничего удивительного, что если ты хочешь странного и получаешь странное поведение.
>>820659 (OP) Вот объясните мне, нахуя нужны в линуксе статические библиотеки? В каких слуаях вообще они используются, если приемущества только у динаических? В инете толком про них не пишут. Возможно, нубский вопрос. Сегодня начал красноглазить, можете прописчать обряд посвящения.
>>820659 (OP) В книге с оппоста такое упражнение. Упражнение 1.16. Перепишите main предыдущей программы так, чтобы она могла печатать самую длинную строку без каких-либо ограничений на её размер. Предыдущая программа из книги: http://ideone.com/wI6z53. Помогите анончики, я озадачен. Пробовал маллоки\риаллоки - ничего не выходит.
>>828458 >>828458 не сейванул #include <stdio.h> #include <stdlib.h> / run this program using the console pauser or add your own getch, system("pause") or input loop / #define SIZE 100
int getline(char s[], int lim){ int c, i; for(i = 0; i < lim-1 && (c=getchar())!=EOF && c != '\n'; i++){ s=c; } if(c=='\n'){ s=c; ++i; } s='\0'; return i; }
void copy(char to[], char from[]){ int i =0; while((to=from)!='\0') ++i; }
int main(){ int len; int max; char line[SIZE]; char longest[SIZE]; max = 0; while((len = getline(line, SIZE)) > 0){ if(len > max) { max = len; copy(longest, line); } } if(max > 0) printf("%s", longest); return 0; }
>>828458 В оригинале это упражнение гласит так: > Revise the main routine of the longest-line program so it will correctly print the length of arbitrary long input lines, and as much as possible of the text.
Т.е вроде как надо напечатать ТОЛЬКО ДЛИНУ самой большой строки, а не саму строку
Господа, можно ли оценить как-нибудь оценить заранее обьекты каких классов требуют реализации move-операторов?
Есть большой проект, и есть идея немного его ускорить, но с чего начинать хз. Может есть какие-то виртуалочки или профайлеры которые смогли бы оценить что в первую очередь требует мув операций?
>>828651 Печатать надо length, а текста столько, сколько получится. Звать getline() в цикле, пока введенная строка не закончится на \n (т.е., не будет введена полностью), длины полученных в этом цикле строк складывать, первый кусок хранить. Никаких маллоков и указателей не нужно при такой постановке задания.
>>828731 Нет. По умолчанию оно обычно как-то так и выравнивается, но лучше посмотреть, как в твоем компиляторе указывается выравнивание и указать его явно.
>>828433 просто ещё не сделали лучше. ос на мобилки совсем недавно завезли. впрочем нахуй они нужны сейчас - хер знает. наверное, так на остаточном и двигаются.
>>828757 > про компоновку структур в какой главе? По всему стандарту размазано, как обычно. Но вообще, 6.2.6 (Representation of types) и 6.7.2 (Type specifiers). Алсо, _Static_assert не стоит использовать (как и _Bool, _Complex, _Noreturn и прочие новые имена). Их сделали такими только затем, чтобы не сломать чей-нибудь код своими нововведениями. Подключай <assert.h> и используй нормальный static_assert.
думаю пару высеров протестить на спектруме/сеге, но не очень догоняю как это технически происходит. есть компиляторы, на опр процы - это понятно, но ведь нужно как-то взаимодействовать с системой, адрес памяти и прочее - нужен заголовок, но чисто языком же это нельзя сделать. как это выглядит? я пишу глобальную структуру, и в ключиках компилятора указываю на неё, что тип ставь её в заголовок? или там, компиляторы сами могут в такие заголовки? короче не понятно.
Использую студию 2015 для компиляции сишного кода. Задал точку входа 0x02000000, но получаю ошибку: "0x02000000" is an invalid value for the "FixedBaseAddress"
Почему так? Как задать нестандартную точку входа, чтобы оставить место ниже?
>>829706 >>829707 Разобрался. Блять, как сделать исполняемый файл не 7 кб, а 1.5? Оптимизатор настроил на уменьшение размера, отключил исключения, смержил секции данных, отключил манифест и стэк канарис, отключил дебаг инфо и убрал релоки.
Сосоны, зачекайте, я тетрис на sdl сделал. Делал под шиндошсом в mingw, но у красноглазиков может тоже скомпилиться. У кого запустится/не запустится - отпишитесь. Вишмастеров нету, бля буду. http://rgho.st/64H2jkvBg
>>828586 крестобляди как есть - сами создают себе проблемы а потом героически их преодолевают посредством темплейтной магии, подключения буста и прочей блевоты
Есть ли смысл постигать ASM с более игрушечных архитектур, а не с 32битой? Или сразу с головой? Или от человека зависит? И нахуя я вообще это спрашиваю, взял да попробовал
>>829829 >Рантайм статический? Отключил его. Кстати, если я убрал CRT, и сишные библиотеки теперь не инициализаруются при запуске программы, можно ли использовать функции стандартной библиотеки си, или без рантайма можно использовать только WIN API, в котором и так все нужное есть?
>>829975 > можно ли использовать функции стандартной библиотеки си Как ты сам сказал, они не инициализируются, поэтому не стоит. Если очень хочется, можно сходить в дизасм и исходники CRT и посмотреть, чему нужна инициализация, а чем нет. Но зачем тебе вообще этот дроч на размер?
>>830002 Куча, локаль (ctype, в частности), stdint/stdout/stderr, tls. > зависит от реализации Да, даже от конкретной версии библиотеки. Но можно проверить, например, что memcpy не требует (или требует, например, если копирует через SSE) инициализации.
> что вы там собрались вручную делать тогда Я вообще не понимаю, нахуя анону это нужно. Бинарники до метра даже для хелловорлда норм.
>>830013 может он хочет максимально минимализировать чтобы выиграть в спец олимпиаде, но тогда, наверно, нужно основу написать на ассемблере, а остальное линковать из ц/чегоещё. или как?
возникает ошибка при любом вводе в строчке el = str[left]; разобраться в чем проблема не могу уже 2-й час. когда дебажу выдает sigsegv, то есть я обращаюсь к несуществующему месту.
>>829861 >Есть ли смысл постигать ASM с более игрушечных архитектур, а не с 32битой как появится время, очень хочу вкатится в arm, купить миникампутер за $10 и исследовать эту божественную архитектуру с запилом своей ос. x86 считаю сраным уебищем не достойным благородного дона.
>>829861 >Есть ли смысл постигать ASM с более игрушечных архитектур, а не с 32битой? Его и есть смысл постигать ТОЛЬКО для игрушечных архитектур если ты не собираешься заниматься реверс инжинирингом или ковыряться в ведре.
>>830057 > left != right || left + 1 != right Попробуй прогнать свой цикл в уме на строке из двух символов тебе нужно было всего лишь сказать left < right.
>>830273 как хобби и как большие перспективы, теже смартфоны например, да что уж, весь эмбедед. запил мобильной ос под опен мобил пхоне, а? а? этоже охуенчик.
>>830227 >да что уж, весь эмбедед. Смею тебя разочаровать, но с ассемблером сейчас ебутся только упоротые пердуинщики и бородатые дядьки на проектах 30-летней давности.
Для чего здесь union? Выглядит так, как будто PhysicalAddress и VirtualSize - два отдельных поля с разными значениями, к которым можно обращаться, но union работает как на пикче: то есть одни и те же данные могут интерпретироваться как char или как int.
>>830451 Не обращай внимания, особенности спеки. Вариант .Misc.PhysicalAddr не используется, и в 100% случаев тебя будет интересовать .Misc.VirtualSize.
у меня таки получилось. еле сделал, оказывается что сборщиков в tap под лялихом нет - и по итогу пердюлил в память через эмулятор, и из интерпретатора прыгал в память. а ещё у меня не работают глобальный переменные, но константные прокатили. ну не умею я в сегменты, или что там надо в crt0.s... а может это код инициализации нужно написать...
>>831293 Оно не должно работать в обоих случаях. Ты пишешь младший байт адреса строки в param[0], это вряд ли то, чего ты хочешь. Алсо, компилируй с -Wall /W2 или как там у тебя предупреждения включаются, тогда компилятор сразу пояснит тебе, что ты не прав.
>>831296 Именно так и должно работать. 'r' - один char, содержащий код символа r. "r" - адрес массива символов, и сработать такое могло лишь случайно (ну или разве что вот так *((mode & 0x100) ? "r" : "-")).
Т.е. для Buf выделить память. char buf = malloc (sizeof (char) 12);
Дальше там говорится как только не нужна buf - выполни free(). >Also note that, it is a good practice that after you have done with the allocated memory block, free it to save from memory leaks. Once you free the memory, you can't access that block again. А как его очистить-то если я ушел уже оттуда? И где-то посреди кода возвратил пару раз item_data?
>>831613 Так это вызывающий должен делать free, не ты. То есть, он зделол data = item_data(somelist); do_something_with(data); ну и делает free(data) потом, когда data ему больше не нужно. Можешь free() обернуть в какое-нибудь item_data_free(), это во-первых, избавит пользователя от раздумий, как очищать (и надо ли), во-вторых, позволит перекатиться с дефолтовой кучи на что-то кастомное, а в-третьих, позволит тебе делать какую-нибудь очистку, если data - не просто массив байтов, а какая-нибудь сложная структура.
Функции memset и memcpy определены в win32_crt_memory.h. Этот файл подключен в хедере pe_inject.h. Хедер pe_inject.h подключен в main.cpp. Я получил ошибку:
pe_inject.obj : error LNK2005: _memcpy already defined in main.obj 1>pe_inject.obj : error LNK2005: _memset already defined in main.obj 1>fatal error LNK1169: one or more multiply defined symbols found
В чем тут проблема? Почему функции УЖЕ ОПРЕДЕЛЕНЫ, если я использовал #pragma once или хедер гвард?
>>831617 Ну, извините, задание такое дали. typedef struct list_s { struct list_s✱ next; int data; } list_t; Вот этот мужик еще рассказывает почему так надо делать. https://www.youtube.com/watch?v=XmuZ_U_GLYY
Ну, или объясни ты, почему так нельзя? А то 1000 мнений вокруг и все правильные.
Вот смотри, по поводу free. вот я сделал функцию, например. char ✱item_data(const list_t ✱list) { char ✱buf = malloc (sizeof (char) ✱ 12); sprintf(buf, "%d", list->data); return buf; } как мне сделать так чтобы она и возвращала, и очищалась? Я вот этого не пойму. Ну пример я возвратил, да? Т.е. ложить(или класть, хз) в переменную и вместе с переменной его free? Т.е. на живом примере: char✱ data = item_data(head); printf("text %s \r\n\r\n", data); free(data); Это и всё?
>>831626 > Ну, или объясни ты, почему так нельзя? Потому что _t зарезервированный суффикс в POSIX, но на это похуй. А на что не похуй, так это на то, что: 1) есть IDE, которые тебе и так скажут, чем является идентификатор; 2) переменную от типа можно отличить по контексту, нет смысла повторять это в имени (посмотри сюда http://ideone.com/u7ifNQ ).
> как мне сделать так чтобы она и возвращала, и очищалась? Вот у тебя в конце поста все правильно сделано.
>>831628 > Ну, или объясни ты, почему так нельзя? всё можно, всегда так делаю.
> Это и всё? ну вариантов есть несколько, или вот так, по кривому, или передавать уже выделенную тобой память в функцию, и тут 2 варианта, если размер не высчитывается до рантайма: сделать функцию которая вернёт необходимое число памяти, либо передавать указатель на память вместе с размером, и если в функции не хватит - возвратить ошибку.
>>831639 Если это студия, там в свойствах проекта можно командную строку результирующую посмотреть. Где nodefaultlib (/Zl) у компилятора? Где выключенный инлайн (/Ob0 вроде)? И оптимизации временно выключи.
>>831645 >противоположности друг другу нет. просто в твоём варианте меньше гибкости, ведь если ты передаёшь память, то она может быть много чем и где угодно, и даже тупо, можно переиспользовать.
>>831647 > или передавать уже выделенную тобой память в функцию, Т.е. если я передам выделенную память в функцию, как же её тогда потом очистить, например я напрямую передал в printf? Или нужно сделать функцию с printf и в ней же в конце по указателю выполнять free? Я правильно понимаю что если был выполнен malloc, то дальше для высвобождения памяти используется только free, "само" ничего не будет?
>>831652 >Он про суффиксы у типов, наверное. Да, про них в большей степени, но и как бы ты говоришь что "так правильно", а он говорит "вариант кривой".
>>831644 >Где nodefaultlib (/Zl) у компилятора? Где выключенный инлайн (/Ob0 вроде)? И оптимизации временно выключи Сделал. >Вот<IntrinsicFunctions>true</IntrinsicFunctions> еще Выставил false. Ошибка та же самая.
>>831656 А, так у тебя два файла: main.cpp и pe_inject.cpp #pragma once влияет на тот файл, куда подключен хедер (т.е., хедер #include-ится не более одного раза). Твои два .cpp компилируются в два .obj, и из обоих торчат одинаковые функции. Линкер про препроцессор и #pragma once не знает вообще ничего. Сделай функции static (inline?), или вынеси в mylib.cpp, а в хедере оставь только декларации.
>>831655 Кривой вариант - это он про выделение памяти в функции. То есть, можно: char ✱item_data(const list_t ✱list) { char ✱buf = malloc (sizeof(char) ✱ 12); sprintf(buf, "%d", list->data); return buf; }
Второй вариант более гибкий, и позволяет, например, не дергать кучу по пустякам. А вот если ты не знаешь, какое максимальное количество данных item_data может вернуть, или это количество очень сильно варьируется, то можно использовать первый вариант с выделением памяти из кучи внутри функции item_data.
Опять я пришел со своими списками, подскажите, правильно ли я делаю? void remove_next_from_list(list_t item) { list_t tempList = item->next; //создаем промежуточное звено if (item->next) { //если есть следующий элемент item->next = item->next->next; //замещаем free(tempList); //старый удаляем
>>832388 Опять я пришел со своими списками, подскажите, правильно ли я делаю? void remove_next_from_list(list_t ✱item) { list_t ✱tempList = item->next; //создаем промежуточное звено if (item->next) { //если есть следующий элемент item->next = item->next->next; //замещаем free(tempList); //старый удаляем
>>832927 Во-первых, для сишечки тоже можно читать по твоей ссылке (stdio.h -> cstdio и т. п.). Во-вторых, есть всякие dash и zeal, хоть там и нет примеров.
>>833006 > у мелкопидоров как всегда Что, серьезно? Пидоры! Насколько я помню, их _snprintf отличается поведением! Это в какой версии так? Затести, пожалуйста, вот это: http://ideone.com/mmzxxF
>>833039 Этот путь явно описан в стандарте: негоже компилятору засорять своими именами стандартные хедеры. А вот с префиксом _ можно. И даже >>832987 гцц, если его попросить работать по стандарту, без GNU-говна, знает про это.
Нужно рекурсивно обойти каталоги и вызвать некоторую функцию для каждого файла. Можно ли сделать это без CRT при помощи функций сишкой библиотеки, или надо использовать только вин апи? Стоит ли для ускорения запускать обход в несколько потоков?
По-моему, многопоточность это какая-то хуита, если только каждый тред не выполняется отдельным ядром. Если это не так, треды будут просто отрабатываться по мере их выталкивания из системной очереди со скоростью работы однопоточного приложения.
>>833159 > без CRT при помощи функций сишкой библиотеки Поделил на ноль.
> многопоточность это какая-то хуита, если только каждый тред не выполняется отдельным ядром Один тред может ожидать IO. В это время другой может обрабатывать данные.
Как эта функция работает? Если возвращается BOOL, то как можно различать ненулевые значения? У меня сравнение с ERROR_NO_MORE_FILES вообще выдает ошибку "несовместимый тип".
Return value
If the function succeeds, the return value is nonzero and the lpFindFileData parameter contains information about the next file or directory found.
If the function fails, the return value is zero and the contents of lpFindFileData are indeterminate. To get extended error information, call the GetLastError function.
If the function fails because no more matching files can be found, the GetLastError function returns ERROR_NO_MORE_FILES.
>>833180 >Если возвращается BOOL, то как можно различать ненулевые значения? Ненужно различать, всё, что не ноль — истина. > У меня сравнение с ERROR_NO_MORE_FILES вообще выдает ошибку "несовместимый тип". Потому что ERROR_NO_MORE_FILES возвращает функция GetLastError()
>>833333 Ну вот смотри, у тебя есть примерно такой текст: http://ideone.com/jkT4kG, в нем текст отформатирован пробелами. Твоя задача - "сжать" его таким образом, чтобы он занимал меньше байтов, но выглядел точно так же. Т.е., второе слово в первой строке начинается в позиции 9 (считая с 1), и, если ширина одного символа табуляции = 8, то четыре пробела вторым словом можно заменить на один '\t'. И так далее. Ищешь табстопы, втыкаешь табы. Печатать надо сначала входной текст, а потом получившийся текст, чтобы убедиться, что они выглядят абсолютно идентично. Ну и счетчик сэкономленных байтиков заведи до кучи.
Нужно перечислить все имеющиеся в системе файлы при помощи win api и сделать некоторое преобразование файлов, у которых расширения принадлежат заданному списку. Обход дерева каталогов сделал. Какие файлы нельзя преобразовывать? Открытые и запущенные? Системные и скрытые? Как проверить, что никаких действий с файлом сделать нельзя? Как преобразовать не открытый и не запущенный файл, если какие-то его флаги не позволяют преобразование (кстати, какие?)?
Как можно эффективно проверить, что файл имеет расширение из списка, не итерируя по списку расширений? Пердолить на чистом си хэш-таблицу?
>>833529 >Как можно эффективно проверить, что файл имеет расширение из списка, не итерируя по списку расширений?
И еще вопрос. Мне нужно копировать текущий файл в файл с таким же именем, к которому добавлено расширение .tmp. Как это сделать эффективно?
Сначала я хотел поступить так: запоминаю указатель на нулевой завершающий байт и делаю lstrcat(file, ".tmp"), создаю файл с новым именем функцией CreateFile и копирую в него данные. После этого по указателю на нулевой байт присваиваю 0 и отсекаю расширение .tmp. Далее удаляю исходный файл и переименовываю новым.
Но потом я нагуглил CopyFile, которая требует два символьных пути к файлам. Так что трикс с запоминаем указателя на терминирующий нуль для экономии памяти стека тут бесполезен. Придется объявлять дополнительный массив для нового имени.
При обходе дерева каталогов переполнения стека из-за этого не будет? Как сделать эти операции эффективнее? В том числе хочу сократить время на работу со строками. Мне нужно OCHE БЫСТРО.
У меня есть хэш в виде 4-байтового числа. Как при помощи win api записать его в файл в виде последовательности из четырех байт? wsprintf с форматной строкой %c это ведь не то?
Аноны а почему в C нет for ( var n in array )? В плюсах вроде тоже нет, хотя там оно как раз еще больше нужно. Если хочу работать с целым массивом то удобно и можно так реализовать чтобы меньше циклов тратило.
В какой ОС вы работаете? Какая у вас графическая оболочка? В с++ треде много шиндовс-рабов, без понятия как там работать можно, композитный оконный менеджер, куча дерьма в автозагрузке, нет нормальной консоли, нет по людски сделаного софта, только хуйня с кнопкой 'сделать заебись', нет мануалов, нихера нет. Много кому и графическая оболочка то ненужна, только tmux, в GNU/Linux сейчас уже избавились от старого дисплей сервера - Xorg, заменили на Wayland display server protocol. Новые тайловые и композитные менеджеры теперь очень легкие, используется простой API, какая-нибудь графическая библиотека и ничего лишнего. Но смущает что на него не очень то быстро переходят, уже около 20 разных графических оболочек создано, но над многими работа идет весьма медлено. Вы тайлами пользуетесь или чем? Мне DWM нравился, но устарел, сейчас на Weston, надо на Velox перекатится.
>>834399 А что ты реверсишь? Надо бы nouveau до нормального состояния довести, чтобы OpenCL было, чтобы Vulcan, OpenGL 4.5 был. Блоб там гиганский, говнокода и легаси дохуище, если все лишнее убрать то опенсорцный драйвер будет быстрее чем в шиндовсе, ибо майкрсофт платит чтобы в GNU/Linux были плохие дрова
>>834333 >В какой ОС вы работаете? Oracle Linux. >Мне DWM нравился, но устарел Пользуюсь патченным dwm, tmux + vim/emacs, брат жив зависимость есть. Из реально графических приложений (тех, что нельзя запустить в консоли), что регулярно юзаю, это лиса, тандербёрд и zathura для чтения pdf.
>>834435 Ты посмотри на размер дров этих, обосратся можно, пруфоф нет, ибо не имею отношения к этим корпорациям, но это весьма очевидно что что-то не так, раз майкрсофт держит рынок даже после скачивания в говно, а в говно они скотились начиная с семерки.
>>834486 Тут не в новизне дело, иксы избыточны, устарели уже, новый протокол написан с нуля, заточен под разработку графических приложений в наши дни, ничего лишнего
>>834490 Размер нельзя, но можно сделать так: for (int i;arr;i++) { } Но вычисление количества элементов не должно быть реализовано на C, компиляторы на C++ пишутся, можно на асме что угодно реализовать чтобы дополнить синтаксис сишки.
>>834682 ну вот почему gcc лучше того же icc/msvc/clang-llvm? Я например не могу пользоваться компилятором, где очень много говна vim-emacs - сложно освоить, мне непонравилось, смылса в этом нет, особенно под виндой
>>834690 Он мне может обеспечить нормальный рефакторинг, автокомплит без лагов и провисаний с задержкой 3-5 секунд? А профилирование, юнит-тесты? А нормальная поддержка отладчика?
Все это недоступно виму. Поэтому я вставляю зонды в сраку, начинаю сосать хуй у господина, запуская свою любимую VS2015
лол, знавал одного старого петухана, он двумя указательными пальцами печатал, затем если надо копирнуть, жал лкм, выделял, нажимал пкм-выбирал копировать, тащил курсор в место вставки, нажимал пкм-вставить. наверное поэтому он был занудой и очень любил давать советы.
>>834690 > скорость работы возрастает После ESC:%!rm -f `which vim` и установки нормального текстового редактора скорость работы значительно возрастает.
>>834699 Двачаю бро, однако меня все-же разочаровывает пассивность некоторых программистов, они работают только за бабло, и даже для себя хуй что напишут, или не делают ПО общедоступным, или только бинарь предоставляют, многие делают свои велосипеды вместо того чтобы довести до ума уже готовый.
>>834687 Незнаю что ты там имел в виду под 'много говна' но GCC компилирует быстрее, производит более быстрый код. Одно мне не нравится - он почти стендалоне (но не на нормальной OS - Gentoo тут по умолчанию минимальный необходимый функционал, можно еще меньше сделать, ПО стает очень быстрым и легким)
>>834715 Ну хуй знает, Я вот зеро был в C, да и сейчас хелловордщик, однако читать код могу, могу править, а с нуля писать хз, Мне хоть бы на что нибудь посмотреть надо. Чтобы улучшать скилы надо читать много кода, особенно новичкам, без этого никак, благодаря FSF у всех есть такая возможность.
>>834718 Алсо начал читать ttytanks, по началу нихера не понимал что это, зачем? Но спустя некоторое время путем поправочек, чтения чтения, поправочек, и пулл-реквестов наверно 50-60% кода там мои, еще Я разбил его на большее количество файлов, стало проще ориентироватся, добавил скрипт для прекомпилежки (делает готовые бинари для разных процессоров, они не нуждаются ни в каких либах, будет работать и на BSD и на всяких LFS, роутерОС по идее, где нет библиотек)
>>834722 И грубо говоря это теперь другая совсем игра, раньше скрин обновлялся целиком, теперь по людски выводит изображение, но артефакты случаются, еще надо пофиксить ввод, ибо он там через wgetch реализован, что полный пиздос, надо напрямую клавиши слушать через evdev или libinput, чтобы скорость игры от терминала не зависела
GNU Debugger GDB полезен если программа не крашится, но ведет себя немножко странно? И как запустить скрипт или кусочек баш кода из Makefile? или может можно в мейкфайле цикл запустить?
(Автор этого поста был предупрежден.)
c = getchar(); while (c != EOF) { putchar(c); c = getchar(); } }
Запускаю. Пишу в консольку abc Нажимаю enter. Всё ок, выводят abc. Нажимаю ctrl-d, программа завершается, всё ок. Теперь запускаю и пишу abc, но enter не нажимаю. Вместо этого сразу нажимаю ctrl-d. Программа выводит на той же строчке abc. Если после этого второй раз нажать ctrl-d программа завершается. Почему первый ctrl-d не завершил программу?
>>834917 Моче не похуй, но она придерживается сдержанной позиции пока что - он ничего серьезного не натворил. Но если будет продолжать доебывать анона и срать в тредах, то запросто можно будет побанить его за говнопостинг.
сисечки, под винойе мэйкфайл неверно интерпретирует звездочки в правилах, как это забороть? з.ы. примера под рукой нет, но проблема известная и знающим понятна.
sh[] - спижженый шелл, который должен запускать calc.exe на вин XP. code[] - мой шеллкод, вот его сурс https://ideone.com/dbvsGu
Нихуя не работает. Когда управление передается моему шеллкоду, процессор доходит до вызова WinExec и улетает куда-то в ебени. Как надо писать шеллкоды под win7 и старше? На всех сайтах посоны заверяют, что под win xp работает заебись.
>>835550 И если этим шеллом заражать бинарники, то тоже программа при выполнении падает. Потом правлю точку входа на оригинальную , обнуляю байты шеллкода, и зараженная программа продолжает работать как раньше.
Заражаю code cave в секции кода, т.е. DEP тут вообще никак не должен помешать.
>>835542 > почему мой кодес выполняется с ошибкой? Потому что плохо читал гайды, читай лучше. 1) Если в XP ShellExec и лежала в каком-то из билдов по 0x7C8629FD, это нихуя не значит, что она и в 7 будет там лежать. Можешь сходить отладчиком и посмотреть, что там лежит. Это что касается кода sh. Что же касается кода в sh, там ты вообще вызываешь функции по адресам 0x00000020 и 0x00000026 - подозреваю, что рипнул из объектника, а про существование поправок (fixups, relocations) не знаешь. 2) Посмотри, как посоны делали поиск KERNEL32, парсинг таблицы экспортов, чтобы узнать адреса LoadLibrary/GetProcAddress, хэши имен API, вот это все. 3) У нас теперь ASLR, всё стало сложнее.
>>835557 >подозреваю, что рипнул из объектника, а про существование поправок (fixups, relocations) не знаешь Да, из объектника. Где про это все читать? >GetProcAddress Окай, можно вычислить адрес заранее для разных операционок, а можно вычислять при заражении и патчить адрес в шеллкоде, пометив его как-нибудь типа 0xDEADBEEF.
а вообще, представляю. сидишь такой читаешь хакирин из 90х, и ткой щас я попробую, а нихуя не работает, и чёт приуныл(. или другой вариант, компилишь код, а он падает, потому что поинтер кастуется в int.
>>835635 я всё никак не допишу мультитредовый malloc с выгрузкой из памяти на хард, когда не нужно - вот этот момент ещё не до конца додумал, но общая концепция есть.
но лень, я вообще нихуя не делаю, просто бухаю и всё.
как назвать место, где хранится адресация памяти, его разметка, и свободные части и занятые? я не умею в английский.
>>836419 да как-то заебало, не может системный менеджер всё понять правильней, чем единичное приложение, которое точней может предугадать когда что понадобится - в идее. а может оно, системное распределение, работает галимовряд ли - я не знаю, но смотря на теже браузеры - они вообще не парятся, просто жрут ВСЁ. и никто не конструирует программ с параметром --ДОСТУПНАЯПАМЯТЬ - наверно в этом интерес. и да, я собираюсь это всё запускать на спектруме и сеге.
Антуаны-железячники и мимопроходящие, подскажите, может быть кто-то знает, как решить мою проблему. Есть один CRC32, реализованный в железе. Соответственно, доступа к алгоритму нет. Есть файл и хеш к нему. Как узнать алгоритм, чтобы рассчитать контрольную сумму для других файлов? Перебором полинома? Может быть, какие-то методики есть?
Аноняши, хоу стать экспертом использования GDB и устроится на работу, где мои звниня будут востребованы Есть ли годная литература по етому? Что вы сами читывали?
>>837218 Ну если не проверять строку на корректность, то искать третий по счету байт, у которого не установлен старший бит (т.е., банально цикл со счетчиком и маской 0x80).
Что читать:
- Классика от Отцов: http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/%7Eats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
- https://arhivach.org/thread/155908/
- https://arhivach.org/thread/173837/
- https://arhivach.org/thread/180461/
- https://arhivach.org/thread/182958/
- https://arhivach.org/thread/188294/
- https://arhivach.org/thread/193780/
Шапка: http://piratepad.net/bJ1SdmkZyu