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

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

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

Пожалуйста, пользуйтесь https://ideone.com/ или http://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 (драфт)
- man/Dash/zealdocs

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

- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 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://www.iso-9899.info/wiki/Books#Learning_C

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

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

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

- №29: https://arhivach.cf/thread/347271/
- №30: https://arhivach.cf/thread/366174/
- №31: https://arhivach.cf/thread/366210/
2 1231434
первыйнах
3 1231673
Превед, антон. Я блять нихуя не понял што тут написано(прата нажестил). Объясните, растолкуйте плз, с меня нихуя
4 1231675
>>31673
Бля забыл фото прикрепить, пиздец я еблан
5 1231677
>>31673
Да.
6 1231678
>>31675

>пиздец я еблан


О да.
7 1231679
>>31677
Пизда.
8 1231681
>>31675
Тот редкий случай, когда в объяснении из книги не только все понятно, но еще и добавить нечего.
9 1231683
>>31679

>Пизда.


Тебе лишь снится.
10 1231685
Можете придумать мне задание по языку Си? Самому в голову ничего не лезет.
12 1231687
>>31686
Спасибо.
Ролл. (ТСР чат уже делал).
13 1232129
>>31686
Пытался я сделать FTP-клиент. А получился кривой telnet. Ну и рукожоп же я.
Мимо
14 1232133
>>32129
Если осилил кривой телнет, значит посылку команд и чтение статусов тем более осилишь. Не пытайся сразу что-то полнофункциональное реализовать, сделай загрузку и скачивание по заранее известным путям (чтобы не ебаться с LIST), в пассивном режиме. Там нужно уметь буквально несколько команд.
15 1232172
>>31397 (OP)
перекатился
16 1233323
Можно ли прогать на си из под винды или моветон?
17 1233331
>>33323
Можно, без особых проблем, и даже с бонусами в виде адекватных отладчиков.
18 1233410
Что почитать, чтобы в принципе понимать, что мне даёт отладчик по сравнению с puts("Nya") для проверки, по какому поути пошла программа.
Ну, т.е. самые общие определения и преимущества, чтобы я потом понимал, зачем я изучаю конкретный отладчик.
19 1233533
Антоны, тут у меня одна проблема. Функция - возвращает указатель на структуру. Например я результат функции сохранил в переменной и затем заебашил free. Будет утечка?
599716131.png77 Кб, 317x372
20 1233631
Собираюсь вкатиться в вашу сказку, решил начать с теории, сейчас читаю К&R. Стивен Прата на очереди, когда к практике перейду. Рекоммендации из шапки просмотрел, но есть пара вопросов: какой же из конопляторов оптимальней для 32бит, и что можно почитать по Win API для сишки?
21 1233633
>>33631

>почитать по Win API для сишки


Рихтера и Петцольда
22 1233638
>>33631

> крестопик

23 1233650
Здраствуйте. Шапку смотрел, но не понял, есть ли книжка по C текущего стандарта, которая бы учила программированию с нуля? KR читать готов, но кажется так будет лишний шаг с переучиванием с девятсотлохматого стандарта на актуальный.
Короче, хочу вкатываться сразу в новейший-моднйший-C. Что посоветуете?
24 1233656

> - Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.

25 1233657
26 1233676
>>33533
Код? Но в целом у тебя утечек не будет, после free() будет переменная, указывающая в воздух. Или ты по указателю данные забрал? В общем, тащи код.
27 1233903
>>33656
Спасибо. А тяжелое вообще чтиво? Ну так, если с KR сравнить или с TCPL Страуструпа?
28 1233957
29 1233968
>>33676
person loadFromFile(...);
person
hippo = loadFromFile(...);
free(hippo);
30 1233969
31 1234059
Можно ли организовать считывание функций с файла?
32 1234070
Я тут сижу и думаю, как можно узнать размер функции в байтах? Звучит тупо, но это реально нужно для одной моей шальной затеи.
33 1234077
>>34070

>


>


> Я тут сижу и думаю, как можно узнать размер функции в байтах? Звучит тупо, но это реально нужно для одной моей шальной затеи.



Никак. На самом деле компилятор тебе может

1) Её вообще заинлайнить
2) Наоптимизировать вызовы так, что даже с идой без поллитры не разберешься.
3) Чтобы подобную хуйню реализовать тебе в машоб-тредик надо, на нейросеточках учить программу дизассемблировать выхлоп компилятора.
34 1234078
>>34077

Ну а если тебе очень надо, то есть в GCC ключ -ffunction-sections который позаолит тебе потом из object-файла то что тебе надо прочитать с помощью readelf -S t.o | grep ' .text.'
35 1234089
>>31397 (OP)

>Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека"


stdalign не завезли, пришлось делать две ветки windows/linux.
36 1234090
>>34059
Скрипты внешние что-ли? Если да, то взгляни на Lua.
37 1234106
>>34078
У меня есть задача записать функцию в бинарный файл. Для этого мне желательно знать ее размер.
38 1234110
>>34106
Я подумал, что могу оканчивать запись в функцию после байта команды return? Так же можно, наверное?
image.png468 Кб, 1920x1080
39 1234115
>>34110
Я считал 40 байтов с указателя на начало функции. Вот они в hex редакторе. Но в них нет байтов C3 и CB, которые означают return. Неужели функция больше 40 байтов, или же я обосрался с кодом?
40 1234117
>>34110

>Я подумал, что могу оканчивать запись в функцию после байта команды return? Так же можно, наверное?



1) Команда return из сей в процессе компиляции может стать чем угодно. начиная от ассемблерной ret и заканчивая сшивкой кода разных функций воедино совершенно рандомными регистрами или через стек без каких-либоявных call/ret. В зависимости от желания компилятора.

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

От себя вангану, что ты хочешь навелосипедить JIT-компилятор для С, но не знаешь в этой области кроме самого языка С нихуя. В таком случае тебя стоит отправить окунуться в волшебный мир плюсов и изучать LLVM, как самый быстрый способ сделать то, что тебе надо.
41 1234120
>>34117
Я хотел позабавиться и сделать считывание функции из бинарного файла. Практической пользы почти никакой, просто из интереса. То есть я беру указатель на функцию и дальше записываю туда байты из бинарного файла. Как мне казалось и как кажется, это должно работать.
изображение.png233 Кб, 480x480
42 1234121
>>34115

>Я считал 40 байтов с указателя на начало функции. Вот они в hex редакторе. Но в них нет байтов C3 и CB, которые означают return. Неужели функция больше 40 байтов, или же я обосрался с кодом?



Бляяяяапаааааааааааа
43 1234122
>>34121
Скажи мне где я обосрался, я тупой, извините уж.
44 1234124
>>34122

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



В данном случае - ты словил конкретное такое матерое UB, объявив функцию, которая нигде не используется и взяв с неё указатель.

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

Исключение - функции, объявленные как библиотечные путем __declspec(dllexport) и __attribute__((visibility("default"))) в случае гцц и скомпилированные в lib/dll. В таком случае компилятор блюдет соглашение о вызовах и ты действительно можешь там чего-нибуть накопать. Но и в этом случае с твоим ходом мыслей можешь соснуть хуйца.
45 1234126
>>34124
А если надавать кучу ключей компилятору, чтобы он не инлайнил и т.п.?
46 1234129
>>34124
>>34117
Cпасибо за помощь, решил оставить эту затею и пойти чистить карпа.
48 1234140
>>34138

То же самое, но с использованием стандартных опердней без велосипедов:

https://gnuu.org/2009/09/18/writing-your-own-toy-compiler/
49 1234163
>>34138
>>34140
Спасибо!
50 1234194
>>34115
Это выебывается (читай оптимизирует для предсказателя переходов) visual studio, байты E9 A9 это JMP (считай goto) на реальное начало функции. Посмотри в отладчике оффсет либо интерпретируй следующие байты адреса, чтобы попасть на реальную функцию
51 1234286
>>33968
Ну вот ты сделал free(), и твой hippo перестал быть валидным, ты не можешь больше к нему обращаться. Поэтому обычно после free(hippo) делают hippo = NULL, чтобы случайно не вляпаться. А утечек нет.

>>34059
Скорее всего ты хочешь dlopen/dlsym или LoadLibrary/GetProcAddress соответственно. Но, конечно же, можно и самому грузить рандомный исполняемый код в память и выполнять, только это нихрена не простая задача.

>>34070

> Я тут сижу и думаю, как можно узнать размер функции в байтах?


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

>>34089

> stdalign не завезли


Правда что ли? У меня вроде работало. Хедера нет - завези сам. alignof/alignas точно поддеживаются.
sage 52 1234295
>>34286

> Правда что ли? У меня вроде работало


Глянул. Оно в шланговом тулсете есть, поэтому и работало.
image.png727 Кб, 1920x1080
53 1234305
>>34194
Это случаем не функция?
sage 54 1234312
>>34305
И выше тоже функция. Возьми сдампи .obj или .o, чего ты в хекс-редакторе гадаешь?
image.png513 Кб, 1920x1080
55 1234315
>>34312
Может я чего-то не понял, но это вроде это?
sage 56 1234316
>>34315
А это, мой дорогой друг, секция данных, там константы лежат. Объясни, что ты хочешь сделать и нахуя.
sage 57 1234321
>>34315
Открой Visual Studio Command Prompt, напиши dumpbin /ALL main.obj хотя бы.
58 1234334
>>34305
Не, функция сишная всегда после вызова начинается с байта 55 - PUSH EBP, для указания через EBP на локальные переменные
59 1234347
>>34315
Вообще тебе может быть легче, взяв старенькую утилиту obj2asm и текстовый исходник .c
открываешь в папке с ней командную строку и пишешь что-то вроде

obj2asm project.obj project.c > output.txt

> нужна чтобы вывод в консоль был перенаправлен в файл

sage 60 1234354
>>34334

> функция сишная всегда после вызова начинается с байта 55 - PUSH EBP


Чушь. Есть -fomit-frame-pointer, /Oy, есть функции-обертки, есть /hotpatch, втыкающий в начало функции mov edi,edi, есть int getRandomNumber(void) { return 4; }, так что предполагать что-либо о начале функции нельзя.
Аноним 61 1234407
>>31397 (OP)
Привет, двач. У меня тут появилась промлема
int a;
printf("%d\n", a);
почему выводит 4201019 наверное у другних будет другое число, но у меня именно это
Что это за число ? Я просто тупой
62 1234415
>>34407
Ты не присвоил знначение x, потому printf распечатала мусор из стека (похоже что какой-то адрес, оставшийся в памяти)
63 1234434
>>34407

>почему UB именно такой


>расскажите мне

sage 64 1234441
>>34434
Рассказали уже. В переменной лежит адрес возврата, оставшийся в стеке после вызова какой-то функции. Адрес характерный для кодовой секции exe-шника в винде.
65 1234461
>>34434
Не почему он такой, а почему там какоет непонятное число которое я никуда не записывал я же написал что я тупой, чё ты приебался
66 1234501
>>34316
Я хочу записать байты функции в текстовый файл, чтобы потом можно было загружать оттуда функцию. Нахуя - не знаю.
image.png346 Кб, 1920x1080
67 1234507
>>34347
Вот это выползло.
68 1234522
>>34501
Изобретаешь динамически-подключаемые библиотеки?
69 1234523
>>34522
Да. Хочу написать что-то свое.
70 1234615
>>34295
Отож. Сам недавно собирался, пришлось в виндовый ифдеф воткнуть __declspec( align( # ) )
71 1234913
Есть следующее условие:

if (index == 1 || strcmp(a, b) == 0) { ... }

Правильно ли я понимаю, что если index == 1, то strcmp уже не будет затем вызываться?
72 1234919
>>34523
Так линкер пиши свой. Или грузи объектники. .bin нормально ты все равно не загрузишь.

>>34913

>Правильно ли я понимаю, что если index == 1, то strcmp уже не будет затем вызываться?


Правильно. Операторы &&, || и частично ?: (когда дело касается второго и третьего операнда) ленивые, и не вычисляют правый операнд, если он не повлияет на значение выражения.
73 1235152
>>34913
Чтобы вызывался надо поставить |.
74 1235195
Что значит запись "!!" перед чем-то?
Двойное отрицание? Но зачем.
75 1235280
>>35195
Пошёл на хуй, не осиливший энтри-левел книги скам!
76 1235287
>>35195
Всё, что не ноль, становится строго единицей.
77 1235317
>>35287
Спасибо.
78 1235318
>>35280
Какой ты злой, все лабы уже написал?
80 1235799
Анон подскажи почему кракозябры на винде в консоли
SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Rus");
ничего не помогает, MinGW.
На clang все норм работает.
81 1235803
>>35799
По умолчанию в консоле 866 локаль используется
82 1235807
>>35799
Рекомендую >>1224213 вот это решение, пока тред еще не уплыл. SetConsole[Output]CP убери.

> подскажи почему


Потому что исходник в UTF-8, наверное. Но лучше всего его в UTF-8 и оставить.
83 1235817
>>35807

>Потому что исходник в UTF-8, наверное. Но лучше всего его в UTF-8 и оставить.


т.е. от кодировки исходников генерируется различный объектный код?
84 1235823
>>35817
Нет. В Си есть source charset и execution charset. Если они отличаются, то компилятор транслирует строковые литералы. Если execution charset не совпадает с фактическим (т.е., если по-русски, строковые литералы в бинарнике не в той кодировке, что ожидает консоль), ты видишь крякозябры.
sage 85 1235826
>>35823
>>35817
А насчет того, почему лучше не трогать source charset - потому что у гцц по умолчанию UTF-8, у всякие редакторов UTF-8, в линупсе UTF-8, на всяких гитхабах UTF-8.
86 1235831
>>35799
>>35807

>Рекомендую >>1224213 вот это решение, пока тред еще не уплыл. SetConsole[Output]CP убери.


Короче методом научного тыка нашел более красивый способ:
SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);
Мб кому пригодится
87 1235832
>>35831
или тут есть побочные свойства?
sage 88 1235894
>>35832
Еще полтора года есть подводный камень: консоль с кодировкой UTF-8 в Windows 7 работает через пень-колоду. Иногда не работает вовсе.
89 1236367
Управляющие операторы это те что while или if так ведь? Считается ли оператор возврата return управляющим?
90 1236372
А как насчет оператора инкремента или декремента, они к какому типу относятся?
91 1236373
>>36367
Не считается.
92 1236374
>>36372
К слодению и вычитанию
93 1236375
>>36372
унарные
94 1236377
Как насчет оператора while? Управляющий?
95 1236388
Как насчет оператора c++? Управляющий?
96 1236389
>>36377
>>36388
Заместитель управляющего.
97 1236392
>>36389
Нет. В Си есть source charset и execution charset. Если они отличаются, то компилятор транслирует строковые литералы. Если execution charset не совпадает с фактическим (т.е., если по-русски, строковые литералы в бинарнике не в той кодировке, что ожидает консоль), ты видишь крякозябры.
98 1236394
>>36392
Ты написал бота на С?
sage 99 1236446
>>36394
Я? Какого бота?
100 1236475
Как scanfить char*? А то выдает мусор какой-то.
101 1236498
>>36475
Все, понял.
image.png192 Кб, 1600x900
Аноним 102 1236609
>>31397 (OP)
почему

0061FF24
вот тут инт хранится
0061FF28
а вот тут чар, да ? Тогда почему 4 байта выделилось ? Можете пояснить, просто я тупой и в книге это не объяснялось
0061FF2C
103 1236610
>>36609

> Тогда почему 4 байта выделилось


Выделился байт, остальные три - выравнивание, чтобы следующий член структуры получил адрес, кратный четырем. Это, в свою очередь, нужно для того, чтобы процессору было удобнее (и/или быстрее) его читать. На x86 ты можешь сделать #pragma pack, чтобы структуры упаковывались плотно: >>1229352, но на многих RISC-архитектурах процессор вообще не может прочитать слово по невыравненному адресу - сразу alignment fault, гроб-гроб-кладбище. Если хочешь подробнее: http://www.catb.org/esr/structure-packing/ (где-то было и на русском), но можешь просто не заморачиваться, компилятор обо всем позаботится пока ты не захочешь SSE: >>1229171.
Аноним 104 1236611
>>36610
Тоесть 3 байта заполняются ничем ? Впустую ?
105 1236612
>>36609
>>36610
Как-то из моего ответа не очевидно, что для char выравнивания не требуется (если очень вкратце, примитивный тип выравнивается на свой размер), т.е., char a; char b; будут лежать рядом, без дыр. Так же и short a; short b; или даже short a; char b; char c;. Собственно, в перестановке полей структуры так, чтобы не было дыр, и заключается "искусство" ручной упаковки структур по ссылке выше.

>>36611
Да, ничем. У этих байтов нет имени, к ним нельзя обращаться (физически можно, конечно, выебнуться, но по стандарту нельзя). Чем оно заполнится - зависит от расположения структуры. Статическая память (глобальная) - скорее всего, там будут нули. Стек или куча - мусор.
Аноним 106 1236613
>>36610
>>36611
А где ты эту инфу взял ? Хочу нормально разобраться в сишке, а не чтоб смотреть на двачи\стаковерфловы каждый раз когда чего-то не понимаю
107 1236615
>>36613
Ээээ. Ну я тебе выше ссылку дал. И стандарт, но в нем сложно что навскидку найти. И википедия, и стековерфлоу, что в них плохого? И вообще, в теории (с точки зрения стандарта Си), тебя не должно волновать какое-то там выравнивание. У тебя есть offsetof() и sizeof(), а остальное не твое дело.
Аноним 108 1236617
>>36615
Да, спасибо анон, я просто слепой даун
109 1236649
Пацаны, есть толк от бинарной записи структур/массивов?
110 1236658
>>36649
ПИШЕШ
@
ЧИТАЕШ
111 1236669
Есть функция

void func (int t)
{

struct {
char a[10];
char b[10];
char c[10];
} arr[30];

for (int i = 0; i < 25; i++)
puts(arr.a);

// ... далее ещё код, где используется arr.a
}

Мне нужно, чтобы при t == 1 вместо arr.a вызывался arr.b во всей функции, а при t == 2 arr.c

То есть типа такого:

if (t == 1)
var = b;

if (t == 2)
var = c;

arr.$var

Как это на Си сделать?
111 1236669
Есть функция

void func (int t)
{

struct {
char a[10];
char b[10];
char c[10];
} arr[30];

for (int i = 0; i < 25; i++)
puts(arr.a);

// ... далее ещё код, где используется arr.a
}

Мне нужно, чтобы при t == 1 вместо arr.a вызывался arr.b во всей функции, а при t == 2 arr.c

То есть типа такого:

if (t == 1)
var = b;

if (t == 2)
var = c;

arr.$var

Как это на Си сделать?
112 1236670
>>36669
Там после arr везде i в квадратных скобках.
113 1236695
Антоны, допустим я сделал хэдер с функциями. Нужно ли внутри него совать #include <stdio.h> и т.п.?
114 1236698
>>36695
Если ты добавишь его в хэдэр, то в мейн файле он тебе не понадобится
115 1236700
>>36698
Спасибо тебе!
116 1236790
>>36649

> главное не проебать разный align компилятораом при оптимизациях, endian и прочие тонкости выстрела себе в ногу.

117 1236842
Есть легальная возможность изменить тип члена структуры без использования union?
118 1236867
Почему если я передам функциибез прототипа принимающей аргумент типа int значение double то фактический аргумент не получит новое значение? Разве не работает принцип усечения дробной части?
119 1236890
Как можно реализовать ввод строки, чтобы выделять памяти только столько сколько нужно? Иначе же получается, например, если мы выделили char buf[1024], то мы в любом случае будем столько памяти тратить.
120 1236895
>>36669

> Мне нужно, чтобы при t == 1 вместо arr.a вызывался arr.b во всей функции, а при t == 2 arr.c


Нихуя не понял, что тебе нужно, но видимо, ты хочешь трехмерный массив вместо массива структур, но боишься: arr[30][3][10]. Ну и используешь, хоть puts(arr[ i][0]), хоть arr[ i][t].

>>36695

> хэдер с функциями. Нужно ли внутри него совать #include


Да, если ты используешь в хедере типы или макросы из stdio.h (например FILE). Это правило хорошего тона, чтобы тот, кто подключает твой хедер не задумывался, что там нужно подключить до него и в каком порядке.

>>36698

> то в мейн файле он тебе не понадобится


Если мэйн использует функции из stdio.h, нужно подключать stdio.h явно. Потому что реализация anonlib.h может измениться, он уберет из своего anonlib.h инклуд stdio.h, и все сломается.

>>36842

> Есть легальная возможность изменить тип члена структуры без использования union?


Ну можно ∗(othertype ∗) &structure.member, но это не совсем легальная возможность. Хотя все так делают.

>>36867

> Почему если я передам функциибез прототипа принимающей аргумент типа int


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

>>36890

> если мы выделили char buf[1024], то мы в любом случае будем столько памяти тратить.


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

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


Я вот это и делаю, получается пиздец какой-то несусветный.
122 1236903
>>36899

> Я вот это и делаю, получается пиздец какой-то несусветный.


Я не знаю, какую проблему ты решаешь, но можешь почитать про таблицы строк. Делаешь динамический массив, кладешь строки вплотную, при необходимости делаешь realloc. Но до строк придется ходить по двум указателям: по адресу массива и по индексу первого символа строки внутри массива. Прямой указатель на строку долго хранить нельзя, потому что при realloc() массив вместе с твоей строкой может уехать в рандомное место кучи.
Аноним 123 1236912
>>31397 (OP)
Че делать если простейшие крестики-нолики у меня вышли в 100 строчек ? Как понять как писать правильно ? https://pastebin.com/z0S2Cqck
тиктактое было бы прикольно еслиб вы указали мне на мои недочеты я почти уверен что функцию check_combo можно сделать по другому, но я не увидел как
124 1236914
>>36912
На количество строчек насрать.
125 1236923
анон, реально вкатиться с нуля в си и шоб кто то взял на работу?
126 1236925
>>36912
1) В game() твой while можно заменить на for (turnscount = 0; turnscount < 9; turnscount++) и по выходу из цикла говорить, что ничья, а там, где у тебя the "winner is ..." выходить сразу из функции.
2) Кусок с goto вынеси в функцию, которая крутится в while и матерится, пока игрок не введет нормальные координаты. Координаты можешь по указателям возвращать или глобальными переменными, если в указатели пока не можешь.
3) Игра пошаговая, check_combo может проверять только выигрыш того игрока, который только что сходил - это упростит check_combo сразу вдвое. И проверять можно вложенными for(), а не вручную. И еще можно смотреть, куда человек сходил: если он сходил в первую строку во второй столбец, то очевидно и проверять нужно только первую строку и второй столбец. Но не факт, что такой код будет проще, потому что есть еще и диагонали.
4) Найди уже в своей IDE автоформатирование кода, или какой-нибудь astyle осиль, или clang-format, или сразу пиши красиво. У тебя кое-где скобки не на своих местах.
5) Ну и стандартное отсутствие (void) у функций без параметров сразу выдает крестоблядь.
127 1236939
>>36925
В крестах тоже написать void не лишнее
128 1236941
Зачем писать void в функцию без параметров? Экономия какая?
129 1236942
>>36941
Читаемость
Аноним 130 1236946
>>36925
Спасибо, анон
Но я не понял как сделать check_combos через цикл
Мож написать если не сложно ? Или объяснить
131 1237066
>>36946

> Но я не понял как сделать check_combos через цикл


Ну как-то так: https://pastebin.com/esCWGyK5 Если сообщения выпилить, будет весьма кратенько. В функцию передавать координаты последнего хода и значок сходившего. Алсо, подразумевается игровое поле в виде массива строк, а не столбцов, т.е., field[y][x], а не field[x][y].
sage 132 1237113
>>36925

>Ну и стандартное отсутствие (void) у функций без параметров сразу выдает крестоблядь


C-петушку неприятно, лол. Ссу тебе на голову.
крестобоярин
133 1237148
>>37113
Ты там определился, throw() или noexcept?
134 1237161
>>36895

> Ну можно ∗(othertype ∗) &structure.member, но это не совсем легальная возможность. Хотя все так делают.



Попробовал в gcc, разницы никакой, int не стал float. Покажи на примере, как этим пользоваться.
135 1237163
>>37161
Мля, да всё работает, уже не надо. Просто надо было в printf ещё приводить.
image.png163 Кб, 1280x1024
136 1237298
>>36895
вот простейший пример. передаю ну как бы инт и спецом в прототипе не указываю что функция cube принимает аргумент типа double. на выводе получаю 0 при вводе любого числа. Вопрос почему так? разве по логике передачу фактического аргумента функции нельзя сравнить с присваиванием переменной типа double(в данном случае она имеет имя a). ну как бы я так себе представляю передачу аргумента типа переменной a присвоится значение n из функции main которое идет. ну хз короче
137 1237410
>>37298

> не указываю что функция cube принимает аргумент типа double.


Непонятно, зачем ты с этим возишься, если программа очевидно сломана. Это, кстати, хороший пример, почему пустые скобки триггерят >>37113 сишников. Диагностики по этому поводу по умолчанию в гцц нет (но можно включать -Wmissing-prototypes), потому что раньше такой код был нормальным, да и сейчас иногда требуется.

Пустые скобки в твоей декларации означают любое количество любых аргументов. Когда при вызове функции компилятор не знает типов аргументов, он приводит все аргументы к дефолтным типам: все целые (char, short и т. д.) к интам (если не влезут - к лонгам), плавающую точку к даблам. Т.е., в твоем случае в аргументы попадает int. А дальше мы попадаем в cube(), и у нас происходит undefined behavior, потому что типы фактически переданных аргументов не совпали с ожидаемыми. И все, дальше ни о чем думать не нужно - программа сломана, дело закрыто.

Но похуй, объясню, откуда берется "ноль". В 32-битном коде 64-битный дабл при передаче в качестве аргумента кладется в виде двух 32-битных слов. Т.е., твоя функция cube() видит стек примерно так:

> ...


> адрес возрвата


> младшие слово (32 бита) дабла, у тебя сюда попадает твой инт


> старшее слово (32 бита) дабла, тут какой-то мусор (стек-то не пуст)


> ...


Из двух слов собирается дабл, инт идет в младшие 32 бита дабла (в младшие биты мантиссы, которые почти ни на что не влияют), мусор в старшие. И если у мусора не было нескольких (хотя бы трех) старших битов вполне нормальная ситуация, если там какой-нибудь указатель или адрес возврата, дабл получается положительнным и с маленькой экспонентой. Умножение усугубляет дело, делая экспоненту настолько маленькой, что она, возможно, даже перестает влезать в дабл, и в printf() уже передается настоящий ноль. Попробуй сделать printf("%g\n", a); в cube(), чтобы оценить, какое маленькое число ты получаешь на входе.

В 64-битном коде все проще - там первый целочисленный аргумент (или указатель) кладется в rdi (твой инт как раз туда попадает), а значения с плавающей точкой передаются через регистры SSE - первый аргумент через xmm0, а ты туда ничего не кладешь. Но так как твоя программа только что стартовала и скорее всего еще не успела что-либо оставить в регистрах SSE, то cube() достает оттуда дефолтный ноль.

Мораль сам придумаешь?
137 1237410
>>37298

> не указываю что функция cube принимает аргумент типа double.


Непонятно, зачем ты с этим возишься, если программа очевидно сломана. Это, кстати, хороший пример, почему пустые скобки триггерят >>37113 сишников. Диагностики по этому поводу по умолчанию в гцц нет (но можно включать -Wmissing-prototypes), потому что раньше такой код был нормальным, да и сейчас иногда требуется.

Пустые скобки в твоей декларации означают любое количество любых аргументов. Когда при вызове функции компилятор не знает типов аргументов, он приводит все аргументы к дефолтным типам: все целые (char, short и т. д.) к интам (если не влезут - к лонгам), плавающую точку к даблам. Т.е., в твоем случае в аргументы попадает int. А дальше мы попадаем в cube(), и у нас происходит undefined behavior, потому что типы фактически переданных аргументов не совпали с ожидаемыми. И все, дальше ни о чем думать не нужно - программа сломана, дело закрыто.

Но похуй, объясню, откуда берется "ноль". В 32-битном коде 64-битный дабл при передаче в качестве аргумента кладется в виде двух 32-битных слов. Т.е., твоя функция cube() видит стек примерно так:

> ...


> адрес возрвата


> младшие слово (32 бита) дабла, у тебя сюда попадает твой инт


> старшее слово (32 бита) дабла, тут какой-то мусор (стек-то не пуст)


> ...


Из двух слов собирается дабл, инт идет в младшие 32 бита дабла (в младшие биты мантиссы, которые почти ни на что не влияют), мусор в старшие. И если у мусора не было нескольких (хотя бы трех) старших битов вполне нормальная ситуация, если там какой-нибудь указатель или адрес возврата, дабл получается положительнным и с маленькой экспонентой. Умножение усугубляет дело, делая экспоненту настолько маленькой, что она, возможно, даже перестает влезать в дабл, и в printf() уже передается настоящий ноль. Попробуй сделать printf("%g\n", a); в cube(), чтобы оценить, какое маленькое число ты получаешь на входе.

В 64-битном коде все проще - там первый целочисленный аргумент (или указатель) кладется в rdi (твой инт как раз туда попадает), а значения с плавающей точкой передаются через регистры SSE - первый аргумент через xmm0, а ты туда ничего не кладешь. Но так как твоя программа только что стартовала и скорее всего еще не успела что-либо оставить в регистрах SSE, то cube() достает оттуда дефолтный ноль.

Мораль сам придумаешь?
dnoge 138 1237619
139 1237631
Как писать на Си если я не умею в ручной менеджмент памяти?
140 1237647
>>37631
Что значит "не умею"?
А что там "уметь"? Ну не пользуйся памятью.
14788902579710.jpg40 Кб, 640x360
141 1238102
>>37631
Попробуй ножной
142 1238504
Здравствуйте.
Есть задача:

while(...)
{
while(...)
{
как отсюда выбраться наружу внешнего вайла, не используя abort(), terminate(), exit() и goto
}
}

Нагуглил только возможность возвращать значения, если это всё изначально было внутри функции. Но должны быть еще варианты, какие не знаю. Подскажете?
143 1238505
>>38504
Добавь кондишон во внешний вайл, влавствуй.
144 1238507
>>38504
continue
145 1238509
>>38507
To be continued...
146 1238518
>>38504
Правильно - goto или обернуть в функцию и использовать return (последнее предпочтительно). Допустимо - добавить дополнительную переменную и условие во внешнем цикле, как посоветовали выше.
147 1238561
>>38518
Согласен с этим.
image.png3 Кб, 292x58
148 1238605
Сап. Этим советам, на первом пике, можно верить? Интересует второй, про смешивание.
К примеру, написал что-то вроде:
int value = 100, *pointer = &value;
т.е. и переменную объявил, и адресок взял, и все одной строкой.
Следуя логике советчиков - мне пiзда. Если так, то почему?
Чем однострочная запись хуже той, что на пике?
Да, ресурс так себе, знаю. Просто стало любопытно, почему так.
image.png22 Кб, 652x272
149 1238608
>>38605
БЛЯБЛЯБЛЯ!!! АТЕНШОН!!! не та картинка
150 1238625
>>38605

> Следуя логике советчиков - мне пiзда


Логика советчиков не в том. С точки зрения синтаксиса все ок. Но:

// При беглом взгляде кажется (особенно новичкам), что y и z - указатели, но нет.
// Это просто-напросто хуже читается. И это основная причина так не делать.
int ∗x, y, z;
sage 151 1238631
>>38625
А бывает еще вот такое форматирование, которое запутывает еще больше (поэтому нормальные люди звездочку пишут рядом с переменной, а не с типом):
int∗ x, y, z;
152 1238638
>>38625
>>38631
Спасибо. По поводу форматирования еще встречал когда звездочку ставят как знак умножения, типа
int * p
А на читаемость больше по моему влияют грамотные имена переменных и указателей(и всего остального).
Но да, построчно конечно понятнее.
153 1238687
>>38505
>>38518
Спасибо, как-то не догадался.

>>38507
А как это должно мне помочь, если во внешний цикл будет while(1)? continue же только „доматывает“ итерацию внутреннего цикла и идет на следующую, а если в обоих условиях 1?

Есть какие-то дополнительные возможности, если приложение многопоточное?
148457343816676431[1].jpg22 Кб, 600x444
154 1238688
>>38631
Нормальные — это те, которые яйцо разбивают с правильной стороны, следуя всем мудрым доводам твоего лагеря и игнорируя глупые доводы приверженцев противоположного?
sage 155 1238709
>>38688
Нормальные - это те, которые следуют древнему завету "декларация отражает использование". Если пишешь int∗ foo, будь последователен, делай дереференс int bar = ∗ foo; Не забудь также о printf("square: %d\n", ∗ foo ∗ ∗ foo);
156 1238718
>>38504

break.

Пиздец, тут все поехали чтоли?

goto, return вообще охуеть.
157 1238723
>>38718
goto и return нормальный юзкейс. В ядре линукса можно много где увидеть, хотя там обычно один return, на нем меткаerr_exit: и к нему делается goto.
158 1238724
>>38718
>>38723

И это ты поехал чтобы из внутреннего цикла выйти вне внешнего тебе нужно как минимум два break, а я могу одним goto, и это будет нагляднее и понятнее.
sage 159 1238729
>>38724
Goto это антипаттерн. За такое нужно увольнять.
160 1238731
>>38729

>Goto это антипаттерн.


Это, конечно верно - но иногда просто нет других вариантов.
Но редко, да.
161 1238732
>>38729
Ах да, вот это - >>38504 - как раз такой случай.
162 1238733
>>38724

>нужно как минимум два break,


Это хуйня, а вот то, что надо два бранча - это хуево.
163 1238737
>>38733

bool terminated = false;

while
{
while
{
while
{
while
{
....
terminated = true;
break;
}
if(terminated)
break;
}
if(terminated)
break;
}
if(terminated)
break;
}
164 1238748
>>38737
Говнокод уровня легкой олигофрении, поздравляю.
165 1238762
>>38729
Мы постоянно апстримим свой драйвер в netnet-next-branch линукса, да и не только мы юзаем goto.
Алсо: http://koblents.com/Ches/Links/Month-Mar-2013/20-Using-Goto-in-Linux-Kernel-Code/
166 1238763
>>38737
Вот за такое тебя точно выебут, а goto нормальная практика.
167 1238764
>>38763
*this
168 1238779
>>38729

>Goto это антипаттерн. За такое нужно увольнять.


Пошто его все так люто хейтят? Просто каждый считает своим долгом обосрать goto.
Что в нем такого плохого? Объективно. Реальные причины есть, или из разряда "все хейтят и я буду"?
169 1238784
>>38779
Старый мем, повторяют как обезьяны.
Всё, что они могут сказать, написано в
Edgar Dijkstra: Go To Statement Considered Harmful
в своё время.
goto используется overДохрена раз в ведре Linux.
170 1238791
>>38779

>Пошто его все так люто хейтят?


Потому что лапша.
Потому что структурное программирование придумано для того, чтобы принуждать умственно неполноценных дебилов вроде вас всех меньше говнокодить.
ООП, кстати, тоже в том числе для этого.
171 1238795
>>38791
<setjmp.h> на вас нет, структуристы хреновы.
172 1238797
>>38795

>этот говнокодящий олигофрен.


А вот и иллюстрация.
173 1238799
>>38797
Ни разу не юзал гото, просто не пишу глубокие вложения, можно было бы выскочить с гото - выскочил.
Потому что надо быть адекватом, а не кукарекать за идиому.
174 1238807
>>38799

>просто не пишу глубокие вложения


2 - уже может быть глубоким, кстати.
Впрочем, крудомартышкам это в любом случае не нужно.
175 1238931
Посоны, не умирайте.

Какие рабочие нагрузки выбрать при установке MS Visual Studio, чтобы работать с Си?
176 1238962
>>38931

>рабочие нагрузки


Пришлось даже гуглить что это лол
Ну хз чел, я бы советовал бежать нахуй от майкрософтовского поделия и юзать труЪ стафф.
Обычный текстовый реактор и gcc все что тебе нужно, базарю.
Как проект разрастется напишешь makefile.
177 1238984
Почему никто не вспомнил про использование goto для возвращения в начало функции? Другие методы(рекурсия) либо замусоривают стек, либо выглядят уж точно уродливей, чем метка в начале функции.
178 1238986
>>38984
Потому что в общем равноценно возврату в любую точку кода в функции, даже не хочется рассматривать как специальный юзкейс.
Ыыы, так же можно ещё в while(0){} скоп запрыгнуть, ну ахринеть. Эксклюзивный так скоп только для гото)000)0
179 1238993
>>38962
Иногда ещё clang можно юзать, у нас как-то порт на другую платформу не собирался на гцц, а на кланге собрался.
180 1239017
>>38962
Мне надо написать серверную часть с ГУИ, потому что, сука, клиентская часть на Си.
Я Си то плохо знаю, а тут ещё почитал, что хрен слепишь графику.

Была не была, может тут ответят на мой ответ про TCP Socket'ы:

>Есть ли какой-нибудь выход, кроме как сливать значения передаваемых переменных в string с уникальными маркерами, а потом долго и уныло их парсить, перебирая каждую переменную?


Изначально хотел передавать структуру (потому что много данных типа bool, uint8_t, char), но в питоне нет структур... А для Си я граф. оболочку ни разу не писал. Как, впрочем, и на других языках.

Короче, mingw-w64 и SublimeText норм?
Смотрел ещё Eclipse - чем-то похожа на одну фирменную среду разработки под микроконтроллеры.
image.png85 Кб, 1366x738
181 1239054
>>39017

>Короче, mingw-w64 и SublimeText норм?


>Смотрел ещё Eclipse - чем-то похожа на одну фирменную среду разработки под микроконтроллеры.


Да, норм, mingw-w64 это пак gcc, g++ и прочего, под винду, gcc он и в африке gcc.
Сам пользуюсь нотепад++, всем устраивает, после кое каких настроек приобретает вид аля IDE, см. пик.
SublimeText лично не щупал, но думаю она норм, выглядит симпатично.
Эклипс да, ее вроде как юзают аврщики и ардуинщики часто. Тоже норм.
Многие еще vim юзают, что вообще мега труЪ.

Насчет ГУЯ - я тоже озадачен этой темой, но пока думаю над архитектурой и самим кодом.
Могу подсказать только направление куда копать, и пару либ, большего, увы, не делал:
https://habr.com/post/319106/ - Присматриваюсь к ней, но пока щупать не решаюсь.
https://github.com/wjakob/nanogui
Если пишешь под линукс, попробуй поковырять xlib.
Если кросс платформ - лучшее решение будет опен жл, у нуклеара в примерах есть рендер жл-овский.
182 1239059
>>39017
>>39054
Вот еще вспомнил, есть замечательная вещь - tcl/tk
tcl - скриптовый язык, tk - графическая либа к нему.
На этой связке довольно часто пишут ГУИ к консольным программам на си.
183 1239108
>>39017

>но в питоне нет структур


Только не говори, что нельзя написать байндинг к твоему питухону
184 1239195
>>39017

> в питоне нет структур


import struct; help(struct)

>>39054

> лучшее решение будет опен жл


> nanogui


> nuklear


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

Сам посоветую не страдать хуйней и написать гуй на Python/Qt5 (если он каким-то местом в проекте имеется) или C++/Qt5. Можно подумать о Gtk+, но если в требованиях в том числе и винда, то лучше все же Qt.
185 1239223
>>39195

>но для сервера гуй


Нормальные люди делают гуй на хтмл, серверу послушать лишний порт не тяжело
186 1239226
>>39223
Тоже хороший вариант.
187 1239435
>>39195

>import struct; help(struct)


Лол, загуглил "python структуры" а там давай втирать, что как таковых структур в питоне нет и что они не соответствуют структурам из Си; потом загуглил "uint8_t python", пишут что нет такого типа данных готового.

>Нормальные люди делают гуй на хтмл


Слишком много гемора с освоением, для хоббийного проекта то.
188 1239436
>>39435

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


ясно, школьник?
189 1239437
>>39436
Нет.
190 1239455
>>39436
>>39223
Ок, как это должно выглядеть? На словах хотя бы, чтобы иметь представление.
191 1239471
>>39455

>На словах хотя бы, чтобы иметь представление.


Скачай fossil и запусти с ui
192 1239679
Почему Прата называет sizeof ОПЕРАЦИЕЙ? Это же оператор. Вообще как-то синонимично называют операции, операторы, выражения
Clear11.jpg58 Кб, 561x604
193 1239720
>>39679
Он просто перегрузил слово операция.
194 1239786
>>39679

>Это же оператор.


Схуяли? Он сводится в компайл тайм к константе
195 1239787
>>39786
Умножение на ноль тоже сводится к компайл-тайм константе, но умножение от этого оператором быть не перестает. Алсо, в C99 и выше есть VLA, для которых sizeof работает не в компайл-тайм:
int foo = scanf("%d");
int bar[foo];
printf("run-time sizeof: %zu\n", sizeof(bar));
1533232953753.PNG10 Кб, 322x258
196 1239804
Какое значение у posix, win32, sjlj и seh?
Сначала архитектура написана, а что дальше я не понимаю.
197 1239809
>>39804
SJLJ/SEH - это поддерживаемые модели исключений крестов (в Си в принципе нету). POSIX/Win32 - поддерживаемые модели потоков. Если собираешься линковаться с чужими длл (особенно с MSVC-шными) - выбирай win32.
198 1239898
>>39809

>SJLJ/SEH - это поддерживаемые модели исключений крестов (в Си в принципе нету).


?
199 1239929
>>39804

>значение


буль дог
в тыренте фсё есть деб
200 1240136
Какие существуют реальные и перспективные аналоги Си?
201 1240199
На русском языке есть что прочитать?
202 1240215
>>40199
к&r неплохой перевод, я вообще тупо эту книгу выдрачивал до просветления, уникальная книга, плотность информации в ней зашкаливает
есть еще недооцененная книга кернигана - "unix, программиное окружение", я бы посоветовал ее даже тем кто не планирует кодить под линуксы, хорошенько промывает мозг
203 1240254
>>40215
Спасибо большое.
Алсо, вот я у себя дома нашел книжку Демидович Е.Ь "Основы алгоритмизации и программирования" 2 издание.2008
Си сильно поменялся с 2008 года?
Прост с моника и телефона сейчас не кайф читать(я так питон учил, и подустал) А тут такая книга дома, могу подучить с бумаги.

Еще есть книжка дома С/C++ Т.А. Павловская 2007
204 1240260
Почему в шапке нет Steven C. Mcconnell Code Complete ?
Годнота же.
45450241240542.jpeg72 Кб, 550x916
205 1240319
>>39471
https://habr.com/post/244281/
Посмотрел - подходит.
И ,похоже, графики кривых отрисовывать тоже можно.

Блядь, но с жабо-скриптами я вобще не знаком. Короче, кругом жопа.
к.PNG93 Кб, 559x770
206 1240373
>>40254

> С/C++ Т.А. Павловская 2007


У меня валяется 2003 кажись, эта книга сделает тебя крестовиком, а не сишником.
207 1240380
>>40136
Rust?
209 1240382
>>40380
>>40381
Но С они, конечно, не заменят никогда.
Скорее Rust немного потеснит кресты, а Go - Питуна с крестами и им подобных.
210 1240383
>>40382
А, ну Rust, конечно, ещё C# может заменить.
211 1240390
>>40381
Он не для системного программирования.
212 1240392
>>40390
Так, что по-твоему системное?
И почему тогда был назван Rust, а не C++?
C++ отличная замена C, ты не теряешь скиллов С, просто по сути получаешь более хороший компилятор.
213 1240414
>>40392
Кресты проигрывают в скорости си, и на си уже дохуя всего написано.
214 1240416
>>40414
Писец, лучше не обсуждать языки вообще никогда и нигде.
215 1240423
>>40136
А зачем? В Си и так все неплохо
sage 216 1240436
>>40260

>Почему в шапке нет Steven C. Mcconnell Code Complete ?


Потому что она не про конкретный язык, а про программирование в целом.

>>40414

> Кресты проигрывают в скорости си


Нет. Если предположить, что и на Си, и на C++ пишет разбирающийся в языке человек, Си проигрывает крестам по скорости (из-за шаблонов, из-за constexpr, из-за тех вещей, которые сложно выразить лаконичным синтаксисом Си, но можно крестовыми заклинаниями). Но стать человеком, разбирающимся в Си - гораздо проще, поэтому обычно сишный код обгоняет крестовый.
217 1240482
>>40436
Все твои шаблоны и т.д. это скорость написания кода, а не скорость его работы.
И на си пишутся обычно операционные системы и драйверы, где хуй знает вообще можно применить шаблоны, в таком широком смысле.тем более я говорил про линукс, там крестам вообще нет места, под Винду и на крестах пишут, ето так
218 1240507
>>31397 (OP)
kill(-1) убивает все запущенные процессы? Это прямо как rm -rf /
219 1240508
>>40507
У функции два аргумента, если что.
И ты забыл --no-preserve-root
220 1240532
>>40508
Просто kill(-1, SIGKILL) грохнуло мне все запущенные процессы.
sage 221 1240584
>>40482

> Все твои шаблоны и т.д. это скорость написания кода, а не скорость его работы.


Нет. Например, на Си ты вместо шаблонов сделаешь void *, и компилятор не сможет это отптимизировать так же качественно. И вообще, в целом, в сишном коде у тебя будет больше ненужных дереференсов указателей и вызовов функций. Но ты, конечно, можешь все разворачивать, приправляя мешаниной дефайнов, превращая код в абсолютно нечитаемый.
222 1240590
>>40584

>превращая код в абсолютно нечитаемый


Другое дело кресты...
223 1240591
>>40590

>Другое дело кресты...


Другое дело ООП...
224 1240605
>>40319
бляя загугли electron или photon
даже однорукая макака без мозга сможет в этоговно
откуда вы лезете уёбки7
226 1240834
Подскажите, какую литературу читать, чтобы понять, как текут потоки в C?
227 1240836
>>40834
Никак, в С нет потоков.
Модель памяти в С++ рассматривается в книге Энтони Уильямс "Параллельное программирование на C++ в действии"
228 1240837
>>40836

> Никак, в С нет потоков.


В С11 завезли же. https://en.cppreference.com/w/c/thread
229 1240839
>>40837

> en.cppreference


А я о чём тебе говорил? Короче, книга вон.
230 1240840
>>40836
Это уже скачал, но хочу начать именно с C, или вообще пофиг?
>>40837

>https://en.cppreference.com/w/c/thread


Собственно об том и вопрос, что по этой ссылочке смотрю в книгу, вижу фигу. Есть что-то популярнее? Может на ютюбе разжевалово от индусов для прочих бичей?
231 1240841
>>40840

> вообще пофиг


*This.
232 1240845
>>40839
Во-первых, я другой анон, так что я не знаб кому, что ты говорил. Во-вторых, ссылка на описание ссылок С11, а не на кресты.

Ссылку не открывай
@
Дебаты разводи
233 1240848
>>40840
Смотри pthread.h они близки друг другу.
234 1240870
>>40845
OS-specific API, если не хочешь дебаты, быстро и решительно >>40848
2018-08-04 190054.png15 Кб, 708x325
235 1240875
>>40845
Алсо,

> юзлесс говно кидай

236 1240884
>>40875
А никто и не говорил, что это... я просто показал, что есть возможность, а на сколько она хороша...

>>40870
Очень приятно, когда в пример приводят мой же коммент. Добра тебе, няш.
237 1240885
>>40884
Ну тогда и тебе добра.
238 1240915
Как узнать что подключение через сокет AF_UNIX все еще работает?
239 1240933
>>31397 (OP)
У меня головная боль от переизбытка информации.

Я прост скачал книгу http://1.maintracker.org/forum/viewtopic.php?t=452291 и планирую прочитать её. Она хооршая? Она дсат мне работу и научит делать прилоежния на смартфоны и прилоежния/игры?
sage 240 1240936
>>40933

> http://1.maintracker.org/forum/viewtopic.php?t=452291


Тебе в крестотред. И нет, для смартфонов одного C++ маловато. Можно, но маловато - нужна еще и Java.
sage 241 1240938
>>40933
>>40936
И нет, книга, изданная в двухтысячном и описывающая давно устаревший C++98 не даст тебе работу даже в теории.
242 1240943
>>40938
И что делать тгда? ИСкать версию 2010+?

просто уже зебался каждый день оухевать от кол-ва книг, курсов, видео на тубе, хочу просто сесть и начать читать что-нибудь, а эта книга вроде очень фундаметнальная и аж на 700 стр...
243 1241026
>>40943
400 из них это база, которую знают даже дети, остальные 300 устаревшее легаси говно, которое никто не использует.
244 1241057
>>40836
https://www.opennet.ru/opennews/art.shtml?num=49059
В GNU C Library добавили поддержку потоков ISO C (threads.h), определённых в спецификации ISO/IEC 9899:2011). Для использования потоков в приложениях необходимо связывание с libpthread.
245 1241064
>>40834
Там немного есть:
Р. Лав - Linux. Системное программирование
Иванов Н.Н. - Программирование в Linux
246 1241095
>>41057

> glibc


Ну это уже как раз ОС-специфик по сути, не?
247 1241096
>>41064
Ну и APUE тогда уж.
Правда, опять-таки, спрашивалось, как в С текут.
А в главе 5 >>40836 как раз модель памяти с точки зрения проектировщиков языка.
А что аналогичное для С вы можете доставить?
sage 248 1241360
>>41095
Есть стандартная либа, в ней определен стандарт на потоки, а реализации - удивительное дело, отличаются для разных ОС.
249 1241556
>>41360

> glibc


Красноглазые уже пишут и принимают стандарты С?
250 1241572
>>41556

>ISO C (threads.h), определённых в спецификации ISO/IEC 9899:2011)


Ты читать не умеешь?
15333863886780-b.png257 Кб, 421x407
251 1241576
Возвращаю из функции указатель на саму себя, ну и что ты мне сделаешь?
15333863886780-b.png257 Кб, 421x407
252 1241577
Возвращаю из функции указатель на саму себя, ну и что ты мне сделаешь?
253 1241595
>>41577

>Возвращаю из функции указатель на саму себя, ну и что ты мне сделаешь?


Возвращаю из функции указатель на саму себя, ну и что ты мне сделаешь?
>>41572
Как скажете, спасибо за прототипы функций, ИСОСИ!
254 1241609
>>41595
А что тебе еще надо? В стандарт добавили потоки, а дальше на каждой ОС своя реализация. На прыщах glibc, на *bsd libc и т.д.
255 1241611
>>41609

> А что тебе еще надо?


std::atomic
256 1241631
>>41611

>std::atomic


<stdatomic.h>
257 1241633
>>41631
Охренеть, я обленился уже читать гугл.
Мне книгу по этому не выкатили, я этого не видел, мда.
258 1241636
>>41633
Так что тебе надо?
259 1241637
>>41631
>>41636
Впрочем, привлекательней threads.h с единственной имплементацией на amd64 ты не сделал.
Именно с прагматической стороны.
261 1241793
>>41724
pthreads nice, OpenMP - блевотина в плане решёточного синтаксиса.
Вот <thread> топчик, он везде реализован, и у него в какой-то степени pthread-like синтаксис.
262 1241797
Вообще претензии к стандартной библиотеке языка, 99 юзкейсов которого - это велосипедить реализации библиотек и системных вызовов с нуля - ну такое.

>>40392

>Так, что по-твоему системное?



Это значит, что ты можешь выбросить рантайм и стандартную библиотеку и с помощью одного лишь компилятора под таргет-архитектуру чото сделать. Если без рантайма и стандартной библиотеки обломинго - значит не системное.
263 1241815
>>41797

>выбросить рантайм


А где у тебя программа будет выполняться? В компайл-тайме?
264 1241816
>>41815

>А где у тебя программа будет выполняться? В компайл-тайме?



На процессоре.
265 1241836
>>41815
Ыхы, он подразумевает, что baremetal - не рантайм.
Хотя если дословно, рантайм - это рантайм и есть.
266 1241839
>>41836

>рантайм - это рантайм и есть


Какое пидерское словечко, это же стандартные либы которые свободно доступны в юнихах и по пидерски в шиндовсе.
267 1241840
>>41816
Умник какой.
268 1241841
>>41836
Я бы посмотрел на то, как он попробует сделать что-то bare metal.
269 1241845
>>41841

>попробует сделать что-то bare metal.


В порты никогда не писал, лалка?
270 1241847
>>41845
А это теперь уже стало программированием на чистом железе? Я как-то в универе на маняторе цвет пикселя напрямую поменял, я теперь тоже baremetal программист?
ну и дибилизм пиздец
271 1241849
>>41847

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


Был бы не дибилом, мог бы загрузчик на псевдографике запилить.
272 1242239
Вы тут смотрю потоки обсуждаете, но что это дает? Какая от этого практическая польза? Типа распараллелить вычисления или что? Сорян, я еще немного нюфак. Знаю только что есть потоки типа stdin, stdout и stderr.
sage 273 1242243
>>42239

> Какая от этого практическая польза


В одном потоке рабоать с пользовательским вводом и сетью, во втором рисовать с фиксированным фреймрейтом, еще в трех - считать что-то тяжелое. Алсо, с блокирующим IO в отдельном потоке работать гораздо проще, чем с неблокирующим IO со всякими poll и select в основном потоке.
274 1242270
>>42243

>Алсо, с блокирующим IO в отдельном потоке работать гораздо проще, чем с неблокирующим IO со всякими poll и select в основном потоке.


Это где так?
sage 275 1242271
>>42270
Везде. Оба подхода - обычное дело и в Linux, и в Windows.
276 1242351
>>42239

>Вы тут смотрю потоки обсуждаете



Если писать что-то сложнее хеллоуворлда, то они обязательно понадобятся.
277 1242354
>>41064
Я так понимаю, юзеру венды рыпаться смысла нет?
278 1242363
>>41797

> Вообще претензии к стандартной библиотеке языка, 99 юзкейсов которого - это велосипедить реализации библиотек и системных вызовов с нуля



Зачем велосипедить, если есть уже готовые сторонние библиотеки? Или ты хочешь, чтобы стандартная разжирела?
279 1242408
>>42239

>Вы тут смотрю потоки обсуждаете, но что это дает? Какая от этого практическая польза?



В 21 веке процессоры многоядерные. Производительность на ядро растет всё меньше и меньше. Писать однопоточный код уже признано однозначным зашкваром. Тот кто его пишет считается дремучей лалкой из времен pentium4/athlonxp
280 1242409
>>42363

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



Потому что они завязаны на конкретную OS. А OS еще нет. Есть только голая железяка и конпелятор, умеющий в неё.
281 1242410
>>41847

>Я как-то в универе на маняторе цвет пикселя напрямую поменял, я теперь тоже baremetal программист?



Нет. Ты хуй и паскаль.
282 1242456
>>42408

>дремучей лалкой


Сам ты дремучая лалка, хуйня твоя
283 1242457
>>42456
многопоточность
изображение.png480 Кб, 680x800
284 1242464
>>42456
>>42457

О, ниасиляторская лалка найс порвалась.
1532838128140277440.jpg30 Кб, 400x266
285 1242471
>>42464
У тебя каргокульт многопоточности, пососи сисю
286 1242559
>>31397 (OP) АААААА !!!блядь!
Что за хуйня? Читаю Мозга Кернигана с Денисом, а там блядь ФУНКЦИИ БЕЗ ТИПА, т.е. что то типа
foo (x,y) {пошла моча;}
Что за троллинг? Я прост с крестов начинаю, а тут такие ужасы...
287 1242561
>>41577 отрублю тебе стек, по самые регистры, сука!
288 1242564
>>42559
неявный int
289 1242566
>>42564

>неявный int


Ух блядь. И в параметрах функции так же?
А то я уже думал может файл книги битый или какая то опечатка или что угодно.
290 1242580
>>42559
Чёт орнул. А допустимость конструкции auto int тебя не удивит?
291 1242627
Анон, привет! Сорри за нубские вопросы заранее. Только начал изучать Си.
Оператор return. Не могу понять немного суть использования (не в функции). return 0 - типа успешное завершение программы. А вот допустим видел кусок кода, в начале данные на инпут от юзера идут и код чекает удовлетворяют ли они условиям и идёт 3 штуки if в конце которых return 1; return 2; return 3 соответственно. Вот этот момент кто-нибудь может объяснить на пальцах?
292 1242634

> The C Programming Language


В технических книгах сложный английский?
Есть смысл пробовать читать в оригинале, если с английским знаком только по интернетам, но никогда его не учил?
293 1242636
>>42634 не насилуй себя на начальном уровне. В языке Си много тонких мест, и если ты их проебёшь из-за незнания английского, то нахуй выёбываться. Один хуй тебе придётся читать доки ко всем либам только в оригинале.
294 1242640
>>42627 return - точка выхода из программы. Всё сворачивается автоматические переменные убиваются и остаётся только то что ты повесил на return.
Если прога ничего не должна возвращать то и return не нужен.
Читай мануал дальше. Там всё объяснено.
295 1242648
А млять, неправильно прочёл что ты там срашивал.
Прога завершается и return высирается ОС, а дальше уже она сама решает что с этим говном делать. Читай как и зачем в Юниксах пайпы делают, это из этой оперы.
>>42640 - продолжение
296 1242654
>>42564 читнул, орнул, забавно. У Си значит есть своё auto, которое не то новое auto у С++.
297 1242670
>>42654
Это никакой не авто, это умолчание для одного типа.
Ты, верно, слишком молод, раз орёшь по таким мелочам
298 1242678
>>42648
// ensure proper usage
if (argc != 2)
{
printf("Usage: fifteen d\n");
return 1;
}

// ensure valid dimensions
d = atoi(argv[1]);
if (d < DIM_MIN || d > DIM_MAX)
{
printf("Board must be between %i x %i and %i x %i, inclusive.\n",
DIM_MIN, DIM_MIN, DIM_MAX, DIM_MAX);
return 2;
}

// open log
FILE* file = fopen("log.txt", "w");
if (file == NULL)
{
return 3;
}
Вот сам код
299 1242681
>>42678
Тебе же сказали, почитай стандартные значения кодов возврата.
Зачем ты код принёс.и на будущее заливай код в идеон или сорт оф, а в тред ссылку
300 1242686
>>42354
У юзера винды есть Рихтер и есть соответствующая глава в MSDN. После этого достаточно лишь прочитать описание threads.h в стандарте.

>>42408

> В 21 веке процессоры многоядерные


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


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

>>42566
Да, раньше в языке было еще больше способов стрелять себе в ногу с переподвыверта.

>>42627
0 - это EXIT_SUCCESS. Все остальное на твое усмотрение. Можешь обойтись лишь EXIT_SUCCESS/EXIT_FAILURE, можешь возвращать номер стадии, на которой произошла ошибка (как в коде, о котором ты говоришь). Или, например, в MS-DOS была команда choice, использовалась для написания батников - она предлагала нажать одну из заданных в аргументах клавиш и возвращала ее порядковый номер. Так тоже можно.
301 1243132
Сап. Подскажите какой дебаггер выбрать.
Мне нужно чтобы я запустил прогу, а дебаггер показывал, какая часть исходного кода выполняется. Типа, нажал кнопку в проге, и он тут же подсветил участок кода. Чтобы можно было посмотреть какие переменные в памяти, чтобы можно было останавливать выполнение в произвольном месте и например отматывать назад или выполнять код по шагам/тактам.
Работаю на винде. Но в принципе, если есть такое только под линукс, то ок. Хорошо бы чтобы он был опенсорсный.
302 1243174
>>42686
Спасибо, что-то вроде проясняется после твоего ответа. А можешь объяснить FizzBuzzEnterpriseEdition это что такое? ФиззБазз что такое знаю, а всё в целом что подразумевает?

И этот неявный инт - это архаика и теперь так писать дурной тон, правильно?
303 1243175
>>43132
В любой иде такое есть, в той же студии.
304 1243203
>>43174

> А можешь объяснить FizzBuzzEnterpriseEdition это что такое?


Погугли.

> И этот неявный инт - это архаика и теперь так писать дурной тон, правильно?


Правильно. В С99 и выше уже запрещено.

>>43132
Ты не поверишь, но gdb. Собираешь с -ggdb. Кроме того, на винде Visual Studio, Pelles C и windbg все умеют в source-level отладку.

> и например отматывать назад


Нинужно.
305 1243206
>>43203
Дополню, последнее не нужно, потому что есть стоп-меткиили как ето называется?
другой-анон
306 1243227
>>43203
Спасибо большое, про gdb наслышан, буду пробовать его. Ну и студию тоже наверно попробую.
>>43206
Ты про точки останова, да?
307 1243322
Вопросы по Прате:
Вот пример из книги https://ideone.com/oJaSnL объявление структуры и объединения у меня вызвало подозрение, попробовал запустить, офк ничего не пошло, пока не убрал булы, размер структуры с ними 16 , без них 4, хули так много? хотя размер була 1, я так понял что в структуре у меня засели int на 4 позиции bool 4 опять инт и опять бул. Это так?
Так вот, такую же мешанину из short, int и bool делать нельзя? Что происходит с битовыми полями при смешивании типов, почему по ссылке все работает норм?
308 1243334
>>43322

> Так вот, такую же мешанину из short, int и bool делать нельзя?


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

> Что происходит с битовыми полями при смешивании типов


Ничего не происходит, тип элемента битового поля может быть bool или int. Единственное, чего нельзя - указывать битов больше, чем в реальных singed/unsigned int или bool.

> почему по ссылке все работает норм?


Потому что и должно работать норм.

> офк ничего не пошло, пока не убрал булы


Возможно, у тебя компилятор не умеет в C99, возможно, ты просто -std=c99 или -std=c11 забыл. Тащи сообщение об ошибке.
309 1243338
>>43334
c11 включен, даже варнингов нет.
Вот мой выхлоп:

Исходные настройки окна:
Окно непрозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.

Настройки окна с использованием представления unsigned short:
Окно непрозрачно.
Цвет фона черный.
Рамка не отображается.
Стиль рамки сплошной.
Цвет рамки черный.
комбинация битов 00000000000000000000000000000001

Измененные настройки окна:
Окно прозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.

Настройки окна с использованием представления unsigned short:
Окно прозрачно.
Цвет фона голубой.
Рамка не отображается.
Стиль рамки пунктирный.
Цвет рамки красный.
Комбинация битов 00000000000000000001001000001100
309 1243338
>>43334
c11 включен, даже варнингов нет.
Вот мой выхлоп:

Исходные настройки окна:
Окно непрозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.

Настройки окна с использованием представления unsigned short:
Окно непрозрачно.
Цвет фона черный.
Рамка не отображается.
Стиль рамки сплошной.
Цвет рамки черный.
комбинация битов 00000000000000000000000000000001

Измененные настройки окна:
Окно прозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.

Настройки окна с использованием представления unsigned short:
Окно прозрачно.
Цвет фона голубой.
Рамка не отображается.
Стиль рамки пунктирный.
Цвет рамки красный.
Комбинация битов 00000000000000000001001000001100
310 1243344
>>43338
Во, теперь понял, в чем твоя проблема. Дело в том, что GCC "оптимизирует" битфилды таким образом, что члены разных типов выравниваются на границу инта. Получается бит для bool + 31 бит выравнивания, 7 бит для цвета и безымянного члена + 25 бит выравнивания, 1+31 для bool и выравнивания и т. д. Всего 4 инта, т.е., 16 байтов. Скажи -mno-ms-bitfields или собирай шлангом, там этот ключ по умолчанию, а для GCC-шного поведения нужно специально попросить -mms-bitfields.
311 1243345
>>43344

>собирай шлангом, там этот ключ по умолчанию


я им и собирал, так а вообще это выравнивание битовых полей в стандарте не прописано?
312 1243347
>>43345

> я им и собирал


Мда, ну значит у меня просто старый шланг.

> а вообще это выравнивание битовых полей в стандарте не прописано?


В стандарте всегда крайне расплывчатые формулировки всего, что выходит за пределы абстрактной машины. Код в Прате непортабелен, потому что делает предположения относительно раскладки битфилдов: компилятор может выделить под элемент char, а может и int, может начать заполнение со старшего бита, а может с младшего. Но то конкретное поведение, на которое ты напоролся - стандарту противоречит. Даже если компилятор выделит всего байт для первого bool, в байте останется еще достаточно места, чтобы туда влезли fill_color и анонимный член, и в этом случае компилятор обязан их туда положить.
313 1243348
>>43347
ясно, спасибо
314 1243444
Почему крашится?
int c;
c = getchar();
printf(c);
315 1243447
>>43444

>printf(c);


Сам-то как думаешь?
sage 316 1243474
>>43444
Гондон, съеби.
317 1243476
>>43444

>крашится


А компилится, для начала, сынок?
318 1243490
Подскажите какой нибудь литературы c++ для ньюфага
319 1243500
>>43490

> c++


CPP for newfagots
320 1243661
В теории эта программа https://ideone.com/gBSvuQ должна выводить количество слов определенной длины, на практике ничего не работает, что я делаю не так?
321 1243679
>>43661
приоритет у != выше чем у =
322 1243683
>>43679
Даже, если пофиксить эту ошибку, у него не будет это нормально работать. У него не будет считаться последнее слово в файле, но с этой ошибкой пусть он уже сам разбирается, она довольно тривиальна.
323 1243695
>>43679
Если честно, не понял как это должно помочь
324 1243701
>>43695
while((c = getchar()) != EOF){
325 1243704
>>43701
Но это все равно говнокод и тебе придется этот блок еще раз переделывать, потому-что у тебя не будет считаться последнее слово.
326 1243934
Аноны, какие есть способы организации динамических библиотек?
На винде есть dll файлы, а мне бы что нибудь похожее, только кросс платформенное.
Допустим, я написал в таком модуле некие функции, структуры и т.д., в общем модуль с некоей функциональностью.
Потом где-то отдельно, скомпилировал сишный код этого модуля в такую вот библиотеку, и могу ее смело подключать к основной программе, чтобы в ней появилось нужная мне функциональность.
Чтобы почитать по этой теме? Интересует как сам формат таких библиотек, так и механизм компиляции и их подключения.
Интересно было бы взглянуть на какие нибудь уже существующие реализации, если таковые есть.
Хотя я бы предпочел пилить свой велосипед, так интереснее + я в этом гарантированно разберусь.
sage 327 1243935
>>43934

> а мне бы что нибудь похожее, только кросс платформенное


Оберни dlopen/LoadLibrary, оберни dlsym/GetProcAddress и не выделывайся попусту. Не стоит оно того, особенно если ты кроссплатформенно хочешь, лол.

> Чтобы почитать по этой теме?


John Levine "Linkers and Loaders"

> Интересует как сам формат таких библиотек


Ты же велосипед собрался пилить. Как положишь, так и будет. Тебе понадобится положить: код, данные, имена экспортов-импортов, позиции в коде, куда они указывают (вместе с именами называется "символы"), позиции в коде, которые зависят от адреса, по которому код загружен и способы эти позиции пропатчить (вместе с адресами называется "поправки"). И вот тут ты начинаешь сосать с кроссплатформенностью еще больше, потому что на некоторых архитектурах количество типов поправок исчисляется десятками.

> механизм компиляции


Ну ты такой короч пишешь ld-скрипт или каштомный линкер.

> их подключения


mmap/VirtualAlloc + mprotect/VirtualProtect
328 1243968
>>43934

> кросс платформенное.


В Qt есть система плагинов.
329 1244040
Сап, написал всякой хрени, которая предосиавляет интерфейс malloc/free, но перед free зануляет область памяти.
Смотрю, а в тырнете пишут, что всякие линухи зануляют страницы сами после использования чтобы приложения не шарились у друг друга в куче.
А где-то пишут, что недостаточно секьюрно/опция в таком-то дистре отключена из-за перформанса.
Короче, кто ведает состоянием page zeroing'а на современных никсах? Когда, где, при каких условиях?
330 1244321
Алсо, хорошо бы иметь имя функции с ГНУтым компилятором как строковый литерал, а не как указатель __func__.
331 1244378
>>43934
Гугли autotools
Пишешь обычные библиотеки, через autotools делаешь кроссплатформенный configure файл, который потом генерирует makefile под нужную платформу.
332 1244381
>>44378

>autotools


Говно, лучше сразу в маке писать
333 1244571
>>31397 (OP)
Как написан язык си ? На каком языке ? Мб есть сурс код у кого ? Буду благодарен просто интересно, мб в будущем доделаю язык и сделаю нормальный импортинг файлов лол
335 1244576
>>44571
Ебанутый, С - это как русский, оба языка и не могут быть как то написаны в стиле программы, есть компиляторы С, вот их много, из маленьких которые можно смотреть выбирай PCC или TCC, ссылку на последний тебе дали.
337 1244583
>>44573
А сам язык кде ?
338 1244585
>>44583
Просто иди нахуй.
339 1244602
Посоветуйте исходников socks5 UDP клиента. UDP Associate.
Моя реализация работает криво.
sage 340 1244604
>>44577
Он вроде не совсем про то. Он про то, должно ли ядро обнулять страницы перед передачей их чужому процессу. Должно, обнуляет.
341 1244623
>>44604
Он же изначально просто затереть хотел память.

>Должно, обнуляет.


Можно скомпилировать чтоб не обнуляло. вроде есть опция, мне лень искать
342 1244625
>>44577
Спасибо.
>>44604
Почитаю энивэй.
>>44623
PG_ZERO, походу, по дефолту в конфиге не отображается. Наверное, надо эмбеддед врубить.
Правда, эта опция тоже не совсем то, она отвечает за произвольный зероинг в состоянии idle.
Можно нагуглить коммит стрекозаБДСМ из 2016 за подробностями
343 1244627
>>44577
А ещё в этой статье не очень изящное решение.
в gcc нет memset_s, но можно сделать указатель на функцию с сигнатурой мемсет, но только у указателя на память volatile добавить. И вызывать мемсет_с
344 1244629
Какими менеджерами пакетов пользуетесь для Си?
345 1244631
>>44629
Напоминаю, что это смешная шутка, но её надо шутить к крестотреде, когда им networking ещё к файловой системе добавят
346 1244641
>>44631
Не, я не шучу. Просто тупой. На Си не нужен менеджер, потому что всё пишут с нуля, не считая стандартных библиотек?
347 1244643
>>44641
Пакетный менеджер можно организовать везде, не часть языка.
Вообще, доской ошибся.
348 1244644
>>44643
Ответа так и нет. Я не про пакетный менеджер для себя, а про базу готовых библиотек.
349 1244647
>>44644
Качай линух, ставь себе что хочешь любым пакетным менеджером.
Писец, нюфаги поехали из-за сраных Го с Питоном и интересуются , почему в языке нет пакменов. Я в шоке.
350 1244665
>>44647
Ты опять не понял. При чём здесь пакетный менеджер линукса? Это не централизованное хранилище библиотек для Си. Да, с помощью него можно управлять исходниками, формировать свои пакеты, но это всё нужно делать самому. А я про централизованное хранилище, чтобы ставить и обновлять библиотеки, а не копировать их самому откуда-то вручную и самому следить за версиями.
351 1244668
>>44665
Попробую пояснить в другом ключе.
Библиотеки для нас - не перчатки, мы их не меняем по сто раз в неделю, а вся работа с библиотекой не сводится для нас в import os.
Так яснее?
352 1244675
>>44668

>Так яснее?


Да, извините за срач.
353 1244681
>>44629
apt-get
354 1244685
>>41577
А как это вообще можно реализовать? Чтоб прям
func(1)(2)(3)(4)
355 1244731
>>44685
mov ecx,[esp]
mov eax,[ecx-4]
add eax,ecx
ret
356 1244733
>>44731
Тредом ошибся?
357 1244748
uint8_t call_me(){
uint8_t
ret = __builtin_return_address(0);
ret=(uint32_t)(ret-4)+ret;
return ret;
}

int main(){
printf("%p %p\n",call_me(),(void*)call_me);
return 0;
}
359 1244755
>>44750
% gcc main.c -m64 -o main
% ./main
0xc4 0x56344a315139
360 1244760
>>44755
gcc -O0 main.c
./a.out
0x55b6568a0139 0x55b5568a0139
361 1244762
Что ты вообще творишь? Указатель я знаю как вернуть, тут магии не надо, можно просто

typedef void (*fnptr)();
fnptr foo(void) {
return (fnptr)foo;
}

Я хочу именно возвращаемый тип тот же.
362 1244824
>>44583
Сам язык не написан, он существует в голове у людей. Другой анон привел аналогию, си это как русский. Ты можешь написать программу которая умеет писать на Си, читать Си, исполнять Си, но ты не можешь написать Си.
363 1244826
>>44824
То есть можно написать Си на человеческом, то есть типа доки написать, стандарты там, но это не совсем Си.
364 1244827
Язык си это компилятор языка си.
365 1244831
Как в mingw-w64 подключить стороннюю библиотеку?
Может быть в gcc ключ есть какой?
366 1244870
>>44831

> в gcc ключ есть


Почему он такой странный?
-I и без пробела указывать путь?
Можно как-то проще? Если положить в одну директорию с gcc.exe, то пойдет?
367 1244872
>>44831
Какую стороннюю библиотеку, для начала?

Проще скинуть в корневой каталог main.c и подключить: в самом .c файле (если прога только из него и состоит) или в файле-заголовке .h.

Должно само подтянуться без всяких параметров.
368 1244874
>>44872
cs50.h

> Проще скинуть в корневой каталог main.c и подключить: в самом .c файле


Пробовал, не получилось.
369 1244879
>>44874

>cs50.h


https://github.com/cs50/libcs50
Должно помочь добавление параметра -lcs50 к линкеру.
Чтобы не возиться с путями - пусть лежит там же - в корне проекта.
372 1244887
>>44885

> Note the use of quotes instead of angled brackets.



Сработало, но теперь это:

> undefined reference to `GetString'


> collect2.exe: error: ld returned 1 exit status

373 1244890
>>44887
Всё, решилось вот этим:
https://cs50.stackexchange.com/a/16616
374 1244892
375 1244932
>>44665

>Это не централизованное хранилище библиотек для Си.



Репы линуксовых дистров централизованные. Там могут храниться библиотеки не только для одного языка программирования, но это сишникам не мешает.
376 1244998
>>31675
Твоё недоумение понятно. Это когда ты под писи на линуксе, например, пишешь у тебя printf в любом случае выводит текст, даже если ты перенос строки (\n) не поставил в конце и читать о таких вещах в книге крайне удивительно, потому что такое поведение воспринимается даже совсем новчиками либо как нечто нелогичное, либо как какой-то атавизм, тем более после того, как выясняется, что и без переноса строки всё прекрасно выводится. А я вот однако умудрился столкнуться с этой хуйнёй когда реализовал weak-linked функции _read и _write (через которые работает io), чтобы сделать маленький интерактивный шелл для микроконтроллера по uart'у. И тогда поведение printf'а и всяких putchar меня удивило, потому что я через них выводил строчки начиная с символа новой строки, а не заканчивая им, то есть как printf("\nstring"), а не printf("string\n") - в конце концов нужно же было как-то сделать вывод приглашения шелла, например. В результате строка начинавшаяся с символа новой строки выводилась только после того, как выполнялась строчка кода, выводящая другую строку. В тексте на скриншотах объясняют природу этого феномена через разъяснение механики работы ввода-вывода - наличия буфера.

>>31686
roll
377 1245071
Как получить список запущенных процессов?
inb4 popen("ps -x", "r")
sage 379 1245191
>>44831
С -I указываешь путь к директории с заголовочниками либы, с -L - путь к директории, где лежиь либа (libимя.a), c -lимя поключаешь библиотеку (или -lимя.a, если имя не соответствует стандарту). Класть свое говно в директории установленного гцц категорически не рекомендуется. Чтобы не писать каждый раз все это руками, делаешь мэйкфайл.

>>45071

> Как получить список запущенных процессов?


Прогулкой по procfs (/proc).

>>45086
Нинужно. Переход с одной версии либы на другую должен быть взвешенным и осознанным решением.
380 1245198
>>45191

>Прогулкой по procfs (/proc).


Это только на линуксах.

>As of February 2011, procfs is gradually becoming phased out in FreeBSD.[1] It was removed from OpenBSD in version 5.7, which was released in May 2015, because it "always suffered from race conditions and is now unused".[2]

381 1245205
>>45198
В винде есть Toolhelp-функции и NtQuerySystemInformation в API, есть dbghelp.dll, можно даже парсить PEB, если нужна дополнительная информация о процессах. Очевидно, что кроссплатформенно такие вещи не делаются.

> procfs is gradually becoming phased out in FreeBSD


Сочувствую.
382 1245226
Что за хуйня https://learnc.info/c/opaque_pointers.html
In file included from F:\Documents\workspace\test\src\sec.c:2:
F:\Documents\workspace\test\src/header.h:25:12: warning: unused function 'checkDepth' [-Wunused-function]
static int checkDepth(unsigned);
^
F:\Documents\workspace\test\src/header.h:26:12: warning: unused function 'checkHeight' [-Wunused-function]
static int checkHeight(unsigned);
^
F:\Documents\workspace\test\src/header.h:27:12: warning: unused function 'checkWidth' [-Wunused-function]
static int checkWidth(unsigned);
^
3 warnings generated.
sec-7987a8.o : error LNK2019: ссылка на неразрешенный внешний символ createBox в функции main
sec-7987a8.o : error LNK2019: ссылка на неразрешенный внешний символ getVolume в функции main
sec-7987a8.o : error LNK2019: ссылка на неразрешенный внешний символ setWidth в функции main
F:\Documents\workspace\test/bin/sec.exe : fatal error LNK1120: неразрешенных внешних элементов: 3
clang.exe: error: linker command failed with exit code 1120 (use -v to see invocation)
[Finished in 0.3s]
как так то, функцию креэйт добавил, не могу никак понять что за гавно? {ули он не видит, компилю шлангом, да и гцц ту же ересь несет. Бля они тупо не видят Box.c, как так то блять?
383 1245229
>>45226
Покажи командную строку, как собираешь; убери ключевое слово static из .h - единственные static-функции, которые имеет смысл класть в .h - это static inline. Ну и скорее всего, ты при сборке указываешь один .c файл, но не указываешь второй.
384 1245230
>>45226
Ладно, я еблан, надо было в сублайме изменить параметры компиляции или мейкфайлом делать.
Будут ли косяки если я буду включать все сурсы в параметре компилятора? даже не относящиеся к программе, компилятор их заигнорит?
385 1245231
>>45230

> Будут ли косяки если я буду включать все сурсы в параметре компилятора?


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

Лучше просто сделай мэйкфайл, саблайм в них отлично может.
386 1245236
>>45226
>>45229

>убери ключевое слово static из .h


вот не понимаю, убираю я статик, а почему все ровно не могу обращаться к чек функциям из main? они же ничем не отличаются от геттеров и сеттеров. Или я уже в глаза долблюсь?
387 1245239
>>45236
и почему компилятор ругается когда стоит статик в заголовочном?
Box.h:26:12: warning: unused function 'checkDepth' [-Wunused-function]
388 1245251
>>45236

> а почему все ровно не могу обращаться к чек функциям


Значит не убрал статики, не перекомпилировал box.c или еще что-то, нам-то откуда знать, что ты там написал и как собираешь?

>>45239

> Box.h:26:12: warning: unused function 'checkDepth' [-Wunused-function]


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

Как сделать правильно, а не как в статье: если checkXXX не нужны вне box.c, удаляешь их объявления из box.h нахуй и кладешь их в начало box.c. Или удаляешь объявления вообще и кладешь определения (тела) в начало box.с, добавляя к ним static (часто именно так и делают, если нет перекрестных зависимостей между функциями). Если check нужны вне box.c, тогда просто удаляешь ключевые слова static из box.h, и функции станут доступны из любого файла.
389 1245979
Двач есть проблема, линкер не видет printf.
Turbo C++ Version 3.00
https://pastebin.com/8AD21GEP

Turbo Link 5.0
Error: Undefined symbol _PRINTF in module MAIN.CPP

Компилирую:
TC\TCC.EXE -ID:\TEST\INCLUDE -LD:\TEST\LIB -c -oMAIN.OBJ -ml MAIN.CPP
TC\TCC.EXE -ID:\TEST\INCLUDE -LD:\TEST\LIB -c -oTEST.OBJ -ml TEST.CPP
TC\TLINK.EXE -i TEST.OBJ MAIN.OBJ, MAIN.EXE
В чём может быть проблема?
390 1245985
>>45979
Разобрался сам
sage 391 1245991
>>45985

> Разобрался сам


А нам рассказать?
392 1245995
>>36610
Да, с avx я долго ебался, чтоб всё красиво было.
Вроде работает.
393 1246048
Не могу разобраться с массивами. В книге написано: в С вызываемая
функция не может модифицировать переменные в вызывающей функции

Но к примеру тут https://ideone.com/f4VZYD она же модифицирует. Или я чего то не понимаю?
394 1246052
Какие есть инструменты анализа кода и построения структуры программы ?
Про Doxygen вычитал:
Doxygen генерирует документацию на основе набора исходных текстов и также может быть настроен для извлечения структуры программы из недокументированных исходных кодов. Возможно составление графов зависимостей программных объектов, диаграмм классов и исходных кодов с гиперссылками.
Есть ли еще инструменты с таким функционалом?
395 1246072
>>31397 (OP)
Ананасы, а как используя аргумент exceptfds (четвертый аргумент) в системном вызове select() получить собственно тип исключения? Это вообще возможно или нужно всё переделать на poll() и смотреть на возвращаемые биты в revents структуры дескриптора struct pollfd?
396 1246079
>>46072
Да, юзай poll()
397 1246084
>>46048

>https://ideone.com/f4VZYD


Здесь функция модифицирует память, на которую указывает переменная, а не сам указатель (который собственно был передан функции).
Но в общем твое непонимание понятно: в книге имеется в виду, что в вызываемую функцию передаются копии параметров. Т.е. передавая в функцию указатель на память, вызываемая функция может использовать этот указатель как угодно, в том числе модифицировать память, на которую он указывает, но вот само значение указателя (т.е. адрес масива) остается таким же в вызывающей функции, что бы ты не делал.
398 1246086
>>46079
Вот блять, спасибо
sage 399 1246276
>>46052

> Есть ли еще инструменты с таким функционалом?


Source Insight.
400 1246351
Да блядь, какое нахуй деление по модулю нахуй!
Анонче, пихаем шорт или что том у нас двухбайное в чар, какая половина будет в чаре? Старшая или младшя?
Я слишком тупой чтобы обясните мне в бинарном коде.
sage 401 1246362
>>46351
Младшая. А чего ты в модуле понять не можешь? Это просто такой способ сказать "старшие биты выбрасываются". Представим, что у тебя не двоичные разряды, а десятичные, и у тебя есть 12345678, из которого тебе надо 4 разряда - старшие разряды ты отбрасываешь. Можешь это выразить как: 12345678 % 104 = 12345678 % 10000 = 5678. То же самое с битами: есть 16-битное xxxxxxxxyyyyyyyy, тебе нужно впихнуть его в 8 бит, и ты выбрасываешь старшие разряды. Можешь это записать как xxxxxxxxyyyyyyyy % 28 = xxxxxxxxyyyyyyyy % 256 = yyyyyyyy.
402 1246367
>>46362

>старшие биты выбрасываются


Вот оно.
Не ну ахуеть, вот деление по модулю нахуй понятнее да. Шутники блядь.
403 1246539
>>46367
Без него жизни нет
404 1246622
>>46362
Чет лафхак какойто, всегда биты маской выбивались, а тут по модулю, фу
sage 405 1246791
>>46622
Наоборот сдвиги и маска - это лайфхаки для деления и остатка для частного случая в виде степеней двойки.
406 1246870
>>46791
Так компилятор все равно деление сдвигами и масками делает.
407 1247031
Где посоветуете лучше всего почитать о точках следования? В общих чертах слышал звон, да вот углубиться надобно в это всё.
408 1247145
Порекомендуйте свободные программы на Си с наиболее качественным, на ваш взгляд, кодом. Кроме ядер операционных систем и игр.
409 1247161
>>47145
SpiderMonkey
410 1247178
>>47161
https://github.com/ricardoquesada/Spidermonkey
Это? Там Си очень мало.
411 1247194
>>47178
версия 1.8 последняя на Си
412 1247244
>>47194
Нет, там столько же сишного кода в процентах.
 .PNG27 Кб, 590x370
413 1247292
Зачем в этом примере переменной fahr задали тип float, хотя логичнее было бы оставить int?
414 1247318
>>47292
раздели 5 на 9 в инте и посмотри что получится)
А вычисление выражения идет слева направо
415 1247321
>>47318

> раздели 5 на 9 в инте


0 должен получиться, но fahr-то каким боком там?
416 1247322
>>47292
я чето не о том подумал и про порядок вычисления написал.
Куда бы ты не воткнул 5/9 в инте - компилятор рассчитает эту константу во время компиляции и воткнет 0. Что в начале выражения, что в конце
 .PNG11 Кб, 545x177
417 1247323
>>47321
Во втором примере, кстати, они оставили fahr в int.
418 1247343
>>47292
Инт целое, флоат с плавающей точкой. 5 разделив на 9 ты не получаешь целое. Ну и уж если совсем доебаться, то константой а заодно и мелкой оптимизацией запись float fahr = 0x3f000000; лучше оставить, а коммент добавить что это за константа.
419 1247344

> Упражнение 1.6. Проверьте, что выражение getchar () ! = EOF действительно равно


1 или 0.
Как? У меня только 1 выводит.
Упражнение 1.7. Напишите программу для вывода значения константы EOF.
Как? У меня -1 получается.
>>47343

> 5 разделив на 9 ты не получаешь целое


Согласен, поэтому и нужно celsius в float, а почему fahr в int не оставили?
420 1247349
На второй картинке ведь красивее получается.
Всё ещё не понимаю, почему они двум переменным сменили тип на float.
421 1247352
>>47292
>>47349
Просто очепятка, не парься, изменив fahr с флота на ин-т ничего не изменится.
422 1247353
>>47344
if((getchar() != EOF) == 0)
printf("0");
Аналогично для 1.

EOF и должен == -1.
423 1247354
>>47353

> if((getchar() != EOF) == 0)


> printf("0");


А что мне вводить нужно, чтобы 0 был?
424 1247356
>>47352
Изменится, тогда всё выглядит няшнее, если смотреть на типы. Они только в одной строчке получаются разные, а в остальных одинаковые.
425 1247358
>>47354
Если под виндой сидишь, то ctrl + z, если под линуксом - Ctrl+D. Либо ещё перенаправление потока ввода с фала можно сделать и по итогу 0 выдаст.
sage 426 1247391
>>47031
Прямо в стандарте в Annex C есть прямо списком.

>>47349
С float будет меньше преобразований int/float на каждом шаге цикла. Еще с float можно задать шаг в 0.5 - для такой таблички вполне естественное решение.
427 1247394
>>47391

> С float будет меньше преобразований int/float на каждом шаге цикла.


Наоборот ведь, смотри маленькие синие буковки.
Я поэтому и задал вопрос.
sage 428 1247396
>>47394
В глаза ебусь. В общем, я думал, что там вcему float выставили: в том числе и lower/upper/step.
sage 430 1247984
>>47979

> смэллтэлк

431 1248059
>>31686
roll.
432 1248163
>>31397 (OP)

>Тред, посвященный прародителю всех С-подобных языков


Алголу чтоле?
433 1248175
>>48163
А то, и по ФОРТРАНУ.
434 1248176
>>39787

>VLA


> while we continue to work to remove all VLAs in the kernel: of the ~115 cases found in v4.16, after the v4.19 merge window we should be down to about 13 remaining, most of them in crypto code, all of which have patches under review


https://www.phoronix.com/scan.php?page=news_item&px=Linux-4.19-STACKLEAK-GCC
Но почему
435 1248232
25 лвл, долбоеб, есть вышка "инф. и выч. тех.". Какие шансы на успех вкатывания по-вашему?
436 1248270
>>48232

> 25 лвл, долбоеб


100% будешь вкатываться
437 1248271
>>48270
по че му?
438 1248323
Есть ли готовые функции strtod() и atof(), которые не зависят от локали?
Если нет, то как вы в таком случае поступаете, тупо меняете локаль на англоязычную?
sage 439 1248352
>>48176

> Но почему


Потому что ты заранее знаешь, сколько памяти на стеке ты можешь позволить себе выделить (и тогда просто выделяешь массив фиксированного размера), либо ты не знаешь, поэтому не ограничиваешь максимальный размер массива, рано или поздно пытаешься выделить много и получаешь переполнение стека. Вывод: VLA нинужны.

>>48323

> готовые функции strtod() и atof(), которые не зависят от локали


Есть. strtod() и atof(). При старте у тебя локаль "C", где разделитель - точка. Если меняешь локаль и не хочешь локальные разделители (или файл парсишь, например) - выставь LC_NUMERIC в "C", потом вернешь.
440 1248397
>>31397 (OP)
Как парсить простой ini файл?
[SectionName]
keyName=value


[SectionName]
keyName=value


и т.д.
sage 441 1248399
>>48397
Читаешь построчно, опционально убираешь из начала и конца прочитанной строки все isspace(). Если строчка пуста или начинается с ; - пропускаешь. Если строчка начинается с [ - читаешь и запоминаешь имя текущей секции, проверяешь, что после ] нет мусора. Иначе ищешь первый =, читаешь до = имя параметра, после - значение. Что ты дальше с этим будешь делать - дело твое. Можешь в словарик сложить, можешь сразу применять, можешь на каждый ini_get("section", "key") парсить заново в поисках сначала нужной секции, а потом нужного параметра в секции.
твой кэп
442 1248517
>>48232

>25лвл


Слишком старый для IT в целом.
sage 443 1248577
>>48517
Лол, это если на жс писать, где каждую неделю новый фреймворк, а для Си и 35 норм.
444 1248655
>>39787

>в C99 и выше есть VLA


Про "и выше" надо бы поаккуратнее.

> Variable length arrays are a conditional feature that implementations need not support; see 6.10.8.3.)


https://port70.net/~nsz/c/c11/n1570.html#6.7.6.2p4
445 1248665
sage 447 1248825
>>48655
По факту оно есть. Так же как и типы из stdint.h, например, которые тоже optional.
449 1249235
Я вообще правильно понимаю, что от меня хотят или нет?

> Упражнение 1.9. Напишите программу для копирования входного потока в выходной с


заменой каждой строки, состоящей из одного или нескольких пробелов, одним пробелом.
https://pastebin.com/0eEVzG3k

> Упражнение 1.10. Напишите программу для копирования входного потока в выходной с заменой знаков табуляции на \t, символов возврата назад (Backspace) на \b, а обратных косых черт — на \ \. Это сделает табуляции и символы возврата легко читаемыми в потоке.


https://pastebin.com/iLgcxjF5
450 1249341
>>49235

> Пробелы.


Нет, неправильно. Имеется в виду, что для файла типа:
foo
...
...bar
(точки - пробелы) ты должен вывести:
foo
.
...bar
А та программа, что написал ты, абсолютно ничего не делает. Вторая вроде ок.
451 1249405
>>49341
Сложно что-то.
Ну и как такое сделать?
452 1249412
>>49405
Считаешь пробелы, пока не встретишь не-пробел. Если встретил конец строки - выводишь один пробел и конец строки. Если встретил что-то еще - выводишь столько пробелов, сколько насчитал, выводишь встреченный символ, выводишь символы до конца строки включительно. Идешь на следующую итерацию.
453 1249576
>>49341
Посмотрел парочку решений отсюда:
https://clc-wiki.net/wiki/K&R2_solutions:Chapter_1:Exercise_9
Они немного другое делают, ведь у них получается вместо

> foo


> .


> ...bar


foo
.
.bar
sage 454 1249583
>>49576
Ну там не line, а string, так что это, видимо, переводопроблемы. Требуется схлапывать последовательности из нескольких пробелов в один: foo...............bar -> foo.bar. В целом суть та же, просто чуть меньше условий.
455 1249691
Как же больно писать жирные неуклюжие функции и не уметь разбивать задачу на подзадачи.
456 1250013
>>48825

>типы из stdint.h, например, которые тоже optional.


optional бывает разный, лол

> These types are optional. However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two's complement representation, it shall define the corresponding typedef names.


https://port70.net/~nsz/c/c11/n1570.html#7.20.1.1p3

Так что stdint.h фактически не optional. Или ты много платформ знаешь, которые не попадают под эти условия?
457 1250014
>>50013
Хотел подчеркнуть, вместо этого зачеркнул.
458 1251152
Есть большой набор чисел, который один раз были посчитаны при запуске программы, а теперь их нужно использовать, не вычисляя повторно. Допустим, 100 мегабайт данных.

Но проблема в том, что процессов может быть очень много, которые эти данные будут использовать. И если 100 процессов загрузят себе по 100 мегабайт чисел, это это уже 10 гигов.

Можно каким-то образом реализовать расшаренную область памяти? Или это достигается только инжектом с чтением памяти чужого процесса?

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

Алсо, пока что не придумал, как эти данные перенести собственно в код. Сейчас они прямо там и вычисляются, но если их билдить с экзешником, то это 100 мегабайт экзешник получается - пиздец какой-то.
459 1251166
>>51152

> Можно каким-то образом реализовать расшаренную область памяти


Можно. mmap с MAP_SHARED, shm_open(), все дела. А вообще, ты уверен, что тебе нужны отдельные процессы, а не потоки?
460 1251169
>>31397 (OP)
300к коллизий на миллион элементов, это нормальный показатель для хеш функции?
461 1251173
>>51166

>Можно. mmap с MAP_SHARED, shm_open(), все дела.


Получится иметь во всех процессах указатели на переменные в этой памяти? Это вот прям так работает из коробки? При этом все процессы всегда будут читать не_с_диска?

>А вообще, ты уверен, что тебе нужны отдельные процессы, а не потоки?


Да, хотя я и не уверен, почему именно. Я пишу статическую либу, а параллелиться это будет на уровень выше, там другие люди решения принимают.
462 1251175
>>51173
Да, забыл сказать, что скорость очень критична.
463 1251178
>>51173
Ёпта, есть ещё такая штука как COW.
По сути, даже если ты не будешь явно задавать shared-область, ядро навряд ли будет делать дубликаты, пока ты не испачкаешь страницы.
Да, оно реально будет работать так, как тебе тот анон показал.
464 1251179
>>51169
Каждый третий элемент коллизия, примерно, ну не знаю даже.
465 1251182
>>51179
Он там CRC-4 изобрёл?
>>51169

> 2^1 time complexity


Да ето точно вин.
466 1251195
>>51182
>>51179
И сколько должно быть?
467 1251199
>>51195
Я не могу сказать Тебе, чего Ты хочешь.
0
468 1251204
>>51199
Такого быть не может.
469 1251216
>>51195
Ну очевидно же, что у идеальной функции будет 1 коллизия на 2n элементов, где n - количество бит в хэше.
470 1251218
>>51166
Набросал прототип. Да, действительно всё работает так, как мне надо. Спасибо.

Правда, shm_open() по имени как-то смутил, несерьезно что ли это, мало ли какой конфликт.

Алсо, насколько неудобно будет портировать это под винду? Может и не понадобится, но я не уверен, что смогу обойтись никсами.
471 1251278
>>51218

> мало ли какой конфликт


mkstemp()

> насколько неудобно будет портировать это под винду


Это базовая возможность всех более-менее полноценных ОС. CreateFileMapping (именованный)/MapViewOfFile.
472 1251291
>>51216
Тем не менее, криптографы обычно ожидают коллизию уже среди 2^(n/2) элементов (парадокс о задаче о днях рождения).
473 1252376
Скажите, а в C есть раздельная компиляция? Ну там, хедеры отдельно, а отдельно реализация функций, как в плюсах?
474 1252379
>>52376
К сожалению, хедеры в плюсы как раз из Си и пришли. У современных посонов модули, а мы все еще текст препроцессором копипастим.
475 1252561
Пытаюсь исполнять машинный код при помощи апишного VirtualAlloc значит... Но почему-то оно выдает exception на то, что я пытаюсь лезть в защищенные области памяти. Как это объяснить?
https://ideone.com/ZtKovP
476 1252563
>>52379

>У современных посонов модули


Почему эти крестоносцы модули не накатят? Они же все из себя такие ПРОДВИНУТЫЕ
477 1252613
>>52561
Ну вот ты вызвал свою функцию, исполнил два нопа, а дальше? А дальше, после нопов, у тебя в выделенной тобой странице памяти идут нули. А нули эти - add[rax],al. А в rax тебя что? Говно какое-нибудь. Вот оно и падает. Что оно должно делать дальше? Как оно вернется, чтобы выполнять вот эти твои виртуалфри? Алсо, тебе в >>1216107 (OP), а не сюда.

>>52563
Они почти накатили уже, и они как-то буэ. Как бы нам тоже не завезли под шумок в C21.
478 1252617
>>52613

>исполнил два нопа, а дальше?


Я же выделил память только под два байта, то есть sizeof(code). Почему оно исполняется дальше?
479 1252626
>>52379
Можно для танкиста, кто эти современные посоны, что у них за модули и чем плоха препроцессорная подстановка?
480 1252641
>>52617
Потому что процессор исполняет инструкции одну за другой (если они не какой-то сорт бранча), и ему похуй, сколько ты там скопировал. А выделить меньше, чем страницу ты тоже не можешь. Вот и получается, у тебя либо access violation, потому что нули - это mov, пишущий куда-то не туда, либо access violation, потому что после страницы ничего нету. В общем, прочитай про ассемблер что-нибудь, про вызов функций, все такое.
481 1252648
>>52626
Подстановка всем плоха, она замедляет компиляцию и затрудняет автоматический анализ исходников. Заодно хедеры заставляют тебя при изменении сигнатуры функции править ее в двух местах. В лучшем мире компилятор автоматически брал бы сигнатуру из объектника, если мы распространяем собранные либы, либо из исходника, если исходники доступны.

Современные посоны - это программисты на скриптовых языках, где такого говна нет, а скоро и программисты на крестах: https://medium.com/@wrongway4you/brief-article-on-c-modules-f58287a6c64 (первый результат из гугла, ты мог бы и сам найти!).
482 1252652
>>52648

>править ее в двух местах


ой бля, как тяжело, а давайте запилим йобу поверх йобы, чтобы оно само делалось
483 1252656
>>52652
Ой бля, как просто переносить код на новую архитектуру, давайте продолжим пилить юниксы на ассемблере.
4to.jpg103 Кб, 1600x1200
484 1252659
>>52648

>https://medium.com/@wrongway4you/brief-article-on-c-modules-f58287a6c64



А по запросу какому? С++ modules?
Я правда не догоняю, о чем вообще речь идет.
Короче, это вещь нужная и ее стоит изучить и юзать, так?
sage 485 1252660
>>52659
Стандарт еще не вышел, можешь пока погодить. Но там уже черновик вылизывают, так что скоро. Опять мы кресты в треде про няшную обсуждаем. Ну что ж такое-то!
486 1252664
>>52659
НЕТ СИ ТОЛЬКО СИ ТОЛЬКО ХЕДЕРЫ ТОЛЬКО ЭТО ГРОЗНЫЙ В ОГНЕ НО ТЫ ДЕРЖИСЬ БРАТОК
487 1252713
>>52656

>переносить код на новую архитектуру,


Кого ты там переносить собрался? Никогда проблем не было, но тут вкатились смузихлебы
488 1252715
>>52664

>ХЕДЕРЫ


ТОЛЬКО ЮНИТИ БИЛД, КАКАЯ НАХРЕН РАЗДЕЛЬНАЯ КОМПИЛЯЦИЯ
БЕСПЛАТНЫЙ ЛТО ЭТО ВЕЩЬ!
489 1252890
>>52715

> ЛТО


Что это???
sage 490 1253105
>>52890
Link-time optimizations. Компилятор генерит аннотированный байткод, а линкер схлапывает все объектники, после чего уже генерит машинный код. Это позволяет выкидывать неиспользуемые функции, инлайнить часто вызываемые функции, даже если они не были объявлены как static inline, мержить функции с одинаковым телом и много чего еще. В гцц включается флагом -flto, в студии это называется link-time code generation и включается -GL.
491 1253315
Branch prediction теперь больше не актуален из-за meltdown/spectre?
15353314163702.jpg29 Кб, 960x642
492 1253425
Может ктонибуть набросать простой пример как юзать pcre2_substitute?
Примеров в нете чет толком не могу найти, либо очень запутанный код, а я в Си не так давно, перловые регулярки знаю хорошо, но вот въезжание в api libpcre2 дается с очень большим трудом.
Буду благодарен если покажите как char *subject = "test1 test2 test2", с помощью pcre2_substitute, заменить регуляркой "s/(test)2$/\13/"
493 1253469
>>53425
https://www.pcre.org/current/doc/html/pcre2demo.html

тут вон под конец есть. Какая-то сложная ебола этот PCRE, но, видимо, лучшее, что есть для С.
228.png11 Кб, 433x314
494 1253629
Господа, пишу в Geany следующее и получаю пустой .dat файл, рассчитывая на набор координат для графика. Где я долбоёб?
#include <stdio.h>
#include <math.h>
int main() {
FILE*f;
double a,b,st,x,y,y8=1./0.;
int i,n;
f=fopen("02hyp.dat","w");
a=-1.; b=1.; n=301;
st=(b-a)/(n-1); x=a-st;
for (i=0; i<0; i++) {
x+=st; y=1./x; if (fabs(y)>100.) y=y8;
fprintf(f,"%lf %lf\n",x,y);
}
fclose(f);
return(0);
}
495 1253633
>>53629
помимо того, что криво вставил текст
496 1253639
>>53629
Отделяй операторы пробелом, не делай слишком много инициализаций в одну строчку.
Для бинарной записи открывай файл как '"wb".

Почему у тебя не работает - не разбирался.
497 1253667
>>53629
ап (спасите, гнуплот кормить нечем)
498 1253669
>>53469

> pcre2_substitute


> https://www.pcre.org/current/doc/html/pcre2demo.html



Так в томто и дело что pcre2_substitute там в демо нет, поэтому и прошу чтоб анон помог, с простым примером
499 1253677
>>53629
По виду должно работать. Посмотри, может fopen не сработал. Может, ты вообще не в той папке смотришь?
500 1253681
>>53677
Возвращает 0, создаётся файл .dat в нужной папке. Сам файл пустой. Гнуплот, логично, ругается. Пишу в Geany на шиндовс 10, компиллятор tdm-gcc
image.png49 Кб, 575x593
501 1253694
>>53629
У тебя цикл на 0 итераций, аутист.
502 1253698
>>53694
Благодарю. Деградировал малость, исправлюсь.
503 1253711
надо ли знать математику чтобы уметь в си/си++, чтобы устроится в nasa jpl ? или можно прорешать много алгоритмов?
504 1253718
>>53711
Смотря что ты имеешь ввиду под "знать математику".
505 1253722
>>53711
И смотря чем ты собираешься заниматься. Знакомый веб-дизайнер пользуется очень ограниченным набором мат. приёмов и знаний, хватает для фронт и бэк энда. А кто-то, как мой препод в институте, вообще говорит, что если человек не сдал матан - его нельзя подпускать к компу.
506 1253746
>>53722

>человек не сдал матан - его нельзя подпускать к ЭВМ


Прфиксил в стиле вузовских пердунов не могущих ни в то и не в другое
Тред утонул или удален.
Это копия, сохраненная 1 октября 2018 года.

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

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