Это копия, сохраненная 12 мая 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Что читать:
- Классика от Отцов: 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/~ats/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
Первый вариант лишь частично защищает от = вместо ==, а воспринимается намного хуже. И смысла в нем нет - сейчас на присваивание внутри условия ругается каждый первый компилятор.
Второй вариант норм, но он не очень удобен, если вместо malloc вызов с большим количеством аргументов (привет, Windows API). Можно либо смириться с этим, либо писать так:
p = malloc(sizeof(int))
if (!p)
Этот вариант хорош еще и тем, что заодно с C99 позволяет определить p в месте использования и сразу же его инициализировать.
Алсо, вместо sizeof для типа в malloc лучше использовать sizeof(∗p). Если в будущем ты поменяешь тип p, у тебя ничего не свалится от того, что ты забыл поправить malloc.
>сейчас на присваивание внутри условия ругается каждый первый компилятор
GCC не ругается. А что можно почитать о различных компиляторах для прокачки скилла реверсинга и оптимизации?
> GCC не ругается
-Wall же http://ideone.com/WHCLLp
> для прокачки скилла реверсинга и оптимизации
По реверсингу beginners.re и Криса Касперски по вкусу (про оптимизацию тоже немного будет). Ну и потом мануал к своему компилеру, наверное.
Скобки - это неофициальная, но опять же поддерживающаяся большинством магия для тех, кто упорно хочет писать if (p = malloc(...)). Но суть не в скобках, суть в том, что писать константу слева от == незачем, потому что диагностика давно есть.
>int main(int argc, char *argv[])
Почему к массиву указателей argv может применяться инкремент argv++? Ведь именам массивов нельзя присваивать новые значения, их нельзя изменять.
Пример кода:
>while((p = #argv++ != NULL)
Здесь сначала указателю p присваивается разыменованный argv, а затем argv увеличивается на единицу.
argv это указатель просто. Если аргументом функции является массив, то он преобразуется в указатель на первый элемент. В сях вообще в принципе нельзя передать в функцию массив как таковой, только указатель на один из его элементов (ну или указатель на массив из n элементов, но это крайне редко используют).
Ну так имя массива - это тоже указатель на ег нулевой элемент, только имя массива нельзя изменять. При компиляции адрес массива везде подставляется в виде адреса.
> Ну так имя массива - это тоже указатель на ег нулевой элемент
Нет. Имя массива - это массив с размерностью, сколько ты там указал и с типом, какой ты там указал. Но если ты используешь имя массива там, где по контексту ожидается указатель, Си для тебя делает из него указатель, причём это рекурсивный процесс, поэтому работает для массивов любой размерности кстати, если ожидается НЕ указатель, то Си НЕ выполняет преобразований, поэтому для int foo[3] выражение &foo получает указатель на int[3], а не на int. А с аргументами для функции по-другому: Си всегда делает из аргумента-массива указатель соответствующего типа, это одна из проблем языка, которая часто приводит к ошибкам например, в коде типа int foo(int args[3]) { memset(args, 0, sizeof(args)); ... }.
> При компиляции адрес массива везде подставляется
При компиляции массив вообще может исчезнуть как кусок памяти и целиком перекочевать в инструкции. Не думай про компиляцию, думай про сам язык.
>указатель на массив из n элементов
вроде он трансформируется в обычный указатель
http://ideone.com/RZq2UX
> указатель на массив из n элементов
У тебя просто массив, который трансформируется в указатель на элемент. А >>684763 говорит про указатель на массив, это было бы int (∗s)[1].
> В сях вообще в принципе нельзя передать в функцию массив как таковой
Вообще то можно, достаточно массив обернуть структурой и благопочтенная Сишечка будет его туда-сюда гонять при вызове функции.
Гонять структуру, а не массив.
То есть, например, функция вставки: void insert(node *root, int value). Пидорасы в книгах пишут, что внутри функции обязательно надо делать копию root в качестве итератора. Но я всегда обхожу дерево при помощи переданного указателя root, и дерево, однако, не портится.
Ведь аргумент root - это просто адрес корня в стеке. Сам корень находится где-то в другом месте, фукнция его не портит.
Не нужно. Вот если ты дерево перебалансируешь при вставке, и поэтому у тебя insert(node ∗∗root, int value), тогда аккуратнее с дереференснутым root. А так, в сишечке все передается по значению, поэтому root - твоя локальная переменная, с которой ты можешь делать все, что хочешь, сохранять ее незачем.
Для чего у тебя в сигнатуре указатель на указатель? На сайте с задачами система мне передает просто указатель на корень. Часто вижу, что деревья на си пишутся именно с указателями на указателями.
Если ты дерево перебалансируешь, у тебя может смениться корень. Его надо вернуть тому, кто попросил сделать insert. Можно просто вернуть, а можно сразу записать туда, откуда взяли. Так же, как и с insert в linked list, например.
>beginners.re
Чем компилировать и отлаживать программы под ARM и другие архитектуры, отличные от x86, под линуксом?
Изыди.
Всё, понял. Бля, почему это нельзя было пофиксить в С11?
Я просто не вижу никакого рационального объяснения, почему так массив передать можно, а как собственно массив нельзя.
Потому что это не баг, а фича.
>Я просто не вижу никакого рационального объяснения
Потому что залупа. Семантически вся работа с массивами – работа с указателями.
> почему это нельзя было пофиксить
Совместимость же. Рациональные объяснения (буквально абзац) есть в 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);
Так ты передаешь структуру по значению. Это чаще всего не нужно и очень медленно (более медленно только структуры возвращать по значению). Если бы можно было передавать массив таким же образом, не совсем понятно было бы, по значению ли массив передавать или передавать неявно указатель на массив.
Семантически и вся работа с переменными - работа с указателями. И со структурами тоже.
А стоит ли в этой книге изучать другие архитектуры, если меня больше интересует x86-64? Улучшит ли это навыки реверса x86?
А почему тебя только x86-64 интересует? Арм сейчас везде, куда же без него, да и с мипсами лично я часто встречаюсь. Алсо, иногда один и тот же код на x86 и ARM очень приятно параллельно реверсить. Поэтому не вижу причин пропускать что-то. Юзермодный асм простой ведь, пока это не какой-нибудь итаниум.
>Арм сейчас везде, куда же без него, да и с мипсами лично я часто встречаюсь
Мне не на чем работать с этими микросхемами.
никто не заставляет компилировать и запускать в обязательном порядке все примеры
148 C:\Documents and Settings\shiiiieeeet\My Documents\projects\kek\main.c [Warning] passing arg 3 of `CreateThread' from incompatible pointer type
На всякий случай попробуй с такой как в документации (что-то типа DWORD WINAPI MyThreadFunction( LPVOID lpParam );), хотя твоя вроде тоже должна пролезть. Может проблема с тем что возвращаемый тип должен беззнаковым быть.
Я пробовал так
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)search, disk, 0, NULL);
Но мне выдает Access Violation
Я же все равно не смогу выучить набор инструкций без программирования реальной микросхемы.
Вася. У тебя один хер компилятор на рабочей машине будет, если я не ошибаюсь. Берешь и компилируешь. Микросхем дохуя и больше. Ну под одну архитектуру покодил, а потом ныть будешь, что в другой архитектуре другие ассемблерные инструкции? Притом, что ты на сишке пишешь, тебе вообще похуй на язык ассемблера, который нужно использовать для ебаной микросхемы. Так что оно один хуй тоже самое, что и под разные оси писать. Берешь документацию - пишешь. Компилируешь на локальной машине, а там на микросхему программатором заливаешь. Все, ептыть.
Твоя функция __cdecl, а Windows хочет __stdcall как минимум. Не используй касты бездумно, определи функцию верного типа, сигнатуру тебе >>685457 написал, а внутри уже касти LPVOID в нужный тебе в LPCSTR. Или, как вариант, у тебя после создания треда у тебя протухает этот твой lpszPath (ты не дожидаешься, пока тред стартанет, ведь правда?).
>>685473
Окей. Возьми любой дешёвый роутер (длинк, асус). Как думаешь, что за проц внутри? Ну или симуляторы/эмуляторы ищи в интернетах. Банально тот же QEMU умеет в мипсы.
Убедил. Просто я до этого писал свои говноподелия на чистом асм чаще, чем на сишке, поэтому сразу же подумал, как я буду писать на асме, если даже запустить программу не смогу.
>на чистом асм чаще
Ой не пизди мне только. Чистый асм - это блядь ОПкодами писать. Другое дело, когда ты в масме или фасме макросредой пользуешься и т.д. Я сам на масме всегда пишу, потому и спрашиваю тупые вопросы про то, как блядь указатель на функцию передать, так бы легко просто в eax засунул адрес функции запустил бы все без всякой хуйни. Просто мне было лень рекурсивный поиск файлов реализовывать на масме, я и начал на сишке пейсать.
В общем я не ебу вообще, что происходит. Однозначно можно заявить лишь то, что я туплю.
1) Sleep не гарантия, а путь к сложноуловимым багом, это ты знаешь? Не жадничай, выдели памяти под строку и выдай треду указатель. Потом пусть или сам тред указатель память освободит, или ты освободишь, когда все закончится.
2) При отсутствии бита ты должен пропускать CreateThread, а ты что делаешь?
3) Угадай, что происходит, когда while отработает? А происходит выход из main, и винда делает что? Правильно, ExitProcess. Определи массив хэндлов для максимального количества параллельных тредов (или сразу 26 лол) и сделай WaitForMultipleObjects, чтобы дождаться тредов.
Код почти не читал. Может быть, там еще где-то проблемы.
есть кто под линуксом сидит? в чём работате?
Sublime Text, если проект маленький, и без подсказок по аргументам функций можно обойтись.
То есть мой двусвязный список или куча могли содержать разнородные данные. И второй вопрос, одинаковые данные, но принимать тип поля как аргумент при создании.
(Я не изобретаю шаблоны в плюсах?)
Как это сделать?
struct{ int tag; void* data;};
Кстати в программы на Common Lisp можно вставлять код на сишке.
>То есть мой двусвязный список или куча могли содержать разнородные данные.
То есть первый элемент содержит инты, второй элемент содержит массивы символов, так что ли?
>одинаковые данные, но принимать тип поля как аргумент при создании.
В смысле создавать произвольное количество элементов произвольного типа внутри какой-нибудь структуры?
Ну он же сказал - шаблоны. Он хочет оптимальный типизированный контейнер. И нет, так на сишке сделать нельзя. Можно или пердолиться в C11 _Generic, или делать теги, юнионы и огромные свитчи, или запоминать размер элемента и пердолиться с указателями на void.
Да, примерно так. Я хотел и типизированный контейнер, и "общий", ну, как списки в Петоне.
>>685899
Правильно понимаю, что свитчи/юнионы/дженерик, это если у меня есть определенный набор типов, с которыми я бы хотел работать?
А если хочу обобщенный алгоритм, только с void* и size_t?
И почему в няшной нет шаблонов?
>А если хочу обобщенный алгоритм, только с void* и size_t?
Обобщенного алгоритма не может существовать, потому что чтобы работать с какими-то данными, тебе нужно знать, что это за данные. В любом динамическом языке программирования всегда есть набор built-in типов, по сути это как раз то, по чему идут свитчи. Потенциальная бесконечность типов данных там делается за счет того, что есть какой-то йоба-тип навроде словаря, на базе которого можно многое сделать. Но общее число типов все равно ограничено.
>И почему в няшной нет шаблонов?
Есть, но они тебе не помогут, это чисто для компайл-тайма.
>И почему в няшной нет шаблонов?
Потому что этот язык старше твоей мамаши. За шаблонами gcc заменяешь на g++ и пишешь на сишечке с шаблонами и строгой типизацией.
Ну это ты зря. Плюсы тоже немолодой язык во времена, когда Страуструп писал этот свой "глубокомысленный комментарий + 2", в плюсах тоже никаких шаблонов не было.
Сказано же "произвольные".
Когда там не было шаблонов, это был именно си с классами, так и назывался.
Понятно что не молодой, но явно моложе переносимого ассемблера.
лол, да
Как прокачаться до крутого сишника, при упоминании зарплат которого тянки начинают течь?
Эту статью обоссали все, кто мог. Самое простое, что можно с ней сделать, чтобы не пришлось долго и мучительно разбираться, что там правильно и что нет - не читать ее вообще.
Я не знаю как насчет другой параши, но всегда удобно иметь С обычные и еще какой-нибудь говно язык.
Проблема со скоростью? врубил профилирование в говно-языке, перепелил на Си, подрубил как модуль.
Нужно написать драйвер, хуяк-хуяк и готово.
Модуль-плагин к апачу, да не вопрос.
Насчет связки с джавой, как-то сомнительно. Лучше в Джава-Треде спросить.
Что там не так? Нормальный совет про коды возврата, также я не знал про почти всегда равную скорость calloc и malloc, и про padding в структурах (впрочем, нахуй надо занулять пед-байты, я так и не понял)
> Что там не так?
Хуй знает, я помню только свою попоболь, когда читал это. Там в первых строках есть ссылка на how-to-c-response с более адекватным мнением.
> нахуй надо занулять пед-байты
Я бы тебе запилил кулстори, но рассказывать не умею. Суть в том, что структурку ты можешь сохранить в файл, а паддинг может достигать 4 байт, и паддингов может быть несколько, и в эти несколько групп по 4 байта могут попасть интересные вещи со стека. А если ты послал такое по сети, то могут утечь адреса и нивелировать ASLR в ОС. Много чего может случиться. На самом деле просто не стоит посылать структурки по сети, делая простой memcpy в массив байтов. Надо каждое поле отдельно писать - так и лишнее не утечет, и проблем с порядком байтов не будет.
>>689283
> Сейчас все компиляторы поддерживают C11
На десктопах и распространенных платформах актуальные версии компиляторов могут в C11. Но есть проблемы с либами (тот же пресловутый snprintf в студии). В ембеддед по обыкновению все плохо.
>>689271
>>689288
Ну JNI же. Все верно, в джаву периодически втыкаются нативные либы (когда ждава сама не может во что-то, или просто тупит), которые пишутся на няшной и на плюсах.
Что я делаю не так? tcpdump говорит, что у моего icmp неправильная чексума.
Сам спросил - сам ответил.
> Что я делаю не так?
Документацию не читаешь, сука.
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, взяли меня сразу, нехватка у них кадров.
Потому что не везде гцц свежий?
Jpeg работает так: картинка делится на блоки, к блокам применяется дискретное косинусное преобразование, далее низкие частоты забиваются нулями (поэтому это сжатие с потерями) и далее сжимается алгоритмом сжатия без потерь (про которые ты зачем-то решил читать, хотя это не так важно).
Улучшить в 2 раза без потери качества можно, например, заменив ДКП на вейвлеты, получится алгоритм jpeg2000.
>написал на бумаге как я делал задачу
Да, вот эта часть сложная. Математикам как правило хорошо дается программирование.
Ну и при написании программ, которые не умеющаются в один экран, возникает множество проблем.
https://ideone.com/geVltB
И выхлоп tcpdump'а.
Немного не тот выхлоп (без данных). Вот тот, хотя ничего не изменилось почти.
Звучит сложновато, ладно, пойду читать и пытаться делать.
>Что вообще сложного в кодинге?
Планировать и писать что-то большое, например больше 10-100к строк (у всех разный уровень, когда все разваливаться начинает). А алгоритмы - хуйня, их просто в голове целиком держать.
Очередной пост о том, что программа, собранная без -fno-strict-aliasing, может сломаться в любой момент.
>Математикам как правило хорошо дается программирование.
По части алгоритмов, графов, деревьев и другого говна на стыке с математикой, они, конечно, может и прошаренней. Но сам код, как правило, они пишут просто ужасный, который впоследствии абсолютно невозможно сопровождать.
>>689585
>И мне говорили пиздец как тяжело. Но код просто делает, то что я и только быстро, получается я просто записываю свои мысли в виде команд. Хули они орут что сложно?
https://ru.wikipedia.org/wiki/Эффект_Даннинга_—_Крюгера
unsigned char* array[str.length()];
>Но сам код, как правило, они пишут просто ужасный, который впоследствии абсолютно невозможно сопровождать
Не пизди. Я математик, и код неплохой писал с 15 лет после прочтения книжки, которая прививает правильное именование переменных, методов, продумывание архитектуры. А когда на харкаче в первый раз прочитал, что математики говнокодят, то осилил книгу про чистый код.
Реквестирую в этот ИТТ тред говнокод математиков, который невозможно сопровождать.
Теперь реализуй idle-scan.
Потому что это пидарская строчка.
потому что в c99 добавили variable-length arrays. только msvc их до сих пор не поддерживает
>Реквестирую в этот ИТТ тред говнокод математиков, который невозможно сопровождать.
Давай ты сначала свой выложишь, может, он как раз подойдёт.
>Но сам код, как правило, они пишут просто ужасный,
Неистово двачаю! Ни разу не видел нормального кода от математиков. Одни названия переменных чего только стоят!
>то осилил книгу про чистый код.
Прочитать это одно дело. А вот используют на практике полученные знания, не многие. Мне кажется, что ты весьма высокого мнения о себе. То, что тебе кажется, что ты хороший программист, не значит что так оно и есть. Будь немножко по скромнее. Я понимаю, что каждому хочется чувствовать себя гением, но все же.
>Мне кажется, что ты весьма высокого мнения о себе. То, что тебе кажется, что ты хороший программист, не значит что так оно и есть. Будь немножко по скромнее
С чего ты это взял? Я вообще в последние годы испытываю мало эмоций, а программистом хорошим себя не считаю. О личностных качествах программиста при улучшении своих скиллов когда-то охуенно написал Зомби, лучше не скажешь.
>С чего ты это взял?
Отсюда:
>Хорошим программистом я себя не считаю
>Я математик, и код неплохой писал с 15 лет
Это уже противоречии самому себе. И вообще ты не можешь судить о своем коде объективно.
А здесь, ты просишь у людей предоставить доказательства по сути факта:
>Реквестирую в этот ИТТ тред говнокод математиков
Зачем начинать бессмысленный спор. Докажи людям, что ты хороший программист. Чтобы глядя на твой код говорили: "Оу! Посмотрите на этот замечательный код! А ведь он математик! А я всегда считал, что математики не могут писать нормальный код.... Как же я ошибался!".
Поищи кстати исходники на фортране. Гарантирую, тебе доставит.
>Я вообще в последние годы испытываю мало эмоций
К чему ты говоришь это? Думаешь, кого-нибудь здесь интересует твое психологическое состояние?
> О личностных качествах программиста при улучшении своих скиллов когда-то охуенно написал Зомби, лучше не скажешь.
Не читал, но считаю что программист ничем не отличается от других людей и о нем как о человеке, лучше всего могут сказать окружающие люди.
> добавили variable-length arrays
> msvc их до сих пор не поддерживает
Это зло, которое в C11 уже наполовину выпилили. И студия, если шланговый парсер выставить, как бы поддерживает только, судя по тому, что подчеркивает, как ошибку, она сама об этом не знает. А вот с их собственным парсером даже __STDC_NO_VLA__ не дефайнит, что, конечно, очень и очень печально.
>Это зло, которое в C11 уже наполовину выпилили.
Пруфани. Я просто не помню, чтобы в стандарте С11 было что-то об этом сказано. По крайней мере GCC с флагами -std=c99 и с -std=c11 собирает нормально все.
> Пруфани
Зло, потому что хуй знает, сколько его там, этого стека. А "наполовину выпилили" - я имел в виду, что VLA ввели в C99, а в С11 осознали и сделали уже опциональной фичей.
ебать ты конченный, анон.
Миллион байт стека для каждого треда. Ты просто, блять, представь, миллион байт! Понятное дело, что если ты олень и все пихаешь в стек, то и никакой памяти тебе не хватит, но для временных структур, например, для строк и около того - просто идеально.
Умные слова и термиты, круто, безусловно. Но что ты такого можешь делать чему нельзя так просто научится?
>2) Херня, которая складывает двумерные массивы
А ты это тоже записывал на бумаге? А? Математик!
>1) Херня, которая ищет самый короткий путь в графе
Никогда не имел дела с графами, но думаю это тоже очень просто. Мне вспоминается алгоритм Дейкстры.
>потом перенес в компилятор
Надеюсь, ты просто не правильно выразился.
>почитать про алгоритмы Хаффмана и Шенона-Фано, но понятного мало
Постой. Ты же математик! Как тебе такое может быть слишком сложный. Я правда тоже не осилил (желания наверное не было), но я и не математик далеко.
>программировал только в школе
Тогда это все объясняет. Ты даже не сталкивался с программированием и не в курсе о многих технических моментах. Проблемы далеко не всегда в алгоритмах...
>Никогда не имел дела с графами, но думаю это тоже очень просто. Мне вспоминается алгоритм Дейкстры.
Если он сам вывел алгоритм без помощи литературы, это довольно круто, ящитаю. Другой вопрос, что к самому программированию это относится довольно косвенно.
>Если он сам вывел алгоритм без помощи
Ну да. Я согласен с этим. Я бы врятли быстро смог вывести алгоритм, при условии если раньше я не знал других алгоритмов. А вот по поводу косвенного отношения. Ну как сказать. Уметь в алгоритмы дорогого стоит, так как позволяет решать задачи гораздо быстрее и возможно более оптимальным путем.
> А ты это тоже записывал на бумаге? А? Математик!
Ну да, сложил пару матриц, посмотрел, записал как это делается подробно, а потом просто перепечатал в vs.
> Никогда не имел дела с графами, но думаю это тоже очень просто. Мне вспоминается алгоритм Дейкстры.
Прям такого заоблачно тяжелого ничего нет.
> Постой. Ты же математик! Как тебе такое может быть слишком сложный. Я правда тоже не осилил (желания наверное не было), но я и не математик далеко.
Само кодирование простое. Даже пару слов закодировал чтобы понять суть, я имел ввиду непонятно как jpeg сжимать.
> Тогда это все объясняет. Ты даже не сталкивался с программированием и не в курсе о многих технических моментах. Проблемы далеко не всегда в алгоритмах...
Ну память надо контролировать, ну что еще? Ну те аспекты, которые я знаю не такие уж и тяжелые.
>>690340
> Если он сам вывел алгоритм без помощи литературы
Сидел на парах, пока эти решали задачки я написал его. Сложного прям такого, мало если честно.
>Уметь в алгоритмы дорогого стоит
Я не спорю, но как часто среднестатистическому программисту приходиться корпеть над созданием какого-нибудь хитровыебанного алгоритма. Как правило, это единичные случаи. Ну или это может требоваться только в какой-нибудь узкоспециализированной области.
>Ну память надо контролировать, ну что еще?
Это только вершина айсберга!
>>690357
У меня от этого:
ПЕРЕВЕРНИТЕ СВЯЗНЫЙ СПИСОК
@
list.reverse()
>Сидел на парах, пока эти решали задачки я написал его. Сложного прям такого, мало если честно.
И к какому алгоритму ты пришёл? К алгоритму Дейкстры? Или Джонсона? На каких типах графов работает твой алгоритм? Только на неориентированном? Учитывает ли веса?
>list.reverse()
Если ты считаешь, что задача по переворачиванию связного списка относится к хитровыебанным алгоритмам, то у меня для тебя плохие новости. Решение такого рода задач достаточно прозрачно в отличие от поиска наикратчайшего пути в графе. По крайней мере, для меня.
>Если ты считаешь, что задача по переворачиванию связного списка относится к хитровыебанным алгоритмам,
Я как раз к тому, что многие "программисты" даже этого не знают. Что уж говорить о работе с графами или еще чем-либо.
Точь в точь Дейкстры. Логика у меня такая же. Мне даже кажется, что я уже видел его, но забыл.
> Мне даже кажется, что я уже видел его, но забыл.
Мне тоже так кажется. Вероятность того, чтобы точь в точь совпало в том случае, когда сам создаёшь алгоритм без посторонней литературы, крайне мала.
> для временных структур, например, для строк и около того
Тогда ты либо не ограничиваешь максимальный размер VLA, и привет, неотлавливаемый ни в рантайме stack overflow (или, того хуже, его отсутствие - см. примеры ниже). Либо у тебя есть некий лимит (например, ты знаешь, что максимальная длина этой строки не превысит MAX_PATH, или ты считаешь, что больше тысячи структур тебе не понадобится), тогда ты сразу делаешь массив нужного константного размера и не ебешь себе мозг спорными технологиями. Вот три примера, отличаются константой. Веселой отладки, так сказать расчитано на сборку без оптимизации - мне было лень, но ты можешь обосновать для оптимизатора использование array и memset, и попробовать собрать с оптимизациями.
http://ideone.com/kXaCQy http://ideone.com/926nPb http://ideone.com/KuR1B8
> Миллион байт стека для каждого треда
Зависит от архитектуры, зависит от ОС, зависит от настроек ОС, зависит от способа создания треда, если он не основной.
Двачую. Встречал пару выродков, которые говорили, что они матиматики, а программирование для плебеев.
Лол! А они точно с математикой были знакомы или они просто говорили так? Просто любой, хоть немного соображающий человек поймет, что сравнивать их нельзя и программирование лишь инструмент для реализации задачи/алгоритма.
Блять, долбоеб, пиздуй отседова нахуй, на кресты, на джаву, но только не няшную.
Ты пиздец долбоеб, ты хочешь создать на стеке массив с ебанутыми размерами и интовыми элементами, сука, блять, дай я тебе ебало обоссу, какой же ты мудааааак, сука, это еще компиль молодец, долбоеба такого терпит, уххх сук не могу, долбоеб блять.
>зависит от способа создания треда
Что ты за хуйню несешь, малохольный блять?
Понятное дело, что размер стека зависит от многих факторов
Ой иди на хуй, сука блять.
> Веселой отладки, так сказать
Черт ебаный, ты хоть раз Сишечку отлаживал, блять, сука? Это проще, чем твою мамашу пялить, сука, в отличие от ебущих крестов с их ебучим бустом, это просто сказка, блять, иди на хуй опять сука.
>ты знаешь, что максимальная длина этой строки не превысит MAX_PATH
Блять, как рекурсивно обойти дерево каталогов при этом не пердолясь с маллоком? Сука, иди опять на хуй.
>2016
>GC все еще работает через жопу и приходится пердолится с его настройкой, чтобы хоть как-то облегчить положение.
>успей ознакомиться с C11, пока он еще не протух
Многие еще на С99 пишут. Так что протухнет С11, лет через 30 как минимум.
>Чем конпелировать:
http://www.programarts.com/cfree_en/index.htm
Для маленьких примеров, самое то, набрал и запустил, шустрая как удар серпом по яйцам, только для винды.
Есть бесплатная урезанная версия, и генератор ключей для полной версии на рутрекере.
Vim+GCC+[GDB].
Для любых проектов, самое то, набрал и запустил, шустрый как удар серпом по яйцам, кроссплатформенный, только на винде в виде MinGW.
Есть бесплатная полнофункциональная версия с открытым исходным кодом.
А как же Pelles C?
Как я понял, это IDE без собственного компилятора, которая, к тому же, 6 лет не обновлялась. А у нас в шапке именно компиляторы студия и Pelles C там потому, что у Microsoft на тот момент актуального компилера отдельно не было, а Pelles C автор не хочет распространять по частям. Не нравится, и хочешь запилить список IDE - вперед, ссылка в последней строке шапки.
> goto
Ну на самом деле, break с цифрами неудобный, а вот от именованных циклов я бы не отказался. Но так-то да, goto хватает, но у некоторых СТРАХИ.
анальный раб
Clang сам по себе под виндой не пашет, нада или msvc, или mingw.
И текстовый редактор, саблайм например.
Ну clang-то пашет, просто хедеров и либ в комплекте нет.
>clang потому, что круто
>И текстовый редактор, саблайм
>msvc для Си
С км я сижу в одном треде...
Шланг для крестов оче хорош - такие то вменяемые сообщения об ошибках, особенно на шаблонах.
>Черт ебаный, ты хоть раз Сишечку отлаживал, блять, сука? Это проще, чем твою мамашу пялить, сука, в отличие от ебущих крестов с их ебучим бустом, это просто сказка, блять, иди на хуй опять сука.
ты тупое говно
промышленный код на крестах ЛЕГЧЕ отлаживать чем аналогичный на сишки
почему? да потому что любая си-прога, решающая реальные задачи обмазана макросами и с вырубленой типизацией в добавок, половина говна там будет сделана на void*
в крестах же будут шаблоны, а шаблонизированный код хотя бы будет сожран отладчиком без дополнительных приседаний
>промышленный код на крестах ЛЕГЧЕ отлаживать чем аналогичный на сишки
Лол. То-то в крестотреде анон жалуется, что у них компилятор падает от имен функций по 10к символов.
Ты в курсе о разнице между компиляцией и отладкой? Отладка происходит в райнтайме.
Как будто ты на коболе за деньги когда-то пейсал.
>Отладка происходит в райнтайме
Чтобы в рантайме что-то отладить надо это скомпилировать сначала, так ведь. А потом попытаться разобраться, как шаблоны разворачиваются.
Падал от бага, найс пересказываешь, маня.
>>691993
Ну если ты не буст-александерску-степанов-даун – тащемта там всё проста.
Да ты уже и сам привел доказательство своей глупости!
Крестоблядок, съеби в свой загон. Здесь тред белых людей.
>Падал от бага
10к символов токен - уже диагноз. Даже если бы не падало.
>буст-александерску-степанов-даун
Сейчас такая шаблонная магия - обыденный код на крестах. Подключи эйген какой-нибудь, и посмотри на ошибки в шаблонах на пять экранов. А потом посмотри на экзешник на 20 мегабайт.
Что-то я тут http://linux.die.net/man/1/gdb и тут https://www.opennet.ru/man.shtml?topic=gdb&category=1 нихуя не нашел, даже поиском по слову command, а у меня в консоли SOSNOOLEY:
~# man GDB
No manual entry for GDB
>Подключи эйген какой-нибудь, и посмотри на ошибки в шаблонах на пять экранов. А потом посмотри на экзешник на 20 мегабайт.
А потом подключи GSL и заплачь от убогости происходящего.
>Даже если бы не падало.
Баг – это диагноз, даже если его бы не было. Сам-то понял, что написал?
>>692013
Наверно потому, что это унаследовано от старшего брата-байтослесаря?
Почему ещё никто не сказал, сколько ошибок вроде последней в openssl получалось с ахуенного сишного препроцессора?
Брат-байтослесарь не ходит блядовать на право и на лево. Поэтому его легко отследить. А вот младшенький постоянно уходит куда-нибудь а при разговоре меняет тему. Хуй поймешь чего он хочет в общем.
>>692018
Почему еще никто не сказал, почему подобные серьезные вещи, которые лежат в основе всего, крайне редко пишут не на Си?
Просто не спеши заявлять про отсутствие какого-либо функционала, если не прочитал даже официальную документацию.
Си- это ебаная анимешная катана, разрезающая танк пополам.
Не очень удобно.
Кресты- катана с примотанным скотчем гранотометом. И калашниковым. И штык-нож на всякий случай.
>которые лежат в основе всего, крайне редко пишут не на Си?
Все основные библиотеки, на которых держатся ОС и веб - сишные. На крестах - только клиентское говно вроде текучих гюлчных браузеров с дырявым флешом.
Потому что это переносимый ассемблер, под который везде есть компиляторы (и их легче писать/дополнять), abi можно потянуть хоть из пуревасика, средств для запутывания кода упоротыми даунами вроде авторов буста (что отлично в основном для опенсорса).
Чтобы шаблоны отлаживать есть metashell, а не этот ваш clang.
>Си- это ебаная анимешная катана, разрезающая танк пополам.
>Не очень удобно.
>Кресты- катана с примотанным скотчем гранотометом. И калашниковым. И штык-нож на всякий случай.
Тебе будет удобно бить катаной, если на ней множество не нужных для ближнего боя вещей? Также центр тяжести будет не в порядке, да и скотч не надежен.
>На крестах - только клиентское говно вроде текучих гюлчных браузеров с дырявым флешом.
А браузеры используют смесь языков. GUI на GTK к примеру и у хрома и у лисы.
>Кресты- катана с примотанным скотчем гранотометом. И калашниковым. И штык-нож на всякий случай.
И всё функционально шо пиздетс.
Читай внимательнее, что цитируешь. Алсо, флеш частично написан на си. Алсо, языкосрачи ненужны. Лучше proposal для C2x напишите, лол.
Отлично подходит к примеру с катаной! Вся суть!
> флеш частично написан на си
О, мы помним тонны говна от пользователей флеша.
Тупорылые разработчики флеша не прочитали, что memcpy нельзя использовать на перекрывающихся диапазонах. До поры-до времени всё работало, а потом в libc поменяли реализацию memcpy и оно стало портить память при неправильном использовании.
Самое что меня тогда шокировало — что 95% ругали разработчиков libc, мол вот они какие говнюки, ради говнофлеша не могут запилить "работающий" memcpy обратно.
>Самое что меня тогда шокировало — что 95% ругали разработчиков libc, мол вот они какие говнюки, ради говнофлеша не могут запилить "работающий" memcpy обратно.
О да, в прошлых тредах как-то эта тема проскакивала. Вроде там даже пришлось какой-то воркэраунд приделывать.
У адоби же корпоративное рабство и вся хуйня. После покупки макромедии в конторе одни индусы, о каком качестве кода можно говорить вообще?
Сосоны, что я делаю не так?
[Linker error] undefined reference to `fput'
fputs((const char *)buf, f);
gcc в dev c++
Ну это-то понятно (неправильный library path или еще по каким-то причинам -lmsvcrt и -lmingwex не указываются автоматически или отсутствует). Непонятно, почему fput. В mingw вроде таких макросов не было никогда.
С printf все нормально. А вот с fputs фуфло какое-то.
>[Linker error] undefined reference to `fput'
>fputs((const char *)buf, f);
> fput, fputs?
Кто-то здесь пиздит.
Тогда бы было либо замангленное имя в выхлопе, либо прототип.
Скажи как сделал в итоге
попробуй с -lc скомпилировать
Ctrl+F -> fput -> PROFIT!!!
Если не кинешь сюда весь код, ты зачисляешься в почетные врунишки и можешь уходить отсюда.
http://pastebin.com/ma2BsVbR
Есть sep_crypto.c:
http://pastebin.com/Pdd8aPRs
И есть sep_driver_api.h:
http://pastebin.com/sZ0TcNFg
Собственно, никак не могу пофиксить. Помогите профану, пожалуйста, и подскажите, как в будущем фиксить подобное.
А знаешь, какая тут мораль? Собирать надо обязательно с -Wall -Wextra и прочими -W по вкусу. Тогда бы тебе сказали про implicit function declaration, и не пришлось бы столько выяснять, откуда взялся fput.
>foo.c:5:10: error: expansion of date or time macro is not reproducible [-Werror,-Wdate-time]
> puts(__DATE__);
Нахуй. Пока когтеед жив, пока шланг вместе с гцц следуют его глупому предложению, никаких -Weverything рядом с -Werror. У него возникнет очередная ебанутая идея, а билд сломается у меня. Нахуй. Да, это батхерт.
>Есть ли где примеры или туториалы, где показано, как можно сишный быдлокод покрывать тестами.
Если он с глобальными переменными, то не надо его уже покрывать тестами, это бесполезно уже, подробности на fprog.ru
> то не надо его уже покрывать тестами, это бесполезно уже
У нас за такое на Therac облучают и F18 шасси убирают.
У меня есть символьная строка (с буквами)
Мне надо вывести определенный элемент массива
printf("%d\n", line[5])
Программа вывод не саму букву, а её код.
Если писать %s, то завершает работу
Как сделать так, что бы именно саму букву выводил?
мимоличинус
Ребят, извиняюсь за оффтоп. Подскажите, Сишка и ARM сейчас в тренде? В какой стране легче всего работу найти, просто в моей белорашке нихуя нет. Вот и остановился я на распутье, изучать дальше арм или перекатывать.
Я бы не сказал, что прямо "в тренде" - удаленку, например, найти сложнго. Но вообще работа есть.
Пацаны, есть сборочка 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
Без пробелов все собирается, потом линкуется отдельной софтиной и запускается. С пробелами вылазит это говно.
Как я понимаю, оно воспринимает путь с пробелом как два отдельных файла, даже в кавычках? Можно это как-то обойти?
> С пробелами вылазит это говно.
А запускаешь напрямую команду из консоли, или 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/ посмотреть, вдруг найдешь решение там.
> А запускаешь напрямую команду из консоли, или IDE запускает? Или батник какой-нибудь? Никаких start перед gcc?
Батник, вот так:
for /r %file% i in (*) do (
echo Compiling "i"…
gcc "%%i" -c -O3 -mthumb -mthumb-interwork
)
> например, сделать симлинк на проблемную папку
Лол, я так и сделал, но хочется нормального решения, а не костылей.
Напиши однострочник с GetCommandLine (и заодно с итерацией по argv), посмотри, что получается. У меня вот получается вроде норм разбивается, в argv[1] попадает имя файла с пробелами - проблема в гцц? Возможно, gcc.exe парсит правильно, а в cc1.exe уходит уже не то? Возьми Process Explorer от SysInternals, посмотри опять же. Если найдешь причину ошибки, можно или откопать исходники старые и поправить, или просто даже бинарник пропатчить.
Я что-то очкую. Это как первый секс почти.
Блин, я же писал уже, что это костыль. Я спокойно и симлинкнуть могу, и в другую папку конпелятор и сорцы перенести — но хочется именно разобраться в настройке, а не идти на уступки.
В линукс-мире принято экранировать проблел обратным слешем, а не заковычивать ввод: gcc yoba\ s\ probelom.c
>>695273
>>695272
>>695242
Лол, разобрался. Надо было в батнике длинное имя преобразовать в короткую версию формата 8.3.
Какие-нибудь подводные камни есть?
И очень плохо. Лучше лишний раз заковычить параметр, чем потом удивляться, куда делся весь /usr/ после установки Bumblebee
Удалёнку в эмбеде найти сложно по всему мира, потому что прибор это физический объект, и эмбед тесно связан с фищическим пердоленьем.
Научите линковать. Допустим, есть два файла, 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
Можно как-то сделать так, чтобы было насрать на порядок компиляции?
Ссылка приклеилась.
>Можно как-то сделать так, чтобы было насрать на порядок компиляции?
По-моему если не использовать .so и .a либы, то на порядок насрать.
И так насрать. А вообще пиши makefile с implicit правилами, пусть он сам думает.
Нет, обычно он уже написан и тебе даже не надо его указывать, линкер его сам использует.
CMake нужно сжечь хотя бы потому, что там в готовых настройках под венду дикий хардкод путей и куча неправильных предположений.
В тех линкерах, которые умеют в скрипты, в том числе и в ld, скрипты лежат в файлах. В более узко специализированных линкерах, типа MS-ового link.exe алгоритмы работы захардкожены.
Почему sizeof(str) возвращает размер указателя 4, а не размерность массива?
Спасибо, нагуглил ответ и понял свою ошибку.
Посмотри выше по тредику про массивы. Ты объявляешь указатель на анонимный массив (const) char. Чтобы объявить именно массив, делай так: static const char str[] = "Blablabla"; - так sizeof будет работать, как ты ожидаешь. static тут затем, чтобы массив попал в сегмент данных, а не создавался каждый раз при входе в функцию, а const, чтобы не было неожиданностей.
Нет.
Ну и где лежит дефолтный линкер, котрым ld пользуется?
Прогнал ld --verbose под strace, он нихрена похожего на ld-скрипт не открывал.
Кекнул с тебя.
Ну так-то скрипты просто и банально лежат в /lib/ldscripts/, но, возможно, я ошибаюсь, и какой-то дефолтный вариант и правда вшит.
Нет, ты был прав. Я имел в виду дефолтный, но забыл про это явно написать.
умею нешифрованные сокетами
для связи - forsQH(sl123ANUSmPA{ailPUNCTUMr$I}u
https://curl.haxx.se/libcurl/c/https.html рабочий и с комментариями.
> не умею эти ваши английские
На 2000 купи себе словарь.
Он во многое может. Тыкни там огромную ссылку Examples, и сам увидишь.
А, я понял, сам доэкспериментировался.
https://ideone.com/ZR1bsW
(увидел в местном прочитал-проиграл треде)
А что тут пояснять? Всё очевидно же. В scanf нельзя указать размер буфера, что позволяет этот самый буфер переполнить используем fgets, парсим руками. В check_authentification размер буфера еще меньше, чем в main, но при этом используется strcpy, которой тоже нельзя указать максимальный размер тут чуть сложнее, потому что очевидный выбор новичка - strncpy - внезапно тоже сломана, что позволяет переполнить буфер и возможно затереть auth_flag. Ну и мелочи всякие еще, типа паролей открытым текстом в коде, при наличии которых даже переполнять ничего не нужно храним соленые хэши, притом в конфиге, потому что хардкод тоже зло, хотя за Кэрролла лойс.
У меня любимое ключевое слово void, а функция тоже malloc.
Выделять их как сам считаешь нужным через alloca().
>>699290
>Мемсру
Как же ахуенно читается на русском, прям вся суть функции.
>>699306
memset и scanf конечно же, из любимых языковых конструкций - void*.
> что использовать
Аккуратно напиши свою. Большинство проектов так и делает. Так поступают еще и потому, что многие программы под линуксами имеют дело с UTF-8, а в UTF-8 важно не обрезать строку посередине символа.
>>699289
> Как заставить GCC размещать
Но зачем? Язык Си и стек никак не связаны. Но вообще, при сборке без оптимизаций порядок более-менее соблюдается.
Аноны, подскажите пожалуйста как записать конструкцию switch псевдокодом.
Через цепочку if, или ты про какой псевдокод?
Как мне заполнить массив в асм вставке числами от 0 до 99?
Жесть, чувак, даже не пытайся, или, хотя бы почитай про асм. Во первый компиль вставит эту вставку и даже не подумает с ней что-либо делать, ибо считает, что если ты юзаешь вставку, значит ты знаешь, что делаешь, а во вторых ты просто вероломным образом начинаешь использовать регистры, которые до этой вставки компилятор мог как-либо использовать, при этом ты не восстанавливаешь те значения, которые там были. Короче на данном этапе компилятор сам сможет лучше тебя оптимизировать заполнение массива, так что либо учи асм, либо забей болт на вставки.
Как мне заменить нечетные разряды на 0, а четные инвертировать?
есть код,но он не совсем работает
mov ax, a
mov res1, ax
and ax, 01010101b
xor ax, 10101010b
число 155
И вправду, Microsoft для своих горе-погроммистов старается не использовать те регистры, которые юзаются в асм-вставке.
https://msdn.microsoft.com/en-us/library/5hd5ywk0.aspx
попробуй sub ax,0xff
> вместо дрочева с высчитыванием индекса
stosd требует использования именно edi, а эффективный адрес в таком виде может использовать любые регистры. Да, stosd мог бы быть чуть-чуть побыстрее из-за отсутствия зависимости от ecx, но какая нахуй оптимизация, когда это явно учебный пример?
>>702341
Не читал статью, но насколько я знаю, компилятор просто смотрит, что используется и перед ассемблерной вставкой сохраняет это в стек (или даже не сохраняет, если в регистре было просто закэшировано что-то). GCC позволяет делать то же самое, просто ему, в отличие от студийного компилятора, нужно сказать, что ты изменил специально, а что попортил по ходу дела.
>Да, stosd мог бы быть чуть-чуть побыстрее из-за отсутствия зависимости от ecx
Ты че, поехавший? Из-за отсутствия зависимости от еcх?
У тебя адрес вычисляется через сложение и умножения регистров, в то время, как конкретно для stosd регистр edi всего лишь увеличивается\уменьшается на 4.
mov ecx, 0x64
xor ebx, ebx
lea edi, [array]
lea edi, [edi+ecx*4-4]
std
lp: lea eax, [ecx-1]
add ebx, eax
stosd
loop lp
cld
mov [sum_asm], ebx
> У тебя адрес вычисляется через сложение и умножения регистров
Ты не поверишь, но процессор умеет считать эффективные адреса очень эээ... эффективно. Это одна инструкция, и выполняется она не дольше stosd. Но она точно быстрее, чем stosd с установленным DF. Такие дела. Про зависимости, переименование регистров и прочие нюансы тебе, видимо, просто еще рано знать.
Поясните за free(). Правильно ли я освободил память, или обосрался?
// Занимаем место:
u8 buffer = (u8)malloc(size);
// Тут магия с указателями и прочая дичь:
// …
// Освобождаем:
free(buffer);
аппноты, рили и без шуток
и вообще AVR потихоньку дохнет, STM32 в этом плане перспективней - за разъяснениями в /ra/
Все правильно, да. free(), кстати, понимает NULL, поэтому перед освобождением ничего проверять не нужно.
Спасибо, просто я тот ебанутый, который делает игру под GBA. Если не следить за памятью, то те 256Кб оперативной памяти засрутся очень быстро.
Когда я открываю готовое решение, смотрю на него, я понимаю как это было легко и охуеваю с себя как это я не додумался. Хотя нет, вру, в 1.19 уже плохо понимаю смотря на решение.
Что делать с подобным кроме как уйти в похапе/из профессии?
Помогите, пожалуйста, няши.
https://ideone.com/q7Gpvt
Ну как обычно с айтишными книжками: не читай дальше, пока не поймешь, что у тебя не осталось вопросов. Пробуй, пиши код, разбирайся. Если лень или не интересно - тогда из профессии.
>>705458
> Я правильно понимаю, что через gpointer data при отправки сигналов, можно передать любые данные?
Ну не через глобальные переменные же передавать. Все правильно, стандартный паттерн - при регистрации колбеков запоминать "пользовательский" указатель на что-нибудь.
>>705087
Я сейчас еще прочитал свой пост и заметил, что при объявлении u8 buffer = … после u8 потерялась звёздочка, это указатель. Всё равно нормально очистит?
Да все правильно. А звездочки макаба режет. Самое худшее, что ты можешь сделать, так это не освободить память вообще или освободить память которою ты не выделял. И да. Желательно освобождать сразу же, как выделенная память больше не нужна.
А и еще освободить память в случае если ты поменял указатель. Тогда поведение будет неопределенным. Так что следи внимательно за ними.
А вот еще хотел спросить. Если мне нужно обеспечить ввод при нажатии на Enter и при нажатии на кнопку. Правильным ли будет, просто эмитить сигнал с ответом при нажатии на Enter для диалогового окна? Или есть другие способы?
Короче, есть конвертор, который берет изображение формата .pcx и забивает его в .o как массив с произвольным названием типа u8. Потом происходит компиляция исходного кода и он линкуется с уже имеющимися файлами ресурсов. Когда мамин программист хочет нарисовать эту самую картинку на экране GBA, он подключает эту переменную через extern и дает указатель этой функции:
http://pastebin.com/FRQuWfbj
Вроде же всё правильно, ничего лишнего не освобождается? Просто я не нашел нормальных дебагеров под GBA, вот и приходится задавать тупые вопросы и гадать на кофейной гуще.
А почему нельзя прямо на экран распаковывать? Слишком медленно? Так RLE же, чуть-чуть до memcpy не дотягивает.
Там такая фича видеопамяти GBA, что туда нельзя писать char-ами, только short и int, а картинка-то как-раз таки и закодирована в char (а в 16-цветовом случае вообще использует по 4 бита на пиксель, лол). Это рождает просто ебанную кучу проблем, например, если хочешь нарисовать один пиксель — выравнивай указатель по ячейке, читай соседний пиксель, скрещивай его с идентификатором цвета и только после этого записывай назад уже два пикселя, как раз u16 и выходит. По этой же причине я и не осилил RLE прямиком в память — а что если оно будет залезать на соседний пиксель?
А вообще, архитектура, мягко говоря, интересная. Может, в 2001 это было нормально, но сейчас меня подобные вещи пугают.
Если тебя не смущает, что это undefined behavior, то кастится так же, как и все остальное:
uint8_t bytes[] = { 0xeb, 0xfe }; // Infinite loop (x86).
void (∗funcptr)(void) = (void (∗)(void)) bytes;
funcptr();
// Или заодно с вызовом
((void (∗)(void)) bytes)();
Работать не будет, потому что bytes надо положить в регион памяти, который помечен исполняемым. Современные процессоры, NX-бит, все дела.
И повторяю: это UB.
Спасибо.
Выходит лучше указатели на данные и функции хранить отдельно?
Благо у меня stm32 и по умолчанию gcc даж не ругнулся.
> Выходит лучше указатели на данные и функции хранить отдельно?
Я сгустил краски. По стандарту у тебя либо object pointer, либо function pointer, и использование одного через другое не портабельно (потому что существуют всякие AVR, где такое сделать не позволяет архитектура процессора). Но там, где архитектура позволяет, возможность выполнять данные, как код и/или использовать код, как данные часто существует в виде расширения стандарта (J.5.7), и не приводит к неожиданностям (если выполняются всякие платформо-зависимые обряды вроде сбросов кэшей и пометки памяти, как исполняемой).
Поэтому если ты пишешь конкретно для STM32, тебя эти проблемы не касаются. А зачем тебе кастить данные к указателю на функцию, кстати? Ты генерируешь код в рантайме или просто экспериментируешь?
Круто знать первоисточники.
Пытаюсь улучшить алгоритм вывода на экран LCD1602 менюшки и действия её пунктов. Понял уже что такое приведение типов будет лишнее, проще хранить разные указатели в разных типах массивов.
Можешь union сделать, если в зависимости от типа элемента тебе нужно поле или одного типа, или другого.
1) Ты когда однобайтовый хвост читаешь, читаешь лишнее. Представь, что я выделил страницу памяти и скормил твоей функции один последний байт этой страницы - ты сегфолтнешься.
2) После if не делаешь else для двухбайтового варианта.
3) Читаешь целые в little endian, но не свопаешь байты перед инверсией битов.
1) Как опознавать нажатие/отпускание/удерживание клавиши на клавиатуре?
2) Как воспроизвести аудиофайл (скажем, mp3)?
Очевидно, ты должен указать ОС. Если ты хочешь более-менее кроссплатформенно, то можешь взять SDL и какой-нибудь MAD для декодирования .mp3.
Хорошо, понял, спасибо. А можно пример кода на
>нажатие/отпускание/удерживание клавиши на клавиатуре
? Под линукс. Просто для общего образования. Мне кажется, это должно быть очень просто, что-то типа while(true){scanf("%c", &key); ...}
Ура, я нашел эмулятор GBA со встроенным дебагером! Теперь писать код стало куда проще, можно хотя бы удостовериться, как и куда ты записываешь спрайты (а не просто высчитывать в уме) и всё такое. Была маленькая утечка памяти (если так можно назвать неправильную адресацию тайлов) — с помощью утилиты я её устранил.
На пике мой понг, который я успел написать за это время. Ведь превозмогать с древней архитектурой и еще более древним Си — это так охуенно!
Используй 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, так как разжевано кое-что подробнее, и также больше, чем учебник Праты, так как не так сильно глубоко.
>>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. Так вот, как это исправить, и, наконец, занести эту долбанную константу по нужному адресу?
Хуй знает, это специфика архитектуры, надо разбираться, но разве до 0x08000a0 не лежит еще что-то подобное околосистемное? Заголовок какой-нибудь там. Укажи в линк-скрипте, что у тебя есть секция, допустим, 0x100 байтов с подобным говном, и эту секцию надо смержить с .text, причем поместить ее в начало .text.
> 0x100 байтов с подобным говном, и эту секцию надо смержить с .text, причем поместить ее в начало .text
Ну так как это сделать и спрашиваю — можно пример скрипта? Всё что после 0x08000000 — это память картриджа (может быть до 32Мб), до 0x80000A0 лежит какой-то заголовок GBA игры, после него — остальная память картриджа.
>Что вообще сложного в кодинге?
Сложно писать программы таким образом, чтобы потом внося в них изменения, эти изменения были локализованы как можно в меньшем количестве мест.
Да, уже увидел пик с сообщением об ошибке и посмотрел скрипт, которым это собирается. Хуй знает. Если .text не будет по 0x08000000, сломается бутстрап в crt0.o, а патчить секции через ld я не умею. Я бы отредактировал сам crt0.S просто или написал бы патчилку ромов после линковки уже.
Двачую. Строковые литералы размещаются в секции рид-онли, плюс все секции выравниваются по размеру страницы, поэтому компиль и перетирает твою попытку захуярить секцию по такому кривому адресу.
бля ну ты понял, тут типа ответ не сколько тебе, сколько анону, которому ответил ты
> патчилку ромов после линковки уже
Но такая уже есть:
https://github.com/devkitPro/gba-tools/blob/master/src/gbafix.c
Но всё равно было бы круто разобраться с самим линковщиком, чем использовать готовые велосипеды.
Ситуация - есть набор данных, хранящихся в линкованом хэш-массиве. Отдельная единица данных уложена в структуру. Размер массива варьируется от несколько тысяч до нескольких миллионов.
Как обычно, в процессе разработки возникла потребность для некоторых единиц хранить дополнительные данные, размер которых может сильно варьироваться, и содержание - тоже.
Как это по-нормальному делается обычно, чтобы и память лишнюю не жрать, и скорость обработки не пострадала? Понятно, что раздувать исходную структуру не вариант, данные с дополнительной информацией составляют меньше процента от общего числа.
Я пока сделал это вводом инта с размером дополнительных данных в байтах и указателя с адресом их расположения.
связанный список
Предположим, нужно в программе какое-нибудь число. Пусть, например int x = 10. С точки зрения памяти, что будет, если мы в коде уберём переменную x и подставим везде само число 10? Мы сэкономим 2 байта?
Типа того, но там оптимизации могут быть если ты не объявишь х как volatile. Ну и экономия от размеров типов зависит.
Не шарю в асме. Чё-то не понял, или кривой код?
http://pastebin.com/bwPVY8u3
http://pastebin.com/g1j6TPj1 выхлоп
У тебя там ембеддед что ли? Твой подход норм. Даже если у тебя будет миллион элементов, дополнительные расходы от двух полей в структуре составят 8/16 мб и особой погоды не сделают. Если все равно хочешь память сэкономить (за счет CPU и шины), можешь изъебываться с офсетами (в элементе хранится офсет в заранее выделенный пул, а размер данных ты вычисляешь в рантайме на основании офсета следующего элемента в связанном списке, или, если он последний - следующего bucket-а). Или, если у тебя элементы массива - указатели, а не сразу структуры, сделай структурку вида:
struct Item
{
struct Item ptr next;
int hashcode;
int data_length;
char data[];
};
и при выделении элемента выделяй сразу sizeof(Item) + data_length. Выделится одним куском, не нужно будет хранить лишний указатель.
>>714797
Оставь оптимизации компилятору, особенно если не уверен. Будет ли выигрыш от твоего подхода, зависит от многих вещей. Например, от архитектуры (как будет кодироваться непосредственное значение 10 в инструкции, которая его использует), от выражения, в котором используется твое число, от наличия и типа указателей в функции (можешь про алиасинг почитать, но это весьма хитрая тема), от уровня оптимизации, от ключей компилятору, от самого компилятора.
Могу студией собрать, но uintp - это uintptr_t или uint32_t ∗? И почему нельзя было стандартные типы использовать?
Вопщем, сам дизасми. Студия со всеми апдейтами, Clang/C2 парсер шланговый, кодогенератор C2 майкрософтовый. rghost.ru/7KdXkMRsc
А чего ты добиться-то хочешь? Я так и не понял из оригинального поста. Оно умножает не так, или компилируется неоптимально? Код не читал, если что.
Вроде не оптимально компилируется, по идее это должно идти в одно умножение. Но рас нет, значит допускается какое-то поведение, и возможно там ошибка, или хуй знает.
Нет, не эмбеддед, но с памятью всё равно приходится обращаться с осторожностью, ибо в долгосрочных планах количество данных может перевалить через миллиард, и тогда счёт пойдёт на гигабайты. И дополнительные данные хранятся не в общем массиве, а в отдельной области, так как сам массив уложен выровненными чанками, оптимизированными для кэша.
Короче, я в итоге выкинул инт с размером, оставил только указатель, а размер храню первым элементом дополнительной области. Всё получилось быстро и компактно, я доволен.
Как начать кодить на этом СИ? Поставил я такой netBeans, а он такой - у вас нету компилятора!
А я такой - поставлю кланг тогда. А он такой - у вас нету MAKE.
Сука! Сделать не может. МАке нету.
И я такой говно этот Си непонятный, вернусь на JS
Ну или объясните как ХЭЛЛОУ ВОРЛД НАПИСАТЬ!?
Если у тебя винда, к шлангу тебе понадобится поставить еще MinGW GCC (многие хедеры, либы у них общие), там и make есть, как часть MSYS. А можешь просто взять Pelles C или Visual Studio, у них свои IDE, и все необходимое сразу есть в комплекте. Разве что, у студии комплект весит десяток гигабайт, а у Pelles C - десятки мегабайт.
Спасибо
Что можно на чистом С сделать, кроме консольных утилит x + y?
Зачем он нужен вообще, кроме как для написания контроллеров для железа?
GUI-приложения под winapi писать на С как два пальца обоссать на самом деле, в визуальном конструкторе или редакторе в ресурс-файле накидываешь типовые контроллы в контейнере DIALOGEX, задаешь им текст, стили и прочее, далее во время исполнения лепишь свои диалоги куда тебе надо - например на созданное главное окно, можно переключать их видимость вкладками например, меняешь их свойства и обрабатываешь юзер инпут с помощью стандартных виндовых оконных месседжей, можно очень просто назначать собственную отрисовку контролов, тогда можно делать гламурненькие кнопочки, чекбоксы и прочее прочее. Это на первый взгляд кажется, что гиморно и громоздко, на самом деле через некоторое время у тебя появится куча всяких стандартных шаблонов и оберток для вызова громоздкокого winapi. Не в курсе, но уверен, чтопод какое-нибудь GTK(он же вроде на С емнип) всё так же.
гуй не нужен. консоли будет достаточно, а то знаю я эту вашу графику. сегодня ты напишешь вызов, заделаешь удобства, очереди отрисовки, анимации, 3д, шейдеры - в итоге всё время тратишь на свой самый лучший в мире движок. далее выкладываешь его для всеобщего пользования и УПС, внезапно оказывается, что таких-же долбаёбов как ты уже за миллион переваливает, и твоё поделие нахуй никому не нужно, а время потрачено, а ведъ можно было посмотреть трилогию порно пиратов, но уже на работу...
>>717745
>>717890
Спасибо, понятно. А что есть для работы с графикой? Собрался игоры пилить Допустим, я хочу сделать так, чтобы в некоем окошке 6 квадратиков ездили друг за другом по часовой стрелке. Java и прочее не подходит, т.к. при увеличении числа квадратиков (до 600, например) всё начинает безбожно лагать. Логичный вывод - сделать это на С. Только хз как
OpenGL, как ещё блядь.
Если у тебя лагает такая хуйня – у тебя либо безнадёжно устаревшая пека, либо ты пиздец криворукий. В обоих случаях сишка будет полумерой, тем более если ты её не знаешь.
Во времена второго квейка ещё был софтварный рендер. Где каждый пиксель на сишечках. Сейчас конечно опенгл надо использовать везде где можно, особенно если квадратиков много.
Ок, расскажи мне, как сделать эффект, аналогичный снарядам в тохо?
Делал через Python на Pygame и Pyglet - лагает, делал на Java в Candroid engine - лагает.
Комп 6 ядер, 8 гигов озу
>Stephen Prata "C Primer Plus, 6th Edition" (2014)
Действительно годнота? Хочу окунуться в мир чистого Си, сейчас листаю Ритчи.
Норм, но еще лучше паралельно учить ассемблер, сразу станет понятно откуда в сишных конструкциях ноги растут.
Я сначала удивлялся почему одногруппники не вдупляют простые и понятные концепции вроде адресной арифметики, указателей и пр. а они тупо не шарили во что компилируется их код. Не будь таким.
Ну и что это тебе дало? Вот пишу я printf("Bla bla"); нафиг мне знать, что атм происходит? Я знаю, что у меня выводится в консоль строка. Это всё, что мне надо. Зачем мне дезасемблировать её?
Толсто.
> Делал через Python на Pygame и Pyglet — лагает, делал на Java в Candroid engine — лагает.
> Комп 6 ядер, 8 гигов озу
Пиздец.
Стандартный геймдев в 2016. Железо же развивается, хули вы тут на своём ассемблере пишите?
> при увеличении числа квадратиков (до 600
Такую хуйню и сишка не вывезет в риалтайме, твоим способом. Большие количества "квадратиков" реализуют с помощью частиц (particle system). Про тохо точно не знаю, но с большой долей вероятности там не обрабатывается каждый снаряд как отдельная сущность. А задается закон по которому они живут (функция от времени). Каждый залп это одна функция с помощью которой ренедерятся сотни снарядов, и проверяется попадание в игрока с помощью простой подстановки (координат игрока) в функцию.
вголос
Так мы застряли в прошлом — вон, один уже совсем поехал и пишет под Геймбой, там вообще 4Мгц и 256Кб оперативы. А ты тут такие вопросы задаешь.
Т.е. это не так работает? -Делаем класс Пуля, из него генератором делаем 200 объектов и задаём в функции им путь и время, чтобы были промежутки.
Алсо спасибо, доброанон. А как ты до этого додумался? Что это функция и т.п. Это ведь не какое-то знание конкретного ЯП. Алгоритмы? что почитать на эту тему?
Заебали, напишите за меня, просчитайте комбинации, десятитысячные факториалы, соберите в группы...
Ну почему так всегда, есть идея и есть реальность - скалы, где даже вместо разбиения об оных, ты изучаешь каждый писюньчик этого момента.
Потому что это сложно морально, просто брать и пользоваться уже написанным до тебя.
а я пользуюсь рамой как массивом бит - посчитал сколько мне надо и охуел от перспектив, так что высчитываю в рантайме сколько нужно бит на кодирование элемента массива...
Нет, я должен страдать, я не сдался ещё.
> Делаем класс Пуля, из него генератором делаем 200 объектов
Так и работает. Тормоза у кото-то там выше не из-за подхода к хранению и генерации частиц, а из-за способа отрисовки.
i[0] = 1;
}
)Спасибо.
Кстати еще одна проблема
Serial.readBytes[i,4]//считываем массив по байтам
int c=(i[0]-'0')*6000//если ввести 1234,то выдаст 6000-правильно.Но если умножить на 60000 то выдаст -5536.
В ардуинах же atoi тоже есть, насколько я помню. Зачем ты его изобретаешь?
Потому что int там 16-битный, в знаковом int может храниться -32768 ... 0 ... 32767, вот он у тебя и переполняется. Юзай long (long int), и желательно unsigned, если не предполагается хранить отрицательные числа.
Спасибо большое!
Алсо, есть ли способ узнать текущую позицию курсора в этом самом stdin?
fread/fwrite, ftell.
sleep(60)
> for или do while делает i-1 к примеру раз в 1 миллисекунду
С чего бы вдруг? Нет, гораздо чаще, зависит от процессора и конкретного скомпилированного кода. У тебя частота процессора гигагерцами меряется, причем несколько инструкций могут выполняться параллельно.
>>718795
Используй аналог sleep() в твоей ОС или виси в пустом цикле, пока разница между начальным time() и текущим не будет равна 60 секундам (но имей в виду, что такой подход бесцельно нагружает процессор). Пустой цикл в твоем варианте не имеет сайд-эффектов, поэтому оптимизатор вправе его выкинуть нахуй.
>>718745
freopen() сделали специально для тебя. Не забудь заодно описание setvbuf() глянуть.
>Зачем он нужен вообще, кроме как для написания контроллеров для железа?
Блядь, откуда вы только лезете. На Си, наверно, половина софта написана. А остальная половина на крестах.
C++
Есть ли рбота на сише в рашке?
Тут уже спрашивали >>694860. Искать нужно, но в общем-то есть.
>>719743
Любую. Если шинда и Windows API, то Visual Studio или Pelles C. Но вообще, если тебе нужен обычный стандартный GUI, то проще написать его на C# или Qt, а на сишечке писать либу или консольное приложение, к которым GUI будет обращаться.
В ней используются phtread и mutex
https://ideone.com/NaFOvO
С большего написал, но ведет она себя странно, в какойто момент, судя по всему, входит в дедлок.
Дебажить нечем, пишу в блокноте и компилирую/запускаю на удаленном сервере.
Был бы благодарен за намеки где я проебался.
Задача, на всякий случай, такая:
есть много тредов, они соревнуются за ресурс PID(их меньше чем тредов), держат его немного и отдают назад.
У меня получается что треды берут все PID, благополучно отдают их назад, но новые треды их уже взять не могут.
2016-й на дворе, используй std::mutex. Твой код не exception safe как минимум.
А, сорян, ошибся тредом.
Проверка S (там где ты ждешь) происходит до лока мютекса, возможна ситуация что в треде будет проведена успешная проверка S, после чего он стопнется операционной системой, S будет уменьшена, и тред продолжит выполнение дальше с S равным нулю без всяких проверок, на что у тебя там UB как я понимаю - ты дойдешь до конца функции не сделав return.
хуяно.. там больше 200строк писать не рил
Что за хуйню я только что прочитал?
nop
Но ведь S это типа семафор, который фактически он там нихуя не делает(изза наличия мютекса). Проверка по S разрешает обратится к мютексу, не более. А уменьшение S возможно только после отмыкания мютекса.
Я исхожу из слеюующего:
Когда ктото хочет mutex_lock а он закрыт, то этот ктото попадает в очередь и крутится там переодически пытаясь этот мютекс открыть еще раз. Это верно?
Типа как семафор, да, только семафоры потокобезопасные (доступ к счетчику) а твое S нет.
Ситуация. Ресурсы полностью заняты. S равно нулю. Несколько свободных тредов крутятся в цикле. Освобождается один из ресурсов. В массиве одно из значений записывается на ноль, S становится равным одному. Тред А увидев что S больше нуля выходит из цикла и тут его стопает система и запускает тред В. Тред В видит что S больше нуля, выходит из цикла, проходит по массиву ресурсов находит ноль и записывает туда единицу, уменьшает S до нуля. Просыпается тред А, проходит по массиву, так как там нет нуля (все ресурсы уже заняты) то функция просто завершается без нормального ретурна - тоесть возвращается какая-то хуита. Я не знаю что у тебя там за проблема, может такое поведение никак на корректность программы даже и не влияет. Но такая твоя реализация не потокобезопасна. В семафорах регулируется доступ к счетчику - тебе нужно или захватывать мьютекс перед чтением S, или делать атомарную операцию с проверкой и одновременные декрементом S. Если еще и массив атомарно модифицировать то мьютекс совсем не нужен.
ОК, с этим согласен.
Вот, вообще убрал оттуда S(остался как счетчик для дебага)
https://ideone.com/gyhVuB
Добавил ретурн, чтобы видеть ошибку
Похоже что так и есть как ты говоришь, они попадают в цикл поиска свободных мест в странном порядке.
Но ведь это место защищено мютексом блеять! Может это быть изза того, что система мульитпроцессорная?
Будет ждать.
>>720335
>место защищено мютексом блеять!
Защищено. Треды получают ресурс строго по очереди. Пока один ищет, остальные ждут. Проблема в том что твой счетчик, из-за того что он сам по себе непотокобезопасный в некоторых случаях (там наверное всего две-три инструкции во время которых нельзя останавливать поток на всю программу) пропускает больше тредов чем есть ресурса. Кстати из-за чего и происходит дедлок, только заметил - поток освобождает мьютекс только после того как получит ресурс. Тоесть когда счетчик пропускает лишний поток, он не может найти ресурс (так как все заняты) и следовательно неотпускает мьютекс и никто больше не может получать ресурсы.
Там UB из-за возможного signed integer overflow в процессе обработки.
вобщем так все и было, спасибо починил.
А ведь возвращать ресурсы можно без мютекса? Там же вроде не запороть?
Если правильно раздал то не запороть. Главное сначала ресурс вернуть, а уже потом счетчик увеличить.
спасибо, все работает.
оророро уебываю назад в пистон тред, где мне и место
байтоёбьте без меня
> Coding style
> Do not mix declarations and code
Используют C99, а до сих пор говно в голове.
Начем с того, что ты - пиздоглазое мудило!
У тебя функции allocate_pid мьютекс захватывается всегда, а освобождается только тогда, когда удалось выделить PID.
И это только пол беды, еще там же в случае, если не удалось выделить PID, у тебя не только не освобождается мьютекс, но и не возвращается никакого значения !!!
А раз мьютекс не освобождается, то дэдлок - вопрос времени.
Чтобы это заметить отладка не нужна, совсем.
Желаю тебе всю твою никчемную жизнь наслаждаться UB по полной программе!
школьник-кун
хотя, раз ты так умен.
Как сделать allocate_pid так, чтобы оно в случае невозможности выделить пид не заезжало на мютекс, а возвращало -1?
Возьми за основу этот свой https://ideone.com/gyhVuB
1. Заведи в начале функции переменную, в которую будешь писать возвращаемое значение (ret), инициируй ее отрицательным значением (типа ошибка по дефолту).
2. В цикле вместо освобождения мьютеска и выхода из функции сделай присвоение ret = next_pid+PID_MIN; а потом break;
3. После окончания цикла сделай pthread_mutex_unlock(&mutex); а потом return ret;
А нафига там S я так и не понял, оно только при печати используется?
школьник-кун
https://ideone.com/KuTw1F
вот как оно выглядит сейчас
То что ты рассказываешь я не понимаю.
Задача:
1)тред обращается в allocate_PID
2)если мест нет, он идет нахуй т.е. сразу получает -1, а не отправляется в мютекс ждать очереди
3)у меня это сделано на 65 строчке, но очевидно неправильно же
В чем разница между cascaded if statement и nested if statement ?
В том что ты, уёбище, не можешь прочитать и подумать головой.
Каскадные = последовательные, вложенные = ну ты понел.
тоесть каскадные это варианты a, b, с а вложенные делят а на отдельные варианты итд ?
Кто дурак , тот сам знает.
Ни в чем. В Си нет никакого cascased if, потому что нет elseif/elif/elsif и т. д. "Выражение" else if - это просто традиционный способ форматирования вложенного if внутри ветки else, чтобы избежать вложенных уровней табуляции. Два варианта по ссылке одинаковы (особенно, если по-другому расставить скобочки), но первый вариант более читаемый, поэтому им и пользуются: http://ideone.com/gTHQUo
нет, так вроде бы не лучше.
Ведь тред должно было выгнать сразу как стало понятно, что нет ПИД. А так он будет жить в мютексе и только потом поймет что его наебали.
В моем варианте хочть шанс был, что его сразу нахуй пошлют.
Спасибо
Там все равно нет гарантии, что ресурс реально есть до захвата мьютекса.
Но если ты думаешь, что с проверкой S перед захватом мьютекса будет быстрее, тогда, добавь if (S<=0) { return -1; } перед захватом мьютекса, как это было в твоем варианте.
Ой.
for (int i = S; i >= 0; i--)
{
bitArray = int((a >> i) & 1);
}
А как обратно? Не соображаю уже.
комбинирование if, switch, условного оператора ?: даешь мощь
боятся использовать goto
но зачастую эти трюки программеры не знают
и почему то не умеют по быстрому лабать высокоуровневые конструкции типа таблиц переходов или машины состояний
> перевод десятичного числа в двоичное
>>722176
По-твоему, в памяти `a' хранится в десятичном виде, а не в двоичном?
Я так понял, ему надо массив типа ((int[]) { 1, 0, 0, 1 }) обратно в один int собрать. Собственно, там OR аккумулятора с очередным элементом массива, сдвинутым на i бит влево, только и всего.
>>722217
Можно и в десятичную. Реализовываешь сложение и с песней начинаешь складывать степени двойки. Ну или можно нечестным способом, табличками, как советует этот >>722207. А вообще, если хочется ебли битов, лучше какой-нибудь HDL учить, там от этого хоть польза есть.
>Собственно, там OR аккумулятора с очередным элементом массива, сдвинутым на i бит влево, только и всего.
n += (n | (array << i));
Ебин.
Разметка съела индекс i у array.
т.е. я объявляю переменную беззнаковый лонг АА
пишу AA = ((BB5.06)/1024)3.05
как будет вычислять программа? после каждой операции выкидывать все, что после запятой или сначала все высчитает с десятыми долями, и потом уже в финале отбросит нецелое?
В конце. При вычислении выражения все аргументы приводятся к одному самому широкому типу (из присутствующих в выражении) и вычисляется. Потом то что получилось приводится к типу результата. При чем, если я не ошибаюсь, не уверен, "широта" типа определяется максимальным выразимым числом - тоесть беззнаковый тип считается более "широким" чем знаковый того же размера.
Желательно самому взять стандарт (драфт в шапке) и почитать про integer promotions (6.3.1.8).
>>722740
> Чому нi
У тебя правильно, у него нет. У него можно выкинуть | и оставить только +=, тогда тоже ок будет.
Алсо, у нас скоро бамплимит. Кто-нибудь хочет что-нибудь в шапку добавить?
Так уж вышло, что надо перенести лабу на Линукс. Нахуя - не знаю, но надо.
Ок. Запускаем в виртуалке Бубунту. Копипастим рабочий код, любовно высранный и отлаженный. На Винде 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]
}
^
???
На Винде всё отлично работает, а тут даже не компилится.
Посоны, втф? Как же св. Кросплатформенность и прочее?
Так уж вышло, что надо перенести лабу на Линукс. Нахуя - не знаю, но надо.
Ок. Запускаем в виртуалке Бубунту. Копипастим рабочий код, любовно высранный и отлаженный. На Винде 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]
}
^
???
На Винде всё отлично работает, а тут даже не компилится.
Посоны, втф? Как же св. Кросплатформенность и прочее?
>Jon Erickson "Hacking: The Art of Exploitation, 2nd Edition" (2008)
Это можно выпилить, так как это не совсем Си. Да и вредоносная для ума рядового читателя, так как не дает теоретической базы, а скорее является чем-то вроде How-To.
> Как же св. Кросплатформенность и прочее?
Ну ты её успешно просрал всякими мокренькими getch() и прочими conio.h
Ну ты с этим аккуратнее, а то сейчас прибежит коллбэк-даун которому тут посоветовали начинать с этой книги, и сорвёт покровы с очередной нихуя не логичной абстракции (коллбэка).
ох лол.
>различия в символах перевода строки если один и тот же файл компилишь.
да ну, пример можешь?
А как же хуйня с объявлением переменных/функций? Ебаные прыщи, нихуя не работает из коробки.
Почитай стандарт, придурок. Твоего getch'а там нет. VS не следует нормально С стандарту. А под твою сперму, никто подстраиваться не будет. Зато getch есть в Ncurses.
В шинде это \r\n
В нормальных системах это \n
Либо форматни руками, либо открой в нормальном редакторе/иде.
>А как же хуйня с объявлением переменных/функций? Ебаные винда, все работает через жопу. Заебала MS свои несовместимые стандарты клепать.
>>723462
>2016
>\r\n
А я думал любой уважающий себя редактор автоматом подстраиваться под это.
или \t ? у меня куча старых файлов в в разных вариантах - всё норм. да и с чего бы нет, на с можно в 1 строку всё написать.
я уже запутался кто тут кто, ещё раз, покажите мне пример, чтоб компилятор ругался на присутствие обоих стилей перевода строки в одном файле.
поздравляю, там нет комментариев в виде //
Нахуй иди. Мне не нужен ни древний стандарт, ни прыщи, мне надо закрыть лабу.
Чего ты порвался?
Да. Бугурт. Почему в нормальных системах все заводится с полпинка, а в Windows все через жопу сделано и не совместимо ни с чем?
>>723524
>Нахуй иди. Мне не нужен ни древний стандарт, ни прыщи, мне надо закрыть лабу.
>Мне не нуженстандарт,
Скорее спермоблядь-неосилятор портит жизнь белым людям.
>>723262
И что? Лучше вместо этой книжки почитать интеловский мануал по процессорам, мануал по башу, мануал по перлу, K&R и Прата и что-нибудь по системщине (Роберт Лав допустим) и по ИБ. Куда полезнее будет.
>Почему в нормальных системах все заводится с полпинка, а в Windows все через жопу сделано и не совместимо ни с чем?
Да совместимо там со всем. У меня собирается и в винде, и в линуксе.
Но лабодауну подавай какое-то непонятное getch().
>Да совместимо там со всем. У меня собирается и в винде, и в линуксе.
Более-менее нормальную поддержку С11 там вроде только недавно завезли. VS годится только для крестов и шарпа с бейсиком, но не для няшной. Плюс у них собственное WinAPI. Впрочем, WinAPI дело такое. Принципы то схожи, только другими словами. Также проблема \r\n.
>Но лабодауну подавай какое-то непонятное getch().
В универах до сих пор используют древние стандарты. Я в универе вместо крестов учил Си с классами и на VS 6.0.
вот бы новый printf, с нормальными типами, а не макросные костыли... хотя в нормальном коде его наверно и не должно быть, printf а.
Толсто.
Это копия, сохраненная 12 мая 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.