Этого треда уже нет.
Это копия, сохраненная 12 мая 2016 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
78 Кб, 792x1023
C Programming Language #5 #683573 В конец треда | Веб
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годныму средству программирования как на системном, так и на прикладном уровне.

Что читать:

- Классика от Отцов: 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
#2 #684023
Имеет ли значение: писать if(NULL == (p = malloc(sizeof(int)))) или if((p = malloc(sizeof(int))) == NULL)?
>>684129
#3 #684129
>>684023
Первый вариант лишь частично защищает от = вместо ==, а воспринимается намного хуже. И смысла в нем нет - сейчас на присваивание внутри условия ругается каждый первый компилятор.
Второй вариант норм, но он не очень удобен, если вместо malloc вызов с большим количеством аргументов (привет, Windows API). Можно либо смириться с этим, либо писать так:
p = malloc(sizeof(int))
if (!p)
Этот вариант хорош еще и тем, что заодно с C99 позволяет определить p в месте использования и сразу же его инициализировать.
Алсо, вместо sizeof для типа в malloc лучше использовать sizeof(∗p). Если в будущем ты поменяешь тип p, у тебя ничего не свалится от того, что ты забыл поправить malloc.
>>684190
#4 #684190
>>684129

>сейчас на присваивание внутри условия ругается каждый первый компилятор


GCC не ругается. А что можно почитать о различных компиляторах для прокачки скилла реверсинга и оптимизации?
>>684285
#5 #684285
>>684190

> GCC не ругается


-Wall же http://ideone.com/WHCLLp

> для прокачки скилла реверсинга и оптимизации


По реверсингу beginners.re и Криса Касперски по вкусу (про оптимизацию тоже немного будет). Ну и потом мануал к своему компилеру, наверное.
#6 #684302
>>684285
Еще в одни скобки условие оберни -- перестанет.
>>684463
#7 #684452
>>684285

>beginners.re


О, спасибо. Иногда все-таки не жалею, что заходу на этот парашный чан.
#8 #684463
>>684302
Скобки - это неофициальная, но опять же поддерживающаяся большинством магия для тех, кто упорно хочет писать if (p = malloc(...)). Но суть не в скобках, суть в том, что писать константу слева от == незачем, потому что диагностика давно есть.
#9 #684634

>int main(int argc, char *argv[])



Почему к массиву указателей argv может применяться инкремент argv++? Ведь именам массивов нельзя присваивать новые значения, их нельзя изменять.

Пример кода:

>while((p = #argv++ != NULL)


Здесь сначала указателю p присваивается разыменованный argv, а затем argv увеличивается на единицу.
>>684763>>684836
#10 #684763
>>684634
argv это указатель просто. Если аргументом функции является массив, то он преобразуется в указатель на первый элемент. В сях вообще в принципе нельзя передать в функцию массив как таковой, только указатель на один из его элементов (ну или указатель на массив из n элементов, но это крайне редко используют).
#11 #684823
>>684763
Ну так имя массива - это тоже указатель на ег нулевой элемент, только имя массива нельзя изменять. При компиляции адрес массива везде подставляется в виде адреса.
#12 #684836
>>684634

> Ну так имя массива - это тоже указатель на ег нулевой элемент


Нет. Имя массива - это массив с размерностью, сколько ты там указал и с типом, какой ты там указал. Но если ты используешь имя массива там, где по контексту ожидается указатель, Си для тебя делает из него указатель, причём это рекурсивный процесс, поэтому работает для массивов любой размерности кстати, если ожидается НЕ указатель, то Си НЕ выполняет преобразований, поэтому для int foo[3] выражение &foo получает указатель на int[3], а не на int. А с аргументами для функции по-другому: Си всегда делает из аргумента-массива указатель соответствующего типа, это одна из проблем языка, которая часто приводит к ошибкам например, в коде типа int foo(int args[3]) { memset(args, 0, sizeof(args)); ... }.

> При компиляции адрес массива везде подставляется


При компиляции массив вообще может исчезнуть как кусок памяти и целиком перекочевать в инструкции. Не думай про компиляцию, думай про сам язык.
#13 #684838
>>684763

>указатель на массив из n элементов


вроде он трансформируется в обычный указатель
http://ideone.com/RZq2UX
#14 #684842

> указатель на массив из n элементов


У тебя просто массив, который трансформируется в указатель на элемент. А >>684763 говорит про указатель на массив, это было бы int (∗s)[1].
#15 #684866
>>684763

> В сях вообще в принципе нельзя передать в функцию массив как таковой


Вообще то можно, достаточно массив обернуть структурой и благопочтенная Сишечка будет его туда-сюда гонять при вызове функции.
>>684871>>685163
#16 #684871
>>684866
Гонять структуру, а не массив.
#17 #684888
Расскажите по-хардкору, нужно ли в функциях, работающих с деревьями, которые принимают указатель на корень, делать копию этого корня, чтобы с его помощью обойти дерево?

То есть, например, функция вставки: void insert(node *root, int value). Пидорасы в книгах пишут, что внутри функции обязательно надо делать копию root в качестве итератора. Но я всегда обхожу дерево при помощи переданного указателя root, и дерево, однако, не портится.

Ведь аргумент root - это просто адрес корня в стеке. Сам корень находится где-то в другом месте, фукнция его не портит.
>>684895
#18 #684895
>>684888
Не нужно. Вот если ты дерево перебалансируешь при вставке, и поэтому у тебя insert(node ∗∗root, int value), тогда аккуратнее с дереференснутым root. А так, в сишечке все передается по значению, поэтому root - твоя локальная переменная, с которой ты можешь делать все, что хочешь, сохранять ее незачем.
>>684896
#19 #684896
>>684895
Для чего у тебя в сигнатуре указатель на указатель? На сайте с задачами система мне передает просто указатель на корень. Часто вижу, что деревья на си пишутся именно с указателями на указателями.
>>684902
#20 #684902
>>684896
Если ты дерево перебалансируешь, у тебя может смениться корень. Его надо вернуть тому, кто попросил сделать insert. Можно просто вернуть, а можно сразу записать туда, откуда взяли. Так же, как и с insert в linked list, например.
#21 #685140
>>684285

>beginners.re


Чем компилировать и отлаживать программы под ARM и другие архитектуры, отличные от x86, под линуксом?
>>685162
#22 #685162
>>685140
(Кросс-)компилировать gcc, отлаживать чем придется, зависит от устройства.
>>685379
#23 #685163
>>684866

>массив обернуть структурой


Что значит "массив обернуть структурой"?
>>685169>>685191
#24 #685169
>>685163
struct somestruct {
int somearray[123];
};
>>685196>>685225
#25 #685191
>>685163
Это значит переходить на C++.
>>685192
#26 #685192
>>685191
Изыди.
#27 #685196
>>685169
Всё, понял. Бля, почему это нельзя было пофиксить в С11?
Я просто не вижу никакого рационального объяснения, почему так массив передать можно, а как собственно массив нельзя.
>>685221>>685225
#28 #685221
>>685196
Потому что это не баг, а фича.

>Я просто не вижу никакого рационального объяснения


Потому что залупа. Семантически вся работа с массивами – работа с указателями.
>>685293
#29 #685225
>>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);


Так ты передаешь структуру по значению. Это чаще всего не нужно и очень медленно (более медленно только структуры возвращать по значению). Если бы можно было передавать массив таким же образом, не совсем понятно было бы, по значению ли массив передавать или передавать неявно указатель на массив.
#30 #685293
>>685221
Семантически и вся работа с переменными - работа с указателями. И со структурами тоже.
#31 #685379
>>685162
А стоит ли в этой книге изучать другие архитектуры, если меня больше интересует x86-64? Улучшит ли это навыки реверса x86?
>>685405
#32 #685405
>>685379
А почему тебя только x86-64 интересует? Арм сейчас везде, куда же без него, да и с мипсами лично я часто встречаюсь. Алсо, иногда один и тот же код на x86 и ARM очень приятно параллельно реверсить. Поэтому не вижу причин пропускать что-то. Юзермодный асм простой ведь, пока это не какой-нибудь итаниум.
>>685415
#33 #685415
>>685405

>Арм сейчас везде, куда же без него, да и с мипсами лично я часто встречаюсь


Мне не на чем работать с этими микросхемами.
>>685425
#34 #685421
Сосоны, как запустить ебаный CreateThread? Я просто не понимат как это в сишке делается. Как передать указатель на функцию?
>>685430
#35 #685425
>>685415
никто не заставляет компилировать и запускать в обязательном порядке все примеры
>>685473
#36 #685430
>>685421

>Как передать указатель на функцию?


Можно просто имя функции написать на месте аргумента.
>>685432
#37 #685432
>>685430
148 C:\Documents and Settings\shiiiieeeet\My Documents\projects\kek\main.c [Warning] passing arg 3 of `CreateThread' from incompatible pointer type
>>685435
#38 #685435
>>685432
Сигнатура какая у функции?
>>685439
#39 #685439
>>685435
int search(LPSTR lpszPath)
м?
>>685457
#40 #685457
>>685439
На всякий случай попробуй с такой как в документации (что-то типа DWORD WINAPI MyThreadFunction( LPVOID lpParam );), хотя твоя вроде тоже должна пролезть. Может проблема с тем что возвращаемый тип должен беззнаковым быть.
>>685458>>685481
#41 #685458
>>685457

Я пробовал так
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)search, disk, 0, NULL);
Но мне выдает Access Violation
>>685481
#42 #685473
>>685425
Я же все равно не смогу выучить набор инструкций без программирования реальной микросхемы.
>>685476>>685481
#43 #685476
>>685473
Вася. У тебя один хер компилятор на рабочей машине будет, если я не ошибаюсь. Берешь и компилируешь. Микросхем дохуя и больше. Ну под одну архитектуру покодил, а потом ныть будешь, что в другой архитектуре другие ассемблерные инструкции? Притом, что ты на сишке пишешь, тебе вообще похуй на язык ассемблера, который нужно использовать для ебаной микросхемы. Так что оно один хуй тоже самое, что и под разные оси писать. Берешь документацию - пишешь. Компилируешь на локальной машине, а там на микросхему программатором заливаешь. Все, ептыть.
>>685482
#44 #685481
>>685458
Твоя функция __cdecl, а Windows хочет __stdcall как минимум. Не используй касты бездумно, определи функцию верного типа, сигнатуру тебе >>685457 написал, а внутри уже касти LPVOID в нужный тебе в LPCSTR. Или, как вариант, у тебя после создания треда у тебя протухает этот твой lpszPath (ты не дожидаешься, пока тред стартанет, ведь правда?).

>>685473
Окей. Возьми любой дешёвый роутер (длинк, асус). Как думаешь, что за проц внутри? Ну или симуляторы/эмуляторы ищи в интернетах. Банально тот же QEMU умеет в мипсы.
>>685493
#45 #685482
>>685476
Убедил. Просто я до этого писал свои говноподелия на чистом асм чаще, чем на сишке, поэтому сразу же подумал, как я буду писать на асме, если даже запустить программу не смогу.
>>685488
#46 #685488
>>685482

>на чистом асм чаще


Ой не пизди мне только. Чистый асм - это блядь ОПкодами писать. Другое дело, когда ты в масме или фасме макросредой пользуешься и т.д. Я сам на масме всегда пишу, потому и спрашиваю тупые вопросы про то, как блядь указатель на функцию передать, так бы легко просто в eax засунул адрес функции запустил бы все без всякой хуйни. Просто мне было лень рекурсивный поиск файлов реализовывать на масме, я и начал на сишке пейсать.
#47 #685493
>>685481

> (ты не дожидаешься, пока тред стартанет, ведь правда?).


А вот это ты молодец, спасибо.
#48 #685508
http://pastebin.com/savc8Xt2
В общем я не ебу вообще, что происходит. Однозначно можно заявить лишь то, что я туплю.
>>685529
#49 #685529
>>685508
1) Sleep не гарантия, а путь к сложноуловимым багом, это ты знаешь? Не жадничай, выдели памяти под строку и выдай треду указатель. Потом пусть или сам тред указатель память освободит, или ты освободишь, когда все закончится.
2) При отсутствии бита ты должен пропускать CreateThread, а ты что делаешь?
3) Угадай, что происходит, когда while отработает? А происходит выход из main, и винда делает что? Правильно, ExitProcess. Определи массив хэндлов для максимального количества параллельных тредов (или сразу 26 лол) и сделай WaitForMultipleObjects, чтобы дождаться тредов.

Код почти не читал. Может быть, там еще где-то проблемы.
#50 #685800
>>683573 (OP)
есть кто под линуксом сидит? в чём работате?
#51 #685847
>>685800
code::blocks
>>685866
#52 #685866
>>685847
Vim + YouCompleteMe
>>685867>>685954
#53 #685867
#54 #685882
>>685800
Sublime Text, если проект маленький, и без подсказок по аргументам функций можно обойтись.
#55 #685886
Я хочу написать структуру данных, который было бы все равно, с каким типом работать.
То есть мой двусвязный список или куча могли содержать разнородные данные. И второй вопрос, одинаковые данные, но принимать тип поля как аргумент при создании.

(Я не изобретаю шаблоны в плюсах?)
Как это сделать?
#56 #685887
>>685886
Ты изобретаешь лисп. Гугли tagged union.
>>685892>>685897
#57 #685892
>>685887
Ничего не понял, но независимо от тебя нашел void*
>>685894
#58 #685894
>>685892
struct{ int tag; void* data;};
#59 #685897
>>685887
Кстати в программы на Common Lisp можно вставлять код на сишке.
#60 #685898
>>685886

>То есть мой двусвязный список или куча могли содержать разнородные данные.


То есть первый элемент содержит инты, второй элемент содержит массивы символов, так что ли?

>одинаковые данные, но принимать тип поля как аргумент при создании.


В смысле создавать произвольное количество элементов произвольного типа внутри какой-нибудь структуры?
>>685899>>685993
#61 #685899
>>685898
Ну он же сказал - шаблоны. Он хочет оптимальный типизированный контейнер. И нет, так на сишке сделать нельзя. Можно или пердолиться в C11 _Generic, или делать теги, юнионы и огромные свитчи, или запоминать размер элемента и пердолиться с указателями на void.
>>685993
#63 #685945
>>685954
#64 #685954
>>685945
>>685866
ёбу дали?
там хотя бы поиск есть по тексту?
>>686126
#65 #685993
>>685898
Да, примерно так. Я хотел и типизированный контейнер, и "общий", ну, как списки в Петоне.
>>685899
Правильно понимаю, что свитчи/юнионы/дженерик, это если у меня есть определенный набор типов, с которыми я бы хотел работать?
А если хочу обобщенный алгоритм, только с void* и size_t?

И почему в няшной нет шаблонов?
#66 #685995
>>719992
#67 #686002
>>685993

>А если хочу обобщенный алгоритм, только с void* и size_t?


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

>И почему в няшной нет шаблонов?


Есть, но они тебе не помогут, это чисто для компайл-тайма.
#68 #686016
>>685993

>И почему в няшной нет шаблонов?


Потому что этот язык старше твоей мамаши. За шаблонами gcc заменяешь на g++ и пишешь на сишечке с шаблонами и строгой типизацией.
>>686045
#69 #686045
>>686016
Ну это ты зря. Плюсы тоже немолодой язык во времена, когда Страуструп писал этот свой "глубокомысленный комментарий + 2", в плюсах тоже никаких шаблонов не было.
>>686112
#70 #686109
>>685993

>И почему в няшной нет шаблонов?


Потому что нет перегрузки функций.
#71 #686110
>>685886

>Я хочу написать структуру данных, который было бы все равно, с каким типом работать.


void★
#72 #686111
>>685944
Сказано же "произвольные".
#73 #686112
>>686045
Когда там не было шаблонов, это был именно си с классами, так и назывался.
Понятно что не молодой, но явно моложе переносимого ассемблера.
#74 #686126
>>685954
лол, да
#75 #687032
Посоветуйте что-нибудь по кодстайлу в современном Си
>>687808>>688867
#77 #688839
>>683573 (OP)
Как прокачаться до крутого сишника, при упоминании зарплат которого тянки начинают течь?
#79 #688882
>>688867
Куча бреда.
>>688892
#80 #688892
>>688867
>>688882
Хотя нет. Более-менее нормальные советы, кроме бреда про "используйте только (u)intX_t"
#81 #689057
>>688867
Эту статью обоссали все, кто мог. Самое простое, что можно с ней сделать, чтобы не пришлось долго и мучительно разбираться, что там правильно и что нет - не читать ее вообще.
>>689307
#82 #689271
Сейчас работаю скриптомакакой в одной конторе. Параллельно учу джаву чтобы наняться программистом в другое место. Сегодня имел разговор с главным программстом который сказал что мне нужно учить си. Если освою его то в связки с джавой буду нарасхват. Он вообще по делу говорил? Параллельное знание двух этих языков вообще кому нибудь нужно?
>>689288>>689354
#83 #689283
Сейчас все компиляторы поддерживают C11, не будет такого что придётся переделывать код из-за обосравшегося компилятора.
>>689354
#84 #689288
>>689271
Я не знаю как насчет другой параши, но всегда удобно иметь С обычные и еще какой-нибудь говно язык.

Проблема со скоростью? врубил профилирование в говно-языке, перепелил на Си, подрубил как модуль.

Нужно написать драйвер, хуяк-хуяк и готово.

Модуль-плагин к апачу, да не вопрос.

Насчет связки с джавой, как-то сомнительно. Лучше в Джава-Треде спросить.
>>689354
#85 #689307
>>689057
Что там не так? Нормальный совет про коды возврата, также я не знал про почти всегда равную скорость calloc и malloc, и про padding в структурах (впрочем, нахуй надо занулять пед-байты, я так и не понял)
>>689354
#86 #689338
Анон я не тролль и вероятнее всего не пидарас но у меня довольно странный вопрос: В юности учил С как язык программирования просто что бы знать. Сейчас знаю C# и соответственно понимаю С на уровне общих конструкций и каких то остаточных воспоминаний. Зачем сейчас используют С? какая польза от него может быть в реальном мире. Стоит ли переучиваться на него? Чем я смогу заниматься? какие перед-мной откроются горизонты?
>>689377
#87 #689354
>>689307

> Что там не так?


Хуй знает, я помню только свою попоболь, когда читал это. Там в первых строках есть ссылка на how-to-c-response с более адекватным мнением.

> нахуй надо занулять пед-байты


Я бы тебе запилил кулстори, но рассказывать не умею. Суть в том, что структурку ты можешь сохранить в файл, а паддинг может достигать 4 байт, и паддингов может быть несколько, и в эти несколько групп по 4 байта могут попасть интересные вещи со стека. А если ты послал такое по сети, то могут утечь адреса и нивелировать ASLR в ОС. Много чего может случиться. На самом деле просто не стоит посылать структурки по сети, делая простой memcpy в массив байтов. Надо каждое поле отдельно писать - так и лишнее не утечет, и проблем с порядком байтов не будет.

>>689283

> Сейчас все компиляторы поддерживают C11


На десктопах и распространенных платформах актуальные версии компиляторов могут в C11. Но есть проблемы с либами (тот же пресловутый snprintf в студии). В ембеддед по обыкновению все плохо.

>>689271
>>689288
Ну JNI же. Все верно, в джаву периодически втыкаются нативные либы (когда ждава сама не может во что-то, или просто тупит), которые пишутся на няшной и на плюсах.
>>689399
#88 #689377
>>689338

>Зачем сейчас используют С?


На нём пишут программы.
>>718409
#89 #689399
>>689354
Почему в embedded всё плохо?
>>689597
#90 #689442
https://ideone.com/TVOJ8j
Что я делаю не так? tcpdump говорит, что у моего icmp неправильная чексума.
>>689463>>689479
#91 #689463
>>689442
Сам спросил - сам ответил.
#92 #689479
>>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.
#93 #689585
Писал в ньюфаг тред. Напишу и сюда.
Что вообще сложного в кодинге? У меня есть 2 друга, оба программисты, один пишет сайты, другой как он мне сказал "Software Engineer, пишу на C++ в основном". Так вот я решил приобщиться, выбор пал на Си, прочитал пару книжке.
И мне говорили пиздец как тяжело. Но код просто делает, то что я и только быстро, получается я просто записываю свои мысли в виде команд. Хули они орут что сложно?
Последнее что я написал по просьбе моего друга это
1) Херня, которая ищет самый короткий путь в графе
2) Херня, которая складывает двумерные массивы
Обе я сделал довольно быстро и просто, сначала написал на бумаге как я делал задачу, потом перенес в компилятор. Мой друг после того как я их решил взбугуртил и дал мне задание, цитирую "Алгоритм, который будет сжимать jpeg без потери качества, с коээфициентом минимум 2".
Пока не знаю как делать, вообще даже куда двигаться, вообще почитать про алгоритмы Хаффмана и Шенона-Фано, но понятного мало. Подскажите по этой теме.
Сам я занимаюсь математикой, программировал только в школе, ну и сейчас около 3 недель. Работаю в местной шараге, учу детей. Самому мне 26, взяли меня сразу, нехватка у них кадров.
#94 #689597
>>689399
Потому что не везде гцц свежий?
#95 #689628
>>689585
Jpeg работает так: картинка делится на блоки, к блокам применяется дискретное косинусное преобразование, далее низкие частоты забиваются нулями (поэтому это сжатие с потерями) и далее сжимается алгоритмом сжатия без потерь (про которые ты зачем-то решил читать, хотя это не так важно).
Улучшить в 2 раза без потери качества можно, например, заменив ДКП на вейвлеты, получится алгоритм jpeg2000.
>>689659
#96 #689630
>>689585

>написал на бумаге как я делал задачу


Да, вот эта часть сложная. Математикам как правило хорошо дается программирование.

Ну и при написании программ, которые не умеющаются в один экран, возникает множество проблем.
>>690013
25 Кб, 643x192
#97 #689650
Подскажите пожалуйста, где я просчитался? Тоже вот решил сырыми сокетами увлечься.
https://ideone.com/geVltB
И выхлоп tcpdump'а.
>>689656>>689766
31 Кб, 640x152
#98 #689656
>>689650
Немного не тот выхлоп (без данных). Вот тот, хотя ничего не изменилось почти.
>>689766
#99 #689659
>>689628
Звучит сложновато, ладно, пойду читать и пытаться делать.
#100 #689705
>>689585

>Что вообще сложного в кодинге?


Планировать и писать что-то большое, например больше 10-100к строк (у всех разный уровень, когда все разваливаться начинает). А алгоритмы - хуйня, их просто в голове целиком держать.
The Strict Aliasing Situation is Pretty Bad #101 #689726
Может быть, кому-то будет интересно: http://blog.regehr.org/archives/1307
>>689728
#102 #689728
>>689726
Мне страшно туда заходить. Что там?
>>689729
#103 #689729
>>689728
Очередной пост о том, что программа, собранная без -fno-strict-aliasing, может сломаться в любой момент.
#104 #689766
>>689650
>>689656
https://ideone.com/yx4kxK
Решил свою проблему. Дело оказалось в псевдозаголовке.
>>690026
#105 #690013
>>689630

>Математикам как правило хорошо дается программирование.


По части алгоритмов, графов, деревьев и другого говна на стыке с математикой, они, конечно, может и прошаренней. Но сам код, как правило, они пишут просто ужасный, который впоследствии абсолютно невозможно сопровождать.

>>689585

>И мне говорили пиздец как тяжело. Но код просто делает, то что я и только быстро, получается я просто записываю свои мысли в виде команд. Хули они орут что сложно?


https://ru.wikipedia.org/wiki/Эффект_Даннинга_—_Крюгера
#106 #690021
Почему такая строчка скомпилировалась на маке?
unsigned char* array[str.length()];
>>690056>>690091
#107 #690025
>>690013

>Но сам код, как правило, они пишут просто ужасный, который впоследствии абсолютно невозможно сопровождать


Не пизди. Я математик, и код неплохой писал с 15 лет после прочтения книжки, которая прививает правильное именование переменных, методов, продумывание архитектуры. А когда на харкаче в первый раз прочитал, что математики говнокодят, то осилил книгу про чистый код.

Реквестирую в этот ИТТ тред говнокод математиков, который невозможно сопровождать.
>>690115>>690197
#108 #690026
>>689766
Теперь реализуй idle-scan.
#109 #690056
>>690021
Потому что это пидарская строчка.
sage #110 #690091
>>690021
потому что в c99 добавили variable-length arrays. только msvc их до сих пор не поддерживает
>>690237
#111 #690115
>>690025

>Реквестирую в этот ИТТ тред говнокод математиков, который невозможно сопровождать.


Давай ты сначала свой выложишь, может, он как раз подойдёт.
#112 #690191
>>690013

>Но сам код, как правило, они пишут просто ужасный,


Неистово двачаю! Ни разу не видел нормального кода от математиков. Одни названия переменных чего только стоят!
#113 #690197
>>690025

>то осилил книгу про чистый код.


Прочитать это одно дело. А вот используют на практике полученные знания, не многие. Мне кажется, что ты весьма высокого мнения о себе. То, что тебе кажется, что ты хороший программист, не значит что так оно и есть. Будь немножко по скромнее. Я понимаю, что каждому хочется чувствовать себя гением, но все же.
>>690205
#114 #690205
>>690197

>Мне кажется, что ты весьма высокого мнения о себе. То, что тебе кажется, что ты хороший программист, не значит что так оно и есть. Будь немножко по скромнее


С чего ты это взял? Я вообще в последние годы испытываю мало эмоций, а программистом хорошим себя не считаю. О личностных качествах программиста при улучшении своих скиллов когда-то охуенно написал Зомби, лучше не скажешь.
>>690221>>690225
#115 #690221
>>690205

>С чего ты это взял?


Отсюда:

>Хорошим программистом я себя не считаю


>Я математик, и код неплохой писал с 15 лет


Это уже противоречии самому себе. И вообще ты не можешь судить о своем коде объективно.
А здесь, ты просишь у людей предоставить доказательства по сути факта:

>Реквестирую в этот ИТТ тред говнокод математиков


Зачем начинать бессмысленный спор. Докажи людям, что ты хороший программист. Чтобы глядя на твой код говорили: "Оу! Посмотрите на этот замечательный код! А ведь он математик! А я всегда считал, что математики не могут писать нормальный код.... Как же я ошибался!".
Поищи кстати исходники на фортране. Гарантирую, тебе доставит.

>Я вообще в последние годы испытываю мало эмоций


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

> О личностных качествах программиста при улучшении своих скиллов когда-то охуенно написал Зомби, лучше не скажешь.


Не читал, но считаю что программист ничем не отличается от других людей и о нем как о человеке, лучше всего могут сказать окружающие люди.
>>690225
#116 #690225
>>690221
Забыл дополнить.
Впрочем, мы уже отклоняемся от тематики раздела, и начинать споры у меня желания нет. Добра тебе >>690205
24 Кб, 1095x415
#117 #690237
>>690091

> добавили variable-length arrays


> msvc их до сих пор не поддерживает


Это зло, которое в C11 уже наполовину выпилили. И студия, если шланговый парсер выставить, как бы поддерживает только, судя по тому, что подчеркивает, как ошибку, она сама об этом не знает. А вот с их собственным парсером даже __STDC_NO_VLA__ не дефайнит, что, конечно, очень и очень печально.
>>690252
#118 #690252
>>690237

>Это зло, которое в C11 уже наполовину выпилили.


Пруфани. Я просто не помню, чтобы в стандарте С11 было что-то об этом сказано. По крайней мере GCC с флагами -std=c99 и с -std=c11 собирает нормально все.
>>690265
#119 #690265
>>690252

> Пруфани


Зло, потому что хуй знает, сколько его там, этого стека. А "наполовину выпилили" - я имел в виду, что VLA ввели в C99, а в С11 осознали и сделали уже опциональной фичей.
>>690320
#120 #690320
>>690265
ебать ты конченный, анон.
Миллион байт стека для каждого треда. Ты просто, блять, представь, миллион байт! Понятное дело, что если ты олень и все пихаешь в стек, то и никакой памяти тебе не хватит, но для временных структур, например, для строк и около того - просто идеально.
>>690739
#121 #690331
>>690013
Умные слова и термиты, круто, безусловно. Но что ты такого можешь делать чему нельзя так просто научится?
#122 #690336
>>689585

>2) Херня, которая складывает двумерные массивы


А ты это тоже записывал на бумаге? А? Математик!

>1) Херня, которая ищет самый короткий путь в графе


Никогда не имел дела с графами, но думаю это тоже очень просто. Мне вспоминается алгоритм Дейкстры.

>потом перенес в компилятор


Надеюсь, ты просто не правильно выразился.

>почитать про алгоритмы Хаффмана и Шенона-Фано, но понятного мало


Постой. Ты же математик! Как тебе такое может быть слишком сложный. Я правда тоже не осилил (желания наверное не было), но я и не математик далеко.

>программировал только в школе


Тогда это все объясняет. Ты даже не сталкивался с программированием и не в курсе о многих технических моментах. Проблемы далеко не всегда в алгоритмах...
>>690340>>690353
#123 #690340
>>690336

>Никогда не имел дела с графами, но думаю это тоже очень просто. Мне вспоминается алгоритм Дейкстры.


Если он сам вывел алгоритм без помощи литературы, это довольно круто, ящитаю. Другой вопрос, что к самому программированию это относится довольно косвенно.
>>690346>>690353
#124 #690346
>>690340

>Если он сам вывел алгоритм без помощи


Ну да. Я согласен с этим. Я бы врятли быстро смог вывести алгоритм, при условии если раньше я не знал других алгоритмов. А вот по поводу косвенного отношения. Ну как сказать. Уметь в алгоритмы дорогого стоит, так как позволяет решать задачи гораздо быстрее и возможно более оптимальным путем.
>>690357
#125 #690353
>>690336

> А ты это тоже записывал на бумаге? А? Математик!


Ну да, сложил пару матриц, посмотрел, записал как это делается подробно, а потом просто перепечатал в vs.

> Никогда не имел дела с графами, но думаю это тоже очень просто. Мне вспоминается алгоритм Дейкстры.


Прям такого заоблачно тяжелого ничего нет.

> Постой. Ты же математик! Как тебе такое может быть слишком сложный. Я правда тоже не осилил (желания наверное не было), но я и не математик далеко.


Само кодирование простое. Даже пару слов закодировал чтобы понять суть, я имел ввиду непонятно как jpeg сжимать.

> Тогда это все объясняет. Ты даже не сталкивался с программированием и не в курсе о многих технических моментах. Проблемы далеко не всегда в алгоритмах...


Ну память надо контролировать, ну что еще? Ну те аспекты, которые я знаю не такие уж и тяжелые.
>>690340

> Если он сам вывел алгоритм без помощи литературы


Сидел на парах, пока эти решали задачки я написал его. Сложного прям такого, мало если честно.
>>690359>>690363
#126 #690357
>>690346

>Уметь в алгоритмы дорогого стоит


Я не спорю, но как часто среднестатистическому программисту приходиться корпеть над созданием какого-нибудь хитровыебанного алгоритма. Как правило, это единичные случаи. Ну или это может требоваться только в какой-нибудь узкоспециализированной области.
>>690359
#127 #690359
>>690353

>Ну память надо контролировать, ну что еще?


Это только вершина айсберга!

>>690357
У меня от этого:
ПЕРЕВЕРНИТЕ СВЯЗНЫЙ СПИСОК
@
list.reverse()
>>690364
#128 #690363
>>690353

>Сидел на парах, пока эти решали задачки я написал его. Сложного прям такого, мало если честно.


И к какому алгоритму ты пришёл? К алгоритму Дейкстры? Или Джонсона? На каких типах графов работает твой алгоритм? Только на неориентированном? Учитывает ли веса?
>>690412
#129 #690364
>>690359

>list.reverse()


Если ты считаешь, что задача по переворачиванию связного списка относится к хитровыебанным алгоритмам, то у меня для тебя плохие новости. Решение такого рода задач достаточно прозрачно в отличие от поиска наикратчайшего пути в графе. По крайней мере, для меня.
>>690366
#130 #690366
>>690364

>Если ты считаешь, что задача по переворачиванию связного списка относится к хитровыебанным алгоритмам,


Я как раз к тому, что многие "программисты" даже этого не знают. Что уж говорить о работе с графами или еще чем-либо.
#131 #690412
>>690363
Точь в точь Дейкстры. Логика у меня такая же. Мне даже кажется, что я уже видел его, но забыл.
>>690524
#132 #690524
>>690412

> Мне даже кажется, что я уже видел его, но забыл.


Мне тоже так кажется. Вероятность того, чтобы точь в точь совпало в том случае, когда сам создаёшь алгоритм без посторонней литературы, крайне мала.
#133 #690739
>>690320

> для временных структур, например, для строк и около того


Тогда ты либо не ограничиваешь максимальный размер VLA, и привет, неотлавливаемый ни в рантайме stack overflow (или, того хуже, его отсутствие - см. примеры ниже). Либо у тебя есть некий лимит (например, ты знаешь, что максимальная длина этой строки не превысит MAX_PATH, или ты считаешь, что больше тысячи структур тебе не понадобится), тогда ты сразу делаешь массив нужного константного размера и не ебешь себе мозг спорными технологиями. Вот три примера, отличаются константой. Веселой отладки, так сказать расчитано на сборку без оптимизации - мне было лень, но ты можешь обосновать для оптимизатора использование array и memset, и попробовать собрать с оптимизациями.
http://ideone.com/kXaCQy http://ideone.com/926nPb http://ideone.com/KuR1B8

> Миллион байт стека для каждого треда


Зависит от архитектуры, зависит от ОС, зависит от настроек ОС, зависит от способа создания треда, если он не основной.
#134 #690779
>>690013
Двачую. Встречал пару выродков, которые говорили, что они матиматики, а программирование для плебеев.
>>690863
#135 #690818
>>690739

>2016


>stack overflow

#136 #690863
>>690779
Лол! А они точно с математикой были знакомы или они просто говорили так? Просто любой, хоть немного соображающий человек поймет, что сравнивать их нельзя и программирование лишь инструмент для реализации задачи/алгоритма.
#137 #690871
>>690739
Блять, долбоеб, пиздуй отседова нахуй, на кресты, на джаву, но только не няшную.
Ты пиздец долбоеб, ты хочешь создать на стеке массив с ебанутыми размерами и интовыми элементами, сука, блять, дай я тебе ебало обоссу, какой же ты мудааааак, сука, это еще компиль молодец, долбоеба такого терпит, уххх сук не могу, долбоеб блять.

>зависит от способа создания треда


Что ты за хуйню несешь, малохольный блять?
Понятное дело, что размер стека зависит от многих факторов
Ой иди на хуй, сука блять.
>>690880
#138 #690874
>>690739

> Веселой отладки, так сказать


Черт ебаный, ты хоть раз Сишечку отлаживал, блять, сука? Это проще, чем твою мамашу пялить, сука, в отличие от ебущих крестов с их ебучим бустом, это просто сказка, блять, иди на хуй опять сука.

>ты знаешь, что максимальная длина этой строки не превысит MAX_PATH


Блять, как рекурсивно обойти дерево каталогов при этом не пердолясь с маллоком? Сука, иди опять на хуй.
>>690880>>691978
#139 #690880
>>690874
>>690871
БАБАХ!!!
Какой сильный багет у тебя!
#140 #691141
А нам, тем временем, предлагают short float и break 2 в 2021 году успей ознакомиться с C11, пока он еще не протух!
>>691287>>691442
39 Кб, 600x600
#141 #691201
>>683573 (OP)

>2016


>MANUAL GARBAGE COLLECTION

>>691286
#142 #691286
>>691201

>2016


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

#143 #691287
>>691141

>успей ознакомиться с C11, пока он еще не протух


Многие еще на С99 пишут. Так что протухнет С11, лет через 30 как минимум.
130 Кб, 1920x1040
#144 #691354
>>683573 (OP)

>Чем конпелировать:


http://www.programarts.com/cfree_en/index.htm

Для маленьких примеров, самое то, набрал и запустил, шустрая как удар серпом по яйцам, только для винды.
Есть бесплатная урезанная версия, и генератор ключей для полной версии на рутрекере.
#145 #691360
>>691354
Vim+GCC+[GDB].
Для любых проектов, самое то, набрал и запустил, шустрый как удар серпом по яйцам, кроссплатформенный, только на винде в виде MinGW.
Есть бесплатная полнофункциональная версия с открытым исходным кодом.
#146 #691413
>>691354
А как же Pelles C?
#147 #691419
>>691354
Как я понял, это IDE без собственного компилятора, которая, к тому же, 6 лет не обновлялась. А у нас в шапке именно компиляторы студия и Pelles C там потому, что у Microsoft на тот момент актуального компилера отдельно не было, а Pelles C автор не хочет распространять по частям. Не нравится, и хочешь запилить список IDE - вперед, ссылка в последней строке шапки.
#148 #691442
>>691141

>short float


half-precision? Есть в GCC.

>break 2


goto
>>691472
#149 #691472
>>691442

> goto


Ну на самом деле, break с цифрами неудобный, а вот от именованных циклов я бы не отказался. Но так-то да, goto хватает, но у некоторых СТРАХИ.
#150 #691756
А ещё можно clang + msvc/mingw
анальный раб
>>691768
sage #151 #691768
>>691756
Вут?
>>691824
#152 #691824
>>691768
Clang сам по себе под виндой не пашет, нада или msvc, или mingw.
И текстовый редактор, саблайм например.
>>691918>>691942
#153 #691918
>>691824
Ну clang-то пашет, просто хедеров и либ в комплекте нет.
#154 #691942
>>691824

>clang потому, что круто


>И текстовый редактор, саблайм


>msvc для Си


С км я сижу в одном треде...
>>691973
#155 #691963
Посоветуйте отладчик для линукса, чтобы можно было изучать расположение аргументов командной строки в стеке. GDB их не понимает.
>>691966
#156 #691966
>>691963
man gdb, gdb.gnu.org, сука!
>>692010
#157 #691973
>>691942
Шланг для крестов оче хорош - такие то вменяемые сообщения об ошибках, особенно на шаблонах.
>>692029
#158 #691978
>>690874

>Черт ебаный, ты хоть раз Сишечку отлаживал, блять, сука? Это проще, чем твою мамашу пялить, сука, в отличие от ебущих крестов с их ебучим бустом, это просто сказка, блять, иди на хуй опять сука.


ты тупое говно
промышленный код на крестах ЛЕГЧЕ отлаживать чем аналогичный на сишки
почему? да потому что любая си-прога, решающая реальные задачи обмазана макросами и с вырубленой типизацией в добавок, половина говна там будет сделана на void*
в крестах же будут шаблоны, а шаблонизированный код хотя бы будет сожран отладчиком без дополнительных приседаний
#159 #691981
>>691978
Ебать ты дебил...
>>691983
#160 #691983
>>691981
аргументируй или сдохни
>>692001
#161 #691986
>>691978

>промышленный код на крестах ЛЕГЧЕ отлаживать чем аналогичный на сишки


Лол. То-то в крестотреде анон жалуется, что у них компилятор падает от имен функций по 10к символов.
>>691987>>692000
#162 #691987
>>691986
Ты в курсе о разнице между компиляцией и отладкой? Отладка происходит в райнтайме.
>>691993
#163 #691988
>>691978

>обмазана макросами и с вырубленой типизацией в добавок


Сосунок на форте еще не кодил.
>>691989
#164 #691989
>>691988
Как будто ты кодил за деньги на форте.
>>691991
#165 #691991
>>691989
Как будто ты на коболе за деньги когда-то пейсал.
#166 #691993
>>691987

>Отладка происходит в райнтайме


Чтобы в рантайме что-то отладить надо это скомпилировать сначала, так ведь. А потом попытаться разобраться, как шаблоны разворачиваются.
>>692000
#167 #692000
>>691986
Падал от бага, найс пересказываешь, маня.
>>691993
Ну если ты не буст-александерску-степанов-даун – тащемта там всё проста.
>>692009
#168 #692001
>>691983
Да ты уже и сам привел доказательство своей глупости!
#169 #692005
Это все, конечно, интересно, но вы тредом не ошиблись, случаем?
#170 #692006
>>691978
Крестоблядок, съеби в свой загон. Здесь тред белых людей.
#171 #692009
>>692000

>Падал от бага


10к символов токен - уже диагноз. Даже если бы не падало.

>буст-александерску-степанов-даун


Сейчас такая шаблонная магия - обыденный код на крестах. Подключи эйген какой-нибудь, и посмотри на ошибки в шаблонах на пять экранов. А потом посмотри на экзешник на 20 мегабайт.
>>692012>>692014
#172 #692010
>>691966
Что-то я тут 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
>>692020>>692069
#173 #692012
>>692009

>Подключи эйген какой-нибудь, и посмотри на ошибки в шаблонах на пять экранов. А потом посмотри на экзешник на 20 мегабайт.


А потом подключи GSL и заплачь от убогости происходящего.
#174 #692013
А почему еще никто не сказал, что среднестатистический код С++ является не читабильным говном, которое невозможно отлаживать?
>>692014>>692018
#175 #692014
>>692009

>Даже если бы не падало.


Баг – это диагноз, даже если его бы не было. Сам-то понял, что написал?
>>692013
Наверно потому, что это унаследовано от старшего брата-байтослесаря?
>>692021
#176 #692018
>>692013
Почему ещё никто не сказал, сколько ошибок вроде последней в openssl получалось с ахуенного сишного препроцессора?
>>692021
#177 #692020
>>692010
Вроде, set args мне подойдет, попробую.
>>692022
#178 #692021
>>692014
Брат-байтослесарь не ходит блядовать на право и на лево. Поэтому его легко отследить. А вот младшенький постоянно уходит куда-нибудь а при разговоре меняет тему. Хуй поймешь чего он хочет в общем.
>>692018
Почему еще никто не сказал, почему подобные серьезные вещи, которые лежат в основе всего, крайне редко пишут не на Си?
>>692026>>692028
#179 #692022
>>692020
Просто не спеши заявлять про отсутствие какого-либо функционала, если не прочитал даже официальную документацию.
#180 #692024
Если язык- оружее, то
Си- это ебаная анимешная катана, разрезающая танк пополам.
Не очень удобно.
Кресты- катана с примотанным скотчем гранотометом. И калашниковым. И штык-нож на всякий случай.
#181 #692026
>>692021

>которые лежат в основе всего, крайне редко пишут не на Си?


Все основные библиотеки, на которых держатся ОС и веб - сишные. На крестах - только клиентское говно вроде текучих гюлчных браузеров с дырявым флешом.
>>692040
#182 #692028
>>692021
Потому что это переносимый ассемблер, под который везде есть компиляторы (и их легче писать/дополнять), abi можно потянуть хоть из пуревасика, средств для запутывания кода упоротыми даунами вроде авторов буста (что отлично в основном для опенсорса).
>>692030
#183 #692029
>>691973
Чтобы шаблоны отлаживать есть metashell, а не этот ваш clang.
#184 #692030
>>692028

>средств для запутывания кода упоротыми даунами вроде авторов буста


Нету*
#185 #692033
>>692024

>Си- это ебаная анимешная катана, разрезающая танк пополам.


>Не очень удобно.


>Кресты- катана с примотанным скотчем гранотометом. И калашниковым. И штык-нож на всякий случай.


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

>На крестах - только клиентское говно вроде текучих гюлчных браузеров с дырявым флешом.


А браузеры используют смесь языков. GUI на GTK к примеру и у хрома и у лисы.
#186 #692037
>>692024

>Кресты- катана с примотанным скотчем гранотометом. И калашниковым. И штык-нож на всякий случай.


И всё функционально шо пиздетс.
#187 #692040
>>692026
Читай внимательнее, что цитируешь. Алсо, флеш частично написан на си. Алсо, языкосрачи ненужны. Лучше proposal для C2x напишите, лол.
>>692127
1553 Кб, 480x272
#188 #692042
>>692024

> Кресты это

>>692054
#189 #692054
>>692042
Отлично подходит к примеру с катаной! Вся суть!
#190 #692069
>>692010

>~# man GDB


>No manual entry for GDB


попробуй man gdb сука откуда вы только лезете
#191 #692127
>>692040

> флеш частично написан на си


О, мы помним тонны говна от пользователей флеша.
Тупорылые разработчики флеша не прочитали, что memcpy нельзя использовать на перекрывающихся диапазонах. До поры-до времени всё работало, а потом в libc поменяли реализацию memcpy и оно стало портить память при неправильном использовании.

Самое что меня тогда шокировало — что 95% ругали разработчиков libc, мол вот они какие говнюки, ради говнофлеша не могут запилить "работающий" memcpy обратно.
>>692178
#192 #692178
>>692127

>Самое что меня тогда шокировало — что 95% ругали разработчиков libc, мол вот они какие говнюки, ради говнофлеша не могут запилить "работающий" memcpy обратно.


О да, в прошлых тредах как-то эта тема проскакивала. Вроде там даже пришлось какой-то воркэраунд приделывать.
>>692218
#193 #692218
>>692178
У адоби же корпоративное рабство и вся хуйня. После покупки макромедии в конторе одни индусы, о каком качестве кода можно говорить вообще?
#194 #692466
>>683573 (OP)
Сосоны, что я делаю не так?
[Linker error] undefined reference to `fput'
fputs((const char *)buf, f);
#195 #692479
>>692466
Именно на fput? Что-то странное. Что за компилятор?
>>692507
#196 #692507
>>692479
gcc в dev c++
#197 #692532
>>692466
Либки проебал.
>>692536
#198 #692536
>>692532
Ну это-то понятно (неправильный library path или еще по каким-то причинам -lmsvcrt и -lmingwex не указываются автоматически или отсутствует). Непонятно, почему fput. В mingw вроде таких макросов не было никогда.
>>692568
#199 #692568
>>692536
Флаги компилятору задаёшь или линковщику? С printf'ом линкуется?
>>692577
#200 #692577
>>692568
С printf все нормально. А вот с fputs фуфло какое-то.
#201 #692582
>>692466

>[Linker error] undefined reference to `fput'


>fputs((const char *)buf, f);


> fput, fputs?


Кто-то здесь пиздит.
>>692723>>693149
9 Кб, 394x131
3 Кб, 321x56
#202 #692642
Да вы ебанулись. GCC нормально видит и без пердолинга все это дело. Он либо проебал stdio.h либо пиздит. Насколько я помню, в devcpp, не было вообще никаких проблем ни с чем.
>>692723
#203 #692656
Есть комплюхтер A, он пытается соединиться с приложением на 0.0.0.0, я хочу, чтобы моя программа слушала всё на этом адресе и чтобы наружу ничего не протекало. Какая библиотека?
>>692658>>692675
#204 #692658
>>692675
#205 #692675
>>692658
>>692656
Так, я упоролся, игнорируйте сообщения.
>>692855
#206 #692723
>>692642
>>692582
Короче, анон нюфак, компилит плюсовый код, а без extern "C" у него протекает.
>>692753
#207 #692753
>>692723
Тогда бы было либо замангленное имя в выхлопе, либо прототип.
#208 #692855
>>692675
Скажи как сделал в итоге
#209 #693105
>>692466
попробуй с -lc скомпилировать
#211 #693151
>>693149
Ctrl+F -> fput -> PROFIT!!!
Если не кинешь сюда весь код, ты зачисляешься в почетные врунишки и можешь уходить отсюда.
>>693154
#212 #693154
>>693151
лол, а рили, там выше был fput. Сорян, сосоны.
>>693226
#213 #693225
Ребят, есть ошибка:
http://pastebin.com/ma2BsVbR

Есть sep_crypto.c:
http://pastebin.com/Pdd8aPRs

И есть sep_driver_api.h:
http://pastebin.com/sZ0TcNFg

Собственно, никак не могу пофиксить. Помогите профану, пожалуйста, и подскажите, как в будущем фиксить подобное.
#214 #693226
>>693154
А знаешь, какая тут мораль? Собирать надо обязательно с -Wall -Wextra и прочими -W по вкусу. Тогда бы тебе сказали про implicit function declaration, и не пришлось бы столько выяснять, откуда взялся fput.
>>693540
#215 #693540
>>693226
-Wereverything -Werror
мимошланг
>>693555
#216 #693555
>>693540

>foo.c:5:10: error: expansion of date or time macro is not reproducible [-Werror,-Wdate-time]


> puts(__DATE__);



Нахуй. Пока когтеед жив, пока шланг вместе с гцц следуют его глупому предложению, никаких -Weverything рядом с -Werror. У него возникнет очередная ебанутая идея, а билд сломается у меня. Нахуй. Да, это батхерт.
#217 #693649
Ананасы, прочитал на досуге книжку "TDD for embedded c" загорелся идеей вставлять тесты везде где можно. Обмазался Unity, разобрался, как его прикрутить к проекту. Но вот что дальше - в душе не ебу. Есть ли где примеры или туториалы, где показано, как можно сишный быдлокод покрывать тестами. Не обязательно с Unity, можно любой другой фреймворк.
>>693712
#218 #693712
>>693649

>Есть ли где примеры или туториалы, где показано, как можно сишный быдлокод покрывать тестами.


Если он с глобальными переменными, то не надо его уже покрывать тестами, это бесполезно уже, подробности на fprog.ru
>>694199
#219 #694199
>>693712

> то не надо его уже покрывать тестами, это бесполезно уже


У нас за такое на Therac облучают и F18 шасси убирают.
4 Кб, 400x400
#220 #694418
Аноны, вопрос:
У меня есть символьная строка (с буквами)
Мне надо вывести определенный элемент массива
printf("%d\n", line[5])
Программа вывод не саму букву, а её код.
Если писать %s, то завершает работу
Как сделать так, что бы именно саму букву выводил?
мимоличинус
>>694420>>694423
#221 #694420
>>694425
#222 #694423
>>694418
%c (character)
>>694425
#223 #694425
>>694420
>>694423
Благодарю
#224 #694860
>>683573 (OP)
Ребят, извиняюсь за оффтоп. Подскажите, Сишка и ARM сейчас в тренде? В какой стране легче всего работу найти, просто в моей белорашке нихуя нет. Вот и остановился я на распутье, изучать дальше арм или перекатывать.
>>694881>>719773
#225 #694881
>>694860
Тебе переезжать не впадлу из-за работы? Вообще в тренде. В дсах вакансии есть
>>695037
#226 #695037
>>694881
Я бы не сказал, что прямо "в тренде" - удаленку, например, найти сложнго. Но вообще работа есть.
>>695705
67 Кб, 420x640
#227 #695169
>>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

Без пробелов все собирается, потом линкуется отдельной софтиной и запускается. С пробелами вылазит это говно.
Как я понимаю, оно воспринимает путь с пробелом как два отдельных файла, даже в кавычках? Можно это как-то обойти?
>>695189
#228 #695189
>>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/ посмотреть, вдруг найдешь решение там.
>>695213
#229 #695213
>>695189

> А запускаешь напрямую команду из консоли, или IDE запускает? Или батник какой-нибудь? Никаких start перед gcc?


Батник, вот так:
for /r %file% i in (*) do (
echo Compiling "
i"…
gcc "%%i" -c -O3 -mthumb -mthumb-interwork
)


> например, сделать симлинк на проблемную папку


Лол, я так и сделал, но хочется нормального решения, а не костылей.
>>695215>>695236
#230 #695215
>>695213
Макаба сожрала проценты, вот, короче:
http://pastebin.com/Kjfb33nq
>>695236>>695242
#231 #695236
>>695213
>>695215
Ну и да, чтобы не было лишних вопросов:
%file% — местоположение папки с сорцами, gcc прописывается в PATH в начале батника, то же самое и с CPATH.
#232 #695242
>>695215
Напиши однострочник с GetCommandLine (и заодно с итерацией по argv), посмотри, что получается. У меня вот получается вроде норм разбивается, в argv[1] попадает имя файла с пробелами - проблема в гцц? Возможно, gcc.exe парсит правильно, а в cc1.exe уходит уже не то? Возьми Process Explorer от SysInternals, посмотри опять же. Если найдешь причину ошибки, можно или откопать исходники старые и поправить, или просто даже бинарник пропатчить.
sage #233 #695249
>>695242
Бля, Process Monitor, конечно.
>>695264
41 Кб, 671x552
#234 #695264
>>695242
>>695249
Попробовал запустить из консоли — то же самое. Это что получается?
#235 #695268
Получается, что дело в гцц. Новый-то собрать никак?
>>695270
79 Кб, 246x232
#236 #695270
>>695268
Я что-то очкую. Это как первый секс почти.
#237 #695272
>>695264
Создай нового пользователя без пробелов в имени.
>>695275>>695397
#238 #695273
>>695264
Добавь в PATH путь до gcc c либками.
>>695276>>695397
#239 #695275
>>695272
Блин, я же писал уже, что это костыль. Я спокойно и симлинкнуть могу, и в другую папку конпелятор и сорцы перенести — но хочется именно разобраться в настройке, а не идти на уступки.
>>695290
3 Кб, 371x118
#240 #695276
>>695273
Лол, это вторая строка моего батника, первая — @echo off.
#241 #695290
>>695275
В линукс-мире принято экранировать проблел обратным слешем, а не заковычивать ввод: gcc yoba\ s\ probelom.c
>>695397>>695661
99 Кб, 202x202
#242 #695397
>>695290
>>695273
>>695272
>>695242
Лол, разобрался. Надо было в батнике длинное имя преобразовать в короткую версию формата 8.3.
Какие-нибудь подводные камни есть?
>>695924
#243 #695661
>>695290
И очень плохо. Лучше лишний раз заковычить параметр, чем потом удивляться, куда делся весь /usr/ после установки Bumblebee
#244 #695705
>>695037
Удалёнку в эмбеде найти сложно по всему мира, потому что прибор это физический объект, и эмбед тесно связан с фищическим пердоленьем.
#245 #695710
>>695264

> ls в виндовой консоли


Is this real life.jpg
>>695764
#246 #695764
>>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
Можно как-то сделать так, чтобы было насрать на порядок компиляции?
#247 #695768
>>695764
Ссылка приклеилась.
#248 #695788
>>695764

>Можно как-то сделать так, чтобы было насрать на порядок компиляции?


По-моему если не использовать .so и .a либы, то на порядок насрать.
#249 #695912
>>695764
И так насрать. А вообще пиши makefile с implicit правилами, пусть он сам думает.
>>695917
#250 #695917
>>695912
cmake надо использовать, ну сколько можно-то
>>696168
#251 #695924
>>695397
На SO нашёл решение?
>>696573
#252 #696000
Антонусы, поясните ньюфагу про скрипты для линковщика. Их обычно в ручную пишут?
>>696049>>696066
#253 #696049
>>696000
Нет, обычно он уже написан и тебе даже не надо его указывать, линкер его сам использует.
#254 #696066
>>696000
То есть, он даже не хранится в виде отдельного файла, а встроен в линкер.
>>696175
#255 #696168
>>695917
CMake нужно сжечь хотя бы потому, что там в готовых настройках под венду дикий хардкод путей и куча неправильных предположений.
#256 #696175
>>696066
В тех линкерах, которые умеют в скрипты, в том числе и в ld, скрипты лежат в файлах. В более узко специализированных линкерах, типа MS-ового link.exe алгоритмы работы захардкожены.
>>696563
#257 #696227
Ещё вопросик, объявляю строку типа char* str = "Blablabla"
Почему sizeof(str) возвращает размер указателя 4, а не размерность массива?
#258 #696230
>>696227
Потому что str это указатель.
>>696233
#259 #696233
>>696230
Спасибо, нагуглил ответ и понял свою ошибку.
#260 #696234
>>696227
Посмотри выше по тредику про массивы. Ты объявляешь указатель на анонимный массив (const) char. Чтобы объявить именно массив, делай так: static const char str[] = "Blablabla"; - так sizeof будет работать, как ты ожидаешь. static тут затем, чтобы массив попал в сегмент данных, а не создавался каждый раз при входе в функцию, а const, чтобы не было неожиданностей.
#261 #696542
Чую что вопрос мега очевидный, но все равно задаю т.к. мне нужен на него ответ.
>>696544
#262 #696544
>>696542
Нет.
#263 #696563
>>696175
Ну и где лежит дефолтный линкер, котрым ld пользуется?
Прогнал ld --verbose под strace, он нихрена похожего на ld-скрипт не открывал.
>>696617
#264 #696571
>>696227
Кекнул с тебя.
#265 #696573
>>695924
Ты про порядок линкования?
>>696576
#266 #696576
>>696573
Какой порядок, я на сообщение про 8.3 отвечал
>>697282
#267 #696617
>>696563
Ну так-то скрипты просто и банально лежат в /lib/ldscripts/, но, возможно, я ошибаюсь, и какой-то дефолтный вариант и правда вшит.
>>696625
#268 #696625
>>696617

> -Wl,-verbose


>> using internal linker script


Прошу прощения, ты был прав.
>>696696
#269 #696696
>>696625
Нет, ты был прав. Я имел в виду дефолтный, но забыл про это явно написать.
350 Кб, 1280x942
#270 #696703
2000 российских рублей на киви тому, кто покажет-расскажет как получать https странички

умею нешифрованные сокетами

для связи - forsQH(sl123ANUSmPA{ailPUNCTUMr$I}u
>>696705
#271 #696705
>>696703
curl https://example.com

Отправил номер кошелька на почту.
>>696708
#272 #696708
>>696705
не умею эти ваши английские

хочу что бы рабочий пример с комментариями
>>696714>>697006
#273 #696714
>>696708
Отправил тебе за щёку.
Проверяй.
#274 #697006
>>696708
https://curl.haxx.se/libcurl/c/https.html рабочий и с комментариями.

> не умею эти ваши английские


На 2000 купи себе словарь.
>>697084
#275 #697084
>>697006
а post тоже может?
>>697086
#276 #697086
>>697084
Он во многое может. Тыкни там огромную ссылку Examples, и сам увидишь.
#277 #697282
>>696576
А, я понял, сам доэкспериментировался.
#278 #699203
Господа, может пояснить за такой вот пример?
https://ideone.com/ZR1bsW
(увидел в местном прочитал-проиграл треде)
>>699237
#279 #699237
>>699203
А что тут пояснять? Всё очевидно же. В scanf нельзя указать размер буфера, что позволяет этот самый буфер переполнить используем fgets, парсим руками. В check_authentification размер буфера еще меньше, чем в main, но при этом используется strcpy, которой тоже нельзя указать максимальный размер тут чуть сложнее, потому что очевидный выбор новичка - strncpy - внезапно тоже сломана, что позволяет переполнить буфер и возможно затереть auth_flag. Ну и мелочи всякие еще, типа паролей открытым текстом в коде, при наличии которых даже переполнять ничего не нужно храним соленые хэши, притом в конфиге, потому что хардкод тоже зло, хотя за Кэрролла лойс.
>>699290
#280 #699289
Как заставить GCC размещать переменные в стеке так, как они расположены в исходнике?
>>699319>>699331
#281 #699290
>>699237

>strncpy - внезапно тоже сломана


Охуеть. Тогда что надо использовать? Мемсру?
>>699319>>699331
#282 #699306
какие ваши любимые фанкшыны в сишке? у меня любимая malloc, а у вас?
>>699315>>699319
#283 #699315
>>699306
У меня любимое ключевое слово void, а функция тоже malloc.
#284 #699319
>>699289
Выделять их как сам считаешь нужным через alloca().
>>699290

>Мемсру


Как же ахуенно читается на русском, прям вся суть функции.
>>699306
memset и scanf конечно же, из любимых языковых конструкций - void*.
>>699324
#285 #699324
>>699319

>alloca()


Ммм, действительно.
#286 #699331
>>699290

> что использовать


Аккуратно напиши свою. Большинство проектов так и делает. Так поступают еще и потому, что многие программы под линуксами имеют дело с UTF-8, а в UTF-8 важно не обрезать строку посередине символа.

>>699289

> Как заставить GCC размещать


Но зачем? Язык Си и стек никак не связаны. Но вообще, при сборке без оптимизаций порядок более-менее соблюдается.
#287 #701382
Далеко уплыл тред что-то.
Аноны, подскажите пожалуйста как записать конструкцию switch псевдокодом.
>>701523
#288 #701523
>>701382
Через цепочку if, или ты про какой псевдокод?
#289 #701724
Кто-нибудь может пояснить за ассемблерные вставки на C++ в вижуал студио?
>>701927
#290 #701927
>>701724
__asm {
xor eax, eax
mov eax, 1
}
Намного проще, чем в гцц
>>701966
7 Кб, 404x410
#291 #701966
>>701927
Как мне заполнить массив в асм вставке числами от 0 до 99?
>>701977>>702090
#292 #701977
>>701966
Жесть, чувак, даже не пытайся, или, хотя бы почитай про асм. Во первый компиль вставит эту вставку и даже не подумает с ней что-либо делать, ибо считает, что если ты юзаешь вставку, значит ты знаешь, что делаешь, а во вторых ты просто вероломным образом начинаешь использовать регистры, которые до этой вставки компилятор мог как-либо использовать, при этом ты не восстанавливаешь те значения, которые там были. Короче на данном этапе компилятор сам сможет лучше тебя оптимизировать заполнение массива, так что либо учи асм, либо забей болт на вставки.
>>702090
20 Кб, 1134x512
#293 #702090
>>701977
Никаких регистров из тех, которые он использует, в студии сохранять не нужно, компилятор достаточно умен.

>>701966
Вообще-то, ты ошибся тредом, у нас здесь няшная сишечка, а не плюсы. Но в виде исключения - пикрелейтед тебе нужно было сделать lea, ибо masm, все дела.
>>702341>>702399
#294 #702270
призываю всех тру программеров на ассемблере

Как мне заменить нечетные разряды на 0, а четные инвертировать?
есть код,но он не совсем работает
mov ax, a
mov res1, ax
and ax, 01010101b
xor ax, 10101010b

число 155
101 Кб, 678x802
#295 #702296
код почти заработал,вместо 69 должно было получиться 68,Если я не ошибаюсь
>>702530
#296 #702341
>>702090
И вправду, Microsoft для своих горе-погроммистов старается не использовать те регистры, которые юзаются в асм-вставке.
https://msdn.microsoft.com/en-us/library/5hd5ywk0.aspx
>>702638
#297 #702399
>>702090
лол, вместо дрочева с высчитыванием индекса, лучше используй stosd
>>702638
#298 #702530
>>702296
попробуй sub ax,0xff
#299 #702638
>>702399

> вместо дрочева с высчитыванием индекса


stosd требует использования именно edi, а эффективный адрес в таком виде может использовать любые регистры. Да, stosd мог бы быть чуть-чуть побыстрее из-за отсутствия зависимости от ecx, но какая нахуй оптимизация, когда это явно учебный пример?

>>702341
Не читал статью, но насколько я знаю, компилятор просто смотрит, что используется и перед ассемблерной вставкой сохраняет это в стек (или даже не сохраняет, если в регистре было просто закэшировано что-то). GCC позволяет делать то же самое, просто ему, в отличие от студийного компилятора, нужно сказать, что ты изменил специально, а что попортил по ходу дела.
>>702750
#300 #702750
>>702638

>Да, 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
>>702766
#301 #702766
>>702750

> У тебя адрес вычисляется через сложение и умножения регистров


Ты не поверишь, но процессор умеет считать эффективные адреса очень эээ... эффективно. Это одна инструкция, и выполняется она не дольше stosd. Но она точно быстрее, чем stosd с установленным DF. Такие дела. Про зависимости, переименование регистров и прочие нюансы тебе, видимо, просто еще рано знать.
21 Кб, 341x500
#303 #705087
>>683573 (OP)
Поясните за free(). Правильно ли я освободил память, или обосрался?
// Занимаем место:
u8 buffer = (u8)malloc(size);

// Тут магия с указателями и прочая дичь:
// …

// Освобождаем:
free(buffer);
#304 #705089
А для Си на AVR что читать?
>>705102>>705104
#305 #705102
>>705089
аппноты, рили и без шуток
#306 #705104
>>705089
и вообще AVR потихоньку дохнет, STM32 в этом плане перспективней - за разъяснениями в /ra/
#307 #705142
>>705087
Все правильно, да. free(), кстати, понимает NULL, поэтому перед освобождением ничего проверять не нужно.
>>705159>>705483
#308 #705144
Как иметь в линуксе две разных версии nginx? Надо реализовать эксплоит под одну из версий.
>>705312
4 Кб, 211x239
#309 #705159
>>705142
Спасибо, просто я тот ебанутый, который делает игру под GBA. Если не следить за памятью, то те 256Кб оперативной памяти засрутся очень быстро.
#310 #705312
>>705144
Сунь их в контейнеры.
И при чём тут C?
#311 #705447
Читаю K&R и перестал понимать задачки в книге примерно с 1.12 упражнения.
Когда я открываю готовое решение, смотрю на него, я понимаю как это было легко и охуеваю с себя как это я не додумался. Хотя нет, вру, в 1.19 уже плохо понимаю смотря на решение.
Что делать с подобным кроме как уйти в похапе/из профессии?
Помогите, пожалуйста, няши.
>>705463
#312 #705458
Итак. Решил я тут поковырять GTK. Что-то мне здается что знатно набыдлокодил. Не могли бы заценить данный код и сказать, что я делаю не так? В частности интересует ввод пользователя и передача аргументов через сигналы. Я правильно понимаю, что через gpointer data при отправки сигналов, можно передать любые данные?
https://ideone.com/q7Gpvt
>>705463
#313 #705463
>>705447
Ну как обычно с айтишными книжками: не читай дальше, пока не поймешь, что у тебя не осталось вопросов. Пробуй, пиши код, разбирайся. Если лень или не интересно - тогда из профессии.

>>705458

> Я правильно понимаю, что через gpointer data при отправки сигналов, можно передать любые данные?


Ну не через глобальные переменные же передавать. Все правильно, стандартный паттерн - при регистрации колбеков запоминать "пользовательский" указатель на что-нибудь.
>>705509
#314 #705483
>>705142
>>705087
Я сейчас еще прочитал свой пост и заметил, что при объявлении u8 buffer = … после u8 потерялась звёздочка, это указатель. Всё равно нормально очистит?
>>705494
#315 #705494
>>705483
Да все правильно. А звездочки макаба режет. Самое худшее, что ты можешь сделать, так это не освободить память вообще или освободить память которою ты не выделял. И да. Желательно освобождать сразу же, как выделенная память больше не нужна.
>>705498>>705983
#316 #705498
>>705494
А и еще освободить память в случае если ты поменял указатель. Тогда поведение будет неопределенным. Так что следи внимательно за ними.
#317 #705499
*
>>705502>>705503
#318 #705502
>>705499
Звезды:
Одна:
Две:
Три:

Четыре:
>>705505>>705510
#319 #705503
>>705499
Я нашёл способ — 3 звёздочки!
>>705505
#320 #705505
>>705507
#321 #705507
>>705505
Чё-то ты обосрался, вась *
>>705510
#322 #705509
>>705463
А вот еще хотел спросить. Если мне нужно обеспечить ввод при нажатии на Enter и при нажатии на кнопку. Правильным ли будет, просто эмитить сигнал с ответом при нажатии на Enter для диалогового окна? Или есть другие способы?
#323 #705510
>>705507
Сам не знаю.
Здесь: >>705502 не сработало у меня.
Тест (три звезды с двоеточием до):
Тест (без двоеточия)
#324 #705820
Ну вот же ∗ звездочка. Уже не первый тред используем, а брат все еще жив.
#325 #705872
*
#326 #705874
ц: *
#327 #705983
>>705494
Короче, есть конвертор, который берет изображение формата .pcx и забивает его в .o как массив с произвольным названием типа u8. Потом происходит компиляция исходного кода и он линкуется с уже имеющимися файлами ресурсов. Когда мамин программист хочет нарисовать эту самую картинку на экране GBA, он подключает эту переменную через extern и дает указатель этой функции:
http://pastebin.com/FRQuWfbj
Вроде же всё правильно, ничего лишнего не освобождается? Просто я не нашел нормальных дебагеров под GBA, вот и приходится задавать тупые вопросы и гадать на кофейной гуще.
>>706080
#328 #706080
>>705983
А почему нельзя прямо на экран распаковывать? Слишком медленно? Так RLE же, чуть-чуть до memcpy не дотягивает.
>>706111
#329 #706111
>>706080
Там такая фича видеопамяти GBA, что туда нельзя писать char-ами, только short и int, а картинка-то как-раз таки и закодирована в char (а в 16-цветовом случае вообще использует по 4 бита на пиксель, лол). Это рождает просто ебанную кучу проблем, например, если хочешь нарисовать один пиксель — выравнивай указатель по ячейке, читай соседний пиксель, скрещивай его с идентификатором цвета и только после этого записывай назад уже два пикселя, как раз u16 и выходит. По этой же причине я и не осилил RLE прямиком в память — а что если оно будет залезать на соседний пиксель?
А вообще, архитектура, мягко говоря, интересная. Может, в 2001 это было нормально, но сейчас меня подобные вещи пугают.
>>708993
#330 #707608
Анон, как привести произвольный указатель к типу указатель на функцию void (*)(void)?
>>707698
#331 #707698
>>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
#332 #707765
>>707698
Спасибо.
Выходит лучше указатели на данные и функции хранить отдельно?
Благо у меня stm32 и по умолчанию gcc даж не ругнулся.
>>707829
#333 #707829
>>707765

> Выходит лучше указатели на данные и функции хранить отдельно?


Я сгустил краски. По стандарту у тебя либо object pointer, либо function pointer, и использование одного через другое не портабельно (потому что существуют всякие AVR, где такое сделать не позволяет архитектура процессора). Но там, где архитектура позволяет, возможность выполнять данные, как код и/или использовать код, как данные часто существует в виде расширения стандарта (J.5.7), и не приводит к неожиданностям (если выполняются всякие платформо-зависимые обряды вроде сбросов кэшей и пометки памяти, как исполняемой).

Поэтому если ты пишешь конкретно для STM32, тебя эти проблемы не касаются. А зачем тебе кастить данные к указателю на функцию, кстати? Ты генерируешь код в рантайме или просто экспериментируешь?
>>707890
#334 #707890
>>707829
Круто знать первоисточники.
Пытаюсь улучшить алгоритм вывода на экран LCD1602 менюшки и действия её пунктов. Понял уже что такое приведение типов будет лишнее, проще хранить разные указатели в разных типах массивов.
>>707903
#335 #707903
>>707890
Можешь union сделать, если в зависимости от типа элемента тебе нужно поле или одного типа, или другого.
20 Кб, 403x274
#336 #708701
Что я упустил в расчете ICMP чексумы?
>>708827
#337 #708827
>>708701
1) Ты когда однобайтовый хвост читаешь, читаешь лишнее. Представь, что я выделил страницу памяти и скормил твоей функции один последний байт этой страницы - ты сегфолтнешься.
2) После if не делаешь else для двухбайтового варианта.
3) Читаешь целые в little endian, но не свопаешь байты перед инверсией битов.
#338 #708842
Нубские вопросы.

1) Как опознавать нажатие/отпускание/удерживание клавиши на клавиатуре?
2) Как воспроизвести аудиофайл (скажем, mp3)?
>>708947
#339 #708947
>>708842
Очевидно, ты должен указать ОС. Если ты хочешь более-менее кроссплатформенно, то можешь взять SDL и какой-нибудь MAD для декодирования .mp3.
>>708992
#340 #708992
>>708947
Хорошо, понял, спасибо. А можно пример кода на

>нажатие/отпускание/удерживание клавиши на клавиатуре


? Под линукс. Просто для общего образования. Мне кажется, это должно быть очень просто, что-то типа while(true){scanf("%c", &key); ...}
>>709280>>709681
68 Кб, 1399x566
#341 #708993
>>706111
Ура, я нашел эмулятор GBA со встроенным дебагером! Теперь писать код стало куда проще, можно хотя бы удостовериться, как и куда ты записываешь спрайты (а не просто высчитывать в уме) и всё такое. Была маленькая утечка памяти (если так можно назвать неправильную адресацию тайлов) — с помощью утилиты я её устранил.
На пике мой понг, который я успел написать за это время. Ведь превозмогать с древней архитектурой и еще более древним Си — это так охуенно!
>>710272
#342 #709025
Торкнуло меня попробовать системное программирование в линуксе. Книга как с оппика есть, и всё. До этого был опыт на сишке в винапи. Сейчас в поисках толковой ide под сишку, и остановился на таком выборе - Atom.io и Visual Studio Code. Вроде оба имеют пакеты с поддержкой с/с++, в студии вроде билд можно намутить через таск менежер, а как в атоме я не понял, может анон знает? вот только я не имею ни малейшего понятия, что там тру а что нет, какую ide юзать и какому стайлгуайду следовать. Так же хз, как писать системное в линупсе в принципе. Анон, выручай!
>>709121
#343 #709121
>>709025
Используй vim/emacs/другой_текстовый_редактор. Makefile-ы и прочее надо учиться писать ручками. Если всё-таки жить не можешь без ёба-ide но оно тебе все-равно не нужно, то лучшим выбором будет Qt Creator.

B раз уж ты полез в юниксы, то начинай читать Advanced Programming in the Unix Environment 3rd edition.
#344 #709280
>>708992
Под линукс тута (там тыкни next lesson внизу): https://tronche.com/gui/x/xlib-tutorial/
#345 #709376
Не увидел в шапке, так что кину сюда. Думаю, часть анонов уже видела.
http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/main.htm
По сути, копипаст одной части годного учебника по плюсам от Шилдта. Мне зашло больше, чем K&R, так как разжевано кое-что подробнее, и также больше, чем учебник Праты, так как не так сильно глубоко.
#346 #709681
>>708992

>Под линукс


Консоль/гуй?
27 Кб, 970x464
2 Кб, 650x36
#347 #710272
>>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. Так вот, как это исправить, и, наконец, занести эту долбанную константу по нужному адресу?
>>710311>>710670
#348 #710311
>>710272
Хуй знает, это специфика архитектуры, надо разбираться, но разве до 0x08000a0 не лежит еще что-то подобное околосистемное? Заголовок какой-нибудь там. Укажи в линк-скрипте, что у тебя есть секция, допустим, 0x100 байтов с подобным говном, и эту секцию надо смержить с .text, причем поместить ее в начало .text.
>>710316
#349 #710316
>>710311

> 0x100 байтов с подобным говном, и эту секцию надо смержить с .text, причем поместить ее в начало .text


Ну так как это сделать и спрашиваю — можно пример скрипта? Всё что после 0x08000000 — это память картриджа (может быть до 32Мб), до 0x80000A0 лежит какой-то заголовок GBA игры, после него — остальная память картриджа.
>>710666
#350 #710497
>>689585

>Что вообще сложного в кодинге?


Сложно писать программы таким образом, чтобы потом внося в них изменения, эти изменения были локализованы как можно в меньшем количестве мест.
#351 #710578
Где надрочить свои навыки в сишечке? На каких-нибудь развивающихся проектах, но чтоб не супер монструозная ЙОБА.
>>717655>>717658
#352 #710666
>>710316
Да, уже увидел пик с сообщением об ошибке и посмотрел скрипт, которым это собирается. Хуй знает. Если .text не будет по 0x08000000, сломается бутстрап в crt0.o, а патчить секции через ld я не умею. Я бы отредактировал сам crt0.S просто или написал бы патчилку ромов после линковки уже.
>>710670>>711510
sage #353 #710670
>>710666
Ахда, и у тебя >>710272 тут, судя по размерам секции и недоеденным вакабой кускам кода - указатель, а надо по ...A0 не указатель положить, а сам массив char. Т.е., const char pie_name[] = "";
>>710733>>710734
#354 #710733
>>710670
Двачую. Строковые литералы размещаются в секции рид-онли, плюс все секции выравниваются по размеру страницы, поэтому компиль и перетирает твою попытку захуярить секцию по такому кривому адресу.
#355 #710734
>>710670
бля ну ты понял, тут типа ответ не сколько тебе, сколько анону, которому ответил ты
16 Кб, 342x401
#356 #711510
>>710666

> патчилку ромов после линковки уже


Но такая уже есть:
https://github.com/devkitPro/gba-tools/blob/master/src/gbafix.c
Но всё равно было бы круто разобраться с самим линковщиком, чем использовать готовые велосипеды.
#357 #714568
Долго думал, куда сунуться с вопросами архитектуры, но решил что всё же сюда, т.к. пишу на сях.
Ситуация - есть набор данных, хранящихся в линкованом хэш-массиве. Отдельная единица данных уложена в структуру. Размер массива варьируется от несколько тысяч до нескольких миллионов.
Как обычно, в процессе разработки возникла потребность для некоторых единиц хранить дополнительные данные, размер которых может сильно варьироваться, и содержание - тоже.
Как это по-нормальному делается обычно, чтобы и память лишнюю не жрать, и скорость обработки не пострадала? Понятно, что раздувать исходную структуру не вариант, данные с дополнительной информацией составляют меньше процента от общего числа.
Я пока сделал это вводом инта с размером дополнительных данных в байтах и указателя с адресом их расположения.
>>714582>>714855
#358 #714582
>>714568
связанный список
#359 #714797
У меня охуительный вопрос появился.
Предположим, нужно в программе какое-нибудь число. Пусть, например int x = 10. С точки зрения памяти, что будет, если мы в коде уберём переменную x и подставим везде само число 10? Мы сэкономим 2 байта?
>>714807>>714855
#360 #714807
>>714797
Типа того, но там оптимизации могут быть если ты не объявишь х как volatile. Ну и экономия от размеров типов зависит.
>>714929
#361 #714843
Вроде сделал умножение чисел произвольной длины, но компилятор выдаёт какую-то жесть, там все 5 умножений на месте и они почему-то знаковые. Я хуй знает, вроде правильно работает, и вроде инструкция умножения сразу в два регистра кладёт результат, так нахуя он повторяет 5 умножений?

Не шарю в асме. Чё-то не понял, или кривой код?

http://pastebin.com/bwPVY8u3

http://pastebin.com/g1j6TPj1 выхлоп
>>715022
#362 #714855
>>714568
У тебя там ембеддед что ли? Твой подход норм. Даже если у тебя будет миллион элементов, дополнительные расходы от двух полей в структуре составят 8/16 мб и особой погоды не сделают. Если все равно хочешь память сэкономить (за счет CPU и шины), можешь изъебываться с офсетами (в элементе хранится офсет в заранее выделенный пул, а размер данных ты вычисляешь в рантайме на основании офсета следующего элемента в связанном списке, или, если он последний - следующего bucket-а). Или, если у тебя элементы массива - указатели, а не сразу структуры, сделай структурку вида:
struct Item
{
struct Item ptr next;
int hashcode;
int data_length;
char data[];
};
и при выделении элемента выделяй сразу sizeof(Item) + data_length. Выделится одним куском, не нужно будет хранить лишний указатель.

>>714797
Оставь оптимизации компилятору, особенно если не уверен. Будет ли выигрыш от твоего подхода, зависит от многих вещей. Например, от архитектуры (как будет кодироваться непосредственное значение 10 в инструкции, которая его использует), от выражения, в котором используется твое число, от наличия и типа указателей в функции (можешь про алиасинг почитать, но это весьма хитрая тема), от уровня оптимизации, от ключей компилятору, от самого компилятора.
>>714929>>715713
#363 #714929
>>714807
>>714855
Понел, спасибо.
#364 #715022
Ну может у кого негцц компилятор есть, или 64х битовый режим, киньте выхлоп (с оптимизацией конечож) этого >>714843, хоть посмотрю.
>>715038
#365 #715038
>>715022
Могу студией собрать, но uintp - это uintptr_t или uint32_t ∗? И почему нельзя было стандартные типы использовать?
>>715048
#366 #715048
>>715038
это
typedef uintptr_t uintp ;
typedef intptr_t intp ;
#367 #715054
А стандартные типы не тащат, мне не хочется писать _t, а ещё я хочу писать не только на c99 и выше. Поэтому сам на определял себе. Хотя конечно есть мнего проблем, например до c99 нет числовых типов что-бы вмещали адреса, только дико мытные size_t и ptrdiff_t - которые тоже хуй пойми где определены.
>>715073
#368 #715073
>>715054
Вопщем, сам дизасми. Студия со всеми апдейтами, Clang/C2 парсер шланговый, кодогенератор C2 майкрософтовый. rghost.ru/7KdXkMRsc
А чего ты добиться-то хочешь? Я так и не понял из оригинального поста. Оно умножает не так, или компилируется неоптимально? Код не читал, если что.
>>715104
#369 #715104
>>715073
Вроде не оптимально компилируется, по идее это должно идти в одно умножение. Но рас нет, значит допускается какое-то поведение, и возможно там ошибка, или хуй знает.
#370 #715145
хм, прочёл я спецификацию, 2-3 операндный imull усекает результат, поэтому как бы и не знаковый...
1 Кб, 147x80
#371 #715248
Вроде сократил мальца, но всё равно пиздец. Хуй с ним, проставлю ифдеф с (uint64). Время насасывать в делении...
#372 #715713
>>714855
Нет, не эмбеддед, но с памятью всё равно приходится обращаться с осторожностью, ибо в долгосрочных планах количество данных может перевалить через миллиард, и тогда счёт пойдёт на гигабайты. И дополнительные данные хранятся не в общем массиве, а в отдельной области, так как сам массив уложен выровненными чанками, оптимизированными для кэша.
Короче, я в итоге выкинул инт с размером, оставил только указатель, а размер храню первым элементом дополнительной области. Всё получилось быстро и компактно, я доволен.
#373 #717422
ОПИШИТЕ ПО БУКВАМ!
Как начать кодить на этом СИ? Поставил я такой netBeans, а он такой - у вас нету компилятора!
А я такой - поставлю кланг тогда. А он такой - у вас нету MAKE.
Сука! Сделать не может. МАке нету.
И я такой говно этот Си непонятный, вернусь на JS
Ну или объясните как ХЭЛЛОУ ВОРЛД НАПИСАТЬ!?
>>717434
#374 #717434
>>717422
Если у тебя винда, к шлангу тебе понадобится поставить еще MinGW GCC (многие хедеры, либы у них общие), там и make есть, как часть MSYS. А можешь просто взять Pelles C или Visual Studio, у них свои IDE, и все необходимое сразу есть в комплекте. Разве что, у студии комплект весит десяток гигабайт, а у Pelles C - десятки мегабайт.
>>717438
#375 #717438
>>717434
Спасибо
#376 #717655
>>710578
бамп вопросу
>>717658
#378 #717731
А что вообще можно на С написать? Допустим, на перле или путоне я могу сделать парсер веб-страниц, скрипты автоматизации и даже оконные приложения.
Что можно на чистом С сделать, кроме консольных утилит x + y?
Зачем он нужен вообще, кроме как для написания контроллеров для железа?
#380 #717753
>>717731

>А что вообще можно на С написать?


Много чего.
>>718224
#381 #717890
>>717731
GUI-приложения под winapi писать на С как два пальца обоссать на самом деле, в визуальном конструкторе или редакторе в ресурс-файле накидываешь типовые контроллы в контейнере DIALOGEX, задаешь им текст, стили и прочее, далее во время исполнения лепишь свои диалоги куда тебе надо - например на созданное главное окно, можно переключать их видимость вкладками например, меняешь их свойства и обрабатываешь юзер инпут с помощью стандартных виндовых оконных месседжей, можно очень просто назначать собственную отрисовку контролов, тогда можно делать гламурненькие кнопочки, чекбоксы и прочее прочее. Это на первый взгляд кажется, что гиморно и громоздко, на самом деле через некоторое время у тебя появится куча всяких стандартных шаблонов и оберток для вызова громоздкокого winapi. Не в курсе, но уверен, чтопод какое-нибудь GTK(он же вроде на С емнип) всё так же.
>>718136>>718224
#382 #718136
>>717890
гуй не нужен. консоли будет достаточно, а то знаю я эту вашу графику. сегодня ты напишешь вызов, заделаешь удобства, очереди отрисовки, анимации, 3д, шейдеры - в итоге всё время тратишь на свой самый лучший в мире движок. далее выкладываешь его для всеобщего пользования и УПС, внезапно оказывается, что таких-же долбаёбов как ты уже за миллион переваливает, и твоё поделие нахуй никому не нужно, а время потрачено, а ведъ можно было посмотреть трилогию порно пиратов, но уже на работу...
>>718150>>718219
17 Кб, 291x300
#383 #718150
>>718136
Ну ты и пидор, по самому больному ударил.
писатель-хуиты-под-GBA
>>718219
#384 #718219
>>718136
>>718150
Расскажите чуть больше. Разве оно уже не сделано в виде clutter/XUL и подобного?
#385 #718224
>>717753
>>717745
>>717890
Спасибо, понятно. А что есть для работы с графикой? Собрался игоры пилить Допустим, я хочу сделать так, чтобы в некоем окошке 6 квадратиков ездили друг за другом по часовой стрелке. Java и прочее не подходит, т.к. при увеличении числа квадратиков (до 600, например) всё начинает безбожно лагать. Логичный вывод - сделать это на С. Только хз как
#386 #718226
>>718224
OpenGL, как ещё блядь.
Если у тебя лагает такая хуйня – у тебя либо безнадёжно устаревшая пека, либо ты пиздец криворукий. В обоих случаях сишка будет полумерой, тем более если ты её не знаешь.
>>718229
#387 #718227
>>718224
Во времена второго квейка ещё был софтварный рендер. Где каждый пиксель на сишечках. Сейчас конечно опенгл надо использовать везде где можно, особенно если квадратиков много.
30 Кб, 480x360
#388 #718229
>>718226
Ок, расскажи мне, как сделать эффект, аналогичный снарядам в тохо?
Делал через Python на Pygame и Pyglet - лагает, делал на Java в Candroid engine - лагает.
Комп 6 ядер, 8 гигов озу
>>718378
#389 #718254
>>683573 (OP)

>Stephen Prata "C Primer Plus, 6th Edition" (2014)


Действительно годнота? Хочу окунуться в мир чистого Си, сейчас листаю Ритчи.
>>718339
#390 #718339
>>718254
Норм, но еще лучше паралельно учить ассемблер, сразу станет понятно откуда в сишных конструкциях ноги растут.
Я сначала удивлялся почему одногруппники не вдупляют простые и понятные концепции вроде адресной арифметики, указателей и пр. а они тупо не шарили во что компилируется их код. Не будь таким.
>>718346
#391 #718346
>>718339
Ну и что это тебе дало? Вот пишу я printf("Bla bla"); нафиг мне знать, что атм происходит? Я знаю, что у меня выводится в консоль строка. Это всё, что мне надо. Зачем мне дезасемблировать её?
>>718361
28 Кб, 500x275
#392 #718361
>>718346
Толсто.
22 Кб, 200x202
#393 #718378
>>718229

> Делал через Python на Pygame и Pyglet — лагает, делал на Java в Candroid engine — лагает.


> Комп 6 ядер, 8 гигов озу


Пиздец.
>>718382
#394 #718382
>>718378
Стандартный геймдев в 2016. Железо же развивается, хули вы тут на своём ассемблере пишите?
>>718418
#395 #718388
>>718224

> при увеличении числа квадратиков (до 600


Такую хуйню и сишка не вывезет в риалтайме, твоим способом. Большие количества "квадратиков" реализуют с помощью частиц (particle system). Про тохо точно не знаю, но с большой долей вероятности там не обрабатывается каждый снаряд как отдельная сущность. А задается закон по которому они живут (функция от времени). Каждый залп это одна функция с помощью которой ренедерятся сотни снарядов, и проверяется попадание в игрока с помощью простой подстановки (координат игрока) в функцию.
>>718419>>720086
#396 #718409
>>689377
вголос
35 Кб, 463x403
#397 #718418
>>718382
Так мы застряли в прошлом — вон, один уже совсем поехал и пишет под Геймбой, там вообще 4Мгц и 256Кб оперативы. А ты тут такие вопросы задаешь.
>>718427
#398 #718419
>>718388
Т.е. это не так работает? -Делаем класс Пуля, из него генератором делаем 200 объектов и задаём в функции им путь и время, чтобы были промежутки.

Алсо спасибо, доброанон. А как ты до этого додумался? Что это функция и т.п. Это ведь не какое-то знание конкретного ЯП. Алгоритмы? что почитать на эту тему?
>>718524
#399 #718426
чёт пишу функцию деления произвольных чисел - всё блять просто, вроде, но столько писать, пиздец, не удивительно что несколько лет назад я дропнул это писать на ассемблере. Хотя, есть ощущение, что на асме это было бы приятней писать, и меньше...

Заебали, напишите за меня, просчитайте комбинации, десятитысячные факториалы, соберите в группы...

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

Потому что это сложно морально, просто брать и пользоваться уже написанным до тебя.
>>718428
#400 #718427
>>718418
а я пользуюсь рамой как массивом бит - посчитал сколько мне надо и охуел от перспектив, так что высчитываю в рантайме сколько нужно бит на кодирование элемента массива...
#401 #718428
>>718431
#402 #718431
>>718428
Нет, я должен страдать, я не сдался ещё.
#403 #718524
>>718419

> Делаем класс Пуля, из него генератором делаем 200 объектов


Так и работает. Тормоза у кото-то там выше не из-за подхода к хранению и генерации частиц, а из-за способа отрисовки.
#404 #718649
Не по теме,но arduino язык C подобный .Так вот вопрос.Я новичок ,пытаюсь с помощью Serial число и записать в переменную (мы ввели 1234 в массив и присвоили val =i[0].Но у нас переменная будет равна 49,а не 1 из за того,что мы считываем код символа из ascii .Как записать туда 1,не делая костыли с if(i[0] == 48){
i[0] = 1;
}
)Спасибо.
>>718686
#405 #718686
>>718649
i[0] = val - '0';
>>718694>>718712
#406 #718694
>>718686
О ,спасибо!
>>718713
#407 #718712
>>718686
Кстати еще одна проблема
Serial.readBytes[i,4]//считываем массив по байтам
int c=(i[0]-'0')*6000//если ввести 1234,то выдаст 6000-правильно.Но если умножить на 60000 то выдаст -5536.
>>718724
#408 #718713
>>718694
В ардуинах же atoi тоже есть, насколько я помню. Зачем ты его изобретаешь?
sage #409 #718724
>>718712
Потому что int там 16-битный, в знаковом int может храниться -32768 ... 0 ... 32767, вот он у тебя и переполняется. Юзай long (long int), и желательно unsigned, если не предполагается хранить отрицательные числа.
>>718733
1562 Кб, Webm
#410 #718726
#411 #718733
>>718724
Спасибо большое!
#412 #718745
Подскажите очередной тупой вопрос: как засунуть файл в stdin? Есть куча готового кода, который читающий данные через getchar(), переписывать всё на fgetc() не вариант.

Алсо, есть ли способ узнать текущую позицию курсора в этом самом stdin?
#413 #718748
>>718745
fread/fwrite, ftell.
#414 #718793
Кстати ,for или do while делает i-1 к примеру раз в 1 миллисекунду?
>>718795>>718806
#415 #718795
>>718793
Как например сделать цикл ,который выполняется минуту?
for(i=61000(60?),i>0,i--)
{
}
?
>>718805>>718806
#416 #718805
>>718795
sleep(60)
#417 #718806
>>718793

> for или do while делает i-1 к примеру раз в 1 миллисекунду


С чего бы вдруг? Нет, гораздо чаще, зависит от процессора и конкретного скомпилированного кода. У тебя частота процессора гигагерцами меряется, причем несколько инструкций могут выполняться параллельно.

>>718795
Используй аналог sleep() в твоей ОС или виси в пустом цикле, пока разница между начальным time() и текущим не будет равна 60 секундам (но имей в виду, что такой подход бесцельно нагружает процессор). Пустой цикл в твоем варианте не имеет сайд-эффектов, поэтому оптимизатор вправе его выкинуть нахуй.

>>718745
freopen() сделали специально для тебя. Не забудь заодно описание setvbuf() глянуть.
#418 #718911
>>717731

>Зачем он нужен вообще, кроме как для написания контроллеров для железа?


Блядь, откуда вы только лезете. На Си, наверно, половина софта написана. А остальная половина на крестах.
#419 #719040
>>718745

>текущую позицию курсора в этом самом stdin?


Што?
#420 #719109
>>717731
Игровые движки, например.
>>719110
#421 #719110
#422 #719733
>>683573 (OP)
Есть ли рбота на сише в рашке?
>>719773>>720262
#423 #719743
Хочу перейти от консолеговна к окноперделкам. Какую IDE лучше накатить, чтобы создавать окошки и модные выпадающие менюшки без гомоебли? И чтобы было достаточно уроков, да.
>>719773
#424 #719773
>>719733
Тут уже спрашивали >>694860. Искать нужно, но в общем-то есть.

>>719743
Любую. Если шинда и Windows API, то Visual Studio или Pelles C. Но вообще, если тебе нужен обычный стандартный GUI, то проще написать его на C# или Qt, а на сишечке писать либу или консольное приложение, к которым GUI будет обращаться.
#425 #719855
Есть одна лаба.
В ней используются phtread и mutex
https://ideone.com/NaFOvO
С большего написал, но ведет она себя странно, в какойто момент, судя по всему, входит в дедлок.

Дебажить нечем, пишу в блокноте и компилирую/запускаю на удаленном сервере.
Был бы благодарен за намеки где я проебался.
#426 #719856
>>719855
Задача, на всякий случай, такая:
есть много тредов, они соревнуются за ресурс PID(их меньше чем тредов), держат его немного и отдают назад.
У меня получается что треды берут все PID, благополучно отдают их назад, но новые треды их уже взять не могут.
#427 #719859
>>719855
2016-й на дворе, используй std::mutex. Твой код не exception safe как минимум.
>>719860
#428 #719860
>>719859
Мы точно про С говорим?
>>719861
#429 #719861
>>719860
А, сорян, ошибся тредом.
#430 #719886
>>719855
Проверка S (там где ты ждешь) происходит до лока мютекса, возможна ситуация что в треде будет проведена успешная проверка S, после чего он стопнется операционной системой, S будет уменьшена, и тред продолжит выполнение дальше с S равным нулю без всяких проверок, на что у тебя там UB как я понимаю - ты дойдешь до конца функции не сделав return.
>>720295
#431 #719992
>>685995
хуяно.. там больше 200строк писать не рил
#432 #720086
>>718388
Что за хуйню я только что прочитал?
#433 #720095
Анон, а посоветуй каких-нибудь не очень объемных опенсорс проектов на няшной, чтобы можно код посмотреть и вникнуть, как оно делается. Есть тут кстати люди, контрибутящие в попенсоц? Расскажите, как вкатывались, и вообще.
>>720723
#434 #720261
>>719855

>Дебажить нечем, пишу в блокноте и компилирую/запускаю на удаленном сервере.

#435 #720262
#436 #720295
>>719886
Но ведь S это типа семафор, который фактически он там нихуя не делает(изза наличия мютекса). Проверка по S разрешает обратится к мютексу, не более. А уменьшение S возможно только после отмыкания мютекса.
Я исхожу из слеюующего:
Когда ктото хочет mutex_lock а он закрыт, то этот ктото попадает в очередь и крутится там переодически пытаясь этот мютекс открыть еще раз. Это верно?
>>720305
#437 #720305
>>720295
Типа как семафор, да, только семафоры потокобезопасные (доступ к счетчику) а твое S нет.
Ситуация. Ресурсы полностью заняты. S равно нулю. Несколько свободных тредов крутятся в цикле. Освобождается один из ресурсов. В массиве одно из значений записывается на ноль, S становится равным одному. Тред А увидев что S больше нуля выходит из цикла и тут его стопает система и запускает тред В. Тред В видит что S больше нуля, выходит из цикла, проходит по массиву ресурсов находит ноль и записывает туда единицу, уменьшает S до нуля. Просыпается тред А, проходит по массиву, так как там нет нуля (все ресурсы уже заняты) то функция просто завершается без нормального ретурна - тоесть возвращается какая-то хуита. Я не знаю что у тебя там за проблема, может такое поведение никак на корректность программы даже и не влияет. Но такая твоя реализация не потокобезопасна. В семафорах регулируется доступ к счетчику - тебе нужно или захватывать мьютекс перед чтением S, или делать атомарную операцию с проверкой и одновременные декрементом S. Если еще и массив атомарно модифицировать то мьютекс совсем не нужен.
>>720335
#438 #720335
>>720305
ОК, с этим согласен.
Вот, вообще убрал оттуда S(остался как счетчик для дебага)
https://ideone.com/gyhVuB
Добавил ретурн, чтобы видеть ошибку
Похоже что так и есть как ты говоришь, они попадают в цикл поиска свободных мест в странном порядке.
Но ведь это место защищено мютексом блеять! Может это быть изза того, что система мульитпроцессорная?
>>720430
#439 #720340
Вообще, когда ктото доходит до исполнения pthread_mutex_lock он будет там ждать пока не сможет открыть или случится дедлок?
>>720430
#440 #720423
Кто-нибудь вообще сталкивался на практике с поведением atoi, описанном в справочниках, когда при невозможности конвертации возвращает не 0, а ведёт себя "непредсказуемо"?
>>720462
#441 #720430
>>720340
Будет ждать.
>>720335

>место защищено мютексом блеять!


Защищено. Треды получают ресурс строго по очереди. Пока один ищет, остальные ждут. Проблема в том что твой счетчик, из-за того что он сам по себе непотокобезопасный в некоторых случаях (там наверное всего две-три инструкции во время которых нельзя останавливать поток на всю программу) пропускает больше тредов чем есть ресурса. Кстати из-за чего и происходит дедлок, только заметил - поток освобождает мьютекс только после того как получит ресурс. Тоесть когда счетчик пропускает лишний поток, он не может найти ресурс (так как все заняты) и следовательно неотпускает мьютекс и никто больше не может получать ресурсы.
>>720530
#442 #720462
>>720423
Там UB из-за возможного signed integer overflow в процессе обработки.
#443 #720530
>>720430
вобщем так все и было, спасибо починил.

А ведь возвращать ресурсы можно без мютекса? Там же вроде не запороть?
>>720544
#444 #720544
>>720530
Если правильно раздал то не запороть. Главное сначала ресурс вернуть, а уже потом счетчик увеличить.
>>720678
#445 #720678
>>720544
спасибо, все работает.
оророро уебываю назад в пистон тред, где мне и место
байтоёбьте без меня
#446 #720723
>>720727
#447 #720727
>>720723

> Coding style


> Do not mix declarations and code


Используют C99, а до сих пор говно в голове.
>>720826
#448 #720750
>>719855
Атомарные переменные и без гомоебли
>>721046
66 Кб, 700x581
#449 #720754
>>719855
Начем с того, что ты - пиздоглазое мудило!

У тебя функции allocate_pid мьютекс захватывается всегда, а освобождается только тогда, когда удалось выделить PID.

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

А раз мьютекс не освобождается, то дэдлок - вопрос времени.

Чтобы это заметить отладка не нужна, совсем.

Желаю тебе всю твою никчемную жизнь наслаждаться UB по полной программе!

школьник-кун
>>721046>>721047
#450 #720826
>>720727
Дэ, чё-то у них немного странные требования, хотя код неплох.
>>721002
#451 #721002
>>720826
Нормальные требования.

Это сделано для переносимости кода между разными компиляторами.
#452 #721046
>>720750
задача же ебаться, лаба же.
>>720754
Дружок, ты со своим доминированием опоздал. Все уже починили по указаниям анона сверху, умерь пыл.
#453 #721047
>>720754
хотя, раз ты так умен.
Как сделать allocate_pid так, чтобы оно в случае невозможности выделить пид не заезжало на мютекс, а возвращало -1?
>>721115
38 Кб, 658x433
#454 #721115
>>721047
Возьми за основу этот свой https://ideone.com/gyhVuB

1. Заведи в начале функции переменную, в которую будешь писать возвращаемое значение (ret), инициируй ее отрицательным значением (типа ошибка по дефолту).

2. В цикле вместо освобождения мьютеска и выхода из функции сделай присвоение ret = next_pid+PID_MIN; а потом break;

3. После окончания цикла сделай pthread_mutex_unlock(&mutex); а потом return ret;

А нафига там S я так и не понял, оно только при печати используется?

школьник-кун
>>721168
#455 #721168
>>721115
https://ideone.com/KuTw1F
вот как оно выглядит сейчас
То что ты рассказываешь я не понимаю.
Задача:
1)тред обращается в allocate_PID
2)если мест нет, он идет нахуй т.е. сразу получает -1, а не отправляется в мютекс ждать очереди
3)у меня это сделано на 65 строчке, но очевидно неправильно же
>>721204
#456 #721204
>>721221
#457 #721207
>>683573 (OP)
В чем разница между cascaded if statement и nested if statement ?
>>721214>>721301
#458 #721214
>>721207
В том что ты, уёбище, не можешь прочитать и подумать головой.
Каскадные = последовательные, вложенные = ну ты понел.
>>721224>>721225
#459 #721221
>>721204
Нет, лучше так:
http://pastebin.com/3gEtLg2V
>>721315
#460 #721224
>>721214
тоесть каскадные это варианты a, b, с а вложенные делят а на отдельные варианты итд ?
#461 #721225
>>721214
Кто дурак , тот сам знает.
#462 #721301
>>721207
Ни в чем. В Си нет никакого cascased if, потому что нет elseif/elif/elsif и т. д. "Выражение" else if - это просто традиционный способ форматирования вложенного if внутри ветки else, чтобы избежать вложенных уровней табуляции. Два варианта по ссылке одинаковы (особенно, если по-другому расставить скобочки), но первый вариант более читаемый, поэтому им и пользуются: http://ideone.com/gTHQUo
>>721317>>722207
#463 #721315
>>721221
нет, так вроде бы не лучше.
Ведь тред должно было выгнать сразу как стало понятно, что нет ПИД. А так он будет жить в мютексе и только потом поймет что его наебали.
В моем варианте хочть шанс был, что его сразу нахуй пошлют.
>>721318>>721358
#464 #721317
>>721301
Спасибо
#465 #721318
>>721315
а хотя нет, пердон.
работает
#466 #721358
>>721315
Там все равно нет гарантии, что ресурс реально есть до захвата мьютекса.

Но если ты думаешь, что с проверкой S перед захватом мьютекса будет быстрее, тогда, добавь if (S<=0) { return -1; } перед захватом мьютекса, как это было в твоем варианте.
#467 #722175
С горем пополам высрал перевод десятичного числа в двоичное посредством поразрядных операций:
#468 #722176
>>722175
Ой.
for (int i = S; i >= 0; i--)
{
bitArray = int((a >> i) & 1);
}
А как обратно? Не соображаю уже.
>>722217>>722338
#469 #722207
>>721301
комбинирование if, switch, условного оператора ?: даешь мощь
боятся использовать goto
но зачастую эти трюки программеры не знают
и почему то не умеют по быстрому лабать высокоуровневые конструкции типа таблиц переходов или машины состояний
>>722356
#470 #722217
>>722176
>>722175
Разве одними побитовыми операциями можно число обратно в 10ую систему собрать?
>>722356
#471 #722338
>>722175

> перевод десятичного числа в двоичное


>>722176

По-твоему, в памяти `a' хранится в десятичном виде, а не в двоичном?
>>722356
#472 #722356
>>722338
Я так понял, ему надо массив типа ((int[]) { 1, 0, 0, 1 }) обратно в один int собрать. Собственно, там OR аккумулятора с очередным элементом массива, сдвинутым на i бит влево, только и всего.

>>722217
Можно и в десятичную. Реализовываешь сложение и с песней начинаешь складывать степени двойки. Ну или можно нечестным способом, табличками, как советует этот >>722207. А вообще, если хочется ебли битов, лучше какой-нибудь HDL учить, там от этого хоть польза есть.
>>722618
#473 #722618
>>722356

>Собственно, там OR аккумулятора с очередным элементом массива, сдвинутым на i бит влево, только и всего.


n += (n | (array << i));
Ебин.
>>722623>>722740
#474 #722623
>>722618
Разметка съела индекс i у array.
#475 #722740
>>722618
Чому нi
n |= array[j] << j
?
>>723066
#476 #722928
как происходят вычисления в си?
т.е. я объявляю переменную беззнаковый лонг АА
пишу AA = ((BB5.06)/1024)3.05
как будет вычислять программа? после каждой операции выкидывать все, что после запятой или сначала все высчитает с десятыми долями, и потом уже в финале отбросит нецелое?
>>722960
#477 #722960
>>722928
В конце. При вычислении выражения все аргументы приводятся к одному самому широкому типу (из присутствующих в выражении) и вычисляется. Потом то что получилось приводится к типу результата. При чем, если я не ошибаюсь, не уверен, "широта" типа определяется максимальным выразимым числом - тоесть беззнаковый тип считается более "широким" чем знаковый того же размера.
>>723066
#478 #723066
>>722960
Желательно самому взять стандарт (драфт в шапке) и почитать про integer promotions (6.3.1.8).

>>722740

> Чому нi


У тебя правильно, у него нет. У него можно выкинуть | и оставить только +=, тогда тоже ок будет.

Алсо, у нас скоро бамплимит. Кто-нибудь хочет что-нибудь в шапку добавить?
>>723227
#479 #723213
Аноны, у меня горит. Прошу помощи, ибо сам полный нуб в оси, а времени нет.
Так уж вышло, что надо перенести лабу на Линукс. Нахуя - не знаю, но надо.
Ок. Запускаем в виртуалке Бубунту. Копипастим рабочий код, любовно высранный и отлаженный. На Винде 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]
}
^
???

На Винде всё отлично работает, а тут даже не компилится.

Посоны, втф? Как же св. Кросплатформенность и прочее?
#479 #723213
Аноны, у меня горит. Прошу помощи, ибо сам полный нуб в оси, а времени нет.
Так уж вышло, что надо перенести лабу на Линукс. Нахуя - не знаю, но надо.
Ок. Запускаем в виртуалке Бубунту. Копипастим рабочий код, любовно высранный и отлаженный. На Винде 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]
}
^
???

На Винде всё отлично работает, а тут даже не компилится.

Посоны, втф? Как же св. Кросплатформенность и прочее?
#480 #723223
>>723213
В прыщах нет getch(), это очевидно шиндовая фича. За разъяснениями в гугл.
>>723347
#481 #723227
>>723066

>Jon Erickson "Hacking: The Art of Exploitation, 2nd Edition" (2008)


Это можно выпилить, так как это не совсем Си. Да и вредоносная для ума рядового читателя, так как не дает теоретической базы, а скорее является чем-то вроде How-To.
>>723262
#482 #723247
>>723213

> Как же св. Кросплатформенность и прочее?


Ну ты её успешно просрал всякими мокренькими getch() и прочими conio.h
#483 #723262
>>723227
Ну ты с этим аккуратнее, а то сейчас прибежит коллбэк-даун которому тут посоветовали начинать с этой книги, и сорвёт покровы с очередной нихуя не логичной абстракции (коллбэка).
>>723558
#484 #723270
>>723213
ох лол.
#485 #723347
>>723223
getchar()-то на месте.
>>723213
У тебя всё косоёбит conio.h, и, возможно, различия в символах перевода строки если один и тот же файл компилишь.
>>723356>>723357
#486 #723356
>>723347

>различия в символах перевода строки если один и тот же файл компилишь.


да ну, пример можешь?
>>723462
#487 #723357
>>723347
А как же хуйня с объявлением переменных/функций? Ебаные прыщи, нихуя не работает из коробки.
#488 #723359
>>723357

> //


ты там не в с90 компилируешь, коробочка?
>>723510
#489 #723458
>>723357
Почитай стандарт, придурок. Твоего getch'а там нет. VS не следует нормально С стандарту. А под твою сперму, никто подстраиваться не будет. Зато getch есть в Ncurses.
>>723479
#490 #723462
>>723356
В шинде это \r\n
В нормальных системах это \n
Либо форматни руками, либо открой в нормальном редакторе/иде.
#491 #723464
>>723357

>А как же хуйня с объявлением переменных/функций? Ебаные винда, все работает через жопу. Заебала MS свои несовместимые стандарты клепать.


>>723462

>2016


>\r\n


А я думал любой уважающий себя редактор автоматом подстраиваться под это.
>>723479
#492 #723479
>>723458
>>723462
>>723464
Бугурт прыщеблядей ИТТ.
>>723558
#493 #723489
>>723462

>В даунских системах это \n


Фикс
#494 #723505
>>723462
или \t ? у меня куча старых файлов в в разных вариантах - всё норм. да и с чего бы нет, на с можно в 1 строку всё написать.
>>723508
#495 #723508
>>723505
Но зачем, если есть ОКНА?
>>723512
#496 #723510
>>723359
Ага, в нём, да. Так надо. Но хули ему не нравится?
>>723515>>723516
#497 #723512
>>723508
я уже запутался кто тут кто, ещё раз, покажите мне пример, чтоб компилятор ругался на присутствие обоих стилей перевода строки в одном файле.
#498 #723515
>>723510
поздравляю, там нет комментариев в виде //
1965 Кб, 278x236
#499 #723516
>>723510
Проиграл с долбоёба.
>>723519
#500 #723519
>>723516
Нахуй иди. Мне не нужен ни древний стандарт, ни прыщи, мне надо закрыть лабу.
>>723521>>723524
#501 #723521
>>723519

> мне надо закрыть лабу


Это значит, что ты должен страдать
#502 #723524
>>723519
Прыщебляди даже в универах пытаются портить жизнь белым людям?
>>723558
#503 #723542
>>723357

> Ебаные прыщи, нихуя не работает из коробки.


Только твои говноподелия не работают.
>>723553
#504 #723553
>>723542

>ко-ко-ко спермоось!1111

>>723557
#505 #723557
>>723553
Чего ты порвался?
#506 #723558
>>723479
Да. Бугурт. Почему в нормальных системах все заводится с полпинка, а в Windows все через жопу сделано и не совместимо ни с чем?
>>723524

>Нахуй иди. Мне не нужен ни древний стандарт, ни прыщи, мне надо закрыть лабу.


>Мне не нуженстандарт,


Скорее спермоблядь-неосилятор портит жизнь белым людям.

>>723262
И что? Лучше вместо этой книжки почитать интеловский мануал по процессорам, мануал по башу, мануал по перлу, K&R и Прата и что-нибудь по системщине (Роберт Лав допустим) и по ИБ. Куда полезнее будет.
>>723561
#507 #723561
>>723558

>Почему в нормальных системах все заводится с полпинка, а в Windows все через жопу сделано и не совместимо ни с чем?


Да совместимо там со всем. У меня собирается и в винде, и в линуксе.

Но лабодауну подавай какое-то непонятное getch().
>>723564
#508 #723564
>>723561

>Да совместимо там со всем. У меня собирается и в винде, и в линуксе.


Более-менее нормальную поддержку С11 там вроде только недавно завезли. VS годится только для крестов и шарпа с бейсиком, но не для няшной. Плюс у них собственное WinAPI. Впрочем, WinAPI дело такое. Принципы то схожи, только другими словами. Также проблема \r\n.

>Но лабодауну подавай какое-то непонятное getch().


В универах до сих пор используют древние стандарты. Я в универе вместо крестов учил Си с классами и на VS 6.0.
>>723574>>723822
#509 #723574
>>723564
А что тебе от C11 нужно?
>>723622
#510 #723622
>>723574
вот бы новый printf, с нормальными типами, а не макросные костыли... хотя в нормальном коде его наверно и не должно быть, printf а.
>>723628
#511 #723623
но обидно
#512 #723628
>>723622
Толсто.
#513 #723822
>>723564

> getch


Но ведь getch() - это такой местный мемчик из K&R, с чего бы ему быть в либах?
ПЕРЕКАТЫВАЕМСЯ #514 #723846
Тред утонул или удален.
Это копия, сохраненная 12 мая 2016 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски