Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годныму средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. Дрочим на --analyze. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека" (да, в студию в последнее время завезли stdint и stdbool, почти все новые фишки из C11, static_assert и даже юникод). C snprintf все до сих пор плохо. Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (в частности, потыкать threads.h и stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и неполной поддержкой C99. - Borl... ээээ...
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 (4th Edition)" (2014)
Jon Erickson "Hacking: The Art of Exploitation, 2nd Edition" (2008) Анон из предыдущего треда рекомендует например, в качестве примера применения Си на практике.
>>684023 Первый вариант лишь частично защищает от = вместо ==, а воспринимается намного хуже. И смысла в нем нет - сейчас на присваивание внутри условия ругается каждый первый компилятор. Второй вариант норм, но он не очень удобен, если вместо malloc вызов с большим количеством аргументов (привет, Windows API). Можно либо смириться с этим, либо писать так: p = malloc(sizeof(int)) if (!p) Этот вариант хорош еще и тем, что заодно с C99 позволяет определить p в месте использования и сразу же его инициализировать. Алсо, вместо sizeof для типа в malloc лучше использовать sizeof(∗p). Если в будущем ты поменяешь тип p, у тебя ничего не свалится от того, что ты забыл поправить malloc.
>>684129 >сейчас на присваивание внутри условия ругается каждый первый компилятор GCC не ругается. А что можно почитать о различных компиляторах для прокачки скилла реверсинга и оптимизации?
> для прокачки скилла реверсинга и оптимизации По реверсингу beginners.re и Криса Касперски по вкусу (про оптимизацию тоже немного будет). Ну и потом мануал к своему компилеру, наверное.
>>684302 Скобки - это неофициальная, но опять же поддерживающаяся большинством магия для тех, кто упорно хочет писать if (p = malloc(...)). Но суть не в скобках, суть в том, что писать константу слева от == незачем, потому что диагностика давно есть.
>>684634 argv это указатель просто. Если аргументом функции является массив, то он преобразуется в указатель на первый элемент. В сях вообще в принципе нельзя передать в функцию массив как таковой, только указатель на один из его элементов (ну или указатель на массив из n элементов, но это крайне редко используют).
>>684763 Ну так имя массива - это тоже указатель на ег нулевой элемент, только имя массива нельзя изменять. При компиляции адрес массива везде подставляется в виде адреса.
>>684634 > Ну так имя массива - это тоже указатель на ег нулевой элемент Нет. Имя массива - это массив с размерностью, сколько ты там указал и с типом, какой ты там указал. Но если ты используешь имя массива там, где по контексту ожидается указатель, Си для тебя делает из него указатель, причём это рекурсивный процесс, поэтому работает для массивов любой размерности кстати, если ожидается НЕ указатель, то Си НЕ выполняет преобразований, поэтому для int foo[3] выражение &foo получает указатель на int[3], а не на int. А с аргументами для функции по-другому: Си всегда делает из аргумента-массива указатель соответствующего типа, это одна из проблем языка, которая часто приводит к ошибкам например, в коде типа int foo(int args[3]) { memset(args, 0, sizeof(args)); ... }.
> При компиляции адрес массива везде подставляется При компиляции массив вообще может исчезнуть как кусок памяти и целиком перекочевать в инструкции. Не думай про компиляцию, думай про сам язык.
> указатель на массив из n элементов У тебя просто массив, который трансформируется в указатель на элемент. А >>684763 говорит про указатель на массив, это было бы int (∗s)[1].
>>684763 > В сях вообще в принципе нельзя передать в функцию массив как таковой Вообще то можно, достаточно массив обернуть структурой и благопочтенная Сишечка будет его туда-сюда гонять при вызове функции.
Расскажите по-хардкору, нужно ли в функциях, работающих с деревьями, которые принимают указатель на корень, делать копию этого корня, чтобы с его помощью обойти дерево?
То есть, например, функция вставки: void insert(node *root, int value). Пидорасы в книгах пишут, что внутри функции обязательно надо делать копию root в качестве итератора. Но я всегда обхожу дерево при помощи переданного указателя root, и дерево, однако, не портится.
Ведь аргумент root - это просто адрес корня в стеке. Сам корень находится где-то в другом месте, фукнция его не портит.
>>684888 Не нужно. Вот если ты дерево перебалансируешь при вставке, и поэтому у тебя insert(node ∗∗root, int value), тогда аккуратнее с дереференснутым root. А так, в сишечке все передается по значению, поэтому root - твоя локальная переменная, с которой ты можешь делать все, что хочешь, сохранять ее незачем.
>>684895 Для чего у тебя в сигнатуре указатель на указатель? На сайте с задачами система мне передает просто указатель на корень. Часто вижу, что деревья на си пишутся именно с указателями на указателями.
>>684896 Если ты дерево перебалансируешь, у тебя может смениться корень. Его надо вернуть тому, кто попросил сделать insert. Можно просто вернуть, а можно сразу записать туда, откуда взяли. Так же, как и с insert в linked list, например.
>>685169 Всё, понял. Бля, почему это нельзя было пофиксить в С11? Я просто не вижу никакого рационального объяснения, почему так массив передать можно, а как собственно массив нельзя.
>>685196 Потому что это не баг, а фича. >Я просто не вижу никакого рационального объяснения Потому что залупа. Семантически вся работа с массивами – работа с указателями.
>>685196 > почему это нельзя было пофиксить Совместимость же. Рациональные объяснения (буквально абзац) есть в https://www.bell-labs.com/usr/dmr/www/chist.html (раздел Critique). Тащемта, статья заслуживает прочтения целиком может, ее в шапку запихать?. Алсо, в C11 есть вот такой ебанутый синтаксис: int foo(int bar[static 16]) { ... } который помогает компилятору, но, к сожалению, все равно не "чинит" sizeof.
> почему так массив >>685169 передать можно > int foo(struct somestruct arg); Так ты передаешь структуру по значению. Это чаще всего не нужно и очень медленно (более медленно только структуры возвращать по значению). Если бы можно было передавать массив таким же образом, не совсем понятно было бы, по значению ли массив передавать или передавать неявно указатель на массив.
>>685379 А почему тебя только x86-64 интересует? Арм сейчас везде, куда же без него, да и с мипсами лично я часто встречаюсь. Алсо, иногда один и тот же код на x86 и ARM очень приятно параллельно реверсить. Поэтому не вижу причин пропускать что-то. Юзермодный асм простой ведь, пока это не какой-нибудь итаниум.
>>685430 148 C:\Documents and Settings\shiiiieeeet\My Documents\projects\kek\main.c [Warning] passing arg 3 of `CreateThread' from incompatible pointer type
>>685439 На всякий случай попробуй с такой как в документации (что-то типа DWORD WINAPI MyThreadFunction( LPVOID lpParam );), хотя твоя вроде тоже должна пролезть. Может проблема с тем что возвращаемый тип должен беззнаковым быть.
>>685473 Вася. У тебя один хер компилятор на рабочей машине будет, если я не ошибаюсь. Берешь и компилируешь. Микросхем дохуя и больше. Ну под одну архитектуру покодил, а потом ныть будешь, что в другой архитектуре другие ассемблерные инструкции? Притом, что ты на сишке пишешь, тебе вообще похуй на язык ассемблера, который нужно использовать для ебаной микросхемы. Так что оно один хуй тоже самое, что и под разные оси писать. Берешь документацию - пишешь. Компилируешь на локальной машине, а там на микросхему программатором заливаешь. Все, ептыть.
>>685458 Твоя функция __cdecl, а Windows хочет __stdcall как минимум. Не используй касты бездумно, определи функцию верного типа, сигнатуру тебе >>685457 написал, а внутри уже касти LPVOID в нужный тебе в LPCSTR. Или, как вариант, у тебя после создания треда у тебя протухает этот твой lpszPath (ты не дожидаешься, пока тред стартанет, ведь правда?).
>>685473 Окей. Возьми любой дешёвый роутер (длинк, асус). Как думаешь, что за проц внутри? Ну или симуляторы/эмуляторы ищи в интернетах. Банально тот же QEMU умеет в мипсы.
>>685476 Убедил. Просто я до этого писал свои говноподелия на чистом асм чаще, чем на сишке, поэтому сразу же подумал, как я буду писать на асме, если даже запустить программу не смогу.
>>685482 >на чистом асм чаще Ой не пизди мне только. Чистый асм - это блядь ОПкодами писать. Другое дело, когда ты в масме или фасме макросредой пользуешься и т.д. Я сам на масме всегда пишу, потому и спрашиваю тупые вопросы про то, как блядь указатель на функцию передать, так бы легко просто в eax засунул адрес функции запустил бы все без всякой хуйни. Просто мне было лень рекурсивный поиск файлов реализовывать на масме, я и начал на сишке пейсать.
>>685508 1) Sleep не гарантия, а путь к сложноуловимым багом, это ты знаешь? Не жадничай, выдели памяти под строку и выдай треду указатель. Потом пусть или сам тред указатель память освободит, или ты освободишь, когда все закончится. 2) При отсутствии бита ты должен пропускать CreateThread, а ты что делаешь? 3) Угадай, что происходит, когда while отработает? А происходит выход из main, и винда делает что? Правильно, ExitProcess. Определи массив хэндлов для максимального количества параллельных тредов (или сразу 26 лол) и сделай WaitForMultipleObjects, чтобы дождаться тредов.
Код почти не читал. Может быть, там еще где-то проблемы.
Я хочу написать структуру данных, который было бы все равно, с каким типом работать. То есть мой двусвязный список или куча могли содержать разнородные данные. И второй вопрос, одинаковые данные, но принимать тип поля как аргумент при создании.
(Я не изобретаю шаблоны в плюсах?) Как это сделать?
>>685886 >То есть мой двусвязный список или куча могли содержать разнородные данные. То есть первый элемент содержит инты, второй элемент содержит массивы символов, так что ли? >одинаковые данные, но принимать тип поля как аргумент при создании. В смысле создавать произвольное количество элементов произвольного типа внутри какой-нибудь структуры?
>>685898 Ну он же сказал - шаблоны. Он хочет оптимальный типизированный контейнер. И нет, так на сишке сделать нельзя. Можно или пердолиться в C11 _Generic, или делать теги, юнионы и огромные свитчи, или запоминать размер элемента и пердолиться с указателями на void.
>>685898 Да, примерно так. Я хотел и типизированный контейнер, и "общий", ну, как списки в Петоне. >>685899 Правильно понимаю, что свитчи/юнионы/дженерик, это если у меня есть определенный набор типов, с которыми я бы хотел работать? А если хочу обобщенный алгоритм, только с void* и size_t?
>>685993 >А если хочу обобщенный алгоритм, только с void* и size_t? Обобщенного алгоритма не может существовать, потому что чтобы работать с какими-то данными, тебе нужно знать, что это за данные. В любом динамическом языке программирования всегда есть набор built-in типов, по сути это как раз то, по чему идут свитчи. Потенциальная бесконечность типов данных там делается за счет того, что есть какой-то йоба-тип навроде словаря, на базе которого можно многое сделать. Но общее число типов все равно ограничено. >И почему в няшной нет шаблонов? Есть, но они тебе не помогут, это чисто для компайл-тайма.
>>685993 >И почему в няшной нет шаблонов? Потому что этот язык старше твоей мамаши. За шаблонами gcc заменяешь на g++ и пишешь на сишечке с шаблонами и строгой типизацией.
>>686016 Ну это ты зря. Плюсы тоже немолодой язык во времена, когда Страуструп писал этот свой "глубокомысленный комментарий + 2", в плюсах тоже никаких шаблонов не было.
>>688867 Эту статью обоссали все, кто мог. Самое простое, что можно с ней сделать, чтобы не пришлось долго и мучительно разбираться, что там правильно и что нет - не читать ее вообще.
Сейчас работаю скриптомакакой в одной конторе. Параллельно учу джаву чтобы наняться программистом в другое место. Сегодня имел разговор с главным программстом который сказал что мне нужно учить си. Если освою его то в связки с джавой буду нарасхват. Он вообще по делу говорил? Параллельное знание двух этих языков вообще кому нибудь нужно?
>>689057 Что там не так? Нормальный совет про коды возврата, также я не знал про почти всегда равную скорость calloc и malloc, и про padding в структурах (впрочем, нахуй надо занулять пед-байты, я так и не понял)
Анон я не тролль и вероятнее всего не пидарас но у меня довольно странный вопрос: В юности учил С как язык программирования просто что бы знать. Сейчас знаю C# и соответственно понимаю С на уровне общих конструкций и каких то остаточных воспоминаний. Зачем сейчас используют С? какая польза от него может быть в реальном мире. Стоит ли переучиваться на него? Чем я смогу заниматься? какие перед-мной откроются горизонты?
>>689307 > Что там не так? Хуй знает, я помню только свою попоболь, когда читал это. Там в первых строках есть ссылка на how-to-c-response с более адекватным мнением.
> нахуй надо занулять пед-байты Я бы тебе запилил кулстори, но рассказывать не умею. Суть в том, что структурку ты можешь сохранить в файл, а паддинг может достигать 4 байт, и паддингов может быть несколько, и в эти несколько групп по 4 байта могут попасть интересные вещи со стека. А если ты послал такое по сети, то могут утечь адреса и нивелировать ASLR в ОС. Много чего может случиться. На самом деле просто не стоит посылать структурки по сети, делая простой memcpy в массив байтов. Надо каждое поле отдельно писать - так и лишнее не утечет, и проблем с порядком байтов не будет.
>>689283 > Сейчас все компиляторы поддерживают C11 На десктопах и распространенных платформах актуальные версии компиляторов могут в C11. Но есть проблемы с либами (тот же пресловутый snprintf в студии). В ембеддед по обыкновению все плохо.
>>689271 >>689288 Ну JNI же. Все верно, в джаву периодически втыкаются нативные либы (когда ждава сама не может во что-то, или просто тупит), которые пишутся на няшной и на плюсах.
>>689442 > Что я делаю не так? Документацию не читаешь, сука.
ICMP Header Checksum. 16 bits. The 16-bit one's complement of the one's complement sum of the ICMP message, starting with the ICMP Type field. When the checksum is computed, the checksum field should first be cleared to 0. When the data packet is transmitted, the checksum is computed and inserted into this field. When the data packet is received, the checksum is again computed and verified against the checksum field. If the two checksums do not match then an error has occurred.
Писал в ньюфаг тред. Напишу и сюда. Что вообще сложного в кодинге? У меня есть 2 друга, оба программисты, один пишет сайты, другой как он мне сказал "Software Engineer, пишу на C++ в основном". Так вот я решил приобщиться, выбор пал на Си, прочитал пару книжке. И мне говорили пиздец как тяжело. Но код просто делает, то что я и только быстро, получается я просто записываю свои мысли в виде команд. Хули они орут что сложно? Последнее что я написал по просьбе моего друга это 1) Херня, которая ищет самый короткий путь в графе 2) Херня, которая складывает двумерные массивы Обе я сделал довольно быстро и просто, сначала написал на бумаге как я делал задачу, потом перенес в компилятор. Мой друг после того как я их решил взбугуртил и дал мне задание, цитирую "Алгоритм, который будет сжимать jpeg без потери качества, с коээфициентом минимум 2". Пока не знаю как делать, вообще даже куда двигаться, вообще почитать про алгоритмы Хаффмана и Шенона-Фано, но понятного мало. Подскажите по этой теме. Сам я занимаюсь математикой, программировал только в школе, ну и сейчас около 3 недель. Работаю в местной шараге, учу детей. Самому мне 26, взяли меня сразу, нехватка у них кадров.
>>689585 Jpeg работает так: картинка делится на блоки, к блокам применяется дискретное косинусное преобразование, далее низкие частоты забиваются нулями (поэтому это сжатие с потерями) и далее сжимается алгоритмом сжатия без потерь (про которые ты зачем-то решил читать, хотя это не так важно). Улучшить в 2 раза без потери качества можно, например, заменив ДКП на вейвлеты, получится алгоритм jpeg2000.
>>689585 >Что вообще сложного в кодинге? Планировать и писать что-то большое, например больше 10-100к строк (у всех разный уровень, когда все разваливаться начинает). А алгоритмы - хуйня, их просто в голове целиком держать.
The Strict Aliasing Situation is Pretty BadАноним16/03/16 Срд 14:44:42#101№689726
>>689630 >Математикам как правило хорошо дается программирование. По части алгоритмов, графов, деревьев и другого говна на стыке с математикой, они, конечно, может и прошаренней. Но сам код, как правило, они пишут просто ужасный, который впоследствии абсолютно невозможно сопровождать.
>>690013 >Но сам код, как правило, они пишут просто ужасный, который впоследствии абсолютно невозможно сопровождать Не пизди. Я математик, и код неплохой писал с 15 лет после прочтения книжки, которая прививает правильное именование переменных, методов, продумывание архитектуры. А когда на харкаче в первый раз прочитал, что математики говнокодят, то осилил книгу про чистый код.
Реквестирую в этот ИТТ тред говнокод математиков, который невозможно сопровождать.
>>690025 >Реквестирую в этот ИТТ тред говнокод математиков, который невозможно сопровождать. Давай ты сначала свой выложишь, может, он как раз подойдёт.
>>690013 >Но сам код, как правило, они пишут просто ужасный, Неистово двачаю! Ни разу не видел нормального кода от математиков. Одни названия переменных чего только стоят!
>>690025 >то осилил книгу про чистый код. Прочитать это одно дело. А вот используют на практике полученные знания, не многие. Мне кажется, что ты весьма высокого мнения о себе. То, что тебе кажется, что ты хороший программист, не значит что так оно и есть. Будь немножко по скромнее. Я понимаю, что каждому хочется чувствовать себя гением, но все же.
>>690197 >Мне кажется, что ты весьма высокого мнения о себе. То, что тебе кажется, что ты хороший программист, не значит что так оно и есть. Будь немножко по скромнее С чего ты это взял? Я вообще в последние годы испытываю мало эмоций, а программистом хорошим себя не считаю. О личностных качествах программиста при улучшении своих скиллов когда-то охуенно написал Зомби, лучше не скажешь.
>>690205 >С чего ты это взял? Отсюда: >Хорошим программистом я себя не считаю >Я математик, и код неплохой писал с 15 лет Это уже противоречии самому себе. И вообще ты не можешь судить о своем коде объективно. А здесь, ты просишь у людей предоставить доказательства по сути факта: >Реквестирую в этот ИТТ тред говнокод математиков Зачем начинать бессмысленный спор. Докажи людям, что ты хороший программист. Чтобы глядя на твой код говорили: "Оу! Посмотрите на этот замечательный код! А ведь он математик! А я всегда считал, что математики не могут писать нормальный код.... Как же я ошибался!". Поищи кстати исходники на фортране. Гарантирую, тебе доставит.
>Я вообще в последние годы испытываю мало эмоций К чему ты говоришь это? Думаешь, кого-нибудь здесь интересует твое психологическое состояние?
> О личностных качествах программиста при улучшении своих скиллов когда-то охуенно написал Зомби, лучше не скажешь. Не читал, но считаю что программист ничем не отличается от других людей и о нем как о человеке, лучше всего могут сказать окружающие люди.
>>690091 > добавили variable-length arrays > msvc их до сих пор не поддерживает Это зло, которое в C11 уже наполовину выпилили. И студия, если шланговый парсер выставить, как бы поддерживает только, судя по тому, что подчеркивает, как ошибку, она сама об этом не знает. А вот с их собственным парсером даже __STDC_NO_VLA__ не дефайнит, что, конечно, очень и очень печально.
>>690237 >Это зло, которое в C11 уже наполовину выпилили. Пруфани. Я просто не помню, чтобы в стандарте С11 было что-то об этом сказано. По крайней мере GCC с флагами -std=c99 и с -std=c11 собирает нормально все.
>>690252 > Пруфани Зло, потому что хуй знает, сколько его там, этого стека. А "наполовину выпилили" - я имел в виду, что VLA ввели в C99, а в С11 осознали и сделали уже опциональной фичей.
>>690265 ебать ты конченный, анон. Миллион байт стека для каждого треда. Ты просто, блять, представь, миллион байт! Понятное дело, что если ты олень и все пихаешь в стек, то и никакой памяти тебе не хватит, но для временных структур, например, для строк и около того - просто идеально.
>>689585 >2) Херня, которая складывает двумерные массивы А ты это тоже записывал на бумаге? А? Математик! >1) Херня, которая ищет самый короткий путь в графе Никогда не имел дела с графами, но думаю это тоже очень просто. Мне вспоминается алгоритм Дейкстры. >потом перенес в компилятор Надеюсь, ты просто не правильно выразился. >почитать про алгоритмы Хаффмана и Шенона-Фано, но понятного мало Постой. Ты же математик! Как тебе такое может быть слишком сложный. Я правда тоже не осилил (желания наверное не было), но я и не математик далеко. >программировал только в школе Тогда это все объясняет. Ты даже не сталкивался с программированием и не в курсе о многих технических моментах. Проблемы далеко не всегда в алгоритмах...
>>690336 >Никогда не имел дела с графами, но думаю это тоже очень просто. Мне вспоминается алгоритм Дейкстры. Если он сам вывел алгоритм без помощи литературы, это довольно круто, ящитаю. Другой вопрос, что к самому программированию это относится довольно косвенно.
>>690340 >Если он сам вывел алгоритм без помощи Ну да. Я согласен с этим. Я бы врятли быстро смог вывести алгоритм, при условии если раньше я не знал других алгоритмов. А вот по поводу косвенного отношения. Ну как сказать. Уметь в алгоритмы дорогого стоит, так как позволяет решать задачи гораздо быстрее и возможно более оптимальным путем.
>>690336 > А ты это тоже записывал на бумаге? А? Математик! Ну да, сложил пару матриц, посмотрел, записал как это делается подробно, а потом просто перепечатал в vs. > Никогда не имел дела с графами, но думаю это тоже очень просто. Мне вспоминается алгоритм Дейкстры. Прям такого заоблачно тяжелого ничего нет. > Постой. Ты же математик! Как тебе такое может быть слишком сложный. Я правда тоже не осилил (желания наверное не было), но я и не математик далеко. Само кодирование простое. Даже пару слов закодировал чтобы понять суть, я имел ввиду непонятно как jpeg сжимать. > Тогда это все объясняет. Ты даже не сталкивался с программированием и не в курсе о многих технических моментах. Проблемы далеко не всегда в алгоритмах... Ну память надо контролировать, ну что еще? Ну те аспекты, которые я знаю не такие уж и тяжелые. >>690340 > Если он сам вывел алгоритм без помощи литературы Сидел на парах, пока эти решали задачки я написал его. Сложного прям такого, мало если честно.
>>690346 >Уметь в алгоритмы дорогого стоит Я не спорю, но как часто среднестатистическому программисту приходиться корпеть над созданием какого-нибудь хитровыебанного алгоритма. Как правило, это единичные случаи. Ну или это может требоваться только в какой-нибудь узкоспециализированной области.
>>690353 >Сидел на парах, пока эти решали задачки я написал его. Сложного прям такого, мало если честно. И к какому алгоритму ты пришёл? К алгоритму Дейкстры? Или Джонсона? На каких типах графов работает твой алгоритм? Только на неориентированном? Учитывает ли веса?
>>690359 >list.reverse() Если ты считаешь, что задача по переворачиванию связного списка относится к хитровыебанным алгоритмам, то у меня для тебя плохие новости. Решение такого рода задач достаточно прозрачно в отличие от поиска наикратчайшего пути в графе. По крайней мере, для меня.
>>690364 >Если ты считаешь, что задача по переворачиванию связного списка относится к хитровыебанным алгоритмам, Я как раз к тому, что многие "программисты" даже этого не знают. Что уж говорить о работе с графами или еще чем-либо.
>>690412 > Мне даже кажется, что я уже видел его, но забыл. Мне тоже так кажется. Вероятность того, чтобы точь в точь совпало в том случае, когда сам создаёшь алгоритм без посторонней литературы, крайне мала.
>>690320 > для временных структур, например, для строк и около того Тогда ты либо не ограничиваешь максимальный размер VLA, и привет, неотлавливаемый ни в рантайме stack overflow (или, того хуже, его отсутствие - см. примеры ниже). Либо у тебя есть некий лимит (например, ты знаешь, что максимальная длина этой строки не превысит MAX_PATH, или ты считаешь, что больше тысячи структур тебе не понадобится), тогда ты сразу делаешь массив нужного константного размера и не ебешь себе мозг спорными технологиями. Вот три примера, отличаются константой. Веселой отладки, так сказать расчитано на сборку без оптимизации - мне было лень, но ты можешь обосновать для оптимизатора использование array и memset, и попробовать собрать с оптимизациями. http://ideone.com/kXaCQyhttp://ideone.com/926nPbhttp://ideone.com/KuR1B8
> Миллион байт стека для каждого треда Зависит от архитектуры, зависит от ОС, зависит от настроек ОС, зависит от способа создания треда, если он не основной.
>>690779 Лол! А они точно с математикой были знакомы или они просто говорили так? Просто любой, хоть немного соображающий человек поймет, что сравнивать их нельзя и программирование лишь инструмент для реализации задачи/алгоритма.
>>690739 Блять, долбоеб, пиздуй отседова нахуй, на кресты, на джаву, но только не няшную. Ты пиздец долбоеб, ты хочешь создать на стеке массив с ебанутыми размерами и интовыми элементами, сука, блять, дай я тебе ебало обоссу, какой же ты мудааааак, сука, это еще компиль молодец, долбоеба такого терпит, уххх сук не могу, долбоеб блять. >зависит от способа создания треда Что ты за хуйню несешь, малохольный блять? Понятное дело, что размер стека зависит от многих факторов Ой иди на хуй, сука блять.
>>690739 > Веселой отладки, так сказать Черт ебаный, ты хоть раз Сишечку отлаживал, блять, сука? Это проще, чем твою мамашу пялить, сука, в отличие от ебущих крестов с их ебучим бустом, это просто сказка, блять, иди на хуй опять сука. >ты знаешь, что максимальная длина этой строки не превысит MAX_PATH Блять, как рекурсивно обойти дерево каталогов при этом не пердолясь с маллоком? Сука, иди опять на хуй.
Для маленьких примеров, самое то, набрал и запустил, шустрая как удар серпом по яйцам, только для винды. Есть бесплатная урезанная версия, и генератор ключей для полной версии на рутрекере.
>>691354 Vim+GCC+[GDB]. Для любых проектов, самое то, набрал и запустил, шустрый как удар серпом по яйцам, кроссплатформенный, только на винде в виде MinGW. Есть бесплатная полнофункциональная версия с открытым исходным кодом.
>>691354 Как я понял, это IDE без собственного компилятора, которая, к тому же, 6 лет не обновлялась. А у нас в шапке именно компиляторы студия и Pelles C там потому, что у Microsoft на тот момент актуального компилера отдельно не было, а Pelles C автор не хочет распространять по частям. Не нравится, и хочешь запилить список IDE - вперед, ссылка в последней строке шапки.
>>691442 > goto Ну на самом деле, break с цифрами неудобный, а вот от именованных циклов я бы не отказался. Но так-то да, goto хватает, но у некоторых СТРАХИ.
>>690874 >Черт ебаный, ты хоть раз Сишечку отлаживал, блять, сука? Это проще, чем твою мамашу пялить, сука, в отличие от ебущих крестов с их ебучим бустом, это просто сказка, блять, иди на хуй опять сука. ты тупое говно промышленный код на крестах ЛЕГЧЕ отлаживать чем аналогичный на сишки почему? да потому что любая си-прога, решающая реальные задачи обмазана макросами и с вырубленой типизацией в добавок, половина говна там будет сделана на void* в крестах же будут шаблоны, а шаблонизированный код хотя бы будет сожран отладчиком без дополнительных приседаний
>>691978 >промышленный код на крестах ЛЕГЧЕ отлаживать чем аналогичный на сишки Лол. То-то в крестотреде анон жалуется, что у них компилятор падает от имен функций по 10к символов.
>>691987 >Отладка происходит в райнтайме Чтобы в рантайме что-то отладить надо это скомпилировать сначала, так ведь. А потом попытаться разобраться, как шаблоны разворачиваются.
>>692000 >Падал от бага 10к символов токен - уже диагноз. Даже если бы не падало. >буст-александерску-степанов-даун Сейчас такая шаблонная магия - обыденный код на крестах. Подключи эйген какой-нибудь, и посмотри на ошибки в шаблонах на пять экранов. А потом посмотри на экзешник на 20 мегабайт.
>>692009 >Подключи эйген какой-нибудь, и посмотри на ошибки в шаблонах на пять экранов. А потом посмотри на экзешник на 20 мегабайт. А потом подключи GSL и заплачь от убогости происходящего.
>>692009 >Даже если бы не падало. Баг – это диагноз, даже если его бы не было. Сам-то понял, что написал? >>692013 Наверно потому, что это унаследовано от старшего брата-байтослесаря?
>>692014 Брат-байтослесарь не ходит блядовать на право и на лево. Поэтому его легко отследить. А вот младшенький постоянно уходит куда-нибудь а при разговоре меняет тему. Хуй поймешь чего он хочет в общем. >>692018 Почему еще никто не сказал, почему подобные серьезные вещи, которые лежат в основе всего, крайне редко пишут не на Си?
Если язык- оружее, то Си- это ебаная анимешная катана, разрезающая танк пополам. Не очень удобно. Кресты- катана с примотанным скотчем гранотометом. И калашниковым. И штык-нож на всякий случай.
>>692021 >которые лежат в основе всего, крайне редко пишут не на Си? Все основные библиотеки, на которых держатся ОС и веб - сишные. На крестах - только клиентское говно вроде текучих гюлчных браузеров с дырявым флешом.
>>692021 Потому что это переносимый ассемблер, под который везде есть компиляторы (и их легче писать/дополнять), abi можно потянуть хоть из пуревасика, средств для запутывания кода упоротыми даунами вроде авторов буста (что отлично в основном для опенсорса).
>>692024 >Си- это ебаная анимешная катана, разрезающая танк пополам. >Не очень удобно. >Кресты- катана с примотанным скотчем гранотометом. И калашниковым. И штык-нож на всякий случай. Тебе будет удобно бить катаной, если на ней множество не нужных для ближнего боя вещей? Также центр тяжести будет не в порядке, да и скотч не надежен.
>На крестах - только клиентское говно вроде текучих гюлчных браузеров с дырявым флешом. А браузеры используют смесь языков. GUI на GTK к примеру и у хрома и у лисы.
>>692040 > флеш частично написан на си О, мы помним тонны говна от пользователей флеша. Тупорылые разработчики флеша не прочитали, что memcpy нельзя использовать на перекрывающихся диапазонах. До поры-до времени всё работало, а потом в libc поменяли реализацию memcpy и оно стало портить память при неправильном использовании.
Самое что меня тогда шокировало — что 95% ругали разработчиков libc, мол вот они какие говнюки, ради говнофлеша не могут запилить "работающий" memcpy обратно.
>>692127 >Самое что меня тогда шокировало — что 95% ругали разработчиков libc, мол вот они какие говнюки, ради говнофлеша не могут запилить "работающий" memcpy обратно. О да, в прошлых тредах как-то эта тема проскакивала. Вроде там даже пришлось какой-то воркэраунд приделывать.
>>692532 Ну это-то понятно (неправильный library path или еще по каким-то причинам -lmsvcrt и -lmingwex не указываются автоматически или отсутствует). Непонятно, почему fput. В mingw вроде таких макросов не было никогда.
Да вы ебанулись. GCC нормально видит и без пердолинга все это дело. Он либо проебал stdio.h либо пиздит. Насколько я помню, в devcpp, не было вообще никаких проблем ни с чем.
Есть комплюхтер A, он пытается соединиться с приложением на 0.0.0.0, я хочу, чтобы моя программа слушала всё на этом адресе и чтобы наружу ничего не протекало. Какая библиотека?
>>693154 А знаешь, какая тут мораль? Собирать надо обязательно с -Wall -Wextra и прочими -W по вкусу. Тогда бы тебе сказали про implicit function declaration, и не пришлось бы столько выяснять, откуда взялся fput.
>>693540 >foo.c:5:10: error: expansion of date or time macro is not reproducible [-Werror,-Wdate-time] > puts(__DATE__);
Нахуй. Пока когтеед жив, пока шланг вместе с гцц следуют его глупому предложению, никаких -Weverything рядом с -Werror. У него возникнет очередная ебанутая идея, а билд сломается у меня. Нахуй. Да, это батхерт.
Ананасы, прочитал на досуге книжку "TDD for embedded c" загорелся идеей вставлять тесты везде где можно. Обмазался Unity, разобрался, как его прикрутить к проекту. Но вот что дальше - в душе не ебу. Есть ли где примеры или туториалы, где показано, как можно сишный быдлокод покрывать тестами. Не обязательно с Unity, можно любой другой фреймворк.
>>693649 >Есть ли где примеры или туториалы, где показано, как можно сишный быдлокод покрывать тестами. Если он с глобальными переменными, то не надо его уже покрывать тестами, это бесполезно уже, подробности на fprog.ru
Аноны, вопрос: У меня есть символьная строка (с буквами) Мне надо вывести определенный элемент массива printf("%d\n", line[5]) Программа вывод не саму букву, а её код. Если писать %s, то завершает работу Как сделать так, что бы именно саму букву выводил? мимоличинус
>>683573 (OP) Ребят, извиняюсь за оффтоп. Подскажите, Сишка и ARM сейчас в тренде? В какой стране легче всего работу найти, просто в моей белорашке нихуя нет. Вот и остановился я на распутье, изучать дальше арм или перекатывать.
>>683573 (OP) Пацаны, есть сборочка GCC образца 2002 года заточенная под компиляюцию для GBA (приставка такая) ARM. Как заставить его жрать пробелы в путях? Под винду, конечно. inb4: сделай бочку, сосни хуйца, убери пробелы Я делаю так: gcc "C:\Vasya Pupkin\gba\main.c" -c -O3 -mthumb -mthumb-interwork Компилятор ругается: gcc: No file: C:\Vasya gcc: No file: Pupkin\gba\main.c Без пробелов все собирается, потом линкуется отдельной софтиной и запускается. С пробелами вылазит это говно. Как я понимаю, оно воспринимает путь с пробелом как два отдельных файла, даже в кавычках? Можно это как-то обойти?
>>695169 > С пробелами вылазит это говно. А запускаешь напрямую команду из консоли, или IDE запускает? Или батник какой-нибудь? Никаких start перед gcc? У виндовой консоли крайне ебанутые правила парсинга кавычек. Если не удастся разобраться, кто неправильно парсит кавычки, можно и обойти - например, сделать симлинк на проблемную папку или вообще ее примонтировать как новый том, или просто использовать относительные пути (запускать компиляцию с текущей папкой C:\Vasya Pupkin\gba командой gcc main.c ...). Можешь еще https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/ посмотреть, вдруг найдешь решение там.
>>695189 > А запускаешь напрямую команду из консоли, или IDE запускает? Или батник какой-нибудь? Никаких start перед gcc? Батник, вот так: for /r %file% i in (*) do ( echo Compiling "i"… gcc "%%i" -c -O3 -mthumb -mthumb-interwork )
> например, сделать симлинк на проблемную папку Лол, я так и сделал, но хочется нормального решения, а не костылей.
>>695213 >>695215 Ну и да, чтобы не было лишних вопросов: %file% — местоположение папки с сорцами, gcc прописывается в PATH в начале батника, то же самое и с CPATH.
>>695215 Напиши однострочник с GetCommandLine (и заодно с итерацией по argv), посмотри, что получается. У меня вот получается вроде норм разбивается, в argv[1] попадает имя файла с пробелами - проблема в гцц? Возможно, gcc.exe парсит правильно, а в cc1.exe уходит уже не то? Возьми Process Explorer от SysInternals, посмотри опять же. Если найдешь причину ошибки, можно или откопать исходники старые и поправить, или просто даже бинарник пропатчить.
>>695272 Блин, я же писал уже, что это костыль. Я спокойно и симлинкнуть могу, и в другую папку конпелятор и сорцы перенести — но хочется именно разобраться в настройке, а не идти на уступки.
>>695290 >>695273 >>695272 >>695242 Лол, разобрался. Надо было в батнике длинное имя преобразовать в короткую версию формата 8.3. Какие-нибудь подводные камни есть?
>>695710 Научите линковать. Допустим, есть два файла, main.c и foo.c: main.c: void foo(); // Вместо хедера void main() { foo(); return 0; } foo.c void foo() { / какая-то магия / } Вот скомпилировал их в два отдельных .о с помощью GCC. А как дальше линковать? Так? gcc -o final.elf foo.o main.o Или так? gcc -o final.elf main.o foo.o Можно как-то сделать так, чтобы было насрать на порядок компиляции?
>>696066 В тех линкерах, которые умеют в скрипты, в том числе и в ld, скрипты лежат в файлах. В более узко специализированных линкерах, типа MS-ового link.exe алгоритмы работы захардкожены.
>>696227 Посмотри выше по тредику про массивы. Ты объявляешь указатель на анонимный массив (const) char. Чтобы объявить именно массив, делай так: static const char str[] = "Blablabla"; - так sizeof будет работать, как ты ожидаешь. static тут затем, чтобы массив попал в сегмент данных, а не создавался каждый раз при входе в функцию, а const, чтобы не было неожиданностей.
>>699203 А что тут пояснять? Всё очевидно же. В scanf нельзя указать размер буфера, что позволяет этот самый буфер переполнить используем fgets, парсим руками. В check_authentification размер буфера еще меньше, чем в main, но при этом используется strcpy, которой тоже нельзя указать максимальный размер тут чуть сложнее, потому что очевидный выбор новичка - strncpy - внезапно тоже сломана, что позволяет переполнить буфер и возможно затереть auth_flag. Ну и мелочи всякие еще, типа паролей открытым текстом в коде, при наличии которых даже переполнять ничего не нужно храним соленые хэши, притом в конфиге, потому что хардкод тоже зло, хотя за Кэрролла лойс.
>>699289 Выделять их как сам считаешь нужным через alloca(). >>699290 >Мемсру Как же ахуенно читается на русском, прям вся суть функции. >>699306 memset и scanf конечно же, из любимых языковых конструкций - void*.
>>699290 > что использовать Аккуратно напиши свою. Большинство проектов так и делает. Так поступают еще и потому, что многие программы под линуксами имеют дело с UTF-8, а в UTF-8 важно не обрезать строку посередине символа.
>>699289 > Как заставить GCC размещать Но зачем? Язык Си и стек никак не связаны. Но вообще, при сборке без оптимизаций порядок более-менее соблюдается.
>>701966 Жесть, чувак, даже не пытайся, или, хотя бы почитай про асм. Во первый компиль вставит эту вставку и даже не подумает с ней что-либо делать, ибо считает, что если ты юзаешь вставку, значит ты знаешь, что делаешь, а во вторых ты просто вероломным образом начинаешь использовать регистры, которые до этой вставки компилятор мог как-либо использовать, при этом ты не восстанавливаешь те значения, которые там были. Короче на данном этапе компилятор сам сможет лучше тебя оптимизировать заполнение массива, так что либо учи асм, либо забей болт на вставки.
>>701977 Никаких регистров из тех, которые он использует, в студии сохранять не нужно, компилятор достаточно умен.
>>701966 Вообще-то, ты ошибся тредом, у нас здесь няшная сишечка, а не плюсы. Но в виде исключения - пикрелейтед тебе нужно было сделать lea, ибо masm, все дела.
Как мне заменить нечетные разряды на 0, а четные инвертировать? есть код,но он не совсем работает mov ax, a mov res1, ax and ax, 01010101b xor ax, 10101010b
>>702399 > вместо дрочева с высчитыванием индекса stosd требует использования именно edi, а эффективный адрес в таком виде может использовать любые регистры. Да, stosd мог бы быть чуть-чуть побыстрее из-за отсутствия зависимости от ecx, но какая нахуй оптимизация, когда это явно учебный пример?
>>702341 Не читал статью, но насколько я знаю, компилятор просто смотрит, что используется и перед ассемблерной вставкой сохраняет это в стек (или даже не сохраняет, если в регистре было просто закэшировано что-то). GCC позволяет делать то же самое, просто ему, в отличие от студийного компилятора, нужно сказать, что ты изменил специально, а что попортил по ходу дела.
>>702638 >Да, stosd мог бы быть чуть-чуть побыстрее из-за отсутствия зависимости от ecx Ты че, поехавший? Из-за отсутствия зависимости от еcх? У тебя адрес вычисляется через сложение и умножения регистров, в то время, как конкретно для stosd регистр edi всего лишь увеличивается\уменьшается на 4.
>>702750 > У тебя адрес вычисляется через сложение и умножения регистров Ты не поверишь, но процессор умеет считать эффективные адреса очень эээ... эффективно. Это одна инструкция, и выполняется она не дольше stosd. Но она точно быстрее, чем stosd с установленным DF. Такие дела. Про зависимости, переименование регистров и прочие нюансы тебе, видимо, просто еще рано знать.
>>705142 Спасибо, просто я тот ебанутый, который делает игру под GBA. Если не следить за памятью, то те 256Кб оперативной памяти засрутся очень быстро.
Читаю K&R и перестал понимать задачки в книге примерно с 1.12 упражнения. Когда я открываю готовое решение, смотрю на него, я понимаю как это было легко и охуеваю с себя как это я не додумался. Хотя нет, вру, в 1.19 уже плохо понимаю смотря на решение. Что делать с подобным кроме как уйти в похапе/из профессии? Помогите, пожалуйста, няши.
Итак. Решил я тут поковырять GTK. Что-то мне здается что знатно набыдлокодил. Не могли бы заценить данный код и сказать, что я делаю не так? В частности интересует ввод пользователя и передача аргументов через сигналы. Я правильно понимаю, что через gpointer data при отправки сигналов, можно передать любые данные? https://ideone.com/q7Gpvt
>>705447 Ну как обычно с айтишными книжками: не читай дальше, пока не поймешь, что у тебя не осталось вопросов. Пробуй, пиши код, разбирайся. Если лень или не интересно - тогда из профессии.
>>705458 > Я правильно понимаю, что через gpointer data при отправки сигналов, можно передать любые данные? Ну не через глобальные переменные же передавать. Все правильно, стандартный паттерн - при регистрации колбеков запоминать "пользовательский" указатель на что-нибудь.
>>705142 >>705087 Я сейчас еще прочитал свой пост и заметил, что при объявлении u8 buffer = … после u8 потерялась звёздочка, это указатель. Всё равно нормально очистит?
>>705483 Да все правильно. А звездочки макаба режет. Самое худшее, что ты можешь сделать, так это не освободить память вообще или освободить память которою ты не выделял. И да. Желательно освобождать сразу же, как выделенная память больше не нужна.
>>705463 А вот еще хотел спросить. Если мне нужно обеспечить ввод при нажатии на Enter и при нажатии на кнопку. Правильным ли будет, просто эмитить сигнал с ответом при нажатии на Enter для диалогового окна? Или есть другие способы?
>>705494 Короче, есть конвертор, который берет изображение формата .pcx и забивает его в .o как массив с произвольным названием типа u8. Потом происходит компиляция исходного кода и он линкуется с уже имеющимися файлами ресурсов. Когда мамин программист хочет нарисовать эту самую картинку на экране GBA, он подключает эту переменную через extern и дает указатель этой функции: http://pastebin.com/FRQuWfbj Вроде же всё правильно, ничего лишнего не освобождается? Просто я не нашел нормальных дебагеров под GBA, вот и приходится задавать тупые вопросы и гадать на кофейной гуще.
>>706080 Там такая фича видеопамяти GBA, что туда нельзя писать char-ами, только short и int, а картинка-то как-раз таки и закодирована в char (а в 16-цветовом случае вообще использует по 4 бита на пиксель, лол). Это рождает просто ебанную кучу проблем, например, если хочешь нарисовать один пиксель — выравнивай указатель по ячейке, читай соседний пиксель, скрещивай его с идентификатором цвета и только после этого записывай назад уже два пикселя, как раз u16 и выходит. По этой же причине я и не осилил RLE прямиком в память — а что если оно будет залезать на соседний пиксель? А вообще, архитектура, мягко говоря, интересная. Может, в 2001 это было нормально, но сейчас меня подобные вещи пугают.
>>707608 Если тебя не смущает, что это undefined behavior, то кастится так же, как и все остальное: uint8_t bytes[] = { 0xeb, 0xfe }; // Infinite loop (x86). void (∗funcptr)(void) = (void (∗)(void)) bytes; funcptr(); // Или заодно с вызовом ((void (∗)(void)) bytes)(); Работать не будет, потому что bytes надо положить в регион памяти, который помечен исполняемым. Современные процессоры, NX-бит, все дела. И повторяю: это UB.
>>707765 > Выходит лучше указатели на данные и функции хранить отдельно? Я сгустил краски. По стандарту у тебя либо object pointer, либо function pointer, и использование одного через другое не портабельно (потому что существуют всякие AVR, где такое сделать не позволяет архитектура процессора). Но там, где архитектура позволяет, возможность выполнять данные, как код и/или использовать код, как данные часто существует в виде расширения стандарта (J.5.7), и не приводит к неожиданностям (если выполняются всякие платформо-зависимые обряды вроде сбросов кэшей и пометки памяти, как исполняемой).
Поэтому если ты пишешь конкретно для STM32, тебя эти проблемы не касаются. А зачем тебе кастить данные к указателю на функцию, кстати? Ты генерируешь код в рантайме или просто экспериментируешь?
>>707829 Круто знать первоисточники. Пытаюсь улучшить алгоритм вывода на экран LCD1602 менюшки и действия её пунктов. Понял уже что такое приведение типов будет лишнее, проще хранить разные указатели в разных типах массивов.
>>708701 1) Ты когда однобайтовый хвост читаешь, читаешь лишнее. Представь, что я выделил страницу памяти и скормил твоей функции один последний байт этой страницы - ты сегфолтнешься. 2) После if не делаешь else для двухбайтового варианта. 3) Читаешь целые в little endian, но не свопаешь байты перед инверсией битов.
>>708947 Хорошо, понял, спасибо. А можно пример кода на >нажатие/отпускание/удерживание клавиши на клавиатуре ? Под линукс. Просто для общего образования. Мне кажется, это должно быть очень просто, что-то типа while(true){scanf("%c", &key); ...}
>>706111 Ура, я нашел эмулятор GBA со встроенным дебагером! Теперь писать код стало куда проще, можно хотя бы удостовериться, как и куда ты записываешь спрайты (а не просто высчитывать в уме) и всё такое. Была маленькая утечка памяти (если так можно назвать неправильную адресацию тайлов) — с помощью утилиты я её устранил. На пике мой понг, который я успел написать за это время. Ведь превозмогать с древней архитектурой и еще более древним Си — это так охуенно!
Торкнуло меня попробовать системное программирование в линуксе. Книга как с оппика есть, и всё. До этого был опыт на сишке в винапи. Сейчас в поисках толковой ide под сишку, и остановился на таком выборе - Atom.io и Visual Studio Code. Вроде оба имеют пакеты с поддержкой с/с++, в студии вроде билд можно намутить через таск менежер, а как в атоме я не понял, может анон знает? вот только я не имею ни малейшего понятия, что там тру а что нет, какую ide юзать и какому стайлгуайду следовать. Так же хз, как писать системное в линупсе в принципе. Анон, выручай!
>>709025 Используй vim/emacs/другой_текстовый_редактор. Makefile-ы и прочее надо учиться писать ручками. Если всё-таки жить не можешь без ёба-ide но оно тебе все-равно не нужно, то лучшим выбором будет Qt Creator.
B раз уж ты полез в юниксы, то начинай читать Advanced Programming in the Unix Environment 3rd edition.
Не увидел в шапке, так что кину сюда. Думаю, часть анонов уже видела. http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/main.htm По сути, копипаст одной части годного учебника по плюсам от Шилдта. Мне зашло больше, чем K&R, так как разжевано кое-что подробнее, и также больше, чем учебник Праты, так как не так сильно глубоко.
>>683573 (OP) >>708993 >>705087 У меня появился еще один вопрос: Как забить константу в определенный участок памяти, а не в конец .text? Смотрите, я нашел в дебаггере адрес, где лежит название моей будущей игры (используется в NDS для отображения в главном меню). Так как эта штука находиться после 0x08000000 — значит, оно лежит на ROMe, и, соответственно, неизменно в рантайме. Так вот, как изменить эту штуку на этапе компиляции, без редактирования готового .gba файла каким-нибудь HEX-редактором? Я пробовал так: const char pie_name __attribute__ ((section (".romname"))) = "ZenPong"; А потом делал такой скрипт для линкера: SECTIONS { _flag_start = 0x80000A0; .romname _flag_start : { KEEP((.romname)) ; } } Но, вполне ожидаемо, что оно просто взяло и нагло перекрыло уже существующую секцию .text. Так вот, как это исправить, и, наконец, занести эту долбанную константу по нужному адресу?
>>710272 Хуй знает, это специфика архитектуры, надо разбираться, но разве до 0x08000a0 не лежит еще что-то подобное околосистемное? Заголовок какой-нибудь там. Укажи в линк-скрипте, что у тебя есть секция, допустим, 0x100 байтов с подобным говном, и эту секцию надо смержить с .text, причем поместить ее в начало .text.
>>710311 > 0x100 байтов с подобным говном, и эту секцию надо смержить с .text, причем поместить ее в начало .text Ну так как это сделать и спрашиваю — можно пример скрипта? Всё что после 0x08000000 — это память картриджа (может быть до 32Мб), до 0x80000A0 лежит какой-то заголовок GBA игры, после него — остальная память картриджа.
>>689585 >Что вообще сложного в кодинге? Сложно писать программы таким образом, чтобы потом внося в них изменения, эти изменения были локализованы как можно в меньшем количестве мест.
>>710316 Да, уже увидел пик с сообщением об ошибке и посмотрел скрипт, которым это собирается. Хуй знает. Если .text не будет по 0x08000000, сломается бутстрап в crt0.o, а патчить секции через ld я не умею. Я бы отредактировал сам crt0.S просто или написал бы патчилку ромов после линковки уже.
>>710666 Ахда, и у тебя >>710272 тут, судя по размерам секции и недоеденным вакабой кускам кода - указатель, а надо по ...A0 не указатель положить, а сам массив char. Т.е., const char pie_name[] = "";
>>710670 Двачую. Строковые литералы размещаются в секции рид-онли, плюс все секции выравниваются по размеру страницы, поэтому компиль и перетирает твою попытку захуярить секцию по такому кривому адресу.
Долго думал, куда сунуться с вопросами архитектуры, но решил что всё же сюда, т.к. пишу на сях. Ситуация - есть набор данных, хранящихся в линкованом хэш-массиве. Отдельная единица данных уложена в структуру. Размер массива варьируется от несколько тысяч до нескольких миллионов. Как обычно, в процессе разработки возникла потребность для некоторых единиц хранить дополнительные данные, размер которых может сильно варьироваться, и содержание - тоже. Как это по-нормальному делается обычно, чтобы и память лишнюю не жрать, и скорость обработки не пострадала? Понятно, что раздувать исходную структуру не вариант, данные с дополнительной информацией составляют меньше процента от общего числа. Я пока сделал это вводом инта с размером дополнительных данных в байтах и указателя с адресом их расположения.
У меня охуительный вопрос появился. Предположим, нужно в программе какое-нибудь число. Пусть, например int x = 10. С точки зрения памяти, что будет, если мы в коде уберём переменную x и подставим везде само число 10? Мы сэкономим 2 байта?
Вроде сделал умножение чисел произвольной длины, но компилятор выдаёт какую-то жесть, там все 5 умножений на месте и они почему-то знаковые. Я хуй знает, вроде правильно работает, и вроде инструкция умножения сразу в два регистра кладёт результат, так нахуя он повторяет 5 умножений?
>>714568 У тебя там ембеддед что ли? Твой подход норм. Даже если у тебя будет миллион элементов, дополнительные расходы от двух полей в структуре составят 8/16 мб и особой погоды не сделают. Если все равно хочешь память сэкономить (за счет CPU и шины), можешь изъебываться с офсетами (в элементе хранится офсет в заранее выделенный пул, а размер данных ты вычисляешь в рантайме на основании офсета следующего элемента в связанном списке, или, если он последний - следующего bucket-а). Или, если у тебя элементы массива - указатели, а не сразу структуры, сделай структурку вида: struct Item { struct Item ptr next; int hashcode; int data_length; char data[]; }; и при выделении элемента выделяй сразу sizeof(Item) + data_length. Выделится одним куском, не нужно будет хранить лишний указатель.
>>714797 Оставь оптимизации компилятору, особенно если не уверен. Будет ли выигрыш от твоего подхода, зависит от многих вещей. Например, от архитектуры (как будет кодироваться непосредственное значение 10 в инструкции, которая его использует), от выражения, в котором используется твое число, от наличия и типа указателей в функции (можешь про алиасинг почитать, но это весьма хитрая тема), от уровня оптимизации, от ключей компилятору, от самого компилятора.
А стандартные типы не тащат, мне не хочется писать _t, а ещё я хочу писать не только на c99 и выше. Поэтому сам на определял себе. Хотя конечно есть мнего проблем, например до c99 нет числовых типов что-бы вмещали адреса, только дико мытные size_t и ptrdiff_t - которые тоже хуй пойми где определены.
>>715054 Вопщем, сам дизасми. Студия со всеми апдейтами, Clang/C2 парсер шланговый, кодогенератор C2 майкрософтовый. rghost.ru/7KdXkMRsc А чего ты добиться-то хочешь? Я так и не понял из оригинального поста. Оно умножает не так, или компилируется неоптимально? Код не читал, если что.
>>715073 Вроде не оптимально компилируется, по идее это должно идти в одно умножение. Но рас нет, значит допускается какое-то поведение, и возможно там ошибка, или хуй знает.
>>714855 Нет, не эмбеддед, но с памятью всё равно приходится обращаться с осторожностью, ибо в долгосрочных планах количество данных может перевалить через миллиард, и тогда счёт пойдёт на гигабайты. И дополнительные данные хранятся не в общем массиве, а в отдельной области, так как сам массив уложен выровненными чанками, оптимизированными для кэша. Короче, я в итоге выкинул инт с размером, оставил только указатель, а размер храню первым элементом дополнительной области. Всё получилось быстро и компактно, я доволен.
ОПИШИТЕ ПО БУКВАМ! Как начать кодить на этом СИ? Поставил я такой netBeans, а он такой - у вас нету компилятора! А я такой - поставлю кланг тогда. А он такой - у вас нету MAKE. Сука! Сделать не может. МАке нету. И я такой говно этот Си непонятный, вернусь на JS Ну или объясните как ХЭЛЛОУ ВОРЛД НАПИСАТЬ!?
>>717422 Если у тебя винда, к шлангу тебе понадобится поставить еще MinGW GCC (многие хедеры, либы у них общие), там и make есть, как часть MSYS. А можешь просто взять Pelles C или Visual Studio, у них свои IDE, и все необходимое сразу есть в комплекте. Разве что, у студии комплект весит десяток гигабайт, а у Pelles C - десятки мегабайт.
А что вообще можно на С написать? Допустим, на перле или путоне я могу сделать парсер веб-страниц, скрипты автоматизации и даже оконные приложения. Что можно на чистом С сделать, кроме консольных утилит x + y? Зачем он нужен вообще, кроме как для написания контроллеров для железа?
>>717731 GUI-приложения под winapi писать на С как два пальца обоссать на самом деле, в визуальном конструкторе или редакторе в ресурс-файле накидываешь типовые контроллы в контейнере DIALOGEX, задаешь им текст, стили и прочее, далее во время исполнения лепишь свои диалоги куда тебе надо - например на созданное главное окно, можно переключать их видимость вкладками например, меняешь их свойства и обрабатываешь юзер инпут с помощью стандартных виндовых оконных месседжей, можно очень просто назначать собственную отрисовку контролов, тогда можно делать гламурненькие кнопочки, чекбоксы и прочее прочее. Это на первый взгляд кажется, что гиморно и громоздко, на самом деле через некоторое время у тебя появится куча всяких стандартных шаблонов и оберток для вызова громоздкокого winapi. Не в курсе, но уверен, чтопод какое-нибудь GTK(он же вроде на С емнип) всё так же.
>>717890 гуй не нужен. консоли будет достаточно, а то знаю я эту вашу графику. сегодня ты напишешь вызов, заделаешь удобства, очереди отрисовки, анимации, 3д, шейдеры - в итоге всё время тратишь на свой самый лучший в мире движок. далее выкладываешь его для всеобщего пользования и УПС, внезапно оказывается, что таких-же долбаёбов как ты уже за миллион переваливает, и твоё поделие нахуй никому не нужно, а время потрачено, а ведъ можно было посмотреть трилогию порно пиратов, но уже на работу...
>>717753 >>717745 >>717890 Спасибо, понятно. А что есть для работы с графикой? Собрался игоры пилить Допустим, я хочу сделать так, чтобы в некоем окошке 6 квадратиков ездили друг за другом по часовой стрелке. Java и прочее не подходит, т.к. при увеличении числа квадратиков (до 600, например) всё начинает безбожно лагать. Логичный вывод - сделать это на С. Только хз как
>>718224 OpenGL, как ещё блядь. Если у тебя лагает такая хуйня – у тебя либо безнадёжно устаревшая пека, либо ты пиздец криворукий. В обоих случаях сишка будет полумерой, тем более если ты её не знаешь.
>>718224 Во времена второго квейка ещё был софтварный рендер. Где каждый пиксель на сишечках. Сейчас конечно опенгл надо использовать везде где можно, особенно если квадратиков много.
>>718226 Ок, расскажи мне, как сделать эффект, аналогичный снарядам в тохо? Делал через Python на Pygame и Pyglet - лагает, делал на Java в Candroid engine - лагает. Комп 6 ядер, 8 гигов озу
>>718254 Норм, но еще лучше паралельно учить ассемблер, сразу станет понятно откуда в сишных конструкциях ноги растут. Я сначала удивлялся почему одногруппники не вдупляют простые и понятные концепции вроде адресной арифметики, указателей и пр. а они тупо не шарили во что компилируется их код. Не будь таким.
>>718339 Ну и что это тебе дало? Вот пишу я printf("Bla bla"); нафиг мне знать, что атм происходит? Я знаю, что у меня выводится в консоль строка. Это всё, что мне надо. Зачем мне дезасемблировать её?
>>718224 > при увеличении числа квадратиков (до 600 Такую хуйню и сишка не вывезет в риалтайме, твоим способом. Большие количества "квадратиков" реализуют с помощью частиц (particle system). Про тохо точно не знаю, но с большой долей вероятности там не обрабатывается каждый снаряд как отдельная сущность. А задается закон по которому они живут (функция от времени). Каждый залп это одна функция с помощью которой ренедерятся сотни снарядов, и проверяется попадание в игрока с помощью простой подстановки (координат игрока) в функцию.
>>718382 Так мы застряли в прошлом — вон, один уже совсем поехал и пишет под Геймбой, там вообще 4Мгц и 256Кб оперативы. А ты тут такие вопросы задаешь.
>>718388 Т.е. это не так работает? -Делаем класс Пуля, из него генератором делаем 200 объектов и задаём в функции им путь и время, чтобы были промежутки.
Алсо спасибо, доброанон. А как ты до этого додумался? Что это функция и т.п. Это ведь не какое-то знание конкретного ЯП. Алгоритмы? что почитать на эту тему?
чёт пишу функцию деления произвольных чисел - всё блять просто, вроде, но столько писать, пиздец, не удивительно что несколько лет назад я дропнул это писать на ассемблере. Хотя, есть ощущение, что на асме это было бы приятней писать, и меньше...
Заебали, напишите за меня, просчитайте комбинации, десятитысячные факториалы, соберите в группы...
Ну почему так всегда, есть идея и есть реальность - скалы, где даже вместо разбиения об оных, ты изучаешь каждый писюньчик этого момента.
Потому что это сложно морально, просто брать и пользоваться уже написанным до тебя.
>>718418 а я пользуюсь рамой как массивом бит - посчитал сколько мне надо и охуел от перспектив, так что высчитываю в рантайме сколько нужно бит на кодирование элемента массива...
>>718419 > Делаем класс Пуля, из него генератором делаем 200 объектов Так и работает. Тормоза у кото-то там выше не из-за подхода к хранению и генерации частиц, а из-за способа отрисовки.
Не по теме,но arduino язык C подобный .Так вот вопрос.Я новичок ,пытаюсь с помощью Serial число и записать в переменную (мы ввели 1234 в массив и присвоили val =i[0].Но у нас переменная будет равна 49,а не 1 из за того,что мы считываем код символа из ascii .Как записать туда 1,не делая костыли с if(i[0] == 48){ i[0] = 1; } )Спасибо.
>>718686 Кстати еще одна проблема Serial.readBytes[i,4]//считываем массив по байтам int c=(i[0]-'0')*6000//если ввести 1234,то выдаст 6000-правильно.Но если умножить на 60000 то выдаст -5536.
>>718712 Потому что int там 16-битный, в знаковом int может храниться -32768 ... 0 ... 32767, вот он у тебя и переполняется. Юзай long (long int), и желательно unsigned, если не предполагается хранить отрицательные числа.
Подскажите очередной тупой вопрос: как засунуть файл в stdin? Есть куча готового кода, который читающий данные через getchar(), переписывать всё на fgetc() не вариант.
Алсо, есть ли способ узнать текущую позицию курсора в этом самом stdin?
>>718793 > for или do while делает i-1 к примеру раз в 1 миллисекунду С чего бы вдруг? Нет, гораздо чаще, зависит от процессора и конкретного скомпилированного кода. У тебя частота процессора гигагерцами меряется, причем несколько инструкций могут выполняться параллельно.
>>718795 Используй аналог sleep() в твоей ОС или виси в пустом цикле, пока разница между начальным time() и текущим не будет равна 60 секундам (но имей в виду, что такой подход бесцельно нагружает процессор). Пустой цикл в твоем варианте не имеет сайд-эффектов, поэтому оптимизатор вправе его выкинуть нахуй.
>>718745 freopen() сделали специально для тебя. Не забудь заодно описание setvbuf() глянуть.
>>717731 >Зачем он нужен вообще, кроме как для написания контроллеров для железа? Блядь, откуда вы только лезете. На Си, наверно, половина софта написана. А остальная половина на крестах.
Хочу перейти от консолеговна к окноперделкам. Какую IDE лучше накатить, чтобы создавать окошки и модные выпадающие менюшки без гомоебли? И чтобы было достаточно уроков, да.
>>719733 Тут уже спрашивали >>694860. Искать нужно, но в общем-то есть.
>>719743 Любую. Если шинда и Windows API, то Visual Studio или Pelles C. Но вообще, если тебе нужен обычный стандартный GUI, то проще написать его на C# или Qt, а на сишечке писать либу или консольное приложение, к которым GUI будет обращаться.
Есть одна лаба. В ней используются phtread и mutex https://ideone.com/NaFOvO С большего написал, но ведет она себя странно, в какойто момент, судя по всему, входит в дедлок.
Дебажить нечем, пишу в блокноте и компилирую/запускаю на удаленном сервере. Был бы благодарен за намеки где я проебался.
>>719855 Задача, на всякий случай, такая: есть много тредов, они соревнуются за ресурс PID(их меньше чем тредов), держат его немного и отдают назад. У меня получается что треды берут все PID, благополучно отдают их назад, но новые треды их уже взять не могут.
>>719855 Проверка S (там где ты ждешь) происходит до лока мютекса, возможна ситуация что в треде будет проведена успешная проверка S, после чего он стопнется операционной системой, S будет уменьшена, и тред продолжит выполнение дальше с S равным нулю без всяких проверок, на что у тебя там UB как я понимаю - ты дойдешь до конца функции не сделав return.
Анон, а посоветуй каких-нибудь не очень объемных опенсорс проектов на няшной, чтобы можно код посмотреть и вникнуть, как оно делается. Есть тут кстати люди, контрибутящие в попенсоц? Расскажите, как вкатывались, и вообще.
>>719886 Но ведь S это типа семафор, который фактически он там нихуя не делает(изза наличия мютекса). Проверка по S разрешает обратится к мютексу, не более. А уменьшение S возможно только после отмыкания мютекса. Я исхожу из слеюующего: Когда ктото хочет mutex_lock а он закрыт, то этот ктото попадает в очередь и крутится там переодически пытаясь этот мютекс открыть еще раз. Это верно?
>>720295 Типа как семафор, да, только семафоры потокобезопасные (доступ к счетчику) а твое S нет. Ситуация. Ресурсы полностью заняты. S равно нулю. Несколько свободных тредов крутятся в цикле. Освобождается один из ресурсов. В массиве одно из значений записывается на ноль, S становится равным одному. Тред А увидев что S больше нуля выходит из цикла и тут его стопает система и запускает тред В. Тред В видит что S больше нуля, выходит из цикла, проходит по массиву ресурсов находит ноль и записывает туда единицу, уменьшает S до нуля. Просыпается тред А, проходит по массиву, так как там нет нуля (все ресурсы уже заняты) то функция просто завершается без нормального ретурна - тоесть возвращается какая-то хуита. Я не знаю что у тебя там за проблема, может такое поведение никак на корректность программы даже и не влияет. Но такая твоя реализация не потокобезопасна. В семафорах регулируется доступ к счетчику - тебе нужно или захватывать мьютекс перед чтением S, или делать атомарную операцию с проверкой и одновременные декрементом S. Если еще и массив атомарно модифицировать то мьютекс совсем не нужен.
>>720305 ОК, с этим согласен. Вот, вообще убрал оттуда S(остался как счетчик для дебага) https://ideone.com/gyhVuB Добавил ретурн, чтобы видеть ошибку Похоже что так и есть как ты говоришь, они попадают в цикл поиска свободных мест в странном порядке. Но ведь это место защищено мютексом блеять! Может это быть изза того, что система мульитпроцессорная?
Кто-нибудь вообще сталкивался на практике с поведением atoi, описанном в справочниках, когда при невозможности конвертации возвращает не 0, а ведёт себя "непредсказуемо"?
>>720340 Будет ждать. >>720335 >место защищено мютексом блеять! Защищено. Треды получают ресурс строго по очереди. Пока один ищет, остальные ждут. Проблема в том что твой счетчик, из-за того что он сам по себе непотокобезопасный в некоторых случаях (там наверное всего две-три инструкции во время которых нельзя останавливать поток на всю программу) пропускает больше тредов чем есть ресурса. Кстати из-за чего и происходит дедлок, только заметил - поток освобождает мьютекс только после того как получит ресурс. Тоесть когда счетчик пропускает лишний поток, он не может найти ресурс (так как все заняты) и следовательно неотпускает мьютекс и никто больше не может получать ресурсы.
>>719855 Начем с того, что ты - пиздоглазое мудило!
У тебя функции allocate_pid мьютекс захватывается всегда, а освобождается только тогда, когда удалось выделить PID.
И это только пол беды, еще там же в случае, если не удалось выделить PID, у тебя не только не освобождается мьютекс, но и не возвращается никакого значения !!!
А раз мьютекс не освобождается, то дэдлок - вопрос времени.
Чтобы это заметить отладка не нужна, совсем.
Желаю тебе всю твою никчемную жизнь наслаждаться UB по полной программе!
1. Заведи в начале функции переменную, в которую будешь писать возвращаемое значение (ret), инициируй ее отрицательным значением (типа ошибка по дефолту).
2. В цикле вместо освобождения мьютеска и выхода из функции сделай присвоение ret = next_pid+PID_MIN; а потом break;
3. После окончания цикла сделай pthread_mutex_unlock(&mutex); а потом return ret;
А нафига там S я так и не понял, оно только при печати используется?
>>721115 https://ideone.com/KuTw1F вот как оно выглядит сейчас То что ты рассказываешь я не понимаю. Задача: 1)тред обращается в allocate_PID 2)если мест нет, он идет нахуй т.е. сразу получает -1, а не отправляется в мютекс ждать очереди 3)у меня это сделано на 65 строчке, но очевидно неправильно же
>>721207 Ни в чем. В Си нет никакого cascased if, потому что нет elseif/elif/elsif и т. д. "Выражение" else if - это просто традиционный способ форматирования вложенного if внутри ветки else, чтобы избежать вложенных уровней табуляции. Два варианта по ссылке одинаковы (особенно, если по-другому расставить скобочки), но первый вариант более читаемый, поэтому им и пользуются: http://ideone.com/gTHQUo
>>721221 нет, так вроде бы не лучше. Ведь тред должно было выгнать сразу как стало понятно, что нет ПИД. А так он будет жить в мютексе и только потом поймет что его наебали. В моем варианте хочть шанс был, что его сразу нахуй пошлют.
>>721315 Там все равно нет гарантии, что ресурс реально есть до захвата мьютекса.
Но если ты думаешь, что с проверкой S перед захватом мьютекса будет быстрее, тогда, добавь if (S<=0) { return -1; } перед захватом мьютекса, как это было в твоем варианте.
>>721301 комбинирование if, switch, условного оператора ?: даешь мощь боятся использовать goto но зачастую эти трюки программеры не знают и почему то не умеют по быстрому лабать высокоуровневые конструкции типа таблиц переходов или машины состояний
>>722338 Я так понял, ему надо массив типа ((int[]) { 1, 0, 0, 1 }) обратно в один int собрать. Собственно, там OR аккумулятора с очередным элементом массива, сдвинутым на i бит влево, только и всего.
>>722217 Можно и в десятичную. Реализовываешь сложение и с песней начинаешь складывать степени двойки. Ну или можно нечестным способом, табличками, как советует этот >>722207. А вообще, если хочется ебли битов, лучше какой-нибудь HDL учить, там от этого хоть польза есть.
как происходят вычисления в си? т.е. я объявляю переменную беззнаковый лонг АА пишу AA = ((BB5.06)/1024)3.05 как будет вычислять программа? после каждой операции выкидывать все, что после запятой или сначала все высчитает с десятыми долями, и потом уже в финале отбросит нецелое?
>>722928 В конце. При вычислении выражения все аргументы приводятся к одному самому широкому типу (из присутствующих в выражении) и вычисляется. Потом то что получилось приводится к типу результата. При чем, если я не ошибаюсь, не уверен, "широта" типа определяется максимальным выразимым числом - тоесть беззнаковый тип считается более "широким" чем знаковый того же размера.
Аноны, у меня горит. Прошу помощи, ибо сам полный нуб в оси, а времени нет. Так уж вышло, что надо перенести лабу на Линукс. Нахуя - не знаю, но надо. Ок. Запускаем в виртуалке Бубунту. Копипастим рабочий код, любовно высранный и отлаженный. На Винде gcc, на Линуксе тоже. Ок. make all.
И что? А вот хуй тебе, сука! 1.main.c:8:1: error: expected identifier or ‘(’ before ‘/’ token //keychecker Это же комментарий, хули ему не нравится вообще? И так перед каждым. 2.main.c: In function ‘main’: main.c:105:56: error: ‘a’ undeclared (first use in this function) printf("\nSide A: %d side B: %d Side C: %d\n", a, b, c); Прям первым делом объявляем эти переменные в программе же, сразу после хэдеров: static int a=0, b=0, c=0, p, tr=0; 3. main.c:115:9: warning: implicit declaration of function ‘getch’ [-Wimplicit-function-declaration] in=getch(); ^ Шито? Где мой getch?,, 4. main.c:117:13: error: ‘tr’ undeclared (first use in this function) if (tr==0 && (in=='2' || in=='3' || in=='4' || in=='5')) ^ Пилять, в самом начале объявили как глобальную, ВТФ? 5. main.c:122:17: warning: implicit declaration of function ‘get’ [-Wimplicit-function-declaration] case '1': get(); break; Самописная функция, в том же файле. Я нихуя не понимаю. 6. main.c:132:1: warning: control reaches end of non-void function [-Wreturn-type] } ^ ???
На Винде всё отлично работает, а тут даже не компилится.
Посоны, втф? Как же св. Кросплатформенность и прочее?
>>723066 >Jon Erickson "Hacking: The Art of Exploitation, 2nd Edition" (2008) Это можно выпилить, так как это не совсем Си. Да и вредоносная для ума рядового читателя, так как не дает теоретической базы, а скорее является чем-то вроде How-To.
>>723227 Ну ты с этим аккуратнее, а то сейчас прибежит коллбэк-даун которому тут посоветовали начинать с этой книги, и сорвёт покровы с очередной нихуя не логичной абстракции (коллбэка).
>>723223 getchar()-то на месте. >>723213 У тебя всё косоёбит conio.h, и, возможно, различия в символах перевода строки если один и тот же файл компилишь.
>>723357 Почитай стандарт, придурок. Твоего getch'а там нет. VS не следует нормально С стандарту. А под твою сперму, никто подстраиваться не будет. Зато getch есть в Ncurses.
>>723357 >А как же хуйня с объявлением переменных/функций? Ебаные винда, все работает через жопу. Заебала MS свои несовместимые стандарты клепать. >>723462 >2016 >\r\n А я думал любой уважающий себя редактор автоматом подстраиваться под это.
>>723479 Да. Бугурт. Почему в нормальных системах все заводится с полпинка, а в Windows все через жопу сделано и не совместимо ни с чем? >>723524 >Нахуй иди. Мне не нужен ни древний стандарт, ни прыщи, мне надо закрыть лабу. >Мне не нуженстандарт, Скорее спермоблядь-неосилятор портит жизнь белым людям.
>>723262 И что? Лучше вместо этой книжки почитать интеловский мануал по процессорам, мануал по башу, мануал по перлу, K&R и Прата и что-нибудь по системщине (Роберт Лав допустим) и по ИБ. Куда полезнее будет.
>>723558 >Почему в нормальных системах все заводится с полпинка, а в Windows все через жопу сделано и не совместимо ни с чем? Да совместимо там со всем. У меня собирается и в винде, и в линуксе.
>>723561 >Да совместимо там со всем. У меня собирается и в винде, и в линуксе. Более-менее нормальную поддержку С11 там вроде только недавно завезли. VS годится только для крестов и шарпа с бейсиком, но не для няшной. Плюс у них собственное WinAPI. Впрочем, WinAPI дело такое. Принципы то схожи, только другими словами. Также проблема \r\n. >Но лабодауну подавай какое-то непонятное getch(). В универах до сих пор используют древние стандарты. Я в универе вместо крестов учил Си с классами и на VS 6.0.
Что читать:
- Классика от Отцов: 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: оче годно, батя рекомендует. Дрочим на --analyze.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека" (да, в студию в последнее время завезли stdint и stdbool, почти все новые фишки из C11, static_assert и даже юникод). C snprintf все до сих пор плохо. Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (в частности, потыкать threads.h и stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99.
- Borl... ээээ...
Что еще почитать:
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 (4th Edition)" (2014)
Jon Erickson "Hacking: The Art of Exploitation, 2nd Edition" (2008)
Анон из предыдущего треда рекомендует например, в качестве примера применения Си на практике.
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
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
Шапка: http://piratepad.net/bJ1SdmkZyu