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

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

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

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

Что читать:

- Классика от Отцов: 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 помогает читать сложные сишные декларации.

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

- №27: https://arhivach.cf/thread/325831/
- №28: https://arhivach.cf/thread/339326/
- №29: https://arhivach.cf/thread/347271/

Шапка: http://piratepad.net/bJ1SdmkZyu (иногда лежит)
2 1187525
>>1187520

>Слишком категорично



Ну, конкретно, в данном случае (JIT или загрузка исполняемого кода в память) именно логично сделать кучу асмовых реализаций int execute_code(pointer) в папке arch, чем писать кросплатформенную лапшу ифдефов в попытках наебать стандарт, вызвать через указатель на функцию, и все равно выстрелить себе в ногу.
3 1187787
>>187521 (OP)
друзья, не могу никак найти нормального гуида, как загрузить bitmap в 2мерный массив, как его потом обрабатывать, используя стандартные библиотеки. Подкиньте чего, позязя
4 1187791
>>187787

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


Никак
5 1187796
>>187791
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
какие тебе ище то надо
6 1187803
>>187787
Используй нестандартные. У всяких libjpeg и libpng вполне себе простой и понятный API.
7 1187806
>>187803
я понимаю, что нестандартными все гораздо проще, но задание так озвучено
8 1187812
>>187806
Значит читай в массив, и ваще что такое битмап? Если бмп всякие читай про формат файла и занимайся байтоеблей
9 1187835
>>187806
Ну тогда выбери себе какое-нибудь подмножество .tga без сжатия, и читай себе его. Там все просто и не нужно возиться с паддингом, как в .bmp. Читаешь заголовок, считаешь, сколько нужно памяти, выделяешь память, читаешь тело. Все. Разве что с 2D-массивом может выйти промашка, потому что размерности сишных массивов определяются при компиляции (если он не VLA).
10 1187914
Есть какие-то советы, как васянить псевдографические интерфейсы без сторонних либ?
11 1188017
>>187914
Это невозможно. Используй React Native. Qt не нужен.
sage 12 1188045
>>188017

>псевдографические интерфейсы


>React Native. Qt

13 1188112
>>187914
Написать свою либу.
Ты реально даже какой-нибудь ncurses не хочешь использовать?
14 1188128
>>188112
Да. Ну, желательно, без сторонних либ (помимо API операционки). Я вообще про общие принципы спрашивал скорее, потому как у меня кроме как функции в функции в функции (переход по менюшкам) ничего не выходит. Мб так и надо, конечно.
15 1188188
>>188128

>Да. Ну, желательно, без сторонних либ (помимо API операционки).



https://docs.microsoft.com/en-us/windows/console/console-functions

http://invisible-island.net/ncurses/man/ncurses.3x.html
16 1188235
>>188188
Да не в этом вопрос. Как эту хрень всю изнутри устроить. Под каждую менюшку свою функцию писать, отдельно обработку клавиш сделать, етц.
17 1188241
>>188235
Почитав документацию ncurses'а, ты получишь ответ на свой вопросы.
18 1188581
Платиновый вопрос: как скомпилировать K&R через GCC?
Ну или как вообще обходиться с K&R в современном мире?
Мне Прата очень не нравится, тонны текста.
Хочу начать с K&R и потом пойти по стандартам.
19 1188586
>>188581
Молча. Что конкретно у тебя не компилится?

> Мне Прата очень не нравится, тонны текста.


Зато после праты тебя ждет гораздо меньше удивительных открытий.
20 1188863
>>188581

>тонны текста.


А что должно быть?
image.png26 Кб, 861x271
21 1188867
Меня обманывают или нет? Вообще не могу понять, что имеет в виду автор статьи
22 1188919
>>188867
Вкратце: да, автор пиздит. На пике row-major, в Си нативно тоже row-major, менять местами индексы нинужно.

Короче, в математике опять не смогли между собой договориться, и есть две системы нумерации элементов матриц: row-major и column-major, они определяют, какой индекс указывать первым - строки или столбца соответственно. Проблемы с нотацией приводят к путанице и странным правилам при умножении матриц (хотя если абстрагироваться от индексов, оказывается, что все очень логично, и даже задумываться о порядке умножения незачем). А вот такие авторы статей, не понимая сути, еще добавляют путаницы. Алсо, автор пика пиздит, потому что даже в книжках по математике используются оба варианта, в зависимости от предпочтений их авторов. Но для начала тебе лучше просто забыть всю эту хуйню про строки и столбцы, и считать вместо этого, что матрица - просто вектор, содержащий векторы (просто список векторов, никакой магии). После этого нотация упростится до логичного vector-major: сначала ты указываешь индекс вектора, потом индекс его элемента, а уж как там в книжках эти векторы нарисованы - столбцами, строками или вообще в окружности вписаны, тебя ебать не должно.

К сожалению, элементы матрицы нужно хранить в одномерной компьютерной памяти. Если ты сделаешь struct vector { float x, y, z; }, то компоненты структуры в памяти будут лежать один за другим. Если сделаешь массив векторов struct vector m[4] и заполнишь это данными, то векторы в памяти будут идти один за другим (т.е., m[0].x, m[0].y, m[0].z, m[1].x, m[1].y и т. д.). Чтобы достать оттуда вектор, ты будешь делать m[​i​], а чтобы обратиться к элементу этого вектора - (m[​i​]).y допустим. Если ты вместо массива структур сделаешь массив массивов float m[4][3] (4 вектора по 3 элемента), то расположение элементов в памяти не изменится, не изменится и нотация: ты продолжишь сначала обращаться к вектору m[​i​], а потом к его элементу (m[​i​])[j], и если на бумажке или в книжке у тебя row-major, то нотация совпадет: m[​i​][j]. Это естественно и логично. Но осознай, что это лишь вопрос нотации: ты можешь взять column-major из книжки, писать столбцы в векторы и продолжать использовать m[​i​][j] или наоборот, ты можешь решить, что для каких-то вычислений хранить соответствующие компоненты векторов рядом, т.е., в column-major ({{x0, x1, x2}, {y0, y1, y2}, ...} удобнее и быстрее, и в этом случае нотация для обращения изменится на m[j][​i​].
22 1188919
>>188867
Вкратце: да, автор пиздит. На пике row-major, в Си нативно тоже row-major, менять местами индексы нинужно.

Короче, в математике опять не смогли между собой договориться, и есть две системы нумерации элементов матриц: row-major и column-major, они определяют, какой индекс указывать первым - строки или столбца соответственно. Проблемы с нотацией приводят к путанице и странным правилам при умножении матриц (хотя если абстрагироваться от индексов, оказывается, что все очень логично, и даже задумываться о порядке умножения незачем). А вот такие авторы статей, не понимая сути, еще добавляют путаницы. Алсо, автор пика пиздит, потому что даже в книжках по математике используются оба варианта, в зависимости от предпочтений их авторов. Но для начала тебе лучше просто забыть всю эту хуйню про строки и столбцы, и считать вместо этого, что матрица - просто вектор, содержащий векторы (просто список векторов, никакой магии). После этого нотация упростится до логичного vector-major: сначала ты указываешь индекс вектора, потом индекс его элемента, а уж как там в книжках эти векторы нарисованы - столбцами, строками или вообще в окружности вписаны, тебя ебать не должно.

К сожалению, элементы матрицы нужно хранить в одномерной компьютерной памяти. Если ты сделаешь struct vector { float x, y, z; }, то компоненты структуры в памяти будут лежать один за другим. Если сделаешь массив векторов struct vector m[4] и заполнишь это данными, то векторы в памяти будут идти один за другим (т.е., m[0].x, m[0].y, m[0].z, m[1].x, m[1].y и т. д.). Чтобы достать оттуда вектор, ты будешь делать m[​i​], а чтобы обратиться к элементу этого вектора - (m[​i​]).y допустим. Если ты вместо массива структур сделаешь массив массивов float m[4][3] (4 вектора по 3 элемента), то расположение элементов в памяти не изменится, не изменится и нотация: ты продолжишь сначала обращаться к вектору m[​i​], а потом к его элементу (m[​i​])[j], и если на бумажке или в книжке у тебя row-major, то нотация совпадет: m[​i​][j]. Это естественно и логично. Но осознай, что это лишь вопрос нотации: ты можешь взять column-major из книжки, писать столбцы в векторы и продолжать использовать m[​i​][j] или наоборот, ты можешь решить, что для каких-то вычислений хранить соответствующие компоненты векторов рядом, т.е., в column-major ({{x0, x1, x2}, {y0, y1, y2}, ...} удобнее и быстрее, и в этом случае нотация для обращения изменится на m[j][​i​].
23 1188925
>>188919
Пердачую этого. Хотел объяснить всё то же самое, но он сделал это развернуто и очень понятно, ну и первым. Правда я нихуя не понял из последнего предложения, причем тут column-major, если ты хранишь векторы группируя их по компонентам.
Screenshot20180513004625.png83 Кб, 919x788
24 1188928
Смотрю исходники GSL (gnu scientific library), возникли вопросы.

1. Там регулярно попадается такая штука:
for(i = 0; i < n; ++i)
{
....const int a = // значение, зависящее от объявленных выше переменных;
....const int b = // значение, зависящее от объявленных выше переменных
....c = // Функция от a и b.
}
Пример такого в прикрепленной картиночке.
Как Си создает/убивает переменные вне области видимости? Не получается ли, что на каждой итерации цикла тратится время на то, чтобы создать переменную, один раз внести в нее значение, и потом уничтожить (освободить память), итого 2 лишних действия для каждой такой переменной на каждый проход цикла?
2. Почти все вспомогательные переменные const в коде. Не константы в основном только счетчики циклов и переменные, которые считаются в цикле (например, сумма элементов массива). Зачем так делать? Это такой стиль, нужный чтобы люди использовали каждую переменную для одной задачи, или в этом есть польза?
Даже переменные переданные по значению в функции const, что совсем странно:
int gsl_fit_linear (const double x[], const size_t xstride, const double y[], const size_t ystride, const size_t n, бла-бла)
Зачем?
25 1188932
>>188928
Это тебе не ООП, и переменная здесь - не объект.
Оно в "статической" памяти находится, и, единственное что происходит при входе в цикл - инициализация переменных значениями.
Если что не так сказал - поправьте.

Вообще C - моя единствення любовь, великий язык. Жаль, что не приносит денег в отличии от мамкиных фронтэндщиков 300к/наносек
26 1188936
>>188925

> Как Си создает/убивает переменные вне области видимости? Не получается ли, что на каждой итерации цикла тратится время на то, чтобы создать переменную, один раз внести в нее значение, и потом уничтожить (освободить память)


Стандарт ничего не гарантирует, но во всех реализациях автоматические переменные лежат на стеке. Плохому компиляторе для создания переменной или целой области видимости нужна целая одна инструкция (кроме инициализации). Хороший компилятор выделяет в стеке достаточно места для любого вложенного блока кода сразу же при входе в функцию (одной инструкцией), а при выходе все разом освобождает (опять же одной инструкцией), да еще и переиспользует переменные:
void foo(int arg) {
int some_variable = 3;
if (arg) {
for (size_t i = 0; i < n; i++) { some code; }
for (size_t i = 0; i < n; i++) { other code; }
}
}
В этом куске кода на стеке может вообще ничего не выделиться: если sizeof(int) == sizeof(size_t), и у нас 32-битный x86, а arg кроме условия больше нигде не используется, то компилятор может писать i прямо в arg. И даже если нет, то i, скорее всего, все равно будет одна. Поэтому не стоит об этом думать, ты даже с -O0 почти ничего не теряешь.

> Почти все вспомогательные переменные const в коде


Да, это такой стиль, чтобы люди видели константы, чтобы писать самодокументирующийся код, чтобы избегать глупых ошибок. Теоретически, оно еще может немного помочь компилятору с constant propagation. Но напоминаю, что с константами в Си нужно быть осторожным, они сломаны и означают "в этом месте я не буду изменять эту хуйню", автоматические переменные с const еще более-менее дружат, а вот глобальные вменяемо оптимизируются только в паре со strict aliasing и restrict.

>>188932

> Оно в "статической" памяти находится


Так можно, но по сути тебе все равно приходится скатываться до стека при рекурсии. Поэтому так не делают.
image.png76 Кб, 802x699
27 1188978
>>188919
Ох, спасибо. Этот чувак жутко запутал с пониманием массивов, я уже почти ему поверил, всё-таки статья хорошая была.
28 1189042
>>188936
Благодарю.

Правильно ли я понял: можно засрать всю программу переменными в стеке (включая vla?), выделять новую переменную под каждое действие, это (почти) не повлияет на скорость и вес программы?
29 1189061
>>189042
Нет, не правильно. У стека есть ограничения зависящие от реализации конпелятора и ОС. Можно изменить эти ограничения, но это костыль.
маллок-хуяллок наше всё.
мимкрок
30 1189140
>>189042
Ты почти правильно понимаешь. Но выделять большие массивы (сотни килобайт) не стоит, и при рекурсии нужно осторожно подумать, сколько тебе может понадобиться. Как тебе написали выше, стек не резиновый. Но если ты просто даешь имена промежуточным результатам вычислений:
int foo = a + b; int bar = foo ∗ 2; return bar;
ты ничего никуда не засрешь, потому что с любым уровнем оптимизации, отличным от нулевого, это почти/полностью эквивалентно:
return (a + b) ∗ 2;
И скорее всего, в стек вообще ничего не попадет, все в регистры влезет. Отладочные билды будут медленнее и жирнее, да. На релиз такое не повлияет.

А VLA зло. Если ты не ограничиваешь размер массива, однажды ты попробуешь выделить слишком много и свалишься. Если ограничиваешь - тебе не нужны VLA, ты можешь сразу написать, что хочешь не array[n], а, допусти, array[8192].

>>189061
Ты забыл сказать, что чаще всего это ограничения уровня нескольких мегабайт.
изображение.png88 Кб, 250x170
31 1189193
Сап, аноны. Подскажите, как реализовать простейший стек на си без плюсов блядь и push/pop/peek для него.
В гуле одни плюсы, которые я не знаю, либо какая-то лютая хурма.
Так же сложности добавляет то, что авторы статей имеют привычку называть плюсы "си", соответственно найти что-либо рабочее не удалось.
Спасибо
32 1189202
>>189193
Студентота, учись иди. Хули ты клянчишь? Давай бабки и я так уж и быть покажу как э о реализовать.
33 1189209
>>189202

> учись иди


Я бы и рад, но препод-троянишна на лекциях пишет код на доске и он какая неожиданность нихуя не работает.
34 1189215
>>189209
Меняй место учебы, это самый мудрый совет в твоей ситуации.
35 1189224
>>189215
Отсрочка от армейки на бакалавриате только одна, так что приходится крутиться.
Хотяб с самим стеком можешь помочь?
36 1189226
Имеется указатель на строку p_str
Если написать
(p_str++) = 6;
То сначала просходит инкремент указателя, а затем его разыменование и присвоение 6?
А если написать
(++p_str) = 6;
То сначала указатель разыменовывается, присваивается 6, а указатель увеличивается на 1?

Или в обоих случаях сначала идет инкремент, а только потом разыменование и присвоение? Тогда я не понимаю, в каких случаях и как именно работает префиксная и постфиксная инкрементация.
37 1189228
>>189226
В каждом случае перед скобкой еще стоит звездочка. Здесь, видимо, она обозначает наклонный текст, поэтому ее не видно
38 1189232
>>189226
В кажом случае сначала инкремент указателя.
Вот если без скобок, то в первом сначала присваивание, потом инкремент указателя.
39 1189238
>>189232
Спасибо. Понял. То есть скобки устанавливают приоритет операции таким образом, что сначала всегда p будет увеличен, а только потом разыменован.
А без скобок, соответственно, приоритеты меняются в зависимости от того, с какой стороны стоит инкремент.
40 1189247
>>189232
Сделал разыменование и постинкремент.
Вот кусок кода:
char ch = '4';
'звездочка'p_str++ = ch;
printf("p_str = %c\n", 'звёздочка'(p - 1));
То есть на экран должен выводиться символ 4. Но получаю какой-то мусор. А если написать
printf("p_str = %c\n", 'звёздочка'(p));
То выводится 4.
Почему?
41 1189249
>>189209

> троянишна


Жительница Трои?

> и он нихуя не работает.


Вангую, там ошибки уровня отсутствующих ";", просто ты даун и не хочешь думать.
42 1189260
>>189193
int push(int element ,int ٭٭stack, int stack_elements, int ٭stack_head) {

if (!(stack_elements - ٭stack_head)) {
return 1;
}

٭(٭stack + (stack_elements-1) - ٭stack_head) = element;
٭stack_head += 1;
return 0;
}

int pop(int ٭element ,int ٭٭stack, int stack_elements, int ٭stack_head) {

if (!(٭stack_head)) {
return 1;
}

٭stack_head -= 1;
٭element = ٭(٭stack + (stack_elements-1) - ٭stack_head);

return 0;
}

int peek(int ٭element ,int ٭٭stack, int stack_elements, int stack_head) {

if (!stack_head) {
return 1;
}

٭element = ٭(٭stack + (stack_elements-1) - stack_head + 1);
return 0;
}

int main(void) {
int ٭stack, stack_elements, stack_head, element;

stack = calloc(1024, sizeof(int));
stack_elements = 1024;
stack_head = 0;
}
42 1189260
>>189193
int push(int element ,int ٭٭stack, int stack_elements, int ٭stack_head) {

if (!(stack_elements - ٭stack_head)) {
return 1;
}

٭(٭stack + (stack_elements-1) - ٭stack_head) = element;
٭stack_head += 1;
return 0;
}

int pop(int ٭element ,int ٭٭stack, int stack_elements, int ٭stack_head) {

if (!(٭stack_head)) {
return 1;
}

٭stack_head -= 1;
٭element = ٭(٭stack + (stack_elements-1) - ٭stack_head);

return 0;
}

int peek(int ٭element ,int ٭٭stack, int stack_elements, int stack_head) {

if (!stack_head) {
return 1;
}

٭element = ٭(٭stack + (stack_elements-1) - stack_head + 1);
return 0;
}

int main(void) {
int ٭stack, stack_elements, stack_head, element;

stack = calloc(1024, sizeof(int));
stack_elements = 1024;
stack_head = 0;
}
43 1189282
>>189260
Спасибо большое.
Надо ли тут задавать прототипы функции и подключать библиотеки помимо stdio и stdlib?
44 1189289
>>189247
Аноны, ну помогите с кодом. На таком фрагменте уже целый час потерял.
Если пишу звездочкаp = ch;
p++;
printf ("%c", звездочка(p-1));
то все работает. В чем ошибка-то?
45 1189302
>>189289
>>189247
Бля. Сорян, я сделал хуйню. У меня есть два разных указателя p и p_str, соответственно. Второй просто является строкой-дубликатом. Я сошел с ума и инкрементировал p, вместо p_str. Проблема решена
46 1189303
>>189302
95% проблем ИТТ решаются так, да
47 1189325
>>189193

> простейший стек на си


Вот >>1186430 пока не смыло. Проще некуда уже. (Peek сам осилишь?)
48 1189336
MinGW и gdb, Шиндоус 7. При попытке отладки падает в Segfault на FillConsoleOutputCharacterA. ЧЯДНТ?
49 1189340
>>189336
Откуда мы знаем, что ты там отлаживаешь, и почему оно падает.
изображение.png92 Кб, 1366x768
50 1189349
>>189340
А без отладки все работает нормально (В данном месте).
51 1189358
>>189349

> без отладки все работает нормально


Покажи, где в документации написано, что последний параметр может быть NULL?
52 1189361
>>189358
Хуй знает, я бы предусмотрел. Ладно, с прикрученным последним аргументом завелось, спасибо.
53 1189393
>>189282
Наглеешь, пацан.
мимо
54 1189439
Блять, походу потребность в OpenGL все таки загонит меня к вам в уютный загончик для бомжей. Порекомендуйте ту единственную интересную книгу, по которой я за месяц смогу вкатится в самые основы чтобы управлять апихой OpenGL позязя.
55 1189442
>>189439
OpenGL SuperBible. Если нужен legacy GL (фиксед пайплайн) по каким-то причинам, то 4 редакция. Если только новый - последняя доступная.
56 1189447
>>189442

>OpenGL SuperBible


Спасибо конечно... но это копание именно в движке. Именно с OpenGL как концепцией я думаю проблем не будет, у меня есть гайд для своей плотформы, отnуда я понял, что это клиент серверный механизм, в котором на клиенте формируется стек запросов с координатами и пуляется на сервер, который крутится на видеокарте и он всесь стек отрисовывает со скоростью звука и с нетерпением ждёт следующий вагон. У меня gроблема именно с C. Пушто я об нём ничего не знаю. Читал 5 лет назад книжицу в метро, но ничего не понял. Мне сейчас нужна тиресная книжеца по основам основ C )))
57 1189530
>>189447
Хосспаде, K&R и Прата прочитай и достаточно будет.
58 1189538
>>189530
От Прата слишком толстая
59 1189654
>>189439
А демки на нём и пишутся, да?
60 1189680
В какой области C прям мастхев? Два раза перечитывал (перелистывал) K&R, но работать над проектами уровня перевода фарангейтов в градусы было лень, поэтому и опыта никакого в C нет.
Интересует что-нибудь близкое к компьютерной графике
61 1189684
>>189680
В основном стримы видео, хиудео, там где надо работать с буферами. Например, пишется клиент серверная либа, которая стримит видео и звук, потом она портируется под работу на разных архитектурах. Запускается на мобильных устройствах и на линуксе. На моб устройствах поверх неё пишут на нативных фреймворках гуи, чтобы юзер мог ей пользоваться.
62 1189713
>>189654
Демки и на DirectX пишутся, и даже софтрендером на голом фреймбуфере от ОС.
63 1189726
>>189684
Там скорее ASSEBMLER тоже надо, без асма хуй там ты видео толком будешь обрабатывать.
64 1189727
>>189680
Embedded, system programming, тоесть прикладное ПО, что на сях не делается так это бек энды. Ну и контроллеры но там уже ASM больше надо.
65 1189728
Аноны а что написать можно для портфолио?
66 1189729
>>189726
Попробовал бы ты это в Java треде сказать. А вообще нравится мне ваш раздел. Самый ламповый в програмаче.
67 1189737
>>189729
Да там одни олигофрены, джава окончательно устарела уже, это легаси ковыряние, если есть сильное требование к ресурсам то это конец, джава не потянет. Если средней сложноси алгоритм то будет полная загрузка железа, уродливый жирный тулчейн, ИДЕ почти не глючит и так далее
68 1189864
>>189728
Напиши функцию ssize_t getrandbuf(void ∗buf, unsigned int nmemb, size_t membsize, unsigned short nbits, unsigned int flags)
которая принимает массив buf с число элементов nmemb, каждый размеров membsize, и заполняет каждый элемент слева рандомными битами в кол-ве nbits, полученными от функции getrandom с флагами flags.
От getrandom надо получать не больше рандомных битов, чем требуется (с точностью до байта). Энтропию, мать твою, надо экономить.
69 1189869
>>189727

>system programming, тоесть прикладное ПО


щито
70 1190055
>>189713
Есть моар инфы про софтрендер?
71 1190059
>>190055

Ну елки-матрелки, их дохуя, начиная с первой кваки и заканчивая драйвером-эмулятором видеокарты llvmpipe.
72 1190076
>>189737

Дрочую. Джава-параша сейчас очень сильно устарела если сравнивать с C# например. Там многое фундаментально перепиливать придется чтоб догнать без костылей. А это гроб-гроб-кладбище.

Сравните STREAM API с LINQ (который через экстеншен методы) и все встанет на свои места
73 1190082
>>190076

>Джава-параша сейчас очень сильно устарела если сравнивать с C# например.


Чем она устарела? Шарпоговно еще большее днище, а на жабе есть дохуя вкусняшек хэдупы, джибосы, томкаты, солры, нутч и прочее.
74 1190091
>>190082

Ты ебанутый? у джавы может дохуя всяких библиотек, но речь о языке и роантайме с технической точки зрения. Джава-параша и рядом не стоит с шарпом.
75 1190117
>>190091

>Джава-параша и рядом не стоит с шарпом.


Давай примеры.
76 1190136
шлёп
77 1190174
Пишу в эпичном треде
image.png127 Кб, 480x360
78 1190222
уже писал тут раньше насчет этой же проблемы, но она не решилась, а сроки горят
Всем привет, вопрос про написание простейшего драйвера для винды.
Мне по учебе в вузике нужно написать драйвер для Windows, который будете иметь возможность:
1) получать/отправлять значение от консольного приложения в user mode
2) записывать/считывать значение в MSR регистры процессора

Для Линукс написание такого драйвера (модуля ядра) проблем у меня не вызвало. С Windows всё сложнее, не могу разобраться в сэмплах на сайте майкрософта, книги по драйверописанию уже устарели.

Короче, спасите, умираю.
Посоветуйте инфы, чтобы разобраться.
А ещё лучше, напишите драйвер за меня (у шарящего человека это и 30 минут не займет), а я 1500р перешлю за работу на карту.
Или посоветуйте, где за деньги можно попросить такое сделать, потому что на Workzilla и Fl.ru за 1500 рублей никто не нашёлся
sage 79 1190225
>>190222
Анан, создай свой топик про драйвер и туси там, ты заебал уже кругом срать.
80 1190229
>>190222
>>190225
Я отписался только в трёх тематических тредах.
ИМХО больше я засрал бы доску бесполезным тредом.
sage 81 1190232
>>190229
Нет ты конкретно срёшь в треде про C. И меня заставляешь тоже тут срать! Пидор
82 1190252
>>190222

>Посоветуйте инфы, чтобы разобраться.


Качай DDK Млкософта и читай доки.
83 1190263
>>190252
WDK оказывается он уже называется
84 1190313
>>190222

> уже писал тут раньше насчет этой же проблемы, но она не решилась


Если бы ты вместо походов по биржам просто погуглил, то оказалось бы, что решишь проблему самому быстрее, чем бегать и ныть. Вот тебе твой драйвер: https://github.com/pmolchanov/legacy-driver-helloworld/blob/master/driver/driver.c _readmsr()/_writemsr() вызвать в районе 135 строки осилишь? Клиент с CreateFile/DeviceIoControl осилишь?

> книги по драйверописанию уже устарели


Да ты что? Ты там видеодрайвер пишешь, может быть? Или в винде резко поменялся ядерный апи?
85 1190375
>>190263
WDK и WDF это не одно и тоже?
86 1190383
>>190375
Когда я с этим говном возился, оно DDK называлось, сейчас вапче нинаю
87 1190442
https://pastebin.com/SVP47M5n
Объясните пожалуйста, в чем разница между 1,2 и 3 вариантом. В 3м варианте ошибка сегментации. Как static и extern связаны с выделением памяти в куче/на стэке?
88 1190448
Кочаны, у меня есть циферки
1065353216, 1065353216, 1065353216
это Int32
как мне их мапнуть в Int8, чтобы и значения были между 0 и 255?
89 1190499
>>190448
Непонятно
90 1190510
>>190448
Здесь одна циферка три раза.
91 1190518
>>190510
Да есть такое дело. Но я уже придумал
находим коойициент
к = Инт32.макс / Инт8.макс
И потом делим 1065353216/к
92 1190541
>>190442
В первом варианте ты объявляешь статический массив интов, который уже будет в теле образа программы при конпеляции и весь заполнен нулями(инициализирован). Т.е. размер софтины будет конпелированный код+ массив интов. Этот массив будет в области данных(кода софтины?), а не на стеке. Область видимости этого массива будет строго файле исходника.
Второй случай отличается только областью видимости, она уже будет глобальной.
В третьем случае ты запиливаешь массив во времени выполнения софтины и тупо не хватило места на стеке .
Вроде так.
93 1190601
Насколько сложно рисовать используя GDI+? Для Машины Тьюринга нужна отрисовка графов, а я собственно никогда не рисовал.
94 1190612
>>190601
С GDI+ слегка непросто. Это изначально крестовый API, а плоский сишный API, на котором он основан, официально недокументированный (хотя все уже разобрали) и чуть более многословный, чем хотелось бы. С обычным GDI сложностей нет, есть книга www.fengyuan.com, но можно и в MSDN справку смотреть, там все просто.
95 1190634
>>190541

>области данных


Это и есть куча? А маллоки нужны для того, чтобы выделять память в куче во время выполнения, я правильно понимаю?
96 1190638
>>190612
Ага, спасибо. Значит, GDI. Надо бы свою прогу переписать по всем канонам WinAPI, да не осилю, наверное
97 1190699
Какой компилятор более-менее дружит с WinAPI и вообще с Шиндой, окромя MSVC?
98 1190705
>>190699
openwatcom
99 1190719
>>190699
gcc (можно в комплекте с msys, msys2), Pelles C. А этого >>190705 не слушай, у них все не как у людей.
100 1190723
>>190719

>у них все не как у людей


Зато нативный бинарник
101 1190734
>>190723
Привет, мы тут на Си пишем, у нас везде нативные бинарники.
102 1190755
>>190634
Это статическая память, а не куча. Это память, которую программа просит у системы и куда проецирует свой код и свои статические переменные. Память из кучи - это когда ты в реальном времени просишь еще памяти всякими malloc'ами и система выдает тебе таковую.
103 1190781
>>190719
gcc не ест
https://github.com/can1357/CVE-2018-8897
Ошибки типа
error: '__writedr' was not declared in this scope
Какой компилятор знает про __writedr?
https://msdn.microsoft.com/en-us/library/aa983394.aspx
Ну и вторая ошибка такая:
Main.cpp:149:26: error: invalid conversion from 'void ()()' to 'PVOID {aka void
}' [-fpermissive]
sage 104 1190784
>>190781

typedef *void PVOID пробовал?
105 1190813
>>190755

>Это статическая память, а не куча. Это память, которую программа просит у системы и куда проецирует свой код и свои статические переменные. Память из кучи - это когда ты в реальном времени просишь еще памяти всякими malloc'ами и система выдает тебе таковую.



Только не программа просит, а система при загрузке исполняемого файла читает из исполняемого файла секцию и сама выделяет приложению память. И в случае неинициализированной памяти дескрипторы помещаются в секцию bss, где указывается только размер, файл при этом не увеличивается. А вот если было бы int array[] = {1,2,3,4,5....100500}, то да, размер исполняемого файла вырос.
106 1190913
>>190784
За typedef спасибо, но прототип __writedr из воздуха не возьмётся
107 1190982
>>190913

> __writedr


Перепиши с инлайн-асмом. Или вон у них там есть Native.asm, ты вполне можешь воткнуть туда еще и это.

> Какой компилятор знает про __writedr


Слишком специфичный интринсик, чтобы поддерживаться где-то еще.
108 1191062
>>190913
Он объявлен в хедере intrin.h. В MinGW его нет, например. Зато есть в Mingw-w64. Попробуй его https://mingw-w64.org/doku.php
109 1191176
>>191062

> в mingw его нет


В коде есть include <intrin.h>
Там какой стаб стоит? Чё компилятор на отсутствие не ругается?
110 1191223
Если я делаю небольшую прогу с интерфейсом консольным, то жестко задавать магические номера координат элементов (окошки, надписи, етц) это нормально или быдлокод? Если последнее, то как фиксить?
111 1191260
>>191223

>Если последнее, то как фиксить?


как ты в менюшки то тыкаешь? рассчитывай от разрешения экрана и определяй по координатам тыкалки
112 1191262
>>191260
Да при буфере строго 80х25 как-то похрену, окошко не увеличивается. Хотя Шиндовс10 каким-то образом это проворачивает!
113 1191272
>>191262

>80х25


чего, символов, точек? сколько точек на символ? тыкалка в точках возвращает или в символах?
114 1191275
>>191272
Консоль же, аки curses, но не curses. 80x25 символов. Поддержки мыши нет.
115 1191280
>>191275
на джвухметровом мониторе тоже будет отмасштабированно на 80x25 символов, панимаешь
116 1191285
>>191275

>Поддержки мыши нет.


з.ы. еще можешь следить за путями выбора
117 1191301
>>191176
В коде есть. Но он там объявлен как хэдер из поставки компилятора. И где тебе компилятор этот хэдер возьмет, если его нет?
118 1191347
Бля, не бейте: не могу сделать прогу, которая переводила бы набор из 128х128 цифр от 0 до 9 из .txt в .png, придавая пикселям цвет в зависимости от значения соответствующей цифры. Вроде, простая хуйня, но никак не успеваю разобраться. Поясните, что там знать нужно? (уровень 1: едва ли работаю со строками)
119 1191360
>>191347
Работать с файлами, знать что из себя представляет png
120 1191364
>>191360
>>191360
В каком плане?
121 1191373
>>191364
Png суть тот же бинарник. Для того, чтобы создать этот бинарник тебе нужно передать на вход свой txt, а на выходе получить png. Но это не значит просто сменить формат, потому что png содержит в себе ещё и служебную информацию. То есть тебе надо знать как устроен PNG. А вообще если ты задаешь такие вопросы то для начала не мешало бы хоть какую-нибудь книжку дочитать. Кури на гитхабе png decoder и разбирайся.
122 1191377
>>191360
>>191373
Охуенно
123 1191379
>>191347
Let me google that for you: https://www.lemoda.net/c/write-png/
Там в main() есть цикл вложенный по x и y. Твоя задача записать в цветовые компоненты каждого пиксела нужные значения. Например, так:
uint8_t value = цифра - '0';
uint8_t intensity = (uint8_t) (value ∗ 25); // Примерно то же, что value / 10 ∗ 255, но сразу в целых числах.
pixel->red = intensity;
pixel->green = intensity;
pixel->blue = intensity;
А уж как читать цифры построчно или посимвольно, игнорируя или нет пробелы - сам.

Этих >>191360 не слушай, очень долго будешь на текущем уровне ебаться с форматом и zlib-ом.
124 1191450
>>191347

> .png


А тебе обязательно png или просто нужно получить картинку? Можешь посмотреть на формат .ppm, если пока не хочешь ебаться с DEFLATE и прочей ссакой
125 1191463
Нельзя этого сделать на C.
126 1191476
Имеется односвязный список, из таких структур.
typedef struct list {
int value;
struct list 'звездочка' next;
} List;
Обычно новый узел добавляется функцией такого вида
List 'звездочка' add(List 'звездочка' elem, int val) {
List 'звездочка' temp, new;
new = (List 'звездочка') malloc (sizeof(List));
temp = elem->next;
elem->next=new;
new->value = val;
new->next=temp;
return new;
}
Можно ли приведенную выше функцию заменить функцией такого вида, если я хочу просто с головы добавить 6 новых узлов?
void add(List 'звездочка' elem, int val) {
elem->next = ++elem; //старому elem->next присваивается elem+1 или новому elem->next присваивается он сам же?
elem->value = val;
}
int main () {
int v = 23;
List 'звездочка' head = (List 'звездочка') malloc (sizeof(List)'умножить'7);
head->value = v;
int addList = 6;
while (addList) {
scanf ("%d", &v);
add(elem, v);
addList--;
}
return 0;
}
Грубо говоря, мой вопрос сводится к тому, что я закомментировал в функции. Как именно там будет работать присваивание? Да и вообще, в целом, корректно ли это теоретически?
126 1191476
Имеется односвязный список, из таких структур.
typedef struct list {
int value;
struct list 'звездочка' next;
} List;
Обычно новый узел добавляется функцией такого вида
List 'звездочка' add(List 'звездочка' elem, int val) {
List 'звездочка' temp, new;
new = (List 'звездочка') malloc (sizeof(List));
temp = elem->next;
elem->next=new;
new->value = val;
new->next=temp;
return new;
}
Можно ли приведенную выше функцию заменить функцией такого вида, если я хочу просто с головы добавить 6 новых узлов?
void add(List 'звездочка' elem, int val) {
elem->next = ++elem; //старому elem->next присваивается elem+1 или новому elem->next присваивается он сам же?
elem->value = val;
}
int main () {
int v = 23;
List 'звездочка' head = (List 'звездочка') malloc (sizeof(List)'умножить'7);
head->value = v;
int addList = 6;
while (addList) {
scanf ("%d", &v);
add(elem, v);
addList--;
}
return 0;
}
Грубо говоря, мой вопрос сводится к тому, что я закомментировал в функции. Как именно там будет работать присваивание? Да и вообще, в целом, корректно ли это теоретически?
127 1191479
>>191463
Почему же? Нужно просто нагуглить либку на C которая может сделать пнг. Опять же можно по пути визальнуть на каком нибудь OpenGL то что получается.
128 1191531
Просто пишешь байты в файл, следуя регламенту. Что тут сложного? http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html
129 1191547
>>191476

> Можно ли приведенную выше функцию заменить функцией такого вида


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

> Как именно там будет работать присваивание?


> elem->next = ++elem;


Хуево. Есть такие sequence points в языке, и между sequence points порядок возникновения сайд-эффектов не определен. В твоем выражении sequence-point - точка с запятой. И поэтому нельзя ничего сказать о том, когда произойдет инкремент, и какому elem->next присвоится указатель.

Алсо не совсем понятно, что ты делаешь с elem в main (откуда он берется). Ты можешь сделать в main:
struct list ∗elem = head + 1;
while (...) {
elem->value = v;
elem[-1].next = elem; // Мы в массиве, так можно.
++elem;
}
elem[-1].next = NULL;

>>191531

> Просто пишешь байты в файл, следуя регламенту


> Просто реализуешь битстрим


> Просто реализуешь хаффмана


> Просто реализуешь lz77


> Просто реализуешь дефлейт


> Просто реализуешь адлер


> Просто оборачиваешь дефлейт в zlib


> Просто реализуешь crc32


> Просто работаешь с big-endian


> Просто пишешь PNG-чанки в файл


> уровень 1: едва ли работаю со строками

129 1191547
>>191476

> Можно ли приведенную выше функцию заменить функцией такого вида


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

> Как именно там будет работать присваивание?


> elem->next = ++elem;


Хуево. Есть такие sequence points в языке, и между sequence points порядок возникновения сайд-эффектов не определен. В твоем выражении sequence-point - точка с запятой. И поэтому нельзя ничего сказать о том, когда произойдет инкремент, и какому elem->next присвоится указатель.

Алсо не совсем понятно, что ты делаешь с elem в main (откуда он берется). Ты можешь сделать в main:
struct list ∗elem = head + 1;
while (...) {
elem->value = v;
elem[-1].next = elem; // Мы в массиве, так можно.
++elem;
}
elem[-1].next = NULL;

>>191531

> Просто пишешь байты в файл, следуя регламенту


> Просто реализуешь битстрим


> Просто реализуешь хаффмана


> Просто реализуешь lz77


> Просто реализуешь дефлейт


> Просто реализуешь адлер


> Просто оборачиваешь дефлейт в zlib


> Просто реализуешь crc32


> Просто работаешь с big-endian


> Просто пишешь PNG-чанки в файл


> уровень 1: едва ли работаю со строками

130 1191548
>>191547
Просто пишешь все это на пистоне в одну строчку, а потом конвертируешь в си.
131 1191549
>>191547

>> Просто пишешь PNG-чанки в файл


>> уровень 1: едва ли работаю со строками


Ну он же думал, что это просто. Вот пусть просто и пишет чанки. Потом просто напишет убийцу фотошопа.
132 1191552
>>191549
Так это на самом деле просто: просто линкуешься с libpng, там вон выше и пример есть почти готовый.

А вот на код на пистоне, в котором ты одной строчкой, без import zlib или PIL сгенеришь PNG, я бы посмотрел. inb4: fp.write(b"\x89PNG\r\n\x1a\n\0\0\0\rIHDR...")

>>191549

> Вот пусть просто и пишет чанки


Ну да, там особой ебли нет, вот только IDAT сжатый и CRC надо считать, и значения в big-endian.
133 1191574
>>191547
О, спасибо. Понял.
В main'е узел создается очень просто. Структура же глобальная. Поэтому просто выделяю память под узел на куче.
А что можно про сайд- эффекты почитать? Там все-таки unexpected behaviour будет?
134 1191694
>>191574

> Там все-таки unexpected behaviour будет?


If a side effect on a scalar object is unsequenced relative to either a different side effect
on the same scalar object or a value computation using the value of the same scalar
object, the behavior is undefined.

> А что можно про сайд-эффекты почитать?


Accessing a volatile object, modifying an object, modifying a file, or calling a function
that does any of those operations are all side effects, which are changes in the state of
the execution environment
.
135 1192251
>>191301
@
ЗАДОЛБАЛСЯ, КАЧАЕШЬ MSVC BUILD TOOLS
@
КОМПИЛЯТОРЫ ВЕСЯТ 4 ГБ, ВЫБОРОЧНОЙ УСТАНОВКИ НЕТ
@
cl Main.cpp
@
CANNOT INCLUDE FILE WINDOWS.H: NO SUCH FILE OR DIRECTORY
136 1192252
>>192251

>MSVC


это боль, избегай ее
137 1192256
>>192252
Можно мне, не упарываясь WinAPI, собрать что-нибудь под Винду, не реализовывая самому какой нибудь ссанный интринсик?
Я ещё не хочу 40 ГБ IDE качать, я вообще имею право после этого сидеть на Винде?
138 1192268
>>192256
Что тебе нужно то? mingw64 ставь
139 1192272
>>192256
Да ты заебал ныть. Тебе ж сказали поставь Mingw64 и не еби мозг
140 1192275
>>192272
Там в хедере intrin.h нужной функции нет, я исходники смотрел
142 1192284
>>192283
Ты что мне скинул?
Там есть этот файл, но он неполноценный.
143 1192287

>Там в хедере intrin.h нужной функции нет


Ну так в консоли набери. Я решаю дописыванием.
144 1192290
>>192284

>но он неполноценный.


ну тогда полноценный только у мекрософта
145 1192292
и потом нельзя в четыре строки написать компилятор
146 1192296
>>192290
В хедерах Шланга видел, надо перепробовать.
Небось, в репах MSYS старый Шланг до жопы
147 1192314
>>192296
ты странный, ты мутишь какую то хуйню завязанную на ньюансах мекрософта, ставь вижуал студию и не выебуйся
Anonymousemblem.svg.png41 Кб, 316x316
148 1192318
>>192296
>>192314
ну ладно, теперь здесь

>переход на Шланг


>переход на "странный"



без этого, пожалуйста
149 1192321
Всё же в Ц дохуя недостатков.
Давайте перечислим самые главные:
-Нет неймспейсов.
-Нет автовывода типов.
150 1192332
151 1192335
>>187521 (OP)
Сишка хороша да только невостребованна
152 1192344
>>192332
Бблять
Давай запилим. Может в массы пойдет, а там глядишь и стандарт примут.
153 1192348
>>192335
Вижу, русский язык тоже не особо востребован.
sage 154 1192370
>>192256
Что только не сделают люди, лишь бы не написать две инструкции на асме.
155 1192390
>>192370
> Debug resgister
Щто это?
156 1192398
>>192390
Набор регистров, используемый для установки точек останова для аппаратной отладки (можно, например, узнать о модификации или чтении памяти). Хранят адреса точек останова, их типы и статус.
157 1192431
Говорите, вы биты тоже с нуля нумеруете?
158 1192463
>>192431
Да, с младшего и с нуля. А что?
sage 159 1192477
Нет анонимных функций, нет дженериков, нет промисов.
160 1192478
Нет замыканий.
sage 161 1192481
>>192477

> Нет анонимных функций


Не бывает анонимных функций, бывают проблем с английским.

> нет дженериков


Есть _Generic, которым никто не пользуется. У нас тут кроссплатформенный ассемблер, мы знаем, с каким типом данных работаем.

> нет промисов


И слава богу. Нужно - запили сам. Через пару лет осознаешь свою ошибку и выпилишь.
162 1192492
>>192481
Что не так с анонимными функциями?
sage 163 1192498
>>192492
Если ты ее не назвал, ее назовет компилятор, потому что линкеру нужно имя. А раз имя все равно будет, то почему бы его не придумать?
164 1192547
>>192463
Так хочется со старшего нумеровать)000.
Когда иду по массиву чаров, я же инкрементирую указатель, и мне идти также слева направо по битам
165 1192549
>>192481

> кроссплатформенный ассемблер


Бессмысленный набор слов.

>>192498

>ее назовет компилятор, потому что линкеру нужно имя.


Не у всего есть linkage, дебич.

>> нет промисов


>И слава богу.


Люмпен от программирования as is.
166 1192550
В CLion на винде вообще возможно запускать программу в отдельном окне консоли, а не встроенном в IDE?
167 1192551
>>192477

>функций


Анонимные функции - синтаксический сахар.
>>192477

>нет дженериков


Не дженериков, а шаблонов, ты откуда такой вылез?

>нет промисов


нинужно
Рассматриваем Цэ, как удобный кросплатформенный ассамблер
168 1192552
>>192478
Лямбды с замыканими, по сути тоже сахар.
Передавай указатель на функции вместо лямбд и явно передавай параметры вместо замыканий.
169 1192553
>>192549

> кроссплатформенный ассемблер


>Бессмысленный набор слов.


ОКЭ, область применения - сверхэффективный быстрый системный, прикладной софт и числодробительные библиотеки.
Т.е. не делаем из С хипстеропарашу, а добавляем комфорта при решении текущих задач.

>> нет промисов


>И слава богу.


Люмпен от программирования as is.
При желании можешь написать сам. Но тут нет асинхронной парадигмы, поэтому нинужно.
170 1192563
>>192551

>Анонимные функции - синтаксический сахар.


Это, прежде всего, освобождение глобального неймспейса от ненужного хлама.

>нет промисов


Можно сделать с помощью longjmp/setjmp
171 1192565
>>192498

>потому что линкеру нужно имя


>статическая функция


Пиздец, какие же здесь дауны сидят.
172 1192591
>>192565

>кичится знанием базовый вещей


Мань, ты задачи бизнеса-то решать сможешь?
Тебе ставят большую задачу написать распределенное приложение. Что делать будешь, байтомакака?
173 1192615
>>192591
Кто ж поставит байтомакаке такое задание? В лучшем случае отпрофилируют и тормозное говнецо отдадут переделать.
174 1192618
>>192615
Два чаю. Си сейчас меют тендецию к заниманию прослойки между сетевым/графическим хардвером и макакским апи для конечного клиента, еси мы говорим о бизнессе
175 1192632
>>192550
Бампану. Или посоветуйте пожалуйства, годную и легкую IDE для Си
names.png15 Кб, 648x485
sage 176 1192681
>>192549

> Не у всего есть linkage, дебич.


А линкерам надо работать вне зависимости от того, какими асбтракциями это обмазали в стандарте.

>>192565

> статическая функция


> Пиздец, какие же здесь дауны сидят.


Действительно.
177 1192688
>>192632
нотепад++
178 1192698
>>192688
Ну это уже перебор.
179 1192704
>>192632
Про Pelles C написано в шапке. Если тебе только Си и только винда, его будет достаточно.
180 1192707
>>192498

>А раз имя все равно будет, то почему бы его не придумать?


А раз компилятор генерирует машкод, то почему бы его не писать руками?

Л — Логика.
181 1192709
>>192591
>>192615
>>192618
Одинэсники отакуэ няшный тренд, все в налоговую.
мимо jsмокаг
182 1192751
>>192709

>мимо jsмокаг


ну вы заебали, это единственный илитарный трхед, был...
183 1192757
>>192751
Он и остается илитарным. Всякие js макаки тут не задерживаются, если не интересуются сями.
184 1192762
>>192751
Я на С 12 лет назад лабы делал в универе. Первая любовь. А JS - стал нужен пару лет назад сугубо из практических, но не корыстных целей (расширения браузера). Трхед незапятнан.
1521823858154533500.jpg118 Кб, 700x393
185 1192765
>>192762

>Трхед незапятнан.


Ну тогда хорошо
186 1192766
>>192765
Он запятнан макакой.
187 1192775
>>192463
Хмм, с порядком байтов всё понятно, x86-Little-endian.
Но вот про порядки битов я дохрена разного нашёл.
Кое-где связывают Little-endian с нумерацией с МЗБ, а big-endian связывают с нумерацией с СЗБ.
188 1192867
>>192775
Железячники с младшего нумеруют. Intel (если уж мы об x86) с младшего нумерует. Разброд и шатания начинаются, когда нужно упаковать/распаковать поток битов в байты или слова, тогда, действительно, бывает и со старшего записано, и даже задом наперед - кому как удобнее.
sage 189 1192870
>>192867
И вообще даже сама запись двоичного числа - это bitn-1×2n-1 + bitn-2×2n-2 + ... + bit2×22 + bit1×1i + bit0×20, номер бита логически вытекает из соответветствующей ему степени двойки.
sage 190 1192875
>>192870

> 1i


bitn-1×2n-1 + bitn-2×2n-2 + ... + bit2×22 + bit1×21 + bit0×20
Ну вы поняли. Не могу ответить итт и не облажаться.
Снимок.PNG17 Кб, 594x600
191 1192909
Сап аноны, есть одна программа, которая сношает мне мозг, а я сношаю мозг ей.
В общем суть такая, делаю имитацию оргазма функции vector на СИ, я хочу что бы пользователь вводил нужну. длину вектора, а он сам выделял под себя место и все такое. Он делает все, но данные загоняются не корректно. Я создал цикл for, самый обычный, classic, там каждый раз генерируется рандомное число, преобразуется в стринг и заносится в массив, но если вручную все это работает (когда сам забиваешь массив в вектор), то через цикл он загоняет туда последнее число цикла, хотя в том же цикле добавлен принтф и все зоебись. Надеюсь вы хоть что то поняли из моего потока сознания.
На скрине сначала числа по порядку, преобразованные в стринг, а потом уже числа из вектора. Третяя группа это операции над вектором, там все ок.

>int main(void)//Тестирование функций


{
int noe=0;
int k=0;
char m[10];
vector v;
vector_create(&v);//Создаем вектор
printf("Enter number of elements: ");
scanf("%i\n", &noe);
for(k=0; k<noe; k++){
sprintf(m, "%d", k);
printf("%s\n", m);
vector_push_back(&v, m);
}
/vector_push_back(&v, "1");//Добавляем данные в вектор
vector_push_back(&v, "2");
vector_push_back(&v, "3");
vector_push_back(&v, "4");
vector_push_back(&v, "5");
/
192 1192919
>>192909
https://ideone.com/jxEyXC
Заебашил код сюда, что бы пацанам понятнее было. Спасибо
193 1192930
>>192919
Ну все правильно, ты ведь не выделяешь память под каждый новый элемент, а кладешь каждый раз один и тот же указатель на один и тот же буфер (m), и ты в цикле его затираешь все новыми и новыми данными, в результате твой вектор содержит 6 одинаковых указателей на буфер, в котором осталось последнее записанное туда значение. Напиши себе реализацию strdup, чтобы оно работало, как ты ожидаешь.

В push_back можно обойтись только realloc(), вспомнив, что realloc(NULL, size) - это то же, что malloc(size) - тогда тебе не нужно будет городить две раздельные ветки ради одного и того же.
194 1192941
>>192632
vim/emacs + gdb + ctags
195 1192942
>>192930
Я слишком тупой для таких вывертов, помоги позязя с strdup
196 1192943
>>192941
И мозоли, мозоли!
197 1192944
>>192632
codeblocks, 80мб
198 1192946
>>192942
char ∗strdup(const char ∗s) {
size_t length = strlen(s) + 1;
char ∗res = malloc(length);
if (res) memcpy(res, s, length);
return res;
}
...
vector_push_back(&v, strdup(m));

Можно еще не забыть проверку на ошибки: ругаться, если strdup() вернет NULL. А можно и не делать. При удалении вектора не забудь free() каждому такому элементу сделать. Хотя в твоей лабе можно и обойтись.
изображение.png169 Кб, 500x322
199 1192970
Ребята, а кто-нибудь из вас работает на C? Че делаете хоть? Сервера какие-нибудь пишете?
200 1192983
>>192970
Да, автомотив. Пишу логику сенсоров для электромашин будущего.
201 1192986
Нет аннотаций/декораторов.
202 1192994
>>192983

>автомотив


Компания АвтоМотив это интернет магазин оборудования для автосервиса и СТО.
203 1192996
>>192698
Почему? Хуярю на нем, всем доволен, иногда на вим перескакиваю.
204 1192998
>>192994

>АвтоМотив


Автомотив, это не компания, автомотив компании это даймлер, бэ эм дабл ю, волксваген и харман, генерал мотрос.
Image.jpg1,9 Мб, 2000x2610
206 1193165
>>187521 (OP)
Поясните, как создать графический интерфейс на чистом Си и что для этого лучше всего использовать? Gtk+ плох для нелинукс систем, Qt объектно-ориентированный, а wxWidgets судя по всему вобще не совместим с чистым Си (если всё-таки совместим подкиньте гайдов). Толко не советуйте WinAPI.
207 1193175
>>193165
Ты просишь готовую либу или как написать свой велосипед? Ты не совсем корректно выразился поэтому непонятно, что тебе посоветовать: пойти нахуй или использовать готовую либу.
208 1193179
>>193175
Я просто хочу найчиться делать программы с GUI на чистом Си, желательно самым простым способом.
209 1193181
>>193179
*научиться
210 1193189
>>193179
Простых способов нет.

Смотря для чего тебе GUI. Так-то навалом библиотек, в том числе кроссплатформенных.

Я даже не знаю, что тебе посоветовать. Qt и gtk+ в общем-то просты. Остальное не имеет дезайнера форм и поэтому придется ебаться в «слепую» с дизайном.

Как по мне вот простая либа https://github.com/vurtun/nuklear/blob/master/Readme.md

Есть tcl/tk...
211 1193208
>>193189
Возможно ли создать GUI на чистом Си с использованием Qt? Я знаю, что это объектно-ориентированный фреймворк, а в Си нет ни классов, ни поддержки ООП. Оно разве будет работать?
212 1193221
image.png7 Кб, 446x191
213 1193252
>>193221
Тогда как? Я использую Qt в связке с Visual Studio, но когда создаю новый проект, мне на выбор предлагают только Visual C++.
214 1193259
>>193252
Пиши либу на Си и линкуй с крестовой гуидятиной
1526737886402.jpg212 Кб, 1218x1015
216 1193275
>>193266
Вот жиза, такие-то советы. Проще уж сразу на C++ писать.
218 1193404
сап двочеры, подскажите где скачать чистый unix, хочу искупаться в этом дерьме. Раньше ни разу не использовал ОС с интерфейсом командной строки, а теперь понимаю что пора бы и попробовать. Также подскажите отличается ли принцип установки от установки той же винды или убунту или придется попотеть. Будет ли дистрибутив и как записать на флешку образ ОС.
219 1193421
>>193404
Ебанашка, ты доски попутал. Гаврюша, пиздуй в /s.

ставь дебиан net install без ДЕ и прочих пряников, будешь в голой сосноле пердолиться. Не так страшно на самом деде, зависит от задач. Что-то даже проще будет делать, чем сидеть в GUI
220 1193428
>>193252
Пиши либу на Си, а интерфейс на Qt на крестах. Кроссплатформенных UI для Си нет. То, что есть - выглядит отвратительно. Лучше всего использовать Gtk на линуксах и Windows API на винде. Да, пилить два интерфейса. Да, долго и сложно. Зато не будет выглядеть как 99% опенсорса.
221 1193436
>>193428
Пиздеж и кукареканье. Tcl/tk, gtk, qt — все кроссплатформенное. Есть еще немного маленьких библиотек с тем же функционалом. 2 уже выше приводили.
222 1193442
>>193436

> Пиздеж и кукареканье


Научись посты целиком читать.

> Tcl/tk


Тормоза и буэ на любой ОС. И это не считая тикля в комплекте.

> gtk


На Linux отлично, зато все то же самое выглядит как говно на Windows.

> Qt


Не для Си. Лучше из сортов говна, но: не только GUI, куча ненужных возможностей (CSS, JS и прочие квики), медленно, ненативно, поведение приводится к общему знаменателю для всех реализаций, из-за чего везде выглядит чуждым, лицензия. Не говоря уже о том, что эта либа подталкивает писать не интерфейс на Qt, а целиком софт на Qt, используя их собственные аллокататоры, работу с файлами и сетью.

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

> Есть еще немного маленьких библиотек


Либо кастомная отрисовка со всеми возможнными недостатками (ограниченно подходит для игр, не подходит для приложений), либо очень ограниченные возможности уровня окна/кнопки/поля ввода.
223 1193446
>>193442
Qt есть минимал или как-то так. На этом движке пилят lxqt продолжение lxde.

> ограниченно подходит для игр, не подходит для приложений


Охуительные истоии уровня /зк. Игры, блядь, пишут на юнити и анрил энжин, а не на gui либах.
224 1193449
>>193442
Забыл добавить, что gtk на винде нормально выглядит. Audacious media player или cherrytree тому пример. Вполне себе нативно.
225 1193453
>>193446

> Игры, блядь, пишут на юнити


Да ты что, никогда бы не подумал! А интерфейсов в играх нет, и кнопка "Выйти из этой индипараши и удалить ее нахуй" появляется магически?
226 1193455
>>192766
Что тогда ей не запятнано? Ответ "хуита и бред на апачан.нет" не принимается.
227 1193459
>>193453
А ты точно пишешь на С и знаком с юнити? Мне кажется ты залетный из js треда.
228 1193461
>>193459
С юнити почти не знаком, но слово "индиговно" должно было тебе намекнуть, что кроме игр на крупных движках есть еще и поделки, в которых из чужого кода максимум SDL. И вот они используют всякие nuklear, потому что нормальный UI писать долго, а кнопочки нужны. Итт достаточно давно обитаю, больше десяти лет пишу на Си.
229 1193463
>>193461
Ну и где ты тогда противоречия увидел? Спор ради спора?

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

Нахуй ты упираешься и давишь?
230 1193464
>>193463

> Игры на SDL пишут? Нет. На чистом С игры пишут? Нет


Ты сказал?
231 1193465
С чего начать изучать тему, если я хочу написать свою либу уровня graphics.h или curses, используя WinAPI? Ну или просто маленький фреймворк для менюшек консольных.
232 1193468
>>193464
Опровергни тогда. Ах да, примером из этого тысячилетия. Чтобы и УИ и все прочее на С без всчких сторонних библиотек. Ну давай, удиви кукаретик ебаный, с 10 годами стажа. Ха ха врунишка.
152679001819955172.jpg96 Кб, 700x933
233 1193476
Мне кажется в наш илитарный тредик начали набигать всякие.
234 1193488
>>193468

> Опровергни тогда


Ты уж как-нибудь сам. Сходи поищи, например, среди игр с LD, среди опенсорсных игр. Навскиду, GLTron и уебывай в гугл.
235 1193490
>>193488
Т.е. ты хотел сказать, что есть 1,5 проекта, которые в гугле на 789 064 255 странице выдачи?

Я не отрицаю, что есть единичные проекты, но индустрия давно уже держится на других слонах.
236 1193496
>>187521 (OP)
Есть ли какая-нибудь годная книжка с алгоритмами? А то переводить Цельсии в Фаренгейты не слишком уж интересно.
237 1193503
>>193476

>начали


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

>помохите лабу сделать


>привет слесарюги


>лучше уж кресты

238 1193504
>>193496
Дональд Кнут
239 1193511
>>193465
Бамп.
240 1193516
>>193490

> но индустрия давно уже держится на других слонах


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

>>193465
А это разве не ты был? >>190612 там ссылка на книгу.
241 1193518
>>193516
Ну, это попутно будет изучено. А вот как вынести все это в dll, например, чтобы оттуда дергать все более высокие самопальные функции? Короче, хочу написать обертку над апи.
242 1193520
>>193518
Чтобы от инициализации до обработки меню, с назначением функций на пункты, етц.

Отвалилось почему-то.
243 1193526
>>193518

> А вот как вынести все это в dll


__declspec(dllexport) или в .def-файле экспорты перечисли.

>>193520
В смысле, ты хочешь, чтобы за тебя написали? Или книжку о том, как написать меню? Пишешь эту инициализацию, городишь свою структуру для меню с колбеками, курсор обрабатываешь, рисуешь, в чем проблема-то? Можешь в FAR посмотреть, как там диалоги сделаны.
244 1193528
>>193526

> Можешь в FAR посмотреть



Ох бляяяяядь вы только посмомтрите на него. Ну спасибо за разрешение. Чмоня тебе корона не жмёт? Хули ты такой высокомерный? Тебе ебучку что ли всерыть? Попроще я сказал будь, мразота ебаная блядь.

Нормально же спросил к чему это высокомерие хуесос ты четырехглазый.
245 1193530
>>193528
Я не четырёхглазый.
246 1193533
>>193526
Я, наверное, свои вопросы не смогу объяснить. Так что просто пойду и попробую сделать.
247 1193538
Почему функция fgets не добавляет символ '\n' в строку?
248 1193539
>>193538
Почему она не добавляет \t или \b в начало строки?
249 1193540
>>193539
Почему она не проверяет строку на грамматические ошибки?
image.jpeg338 Кб, 1023x575
250 1193541
>>193540
Дебилка блядь в microsoft word набирай код для проверки

ну или aspell инклюдь и проверяйся
251 1193544
>>193539
>>193540
>>193541
"Символ новой строки прекращает работу функции fgets, но он считается допустимым символом, и поэтому он копируется в строку string."
При вызове fgets(str, sizeof str, stdin) пишу '4'
В строке получаю 4\n\0
Если пишу '-4'
В строке получаю 4\0
Что за хуйня?
252 1193545
>>193538
Ты выбрал крайне хуевый тред для таких вопросов. Не нравится fgets - напиши свой. Я тебе больше скажу, просто возьми реализацию и просто чутка подправь.
253 1193546
>>193544

>В строке получаю 4\0


-4\0
Быстрофикс
254 1193547
>>193546
Какой sizeof(str)?
Если не 3, то у вас просто пространство искривилось.
255 1193548
>>193546
Ну а сам как думаешь? Как -4 может быть int? Str это положительная длина, а не отрицательная.
256 1193549
>>193533
Отлично, а с проблемами приходи.

>>193538
Допустимо всего два варианта: либо у тебя EOF возник, либо твой буфер меньше длины строки. Тащи пример на ideone, где оно не работает.
257 1193550
>>193548
Он это на stdin пишет, наркоман
258 1193551
>>193545
быстрофикс
Только фишка в том, что fgets предназначена для работы в паре c fputs, которая этот символ добавляет
259 1193552
>>193547
а sizeof считает память, выделенную в куче?
str = malloc (1002);
260 1193553
>>193550
Ты головой ударился? Он пишет из stdin в str
261 1193554
>>193552
Епо, ты передаёшь sizeof от указателя на кучу.
262 1193559
>>193554
Все, вопрос решен. sizeof (str) = 1 (у меня система 8-битная), то есть считает только размер типа, а указатель в 8-бит системах = 1 байт.
263 1193562
>>193559

> у меня система 8-битная


Так, это что значит?
Размер чара 8 бит? И що? sizeof(char)=|Def|=1, пусть он даже 10 бит.
Размер типа считает, да. Но указатель как правило long.
264 1193566
>>193562
str - это указатель на тип char
Указатель в 8-бит системах имеет размер 1 байт.
Поэтому sizeof(str) = 1
265 1193568
>>193566
str - указатель.
И sizeof(str) не вернёт тебе размер char.
266 1193590
>>193554
Ну даже так у него все должно быть нормально в случае "4" и "-4" (на ideone например нормально, потому что размер указателя там 8), хотя он и долбоеб. Если только он не конпелирует какой нибудь устаревшей хуетой типа Турбо Си, где инт - 16-битовый (я знаю что есть преподаватели ебанашки которые не признают современных сред)
267 1193593
>>193590
Хз, у него вообще 3 символа вошло, как я понял, в обоих случаях.
268 1193594
>>193568
Ты упоротый что ли сука. Тебе же сказали, что у него система восьмибитная. Каким по твоему там должен быть размер указателя?
269 1193596
>>193593
Удалось записать != вошло. Затер какую-то переменную рядом с буфером, это и привело к спецэффектам.
270 1193598
>>193594
Любой, мать твою
bWIUmku4dbE.jpg129 Кб, 712x719
Пацаны помогите решить судьбу мою 271 1193604
Сейчас делаю дипломную для шараги, пишу консольную программку на си для своего роутера на openwrt. Мне это дико нравится и вставляет. Но проблема в том, что в этом суровом, жестоком, несправедливом мире байтоебы никому нахуй ненужны.
Есть другой вариант. Учить javascript и становиться фулстак макакой, задрачивать ноду. После того как отбатрачу на галере и наберусь опыта, открывать свой наебизнес, или по крайне мере буду сеньор помидором с деньгами в хипстеротусовочке. Но меня дико тошнит от слов html, css, photoshop и все что связано с версткой заставляет мой пукан нагриваться до такой степени что в нем можно заваривать воду для доширака.
Блять, что делать? Задрачивать после си кресты?
272 1193611
>>193604
оффтоп
но у меня горит шо пиздец
273 1193616
Как можно выводить динамическое дробное число полностью, без лишних нулей?
Если в printf использовать %f, то будут выводиться лишние нули в дробной части.
Если использовать %g, то число с большим количеством символов, выводится в %e формате.
Так с помощью printf'а это никак не реализовать? Может быть можно как-то принудительно заставить %g всегда отображать число в %f формате?
Или единственный вариант - сначала переводить число в строку, а затем печатать его fputs'ом?
274 1193618
>>193616
Лох ебаный блядь )) про модификторы не прочитал, хуесос тупорылый
275 1193622
>>193618
Я так понимаю, что у него постоянно меняется число, и ему надо выводить его без лишних нулей
>>193616
Нет, так чтобы компилятор за тебя думал, нельзя. Либо строкой, либо округлять до необходимого количества разрядов
276 1193625
>>193618
Писать %.100g - это ведь не решение.
Для %f вообще нет смысла в модификаторах точности
277 1193669
>>193625

> Писать %.100g - это ведь не решение.


Не решение. Но можно добавить символов, и будет норм. Вот тебе крайние случаи из старого треда, посчитай циферки и используй:
https://ideone.com/JyE5Qp
А так, зависит от задачи. Для показывания человекам округленное значение или %g с достаточной точностью - вполне норм (и пусть оно экспоненту показывает, если не хватило). Для передачи текстом между двумя машинами есть %a.
278 1193672
>>193611
Значит байтоёбство - всё? Низкоуровневое погромирование больше никому не нужно? А я только вкатываться собирался ну и подумываю о том, что бы в битки начать вкладываться
279 1193676
>>193672
Такая же хрень, парни. Непонятно как вкатываться. Мимостудент, угорающий по С с плюсами и без и крутому софту который на них пишут.
280 1193678
>>193676
Эмбеддед же.
281 1193682
>>193676
Гейдев
282 1193729
Вы заебали смотреть на веб-макак. Прыщи/спермятина на ноде что ли уде стали работать? С и кресты там в почёте, микроконтроллеры, всякий настольный софь типа эдоуб, да куча направлений, где «байтоёбство» пригодится.

Не драматизируйте. Сами же не хотите участвовать в разработке каких-нибудь БД, ядер и т.п. Остальное уже отдано на растерзания стервятникам скриптоводчиских языков программирования. Да и там в принципе есть ниша с диез. Без работы уж точно не останитесь.
sage 283 1193731
>>193729

> есть ниша с диез


C и C# имеют столько же общего, сколько свинка и морская свинка.
284 1193732
>>193731
О рили блядь? Открыл нахуй омерику ебана в рот. Я написал в ироничном контексте про нищу, если уж совсем прижмет, то мложно будет окунуться в этот пиздец, если кресты не осилите.
285 1193742
>>193729
Шизофрения какая-то.
286 1193759
>>193729
Байтоёбу неприятна. Гоните его с рынка труда, насмехайтесь над ним.
287 1193791
>>193678
За 50 тысяч и невыездом из России на 10 лет?
Нет, спасибо.
288 1193792
>>193503
А сам чем по жизни промышляешь?
289 1194854
>>193791

>За 50 тысяч


Примерно. Сильно дохуя платить не будут.

> невыездом из России на 10 лет?


Такое не очень часто бывает. И не всегда знание гос.тайны влечет невыезд.
290 1194945
Научите меня управлять паматью в С. Полгода назад пришлось написать небольшой сервер SOCKS4 с плюшками. Долго ебался с неблокирующими сокетами и libev пока не понял как сделать. Добавляя новый шаг к протоколу приходилось прогонять прогу с валгриндом для того, чтобы найти утечки.
Серьезно, шаг влево, шаг вправо, пропустил один return и получай лопату дерьма в лицо. Как вы, блядь, ебетесь с этим всем?
291 1194948
>>194945

>Как вы, блядь, ебетесь с этим всем?


Опыт и паттерны, выделил память не забудь убрать. Все просто.
292 1194951
>>194945
Да вроде бы язык из 1968 года не рассчитан на многопоточность. В следующий раз возьми C++11 или Rust.
293 1194965
>>194945

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


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

> пропустил один return


А что, в других языках, если у тебя код с багами, программа все равно магически работает?
294 1194977
>>194951
А при чем язык, если многопоточность удел ОС?
295 1194995
>>194977
Блять нихуясебе. Все больше убеждаюсь что C самый адекватный тред тут
296 1195001
>>194995
А как называется та хуйня, когда есть несколько ядер и часть программы (например, цикл) одновременно считается на каждом из них?
Это тоже свойство системы или низкоуровневые языки имеют команды типа "эту ерунду считает процессор номер n"?
297 1195002
>>195001
Это свойство ОС, безусловно, описанное на низком уровне
298 1195015
>>194995
Был, пока ты не пришел.
299 1195019
>>194977

> многопоточность удел ОС


Не только. Например, до С11 по стандарту весь рантайм был не thread-safe. Всякие errno и прочие strtok были одни на всю программу. Модель памяти не предусматривала никакой синхронизации (нет, volatile - не то). Понятно, что реализации стандарта это все фиксили, но не было никаких гарантий, что на такой-то ОС и с таким-то рантаймом все будет работать.

>>195001
Ты имеешь в виду (полу)автоматическую параллелизацию вроде OpenMP. Для нее должна быть поддержка в языке (чтобы обрабатывать аннотации и дергать библиотеку), и в Си (в виде расширения, конечно) эта поддержка есть, гугли #pragma omp.
300 1195022
>>195015
Мамку твою ебал
301 1195041
>>194965

>если у тебя код с багами


Если это просто утечка, то да. У белых людей есть умные указатели.
302 1195046
>>195041
Умные указатели не бесплатные. И без них вполне можно жить.
303 1196111
Где почитать, как битки двигать?
Такие нубские вопросы типа "А как установить в char val i-ый бит в значение k=0,1?" Ведь одной И или ИЛИ не обойтись.
Там много комбинаций из двух действий можно придумать с этими вот ^, &, |, ~. Какая считается лучше?
304 1196115
>>196111

>как битки двигать?


<<

>>


Теперь ступай с миром нахуй
305 1196116
>>196115
Не гринтексти мне тут райт шифтом.
306 1196118
>>196116
А ты мне запрети, мальчик.
307 1196119
>>196118
Время скоро запретит, старый пердун
308 1196121
>>196119

>скоро


Здесь мы идем.
309 1196124
unsigned char из какого стандарта?
310 1196158
>>196124
Pre-K&R еще. В C89, естественно, есть. А вот uint8_t и stdint.h появились в C99.
311 1196159
>>196111
Классическая статья: https://graphics.stanford.edu/~seander/bithacks.html
Нет, комбинаций не так много, с xor биты переключают, с | включают, с & ~ выключают. Остальные варианты как минимум длиннее.
312 1196200
>>187521 (OP)
Сап, бояре.
Очень мало писал на си, в основном на крестах.
Но тут внезапно вяли на работу, написание драйверов под сетевые адаптеры на linux/windows, чтобы такого можно почитать, чтобы хоть чуть-чуть что-нибудь понять?
в си не углублялся, в крестах чувствую себя более-менее
313 1196567
Есть ли какой-нибудь опенсорсный небольшой проект чисто на Си желательно еще и с WinAPI, в котором вот прямо отличный код, эталон?
315 1196684
>>196200
Никаких идей?
316 1196716
>>196684
Ну разве что Эндрю Таненбаума...
317 1197058
>>196716
Книга есть где-нибудь?
Или самому поискать?
318 1197128
>>197058

> Книга есть где-нибудь?


Где-нибудь есть.

> Или самому поискать?


Поищи.
А вообще, стоит знать, что существуют примерно два крупных сайта с учебниками, ели там нет, с большой вероятностью нигде нет.
319 1197132
>>197128
А что за сайты, если не секрет?
320 1197562
Можно ли как-то исхитриться с макросами, что бы объявлять глобальные переменные в функции?
321 1197575
Вот такой чек на byte order:
unsigned long endian=1;
unsigned char isbigend=(!∗((char ∗)&endian));
Но это не будет работать, если sizeof(unsigned long)=sizeof(char). В C89 есть тип, который гарантированно больше, чем char.
ЕМНИП, там везде неравенства нестрогие.
322 1197576
Аноны помогите дураку, начал читать классику в лице K&R, ну и возник затык, почему этот код не делает что должен? По идее должен считать количество символов/строк, но этого не происходит.
линукс, компилирую tcc
При этом на ideone все компилируется и работает как надо, в чем проблема? В компиляторе? В эмуляторе терминала? Что я делаю не так?
323 1197577
>>197575

> В C89 есть тип, который гарантированно больше, чем char?

324 1197597
>>197576
Ты уверен что тебе нужен for(...); вместо for(...){}?
325 1197807
>>197575

> В C89 есть тип, который гарантированно больше, чем char.


Теоретически нет. Но так как ты все равно детектишь байт-ордер, то тебе, вероятно, хочется свопать байты, а если sizeof(char) == sizeof(long), то свопать тебе нечего, и можешь считать endianess любым. А если у тебя все же настоящие восьмибитные байты, то завези себе stdint из C99, хотя бы частично. Работы по портированию на новую архитектуру - пара минут, удобство зашкаливает.

>>197576

> но этого не происходит.


А что происходит? А Ctrl+D в конце ввода ты тыкаешь, чтобы сказать терминалу, что завершил ввод и получить EOF в программе? Алсо можешь делать ./govnokod < filename (собственно, ideone нечто подобное и делает).

>>197597
Да, для его for() не нужно тело.
326 1197816
Помогите студенту
Есть ASP.NET и DataGrid c данными из SQL
1)Как изменить вывод данных, то есть вместо N выводится N/5 или N+5.
2)Как добавить колонку, созданную из значений двух колонок, например Column1 = Column 1 + Column2
3)Как привязать графики к значениям колонки?
sage 327 1197866
sage 328 1197886
>>197816
Во первых, ты проебался с тредом. У нас тут сишечка а не шарп.
Во вторых, с лабами иди нахуй!
sage 329 1197904
>>197816
Какая-то неизвестная мне сишечка. где в документации прочитать про DataGrid?
330 1197937
>>197886
>>197904
Извините, действительно не туда.
331 1198044
В общем треде проигнорили, поэтому соре, дублирую здесь.

Уважаемые опытные программистеры, помогите выбрать.
Хочу заниматься разработкой (gamedev в идеале), но все мы прекрасно знаем, что без опыта нахуй кому нужен. Есть возможность поработать скриптизером на C (нагрузочное тестирование), стоит ли тратить время на получение хоть какого то официального опыта или продолжать попытки самообразования в надежде найти работу потом?
332 1198046
>>198044
Юзай любую возможность получить опыт
333 1198133
>>198044
Ради опыта можешь и поработать.
но вкатываться в гейдев с одним лишь си, ну такое себе
334 1198437
По какой литературе изучить GAS?
Хочу инлайны свободно пилить потом.
335 1198454
>>198437
3,5 говнокниги, нахуй оно нужно. Вруби интеловский синтаксис и не еби небе мозга.
336 1198640
>>192344
Нинужно /thread
sage 337 1198642
>>198640
Автовывод не нужен, неймспейсы очень нужны. Особенно нужны неймспейсы для енумов (и типы заодно).
338 1198645
>>198642
Иди свой язык пили, C++ и C-- уже есть. Пусть будет C==
339 1198677
>>198645
А потом скатится в очередное унылое говно
341 1198868
sage 342 1198965
>>198645
Я не считаю себя настолько крутым. Компилятор напишу, юзабельный язык - вряд ли.
sage 343 1198997
>>198965
Тащемто даже компилятор не нужен, достаточно написать транслятор в си, а уж сишечку чем угодно компилировать. Ранние кресты так и делали.
но да, написать что то отличное от говна надо неибацца скил иметь, а то выйдет по типу котлина
152679001819955172.jpg96 Кб, 700x933
344 1199007
>>198997

>котлин

sage 345 1199014
>>199007
Ну они хотели как лучше, вышло как всегда.
хуево, очень
1524056229128758608.jpg16 Кб, 400x222
346 1199031
>>199014

>JetBrains


>хотели как лучше

thoughtful comment.png51 Кб, 395x104
sage 347 1199054
>>198997

> Ранние кресты так и делали.


И получался пикрелейтед. Первое издание "Как испортить Си классами" за авторством некоего Страуструпа
thoughtful comment.png90 Кб, 419x159
sage 348 1199057
>>199054
Облажался с пиком.
sage 349 1199060
>>199054
Ну я чисто пример привёл, все таки писать компилятор будет сложнее, даже сейчас есть пара неплохиххоть и хипстерских языков транслируемых сначала в си.
sage 350 1199064
>>199060

> Ну я чисто пример привёл


А я просто почему-то вспомнил. Вроде ко второму изданию они компилятор уже пофиксили. И нет, я с тобой не согласен. Для кодогенерации есть LLVM, а лексер/парсер все равно писать так или иначе.
sage 351 1199068
>>199064

>llvm


Компилятор тогда в 640кб не уместить
352 1199573
Сап, анон. Пытаюсь в .txt парсер забуриться. Раскидай мне, плес, стоит ли мне strtok() юзать или же навелосепидировать собственный токенизатор?
353 1199582
>>199573

> в .txt парсер


Лолшто? Что ты там парсить собрался?

> стоит ли мне strtok() юзать


Ну strtok умеет делать токены только по разделителям. Если у тебя нет четких разделителей, то очевидно свой, а если есть, то все равно свой, но внутри strtok() можно заюзать.
354 1199593
>>199582

>Если у тебя нет четких разделителей


В смысле чётких? Я могу слова в качестве шаблонов для разделения задавать?

>Что там парсить


Ну, велосепидирую тут частотный словарь. Интересно получится или нет. Но чтобы в начале не обосраться решил погуглить, а не набивать шишки. Ну, в примерах нет слов в качестве разделителей.
355 1199597
>>199593

> Я могу слова в качестве шаблонов для разделения задавать?


Нет, только список символов, любой из них будет разделителем. Ты можешь по пробелам разбить на слова strtok()-ом, а дальше велосипедить.
356 1199600
>>199597
Спасибо анон. Чая тебе и пончиков.
6832E065-7BAE-4353-B783-AC15757BE2D6.png311 Кб, 1136x640
357 1199902
Привет ананасы. Объясните как можно подробнее про библиотечные файлы в языке си мне(изучающему язык). Расскажите про то где на самом деле находится определение функций(таких как принтф сканф или геткэр путкэр и тд), что еще помимо прототипов находится в библиотечных файлах (таких как stdio.h, stdlib.h) и зачем оно там. Почему в 1 издании книги брайана кернигана и денниса ритчи в примерах с кодом не подключались заголовочные файлы(пример на картинке) и почему в ос убунту мне приходится прибегать к танцам с бубном при подключении библиотечного файла math.h и вызове функции (sqrt() например), прога не компилится и приходится прописывать дополнительные команды вроде -lm(зачем она вообще нужна я хз). В общем вопросов много, выручайте, очень интересно
358 1200083
>>199902

> Почему в 1 издании книги


> не подключались заголовочные файлы(пример на картинке)


Потому что старое говно. Во-первых, был (только в С11 окончательно убили) неявный int - если для функции не указан или не известен тип возвращаемого значения, считается, что она возвращает int (как main() у тебя на пике), если для переменной не указан тип (static foo = 1), то она опять же считается интом. Дальше для аргументов: если скобки в декларации пустые (как в main() на пике), считается, что функция может принимать любое количество любых аргументов (которые подлежат default argument promotions >>1187393, пока не смыло). Поэтому в отсутствие всяких деклараций твой printf на пике означает "функция, которая возвращает int и принимает любые аргументы". Проверка типов не производится, поэтому если облажаешься, компилятор тебе об этом не скажет.

> Расскажите про то где на самом деле находится определение функций


Определения (точнее, уже скомпилированные в машинный код реализации) лежат в объектных файлах, лежащих внутри библиотечных файлов (которые на самом деле просто архивы с индексом), объявления в заголовчных файлах.

> зачем оно там


Чтобы не писать объявления вручную каждый раз.

> почему в ос убунту мне приходится прибегать к танцам с бубном при подключении библиотечного файла math.h


Потому что в math.h написано лишь "сап, гцц, есть где-то в природе такие функции, которые называются так-то, берут такие-то аргументы и возвращают значения такого-то типа". А откуда реализацию брать - не написано, это вне компетенции компилятора, это ты должен сказать линкеру.

> приходится прописывать дополнительные команды вроде -lm(зачем она вообще нужна я хз)


Обычно существует какой-то вариант libc - библиотеки, в которой содержится реализация стандартных сишных функций. Существует механизм, который позволяет передать из компилятора в линкер директиву "при линковке этого объектного файла самостоятельно подключи эту библиотеку". И при компиляции сишных файлов с помощью этого механизма подключается libc без каких-то дополнительных телодвижений с твоей стороны. По идее, в libc должна лежать и математика тоже, но по техническим причинам (в том числе из-за разнообразия реализаций математических функций в зависимости от платформы) в Linux она лежит отдельно, и компилятор не подключает ее неявно, и поэтому тебе приходится говорить линкеру, чтобы он подключил библиотеку (-l), которая называется libm.a (-lm).
358 1200083
>>199902

> Почему в 1 издании книги


> не подключались заголовочные файлы(пример на картинке)


Потому что старое говно. Во-первых, был (только в С11 окончательно убили) неявный int - если для функции не указан или не известен тип возвращаемого значения, считается, что она возвращает int (как main() у тебя на пике), если для переменной не указан тип (static foo = 1), то она опять же считается интом. Дальше для аргументов: если скобки в декларации пустые (как в main() на пике), считается, что функция может принимать любое количество любых аргументов (которые подлежат default argument promotions >>1187393, пока не смыло). Поэтому в отсутствие всяких деклараций твой printf на пике означает "функция, которая возвращает int и принимает любые аргументы". Проверка типов не производится, поэтому если облажаешься, компилятор тебе об этом не скажет.

> Расскажите про то где на самом деле находится определение функций


Определения (точнее, уже скомпилированные в машинный код реализации) лежат в объектных файлах, лежащих внутри библиотечных файлов (которые на самом деле просто архивы с индексом), объявления в заголовчных файлах.

> зачем оно там


Чтобы не писать объявления вручную каждый раз.

> почему в ос убунту мне приходится прибегать к танцам с бубном при подключении библиотечного файла math.h


Потому что в math.h написано лишь "сап, гцц, есть где-то в природе такие функции, которые называются так-то, берут такие-то аргументы и возвращают значения такого-то типа". А откуда реализацию брать - не написано, это вне компетенции компилятора, это ты должен сказать линкеру.

> приходится прописывать дополнительные команды вроде -lm(зачем она вообще нужна я хз)


Обычно существует какой-то вариант libc - библиотеки, в которой содержится реализация стандартных сишных функций. Существует механизм, который позволяет передать из компилятора в линкер директиву "при линковке этого объектного файла самостоятельно подключи эту библиотеку". И при компиляции сишных файлов с помощью этого механизма подключается libc без каких-то дополнительных телодвижений с твоей стороны. По идее, в libc должна лежать и математика тоже, но по техническим причинам (в том числе из-за разнообразия реализаций математических функций в зависимости от платформы) в Linux она лежит отдельно, и компилятор не подключает ее неявно, и поэтому тебе приходится говорить линкеру, чтобы он подключил библиотеку (-l), которая называется libm.a (-lm).
359 1200089
>>200083
чел, ты охуенный, но я, например, тоже все это знаю
просто не пиши и не отвечай ньюфагам irl
надо будет, сами будут грызть книги и копать вглубь
а так ты им за 5 минут объяснишь то, на что потратил недели лютого задротства, сидения под отладчиком и чтения манов
это то же самое что и продавать бананы по 5 рублей, когда они стоят 45
360 1200102
>>200083

> только в С11 окончательно убили


То есть теперь за типы long или unsigned компилятор пошлет тебя нахуй?
361 1200108
>>200102
Нет, но скорее всего кинет предупреждение при компиляции
362 1200117
>>200102
Нет, long - это синоним long int, unsigned - синоним unsigned int, это просто сокращенные формы записи. А неявный int используется, когда ты по каким-то причинам вообще не указал тип, как тут тип bar и типы возвращаемых значений у printf, foo и main, например:
foo(bar) { printf("%d\n", bar); }
main() { foo(1); }
363 1200296
>>200089

> irl


но это же двачь
364 1200302
>>200083
Охуеть ты расписал. Спасибо.
365 1200663
В какую сторону копать, чтобы кодить многопоточные программы на C?
366 1200671
>>200663

> В какую сторону копать, чтобы кодить многопоточные программы на C?



1) структуры данных (для многопоточности тебе обязательно понадобятся очереди)
2) примитивы синхронизации
3) непосредственно само api дл создания потоков.
4) сосание хуйцов с классическими многпотокопроблемами и размышления "как же я докатился до жизни такой"
5) переосмысление сути работы с данными в многопоточных приложениях, появление понятий о Thread Pool (делать потоков больше чем ядер процессора - бессмысленно), понятий о джоба=х и командах (оппа, если мы разобьем все системы нашей софтины на мелкие задачки, которые будем скармиливать пулу потоков, то мы и от многих проблем избавимся и получим турбо-производительность, правда чтобы оба сразу думать над архитектурой придется дольше)
6) Придти к понятию акторов как вершине пройденых пунктов.
367 1200684
>>200671
Спасибо за путь.
368 1200735
>>200671

> делать потоков больше чем ядер процессора - бессмысленно


Да что ты говоришь? На iowait висеть уже не модно?
369 1200737
Почему не нужно использовать плагины компилятора?
370 1200739
>>200737
Что такое "плагины компилятора"?
371 1200950
Я мамкин оптимизатор, и всегда, когда можно сэкономить пару байт, пару инструкций, я это делаю. В последнее время я всё больше задумываюсь над целесообразностью этого. Например, вместо enum я сую варианты в define, а саму ячейку делаю char, правильно ли это, или я слишком сильно оптимизируют и можно всё в инт сувать и ок?
372 1200955
>>200950
Всё целесообразно задаче.
Сидеть на жирушном x86 и делать такое это дебилизм, канеш
373 1200959
>>200950

>в инт сувать и ок?


Ну да, твой чар всеравно 8 байт не занимает, если это не массив.
374 1200982
>>200959
А почему он занимает не 8 байт? Байт минимальная единица, не?
375 1200993
>>200950

> вместо enum я сую варианты в define


Все так делают. Typed enum из крестов нам не завезли, а иначе какие-нибудь битовые флаги не создашь, будет ругань, что в int не влазит.

> саму ячейку делаю char


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

> или я слишком сильно оптимизируют


С возврастом это проходит.
376 1201000
>>200982
Потому что выравнивание.
377 1201001
>>200739
Полагаю, речь идет о расширениях.

>>200737
Если ты говоришь про плагины IDE (среды разработки, в которой ты пишешь код, нажимаешь Run и т.д.) - пользуйся, почему бы нет? Но НЕ для контроля версий. Для этого в твоей среде должна быть всего одна кнопка, аналог Run Command Prompt в Visual Studio, ты должен нажимать ее и делать git add -A git commit git push и всю эту херню.

А если ты про расширения компилятора, то вот почему: твой код портируют с одной популярной системы на другую, а там внезапно нет твоего компилятора или есть, но хуевый, и тогда твой код летит в пизду.
378 1201092
Пишет кто-нибудь под андроид на C? Как оно?
379 1201137
>>187521 (OP)
что делает код:
arr1[arr2[count++]]++;
?
380 1201145
>>201137
index = arr2[count]
count = count + 1;
arr1[index] = arr1[index] + 1;
Мог бы и сам разобрать.
ScreenshotЯндексБраузер20180602-012138.png111 Кб, 720x1280
381 1201150
>>201137
Обращается к arr2[count], увеличивает count на 1, обращается к arr1[arr2[count]], <- здесь значение то, что было в начале, то есть обращение к arr2 не происходит снова грубо говоря.
382 1201152
>>201150
А, там ещё стоит ++, ну в общем потом значение внутри ячейки ещё увеличится, ну написали вроде уже.
383 1201220
>>200993

>Выигрываешь по памяти (возможно), проигрываешь по


>инструкциям, потому что для манипуляций потребуются


>всякие лишние movzx/movsx.



Посоветуешь материалы, чтобы понять, как правильно?
384 1201300
>>201150
>>201145
Разве он сначала не плюсует count, а потом использует его как индекс для arr2?
385 1201414
>>201001

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


Двачую, испытываю анальные боли из за того что в коде используют расширения от gcc, потом хуй клангом скомпилируешь
386 1201502
>>201300
Нет, я же скинул пруфпик.
387 1201533
>>201220
Не знаю. Сильно зависит от компилятора и архитектуры. Поглядывай в годболт, если так уж хочется "оптимизировать".
388 1201538
>>201533

>годболт


Что это?
389 1201549
>>201538
В шапке же есть. godbolt.org. Показывает, как компилируется твой код разными компиляторами.
390 1201559
есть какой-нить более мощный бесплатный аналог http://www.pythontutor.com/visualize.html#mode=edit?
391 1201561
>>201559
Во-первых, почему ты спрашиваешь про питон здесь? Во-вторых, раз уж ты спрашиваешь здесь, то да, есть, можешь взять любую IDE, зайти в отладчик, зажать F7 или F11 и смотреть на что-то похожее.
392 1201564
>>201561
там не тока питон, можно язык выбирать
393 1201627
>>200950

> Я мамкин оптимизатор, и всегда, когда можно сэкономить пару байт, пару инструкций, я это делаю. В последнее время я всё больше задумываюсь над целесообразностью этого. Например, вместо enum я сую варианты в define, а саму ячейку делаю char, правильно ли это, или я слишком сильно оптимизируют и можно всё в инт сувать и ок?



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

1) По максимуму загрузить АЛУ независимыми арифметическими командами. То есть конкретная такая лапша, разворачивание циклов, одна команда SSE/AVX, следом арифметические команды вообще из другой оперы, вот это вот всё.

2)Ликвидировать промахи кеша. Самая главная проблема современного кода не в коде, а в доступе к данным, при котором в кеше данных не оказывается и процессор превращается в тыкву. Избавляемся превращением множества жирных структур в одну структуру, каждое поле которой - массив.

struct{int a1,a2,a3...a100500} huita; huita[] => struct{int a1[],a2[],a3[]...a100500[]};
394 1201630
>>201627

Короче простым избавлением от жирных структур (жирная - это когда размер больше кеш-линии) и превращения многомерно-иерархических структур данных в линейные достигается самая охуенная производительность. В ассемблер сегодня есть смысл лезть разве что для явной SIMD-арифметики, если таковая тебе нужна.
395 1201655
оптимизаторы сверху, вот типа создаешь структуру, в зависимости от разрядности между полями будут пробелы какие-то, тобиш условно структура будет весть не n байт, а n*x байт. Что мешает выравнивать структуры шоб меньше памяти занимали?
396 1201672
>>200950
Смысла выбирать более узкие типы с переходом на 64 бита нет никакого. Добьёшься своим char-ом только того, что у тебя в регистре будет 56 лишних, неиспользованных бит и всё. Работа со старшими битами регистров не трогая младшие в машинных кодах достаточно сложна, и компиляторы обычно не заморачиваются. По памяти тоже не выиграешь - выравниваются переменные все равно минимум по границе машинного слова - тех же 64 бит. Убавишь выравнивание - будет алиасинг, когда у тебя несколько переменных в одном слове памяти и обращение к одной тормозит обращение к другим.

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

В остальном просто расслабься и пиши понятный код.
397 1201673
>>201655
1. Штраф производительности на чтение невыравненных переменных.
2. Альясинг: https://en.wikipedia.org/wiki/Aliasing_(computing)#Conflicts_with_optimization
398 1201678
>>201627

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


Ты и сюда это принес? Это сильно, очень сильно зависит от данных и характера их обработки. Но в общем случае, если структуры не слишком большие, элементы-структуры в массиве лучше, чем структура параллельных массивов.
399 1201682
Сделал подобную дичь для удобства. Это не быдлокод?
#define dynamic(type, name) type name=(type)malloc(sizeof(type))
400 1201684
>>201682
Это бессмысленно и опасно, потому что возвращаемое значение ты проверить забыл. Если лень писать вручную, сделай сниппет для IDE.
401 1201687
>>201684
Там указатели макаба скушала. А какая тут опасность-то?
И есть толк все переменные выделять динамически, чтобы удалять их по мере использования?
402 1201689
>>201687

> А какая тут опасность-то?


malloc() вернет NULL, ты упадешь.

Ты все тот же мамкин оптимизатор? Ты знаешь, что такое куча? Ты правда веришь, что если ты сделаешь free(), то программа будет занимать меньше памяти? В чем смысл "удаления" переменных, если указатель все равно останется, пока ты не выйдешь из его области видимости? А еще ты можешь забыть free() и протечь памятью. Зачем все это?
403 1201690
>>201687
Нет, только лишние syscall'ы кидать
404 1201692
>>201690
И как часто malloc() syscall-ы дергает?
405 1201693
>>201692
Когда кучу надо расширить.
406 1201694
>>201689

>Ты все тот же мамкин оптимизатор


Уже другой. Спасибо, как понял указатель в стеке будет все равно висеть.
407 1201696
>>201689
Блять ассемблер
408 1201729
ребята как учить стандарты если они выходят быстрее чем ты успеваешь их учить
409 1201732
>>201689
Вернулся мамкин оптимизатор
Разве malloc возвращает NULL не тогда, когда новую память выделить не реально, и вероятность того, что у юзера не будет новой памяти на столько мала, что можно и не проверять?
410 1201734
>>201732
Деды проверяли, и ты проверяй.
Ишшо себе выдумал!
411 1201738
>>201729
Попробуй научиться читать не по слогам.
412 1201740
>>201732

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


Ну если у того анона сверху тип - не структура на несколько мегабайт - вероятность мала. Но в целом, и память, и своп вполне могут кончиться, если что-то ее выжрет и/или протечет.
413 1201844
>>201729
Не учи плюсы
414 1201847
>>201732
То есть С++ new лучше malloc'a.
415 1201894
>>201732
Вообще — нет.
Пример линукс:
https://linux.die.net/man/3/malloc

> By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. In case it turns out that the system is out of memory, one or more processes will be killed by the OOM killer.



Проверять всё равно нужно, потому что NULL может прилететь, даже если в ОС ещё не кончилась память, например если память фрагментирована, а тебе нужен большой кусок.

Использование NULL'а не обязательно приведёт к немедленному падению проги, а так же ведёт к дырам в ней.
416 1202006
А если использовать в структурах мелкие типы типа char, распологая их друг за другом, чтобы не было проблем с вырваниванием?
417 1202010
Хелло. Есть несколько регистров, мне нужно выбирать их
в зависимости от порта. Хотел бы сделать макро, чтобы работал так:
макро(идентификатор нужного регистра) |= пин;
идентично строчке
нужное_имя_регистра |= пин;

Насколько реально такое сделать и, если это реально, то как?
418 1202011
Парни, кто-нибудь на Си-шке (не C++) коммерчески шпилит? Какой фреймворк для тестов используете?
419 1202088
>>201894
Но ты спастил отрывок со случаем, когда malloc() возвращает non-NULL но памяти нет, т.е. противоположный случай.
Но это не отменяет того, что то, что ты сказал - верно
420 1202093
>>202010
Пример написал бы, как оно должно выглядеть. Возможно, ты хочешь приклеивать к имени порта аргумент:
#define PORTA_REG1 0x10002000
#define PORTA(reg) PORTA_##reg

PORTA(REG1) // Раскроется в 0x10002000
421 1202130
>>202011
у си-богов все сразу работает
сириусли, как часто ты встречаешь проект у которого модульные тесты и на нагрузку есть?
то то же
422 1202134
>>202130
Дело не в том, что все работает. Дело больше в том, что проблемы в Си часто связаны с undefined behavior, а обнаружить многие такие случаи тестами сложно, поведение может поменяться на противоположное на другой машине со слегка отличающейся версией компилятора. Поэтому на Си популярный ныне подход "напишем говно, покроем тестами и будем править баги" получается себе дороже, лучше сразу нормально писать.
image.png336 Кб, 1920x1080
423 1202145
Сделал небольшую обертку вокруг WinAPi. Это полезно?
424 1202151
>>202145
Полезно. А теперь оберни иксы еще так же. И постарайся не ошибиться тредом в следующий раз.
425 1202154
>>202151
Они тоже ебанутые как WinApi?
426 1202164
>>202154
Windows API вполне вменяемый API. Ненормально там обилие ненужных дублирующихся типов, тонны легаси и неконсистентное поведение некоторых функций (типа NULL vs. INVALID_HANDLE_VALUE), но в целом оно вполне юзабельное.
427 1202365
>>202164
Если бы оно создавалось во времена крестов, то ООП там не был бы таким непонятным.
428 1202367
двач у меня горит
lde под линукс
codeblocks отказано в доступе при коомпиляции
еклипс в жопу эклипс
cilon тормозит пиздец и тоже сука нихуя не коомпилирует
неужели придется как ввинде делать все в ручную через консоль
я понимаю что линукс это консоль
429 1202380
>>202367

>codeblocks отказано в доступе


Запусти под sudo.
Сделай простой скрипт для компиляции, если лень тыкаться.
430 1202991
>>201894
Хочешь сказать, каждый раз проверять всё же нужно?>>118
431 1202996
>>202991
Да. Но если ты какой-нибудь сервис, который может упасть относительно безболезненно, ты можешь сделать обертку для malloc() с if (!ptr) exit(1) внутри, а снаружи не задумываться. Так, например, происходит в крестах, где operator new бросает исключение, которое очень редко кто-либо пытается ловить.
432 1203138
>>202130
>>202134
Вы как-то неправильно понимаете суть TDD.

Если новая функциональность приводит к ошибкам, тесты, если они, конечно, есть, сразу же это покажут. При работе с кодом, на который нет тестов, ошибку можно обнаружить спустя значительное время, когда с кодом работать будет намного сложнее. Хорошо протестированный код легко переносит рефакторинг. Уверенность в том, что изменения не нарушат существующую функциональность, придает уверенность разработчикам и увеличивает эффективность их работы.
433 1203324
>>202996
Если память нельзя выделить, то вернутся NULL, и когда я к нему обращусь - получу segfault и аварийный выход. Segfault на столько нежелателен, что лучше добавить if ()?
434 1203361
>>203138
да я там иронизировал, просто бесит что многие опенсорсные решения вообще нахуй без тестов, тупо на хомячках ошибки вылавливают, на юзерах по сути
конечно тесты и сишникам нужны
тупо регрессию проверять (что ты и расписал)
другое дело что все же статически типизированный язык и процесс компиляции есть, плюс утилиты стат и дин анализа есть, это очень помогает, сокращает собственно объем тестов
ну, да, тоже в роли капитана очевидность выступил, да ладно
хорошо, например, организованы тесты в sqllite, если кто не знает, как организовать у себя покрытие тестами чистого сишного кода, может туда глянуть
435 1203495
>>203324

> и когда я к нему обращусь - получу segfault и аварийный выход


При обращении к нулевому указателю возникает undefined behavior. Undefined - значит может произойти все что угодно, не обязательно сегфолт. Даже если ты понимаешь, как реализована стандартная либа и как ОС выделяет память, предположения об undefined behavior нужно делать крайне осторожно или лучше не делать никаких предположений вообще. Особенно если ты считаешь, что лучше всех все знаешь. Вот тебе крайне надуманный пример с кучей "если", который, тем не менее, отлично иллюстрирует сабж: https://ideone.com/QepQ2j
436 1203548
>>203495
А можешь объяснить, что происходит в функции? В чем суть битового сдвига и как вообще мы аллоцируя память в куче изменили статическую переменную, которая вообще в регионе данных должна быть?
437 1203576
>>203548

> А можешь объяснить, что происходит в функции?


Переделал на массив байтов, чтобы было понятнее. Обращение к элементу массива ptr[index] - это синтаксический сахар для ∗(ptr + index) (используется арифметика указателей, но теперь, с байтами, это просто сложение), а учитывая что ptr == NULL, т.е., 0, то происходит ∗(0 + index), т.е., просто ∗index, т.е., так как начало "массива" у нас по адресу 0, мы просто пишем по адресу is_admin и перезаписываем его.

> В чем суть битового сдвига


Бессмысленное деление на два, ни на что уже не влияет (все равно NULL прилетит), убрал. Но вообще, есть аллокаторы, которые по техническим причинам не могут выделить больше, чем SSIZE_MAX (знаковый), а это как раз половина SIZE_MAX.
438 1203589
>>203576
Мощно, спасибо.
439 1203973
сап ананасы. Если скомпилированный код на языке си преобразуется в инструкции на машинном языке то почему я могу запускать .exe файлы на одной и той же ос но с разным железом? ведь вроде как инструкции у каждого процессора разные?
440 1203995
>>203973
По большей части одинаковые.
441 1203996
>>203973

>разным железом


Под разным железом имеется ввиду очень разное железо. Например, разные архитектуры процессоров в целом или разные поколения одной и той же архитектуры, если приложение использует какие-то инструкции под конкретное семейство (вот у меня так сейчас).
442 1204007
>>203973

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



Потому что они компилируются по-дефолту, если флаги не указывать для 386 - 32х битные и для Athlon 64 (максимум SSE2) - 64 битные. Добавь -mavx2 -O3 и попробуй какой нибудь числодробительный код написать вроде умножения матриц, а потом запусти на процессоре, который все это дело не поддерживает - получишь ошибку времени выполнения.
443 1204087
Думаю перекатиться с крестов к вам. Всё правильно делаю?
444 1204091
>>204087
Конечно, а потом на Фортран
445 1204159
По заданию надо реализовать две "базы данных" и ГУИ (консольный) для манипулирования ими. Сами "базы" в принципе есть, как двусвязные списки. Саму консольную гуишку навасянить тоже не проблема. Но вот вопрос - а как между ними данные-то гонять? Вот, например, получить из одной "базы" некие данные и в нужном месте вывести. Мне их функцией вытаскивать из списка в виде строки? Или сразу структурой, чтобы удобно выводить, редактировать и обратно упихивать?
446 1204162
>>204087

>Всё правильно делаю?


Ну если ООП не твое, то да.
447 1204166
>>204159
SQLite юзай
448 1204171
>>202011
>>202130
>>202134
>>203138
>>203361

Ну вот у ребят из exercism.io тесты на неком фреймворке Unity.
http://exercism.io/languages/c/about
http://www.throwtheswitch.org/unity/

Выглядит вполне читаемо.

>>202011-рубист-на-районе
449 1204180
>>204171

> valgrind


-fsanitize
451 1204535
>>204162
Писал довольно долго на плюсах на уровне "немного лучше залётного ньюфага", потом по работе понадобилось писать на чистой сишке — тогда-то я и понял, что ооп нахуй не нужно само по себе как стандарт, а только в тех случаях, которые этого требуют. И когда пишу на сишке , то прям очень открыто и чисто понимаю, почему в плюсах те или иные вещи сделаны/переделны/добавлены.
452 1204688
>>197576
дядь про скобки не забывай фигурные. все что должно выполняться в цикле обязательно должно быть в фигурных скобках. да это си а хули ты хотел, чтоб компилер по табуляции тебе определил что входит в тело а что нет? программа подсчета символов содержит ошибку после скобки в for не нужна точка с запятой. Если не шаришь в точках следования то лучше читай прату для начала.ВДУМЧИВО
453 1204729
>>204688

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


Если в теле одна строка, как в примерах дяди, то скобки не нужны для тела условия и тела цикла. Всё у него правильно.
454 1204731
Хотя у него там ; после фора лишняя.
455 1204767
>>204729

>Всё у него правильно.


Посмотри ещё раз.
456 1204770
>>204729

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


На деле так писать - пидорство.
457 1204816
>>204770
Согласен, скобки лучше не опускать, понижает читаемость.
458 1204848
>>204816
Особенно когда там вокруг пачка #ifdef, затем после условия скобкок нет, но есть else, после которого блок уже в скобках. Получается полный пиздец, по три раза перечитываешь.
3123.png161 Кб, 1280x1024
459 1205784
создаю нахуй массив из 5 элементов а он блять все 8 элементов хранить может нихуя себе че за хуета. хелпуйте. или компилер рофлит
460 1205798
>>205784
Ну так лол, этот массив не инициализирован никак, а ты printf печатает %s до '\0'
Где там она встретит нуль, дело случая.
461 1205853
>>205798
Консоль чекай, я задаю ввод из 6, 7, 8 символов и массив инциальзируется. Спрашивается откуда компилер высрал еще несколько элементов?
462 1205857
>>205853
А, scanf не заметил.
Ну так scanf тебе ничего не проверяет.
Сколько её дают, столько и пишет.
463 1205866
>>205857
так а почему в массив то она это все пишет? ведь вроде как массив ограничен пятью элементами, а тут выходит что не 5 а все 8.
464 1205869
>>205866
Ты ей передаёшь указатель на a[0].
До размера массива никому дела нет в этом языке вообще никогда, нигде и ни при каких условиях.
465 1205895
>>205869

> никому дела нет в этом языке вообще никогда


Есть sizeof. В scanf() можно указать максимальный размер буфера: %4s запишет в буфер не более четырёх символов (плюс пятый \0).
466 1206120
>>202367
Тру пацаны в емаксе ебашат. Думаешь Торвальдс ядро в visual studio писал?
467 1206126
2ch, правильно ли я понимаю что если процессор 3ghz, то он может выполнить 3 миллиарда ассемблерных инструкций в секунду?
468 1206127
>>205784
у тебя массив из 5 симовлов, ты гарантировал системе, что эти 5 байт - твои и ничьи. Потом ты указал scanf, что можешь принять строку произвольной длины, а можешь только 5 символов, но вот в чём проблема: каждая строка на конце должна иметь \0, т.е. ты сканируешь не 5 символов, а 6, из-за чего последний шестой начинает храниться в следующем байте, который как-бы не твой. Чтобы такого говна не было, нужно написать %4s где 4 - длина массива - 1
469 1206128
>>202367
Qt Creator же
470 1206154
>>206126

> 2ch, правильно ли я понимаю что если процессор 3ghz, то он может выполнить 3 миллиарда ассемблерных инструкций в секунду?



Нет, неправильно понимаешь.

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

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

3) Оператива (а не код) является главным тормозом современных процессоров - если процессор не находит данные в своих кешах и обращается к оперативке, то он превращается в убертыкву в этот момент и его мегагерцы в этот момент можно смело делить на 100. И именно поэтому интел победил своих конкурентов - за счет внедрения сложных предсказателей загрузки данных/ветвления/индексации в железо.
471 1206156
>>206154

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


И породив 1000 и 1 дыру в своих ЦП.
И кого он подебил именно? Ты имеешь в виду, что x86-64 подебила конкуретнов?
472 1206157
>>206156

Да, причем даже собственный итаниум от интела. Мипс, помер, спарка - все их пропрочили как "убийцу x86" и все сдохли.
473 1206159
>>206157
А про армы ты деликатно промолчишь?
474 1206161
>>206159

>А про армы ты деликатно промолчишь?



Вот армы могут, да, но пока им силенок в мире блоатварного говнокода не хватает.
475 1206162
>>206161

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



Вот кстати главный грех интела - он приучил людей, что можно писать блоатварный говнокод на языках высокого уровня и не париться - волшебный "приборчик" порешает.
476 1206163
Хочу погромировать для Пневматических Кампутеров на ПневмоСи.
477 1206164
>>206163

>Пневматических Кампутеров



Аналоговых или цифровых?
478 1206165
>>206162

>"приборчик" порешает.



Клевый мемас, возьму на вооружение.
479 1206168
>>206164

>Аналоговых или цифровых?


Пневматических, работающих на сжатом воздухе
480 1206170
>>206168

>Пневматических, работающих на сжатом воздухе



Это понятно. Они были и аналоговые (закон бернулли, эффект вентури), и цифровые (Эффект Коанда). Ты про какие?
481 1206171
>>206170

>Эффект Коанда


Вот про эти
482 1206172
>>206171
з.ы. я просто представляю как мог бы выглядеть ПневмоСи, такой стимпанк получается, кек.
483 1206174
>>206171

Берешь конпелятор и компилируешь. Нет компилятора - тогда сюда:

https://kristerw.blogspot.com/2017/08/writing-gcc-backend_4.html
484 1206175
>>206174
Там программатор выглядел бы как механический орган, а программа бы была бы типа перфокарт вставляемых в него.
485 1206176
>>206172

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



Это обычные цифровые устройства. Сами эти девайсы можно на том же верилоге писать спокойно.

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

Код для такого пневмопиха можно писать на сях без изменений.
486 1206177
>>206175

>Там программатор выглядел бы как механический орган, а программа бы была бы типа перфокарт вставляемых в него.



Ты имеешь в виду терминал? Ну как у эвм на дискретных элементах он бы был. Пневмонику как бы достаточно компактную можно сделать - размером с pdp11 за вычетом компрессора. с ячейками раземром 5х5мм.
487 1206178
>>206177

>размером с pdp11 за вычетом компрессора. с ячейками раземром 5х5мм.


Клево и еще механический дисплей, как раньше в аэропортах табло расписаний было.
488 1206181
>>206176

>Это обычные цифровые устройства. Сами эти девайсы можно на том же верилоге писать спокойно.


Ну у тебя часть на пневмо, а часть электронная, а я имею ввиду полностью все без электроники, механика и пневматика.
изображение.png988 Кб, 993x1000
489 1206185
>>206181

>Ну у тебя часть на пневмо, а часть электронная, а я имею ввиду полностью все без электроники, механика и пневматика.



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

А так - все так же как и в эвмах допекарной эпохи - тумблерами/галетой (пикрил) пишем первый компилятор ассемблера, на ассемблере уже с помощью печатающего терминала пишем на ассемблере макроассемблер, на нем пишем все остальные языки высокого уровня. Никаких принципиальных/технических отличий от древних каменных эвм, кроме производительности, обусловленной механическими свойствами рабочего тела не будет.
dreadnaught.jpg33 Кб, 364x461
490 1206187
>>206185
охуенчик
491 1206214
>>206127
понял. спасибо
492 1206230
>>205895

>sizeof


Макро времени компиляции, ага.
493 1206311
>>206162
Что мне мешает написать говнокод на высокоуровневом языке и скомпилировать его для arm?
494 1206373
Как написать кроссплатформенное мультипоточное приложение на С? threads.h в glibc не завезли
495 1206375
>>206373

> threads.h в glibc не завезли


Surprise motherfucker
496 1206397
>>206375
И чё, единого кроссплатформенного способа нет?
497 1206407
>>206373
Это вообще C?
498 1206408
>>206373
Хз, OpenMP-зазывалы его позиционируют как кроссплатформенный.
Синтаксис, конечно, уродский. Трясет просто от этих прагм.
Зато переносимо, причём в некоторых случаях собрать можно будет даже на компиляторе без поддержки OMP, ибо прагмы проигнорируются (это если сама структура программы позволит, конечно)
499 1206591
>>206373

> threads.h в glibc не завезли


Есть 3rd-party обертки вокруг pthreads. Используй их, а когда в гцц, наконец, реализуют стандарт полностью - выкинешь.
500 1206603
Посоны, в сишечке есть дефолтный пакет для разреженных матриц?
"Дефолтный" в смысле как лапак для обычных. То есть любой человек, занимающийся матричными вычислениями, почти наверняка будет использовать его и блас.
501 1206615
>>206591
pthreads же только для unix систем ведь так?
502 1206618
>>206615
Для POSIX-compilant систем, не?
503 1206619
>>206618

> compliant

504 1206625
>>206615

> pthreads же только для unix систем


Есть в MinGW.

Алсо, для винды тоже есть легковесные нативные реализации threads.h. Вот, например, из glfw: https://github.com/glfw/glfw/blob/master/deps/tinycthread.c
506 1206895
>>189727
Смотрите-ка, залетный студент, путающий термины, пытается рассказывать про области применения сишки
Тред утонул или удален.
Это копия, сохраненная 13 августа 2018 года.

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

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