Этого треда уже нет.
Это копия, сохраненная 1 августа 2021 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
C Propaganda.jpg1,9 Мб, 2000x2610
C Programming Language #69 /clang/ # OP 2027897 В конец треда | Веб
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь https://ideone.com/ https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [​i​] или ∗.

Что читать:

- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: 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 (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль 2020, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf (декабрь 2020)

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

- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.

Что еще почитать:

http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.

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? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).

Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.

Ben Klemens "21st Century C: C Tips from the New School" (2012)

Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)

Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)

MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf

Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C

https://github.com/kozross/awesome-c

Онлайн-утилиты:

- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.

Прошлые треды:

- №66: http://arhivach.net/thread/637469/
- №67: http://arhivach.net/thread/667170/
- №68: http://arhivach.net/thread/667171/ >>1958625 (OP)
sage 2 2029476
С мёртв.
3 2029573
>>029476
да плевать, удобнее пока ничего не придумали
1587852400194783394.jpg10 Кб, 194x259
4 2029660
>>029476
Кыш отсюда, зеленокожий.
sage 5 2030478
И тишина...
6 2030872
>>030478
Люди серьезные. Си требует дисциплины, отваги, вагона знаний, твердости и четкости ума. Пишутся вещи непростые, для реализации коих требуется и смекалка, и немеренные знания предметной области, изучение лоулевел-программинга — это тебе не паддинги править, сынок, ты тредом ошибся.
Здесь тебе не питонотред или жс, обсуждать целыми тредами примеры из начала сраного byte of python не намерены, здесь люди ебашат K&R в одиночку без лишних вопросов, в их сторону достаточно кинуть парочку книг, все остальное лежит на их плечах, без лишнего пиздежа свое дело сделают.
aef8059aa591e4f8f4429dbdf9cb1290.mp42,5 Мб, mp4,
576x1024, 0:25
7 2030918
Анон, вопрос. Мне нужно считывать с микросекндной точностью некий ресурс (размаплен через mmap). Ось типа убунты без рт ядра способна это сделать?

Я хотел делать чтение, останавливать поток на сон (правда, на c++, но итт пацаны знают работу операционки), и через заданный интервал считывать значение заново. Короче, рилтайм. Я знаю, что есть системный high resolution clock, и как-то система потенциально знает, сколько прошло времени.
8 2030934
Бамп
9 2030987
>>030918
Нет, как раз потому что линукс не реалтайм. Он может провести хоть секунду в системном вызове, если захочет, и твой слип сработает гораздо позже, чем ты того хотел бы. Более-менее точно попасть в нужное время ты можешь так: выставить себе приоритет повыше, выставить affinity, и таким образом, отожрав целое ядро у процессора, крутиться в цикле безо всяких снов.
10 2031178
>>030987
Хорошо. А есть какой-то подход о блокировке ядра (типа nop вставлять) на известное количество времени, а не тактов, с учётом плавания частоты ядра? Чтобы не выжирал энергию в простое?

Алсо, unix овский nanosleep() тоже не гарантирует микросекундную точность?
11 2031194
>>030872
Здесь регистрами фонит по низам.
12 2031239
>>031178
Нанослип ничего не гарантирует, он может округлять время вверх. Искользуй цикл с clock_gettime CLOCK_MONOTONIC. Может потребоваться что-то подкрутить в настройках ядра, чтобы таймеры работали точнее.
13 2031949
>>031178
Ты spinlock хочешь сделать и не с NOP, а с PAUSE, если речь про xuy86.
14 2032955
Насколько трудно написать на Си многопоточную программу, подобную многопоточности erlang?
15 2032998
>>032955
Достаточно сложно, если ты хочешь серьезное что-то, а не поиграться. Для начала man setjmp, но вообще есть всякие готовые либы для green threads.
16 2033017
>>032955

>многопоточную


Не нужное говно
sage 17 2033018
>>033017

>сидауны невер чендж

18 2033023
>>033018

>Больше потоков, Богу потоков111

19 2033037
>>032955

лол, ну если тебе нужна многопоточность в духе эрланга, может тебе прост оэрлангом и воспользоваться?

если нужна сишная многопоточность - гугли pthread, там, в принципе, ничего недоступного нету, есть какая-то старая книжка, есть годный мануал от почившего sun.
чё там, защищаешь общие ресурсы мьютексами, синхронищируешь кондишн-переменными. хуё-моё.
сложность - дело относительное. но многопоточность требует немного иного понимания, иного взгляда, там memory order'ом фонит по низам. Знаешь, один великий спец сказал, что распределённые вычисления есть наука о том, как на нескольких процессорах решить задачу, для которой достаточно одного.
image.png61 Кб, 974x774
20 2033117
Репост из крестового треда, там чот игнорят(

Есть ли разница и как лучше возвращать структуры из функции? Например есть код, в котором мне нужно получить заполненную структуру данных просто struct с переменными. И вот я могу сделать функцию, которая будет возвращать MyStruct/const MyStruct&, или сделать воидовую функцию, которая будет принимать MyStruct& и там его заполнять. Я чёт пытался сам пример себе собрать, но не понимаю до конца, что конкретно происходит с структурами, когда я референсы на них возвращаю из функций? В первых двух вариантах с пикрила в функции и в вызывающем коде адреса у структур разные. Это типа что, на return'е функции структура копируется в памяти и в вызывающем коде референс уже на копию? При этом у struct3 в вызывающем коде адрес такой же, как и в создающей функции
21 2033123
>>033117
Возвращай по значению. В современных крестах возврат оптимизируется по стандарту и функция реально работает внутри с той памятью в которую типа как эта структура вернётся из функции.
22 2033137
>>033017
Нужно, ускоряет выполнение программы.
23 2033424
>>033117
Возврат по значению быстрый только если у тебя размер не больше 8 байт (или 16 для 64-битного кода), и даже в этом случае есть подводные камни. Если тебе нужна скорость - функция с явным указателем/ссылкой лучше, при этом ты можешь заодно еще и статус вернуть нормальным способом.
24 2034039
>>033137
>>033424

чо вы несёте, если компилятору меньше 20 лет, то он оптимизирует возврат любой структуры. это будет почти гарантированно быстрее доступа по указателю. при возврате структуры по значению получается более простая семантика для человека, и для компилятора, второе позволяет лучше делать кросс-оптимизацию. далее, для возврата структуры по значению, ты её наверняка будешь маллокать где-то - дополнительный вызов функции, потенциально кэш-локальность идёт по пизде.
25 2034319
>>033117
На самом деле можно писать и так, и так.
Это зависит от того, чего тебе нужно достичь. Если, например, ты пишешь код для сдачи лабораторки какой-нибудь, то пиши так, как в методичке. Если же код для чего-то более серьёзного, то...

Я в подобных случаях смотрю на то, какой смысл у этой структуры данных.
Если это какая-то не очень большая временная структура либо если это какой-то не очень большой математический примитив фиксированного размера (например, вектор или матрица из трёх или четырёх float'ов - частые примитивы в компьютерной графике), то лучше возвращать целиком. Потому что вот такая запись

> mat4 c = Mat4xMat4(a, b)


гораздо приятнее и органичнее, чем

> mat4 c;


> Mat4xMat4(&c, a, b);


А ещё она позволит тебе перемножать много матриц по цепочке.

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

> particle p;


> CreateFireParticle(x, y, z, &p);


Потому что этот код банально лучше масштабируется, ты можешь дописать к нему в будущем код возврата и тому подобное.

В плюсах есть свои способы сделать это, разумеется: классы, конструкторы, перегрузка операторов и всё такое, но это плюсы. Насчёт оптимизации же - я не думаю, что тебе оно надо, ведь сегодня машины слишком мощные, чтобы печься о каждом такте. А даже если и надо, то при вменяемых ключах оптимизации современный компилятор всё равно подставит (inline) твою короткую функцию куда надо, и разницы в производительности не будет в принципе.
26 2034575
В хуях 86 gcc даже без флагов оптимизации вызываемая функция будет писать в структуру на стеке вызывающей функции, если структура большая. А чё стандарт говорит?
27 2034591
>>034575
стандарт ничего не говорит про детали реализации
28 2034727
>>027897 (OP)
Порекомендуйте oss статический анализатор, а то у меня ад выбора.
sage 29 2035382
>>034575

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


А ты и рад.
sage 30 2035383
>>034727

> Порекомендуйте oss


?
31 2035581
>>035382
Шта?
32 2035837
>>027897 (OP)
Анонасы, кто умеет в OpenMP, нужна ваша помощь. Можно ли каким-то образом "открепить" паралельную секцию от основного потока и, не дожидаясь её завершения, продолжить выполнение дальше?
33 2035969
>>035383
Open-Source Software
34 2036073
>>034727
Очевидный cppcheck же, не? С ключами по типу

> --enable=warning,style,performance,portability



Единственное - не совсем очевидно отключаются предупреждения там, где он выдаёт ложное срабатывание.
35 2036630
Вопрос может звучать максимально глупо, но ведь нормально и полезно использовать unsigned short int/uint16_t и uint8_t, а не int, если в моём коде переменная гарантированно будет принимать только беззнаковое значение соответствующего размера? А то смотрю на чужой код, читаю различные туториалы/статьи и вопросы на SOF, и всем как будто похуй, что они тратят память впустую.
image.png30 Кб, 391x632
Структуры 36 2036887
Привет, ребят. Сразу говорю за программирование не шарю, просто по инфе нужно лабу со структурами сделать.
Сама суть задания, с помощью структуры найди самую старую книгу и сколько книг из области физики
37 2036901
>>036887
забыл указать проблему :) не работает счётчик count
38 2036926
>>036901
Ошибку нашел, там изи, ответ в личку отправил
39 2037066
>>036630
Почему нет - используй на здоровье.
Но есть одно "но", а именно - выравнивание.

> struct s {


> uint8_t a;


> uint32_t b;


> };


Занимает в памяти не 5 байт, а 8. Это происходит из-за того, что процессор умеет обращаться к переменной b только если её адрес можно поделить на 4. В связи с этим после переменной a компилятор тебе добавит три байта, которые не будут использоваться в принципе. Ты можешь легко проверить это в духе:

> printf("%lu\n", sizeof(struct s));


Примечание: x86 может работать с невыровненными данными, но медленнее, из-за чего по умолчанию выравнивание всё равно применяется. А другие архитектуры могут тебя с такими запросами вообще напрямую послать, выдав address error и отказавшись работать.

>>036887

> if (p.obl == 'Физика')


if (!strcmp(p.obl, 'Физика'))

>>036946 (Del)
Катись к хуям.
40 2037068
+
41 2037136
>>037066

> Примечание: x86 может работать с невыровненными данными, но медленнее, из-за чего по умолчанию выравнивание всё равно применяется.


Разница в бенчах на x86 была почти незаметна, а сейчас и вовсе сошла на нет:
https://lemire.me/blog/2012/05/31/data-alignment-for-speed-myth-or-reality/
Про armv8a тоже пишут, что в большинстве случаев разницы нет:
https://www.nxp.com/docs/en/application-note/AN12628.pdf
Кроме поддержки simd смысла выравнивать уже как-то и нет.
sage 42 2037201
>>036630
В структурах (если экономишь память) - да. Если хочешь переполнение по модулю 2n- тоже можно. В остальных случаях нарвешься на сравнение знакового с беззнаковым или внезапно неэффективный код.
43 2037279
>>027897 (OP)

Сап сисеры. На связи бумерок, надрачивающий на олдфажные игори. Занимаюсь моддингом Return to castle Wolfenstein. Столкнулся с тем, что на современных компах игра вылетает частенько в процессе загрузки миссии из сохранения (если загрузка происходила во время игры). Отловил в Оле. Пишет якобы access violation. Но схуяли там пустая переменная, если в норме этот код постоянно работает? Предполагаю, что это связано с тем, что в ходе завершения миссии игры из памяти выгружается много переменных, а из-за криворукости кодеров, какой-то параллельный поток на быстрых компах успевает снова попытаться прочитать уже выгруженную переменную.

Исходник есть. Место локализовано. Строка 84. Чтение одной из этих переменных во время выгрузки миссии приводит к крашу.

Вопрос собсно такой: как это лучше всего пофиксить? Не хочется отрубать функцию полностью. Как программно предотвратить access violation на уровне сишного кода? Есть ли аналог try-catch? Или не поможет????
image.png5 Кб, 409x25
44 2037280
>>037279
вдогонку
45 2037338
>>037279
volatile xxx @gp = client->gentity
if (gp && gp->debil)
46 2037344
>>037279

ну по честному, наверное, стоит добавить семафорчик, если ты правильно описываешь ситуацию, заблокироваться перед чтением, пока не подгрузится корректный объект.
47 2037360
>>037338
Ну чего ты обзываешься-то сразу? Ну не знаю я толком С. А за совет спасибо
48 2037366
>>037360
Тип короче надо нормально пгавить, почему не написать автору подробный bug report?
49 2037381
>>037366
>>037338
>>037360

Сучара всё равно сдохло там же. Хотя уже с новым кодом
50 2037395
>>037381
Ну кстати, gentity не равно 0. Придется включить мозг и смотреть, кто выставляет gentity, а потом освобождает память.
image.png21 Кб, 942x242
51 2037403
>>037395
А вообще мне вот от чего бомбит. Там выше по коду на 77 идёт чтение точно тех же самых переменных и почему-то они не вылетают. Как это возможно???
52 2037412
>>037403
А блядь нет, извините, понял. Та проверка сразу не прошла по первому условию
cb7.png311 Кб, 525x394
53 2037452
>>037136

> Разница в бенчах на x86 была почти незаметна, а сейчас и вовсе сошла на нет


О как.
Значит, мои данные слегка устарели.

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

Но это уже такое. Больше теоретическое, нежели практическое.
54 2037485
>>037279
>>037381
Дело не в многопоточности, как я понимаю.
Шанс того, что в условии

> if (g && g->something)


произойдёт переключение потоков сразу после проверки g, но перед g->something, ничтожно мал, никак не "частенько". И действительно, глянь в отладчике, у тебя там [EAX+248], но при этом в EAX лежит нифига не ноль.

Вероятно, в client->gentity лежит какой-то мусор.
Я бы проверил, инициализировано ли это поле, и не испорчено ли оно где-нибудь.
55 2037540
>>037485
Мне конечно стыдно спрашивать, но как проверить инициализированность поля не читая его???
56 2037601
>>037540
Ты должен смотреть, чтобы у тебя неинициализированных полей в программе вообще не было.

Но, как мне кажется, у тебя дело в том, что где-то gentity портится. Может быть, в другом потоке, или в твоём же.
Либо память, на которую ссылается gentity, была уже где-то освобождена, но в NULL поле gentity после free() установлено не было.
57 2037709
>>037601
Блин. Ну правда, я не знаю как это делать безопасно, я никогда не кодил на чистом С.

Вот там есть несколько подполей.

gentity
gentity->r
gentity->r.svFlags

Как последовательно каждое из них проверить на инициализированность без риска получить вылет????
58 2037730
>>037709
Выясни, кто и как выставляет gentity. Это указатель на что-то.
59 2037731
>>037709
Ты фигнёй маешься, бро.

>как проверить инициализированность


В общем случае на твой вопрос ответ - никак, если речь про указатели, то обычно проверка против 0. Пиши отчёт автору, ну или кинь ссылку на исходники, у тебя там выше анон правильно сказал, что некий use after free (судя по виндовому сообщению) как минимум.
image.png26 Кб, 346x763
60 2037734
>>037730
Ты с ума сошёл? Это компьютерная игра. Там десятки тысяч строк. client это указатель на протагониста, а gentity - на его состояние. gentity меняет чуть ли не каждая воида во всех проектах.

>>037731

>кинь ссылку на исходники


лови
https://github.com/id-Software/RTCW-SP
61 2037760
Ddd
62 2037864
>>037734
Почитал немного есходнегов, там вообще global entities статическое хранилище, проверь, что указатель client живой, отпиши и дальше подумаем.
63 2037870
>>037864
Живой это != NULL???
64 2037873
>>037870
Ну тип сделай лоад по этому адресу, посмотри будут ли пинки от ос, заодно, да, проверь чё там по значению.
65 2037875
Хотя ладно там выше client->state. Ну хуй знает, анон, а ты вот пишешь, что модишь, чем ты мог обосрать работу посконного кода?
66 2037941
>>037875
Я не обсирал. Оно само стало обсираться. Вообще-то я там итак нихуёвый баг изначальных разрабов в своё время пофиксил
67 2037966
>>037941
Я ещё завтра на более свежую голову гляну, если не отпишу - ничего не нашёл. А так, пиши в спортлото автору.
68 2038037
>>037966
Надеюсь на тебя хуле. Потому что в Id Software мне скорее всего у виска покрутят.
69 2041634
>>037966
>>037381
>>037279

Всё псаны. Починил. Вопрос больше не актуален
Screenshot20210524211044.png1 Кб, 580x116
70 2041738
тредом ниже грозился взяться за бутстрап. и неделю назад дошли лапки. всю эту неделю тупа курил маны, статьи на осдев, так как почти нихуяшеньки не знал, тем неимение за это время узнал об архитектурах больше, чем за пару лет вузика. и вот первые успехи уровня /пр на пикриле если нажать ку, то пека и правда вырубится
далее буду учить стартовый буткод распозновать сигнатуру лини и попробую загрузить бут ядра.
асло если кому-то понадобится - http://www.ctyme.com/rbrown.htm (тут всё "апи" бивуса).
71 2042942
>>041634
Как починил? Я выше дропнул смотреть, когда увидел, что там код виртуальной машины, возможно, ебашит не туда.
72 2043302
>>042942
Это функция отправки сообщений клиентам сервера. Смысл проверки (gentity->r.svFlags & SVF_CASTAI) в том, чтобы выяснить, является ли данный клиент ботом. Потому что ботам отправлять сообщения не нужно, и поэтому нужно сделать continue. Но у нас сингл-плеер игра, т.е. на сервере могут быть либо боты, либо протагонист. Я нашёл, что отличить игрока от бота можно ещё одни способом. В структуре gentity есть поле name в котором хранится имя клиента и оно всегда инициализировано. Я сделал проверку, что если gentity->name равно WolfPlayer (так сервер называет протагониста), то вот эту ёбаную проверку на вылетающем r.svFlags я перепрыгиваю.
73 2045593
>>041738
Тоже вкатываюсь в осдев, сделал вывод для себя что асм в пользовательском пространстве даже рядом не стоял с асм в режиме ядра. Если будут какие успехи пиши тут, интересно понаблюдать до чего дойдешь, а лучше линк на гитхаб с своим загрузчиком скинь
74 2048279
>>029476
Си живее всех. Это скорее русскоязычное сообщество мертво. Это и не удивительно, что с такой культурой дискуссии все давно разбежались по англоязычным платформам. Зашёл тут на /pr/ со скуки, а тут Си-тред валяется в самом конце, при этом в топе JS, бугурт-тред и чьё-то нытьё. Позорище.
75 2048329
>>048279
А я помню времена, когда тут постоянно апался ассемблер-тред.
Мда, доска реально выродилась, причем за последний год.
76 2049285
>>048329

>А я помню времена, когда тут постоянно апался ассемблер-тред.



Он был довольно активным, просто в бамплимите.
77 2050336
>>041738

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


Через APM небось? А то он немножко сдох уже.
51AFPem-MlL.SX377BO1,204,203,200.jpg35 Кб, 379x499
78 2051291
Как вам пикрелейтед?
79 2051333
>>051291
А ты точно тредом не ошибся? Поверхностно, слегка устарело, но лучше, чем ничего.
80 2052471
Аноны, всем привет. Я вкатываюсь в си и офк первым делом полез в >The C Programming Language
Но не старая ли она в 2021? Например пикрил, сейчас же пишут int main(), да и компилятор ошибку выдавал когда я без инта вводил. И таких примеров я заметил несколько за первые 100 страниц.
Мнение тредика какое? Мб стоит схавать для начала пикрил 2? >C Programming: A Modern Approach
image.png104 Кб, 961x692
81 2052476
>>052471
фикс пикрил 1, вот что в >The C Programming Language
sage 82 2052497
>>052476
Это старый стандарт, там int считался дефолтным, поэтому его можно было не писать. Если очень надо, то посмотри доки к компилятору, там должно быть написано про включение поддержки старых стандартов.

>Но не старая ли она в 2021?


Сам язык в 2021 году старый.
83 2052541
>>052497

>Сам язык в 2021 году старый.


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

Мой вопрос был про актуальность книги и ты на него ответил, так что спасибо и удачи. Я мухожук
84 2052548
>>052476
Возьми второе издание книги там уже все нормально по стандарту
85 2052603
>>052548
А где его укасть можно? На флибусте только это вроде бы
86 2052621
>>052603
А нет, оказывается во втором издании ничего не поправили, почему-то думал что там все нормально
По С кстати есть годный короткий плейлист от Хирьянова https://www.youtube.com/playlist?list=PLRDzFCPr95fLjzcv6nNdjMu_9RcZgIM9U, тут не только сам Си но и смежные к нему области вроде алгоритмов, теории компиляции рассматривают
87 2052819
В исходниках ping http://www.ping127001.com/pingpage/ping.text нашел с кусок кода
main(argc, argv)
char *argv[];
{...}

Что это за хуйня ?
88 2052824
>>052819
легаси формат реализации функции
89 2052825
>>052824
И как оно работает?
90 2052827
>>052819
Реализация функции по старому стандарту языка
91 2052828
>>052825
Загугли и почитай
92 2052853
>>052621
Да, я его тоже смотрю. Спасибо тебе!
93 2052877
>>052819
c - count
v - vector
94 2054243
Можно ли написать бэкенд для веб-приложения на чистом Си?
luch-dobra.jpg37 Кб, 600x513
95 2054264
>>045593

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



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

>Если будут какие успехи пиши тут, интересно понаблюдать до чего дойдешь,



Я напоролся на архитектурную диллему в чейн-лодинге, сродни про яицо и курицу.
В некоторый момент неизбежно потребуется загрузить второй стейдж (очевидно чем раньше - тем лучше).
Вопрос, где хранить второй стейдж? На одном из разделов - плохая идея, так как инсталяция загрузчика потребует запиливание нового раздела, что не есть адекватно хотя вроде загрузчик NT так делает.

В /бут/ ? Тогда потребуется вскрыть файловую систему на разделе, загрузить соответствующие дровишки (опять же, откуда?) и уже через них искать бинарь со вторым стейджем; причем все эти действия могут и не уместиться в 446 байт.

Есть правда такая штука, VBR (volume boot record), то же что MBR только на разделе, а не на диске. В ней же инфа о файловый системе. Можно делать следующим образом:

1. смотрим следующий раздел
2 если он активен, тупа (как БИОС) грузим его VBR в другую локацию и передаем контроль туда
3 смотрим файловую систему
4 смотрим 2stage грузим его и благополучно передаем контроль
Если что-то не так - откатываемся к п.1 (т.е. возврат к 1 стейджу)

Но во-первых согласно osdev, VBR "не совсем стандартен".
И во-вторых, прописаться в этот верхний кусок раздела во время инсталяции возможно тоже не самая адекватная идея.

Одним словом подсказки бы не помешали.

>>050336

>Через APM небось?


Через ACPI. А если честно, то нужный int на стэк-оверфлоу нашел и просто копировал наудачу. Асло где-то слышал, что ACPI - точное надмножество над APM.
luch-dobra.jpg37 Кб, 600x513
95 2054264
>>045593

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



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

>Если будут какие успехи пиши тут, интересно понаблюдать до чего дойдешь,



Я напоролся на архитектурную диллему в чейн-лодинге, сродни про яицо и курицу.
В некоторый момент неизбежно потребуется загрузить второй стейдж (очевидно чем раньше - тем лучше).
Вопрос, где хранить второй стейдж? На одном из разделов - плохая идея, так как инсталяция загрузчика потребует запиливание нового раздела, что не есть адекватно хотя вроде загрузчик NT так делает.

В /бут/ ? Тогда потребуется вскрыть файловую систему на разделе, загрузить соответствующие дровишки (опять же, откуда?) и уже через них искать бинарь со вторым стейджем; причем все эти действия могут и не уместиться в 446 байт.

Есть правда такая штука, VBR (volume boot record), то же что MBR только на разделе, а не на диске. В ней же инфа о файловый системе. Можно делать следующим образом:

1. смотрим следующий раздел
2 если он активен, тупа (как БИОС) грузим его VBR в другую локацию и передаем контроль туда
3 смотрим файловую систему
4 смотрим 2stage грузим его и благополучно передаем контроль
Если что-то не так - откатываемся к п.1 (т.е. возврат к 1 стейджу)

Но во-первых согласно osdev, VBR "не совсем стандартен".
И во-вторых, прописаться в этот верхний кусок раздела во время инсталяции возможно тоже не самая адекватная идея.

Одним словом подсказки бы не помешали.

>>050336

>Через APM небось?


Через ACPI. А если честно, то нужный int на стэк-оверфлоу нашел и просто копировал наудачу. Асло где-то слышал, что ACPI - точное надмножество над APM.
96 2054482
>>052819

>somebody's printing up packets!



что-то проиграл. неужели такое возможно.
97 2054649
>>054243
На чистом с++ легче.
98 2054665
Анон, подскажи тупому:
Есть условие

if (click==3)
{
x=y+10
}
Как мне увеличивать значение х на 10 при каждом выполнении условия click=3? Обернуть это дело в цикл?
99 2054696
>>054243
>>054649
Поздравьте меня, анончики. Я на днях принял пиздатый job offer. Буду работать с бэкендом на C++.
мимо анон без опыта
100 2054946
>>054665
if (click == 3)
{
x += 10; / или x = x + 10 /
}
101 2055443
>>054696
Поздравляю, анон.
Пили кулстори.
102 2055452
>>052471
Новый стандарт Си не так чтобы очень сильно отличается от старого. Это же не плюсы, где наворотили кучу хипстерских приблуд.
103 2056966
https://pastebin.com/6y2Pwj8e

В чём проблема помимо моей необучаемости? Как сделать, чтобы всё работало так, как я хочу? Нужно, чтобы внутри программы test существовал объект (или ссылка на него) foo_list из моей библиотеки без его явной декларации (чтоб красиво было), состояние которого можно было бы менять через соответствующие функции. У меня, насколько я понимаю, получается, что он где-то в загруженной в память библиотеке существует без возможности его изменения.
Я в C полный нуб, сильно палками не бейте.
104 2058123
Сообщение в день. Даже для форумов это кисло.

Подскажите, каким образом можно на си+линукс реализовать такой обработчик сигналов извне (наподобие прерываний), который бы обрывался на следующем приходящем сигнале?

Я попробовал через signal(..) - получилось, что он ждёт полного выполнения кода обработчика, что неприемлемо. Однако выгружать программу нельзя - просядет производительность из-за сервисных издержек.
105 2058126
К тому же нужна вся обвязка. Обработчик не должен заново инициализировать кучу таблиц и т. п.
106 2058422
Как отправить udp сообщение всем в указанной ip?

Мне нужно, чтобы клиент отправил всем строку, а сервер, прочитавший и понявший, что это к нему стучатся, начал общение.
Вот, но я не понимаю, как это широковещательное сообщение от клиента отправить.
107 2058807
>>058422
Блин, может я чего-то недопонял.
Это за тебя уже придумали, отправляй на широковещательный адрес твоей сети, это самый последний адрес в сети, но он вычисляется в зависимости от маски. Проще воспользоваться сетевым калькулятором.
Например - https://ipcalc.co/ вставляешь какой-то адрес из твоей сети вместе с маской, в результате смотришь broadcast.

Если тебе нужно отправить в другую сеть, то там уже нужна маршрутизация, маршрут до другой сети прописывается на роутере.
108 2059409
>>027897 (OP)
Какой стандарт самый-самый?
1620668565000.jpg135 Кб, 532x558
109 2059845
Анон, если код часто работает с файлами через стандартную либу, то нужно постоянно проверять эту работу (на количество прочитанных/записанных файлов, возврат ошибочных значений)?
110 2060217
>>059409
ANSI C 89
111 2060261
>>060217
Из-за древности?
112 2060481
>>060261
Из-за компактности и совместимости.
113 2060914
>>059845
Даже если не часто, а всего один раз и всего лишь на полшишечки — возвраты надо проверять у любой функции, которая может закончиться не очень успешно.
114 2064088
>>052497
Старый то старый, но до сих пор активно используется минимум в паре сфер.
И, помимо этого, есть еще куча аматоров в Linux и MCU (настоящих MCU аматоров, не соевых письтеров пердуинщиков), которые этот самый язык юзают.
115 2064725
>>054264

> А если честно, то нужный int на стэк-оверфлоу нашел


Значит через APM.

> ACPI - точное надмножество над APM


Никаким местом. Мало того, на новых компах, особенно ноутах, CSM в APM не умеет. Есть только APM installation check, который говорит, чтобы ты шел нахуй.

> 446 байт


У нас EFI давно, на разделе дохуя места под любой лоадер, который ты только можешь себе вообразить.
image.png117 Кб, 600x450
116 2065475
117 2065540
>>064088
Плюсую тебя. Ещё добавлю, что половина софта в обычном дистрибутиве GNU/Linux точно написана на Си. И разные *bsd системы тоже сюда же.
И эти вещи кто-то поддерживает, и софтины по типу mesa, wine, которые цветут и развиваются. А значит и какой-никакой спрос на толковых разработчиков на Си будет.
118 2065542
ну судя по условию тебе нужно написать как кинул этот анон -> >>054946

А зачем переменная "y" тут?
119 2066014
C на первом месте, пиздос и вакансий как на яву, если выбросить мусор, а может еще больше.
https://habr.com/ru/company/skillfactory/blog/531360/
Я конечно понимаю, по сравнению с убогим C++ сишка ахуенна да и вообще низкоуровневый язык.

Как у вас тут дела, что программируете, работаете ли?
Одно огорчает, что в вакансиях обязательно всякий мусор, как вышка и знания ОПП(его вообще кто-то не знает?). Зато все такие тру программисты. Выделяете память, следите за ядром линукса, работаете с системной поебенью и костылями.

Мимо зашел студент год назад бросил c++, начал учить джаву
120 2066677
>>066014

>Как у вас тут дела, что программируете, работаете ли?


Переписываю сейчас один микросервис с питона на Сишечку. Вообще-то кабанчик хотел С++, но я ему по красоте пояснил, что плюсы там как собаке пятая нога.
72834478p0.jpg731 Кб, 1920x1080
121 2070708
Анон, нужна твоя помощь.

- Поступает информация потоком (с файла или с клавиатуры).
- Из этой информации нужно извлечь только double, а прочий мусор игнорировать
- Триггер прекращения чтения: EOF или последовательность символов "end"

Как реализовать это более элегантно?

Вроде бы ничего сложного, можно читать даблы с помощью fscanf'a, но всё портит "end" который нужно детектить чтобы прекратить чтение
122 2070749
>>070708

>всё портит "end" который нужно детектить


Ну так детекти. В чем конкретно проблема?
123 2070770
>>070749
как?
124 2070781
>>070708
Ты лучше расскажи, как ты fscanf'ом мусор игнорируешь?
125 2071681
ребят помогите пожалуйста. Нужно понять как реализовывать односвязные, двусвязные списки на СИ. Что это такое и как они работают примерно разобрался. Но вообще не понимаю с точки зрения кода. Как создать, добавить и т.д.?
126 2071693
>>071681
Дейтелов кочай. Там все есть.
А на пальцах объяснять долго.
127 2071695
>>070708

>EOF или последовательность символов "end"


А что такое собственно символ "end"?
128 2071751
>>071695
не символ, а последовательность то есть { 'e', 'n', 'd' }
129 2071954
Мышь
130 2071985
>>071751
Если ты тот анон, то начинай отвечать на наводящие вопросы >>070781
131 2071988
>>071751
Ну значит юзай fgetc и считывай посимвольно.
Навряд ли что-то еще можно придумать.
132 2071996
>>070708
мб read()?
download.jpg44 Кб, 400x524
133 2072134
https://learning.oreilly.com/library/view/smaller-c/9781098100322/
Понравилась мне идея подучить си, балуясь с железками, а то просто так неинтересно после высокоуровневых языков.
Там тип рекомендует девборды от каких-то американских хипсторов, но они за любую хуйню дерут втридорога. Я посмотрел на али, там полно копеечных штук и досыпают ведро всяких проводков, лампочек и датчиков заодно.
Но хуй знает, что конкретно брать. Есть у кого опыт?
134 2072329
>>072134
Чем тебе arduino не угодил?
eflb15ugb9k61.png174 Кб, 711x658
135 2072500
>>070708
Если речь идёт именно про элегантность, то подобные вещи лучше всего решаются при помощи конечного автомата.
Погугли, что такое конечный автомат и как он работает.
Это прямо то, что тебе нужно.

Разумеется, реализация КА довольно массивная, и если тебе это нужно на один раз, то проще и впрямь через fgetc() сделать и пару костылей.
А если у тебя такие задачи возникают постоянно, подумай о том, чтобы подключить библиотеку регулярных выражений.
Но самое элегантное решение, на мой взгляд - это конечный автомат.
136 2072649
>>072329
Там и этих оригинальных ардуино дохуя на разных архитектурах, а клонов в сто раз больше. Как выбрать?
137 2073227
>>070708
Я бы предложил построчно читать и парсить строки (fgets). Проверяешь (switch) на 'e' -> проверяешь (strncmp) на "end"; проверяешь на цифру, плюс, минус, точку -> делаешь strtod, он либо вернется с ошибкой, либо даст новый указатель; если что-то сфэйлилось, инкрементишь указатель. Будет одновременно читабельно и не слишком медленно.

>>072134
На девборде уже все распаяно, отлажено и документировано. Периферия именно та, с которой ты захочешь поиграться (экранчики, тачи, кнопочки-крутилки и светодиоды, само собой). У китайцев нормальных отладок с периферией нет, будешь собирать на dupont-кабелях с бредбордой и гадать, почему у тебя не заводится - то ли контакт плохой, то ли модуль тебе дохлый прислали, то ли подключил не туда или не так (нужен какой-нибудь подтягивающий резистор, а ты проглядел), то ли дело все же в коде. На первых порах такое часто встречается. В первом варианте ты получаешь удовольствие, во втором - опыт.

>>072649
А что в книжке советуют? Вот подобное и ищи.
138 2073284
Хакеры нефтепроводов, можно ли такое макро сделать:

Допустим есть вызов макроса

M(1,5);

Можно ли
#define ARG 1,5

M(ARG)

Или каким то другим образом замакрить пару параметров.
Хорошо бы это паре одно имя.
139 2073932
>>048279
Да нет, решение уже принято. Все корпорации активно начали топить против Си. К 2025 Си станет нишевым языком для энтузиастов, а к 2030 отомрет вовсе.
140 2073935
>>073932
Даун, просто съеби из треда, ок?
141 2073948
>>073932
Goвнарь незаметен
142 2074028
>>073284
Можно, разрешаю.

>>073935

> К 2025 Си станет нишевым языком для энтузиастов, а к 2030 отомрет вовсе.


Да он прав тащемта. Си никогда не был хорошим языком, а сейчас он к тому же устарел и плохо подходит для современной разработки. Даже на микроконтроллерах его активно вытесняют. Исправить Си нельзя, не сломав совместимость, без совместимости он нахуй никому не нужен. Но к обеим датам лет десять я бы смело прибавил.
143 2074033
>>074028
Тебе же по-русски вроде сказали, съеби из треда.
Что не понятного-то?
>>074028

>Можно, разрешаю.


Еще и жалкие пуки свои тут оставляешь, олень.
144 2074093
>>074028

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


А что тогда хороший язык для этих целей? Я думаю, что Сишка даже условный раст переживет, который через пару лет на мусорку отправится.

>Даже на микроконтроллерах его активно вытесняют.


Это чем же? Питоном, жабаскриптом, растом? не смеши пожалуйста.
145 2074114
>>074093

> Питоном, жабаскриптом, растом


Да, да и да луа забыл, лол. А главным образом крестами.

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


Вот это как раз очень возможно. Хотя про пару лет ты загнул.

> А что тогда хороший язык для этих целей?


Это такой, в котором чуть меньше UB, чуть больше неймспейсов и есть что-то хотя бы чуть-чуть получше _Generic. Ах да, и в который настоящий const завезли, а не вот это самое.
146 2074171
>>073932
По этой логике отомрут компьютеры, останутся веб-страницы в проприетарных корпоративных сетевых терминалах это такие мониторы с кклавиатурами, подключенные удаленно к мейнфрейму в датацентре. Только Си тут ни при чем.
147 2074216
>>072134
В /ra/ есть тред по ардуинам. Попробуй там спросить.
148 2074438
Сап,
Есть функция, внутри которой создаётся определённой длины массив структур.
shape shapes[10]

И после заполняется данными.
Внутри функции все данные заполнены корректно, и всё отображается как надо.

Мне нужно вернуть этот массив, но когда я возвращаю указатель массива return shapes*. Если попытаться обратиться к любому полю любого кроме первого элемента массива - то там какая-то нёх (мусор в памяти)

Вопрос: как мне правильно вернуть массив?
149 2074451
>>074438
Вопрос отменяется, я просто сделал массив в глобальной области
150 2074557

>disk space: OK


>disk space: 16K



Апхахпха, проигрямсь
151 2074565
>>054946
Спасибо, заработало.
152 2074844
>>074114
>>074093
Ржавый так на мусорку отправляется, что аж модули ведра линукс на нём пилят
153 2076639
>>027897 (OP)
Пацаны а шо будет в возвращаемом значении, если скастить void функцию к int?
154 2076677
>>076639
наверное по конвенции будет то, что завалялось в контрольном регистре. а скорее всего ещё на конпеляции транслятор в ебло харкнет за такие дела
155 2078713
Где почитать про функции write read из unistd.h . Какие параметры у них?
Ато есть подобное типа write(1, &n, 1) что это значит и можно ли пропускать параметры?
156 2078881
изображение.png2 Кб, 386x67
157 2079217
Листал сорсы ядра линукса, и нашел вот такую реализацию листа
Ну и как они его используют, он же пустой

include/linux/types.h
158 2079341
>>079217

> Ну и как они его используют


Точно так же, как в крестах, только вместо наследования - композиция:
struct myobject {
struct list_head list_of_something;
int mydata;
}
И сразу гугли CONTAINING_RECORD, чтобы понять, как из list_head сделать myobject.
159 2080489
Анон, есть такая функция в файле UART.c
void UART(void)
{

X_sample = (int) ReadFromRXBufFL(RXBufAddrParsing+14);
Max_sample= (int) ReadFromRXBufFL(RXBufAddrParsing+18);
}
Которая принимает данные из буфера.
В заголовочном файле UART.h она указана как
void UART (void);
Как мне в файле programm.c заполучить содержимое переменных X_sample и Max_sample
при выполнении цикла for(i=0;i<10;i++). Я объявлял переменные extern'ом в заголовочном файле programm.h, но данные из этих переменных приходят одни и те же.
sage 160 2080657
>>080489

> ReadFromRXBufFL


Моя карманная ванга намекает, что данные ты либо не получаешь вообще, либо этот буфер надо poll-ить. В любом случае надо знать, что за МК, что за либа, как она работает.
161 2080693
>>080657
LPC 2138, uart написан каким-то васяном и он работает, когда надо получить одно значение, в program.c я делаю вещь типа tempX=X_sample (X_sample - глобальная переменная, объявлена как extern в program.h, но как только я оборачиваю это дело в цикл, то весь цикл пишется одно и то же значение X_sample. В связи с этим и возник вопрос, насколько я всё делаю неправильно.
162 2080715
>>080693
Не уверен что тебя понял, но:

>объявлена как extern в program.h


volatile не забыл? Либо компилируй с -O0.

>весь цикл пишется одно и то же значение


Если в цикле нет значительной задержки, то все логично. По UART данные приходят сравнительно медленно.
163 2082767
Почему в стандартных либах нет такой полезной штуки как fsizeof(fp)?
164 2083172
>>082767
из за переносимости?
165 2083765
>>082767
Не договорились, что возвращать для терминала.
966-9660435high-resolution-recreation-of-the-8-bit-mario.png37 Кб, 2400x3200
166 2083912
Вечер в хату, уважаемые.
Смотрел на код представленный тут:
https://github.com/OneLoneCoder/olcPixelGameEngine/blob/master/olcPixelGameEngine.h

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

В частности, в этой строчке:
Construct(int32_t screen_w, int32_t screen_h, int32_t pixel_w, int32_t pixel_h, bool full_screen = false, bool vsync = false, bool cohesion = false);

Как я не пытался, не смог найти связь между этими значениями и вызываемой WinAPI (или OpenGL?) функцией для "зернистости" физических пикселей.
Гугление pixel scaling, pixel resolution, pixel ratio, custom pixel size ничего не дало. Использование brush и pen не помогает, так как в вышеприведенном файле во-первых они не используются, а во-вторых не позволяют установить неквадратные пиксели.

Помоги пожалуйста.
Спасибо.
image.png6 Кб, 187x130
167 2083917
>>083912
Не тот трент.
168 2083927
>>083917
Бляя, ну понятно же что речь идет о низкоуровневых вызовах, какая разница как вызывается конструктор класса?
169 2083977
>>083927
Я, например, понятия не имею, где искать низкоуровневые вызовы из конструктора класса. В С, я бы увидел объявление Construct() в .h файле, открыл .c файл, и прочитал бы определение, и там были бы все вызовы. В каком .cpp это искать здесь?
170 2083991
>>083977
Ты даже не прошел по ссылке, да? Там ОДИН .h файл.
171 2083995
>>083991
А кто тогда долже определения функциям давать? В этом единственном .h файле только объявление. Я так понял, что это я не смог найти определения для Construct(), а ты утверждаешь, что его вообще нет?
172 2084029
>>083995
Блядь, просто не пиши, если не можешь понять простой абзац на русском языке. Мигрант ебучий.
173 2084042

>этот подрыв


Зачем ты так с этим с++ником? Он же дефинишн от декларейшена не отличает.
sage 174 2084116
>>083995
Гуглим header-only library. В сишке тоже так делают.
175 2084197
>>084116
Здорово. Определение-то где? Оно же не макросом генерируется, чтобы это header-only library была.
176 2084272
>>083912
Ок, закину в C++ тредю.
177 2084399
>>084042
>>084197
Пиздец - это тред Си или аутистов?

>>Оно же не макросом генерируется, чтобы это header-only library была.


Что ты такое и что ты блядь такое несешь?

>>083995

>В этом единственном .h файле только объявление.


Иди книжку по си почитай чтоли?

в h может быть что угодно - хоть поэма Пушкина в строках. Уж сишнику не знать про компиляцию кода, это конечно пиздец полный
178 2084488
>>084399

>может быть что угодно


А есть только объявление. Ты в него заходил?
180 2084539
>>084510
А, я обосрался, искал с пробелом в начале, а там "::".
16249771411720.png37 Кб, 2400x3200
181 2084764
>>084510
Вот-вот.
А дальше куда закидывается? Не понимаю.
182 2085543
Хуй его знает куда написать.

Кароче есть старая карта 7 серии нвидиа и так получилось что её нужно воткнуть в систему с 10 виндой. Дрова под карту есть только для 8.1 винды. Собственно что делать? Почитал что можно конвертировать проект для 8.1 до 10 винды автоматически, но для этого ведь исходники нужны, а нвидиа проприетарные. В общем есть какие-нибудь предложения у анона?
183 2085556
>>085543
ну ты и лалка
184 2085889
>>085543
на линух есть дрова? их конвертировать может?
185 2086546
Пытаюсь скомпилить вот этот код:
https://github.com/engineer-man/youtube/tree/master/062
$ sudo make
Получаю:
make -C /lib/modules/5.12.14-arch1-1/build M= modules
make[1]: Entering directory '/usr/lib/modules/5.12.14-arch1-1/build'
scripts/Makefile.build:43: arch/x86/entry/syscalls/Makefile: No such file or directory
make[2]: No rule to make target 'arch/x86/entry/syscalls/Makefile'. Stop.
make[1]:
[arch/x86/Makefile:223: archheaders] Error 2
make[1]: Leaving directory '/usr/lib/modules/5.12.14-arch1-1/build'
make: * [Makefile:4: all] Error 2

Алсо, пикрил (проверил в /usr/include/linux, файла там и правда нет), но пакет с заголовками накачен:
$ sudo pacman -Qe linux-headers
linux-headers 5.12.14.arch1-1

ЧЯДНТ?
sage 186 2086575
>>086546
ls -l /usr/lib/modules/`uname -r`/build/include/linux/init.h
187 2086649
2 функции

что это за ошибка? void create нормально создает матрицу и выводит её, а void print выдает эту ошибку

Если код void print'a засунуть в void create, то всё выводится и параметр x виден

В main'е тоже код print'a выдает ту же ошибку
188 2086691
>>086649
Ошибка работы с памятью.

Если быть точнее - ты передаешь int ××a в функцию аргументом, как int ××x, по сути ты NULL копируешь в функцию, и там его уже в стек фрейме заменяешь, не меняя значение самой ××a.
Тебе надо в create передавать тройной указатель и a передавать как &a в него.
189 2086692
>>086575

>ls -l /usr/lib/modules/`uname -r`/build/include/linux/init.h


Так, вот здесь имеется, значит. Тогда получается всё правильно. И как тогда заставить его работать?
Или не правильно. Он вообще должен быть там, или это на арче навасянили так?
image.png67 Кб, 1089x692
190 2086742
>>086691
Сори, не могу понять:

Изначальный вариант
https://pastebin.com/bdvTU1Dq

Попытка исправления
https://pastebin.com/QpgvM1bb
191 2086845
>>086742
Надо либо так:
https://ideone.com/NId5CR

Либо сделать правильно и адекватно:
https://ideone.com/HYOK3y
(Просто возвращать из функции создания int××)
192 2086888
>>086845
Спасибо.
cirno-gta.jpg49 Кб, 604x362
193 2086941
Анон, происходит какая-то чертовщина.
ГЦЦ пишет, что LLONG_MAX udneclared. Хотя limits.h подключен, в самом хидере этот макрос тоже есть.

Не стандартных хидеров неподключено. Пробовал включать limits.h последним, тот же результат (хотя было бы странным, если какие-то другие хидеры раздефайнили).
Также если поставить другой лимит, например LONG_MAX, то всё работает.
194 2086965
>>086941
Ты компилишь что ли с -std=c89?
195 2086982
>>086965

>с -std=c89?


Именно
nedoumeniye.jpg82 Кб, 700x700
196 2086993

>signed long long int


>Specified since the C99 version of the standard



Грустно, что сказать. Странно, что с -std=c89 гцц даже не ругнулся на этот тип
sage 197 2087244
>>086692

> И как тогда заставить его работать?


Обеcсудь. sudo убери, нахуй тебе sudo для сборки? Да, просто make.
sage 198 2087245
>>087244
И еще скажи, что у ты любишь мозоли: MODULE_LICENSE("gpl"); куда-нибудь в конец rickroll.c.
199 2087419
>>086993

>с -std=c89 гцц даже не ругнулся на этот тип


Потому что что указание стандарта не для ругательства? Для ругательства -pedantic
https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html
2121.png16 Кб, 652x405
200 2088244
Парни, такая ситуация. Программирую под мк, чистый си. Недавно вот захотел попробовать uclinux-ng, не спрашивайте зачем, мои цели за гранью. Думал там простая либа, но что-то вообще не въеду как её собрать под cortex-m4? Есть хоть какой-то гайд, не знаю с какого конца подходить, там мэйкфайлы какие-то, что с ними делать непонятно, гугол масоны засрали говном, ничего не нашёл. Среда программирования - IAR EWARM.
201 2089061
Господа, насколько я понимаю, если fread при считывании очередной порции данных натыкается на конец файла, то данные до него будут сохранены в указанной области памяти, ведь так? Если так, то я не понимаю почему у меня эти данные куда-то утекают при считывании большем, чем по одному байту.
202 2089112
>>089061
Разобрался с этой проблемой, оказывается, что предыдущие данные сдвигаются в области памяти из-за чего я подумал, что они потерялись.
203 2089205
Почему в си нет ссылок?
204 2089250
>>089205
>>089205

Я же правильно понимаю, что эти ваши линки - статические адреса на этапе компиляции? Если да, то какой в них смысл? Они же экономят одно адресное слово, а также несколько копирований, но путаницы в исходнегах могут внести куда больше
мимо-неофаг
205 2089253
>>089205
Что такое ссылка?
tlen4-b-6316.jpg29 Кб, 512x384
206 2089263
А я вот тут подумал, и мне показалась интересной (своя) идея с таким билдом, чтобы как указатель (типа адрес), но при попытки модификации всё бы наебнулось (в рантайме).
Не знаю зачем, но интересно
207 2089281
>>089253
>>089250
Насколько я понимаю ссылка это просто сахарочек, который за тебя разыменовывает и берет адрес. Что он может сломать?
sage 208 2089300
>>089281

> Что он может сломать


Мозг читающего код. С указателем видно сразу, указатель ли он, или вот объект лежит туточки. Со ссылкой - нет.
209 2089341
>>027897 (OP)
На чем вы бля дебажите в 2021? Это же пиздец, нужно посмотреть память и стеки вызовов, накатил Visula Code, какое то говно для пориджей нихуя не показывает, стер. Накатил Code::Blocks это говно сыпет программные ошибки. Vusula Sdudio этого ебаного монстра даже ставить не буду. Остался Eclips он точно работал...
210 2089343
>>089341
Ты наверное в Vim или Emacs пишешь да?
211 2089344
>>089343
Тогда бы он спокойно дебажил в гдб.
212 2089345
>>089343

>Ты наверное в Vim или Emacs пишешь да


В НотеПад++
>>089344

>Тогда бы он спокойно дебажил в гдб


Я могу конечно GDB запустить, но бля 2021 год.
213 2089346
>>089345

>но бля 2021 год


От книжек в пользу фильмов уже отказался?
214 2089357
>>089346

>От книжек в пользу фильмов уже отказался?


Поридж, твои Трансформеры и Супермены никому не интересны.
Безымянный.png61 Кб, 1011x758
215 2089359
>>089341

>Остался Eclips он точно работал


Eclips как всегда топчик, остальное идеобразное говно для пидоровпориджей.
216 2089376
>>089359
QtCreator еще оказывается С проекты поддерживает
217 2089415
>>089359
Ого а как регистры смотреть в студии? У меня чё-то пишет Нет данных если зайти в отладка окно регистры
218 2089566
>>089415

>в студии


А студия то при чем? Хотя раньше в Вижуалстудии с майкрософтовским конпелятором все отображалось.
219 2090025
Господи, какую кислоту в своих 70-х жрали Денис Ритчи и Кен Томпсон, когда придумывали синтаксис объявлений указателей на функции. Это же просто абсолютно контр-интуитивная хрень. Почему, сука, я не могу объявить массив указателей на функции так?!

char ()(int) a[10];

Даже так, чтобы убрать любые неоднозначности

(char (
)(int)) a[10];

Почему, блять, во всех остальных ситуациях, я слева пишу тип, потому пишу имя переменной и в квадратных скобках размер массива, а тут так не могу? Ебаный в рот. Указатель на функцию, возвращающую чар и принимающую инт - ЭТО И ЕСТЬ ТИП, БЛЯТЬ. Почему он должен подчиняться иному синтаксису?!
220 2090033
>>090025
Сделай тайпдеф и пиши нормально.
sage 221 2090177
>>090025

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


Никто ничего не придумывал специально. Объявление отражает использование.

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


Ты неправильно об этом думаешь. Например, у тебя есть char ∗abc[10] (десять указателей на char): ты берешь имя переменной abc, индексируешь его квадратными скобками abc[10], дереференсишь указатель ∗abc[10] или с явными скобками ∗(abc[10]), получаешь char. Да, я знаю, что 10 за пределами массива, суть не в этом.

То же самое с функциями: берешь имя abc, индексируешь abc[10], дереференсишь указатель ∗abc[10] или ∗(abc[10]), получаешь функцию, вызываешь (∗abc[10])(int), возвращается char. Полная декларация: char (∗abc[10])(int) или с избыточными скобками, более явно показывающими последовательность действий: char (∗(abc[10]))(int). Дереференс ∗abc[10] приходится класть в скобки из-за приоритетов операторов, чтобы char не отожрал звездочку себе: иначе получится массив из 10 функций, возвращающих char ∗, но массив функций (а не указателей на них) в сишке сделать нельзя по определению, и компилятор пошлет тебя нахуй.

Алсо, двачую тайпдефы. Если тайпдефать не указатель на функцию, а сам тип функции, то даже скобки не нужны, и все получается максимально читаемым, точно таким же, как и для объявлений данных. Тот же самый процесс, что и выше, но два шага:
typedef char MyFuncType(int);
MyFuncType *xyz[10];
Когда отдереференсим xyz по полной, получаем значение типа "функция принимающая int, возвращающая char", ее и вызываем. И вот только здесь могут возникнуть сишкопроблемы и некоторое недопонимание: вызовы (∗xyz[n])(k) и его аналог с избыточными скобками (∗(xyz[n]))(k) абсолютно очевидны, но xyz[n](k) и (xyz[n])(k) работают ничуть не хуже. И это последствия неявного каста объекта типа "функция" к указателю на него и того, что оператор вызова функций () работает именно с указателями на функции. К сожалению, это правило работает в выражениях, но не работает в декларациях, поэтому MyFuncType xyz[10], как я уже говорил выше, написать нельзя.
sage 221 2090177
>>090025

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


Никто ничего не придумывал специально. Объявление отражает использование.

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


Ты неправильно об этом думаешь. Например, у тебя есть char ∗abc[10] (десять указателей на char): ты берешь имя переменной abc, индексируешь его квадратными скобками abc[10], дереференсишь указатель ∗abc[10] или с явными скобками ∗(abc[10]), получаешь char. Да, я знаю, что 10 за пределами массива, суть не в этом.

То же самое с функциями: берешь имя abc, индексируешь abc[10], дереференсишь указатель ∗abc[10] или ∗(abc[10]), получаешь функцию, вызываешь (∗abc[10])(int), возвращается char. Полная декларация: char (∗abc[10])(int) или с избыточными скобками, более явно показывающими последовательность действий: char (∗(abc[10]))(int). Дереференс ∗abc[10] приходится класть в скобки из-за приоритетов операторов, чтобы char не отожрал звездочку себе: иначе получится массив из 10 функций, возвращающих char ∗, но массив функций (а не указателей на них) в сишке сделать нельзя по определению, и компилятор пошлет тебя нахуй.

Алсо, двачую тайпдефы. Если тайпдефать не указатель на функцию, а сам тип функции, то даже скобки не нужны, и все получается максимально читаемым, точно таким же, как и для объявлений данных. Тот же самый процесс, что и выше, но два шага:
typedef char MyFuncType(int);
MyFuncType *xyz[10];
Когда отдереференсим xyz по полной, получаем значение типа "функция принимающая int, возвращающая char", ее и вызываем. И вот только здесь могут возникнуть сишкопроблемы и некоторое недопонимание: вызовы (∗xyz[n])(k) и его аналог с избыточными скобками (∗(xyz[n]))(k) абсолютно очевидны, но xyz[n](k) и (xyz[n])(k) работают ничуть не хуже. И это последствия неявного каста объекта типа "функция" к указателю на него и того, что оператор вызова функций () работает именно с указателями на функции. К сожалению, это правило работает в выражениях, но не работает в декларациях, поэтому MyFuncType xyz[10], как я уже говорил выше, написать нельзя.
222 2090379
C89, C90 и ANSI C - это одно и то же?
sage 223 2090689
>>090379
Да. ANSI (США) стандартизировали в 89, ISO (Европа) в 90.
изображение.png3 Кб, 268x233
224 2090820
Аноны, есть один буффер типа unsigned char buf[80] где хранятся следующие данные присланные по uart:

Read 16: 0x7a 0x5 0x14 0x0 0x4 0x0 0x0 0x0 0x0 0x0 0x6d 0xfa 0xe1 0xf3 0x1e 0xc
Read 16: 0x7a 0x5 0x14 0x0 0x4 0x0 0x0 0x0 0x0 0x0 0x6d 0xfa 0xf3 0x0 0xc 0xff
Read 16: 0x7a 0x5 0x14 0x0 0x4 0x0 0x0 0x0 0x0 0x0 0x6d 0xfa 0x43 0x3b 0xbc 0xc4
Read 16: 0x7a 0x5 0x14 0x0 0x4 0x0 0x0 0x0 0x0 0x0 0x6d 0xfa 0x3b 0x0 0xc4 0xff

Могу ли я как-то из него извлечь 0xe1 0xf3 0x43 0x3b и объявить их переменной типа float?
225 2090836
>>090820
Кладешь в массив из 4 байт и кастуешь его адрес в указатель на флоат.
226 2090838
Или адрес флоата кастуешь в указатель на чар и кладешь туда.
sage 227 2090928
>>090838
Или делаешь через union, как человек, без UB:
union { uint8_t as_bytes[4]; float as_float } myvar;
228 2091535
>>090836
Спасибо, получилось, упаковал в новый массив. Нужно ли мне под этот массив[512] делать malloc?
229 2091596
>>090928
И в каком месте стандарт гарантирует расположение элементов в юнионе?
sage 230 2091617
>>091596
Все по офсету ноль. А type punning упоминается в примечании к C11 6.5.2.3.
231 2092070
>>027897 (OP)
Слышал что c99 сломан в сравнении с c89, а с11 исправил его, но никаких подробностей не было в источнике этого утверждения.
Шарящие, поясните что там к чему и как родилось такое утверждение?
Только не оспаривайте, блядь, это утверждение, я его не защищаю, мне просто интересно.
sage 232 2092400
>>092070

> Только не оспаривайте, блядь, это утверждение


Как же не оспаривать? В C11 не так много нового появилось, и ничего коренным образом не изменилось по сравнению с C99. Хуй знает, может быть, это про какие-то детали формулировок? Вот C17 тоже вышел без фич, просто всякие мелочи поправили. Стоит ли утверждать, что C11 тоже был сломан?
233 2092488
>>092400
Короче там просто хуйню спороли и ничего не сломалось?
1522672601222.png43 Кб, 2352x305
234 2093083
>>027897 (OP)
Нахуя пикрилейтеды делают? Сишка реально такая конченая, что приходится из макросов собирать не просто костыли, а шагоходы с креслом?
sage 235 2093120
>>093083
Во-первых, это Microsoft, у них отношения с Си всегда непросто складывались, несмотря даже на то, что ядро на Си написано. Они постоянно пытались что-нибудь хорошее выбросить или не поддерживать, а какое-нибудь свое говно наоборот притащить. Во-вторых, в семидесятых ни про какие аннотации не слышали. Тем более в языке, который недалеко от ассемблеров ушел. Так что да, приходится костылями, хотя нормальные люди пишут подобные проверки в теле функции в assert. Вместо in/out пишут const и иногда restrict, и в C2x атрибуты появятся, можно будет их использовать, если очень охота.
236 2093148
>>093083
Чет проорал с этих _наи__МеноВаний_
237 2093312
>>093120

> в C2x


Вот бы получить сахар из крестов, но без анальных ограничений...
Заебали пилить языки либо без производительности с зумерскими GC, либо ржавый кал с проверками всего что можно, не дающий раскрыться полёту фантазии.
238 2093319
>>093312

>не дающий раскрыться полёту фантазии


Сырыми указателями и unsafe можешь отстрелить себе хоть 40 ног!
240 2093338
>>093323
Он бы ещё стабильным был бы. Прямо сейчас 650 открытых багов. Писать что-то серьезнее калькулятора на нем невозможно, о чем в доке и пишут.
sage 241 2093350
>>093338
Мы все равно верим. Я вот джвадцать лет без преувеличений хотел comptime в сишке, и, наконец, оно есть хоть где-то.
242 2093977
Пацаны, есть один unsign char buffer[512*n], где n от 1 до 4096;
Время от времени приложение написанное на gcc падает с ошибкой Segmentation fault (core dumped), гугл говорит что это из-за неправильной работы с памятью. Вопрос можно ли как-то совладать с этой ошибкой или нужно урезать размер буфера?
243 2093987
>>093977
Не вижу проблемы в размере буфера, скорее ты где-то за его пределы ходишь. Кидай код, или сам осваивай валгринд.
245 2094057
>>093997
У тебя offset не инициализируется никогда, а используется в куче мест. Мусор какой-нибудь прибавляется к индексу в массиве, и он улетает за груницы и в sigsegv.
246 2094061
>>094057
Понял принял, а разве при создании переменной int offset; она не создается по умолчанию равной нулю?
247 2094064
>>094061
Нет.
248 2094156
https://docs.microsoft.com/en-us/windows/win32/fileio/exfat-specification

есть точно такие же спецификации, только для ext?
249 2094372
>>094156
Точно таких же нет, есть спека в doc-формате, первым же результатом в гугеле по очевидному запросу.
250 2094380
>>094156
>>094372
Извиняюсь, протупил. Есть статья про ext4: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout
Есть про ext2:
https://www.nongnu.org/ext2-doc/ext2.html
ext3 это просто ext2 + журнал, на него спеки в ext4
251 2094430
>>027897 (OP)
Предлагаю книжку для гуманитариев заменить на свежий "C for Dummies" за авторством Dan Gookin.
252 2094498
Если читать впадлу, но с программированием хоть немного знаком годный канал https://www.youtube.com/channel/UCz29nMCtFP5cuyuLR_0dFkw/videos . Дальше ведет кучу пет проектов на си на винапи и опен гл. Годный канал для всех. Предлагаю добавить в шапку.
sage 253 2094600
>>094498
Открыл рандомное видео (v7OcOW7NrLs), тыкнул в рандомное место: sockaddr.sin_addr не присваивется вместо этого куча мемсетов везде, ну ладно INADDR_ANY как раз ноль, повезло; TCP, но код возврата send/recv не проверяется отправили 200 байт, ушло 100; буфер размером 200 символов распечатывается после recv без обработки, просто printf("%s\n") т.е., если отправить 200 символов без единого \0, получим выход за пределы буфера. И это только несколько секунд одного видео. Закрыл. Это точно-точно нужно в шапку?
254 2094650
>>094600
Так ты в студии писал
sage 255 2095128
>>094650
Что?
256 2095179
>>095128
В студии не работает просто так этот код. Надо пердолится
257 2095479
сори если хуйню принес в тред, я только щупаю сишку на уровне любителя.
Кто-нить юзал/ет http://libcello.org/
вот случайно наткнулся, вроде прикольно, но там какой-то рантайм добавляют (по сути уже не си), курить дальше эту либу, или это шляпа какая-то?
258 2095486
>>095479
Бери сразу перл лучше, лол.
259 2095531
Гайз, а С вообще реально нормально выучить самому без вышки?
260 2095563
>>093323
блядь, этих ноунейм языков уже наплодилось
zig, odin, nim, beef, v, crystal ...

когда уже нормальное че появится не раст, как бы си люблю, но реально уже морально устарел. Да и виден запрос общества на модернизацию сишечки, раз столько япов развилось, которые до нормального продакшна все никак не дойдут
261 2095582
>>095531
Конечно, блядь, это ж не кресты.
30067889-1.jpg170 Кб, 900x1200
262 2095620
>>095563

>уже морально устарел

263 2095639
>>095620
когда ты в 2000-х был мелкий, наверное с тамогочиком ходил, или лизуном-сасуном каким-нибудь.
ну это другое совсем, твое поколение явно умней было, а сейчас зумеры эти - дегенераты.

Мимо не зумер
264 2095640
>>095486
перл хуйня ебаная
265 2095642
>>095640
Рот бы тебе мылом вымыл
266 2095643
>>095563
Дваждую.

Сам считаю odin наиболее интересным из всего что ты перечислил, жаль наиболее хайповый из них zig.

Так то к сишке многого не нужно, нормальные дженерики и может еще несколько стандартных контейнерова и все впрочем, по желанию трейты добавить еще можно.
267 2095689
>>095643
там в том-то и прикол что не надо там что-то супер новое.
даже синтаксис не надо менять

просто мб методы для структур как в го
интерфейсы как в го
дженерики
как-то продумать обработку ошибок
и инфраструктуру нормальную запилить, что-то типо cargo
ну и мб как-то отказаться от .h файлов
268 2095692
>>095689
ну и неймспейсы тоже неплохо было бы, хотя не настаиваю
sage 269 2095775
>>095563
Crystal и Zig заслуживают ознакомления, но Crystal - это не про сишку.

>>095689

> и инфраструктуру нормальную запилить, что-то типо cargo


Это провоцирует лефтпады. Диды вон писали без карги, и нам она не нужна.

> как в го


Возьми го и пиши в го, как в го. Тут должна была быть шутка про продумывание обработки ошибок.

> не надо там что-то супер новое
Надо. Современное программирование сильно отличается от того, как писали раньше. Даже тупо железо отличается. А в сишке вон многопоточность только-только появилась.
270 2095836
>>095775

> Возьми го и пиши в го, как в го.


не хочу го, пробовал - хуйня

> А в сишке вон многопоточность только-только появилась.


не понял прикола, ты про что?
системными вызовами создаешь свои потоки, что значит недавно в си появилось? если че - да, я нуб в си, чисто для души вкатываюсь
271 2095868
>>095563
пиши на крестах там все есть
272 2095869
>>095775

>А в сишке вон многопоточность только-только появилась.


pthread существует с середины 90х
273 2095872
>>095868
что там есть?
274 2095883
>>095872
шаблоны, лямбды, корутины, модули, наймспейсы, скоро еще завезут pipeline-operator и pattern matching
все твои любимые сишные библиотеки работают без танцев с FFI
что еще нужно?
275 2095941
>>095883

>скоро еще завезут pipeline-operator


Уже завезли в стандарт, а раньше можно было библиотеками подключать.
276 2096041
>>095883
в расте тоже допизды всего, я же не дрочу на раст, хотя пытался
sage 277 2096053
>>095869
Ага, оно работало примерно как 1 << 31. Все знают, что получится, но у стандарта другое мнение. Та абстрактная машина, под которую пишется сишный код, ничего не знала о потоках. Соответственно, ни сам язык, ни стандартная библиотека ничего не гарантировали, были только местные фокусы, работавшие на честном слове.
278 2096067
>>096053
так подожди, а что тогда поменялось?

> А в сишке вон многопоточность только-только появилась.



я не гуру, но знаю только pthread, если еще какие-то имплементации, есть даже кроссплатформенное решение какое-то.
А че у же в стандарт си завезли потоки?
sage 279 2096095
>>096067

> а что тогда поменялось?


Да ничего, в общем-то. Наука официально признала, разрешила и все такое. Атомики вот завезли наконец.
280 2096726
сори за супер нубский вопрос

это норм что в h файле я определяю структуру, ну прям полностью, с полями?

просто иначе если я объявляю ее в h файле но определяю в .с, у меня сыпят ошибки разные типо storage size of ‘point’ isn’t known.
оно и понятно что файл видит только то что в хедер файле.
Но раве в хедер файле что-то определяют?
281 2096742
я так понял работу на чистом си хуй найдешь
надо и плюсы еще поднимать

точнее даже можно хуй забить на си и учить только плюсы
282 2096748
>>096726

>Но раве в хедер файле что-то определяют?


Чигобля? В нем только это и делают
283 2096749
Посоны, поделитесь собственными проектами, запиленными на Си. Можно без кода, просто хоть на словах расскажите чего писали.
284 2096752
>>096742
С/С++ должен знать каждый
sage 285 2096869
>>096726

> это норм что в h файле я определяю структуру, ну прям полностью, с полями?


Это зависит. Вообще норм. Но есть способ скрыть реализацию, когда ты в .h говоришь:
struct yoba; // тайпдефы по вкусу
а в .c ты уже объясняешь, что:
struct yoba { int fileno; char ∗somename; };
И да, в этом случае тебе нужно будет сделать свой "конструктор", struct yoba ∗yoba_create(void), потому что код снаружи не будет знать ни размера, ни каких-либо других деталей о структуре, кроме того факта, что она такая есть. Класть ли структуру в .h как есть, или прятать детали - дело твое, зависит от того, где и как будет использоваться эта структура.

> Но раве в хедер файле что-то определяют?


Да. Даже код кладут, когда это inline-функции, например.
x.png5 Кб, 462x120
286 2098730
Посоны, как починить? VS Code.
sage 287 2098886
>>098730
Тебе же написали: запускать сначала Developer Command Prompt от вижуал студии (консолька с выставленными переменными окружения), а потом из нее VS Code. Алсо, после этого ты можешь спиздить переменные окружения, и выставить их либо глобально, либо как-нибудь в этой вашей VS Code наверняка можно для билда указать.
288 2098913
>>098886
Так я об этом и спрашиваю. Как починить чтобы не пердолиться через консольку каждый раз, это же пиздец какой-то. 2021-й на дворе.
289 2098940
>>098886
Там переменных окружения столько, что ты охуеешь. Пару десятков. И все они с консольки этой выставляются пачкой bat-ников. Сука, ощутил на собственной шкуре за что индусов ненавидят.
sage 290 2098970
>>098940
Да. Мне совершенно не на чем проверить, но на самом деле нужно что-то вроде PATH/LIB/INCLUDE плюс VisualStudioVersion/VCINSTALLDIR, чтобы оно смогло задетектить наличие студии.
291 2098997
>>098913

>Как починить чтобы не пердолиться через консольку каждый раз


Установить луникс и погромировать на нём, очевидно же!
292 2099014
>>098997
Ты че, ебанутый. Там постоянно придется с консолькой пердолиться, каждый день, блджад, а я хочу жить активной и полноценной жизнью.
293 2099019
>>099014
Если не хочется, можно ни разу после первой установки её не открыть. Зато вскод работает по ярлычку!
294 2099022
>>099019
C gcc и шлангом он и под виндой так работает. Но я захотел полноценный IntelliSense с документацией и шлюхами и теперь страдаю.
295 2099027
>>099022

>IntelliSense


Я так понимаю, он работает на линуксе? Вот статья
https://devblogs.microsoft.com/cppblog/improvements-to-accuracy-and-performance-of-linux-intellisense/
296 2099028
>>099027
Да, с удаленной билд-машиной под виндой, ЛОЛ.
297 2099029
>>099027

>статья


Или она про кросс компиляцию. Не хоче больше 5 слов за раз читать, поэтому не понятно.
298 2099035
>>099028
Вот это, видимо, что локально работает
https://code.visualstudio.com/docs/cpp/cpp-ide
Вроде много всего. Достаточно?
299 2100845
>>090177

Спасибо, анон, с твоей помощью я понял, как устроен этот синтаксис.
300 2102089
Чому long double в виндовом рантайме это double? Есть какой-то workaround или выход только MinGW собирать? Что они курили?
sage 301 2102090
>>102089
Тому что так сложилось. Ты уверен, что тебе не хватает точности даблов? Ты уверен, что хочешь медленно считать 80 бит на FPU, а не 64 бита быстро на SSE?
302 2102092
>>102090
Я хочу контроль. double когда нужна скорость и long double когда я сам решил, что мне нужна повышенная точность. Оправдания виндовому поведению просто нет. gcc в MinGW ведет себя правильно, но я боюсь что там в качестве workaround вообще программная реализация, а не просчет на FPU.
303 2102100
>>102092

>мне не надо, но я хочу


Оправдания пердовому поведению просто нет.
304 2102654
>>102089
Если тебе не хватает аж 52 битов мантиссы для вычислений, то, вероятно, тебе стоит задуматься об использовании более устойчивого алгоритма.

Я уверен практически на 100%, что если ты пришёл с таким вопросом на сосач, значит, оно тебе на самом деле не нужно.
sage 305 2102684
>>102092

> Оправдания виндовому поведению просто нет


Оправдание есть: из существующего и распространенного железа только x87 из 1980 года умеет в хардварные 80 бит. Повторюсь, современный софт на x86 считает плавающую точку на SSE (даже если это обычные, не векторизованные вычисления), в x87 ходят только по большой нужде.

> боюсь что там в качестве workaround вообще программная реализация


Нет, там честные 80-битные даблы с выравниванием (лежат в 96-битных переменных), математика естественно на FPU, все ∗l() функции реализованы.
sage 306 2102697
>>102092
Алсо, я вот не понимаю, когда int и long int синонимы в 32-битном коде, тебе почему-то норм, а вот когда double и long double, так сразу оправданий нет.

Алсо, не сразу увидел и поэтому не сразу проиграл:

> double когда нужна скорость


Посоны-то не знают, не флоаты, ХАЛФ-флоаты используют (там, где завезли), а он даблы, скорость.
sage 307 2103752
>>102697

>Алсо, не сразу увидел и поэтому не сразу проиграл:


> double когда нужна скорость


>Посоны-то не знают, не флоаты, ХАЛФ-флоаты используют (там, где завезли), а он даблы, скорость.


Кек, теперь и я проиграл, тоже не сразу увидел.
308 2104144
>>027897 (OP)
Какого хуя ёбаный CMake, при сборке под MinGW Makefiles генерирует мне сука makefile в котором все пути указаны с \ а не с / (пикрил 1)? В итоге при попытке запустить этот makefile, вызываемый make'ом cmake эти слеши не правильно обрабатывает и удаляет их нахуй (пикрил 2).
Я просто не могу понять это я так обосрался или все эти системы сборок и системы сборок для систем сборок тупое ебаное костыльное кривое говно?
make из состава MinGW, CMake качал с оф. сайта.
Собираю libTMX библиотеку (https://github.com/baylej/tmx), всё это результат следующей команды https://pastebin.com/VjnpSREQ
309 2104162
>>104144
Буквально вчера тоже с этим столкнулся. Нихуя не понимаю. И как под виндой библиотеки собирать?
310 2104205
>>104162
окнепидоры не соснули повторяю
не соснули
не
соснули
311 2104208
Привет, вообщем недавно, начал изучать си, осилил синтаксис и понял что для написания программ недостаточно, когда ничинаешь писать что либо, испытываю страх за незнание, и собственно ответ прост, нужно писать код много гуглить, но времени у меня нет, так как чувствую что си уже никому не нужен, а я хочу найти работу в айти(
312 2104212
>>104208

>а я хочу найти работу в айти(


Проще и быстрее будет выучить JS за полгода и идти работать низкосортной макакой за копейки.
Ну а лучше подсуетись кабанчиком и устройся куда нибудь охранником или грузчиком, нервы сбережешь
313 2104213
>>104208
К посту выше, после этого я понял что мне нужен допинг и нашёл кое какие ноотропы, заказал и в случае успеха отпишу тут через месяц
314 2104215
>>104212
В смысле охранником или грузчиком? Предлагаешь вообще не заниматься?
315 2104220
>>104215

>Предлагаешь вообще не заниматься?


Именно
316 2104221
>>104220
Я стану твоим конкурентом!
317 2104257
>>104212

>Проще и быстрее будет выучить JS за полгода


Никак ты не научишься программировать быстрее от того что будешь учить синтаксис джаваскрипта вместо синтаксиса си — это просто так не работает. А то может быть и дольше будешь пердохаться с дохуя управляемыми языками, ведь там где си даёт понимание того, как работает компьютер, динамические языки заставляют ньюфага с собой работать как с чёрными ящиками разумеется компьютер тоже в какой-то степени чёрный ящик, но чем эта степень ниже тем лучше для обучения.
318 2104288
>>104257
Дед, пей таблетки
Программирование это на 70% дизайн, и только на 10 попердольки (в среднем по индустрии но не суть). Научиться программированию можно только погружаюсь в проблематику домена. Чем ближе к юзкейсам и чем высокоуровневей — тем лучше.
319 2104289
>>104257

>понимание того, как работает компьютер


Тут учиться надо, время тратить, мозги напрягать. Человеку вон, надо поскорее "вкотиться в ойти и рубить бабло", а ты ему про Си загоняешь
320 2104317
>>104288
Ты совершенно не понял, о чём идёт речь.
321 2104329
>>104317
попробуй не пукать ртом
322 2104340
>>104208
Да си как раз-таки довольно простая хуйня, как и ассемблер. А вот войти в айти с сей действительно не получится, особенно если нет опыта даже в сопутствующих областях
323 2104766
>>104329
Это ты сначала сам
324 2104875
>>104144
там в шелле винды есть модификатор который заставляет шелл воспринимать \ как /
вроде бы
не программировал 10 лет просто, все забыл уже,
325 2104912
Пиздец просто почему ни где не написано про порядок линковки библиотек?
Пол дня нахуй мучался, не понимая почему у меня undefined reference на функции из libxml2, а оказывается сука, вопреки законам логики, библиотеку вызывающую libxml2 надо ставить ДО линковки libxml2.
Какая же хуйня боже просто пиздец
326 2104920
>>104912

>библиотеку вызывающую libxml2 надо ставить ДО линковки libxml2


>вопреки законам логики

327 2104926
>>104920
А, хотя да, всё правильно ты предположил.
https://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking

>Note that after the linker has looked at a library, it won't look at it again. Even if it exports symbols that may be needed by some later library.

328 2105239
>>096869
спс, братик
329 2106529
Пацаны, что написать на сишечке?
330 2106544
>>106529
https://en.wikipedia.org/wiki/Ray_casting
Графический движок!
331 2106654
>>106544
А чем срать на экран?
hqdefault[1].jpg10 Кб, 480x358
332 2106750
Впервые в жизни я решил вкатиться в С
ответ очевиден - у меня НИХУЯ не получилось
я открыл Кернигана и Ричи, стал всё читать, пробовать, компилировать. и что вы думаете??? ХУЙ!!!! нихуя у меня не получилось
а я могу даже пояснить почему я не могу скодить ДА ПОТОМУ ЧТО Я НЕ ВИЖУ В ЭТОМ СМЫСЛА
делаем типа переменные lower upper obosrupper и типа хуярим переводчик из фарингейта в цельсий, НАХУЯ МНЕ ЭТИ ЦЕЛЬСИИ ЕСЛИ У МЕНЯ В ГУГЛЕ ЕСТЬ ПЕРЕВОДЧИК В ЛЮБУЮ ЗАЛУПУ БЛЯТЬ ГОТОВЫЙ
может я странный человек?? я не знаю. всем удачи с этим ёбаным си
333 2106773
>>106750

> ЕСЛИ У МЕНЯ В ГУГЛЕ ЕСТЬ ПЕРЕВОДЧИК В ЛЮБУЮ ЗАЛУПУ БЛЯТЬ ГОТОВЫЙ


Я так понимаю си это твой первый язык? Потому что любые другие языки преподают на таких же простых и сто раз решённых примерах.
334 2106778
>>106654
Andre Lamothe Tricks of the 3d Game Programming Gurus: Advanced 3d Graphics and Rasterization

Nvidia GPU Gems

Game Engine Architecture
335 2106797
>>106750
Так надо с Праты начинать.
336 2106985
>>106750
Да, ты очень странный человек
337 2107009
Почему так часто именно Си советуют в качестве КМБ? Если у человека желание расти в эмбеддед, то не логичнее ли начинать с асмы под отдельно взятую архитектуру, а уже несколько позднее браться за K&R? Если обезьянство, то лучше наверное сразу с интерпритируемых ЯПов или нет?
338 2107068
>>107009
Это от того, что принципы, на которых построен Си, более или менее явно встречаются во всех промышленных языках. При этом, в отличие от Scheme и Smalltalk (принципы которых составляют >80% принципов "современных" интерпретируемых языков), он всегда был популярен в мейнстриме.
339 2107138
>>107009
Под эмбеддед на асме пишут только уебки, школьники на ютубе "я так могу" и старперы, которые выучили в 90-х архитектуру какого-то 8-битного PIC и там застряли.

В эмбеддед давно царствуют плюсы или сишечка, но для особо упоротых оптимизаторов, если надо ебать много байтов и регистров с очень маленькой памятью.
340 2107279
>>106544
Я бы взял плюсы, на плюсах такое писать в разы проще, т.к. там есть полиморфизм, темплейты, разные абстрактные типы в стандартной либе и т.д. На сишке такое писать стоит только в учебных целях.
>>106529
Загрузчик, ведро, фирмфарь, драйвер.
341 2107306
Как разделить код на си в несколько строк?
Вот например int a = ananas;
Если разделение будет между командами то без проблем, а если я хочу разделить вот так:
int a = ana
nas;
или так:
in
t a = ananas;
Что за йоба символ использовать?
342 2107331
>>107306

>Что за йоба символ использовать?


\
343 2107417
>>107331
не работает
344 2107463
>>107279
Ты упускаешь что игровой движок должен работать быстро.
345 2107626
поясните по хардкору почему все так люто выступают против ютуб туториалов?
вот например https://www.youtube.com/watch?v=KJgsSFOSQv0 вроде норм объясняет последовательно и интересно. а Керниган и Ричи сразу начинают ебать мозг и приходится не обучаться, а посути догадываться. а после туториалов можно и книги почитать
346 2107644
>>107626
Там где ты скинул воды ахуеть. Но! Если тебе норм, то конечно норм. Однако я бы охуел от такой подачи.
sage 347 2107735
>>107463
Тем более кресты лучше. На сишке тебе придется пердолиться в воид поинтеры, в крестах компилятор сможет сгенерировать оптимальный код под конкретный тип. В сишке ты притащишь виртуальные функции в виде указателей в структурках, в крестах компилятор тоже притащит, но там он их еще и девиртуализовывать умеет. И вот так вот все. Кресты всегда в состоянии обогнать сишку просто потому что у них выразительных возможностей больше, но поэтому же писать быстрый код на крестах гораздо сложнее, чем на сишке. Не умеешь - получишь тормоза, скатишься в необдуманные абстракции всего и вся - получишь тормоза.
348 2107807
>>107463
Ты упускаешь что оптимизированный компилятором код игровых движков на крестах обычно производительней реализации на чистом C.
Посмотри даже какие-то бенчи языков программирования, кресты чаще всего впереди с реализацией того же алгоритма. Маргинально конечно, но все же. Учитывая это и более простую работу со структурами данных и ты прийдешь к выводу что без крестов никак.

https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/nbody.html
350 2107813
image.png73 Кб, 413x335
351 2107829
сори за еще один супер нубский вопрос
на прикриле массивы чаров не на стеке выделяются?
почему это работает?
мне надо освобождать память такую?
sage 352 2107839
>>107829
Литералы константные и лежат в секции данных (обычно). То есть, фактически твой код:
static const char anonymous_string[] = "hello world";
char *a = anonymous_string;
return a;
Потому и работает. Освобождать нужно только то, что ты выделял маллоком или то, что другие выделили и сказали, как освобождать (fopen/fclose и т. д.).
353 2107852
>>107839
понял, спасибо
здоровьичка тебе
354 2107887
>>107735

>На сишке тебе придется пердолиться в воид поинтеры


Не пердолься в воид поинтеры

>В сишке ты притащишь виртуальные функции в виде указателей в структурках


Не тащи виртуальные функции

>писать быстрый код на крестах гораздо сложнее


Именно.
355 2107888
>>107807

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


С чьих слов?
356 2108018
Аноны, есть что по работе кроме ембеддеда? На хх ищется только в паре с крестами.
sage 357 2108026
>>107887

> не пердолься


qsort(), далеко ходить не надо. Сейчас ты скажешь реализовывать все стандартные алгоритмы, а для поддержки разных типов - копипастить, да?

> не тащи


А придется, потому что это единственный нормальный способ менять поведение в зависимости от типа объекта. Портянки из switch или ifelse ну никак не альтернатива.

>>108018
Кресты все равно будут протекать в твой мир, даже если тебя возьмут исключительно на сишку. Смирись и выучи хоть как-то.
358 2108140
>>108026

>Сейчас ты скажешь реализовывать все стандартные алгоритмы


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

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


?
qsort скажу реализовать, но qsort это не все стандартные алгоритмы, это один стандартный алгоритм.

>а для поддержки разных типов - копипастить


Ну ты можешь копипастить конечно, если по-другому не умеешь, но обычно это делают с помощью макросов.
16170461257300.jpg29 Кб, 562x702
359 2108284
>>107807
>>107809
Открыл ссылку. Исходники по ссылке для си и плюсов почти всюду разные, и чего они там по итогу сравнивают? Алсо, вот такого вот

> _mm256_setr_pd(...)


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

>>107463
Не-а.
Сегодня геймдев - это хуяк-хуяк на юнити или чертежами на анриле и в продакшн, сражаться за каждый такт как в девяностых никто уже не будет.
По вопросу: уж игры и даже движки пишите на чём вам удобнее, хоть на руби. Машины у юзверей сегодня мощные, пережуют.
Если, конечно, ты не UE5 собираешься с нуля писать.
360 2108317
>>108284

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


Ну знаешь ли. Я вот думаю дропну нахуй Outer Wilds, юнитипараша графона не содержит ноль целых хуй десятых, зато комп во время её работы протапливает хату будь здоров (когда на улице 41 особенно заебись).
Там вопрос был плана "что бы такого написать на си", а писать на си надо очевидно то, где сишка с лучшей стороны себя покажет. Игровой движок это как раз такая штука, но лишь одна из многих.
Игры целиком писать на си наверное всё же не стоит, как и на крестах кстати. Не сильно жрущую игровую логику лучше реализовывать на динамических языках имхо. Даже майнкрафт немного страдает от того что там моды на джаве, а это джава, это не кресты и даже не си.
361 2108367
>>108317
Это-то как раз объективно понятные вещи.
Но тут просто проблема в том, что пока что ты будешь писать на си или плюсах, конкуренты уже давно выпустят свой говнокод на говноюнити и твой продукт никому нахуй будет не нужен. И плевать, что код на юнити превращает пекарню в обогреватель.

Сишка - это, увы, для многих сегодня забытые технологии предков.
Но не для меня.
362 2108374
>>108367

первый номер tiobe
363 2108384
>>108367
Ну вот пока что выходит что мне как потребителю говнокод на юнити не нужен, по крайней мере пока я в Норвегию не перееду. Это вполне себе один из факторов, бьющих по продажам. Может я уникальная снежинка, но почему-то кажется что не я один сношу парашу, греющую квартиру. А игры крупных издателей почему-то часто нормально оптимизированы, значит на оптимизоний спрос есть, взгляни на рдр2, дум тот же. А там ведь ещё соснолечки, на которых без байтоебства вообще никак.
364 2108656
>>108317

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


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


Двачую, простой спрайтовый движок написать на C не так уж сложно, многие кстати пишут инди- разработчики своё, да просто потому что проще в итоге выходит и в поддержке, и фишки можно реализовать уникальные, и если ты делать будешь десяток игр то это просто выгодно. Инди кстати которые на своих движках, почему то почти все успешны и игры у них круче. Сам либу писал на С графическую 2д, просто летает на 1% загрузки процессора, вот думаю ещё простую аудио- либу приделать и скриптовый движок lua и будет игровой движок. Все студии нормальные имеют свой движок, а это что то да значит.
365 2108678
а есть какой годный материал по структурам проекта, как собирать.
Про тот же СМаке, вот гуглю, но все для с++
366 2108700
а есть какой еще стайл гайд что-ли?
вижу есть кто как в парашном камел кейсе пишут
кто-то в божественном снейк кейсе, вот я люблю в_снейке_писать.
мне руки не оторвут, если я на си буду тоже так делать?

я в свое время обблевался от ебаного голанга, потому что там на уровне синтаксиса публичные штуки надо с большой буквы писать
367 2108716
>>108678

>СМаке


На хуй тебе это говно? make достаточно
368 2108725
>>108700

>а есть какой еще стайл гайд что-ли?


В каждом проекте свой, выбирай из них что считаешь нужным. Я например все переменные пишу слитно в нижнем регистре, а функции с _ ебой, имена структур с Большой буквы, ну и наименования без сокращений кроме счетчиков и индексов. А вот в крестах как раз КемелКейсом, там норм.
369 2108763
>>108716
я хз, поэтому и спрашиваю
много где уже увидел смаке
да и вроде прикольно
>>108725
в общем понял, все дрочат как хочут, круто
370 2108765
>>108763
Сейчас популярно юзать meson
371 2108767
>>108765

>meson


Это еще и питухон подтягивать?
372 2108774
>>108765
ох, наделали каждый свое, в этом и проблема си, нет единой инфраструктуры
autotools cmake meson scons
373 2108778
>>108774
а че юзать новичку, чтобы сразу привыкать не понятно
374 2108785
>>108767
Ну да, можно ещё билд скрипты писать на чистом питоне.
>>108778
cmake, т.к. много где используется
>>108774
bazel ещё есть
375 2108789
>>108778
Но лучше использовать IDE
376 2108811
>>108774
Не говори, ещё языков программирования наделали, текстовых редакторов, браузеров, операционных систем, вообще суки как их земля носит
377 2108826
>>108384
Это тебе.
Недавно вон в /v/ был бугурт про пикрелейтед.
8 гигабайт ОЗУ для вот этого вот, тогда как у сеги было 64 килобайта на борту.
Но всё равно сожрут ведь, куда они денутся-то.
sage 378 2108901
>>108140

> а остальные приведёшь, раз уж


bsearch и qsort - это единственное, что есть в стандартной библиотеке, так уж получилось. Это еще одна проблема Си - нужно переизобретать мир, даже примитивный динамический массив заново писать, тогда как в крестах все из коробки. Но не суть. Обе функции с воид поинтерами. Но остальное реализуется так же, любые сортировки, любые структуры данных, у тебя либо частная реализация, либо где-то торчит войд поинтер.
379 2109092
>>108826
Из-за графона?
380 2109099
>>108901

>Это еще одна проблема Си - нужно переизобретать мир


Это не проблема. Это чистая вкусовщина и никакого консенсуса на тему что же должно быть в стандартной либе а чего там быть не должно попросту не существует (в контексте любого языка). Кому-то надо раздутую либу и раздутый язык с кучей говна к которому никогда не прикасаешься, и для него даже сишка со своими гото и волатайлами могла бы быть поменьше.

>у тебя либо частная реализация, либо где-то торчит войд поинтер


Либо ты генерируешь код макросами. Никто и ничто тебя не заставит копипастить код, если ты этого сам не пожелаешь.
381 2109109
>>109099

>а для кого-то даже сишка


Фикс
image.png199 Кб, 773x268
382 2109127
парни, обоссыте но объясните
я тут спрашивал про чары >>107829 , анон тут >>107839 объяснил, я вроде понял

но новый кейс на пикрил, у меня тот же вопрос почему это работает
тут я тоже во float2_add не на стеке выделяю result?

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

>>109127
Постараюсь попроще.
Внутри функции result действительно выделяется на стеке.
Но при этом, float2 является структурой данных, и при возврате из функции она копируется целиком. Поэтому v3 - это по факту полная копия структуры result, которая располагается уже на стеке функции main.

Проблемы у тебя возникли бы, если бы в функции у тебя было бы, например,

> char string[10];


И ты бы вернул из функции char * - в этом случае при возврате скопируется только указатель на массив, а сам массив будет потерян, ведь он располагался на стеке.
То же самое происходит, если ты пытаешься из внутренней функции вернуть

> const char string[] = "Hello";


Механизм работы точно такой же, но при этом поскольку константный литерал "Hello" лежит не на стеке, а в секции данных, то проблем в этом случае уже не возникнет.

В Си простые типы (int, float) копируются целиком, структуры копируются целиком, а вот массивы передаются только по указателю.
Как-то так.
384 2109139
>>109131
ну ты боженька, спс большое, дай господь тебе долгой и счастливой жизни.

Тогда, я так понял, такие фокусы не получатся уже, если у меня в структуре будут указатели либо массивы, тогда уже под эти поля надо выделять динамическую память, иначе данные потруться когда выйду из функции? я правильно понял?
385 2109141
>>109139
:3

Всё верно понимаешь, но там есть ещё одна тонкость, связанная с массивами и указателями.
Если у тебя есть структура

> struct yoba_s { int a[4]; int * b; }


И какая-то переменная этого типа, например, yoba_1.
То это означает то, что у тебя есть где-то область памяти, в которой подряд идут четыре целых числа int (в структурах массивы располагаются прямо "внутри" них), а затем указатель на массив из int.
Соответственно, если ты напишешь

> struct yoba_s yoba_2 = yoba_1;


То у тебя появится где-то на стеке вторая такая же структура, в которой будет точно такие же четыре int (опять же, структуры копируются целиком) и точно такой же указатель на массив int, указывающий на ту же самую область памяти, что и оригинальный.

Чтобы сделать полную "глубокую" копию этой структуры, тебе нужно будет после присваивания отдельно выделить память под поле b структуры yoba_2 и скопировать поле b в эту память из структуры yoba_1. В противном случае, если этого не сделать, массив a скопируется как ты ожидаешь, а вот массив b при изменении в структуре yoba_1 будет изменяться и в структуре yoba_2.
386 2109143
Допустим, есть функция, которая пушит элемент в конец связного списка, обращась к нему по его "хвосту":
void push(int value)
{
__struct node_t *node = malloc(sizeof(struct node_t));
__node->value = value;
__node->next = NULL;
__tail->next = node;
__tail = tail->next;
}

При последовательном вызове push() вне цикла всё нормально - элементы добавляются в список как надо. В цикле for или while вызов на первой итерации добавляет элемент, а последующие переписывают его по тому же адресу. Объясните нубу, как это работает?
387 2109151
>>109143

> Объясните нубу, как это работает?


__tail->next = node;
__tail = tail->next;

Это чо ха хуйня? __tail = node
388 2109243
Что делать когда надо вводить много общих переменных? По ходу разработки сверху main ебнутый список образуется, где сложно орентироваться. Это нормально?
389 2109262
>>109243
Ну это какбэ основной вызов программирования, что у тебя общего стейта становится больше и больше и в какой-то момент ты уже перестаёшь в нём ориентироваться. Для этого и придумывают всевозможные паттерны и парадигмы. ФП, например, минимизирует протечку стейта, декларируя что функции должны быть чистыми. ООП максимально изолирует стейт, распиливая его на кусочки и распихивая по объектам, где им сравнительно легко управлять. Вот и думай.
390 2109271
>>109141
ага, понятненько

В общем массивы они встроены в структуру, и т. к. структура копируется полностью то и массив в ней тоже,
а указатели - по сути число (адрес на память), при копировании структуры копируется и указатель, но копия указателя указывает на тот же блок памяти.

вроде даже как-то просто все
фух, вот это меня осенило, спс еще раз, анончик
391 2109411
>>109151
tail на последний элемент списка указывает. Ты не добавляешь элемент в список, а просто переписываешь уже существующий.
tumblr2090ee899d159a1113f8e277ff6247e262bd69d1250.png59 Кб, 216x233
392 2109471
>>109271
Всё верно понимаешь!
Удачи тебе ещё раз в грызне гранита науки

>>109143
Проблем не вижу, если честно.
Выкладывай полный код, как вызываешь внутри цикла.

>>109151

> tail = tail->next;


> tail = node


Так это одно и то же ведь.

>>109243
Смотря чего ты пишешь, но обычно нет, не нормально.
Объявляй переменные по ходу, сишка уже давным-давно позволяет так делать.
Разбивай функцию main() на подфункции или хотя бы на { блоки }, объявляй локальные для блоков кода переменные внутри этих самых блоков - они не будут видны для кода вне блока.
Сливай переменные в структуры, если какие-то из них по смыслу кода лучше смотрятся вместе.
393 2109481
>>109471

>Так это одно и то же ведь.


Ебобо?
c353568fd458655afbd2f00a5a938dbf.jpg23 Кб, 248x301
394 2109534
>>109481
Ну давай, расскажи нам, чем

> tail->next = node;


> tail = tail->next;


отличается от

> tail->next = node;


> tail = node;

395 2109546
>>109471

>Проблем не вижу, если честно.


Проблем и нет; после дебага оказалось, что дело вообще не в этом.

>>109151
Да, ты прав, я тут >>109411 тупанул немного, думая, что ты весь цитированный тобой код хочешь на tail = node заменить.
Так-то конечно то же самое, но изначального вопроса это не касается.
396 2109549
>>109534

>> tail = tail->next;


Тем что это node->next текущего узла которое вероятно 0 или говно, ты глупенький?
397 2109555
>>109549
>>109534
Ааа, все, я обосрался, извините
398 2109676
>>108700
Ориентируются на исходники юниксов и линуксов, но там много и устаревших приемов
399 2109714
>>109676

>линуксов


Сейчас бы каргокультировать на говнлподелие обоссаного фина
400 2109891
>>109714
Ну не ориентируйся. Тут тебе не раби, на что хочешь, на то и ориентируешься.
401 2109899
>>109549
я глупенький,
еще раз объясните пожалуйста, только языком, понятным для аутистов почему

>> tail->next = node;


>> tail = tail->next;


>отличается от


>> tail->next = node;


>> tail = node;


?
403 2109968
>>095582
А крестам, блять, вышка прям всралась штоле по-твоему? В каком месте?
404 2109973
>>109899
Ничем.
405 2109984
>>109891
Какое нахой “раби”? Ruby? МГИМО финишд? Он, блять, “рУби”
406 2109996
>>109984
Ты слаб в иронии
407 2110002
>>109968
Не в том смысле, что для крестов нужна, а в том, что "для крестов даже не нужна, а кресты в 500 раз сложнее, для си тем более не нужна".
408 2110028
>>109973
та всмысле? вон братишка чет спизданул, правда я нихуя не понял, там написано на эльфийском, видимо

> Тем что это node->next текущего узла которое вероятно 0 или говно, ты глупенький?


второй братик рапортовал что он обосрался

всмысле ничем? братик зря обосрался что-ли?
409 2110075
>>109899

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


Ничем, просто второй вариант более очевидный
410 2110076
>>110028

>всмысле ничем? братик зря обосрался что-ли?


Пошел на хуй, обосрался и обосрался, признал свою ошибку, что доебался то?
411 2110086
>>110002

>кресты в 500 раз сложнее,


Кресты кстати легче чем Си. На Сях иной раз нужно городить костыли под 1000 строк, в то время на Крестах тоже самое можно сделать через какой-нибудь темплейт с лямбдами где все это займет 200 строк.
412 2110191
>>110086
Количество кода = сложность, понял тебя.
Я-то думал что количество нативного языкового барахла и объём стандартной либы определяет сложность, т.к. их надо ещё изучать и знать где и как применять, но раз так значит так.
1.png155 Кб, 895x718
413 2110247
>>110028
Чел, ты просто двух анонов перепутал.
Другой анон подумал, что там в первом случае tail->next не проинициализирован. На самом деле всё инициализировано предыдущей строкой - ну ошибся, ну с кем не бывает?

Код действительно ничем не отличается, только лишь читаемостью.
414 2110270
Аноны, есть говнокод из >>093997 который не делает ничего сложного(открыть порт, получить данные, записать их в файл). Вопрос, какой самый простой способ написать к нему gui( использовать visual studio?), который будет работать на семействе операционных систем win xp - win 10?
415 2110271
Аноны, есть говнокод из >>093997 который не делает ничего сложного(открыть порт, получить данные, записать их в файл). Вопрос, какой самый простой способ написать к нему gui( использовать visual studio?), который будет работать на семействе операционных систем win xp - win 10?
sage 416 2110286
>>110270
Гуглишь: DialogBoxParam, сам диалог нарисуешь в Visual Studio (там можно .rc создать) или в Pelles C (100 метров вместо 6 гигов вижуалстудии) или в ResEdit (2 метра, http://rsdt.free.fr/ResEdit-win32.7z сайт https://resedit.net/ умер в этом году, есть в вебархиве).

> есть говнокод из >>093997


Это под линукс, в винде никаких дев-тетивай нету. Нужно будет CreateFile("COMxx"...), SetCommState, Read/WriteFile, возможно WaitCommEvent, вот это все.
417 2110341
>>110247
да я дейсвительно братишек перепутал, с кем не бывает на двоще

>>110076
да братик, я не доебался, я за тебя распереживался
я тоже обосрался, еще хуже чем ты, я братишек перепутал, за что категорически извиняюсь
вообще-то обидно было, что ты нахуй послал меня
image.png353 Кб, 1065x329
418 2111463
привет братишки, эт снова я, скучал по вам

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

с меня как обычно огромное спасибо!
419 2111486
>>111463
нашел у них ишью на гитхабе, можно с агрументом --debug
запустить бинарник с тестами и с гдб удаленно подключиться и дебажить, но гемор тот еще.
а я только в виме настроил гдб, а тут через какую-то шляпу надо запускать. Нормально что-ли сделать нельзя было. Эх, горе конечно (
хотелось бы найти способ чтобы просто скормить тесты гдб и стопнуться на брейкпоинте
420 2111507
>>111463
Мдя... С GoogleTest из мира C++ таких проблем нет.
421 2111511
>>111486

> скормить тесты


Алексей, зачем тебе тесты на С?
422 2111514
>>111511
хз, тип хочешь подебажить в определенных условиях функционал свой, написал тест, нужные аргументы проставил, вызвал метод, брейкпоинт поставил и погнал, удобно. Я так на рубях привык, тут даже дело не в тесте, а именно в возможности продебажить, нашел пофасту свой тесткейс, брейкпоинт поставил и погнал. да и на будущее юнит тесты остаются, полезно тоже

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

Зови меня просто Леша, или Леха, как тебе удобнее

>>111507
GoogleTest можно си тестить?
423 2111517
>>111514

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


Все правильно, но на Си писать тесты это жопа, бери любой скриптовый язык который может с Си. Я в обще все на Перле прототипирую, потом на Си перекидываю. Си это ммм, вишенка на твоем разработанном и отлаженном торте.
sage 424 2111548
>>111514

> А что, на си нет культуры тесты писать?


Это не культура, это бескультурие. Лучше потратить время на написание качественного кода, вместо кучи некачественных тестов.
Вообще, достаточно сделать отдельный main с ассертами внутри #ifdef TEST, какие еще нахуй фреймворки.
425 2111615
>>111507
С самим C++ при этом куча других проблем.
426 2111679
>>111548

>Это не культура, это бескультурие. Лучше потратить время на написание качественного кода, вместо кучи некачественных тестов.


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

>Вообще, достаточно сделать отдельный main с ассертами внутри #ifdef TEST, какие еще нахуй фреймворки.


ну можно и так, я ж поэтому и спрашиваю, как принято.
В рубях тоже можно сделать test.rb файл и в нем ебошить что-то типо
raise "Test failed" unless actual == expected
но никто же так не делает.
Да и вон видишь как допустим этот тест фреймворк тесткейсы запускает, в потоках или форках хуй знает, видимо изолирует как-то их друг от друга.
Хотя я подозревал что в си сидят суровые дядьки с компилятором в голове, и они не отлаживают, они видят все проблемы сразу как только посмотрят на код
Но я же не такой (( пока)

>>111517
не понял немного подхода, ты тип пишешь на перле и потом все на си переписываешь?
либо какой-то функционал переписываешь на си, но в общем это все равно перл? и как это спасает от написания тестов?
427 2111949
>>110191
Все мы ошибаемся, так что всё нормально! Главное усвоить новый опыт
sage 428 2112397
>>111679

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


Потому что тестировать strlen("x") == 1 глупо. Чтобы в тестах был смысл, нужно увидеть и проверить граничные условия и специальные случаи. Если ты их не видишь или видишь не все, то твои тесты некачественные. Это во-первых.

Во-вторых, вот у тебя есть код: int values[3] = {0}; for (i = 0; i <= 3; i+=) values += 2; Вот ты написал тест, assert, memcmp, все дела и пошел спать довольный. А завтра у тебя код падает, тест работает. Или наоборот. А потому что в Си есть UB. Это скорее всего та причина, по которой твой фреймворк запускает тесты в потоках. Но потоки все равно ничего не гарантируют, на то оно и UB.
429 2112476
>>112397
да я согласен что юнит тесты вообще не дают никаких гарантий. Я на практике это знаю.
но ты просто так говоришь что вот не будешь ты писать тесты, и код качественней станет за счет того что ты больше времени на него потратил. я с этим категорически не согласен.
Во первых тебе все равно надо как-то прогнать/запустить то что ты написал, как ты можешь быть увереным в том что код твой рабочий, если ты его не запустил. Юнит тесты отличное этому применение, я для этого их и юзаю, а не для уверенности что я обработал вообще все состояния и исходы.
Во вторых пока ты тестишь вручную, по сути тоже самое что и тестами, только в случае тестов, они у тебя остаются на будущее. В случае какого-то рефакторинга, добавление каких-либо данных или фичей старые тесты помогут понять не сломался ли старый функционал, как минимум то что было покрыто.
Да и как по мне когда у тебя описаны основные кейсы тестами то отладка ускоряется, тебе всего лишь в нужное состояние надо брейкпоинт вставить, и сиди колупай что происходит. Сам тест написать не сложно, хуле вызвал ассерт свою функцию что ожидается. Разработка как по мне ускоряется когда рука набита тесты писать.
image.png689 Кб, 800x534
sage 430 2112532
>>112476

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


Я сейчас скажу страшную вещь, адепты TDD от нее рвутся обычно. Ты не поверишь, но я свой код читаю. В особо сложных случаях (реализации алгоритмов, а не перекладывание байтиков из одной переменной в другую) еще и комментирую возможные входные данные и реакцию на них, потому что спустя полгода нихуя не очевидно, почему оно написано именно так.

> старые тесты помогут понять не сломался ли старый функционал


Вот это реальный юзкейс, но рефакторинг еще не факт что будет. Это как с избыточными абстракциями в ООП: чаще всего интерфейс не имеет больше одной реализации, код не переиспользуются, но все равно пишется куча ненужного кода на тот невероятный случай, если вдруг когда-нибудь понадобится сделать что-то странное. Будет рефакторинг - тогда придет время писать тесты (для публичного апи), без этого никак. Не будет - останется больше времени на написание кода.
431 2112573
>>112532

>Ты не поверишь, но я свой код читаю.


ну я так пока не могу, я только вкатываюсь в си. я не могу быть уверен на 100% что я написал код, который работает как надо, просто потому что у меня опыта на си толком нет.
и я не адепт TDD, скорее R(epl)DD, но так как репла в си нет, я пытаюсь сделать реализацию, запустить ее с какими-то входными данными и пройти в гдб по шагам. Но запускать мне проще через тесты, чем все время менять тело main функции, да и других причин хватает. Возможно я пытаюсь применить подход не применимый к си.
432 2112595
>>112573

>я не могу быть уверен на 100% что я написал код, который работает как надо


Тесты тебе не помогут
433 2112624
Лол, вы ИТТ на полном серьезе затираете мантры уровня ТЕСТЫ НЕ НУЖНЫ потому что в сишке это боль? Пиздец вы дегроиды.
434 2112811
>>112624
Тесты не нужны, я живу активной и полноценной жизнью. Каждая отладка занимает 20 минут. А потом я иду писать void ptr, я не писал void ptr неделю!!! Пойду попишу.
435 2112812
>>112624
Тесты не нужны, я живу активной и полноценной жизнью. Каждая отладка занимает 20 минут. А потом я иду писать void ⚹ptr, я не писал void ⚹ptr неделю!!! Пойду попишу.
436 2113177
как в си с utf-8 работать?
437 2113185
>>112624
Тесты часто проверяют банальщину, что тратит время, а сложное протестировать ты всё равно не сможешь, ибо обычно прогер всё проверяет на работоспособность и если ошибка возникает, то она такой сложности, что ты заебёшься придумывать тест для неё.
sage 438 2113388
>>113177
Так, как будто никакого UTF-8 не существует. Он вполне прозрачен, особенно пока твоя обработка ограничивается ASCII-символами (ну там путь к файлу по слешам порезать или текст на строчки разбить). Если нужно будет всякое там регистронезависимое сравнение, возьмешь ICU уже по-взрослому, но обычно это означает гораздо больше ебли с юникодом, чем ты можешь себе представить.
439 2113418
>>112624
Но ведь тесты алголоподобным языкам реально не нужны, ведь есть борщехлёбские тройки Хоара.
440 2113521
>>113185

> часто проверяют банальщину


Не банальщину, а edge cases, чтобы при очередном рефакторинге тебя банальной off-by-one error по невнимательности не убило нахуй.

> сложное протестировать ты всё равно не сможешь


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

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


Это указывает на проблемы в дизайне кода. Функции надо делать размером поменьше, абстракции попроще, а state локализовывать.
какие же сишники дегенераты, пиздец, подумать только, я лет 10 назад сам таким же был
sage 441 2113548
>>113521

> edge cases


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

> fuzzing


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

> Функции надо делать размером поменьше


Начинаются своих макконнеллов, а потом у них хром с одной вкладкой тормозит. Надо, да. Еще бы это было всегда возможно, вообще было бы здорово.
442 2113616
>>113548
Ты ему про Ерёму, а он тебе про Фому.

> Если знаешь, что тебя тут может ебануть - проще перепроверить условие


А если не заметишь и проебёшься? А если это не твой код, и ты не знаешь? Такими темпами и код-ревью давай в пизду, а то что время на какую-то хуйню новомодную тратить, кабану код выкатывать ещё вчера. Прелесть тестов именно в том, что то, что ты предлагаешь можно автоматизировать: вместо того, чтобы всем постоянно делать это вручную, достаточно запрограммировать один раз.

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


Это всё детский максимализм. Вот у тебя и еще сотни разработчиков проект на 10 миллионов строк, какая-нибудь залупа из твоего кода дергает функцию, написанную 10 лет назад чуваком, который уже помер, а она тормозит. Можно пойти, выбросить к хуям так любимые сишниками связанные списки и воткнуть туда хеш-таблицу. Тебе не надо тратить время и разбираться как эта функция работает, тебе лишь интересно убрать десяток миллисекунд латенси в своей API или что там у тебя. Если функция покрыта тестами, то у тебя на подобный фокус уйдет минут 15, дальше ты можешь дальше идти заниматься своими делами, а иначе нужно сидеть и изучать бизнес логику, играть сам с собой в виртуальную машину и т.п. Нахуя? Ну ок, вот решил ты полностью переписать этот старый кусок говна. Молодец, а что дальше? А дальше, если у остальных есть тесты, то быстро всплывет, что то, что ты посчитал в коде придурью и выбросил за ненужностью оказывается было необходимо для какой-то хитрой ебанины, про которую ты вообще раньше и не слышал даже. Проблема, безусловно, в ебанине, которая, возможно, неверно понимает контракт, но фишка в том, что баг удалось поймать до релиза. А не было бы тестов - уронил бы прод, потому что полез своими ручонками куда не следует.
443 2113624
>>113521

>Функции надо делать размером поменьше


Это вот эти вот легендарные погромисты "мам функция слишком длинная, разделю-ка я её на три и вызову их последовательно, ну и что что они у меня больше нигде в программе не вызываются", превращающие нормальный структурированный код в лапшу.
444 2113642
>>113624
Все с точностью до наоборот: превращают лапшу в структурированный код. Банально потому, что у функций есть осмысленные человекочитаемые имена. Но меру тоже надо знать, это да. Писечка, конечно, вся именно в правильно выбранных абстракциях и композиции.
Тред утонул или удален.
Это копия, сохраненная 1 августа 2021 года.

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

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