М.Двач / Программирование

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

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

78 Кб, 792x1023
C Programming Language #30 # OP 10 мая, 11:38 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 (иногда лежит)

Ответы187787192335193165193496196200201137

10 мая, 11:45 2 1187525

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

Ну, конкретно, в данном случае (JIT или загрузка исполняемого кода в память) именно логично сделать кучу асмовых реализаций int execute_code(pointer) в папке arch, чем писать кросплатформенную лапшу ифдефов в попытках наебать стандарт, вызвать через указатель на функцию, и все равно выстрелить себе в ногу.

10 мая, 18:19 3 1187787

>>1187521 (OP)
друзья, не могу никак найти нормального гуида, как загрузить bitmap в 2мерный массив, как его потом обрабатывать, используя стандартные библиотеки. Подкиньте чего, позязя

Ответы187791187803

10 мая, 18:29 4 1187791

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

Ответы187796

10 мая, 18:40 5 1187796

>>1187791
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
какие тебе ище то надо

10 мая, 18:54 6 1187803

>>1187787
Используй нестандартные. У всяких libjpeg и libpng вполне себе простой и понятный API.

Ответы187806

10 мая, 19:01 7 1187806

>>1187803
я понимаю, что нестандартными все гораздо проще, но задание так озвучено

Ответы187812187835

10 мая, 19:07 8 1187812

>>1187806
Значит читай в массив, и ваще что такое битмап? Если бмп всякие читай про формат файла и занимайся байтоеблей

10 мая, 19:26 9 1187835

>>1187806
Ну тогда выбери себе какое-нибудь подмножество .tga без сжатия, и читай себе его. Там все просто и не нужно возиться с паддингом, как в .bmp. Читаешь заголовок, считаешь, сколько нужно памяти, выделяешь память, читаешь тело. Все. Разве что с 2D-массивом может выйти промашка, потому что размерности сишных массивов определяются при компиляции (если он не VLA).

10 мая, 20:45 10 1187914

Есть какие-то советы, как васянить псевдографические интерфейсы без сторонних либ?

Ответы188017188112

10 мая, 23:50 11 1188017

>>1187914
Это невозможно. Используй React Native. Qt не нужен.

Ответы188045

sage 11 мая, 01:21 12 1188045

>>1188017
>псевдографические интерфейсы
>React Native. Qt

11 мая, 09:42 13 1188112

>>1187914
Написать свою либу.
Ты реально даже какой-нибудь ncurses не хочешь использовать?

Ответы188128

11 мая, 10:14 14 1188128

>>1188112
Да. Ну, желательно, без сторонних либ (помимо API операционки). Я вообще про общие принципы спрашивал скорее, потому как у меня кроме как функции в функции в функции (переход по менюшкам) ничего не выходит. Мб так и надо, конечно.

Ответы188188

11 мая, 12:09 15 1188188

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

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

http://invisible-island.net/ncurses/man/ncurses.3x.html

Ответы188235

11 мая, 14:07 16 1188235

>>1188188
Да не в этом вопрос. Как эту хрень всю изнутри устроить. Под каждую менюшку свою функцию писать, отдельно обработку клавиш сделать, етц.

Ответы188241

11 мая, 14:32 17 1188241

>>1188235
Почитав документацию ncurses'а, ты получишь ответ на свой вопросы.

12 мая, 04:09 18 1188581

Платиновый вопрос: как скомпилировать K&R через GCC?
Ну или как вообще обходиться с K&R в современном мире?
Мне Прата очень не нравится, тонны текста.
Хочу начать с K&R и потом пойти по стандартам.

Ответы188586188863

12 мая, 05:11 19 1188586

>>1188581
Молча. Что конкретно у тебя не компилится?

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

12 мая, 22:25 20 1188863

>>1188581
>тонны текста.
А что должно быть?

26 Кб, 861x271
12 мая, 22:35 21 1188867

Меня обманывают или нет? Вообще не могу понять, что имеет в виду автор статьи

Ответы188919

13 мая, 00:49 22 1188919

>>1188867
Вкратце: да, автор пиздит. На пике 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​].

13 мая, 00:49 22 1188919

>>1188867
Вкратце: да, автор пиздит. На пике 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​].

Показать весь текст
Ответы188925188978

13 мая, 01:04 23 1188925

>>1188919
Пердачую этого. Хотел объяснить всё то же самое, но он сделал это развернуто и очень понятно, ну и первым. Правда я нихуя не понял из последнего предложения, причем тут column-major, если ты хранишь векторы группируя их по компонентам.

Ответы188936

83 Кб, 919x788
13 мая, 01:09 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, бла-бла)
Зачем?

Ответы188932

13 мая, 01:24 25 1188932

>>1188928
Это тебе не ООП, и переменная здесь - не объект.
Оно в "статической" памяти находится, и, единственное что происходит при входе в цикл - инициализация переменных значениями.
Если что не так сказал - поправьте.

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

Ответы188936

13 мая, 01:48 26 1188936

>>1188925
> Как Си создает/убивает переменные вне области видимости? Не получается ли, что на каждой итерации цикла тратится время на то, чтобы создать переменную, один раз внести в нее значение, и потом уничтожить (освободить память)
Стандарт ничего не гарантирует, но во всех реализациях автоматические переменные лежат на стеке. Плохому компиляторе для создания переменной или целой области видимости нужна целая одна инструкция (кроме инициализации). Хороший компилятор выделяет в стеке достаточно места для любого вложенного блока кода сразу же при входе в функцию (одной инструкцией), а при выходе все разом освобождает (опять же одной инструкцией), да еще и переиспользует переменные:
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.

>>1188932
> Оно в "статической" памяти находится
Так можно, но по сути тебе все равно приходится скатываться до стека при рекурсии. Поэтому так не делают.

Ответы189042

76 Кб, 802x699
13 мая, 09:18 27 1188978

>>1188919
Ох, спасибо. Этот чувак жутко запутал с пониманием массивов, я уже почти ему поверил, всё-таки статья хорошая была.

13 мая, 12:06 28 1189042

>>1188936
Благодарю.

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

Ответы189061189140

13 мая, 12:43 29 1189061

>>1189042
Нет, не правильно. У стека есть ограничения зависящие от реализации конпелятора и ОС. Можно изменить эти ограничения, но это костыль.
маллок-хуяллок наше всё.
мимкрок

Ответы189140

13 мая, 15:12 30 1189140

>>1189042
Ты почти правильно понимаешь. Но выделять большие массивы (сотни килобайт) не стоит, и при рекурсии нужно осторожно подумать, сколько тебе может понадобиться. Как тебе написали выше, стек не резиновый. Но если ты просто даешь имена промежуточным результатам вычислений:
int foo = a + b; int bar = foo ∗ 2; return bar;
ты ничего никуда не засрешь, потому что с любым уровнем оптимизации, отличным от нулевого, это почти/полностью эквивалентно:
return (a + b) ∗ 2;
И скорее всего, в стек вообще ничего не попадет, все в регистры влезет. Отладочные билды будут медленнее и жирнее, да. На релиз такое не повлияет.

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

>>1189061
Ты забыл сказать, что чаще всего это ограничения уровня нескольких мегабайт.

88 Кб, 250x170
13 мая, 17:20 31 1189193

Сап, аноны. Подскажите, как реализовать простейший стек на си без плюсов блядь и push/pop/peek для него.
В гуле одни плюсы, которые я не знаю, либо какая-то лютая хурма.
Так же сложности добавляет то, что авторы статей имеют привычку называть плюсы "си", соответственно найти что-либо рабочее не удалось.
Спасибо

Ответы189202189260189325

13 мая, 17:27 32 1189202

>>1189193
Студентота, учись иди. Хули ты клянчишь? Давай бабки и я так уж и быть покажу как э о реализовать.

Ответы189209

13 мая, 17:30 33 1189209

>>1189202
> учись иди
Я бы и рад, но препод-троянишна на лекциях пишет код на доске и он какая неожиданность нихуя не работает.

Ответы189215189249

13 мая, 17:37 34 1189215

>>1189209
Меняй место учебы, это самый мудрый совет в твоей ситуации.

Ответы189224

13 мая, 17:51 35 1189224

>>1189215
Отсрочка от армейки на бакалавриате только одна, так что приходится крутиться.
Хотяб с самим стеком можешь помочь?

13 мая, 17:52 36 1189226

Имеется указатель на строку p_str
Если написать
(p_str++) = 6;
То сначала просходит инкремент указателя, а затем его разыменование и присвоение 6?
А если написать
(++p_str) = 6;
То сначала указатель разыменовывается, присваивается 6, а указатель увеличивается на 1?

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

Ответы189228189232

13 мая, 17:53 37 1189228

>>1189226
В каждом случае перед скобкой еще стоит звездочка. Здесь, видимо, она обозначает наклонный текст, поэтому ее не видно

13 мая, 17:56 38 1189232

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

Ответы189238189247

13 мая, 18:08 39 1189238

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

13 мая, 18:27 40 1189247

>>1189232
Сделал разыменование и постинкремент.
Вот кусок кода:
char ch = '4';
'звездочка'p_str++ = ch;
printf("p_str = %c\n", 'звёздочка'(p - 1));
То есть на экран должен выводиться символ 4. Но получаю какой-то мусор. А если написать
printf("p_str = %c\n", 'звёздочка'(p));
То выводится 4.
Почему?

Ответы189289189302

13 мая, 18:27 41 1189249

>>1189209
> троянишна
Жительница Трои?
> и он нихуя не работает.
Вангую, там ошибки уровня отсутствующих ";", просто ты даун и не хочешь думать.

13 мая, 18:44 42 1189260

>>1189193
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;
}

13 мая, 18:44 42 1189260

>>1189193
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;
}

Показать весь текст
Ответы189282

13 мая, 19:06 43 1189282

>>1189260
Спасибо большое.
Надо ли тут задавать прототипы функции и подключать библиотеки помимо stdio и stdlib?

Ответы189393

13 мая, 19:09 44 1189289

>>1189247
Аноны, ну помогите с кодом. На таком фрагменте уже целый час потерял.
Если пишу звездочкаp = ch;
p++;
printf ("%c", звездочка(p-1));
то все работает. В чем ошибка-то?

Ответы189302

13 мая, 19:38 45 1189302

>>1189289
>>1189247
Бля. Сорян, я сделал хуйню. У меня есть два разных указателя p и p_str, соответственно. Второй просто является строкой-дубликатом. Я сошел с ума и инкрементировал p, вместо p_str. Проблема решена

Ответы189303

13 мая, 19:40 46 1189303

>>1189302
95% проблем ИТТ решаются так, да

13 мая, 20:09 47 1189325

>>1189193
> простейший стек на си
Вот >>1186430 пока не смыло. Проще некуда уже. (Peek сам осилишь?)

13 мая, 20:20 48 1189336

MinGW и gdb, Шиндоус 7. При попытке отладки падает в Segfault на FillConsoleOutputCharacterA. ЧЯДНТ?

Ответы189340

13 мая, 20:22 49 1189340

>>1189336
Откуда мы знаем, что ты там отлаживаешь, и почему оно падает.

Ответы189349

92 Кб, 1366x768
13 мая, 20:24 50 1189349

>>1189340
А без отладки все работает нормально (В данном месте).

Ответы189358

13 мая, 20:28 51 1189358

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

Ответы189361

13 мая, 20:32 52 1189361

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

13 мая, 21:05 53 1189393

>>1189282
Наглеешь, пацан.
мимо

13 мая, 23:28 54 1189439

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

Ответы189442189654

13 мая, 23:34 55 1189442

>>1189439
OpenGL SuperBible. Если нужен legacy GL (фиксед пайплайн) по каким-то причинам, то 4 редакция. Если только новый - последняя доступная.

Ответы189447

13 мая, 23:42 56 1189447

>>1189442
>OpenGL SuperBible
Спасибо конечно... но это копание именно в движке. Именно с OpenGL как концепцией я думаю проблем не будет, у меня есть гайд для своей плотформы, отnуда я понял, что это клиент серверный механизм, в котором на клиенте формируется стек запросов с координатами и пуляется на сервер, который крутится на видеокарте и он всесь стек отрисовывает со скоростью звука и с нетерпением ждёт следующий вагон. У меня gроблема именно с C. Пушто я об нём ничего не знаю. Читал 5 лет назад книжицу в метро, но ничего не понял. Мне сейчас нужна тиресная книжеца по основам основ C )))

Ответы189530

14 мая, 09:36 57 1189530

>>1189447
Хосспаде, K&R и Прата прочитай и достаточно будет.

Ответы189538

14 мая, 10:16 58 1189538

>>1189530
От Прата слишком толстая

14 мая, 14:28 59 1189654

>>1189439
А демки на нём и пишутся, да?

Ответы189713

14 мая, 15:04 60 1189680

В какой области C прям мастхев? Два раза перечитывал (перелистывал) K&R, но работать над проектами уровня перевода фарангейтов в градусы было лень, поэтому и опыта никакого в C нет.
Интересует что-нибудь близкое к компьютерной графике

Ответы189684189727

14 мая, 15:20 61 1189684

>>1189680
В основном стримы видео, хиудео, там где надо работать с буферами. Например, пишется клиент серверная либа, которая стримит видео и звук, потом она портируется под работу на разных архитектурах. Запускается на мобильных устройствах и на линуксе. На моб устройствах поверх неё пишут на нативных фреймворках гуи, чтобы юзер мог ей пользоваться.

Ответы189726

14 мая, 16:37 62 1189713

>>1189654
Демки и на DirectX пишутся, и даже софтрендером на голом фреймбуфере от ОС.

Ответы190055

14 мая, 17:00 63 1189726

>>1189684
Там скорее ASSEBMLER тоже надо, без асма хуй там ты видео толком будешь обрабатывать.

Ответы189729

14 мая, 17:03 64 1189727

>>1189680
Embedded, system programming, тоесть прикладное ПО, что на сях не делается так это бек энды. Ну и контроллеры но там уже ASM больше надо.

Ответы189869206895

14 мая, 17:04 65 1189728

Аноны а что написать можно для портфолио?

Ответы189864

14 мая, 17:05 66 1189729

>>1189726
Попробовал бы ты это в Java треде сказать. А вообще нравится мне ваш раздел. Самый ламповый в програмаче.

Ответы189737

14 мая, 17:21 67 1189737

>>1189729
Да там одни олигофрены, джава окончательно устарела уже, это легаси ковыряние, если есть сильное требование к ресурсам то это конец, джава не потянет. Если средней сложноси алгоритм то будет полная загрузка железа, уродливый жирный тулчейн, ИДЕ почти не глючит и так далее

Ответы190076

14 мая, 21:02 68 1189864

>>1189728
Напиши функцию ssize_t getrandbuf(void ∗buf, unsigned int nmemb, size_t membsize, unsigned short nbits, unsigned int flags)
которая принимает массив buf с число элементов nmemb, каждый размеров membsize, и заполняет каждый элемент слева рандомными битами в кол-ве nbits, полученными от функции getrandom с флагами flags.
От getrandom надо получать не больше рандомных битов, чем требуется (с точностью до байта). Энтропию, мать твою, надо экономить.

14 мая, 21:08 69 1189869

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

15 мая, 06:49 70 1190055

>>1189713
Есть моар инфы про софтрендер?

Ответы190059

15 мая, 08:00 71 1190059

>>1190055

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

15 мая, 09:18 72 1190076

>>1189737

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

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

Ответы190082

15 мая, 09:30 73 1190082

>>1190076
>Джава-параша сейчас очень сильно устарела если сравнивать с C# например.
Чем она устарела? Шарпоговно еще большее днище, а на жабе есть дохуя вкусняшек хэдупы, джибосы, томкаты, солры, нутч и прочее.

Ответы190091

15 мая, 09:53 74 1190091

>>1190082

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

Ответы190117

15 мая, 10:51 75 1190117

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

15 мая, 11:15 76 1190136

шлёп

15 мая, 11:44 77 1190174

Пишу в эпичном треде

127 Кб, 480x360
15 мая, 12:19 78 1190222

уже писал тут раньше насчет этой же проблемы, но она не решилась, а сроки горят
Всем привет, вопрос про написание простейшего драйвера для винды.
Мне по учебе в вузике нужно написать драйвер для Windows, который будете иметь возможность:
1) получать/отправлять значение от консольного приложения в user mode
2) записывать/считывать значение в MSR регистры процессора

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

Короче, спасите, умираю.
Посоветуйте инфы, чтобы разобраться.
А ещё лучше, напишите драйвер за меня (у шарящего человека это и 30 минут не займет), а я 1500р перешлю за работу на карту.
Или посоветуйте, где за деньги можно попросить такое сделать, потому что на Workzilla и Fl.ru за 1500 рублей никто не нашёлся

Ответы190225190229190252190313

sage 15 мая, 12:21 79 1190225

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

Ответы190229

15 мая, 12:25 80 1190229

>>1190222
>>1190225
Я отписался только в трёх тематических тредах.
ИМХО больше я засрал бы доску бесполезным тредом.

Ответы190232

sage 15 мая, 12:26 81 1190232

>>1190229
Нет ты конкретно срёшь в треде про C. И меня заставляешь тоже тут срать! Пидор

15 мая, 13:05 82 1190252

>>1190222
>Посоветуйте инфы, чтобы разобраться.
Качай DDK Млкософта и читай доки.

Ответы190263

15 мая, 13:22 83 1190263

>>1190252
WDK оказывается он уже называется

Ответы190375

15 мая, 15:02 84 1190313

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

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

15 мая, 16:27 85 1190375

>>1190263
WDK и WDF это не одно и тоже?

Ответы190383

15 мая, 16:38 86 1190383

>>1190375
Когда я с этим говном возился, оно DDK называлось, сейчас вапче нинаю

15 мая, 17:29 87 1190442

https://pastebin.com/SVP47M5n
Объясните пожалуйста, в чем разница между 1,2 и 3 вариантом. В 3м варианте ошибка сегментации. Как static и extern связаны с выделением памяти в куче/на стэке?

Ответы190541

15 мая, 17:38 88 1190448

Кочаны, у меня есть циферки
1065353216, 1065353216, 1065353216
это Int32
как мне их мапнуть в Int8, чтобы и значения были между 0 и 255?

Ответы190499190510

15 мая, 18:54 89 1190499

>>1190448
Непонятно

15 мая, 19:19 90 1190510

>>1190448
Здесь одна циферка три раза.

Ответы190518

15 мая, 19:24 91 1190518

>>1190510
Да есть такое дело. Но я уже придумал
находим коойициент
к = Инт32.макс / Инт8.макс
И потом делим 1065353216/к

15 мая, 19:46 92 1190541

>>1190442
В первом варианте ты объявляешь статический массив интов, который уже будет в теле образа программы при конпеляции и весь заполнен нулями(инициализирован). Т.е. размер софтины будет конпелированный код+ массив интов. Этот массив будет в области данных(кода софтины?), а не на стеке. Область видимости этого массива будет строго файле исходника.
Второй случай отличается только областью видимости, она уже будет глобальной.
В третьем случае ты запиливаешь массив во времени выполнения софтины и тупо не хватило места на стеке .
Вроде так.

Ответы190634

15 мая, 20:54 93 1190601

Насколько сложно рисовать используя GDI+? Для Машины Тьюринга нужна отрисовка графов, а я собственно никогда не рисовал.

Ответы190612

15 мая, 21:17 94 1190612

>>1190601
С GDI+ слегка непросто. Это изначально крестовый API, а плоский сишный API, на котором он основан, официально недокументированный (хотя все уже разобрали) и чуть более многословный, чем хотелось бы. С обычным GDI сложностей нет, есть книга www.fengyuan.com, но можно и в MSDN справку смотреть, там все просто.

Ответы190638193516

15 мая, 21:46 95 1190634

>>1190541
>области данных
Это и есть куча? А маллоки нужны для того, чтобы выделять память в куче во время выполнения, я правильно понимаю?

Ответы190755

15 мая, 21:50 96 1190638

>>1190612
Ага, спасибо. Значит, GDI. Надо бы свою прогу переписать по всем канонам WinAPI, да не осилю, наверное

15 мая, 23:25 97 1190699

Какой компилятор более-менее дружит с WinAPI и вообще с Шиндой, окромя MSVC?

Ответы190705190719

15 мая, 23:30 98 1190705

>>1190699
openwatcom

Ответы190719

15 мая, 23:55 99 1190719

>>1190699
gcc (можно в комплекте с msys, msys2), Pelles C. А этого >>1190705 не слушай, у них все не как у людей.

Ответы190723190781

16 мая, 00:08 100 1190723

>>1190719
>у них все не как у людей
Зато нативный бинарник

Ответы190734

16 мая, 01:21 101 1190734

>>1190723
Привет, мы тут на Си пишем, у нас везде нативные бинарники.

16 мая, 03:42 102 1190755

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

Ответы190813

16 мая, 07:24 103 1190781

>>1190719
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]

Ответы190784

sage 16 мая, 07:38 104 1190784

>>1190781

typedef *void PVOID пробовал?

Ответы190913

16 мая, 09:21 105 1190813

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

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

16 мая, 12:39 106 1190913

>>1190784
За typedef спасибо, но прототип __writedr из воздуха не возьмётся

Ответы190982191062

16 мая, 14:38 107 1190982

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

> Какой компилятор знает про __writedr
Слишком специфичный интринсик, чтобы поддерживаться где-то еще.

16 мая, 17:20 108 1191062

>>1190913
Он объявлен в хедере intrin.h. В MinGW его нет, например. Зато есть в Mingw-w64. Попробуй его https://mingw-w64.org/doku.php

Ответы191176

16 мая, 20:42 109 1191176

>>1191062
> в mingw его нет
В коде есть include <intrin.h>
Там какой стаб стоит? Чё компилятор на отсутствие не ругается?

Ответы191301

16 мая, 21:57 110 1191223

Если я делаю небольшую прогу с интерфейсом консольным, то жестко задавать магические номера координат элементов (окошки, надписи, етц) это нормально или быдлокод? Если последнее, то как фиксить?

Ответы191260

16 мая, 22:33 111 1191260

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

Ответы191262

16 мая, 22:39 112 1191262

>>1191260
Да при буфере строго 80х25 как-то похрену, окошко не увеличивается. Хотя Шиндовс10 каким-то образом это проворачивает!

Ответы191272

16 мая, 22:50 113 1191272

>>1191262
>80х25
чего, символов, точек? сколько точек на символ? тыкалка в точках возвращает или в символах?

Ответы191275

16 мая, 22:51 114 1191275

>>1191272
Консоль же, аки curses, но не curses. 80x25 символов. Поддержки мыши нет.

Ответы191280191285

16 мая, 22:54 115 1191280

>>1191275
на джвухметровом мониторе тоже будет отмасштабированно на 80x25 символов, панимаешь

16 мая, 22:59 116 1191285

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

16 мая, 23:18 117 1191301

>>1191176
В коде есть. Но он там объявлен как хэдер из поставки компилятора. И где тебе компилятор этот хэдер возьмет, если его нет?

Ответы192251

17 мая, 00:12 118 1191347

Бля, не бейте: не могу сделать прогу, которая переводила бы набор из 128х128 цифр от 0 до 9 из .txt в .png, придавая пикселям цвет в зависимости от значения соответствующей цифры. Вроде, простая хуйня, но никак не успеваю разобраться. Поясните, что там знать нужно? (уровень 1: едва ли работаю со строками)

Ответы191360191379191450

17 мая, 00:33 119 1191360

>>1191347
Работать с файлами, знать что из себя представляет png

Ответы191364191377191379

17 мая, 00:46 120 1191364

>>1191360
>>1191360
В каком плане?

Ответы191373

17 мая, 00:58 121 1191373

>>1191364
Png суть тот же бинарник. Для того, чтобы создать этот бинарник тебе нужно передать на вход свой txt, а на выходе получить png. Но это не значит просто сменить формат, потому что png содержит в себе ещё и служебную информацию. То есть тебе надо знать как устроен PNG. А вообще если ты задаешь такие вопросы то для начала не мешало бы хоть какую-нибудь книжку дочитать. Кури на гитхабе png decoder и разбирайся.

Ответы191377

17 мая, 01:05 122 1191377

>>1191360
>>1191373
Охуенно

17 мая, 01:06 123 1191379

>>1191347
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;
А уж как читать цифры построчно или посимвольно, игнорируя или нет пробелы - сам.

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

17 мая, 11:01 124 1191450

>>1191347
> .png
А тебе обязательно png или просто нужно получить картинку? Можешь посмотреть на формат .ppm, если пока не хочешь ебаться с DEFLATE и прочей ссакой

17 мая, 12:00 125 1191463

Нельзя этого сделать на C.

Ответы191479

17 мая, 12:57 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;
}
Грубо говоря, мой вопрос сводится к тому, что я закомментировал в функции. Как именно там будет работать присваивание? Да и вообще, в целом, корректно ли это теоретически?

17 мая, 12:57 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;
}
Грубо говоря, мой вопрос сводится к тому, что я закомментировал в функции. Как именно там будет работать присваивание? Да и вообще, в целом, корректно ли это теоретически?

Показать весь текст
Ответы191547

17 мая, 13:00 127 1191479

>>1191463
Почему же? Нужно просто нагуглить либку на C которая может сделать пнг. Опять же можно по пути визальнуть на каком нибудь OpenGL то что получается.

17 мая, 14:29 128 1191531

Просто пишешь байты в файл, следуя регламенту. Что тут сложного? http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html

Ответы191547

17 мая, 14:51 129 1191547

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

> Как именно там будет работать присваивание?
> 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;

>>1191531
> Просто пишешь байты в файл, следуя регламенту
> Просто реализуешь битстрим
> Просто реализуешь хаффмана
> Просто реализуешь lz77
> Просто реализуешь дефлейт
> Просто реализуешь адлер
> Просто оборачиваешь дефлейт в zlib
> Просто реализуешь crc32
> Просто работаешь с big-endian
> Просто пишешь PNG-чанки в файл
> уровень 1: едва ли работаю со строками

17 мая, 14:51 129 1191547

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

> Как именно там будет работать присваивание?
> 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;

>>1191531
> Просто пишешь байты в файл, следуя регламенту
> Просто реализуешь битстрим
> Просто реализуешь хаффмана
> Просто реализуешь lz77
> Просто реализуешь дефлейт
> Просто реализуешь адлер
> Просто оборачиваешь дефлейт в zlib
> Просто реализуешь crc32
> Просто работаешь с big-endian
> Просто пишешь PNG-чанки в файл
> уровень 1: едва ли работаю со строками

Показать весь текст
Ответы191548191549191574

17 мая, 14:58 130 1191548

>>1191547
Просто пишешь все это на пистоне в одну строчку, а потом конвертируешь в си.

17 мая, 14:59 131 1191549

>>1191547
>> Просто пишешь PNG-чанки в файл
>> уровень 1: едва ли работаю со строками
Ну он же думал, что это просто. Вот пусть просто и пишет чанки. Потом просто напишет убийцу фотошопа.

Ответы191552

17 мая, 15:06 132 1191552

>>1191549
Так это на самом деле просто: просто линкуешься с libpng, там вон выше и пример есть почти готовый.

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

>>1191549
> Вот пусть просто и пишет чанки
Ну да, там особой ебли нет, вот только IDAT сжатый и CRC надо считать, и значения в big-endian.

17 мая, 16:09 133 1191574

>>1191547
О, спасибо. Понял.
В main'е узел создается очень просто. Структура же глобальная. Поэтому просто выделяю память под узел на куче.
А что можно про сайд- эффекты почитать? Там все-таки unexpected behaviour будет?

Ответы191694

17 мая, 18:53 134 1191694

>>1191574
> Там все-таки 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.

18 мая, 17:40 135 1192251

>>1191301
@
ЗАДОЛБАЛСЯ, КАЧАЕШЬ MSVC BUILD TOOLS
@
КОМПИЛЯТОРЫ ВЕСЯТ 4 ГБ, ВЫБОРОЧНОЙ УСТАНОВКИ НЕТ
@
cl Main.cpp
@
CANNOT INCLUDE FILE WINDOWS.H: NO SUCH FILE OR DIRECTORY

Ответы192252

18 мая, 17:42 136 1192252

>>1192251
>MSVC
это боль, избегай ее

Ответы192256

18 мая, 17:44 137 1192256

>>1192252
Можно мне, не упарываясь WinAPI, собрать что-нибудь под Винду, не реализовывая самому какой нибудь ссанный интринсик?
Я ещё не хочу 40 ГБ IDE качать, я вообще имею право после этого сидеть на Винде?

Ответы192268192272192370

18 мая, 18:05 138 1192268

>>1192256
Что тебе нужно то? mingw64 ставь

18 мая, 18:09 139 1192272

>>1192256
Да ты заебал ныть. Тебе ж сказали поставь Mingw64 и не еби мозг

Ответы192275

18 мая, 18:10 140 1192275

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

Ответы192283

18 мая, 18:20 141 1192283

>>1192275
https://stackoverflow.com/questions/2520683/how-to-cope-with-intrin-h-no-such-file-or-directory

Почему ты такая ленивая жопа?

Ответы192284

18 мая, 18:22 142 1192284

>>1192283
Ты что мне скинул?
Там есть этот файл, но он неполноценный.

Ответы192290

18 мая, 18:25 143 1192287

>Там в хедере intrin.h нужной функции нет
Ну так в консоли набери. Я решаю дописыванием.

18 мая, 18:27 144 1192290

>>1192284
>но он неполноценный.
ну тогда полноценный только у мекрософта

Ответы192296

18 мая, 18:28 145 1192292

и потом нельзя в четыре строки написать компилятор

18 мая, 18:31 146 1192296

>>1192290
В хедерах Шланга видел, надо перепробовать.
Небось, в репах MSYS старый Шланг до жопы

Ответы192314192318

18 мая, 18:52 147 1192314

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

Ответы192318

41 Кб, 316x316
18 мая, 19:05 148 1192318

>>1192296
>>1192314
ну ладно, теперь здесь
>переход на Шланг
>переход на "странный"

без этого, пожалуйста

18 мая, 19:13 149 1192321

Всё же в Ц дохуя недостатков.
Давайте перечислим самые главные:
-Нет неймспейсов.
-Нет автовывода типов.

Ответы192332

18 мая, 19:28 150 1192332

>>1192321
и?

Ответы192344

18 мая, 19:35 151 1192335

>>1187521 (OP)
Сишка хороша да только невостребованна

Ответы192348

18 мая, 19:47 152 1192344

>>1192332
Бблять
Давай запилим. Может в массы пойдет, а там глядишь и стандарт примут.

Ответы198640

18 мая, 19:54 153 1192348

>>1192335
Вижу, русский язык тоже не особо востребован.

sage 18 мая, 20:27 154 1192370

>>1192256
Что только не сделают люди, лишь бы не написать две инструкции на асме.

Ответы192390

18 мая, 21:17 155 1192390

>>1192370
> Debug resgister
Щто это?

Ответы192398

18 мая, 21:40 156 1192398

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

18 мая, 22:43 157 1192431

Говорите, вы биты тоже с нуля нумеруете?

Ответы192463

18 мая, 23:54 158 1192463

>>1192431
Да, с младшего и с нуля. А что?

Ответы192547192775

sage 19 мая, 00:45 159 1192477

Нет анонимных функций, нет дженериков, нет промисов.

Ответы192481192551

19 мая, 00:47 160 1192478

Нет замыканий.

Ответы192552

sage 19 мая, 00:49 161 1192481

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

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

> нет промисов
И слава богу. Нужно - запили сам. Через пару лет осознаешь свою ошибку и выпилишь.

Ответы192492192549

19 мая, 01:55 162 1192492

>>1192481
Что не так с анонимными функциями?

Ответы192498

sage 19 мая, 02:28 163 1192498

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

Ответы192549192565192707

19 мая, 07:51 164 1192547

>>1192463
Так хочется со старшего нумеровать)000.
Когда иду по массиву чаров, я же инкрементирую указатель, и мне идти также слева направо по битам

19 мая, 08:03 165 1192549

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

>>1192498
>ее назовет компилятор, потому что линкеру нужно имя.
Не у всего есть linkage, дебич.

>> нет промисов
>И слава богу.
Люмпен от программирования as is.

Ответы192553192681

19 мая, 08:10 166 1192550

В CLion на винде вообще возможно запускать программу в отдельном окне консоли, а не встроенном в IDE?

Ответы192632

19 мая, 08:13 167 1192551

>>1192477
>функций
Анонимные функции - синтаксический сахар.
>>1192477
>нет дженериков
Не дженериков, а шаблонов, ты откуда такой вылез?
>нет промисов
нинужно
Рассматриваем Цэ, как удобный кросплатформенный ассамблер

Ответы192563

19 мая, 08:19 168 1192552

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

19 мая, 08:24 169 1192553

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

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

19 мая, 09:35 170 1192563

>>1192551
>Анонимные функции - синтаксический сахар.
Это, прежде всего, освобождение глобального неймспейса от ненужного хлама.
>нет промисов
Можно сделать с помощью longjmp/setjmp

19 мая, 09:43 171 1192565

>>1192498
>потому что линкеру нужно имя
>статическая функция
Пиздец, какие же здесь дауны сидят.

Ответы192591192681

19 мая, 11:23 172 1192591

>>1192565
>кичится знанием базовый вещей
Мань, ты задачи бизнеса-то решать сможешь?
Тебе ставят большую задачу написать распределенное приложение. Что делать будешь, байтомакака?

Ответы192615192709

19 мая, 12:36 173 1192615

>>1192591
Кто ж поставит байтомакаке такое задание? В лучшем случае отпрофилируют и тормозное говнецо отдадут переделать.

Ответы192618192709

19 мая, 12:50 174 1192618

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

Ответы192709

19 мая, 13:06 175 1192632

>>1192550
Бампану. Или посоветуйте пожалуйства, годную и легкую IDE для Си

Ответы192688192704192941192944

15 Кб, 648x485
sage 19 мая, 14:25 176 1192681

>>1192549
> Не у всего есть linkage, дебич.
А линкерам надо работать вне зависимости от того, какими асбтракциями это обмазали в стандарте.

>>1192565
> статическая функция
> Пиздец, какие же здесь дауны сидят.
Действительно.

19 мая, 14:46 177 1192688

>>1192632
нотепад++

Ответы192698

19 мая, 15:03 178 1192698

>>1192688
Ну это уже перебор.

Ответы192996

19 мая, 15:11 179 1192704

>>1192632
Про Pelles C написано в шапке. Если тебе только Си и только винда, его будет достаточно.

19 мая, 15:22 180 1192707

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

Л — Логика.

19 мая, 15:26 181 1192709

>>1192591
>>1192615
>>1192618
Одинэсники отакуэ няшный тренд, все в налоговую.
мимо jsмокаг

Ответы192751

19 мая, 16:07 182 1192751

>>1192709
>мимо jsмокаг
ну вы заебали, это единственный илитарный трхед, был...

Ответы192757192762

19 мая, 16:22 183 1192757

>>1192751
Он и остается илитарным. Всякие js макаки тут не задерживаются, если не интересуются сями.

19 мая, 16:25 184 1192762

>>1192751
Я на С 12 лет назад лабы делал в универе. Первая любовь. А JS - стал нужен пару лет назад сугубо из практических, но не корыстных целей (расширения браузера). Трхед незапятнан.

Ответы192765

118 Кб, 700x393
19 мая, 16:31 185 1192765

>>1192762
>Трхед незапятнан.
Ну тогда хорошо

Ответы192766

19 мая, 16:35 186 1192766

>>1192765
Он запятнан макакой.

Ответы193455

19 мая, 17:13 187 1192775

>>1192463
Хмм, с порядком байтов всё понятно, x86-Little-endian.
Но вот про порядки битов я дохрена разного нашёл.
Кое-где связывают Little-endian с нумерацией с МЗБ, а big-endian связывают с нумерацией с СЗБ.

Ответы192867

19 мая, 20:05 188 1192867

>>1192775
Железячники с младшего нумеруют. Intel (если уж мы об x86) с младшего нумерует. Разброд и шатания начинаются, когда нужно упаковать/распаковать поток битов в байты или слова, тогда, действительно, бывает и со старшего записано, и даже задом наперед - кому как удобнее.

Ответы192870

sage 19 мая, 20:11 189 1192870

>>1192867
И вообще даже сама запись двоичного числа - это bitn-1×2n-1 + bitn-2×2n-2 + ... + bit2×22 + bit1×1i + bit0×20, номер бита логически вытекает из соответветствующей ему степени двойки.

Ответы192875

sage 19 мая, 20:13 190 1192875

>>1192870
> 1i
bitn-1×2n-1 + bitn-2×2n-2 + ... + bit2×22 + bit1×21 + bit0×20
Ну вы поняли. Не могу ответить итт и не облажаться.

17 Кб, 594x600
19 мая, 21:27 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");/

Ответы192919

19 мая, 21:35 192 1192919

>>1192909
https://ideone.com/jxEyXC
Заебашил код сюда, что бы пацанам понятнее было. Спасибо

Ответы192930

19 мая, 21:50 193 1192930

>>1192919
Ну все правильно, ты ведь не выделяешь память под каждый новый элемент, а кладешь каждый раз один и тот же указатель на один и тот же буфер (m), и ты в цикле его затираешь все новыми и новыми данными, в результате твой вектор содержит 6 одинаковых указателей на буфер, в котором осталось последнее записанное туда значение. Напиши себе реализацию strdup, чтобы оно работало, как ты ожидаешь.

В push_back можно обойтись только realloc(), вспомнив, что realloc(NULL, size) - это то же, что malloc(size) - тогда тебе не нужно будет городить две раздельные ветки ради одного и того же.

Ответы192942

19 мая, 22:15 194 1192941

>>1192632
vim/emacs + gdb + ctags

Ответы192943

19 мая, 22:19 195 1192942

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

Ответы192946

19 мая, 22:19 196 1192943

>>1192941
И мозоли, мозоли!

19 мая, 22:20 197 1192944

>>1192632
codeblocks, 80мб

19 мая, 22:23 198 1192946

>>1192942
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() каждому такому элементу сделать. Хотя в твоей лабе можно и обойтись.

169 Кб, 500x322
19 мая, 23:19 199 1192970

Ребята, а кто-нибудь из вас работает на C? Че делаете хоть? Сервера какие-нибудь пишете?

Ответы192983

19 мая, 23:48 200 1192983

>>1192970
Да, автомотив. Пишу логику сенсоров для электромашин будущего.

Ответы192994

19 мая, 23:49 201 1192986

Нет аннотаций/декораторов.

20 мая, 00:02 202 1192994

>>1192983
>автомотив
Компания АвтоМотив это интернет магазин оборудования для автосервиса и СТО.

Ответы192998

20 мая, 00:06 203 1192996

>>1192698
Почему? Хуярю на нем, всем доволен, иногда на вим перескакиваю.

20 мая, 00:07 204 1192998

>>1192994
>АвтоМотив
Автомотив, это не компания, автомотив компании это даймлер, бэ эм дабл ю, волксваген и харман, генерал мотрос.

Ответы192999

20 мая, 00:10 205 1192999

>>1192998
https://avto-motiv.ru

1,9 Мб, 2000x2610
20 мая, 13:03 206 1193165

>>1187521 (OP)
Поясните, как создать графический интерфейс на чистом Си и что для этого лучше всего использовать? Gtk+ плох для нелинукс систем, Qt объектно-ориентированный, а wxWidgets судя по всему вобще не совместим с чистым Си (если всё-таки совместим подкиньте гайдов). Толко не советуйте WinAPI.

Ответы193175193353

20 мая, 13:12 207 1193175

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

Ответы193179

20 мая, 13:14 208 1193179

>>1193175
Я просто хочу найчиться делать программы с GUI на чистом Си, желательно самым простым способом.

Ответы193181193189

20 мая, 13:15 209 1193181

>>1193179
*научиться

20 мая, 13:22 210 1193189

>>1193179
Простых способов нет.

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

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

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

Есть tcl/tk...

Ответы193208

20 мая, 13:27 211 1193208

>>1193189
Возможно ли создать GUI на чистом Си с использованием Qt? Я знаю, что это объектно-ориентированный фреймворк, а в Си нет ни классов, ни поддержки ООП. Оно разве будет работать?

Ответы193221

20 мая, 13:33 212 1193221

>>1193208
Да

Ответы193252

7 Кб, 446x191
20 мая, 13:45 213 1193252

>>1193221
Тогда как? Я использую Qt в связке с Visual Studio, но когда создаю новый проект, мне на выбор предлагают только Visual C++.

Ответы193259193428

20 мая, 13:48 214 1193259

>>1193252
Пиши либу на Си и линкуй с крестовой гуидятиной

Ответы193266

145 Кб, 600x450
20 мая, 13:52 215 1193266

>>1193259

Ответы193275

212 Кб, 1218x1015
20 мая, 13:57 216 1193275

>>1193266
Вот жиза, такие-то советы. Проще уж сразу на C++ писать.

20 мая, 15:05 217 1193353

>>1193165
https://github.com/andlabs/libui

20 мая, 16:09 218 1193404

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

Ответы193421

20 мая, 16:38 219 1193421

>>1193404
Ебанашка, ты доски попутал. Гаврюша, пиздуй в /s.

ставь дебиан net install без ДЕ и прочих пряников, будешь в голой сосноле пердолиться. Не так страшно на самом деде, зависит от задач. Что-то даже проще будет делать, чем сидеть в GUI

20 мая, 16:50 220 1193428

>>1193252
Пиши либу на Си, а интерфейс на Qt на крестах. Кроссплатформенных UI для Си нет. То, что есть - выглядит отвратительно. Лучше всего использовать Gtk на линуксах и Windows API на винде. Да, пилить два интерфейса. Да, долго и сложно. Зато не будет выглядеть как 99% опенсорса.

Ответы193436

20 мая, 17:09 221 1193436

>>1193428
Пиздеж и кукареканье. Tcl/tk, gtk, qt — все кроссплатформенное. Есть еще немного маленьких библиотек с тем же функционалом. 2 уже выше приводили.

Ответы193442

20 мая, 17:26 222 1193442

>>1193436
> Пиздеж и кукареканье
Научись посты целиком читать.

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

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

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

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

> Есть еще немного маленьких библиотек
Либо кастомная отрисовка со всеми возможнными недостатками (ограниченно подходит для игр, не подходит для приложений), либо очень ограниченные возможности уровня окна/кнопки/поля ввода.

Ответы193446193449

20 мая, 17:31 223 1193446

>>1193442
Qt есть минимал или как-то так. На этом движке пилят lxqt продолжение lxde.

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

Ответы193453

20 мая, 17:34 224 1193449

>>1193442
Забыл добавить, что gtk на винде нормально выглядит. Audacious media player или cherrytree тому пример. Вполне себе нативно.

20 мая, 17:44 225 1193453

>>1193446
> Игры, блядь, пишут на юнити
Да ты что, никогда бы не подумал! А интерфейсов в играх нет, и кнопка "Выйти из этой индипараши и удалить ее нахуй" появляется магически?

Ответы193459

20 мая, 17:46 226 1193455

>>1192766
Что тогда ей не запятнано? Ответ "хуита и бред на апачан.нет" не принимается.

20 мая, 17:48 227 1193459

>>1193453
А ты точно пишешь на С и знаком с юнити? Мне кажется ты залетный из js треда.

Ответы193461

20 мая, 17:54 228 1193461

>>1193459
С юнити почти не знаком, но слово "индиговно" должно было тебе намекнуть, что кроме игр на крупных движках есть еще и поделки, в которых из чужого кода максимум SDL. И вот они используют всякие nuklear, потому что нормальный UI писать долго, а кнопочки нужны. Итт достаточно давно обитаю, больше десяти лет пишу на Си.

Ответы193463

20 мая, 17:57 229 1193463

>>1193461
Ну и где ты тогда противоречия увидел? Спор ради спора?

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

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

Ответы193464

20 мая, 17:58 230 1193464

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

Ответы193468

20 мая, 17:59 231 1193465

С чего начать изучать тему, если я хочу написать свою либу уровня graphics.h или curses, используя WinAPI? Ну или просто маленький фреймворк для менюшек консольных.

Ответы193511193516

20 мая, 18:01 232 1193468

>>1193464
Опровергни тогда. Ах да, примером из этого тысячилетия. Чтобы и УИ и все прочее на С без всчких сторонних библиотек. Ну давай, удиви кукаретик ебаный, с 10 годами стажа. Ха ха врунишка.

Ответы193488

96 Кб, 700x933
20 мая, 18:11 233 1193476

Мне кажется в наш илитарный тредик начали набигать всякие.

Ответы193503

20 мая, 18:20 234 1193488

>>1193468
> Опровергни тогда
Ты уж как-нибудь сам. Сходи поищи, например, среди игр с LD, среди опенсорсных игр. Навскиду, GLTron и уебывай в гугл.

Ответы193490

20 мая, 18:23 235 1193490

>>1193488
Т.е. ты хотел сказать, что есть 1,5 проекта, которые в гугле на 789 064 255 странице выдачи?

Я не отрицаю, что есть единичные проекты, но индустрия давно уже держится на других слонах.

Ответы193516

20 мая, 18:31 236 1193496

>>1187521 (OP)
Есть ли какая-нибудь годная книжка с алгоритмами? А то переводить Цельсии в Фаренгейты не слишком уж интересно.

Ответы193504

20 мая, 18:38 237 1193503

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

Ответы193792

20 мая, 18:39 238 1193504

>>1193496
Дональд Кнут

20 мая, 18:49 239 1193511

>>1193465
Бамп.

20 мая, 18:58 240 1193516

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

>>1193465
А это разве не ты был? >>1190612 там ссылка на книгу.

Ответы193518

20 мая, 19:02 241 1193518

>>1193516
Ну, это попутно будет изучено. А вот как вынести все это в dll, например, чтобы оттуда дергать все более высокие самопальные функции? Короче, хочу написать обертку над апи.

Ответы193520193526

20 мая, 19:04 242 1193520

>>1193518
Чтобы от инициализации до обработки меню, с назначением функций на пункты, етц.

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

Ответы193526

20 мая, 19:11 243 1193526

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

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

Ответы193528193533

20 мая, 19:16 244 1193528

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

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

Нормально же спросил к чему это высокомерие хуесос ты четырехглазый.

Ответы193530

20 мая, 19:20 245 1193530

>>1193528
Я не четырёхглазый.

20 мая, 19:24 246 1193533

>>1193526
Я, наверное, свои вопросы не смогу объяснить. Так что просто пойду и попробую сделать.

Ответы193549

20 мая, 19:30 247 1193538

Почему функция fgets не добавляет символ '\n' в строку?

Ответы193539193545193549

20 мая, 19:32 248 1193539

>>1193538
Почему она не добавляет \t или \b в начало строки?

Ответы193540193544

20 мая, 19:34 249 1193540

>>1193539
Почему она не проверяет строку на грамматические ошибки?

Ответы193541193544

338 Кб, 1023x575
20 мая, 19:35 250 1193541

>>1193540
Дебилка блядь в microsoft word набирай код для проверки

ну или aspell инклюдь и проверяйся

Ответы193544

20 мая, 19:41 251 1193544

>>1193539
>>1193540
>>1193541
"Символ новой строки прекращает работу функции fgets, но он считается допустимым символом, и поэтому он копируется в строку string."
При вызове fgets(str, sizeof str, stdin) пишу '4'
В строке получаю 4\n\0
Если пишу '-4'
В строке получаю 4\0
Что за хуйня?

Ответы193546

20 мая, 19:41 252 1193545

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

Ответы193551

20 мая, 19:42 253 1193546

>>1193544
>В строке получаю 4\0
-4\0
Быстрофикс

Ответы193547193548

20 мая, 19:43 254 1193547

>>1193546
Какой sizeof(str)?
Если не 3, то у вас просто пространство искривилось.

Ответы193552

20 мая, 19:44 255 1193548

>>1193546
Ну а сам как думаешь? Как -4 может быть int? Str это положительная длина, а не отрицательная.

Ответы193550

20 мая, 19:45 256 1193549

>>1193533
Отлично, а с проблемами приходи.

>>1193538
Допустимо всего два варианта: либо у тебя EOF возник, либо твой буфер меньше длины строки. Тащи пример на ideone, где оно не работает.

20 мая, 19:45 257 1193550

>>1193548
Он это на stdin пишет, наркоман

Ответы193553

20 мая, 19:47 258 1193551

>>1193545
быстрофикс
Только фишка в том, что fgets предназначена для работы в паре c fputs, которая этот символ добавляет

20 мая, 19:49 259 1193552

>>1193547
а sizeof считает память, выделенную в куче?
str = malloc (1002);

Ответы193554

20 мая, 19:49 260 1193553

>>1193550
Ты головой ударился? Он пишет из stdin в str

20 мая, 19:50 261 1193554

>>1193552
Епо, ты передаёшь sizeof от указателя на кучу.

Ответы193559193590

20 мая, 19:54 262 1193559

>>1193554
Все, вопрос решен. sizeof (str) = 1 (у меня система 8-битная), то есть считает только размер типа, а указатель в 8-бит системах = 1 байт.

Ответы193562

20 мая, 19:56 263 1193562

>>1193559
> у меня система 8-битная
Так, это что значит?
Размер чара 8 бит? И що? sizeof(char)=|Def|=1, пусть он даже 10 бит.
Размер типа считает, да. Но указатель как правило long.

Ответы193566

20 мая, 20:01 264 1193566

>>1193562
str - это указатель на тип char
Указатель в 8-бит системах имеет размер 1 байт.
Поэтому sizeof(str) = 1

Ответы193568

20 мая, 20:03 265 1193568

>>1193566
str - указатель.
И sizeof(str) не вернёт тебе размер char.

Ответы193594

20 мая, 20:21 266 1193590

>>1193554
Ну даже так у него все должно быть нормально в случае "4" и "-4" (на ideone например нормально, потому что размер указателя там 8), хотя он и долбоеб. Если только он не конпелирует какой нибудь устаревшей хуетой типа Турбо Си, где инт - 16-битовый (я знаю что есть преподаватели ебанашки которые не признают современных сред)

Ответы193593

20 мая, 20:23 267 1193593

>>1193590
Хз, у него вообще 3 символа вошло, как я понял, в обоих случаях.

Ответы193596

20 мая, 20:24 268 1193594

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

Ответы193598

20 мая, 20:26 269 1193596

>>1193593
Удалось записать != вошло. Затер какую-то переменную рядом с буфером, это и привело к спецэффектам.

20 мая, 20:28 270 1193598

>>1193594
Любой, мать твою

129 Кб, 712x719
Пацаны помогите решить судьбу мою 20 мая, 20:34 271 1193604

Сейчас делаю дипломную для шараги, пишу консольную программку на си для своего роутера на openwrt. Мне это дико нравится и вставляет. Но проблема в том, что в этом суровом, жестоком, несправедливом мире байтоебы никому нахуй ненужны.
Есть другой вариант. Учить javascript и становиться фулстак макакой, задрачивать ноду. После того как отбатрачу на галере и наберусь опыта, открывать свой наебизнес, или по крайне мере буду сеньор помидором с деньгами в хипстеротусовочке. Но меня дико тошнит от слов html, css, photoshop и все что связано с версткой заставляет мой пукан нагриваться до такой степени что в нем можно заваривать воду для доширака.
Блять, что делать? Задрачивать после си кресты?

Ответы193611

20 мая, 20:41 272 1193611

55 Кб, 808x776250 Кб, 1350x806

>>1193604
оффтоп
но у меня горит шо пиздец

Ответы193672

20 мая, 20:57 273 1193616

Как можно выводить динамическое дробное число полностью, без лишних нулей?
Если в printf использовать %f, то будут выводиться лишние нули в дробной части.
Если использовать %g, то число с большим количеством символов, выводится в %e формате.
Так с помощью printf'а это никак не реализовать? Может быть можно как-то принудительно заставить %g всегда отображать число в %f формате?
Или единственный вариант - сначала переводить число в строку, а затем печатать его fputs'ом?

Ответы193618193622

20 мая, 20:57 274 1193618

>>1193616
Лох ебаный блядь )) про модификторы не прочитал, хуесос тупорылый

Ответы193622193625

20 мая, 21:09 275 1193622

>>1193618
Я так понимаю, что у него постоянно меняется число, и ему надо выводить его без лишних нулей
>>1193616
Нет, так чтобы компилятор за тебя думал, нельзя. Либо строкой, либо округлять до необходимого количества разрядов

20 мая, 21:12 276 1193625

>>1193618
Писать %.100g - это ведь не решение.
Для %f вообще нет смысла в модификаторах точности

Ответы193669

20 мая, 22:14 277 1193669

>>1193625
> Писать %.100g - это ведь не решение.
Не решение. Но можно добавить символов, и будет норм. Вот тебе крайние случаи из старого треда, посчитай циферки и используй:
https://ideone.com/JyE5Qp
А так, зависит от задачи. Для показывания человекам округленное значение или %g с достаточной точностью - вполне норм (и пусть оно экспоненту показывает, если не хватило). Для передачи текстом между двумя машинами есть %a.

20 мая, 22:19 278 1193672

>>1193611
Значит байтоёбство - всё? Низкоуровневое погромирование больше никому не нужно? А я только вкатываться собирался ну и подумываю о том, что бы в битки начать вкладываться

Ответы193676

20 мая, 22:26 279 1193676

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

Ответы193678193682

20 мая, 22:28 280 1193678

>>1193676
Эмбеддед же.

Ответы193791

20 мая, 22:30 281 1193682

>>1193676
Гейдев

20 мая, 23:58 282 1193729

Вы заебали смотреть на веб-макак. Прыщи/спермятина на ноде что ли уде стали работать? С и кресты там в почёте, микроконтроллеры, всякий настольный софь типа эдоуб, да куча направлений, где «байтоёбство» пригодится.

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

Ответы193731193742193759

sage 21 мая, 00:05 283 1193731

>>1193729
> есть ниша с диез
C и C# имеют столько же общего, сколько свинка и морская свинка.

Ответы193732

21 мая, 00:08 284 1193732

>>1193731
О рили блядь? Открыл нахуй омерику ебана в рот. Я написал в ироничном контексте про нищу, если уж совсем прижмет, то мложно будет окунуться в этот пиздец, если кресты не осилите.

21 мая, 00:26 285 1193742

>>1193729
Шизофрения какая-то.

21 мая, 00:53 286 1193759

>>1193729
Байтоёбу неприятна. Гоните его с рынка труда, насмехайтесь над ним.

21 мая, 02:02 287 1193791

>>1193678
За 50 тысяч и невыездом из России на 10 лет?
Нет, спасибо.

Ответы194854

21 мая, 02:04 288 1193792

>>1193503
А сам чем по жизни промышляешь?

22 мая, 17:49 289 1194854

>>1193791
>За 50 тысяч
Примерно. Сильно дохуя платить не будут.
> невыездом из России на 10 лет?
Такое не очень часто бывает. И не всегда знание гос.тайны влечет невыезд.

22 мая, 19:17 290 1194945

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

Ответы194948194951194965

22 мая, 19:20 291 1194948

>>1194945
>Как вы, блядь, ебетесь с этим всем?
Опыт и паттерны, выделил память не забудь убрать. Все просто.

22 мая, 19:22 292 1194951

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

Ответы194977

22 мая, 19:41 293 1194965

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

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

Ответы195041

22 мая, 20:13 294 1194977

>>1194951
А при чем язык, если многопоточность удел ОС?

Ответы194995195019

22 мая, 20:25 295 1194995

>>1194977
Блять нихуясебе. Все больше убеждаюсь что C самый адекватный тред тут

Ответы195001195015

22 мая, 20:31 296 1195001

>>1194995
А как называется та хуйня, когда есть несколько ядер и часть программы (например, цикл) одновременно считается на каждом из них?
Это тоже свойство системы или низкоуровневые языки имеют команды типа "эту ерунду считает процессор номер n"?

Ответы195002195019

22 мая, 20:32 297 1195002

>>1195001
Это свойство ОС, безусловно, описанное на низком уровне

22 мая, 20:43 298 1195015

>>1194995
Был, пока ты не пришел.

Ответы195022

22 мая, 20:50 299 1195019

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

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

22 мая, 20:57 300 1195022

>>1195015
Мамку твою ебал

22 мая, 21:28 301 1195041

>>1194965
>если у тебя код с багами
Если это просто утечка, то да. У белых людей есть умные указатели.

Ответы195046

22 мая, 21:38 302 1195046

>>1195041
Умные указатели не бесплатные. И без них вполне можно жить.

24 мая, 16:09 303 1196111

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

Ответы196115196159

24 мая, 16:14 304 1196115

>>1196111
>как битки двигать?
<<
>>
Теперь ступай с миром нахуй

Ответы196116

24 мая, 16:15 305 1196116

>>1196115
Не гринтексти мне тут райт шифтом.

Ответы196118

24 мая, 16:17 306 1196118

>>1196116
А ты мне запрети, мальчик.

Ответы196119

24 мая, 16:18 307 1196119

>>1196118
Время скоро запретит, старый пердун

Ответы196121

24 мая, 16:20 308 1196121

>>1196119
>скоро
Здесь мы идем.

24 мая, 16:22 309 1196124

unsigned char из какого стандарта?

Ответы196158

24 мая, 17:26 310 1196158

>>1196124
Pre-K&R еще. В C89, естественно, есть. А вот uint8_t и stdint.h появились в C99.

24 мая, 17:28 311 1196159

>>1196111
Классическая статья: https://graphics.stanford.edu/~seander/bithacks.html
Нет, комбинаций не так много, с xor биты переключают, с | включают, с & ~ выключают. Остальные варианты как минимум длиннее.

24 мая, 18:51 312 1196200

>>1187521 (OP)
Сап, бояре.
Очень мало писал на си, в основном на крестах.
Но тут внезапно вяли на работу, написание драйверов под сетевые адаптеры на linux/windows, чтобы такого можно почитать, чтобы хоть чуть-чуть что-нибудь понять?
в си не углублялся, в крестах чувствую себя более-менее

Ответы196684

25 мая, 11:13 313 1196567

Есть ли какой-нибудь опенсорсный небольшой проект чисто на Си желательно еще и с WinAPI, в котором вот прямо отличный код, эталон?

Ответы196665

55 Кб, 730x590
25 мая, 14:38 314 1196665

>>1196567
https://github.com/cysin/info-zip

25 мая, 15:15 315 1196684

>>1196200
Никаких идей?

Ответы196716

25 мая, 15:53 316 1196716

>>1196684
Ну разве что Эндрю Таненбаума...

Ответы197058

26 мая, 10:08 317 1197058

>>1196716
Книга есть где-нибудь?
Или самому поискать?

Ответы197128

26 мая, 13:45 318 1197128

>>1197058
> Книга есть где-нибудь?
Где-нибудь есть.
> Или самому поискать?
Поищи.
А вообще, стоит знать, что существуют примерно два крупных сайта с учебниками, ели там нет, с большой вероятностью нигде нет.

Ответы197132

26 мая, 14:02 319 1197132

>>1197128
А что за сайты, если не секрет?

27 мая, 10:02 320 1197562

Можно ли как-то исхитриться с макросами, что бы объявлять глобальные переменные в функции?

27 мая, 10:26 321 1197575

Вот такой чек на byte order:
unsigned long endian=1;
unsigned char isbigend=(!∗((char ∗)&endian));
Но это не будет работать, если sizeof(unsigned long)=sizeof(char). В C89 есть тип, который гарантированно больше, чем char.
ЕМНИП, там везде неравенства нестрогие.

Ответы197577197807

27 мая, 10:27 322 1197576

9 Кб, 350x17012 Кб, 286x207

Аноны помогите дураку, начал читать классику в лице K&R, ну и возник затык, почему этот код не делает что должен? По идее должен считать количество символов/строк, но этого не происходит.
линукс, компилирую tcc
При этом на ideone все компилируется и работает как надо, в чем проблема? В компиляторе? В эмуляторе терминала? Что я делаю не так?

Ответы197597197807204688

27 мая, 10:31 323 1197577

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

27 мая, 11:13 324 1197597

>>1197576
Ты уверен что тебе нужен for(...); вместо for(...){}?

Ответы197807

27 мая, 17:19 325 1197807

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

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

>>1197597
Да, для его for() не нужно тело.

27 мая, 17:34 326 1197816

Помогите студенту
Есть ASP.NET и DataGrid c данными из SQL
1)Как изменить вывод данных, то есть вместо N выводится N/5 или N+5.
2)Как добавить колонку, созданную из значений двух колонок, например Column1 = Column 1 + Column2
3)Как привязать графики к значениям колонки?

Ответы197866197886197904

sage 27 мая, 18:34 327 1197866

>>1197816
> NET

sage 27 мая, 19:01 328 1197886

>>1197816
Во первых, ты проебался с тредом. У нас тут сишечка а не шарп.
Во вторых, с лабами иди нахуй!

Ответы197937

sage 27 мая, 19:37 329 1197904

>>1197816
Какая-то неизвестная мне сишечка. где в документации прочитать про DataGrid?

Ответы197937

27 мая, 20:38 330 1197937

>>1197886
>>1197904
Извините, действительно не туда.

27 мая, 23:17 331 1198044

В общем треде проигнорили, поэтому соре, дублирую здесь.

Уважаемые опытные программистеры, помогите выбрать.
Хочу заниматься разработкой (gamedev в идеале), но все мы прекрасно знаем, что без опыта нахуй кому нужен. Есть возможность поработать скриптизером на C (нагрузочное тестирование), стоит ли тратить время на получение хоть какого то официального опыта или продолжать попытки самообразования в надежде найти работу потом?

Ответы198046198133

27 мая, 23:18 332 1198046

>>1198044
Юзай любую возможность получить опыт

28 мая, 07:53 333 1198133

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

28 мая, 19:12 334 1198437

По какой литературе изучить GAS?
Хочу инлайны свободно пилить потом.

Ответы198454

28 мая, 20:13 335 1198454

>>1198437
3,5 говнокниги, нахуй оно нужно. Вруби интеловский синтаксис и не еби небе мозга.

29 мая, 06:41 336 1198640

>>1192344
Нинужно /thread

Ответы198642

sage 29 мая, 07:00 337 1198642

>>1198640
Автовывод не нужен, неймспейсы очень нужны. Особенно нужны неймспейсы для енумов (и типы заодно).

Ответы198645

29 мая, 07:21 338 1198645

>>1198642
Иди свой язык пили, C++ и C-- уже есть. Пусть будет C==

Ответы198677198846198965

29 мая, 09:29 339 1198677

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

21 Кб, 364x253
29 мая, 14:45 340 1198846

>>1198645
C===

Ответы198868

29 мая, 15:22 341 1198868

>>1198846
C===8

sage 29 мая, 18:28 342 1198965

>>1198645
Я не считаю себя настолько крутым. Компилятор напишу, юзабельный язык - вряд ли.

Ответы198997

sage 29 мая, 19:08 343 1198997

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

Ответы199007199054

96 Кб, 700x933
29 мая, 19:20 344 1199007

>>1198997
>котлин

Ответы199014

sage 29 мая, 19:32 345 1199014

>>1199007
Ну они хотели как лучше, вышло как всегда.
хуево, очень

Ответы199031

16 Кб, 400x222
29 мая, 19:56 346 1199031

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

51 Кб, 395x104
sage 29 мая, 20:38 347 1199054

>>1198997
> Ранние кресты так и делали.
И получался пикрелейтед. Первое издание "Как испортить Си классами" за авторством некоего Страуструпа

Ответы199057199060

90 Кб, 419x159
sage 29 мая, 20:40 348 1199057

>>1199054
Облажался с пиком.

sage 29 мая, 20:42 349 1199060

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

Ответы199064

sage 29 мая, 20:45 350 1199064

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

Ответы199068

sage 29 мая, 20:48 351 1199068

>>1199064
>llvm
Компилятор тогда в 640кб не уместить

30 мая, 19:28 352 1199573

Сап, анон. Пытаюсь в .txt парсер забуриться. Раскидай мне, плес, стоит ли мне strtok() юзать или же навелосепидировать собственный токенизатор?

Ответы199582

30 мая, 19:38 353 1199582

>>1199573
> в .txt парсер
Лолшто? Что ты там парсить собрался?

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

Ответы199593

30 мая, 19:49 354 1199593

>>1199582
>Если у тебя нет четких разделителей
В смысле чётких? Я могу слова в качестве шаблонов для разделения задавать?
>Что там парсить
Ну, велосепидирую тут частотный словарь. Интересно получится или нет. Но чтобы в начале не обосраться решил погуглить, а не набивать шишки. Ну, в примерах нет слов в качестве разделителей.

Ответы199597

30 мая, 19:52 355 1199597

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

Ответы199600

30 мая, 19:54 356 1199600

>>1199597
Спасибо анон. Чая тебе и пончиков.

311 Кб, 1136x640
31 мая, 12:04 357 1199902

Привет ананасы. Объясните как можно подробнее про библиотечные файлы в языке си мне(изучающему язык). Расскажите про то где на самом деле находится определение функций(таких как принтф сканф или геткэр путкэр и тд), что еще помимо прототипов находится в библиотечных файлах (таких как stdio.h, stdlib.h) и зачем оно там. Почему в 1 издании книги брайана кернигана и денниса ритчи в примерах с кодом не подключались заголовочные файлы(пример на картинке) и почему в ос убунту мне приходится прибегать к танцам с бубном при подключении библиотечного файла math.h и вызове функции (sqrt() например), прога не компилится и приходится прописывать дополнительные команды вроде -lm(зачем она вообще нужна я хз). В общем вопросов много, выручайте, очень интересно

Ответы200083

31 мая, 18:41 358 1200083

>>1199902
> Почему в 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).

31 мая, 18:41 358 1200083

>>1199902
> Почему в 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).

Показать весь текст
Ответы200089200102200302

31 мая, 18:46 359 1200089

>>1200083
чел, ты охуенный, но я, например, тоже все это знаю
просто не пиши и не отвечай ньюфагам irl
надо будет, сами будут грызть книги и копать вглубь
а так ты им за 5 минут объяснишь то, на что потратил недели лютого задротства, сидения под отладчиком и чтения манов
это то же самое что и продавать бананы по 5 рублей, когда они стоят 45

Ответы200296

31 мая, 19:10 360 1200102

>>1200083
> только в С11 окончательно убили
То есть теперь за типы long или unsigned компилятор пошлет тебя нахуй?

Ответы200108200117

31 мая, 19:19 361 1200108

>>1200102
Нет, но скорее всего кинет предупреждение при компиляции

31 мая, 19:39 362 1200117

>>1200102
Нет, long - это синоним long int, unsigned - синоним unsigned int, это просто сокращенные формы записи. А неявный int используется, когда ты по каким-то причинам вообще не указал тип, как тут тип bar и типы возвращаемых значений у printf, foo и main, например:
foo(bar) { printf("%d\n", bar); }
main() { foo(1); }

31 мая, 22:19 363 1200296

>>1200089
> irl
но это же двачь

31 мая, 22:23 364 1200302

>>1200083
Охуеть ты расписал. Спасибо.

1 июня, 15:15 365 1200663

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

Ответы200671

1 июня, 15:30 366 1200671

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

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

Ответы200684200735

1 июня, 15:45 367 1200684

>>1200671
Спасибо за путь.

1 июня, 16:49 368 1200735

>>1200671
> делать потоков больше чем ядер процессора - бессмысленно
Да что ты говоришь? На iowait висеть уже не модно?

1 июня, 16:59 369 1200737

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

Ответы200739201001

1 июня, 17:00 370 1200739

>>1200737
Что такое "плагины компилятора"?

Ответы201001

1 июня, 21:52 371 1200950

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

Ответы200955200959200993201627201672

1 июня, 21:57 372 1200955

>>1200950
Всё целесообразно задаче.
Сидеть на жирушном x86 и делать такое это дебилизм, канеш

1 июня, 22:01 373 1200959

>>1200950
>в инт сувать и ок?
Ну да, твой чар всеравно 8 байт не занимает, если это не массив.

Ответы200982

1 июня, 22:20 374 1200982

>>1200959
А почему он занимает не 8 байт? Байт минимальная единица, не?

Ответы201000

1 июня, 22:28 375 1200993

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

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

> или я слишком сильно оптимизируют
С возврастом это проходит.

Ответы201220

1 июня, 22:39 376 1201000

>>1200982
Потому что выравнивание.

1 июня, 22:40 377 1201001

>>1200739
Полагаю, речь идет о расширениях.

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

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

Ответы201414

2 июня, 00:21 378 1201092

Пишет кто-нибудь под андроид на C? Как оно?

2 июня, 01:10 379 1201137

>>1187521 (OP)
что делает код:
arr1[arr2[count++]]++;
?

Ответы201145201150

2 июня, 01:18 380 1201145

>>1201137
index = arr2[count]
count = count + 1;
arr1[index] = arr1[index] + 1;
Мог бы и сам разобрать.

Ответы201300

111 Кб, 720x1280
2 июня, 01:21 381 1201150

>>1201137
Обращается к arr2[count], увеличивает count на 1, обращается к arr1[arr2[count]], <- здесь значение то, что было в начале, то есть обращение к arr2 не происходит снова грубо говоря.

Ответы201152201300

2 июня, 01:22 382 1201152

>>1201150
А, там ещё стоит ++, ну в общем потом значение внутри ячейки ещё увеличится, ну написали вроде уже.

2 июня, 06:56 383 1201220

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

Посоветуешь материалы, чтобы понять, как правильно?

Ответы201533

2 июня, 12:07 384 1201300

>>1201150
>>1201145
Разве он сначала не плюсует count, а потом использует его как индекс для arr2?

Ответы201502

2 июня, 14:31 385 1201414

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

2 июня, 17:12 386 1201502

>>1201300
Нет, я же скинул пруфпик.

2 июня, 18:06 387 1201533

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

Ответы201538

2 июня, 18:10 388 1201538

>>1201533
>годболт
Что это?

Ответы201549

2 июня, 18:18 389 1201549

>>1201538
В шапке же есть. godbolt.org. Показывает, как компилируется твой код разными компиляторами.

2 июня, 18:28 390 1201559

есть какой-нить более мощный бесплатный аналог http://www.pythontutor.com/visualize.html#mode=edit?

Ответы201561

2 июня, 18:35 391 1201561

>>1201559
Во-первых, почему ты спрашиваешь про питон здесь? Во-вторых, раз уж ты спрашиваешь здесь, то да, есть, можешь взять любую IDE, зайти в отладчик, зажать F7 или F11 и смотреть на что-то похожее.

Ответы201564

2 июня, 18:44 392 1201564

>>1201561
там не тока питон, можно язык выбирать

2 июня, 19:36 393 1201627

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

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

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

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

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

Ответы201630201678

2 июня, 19:38 394 1201630

>>1201627

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

2 июня, 20:03 395 1201655

оптимизаторы сверху, вот типа создаешь структуру, в зависимости от разрядности между полями будут пробелы какие-то, тобиш условно структура будет весть не n байт, а n*x байт. Что мешает выравнивать структуры шоб меньше памяти занимали?

Ответы201673

2 июня, 20:32 396 1201672

>>1200950
Смысла выбирать более узкие типы с переходом на 64 бита нет никакого. Добьёшься своим char-ом только того, что у тебя в регистре будет 56 лишних, неиспользованных бит и всё. Работа со старшими битами регистров не трогая младшие в машинных кодах достаточно сложна, и компиляторы обычно не заморачиваются. По памяти тоже не выиграешь - выравниваются переменные все равно минимум по границе машинного слова - тех же 64 бит. Убавишь выравнивание - будет алиасинг, когда у тебя несколько переменных в одном слове памяти и обращение к одной тормозит обращение к другим.

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

В остальном просто расслабься и пиши понятный код.

2 июня, 20:34 397 1201673

>>1201655
1. Штраф производительности на чтение невыравненных переменных.
2. Альясинг: https://en.wikipedia.org/wiki/Aliasing_(computing)#Conflicts_with_optimization

2 июня, 20:56 398 1201678

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

2 июня, 21:03 399 1201682

Сделал подобную дичь для удобства. Это не быдлокод?
#define dynamic(type, name) type name=(type)malloc(sizeof(type))

Ответы201684

2 июня, 21:06 400 1201684

>>1201682
Это бессмысленно и опасно, потому что возвращаемое значение ты проверить забыл. Если лень писать вручную, сделай сниппет для IDE.

Ответы201687

2 июня, 21:08 401 1201687

>>1201684
Там указатели макаба скушала. А какая тут опасность-то?
И есть толк все переменные выделять динамически, чтобы удалять их по мере использования?

Ответы201689201690

2 июня, 21:11 402 1201689

>>1201687
> А какая тут опасность-то?
malloc() вернет NULL, ты упадешь.

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

Ответы201694201696201732

2 июня, 21:11 403 1201690

>>1201687
Нет, только лишние syscall'ы кидать

Ответы201692

2 июня, 21:12 404 1201692

>>1201690
И как часто malloc() syscall-ы дергает?

Ответы201693

2 июня, 21:15 405 1201693

>>1201692
Когда кучу надо расширить.

2 июня, 21:15 406 1201694

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

2 июня, 21:19 407 1201696

>>1201689
Блять ассемблер

2 июня, 22:42 408 1201729

ребята как учить стандарты если они выходят быстрее чем ты успеваешь их учить

Ответы201738201844

2 июня, 22:47 409 1201732

>>1201689
Вернулся мамкин оптимизатор
Разве malloc возвращает NULL не тогда, когда новую память выделить не реально, и вероятность того, что у юзера не будет новой памяти на столько мала, что можно и не проверять?

Ответы201734201740201847201894

2 июня, 22:53 410 1201734

>>1201732
Деды проверяли, и ты проверяй.
Ишшо себе выдумал!

2 июня, 23:02 411 1201738

>>1201729
Попробуй научиться читать не по слогам.

2 июня, 23:10 412 1201740

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

3 июня, 09:51 413 1201844

>>1201729
Не учи плюсы

3 июня, 09:52 414 1201847

>>1201732
То есть С++ new лучше malloc'a.

3 июня, 12:26 415 1201894

>>1201732
Вообще — нет.
Пример линукс:
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'а не обязательно приведёт к немедленному падению проги, а так же ведёт к дырам в ней.

Ответы202088202991

3 июня, 15:03 416 1202006

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

3 июня, 15:12 417 1202010

Хелло. Есть несколько регистров, мне нужно выбирать их
в зависимости от порта. Хотел бы сделать макро, чтобы работал так:
макро(идентификатор нужного регистра) |= пин;
идентично строчке
нужное_имя_регистра |= пин;

Насколько реально такое сделать и, если это реально, то как?

Ответы202093

3 июня, 15:12 418 1202011

Парни, кто-нибудь на Си-шке (не C++) коммерчески шпилит? Какой фреймворк для тестов используете?

Ответы202130204171

3 июня, 18:22 419 1202088

>>1201894
Но ты спастил отрывок со случаем, когда malloc() возвращает non-NULL но памяти нет, т.е. противоположный случай.
Но это не отменяет того, что то, что ты сказал - верно

3 июня, 18:35 420 1202093

>>1202010
Пример написал бы, как оно должно выглядеть. Возможно, ты хочешь приклеивать к имени порта аргумент:
#define PORTA_REG1 0x10002000
#define PORTA(reg) PORTA_##reg

PORTA(REG1) // Раскроется в 0x10002000

3 июня, 20:38 421 1202130

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

Ответы202134203138204171

3 июня, 20:42 422 1202134

>>1202130
Дело не в том, что все работает. Дело больше в том, что проблемы в Си часто связаны с undefined behavior, а обнаружить многие такие случаи тестами сложно, поведение может поменяться на противоположное на другой машине со слегка отличающейся версией компилятора. Поэтому на Си популярный ныне подход "напишем говно, покроем тестами и будем править баги" получается себе дороже, лучше сразу нормально писать.

Ответы203138204171

336 Кб, 1920x1080
3 июня, 21:03 423 1202145

Сделал небольшую обертку вокруг WinAPi. Это полезно?

Ответы202151

3 июня, 21:12 424 1202151

>>1202145
Полезно. А теперь оберни иксы еще так же. И постарайся не ошибиться тредом в следующий раз.

Ответы202154

3 июня, 21:16 425 1202154

>>1202151
Они тоже ебанутые как WinApi?

Ответы202164

3 июня, 21:37 426 1202164

>>1202154
Windows API вполне вменяемый API. Ненормально там обилие ненужных дублирующихся типов, тонны легаси и неконсистентное поведение некоторых функций (типа NULL vs. INVALID_HANDLE_VALUE), но в целом оно вполне юзабельное.

Ответы202365

4 июня, 07:41 427 1202365

>>1202164
Если бы оно создавалось во времена крестов, то ООП там не был бы таким непонятным.

4 июня, 07:47 428 1202367

двач у меня горит
lde под линукс
codeblocks отказано в доступе при коомпиляции
еклипс в жопу эклипс
cilon тормозит пиздец и тоже сука нихуя не коомпилирует
неужели придется как ввинде делать все в ручную через консоль
я понимаю что линукс это консоль

Ответы202380206120206128

4 июня, 08:07 429 1202380

>>1202367
>codeblocks отказано в доступе
Запусти под sudo.
Сделай простой скрипт для компиляции, если лень тыкаться.

4 июня, 22:53 430 1202991

>>1201894
Хочешь сказать, каждый раз проверять всё же нужно?>>118

Ответы202996

4 июня, 23:00 431 1202996

>>1202991
Да. Но если ты какой-нибудь сервис, который может упасть относительно безболезненно, ты можешь сделать обертку для malloc() с if (!ptr) exit(1) внутри, а снаружи не задумываться. Так, например, происходит в крестах, где operator new бросает исключение, которое очень редко кто-либо пытается ловить.

Ответы203324

5 июня, 08:44 432 1203138

>>1202130
>>1202134
Вы как-то неправильно понимаете суть TDD.

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

Ответы203361204171

5 июня, 14:38 433 1203324

>>1202996
Если память нельзя выделить, то вернутся NULL, и когда я к нему обращусь - получу segfault и аварийный выход. Segfault на столько нежелателен, что лучше добавить if ()?

Ответы203495

5 июня, 15:38 434 1203361

>>1203138
да я там иронизировал, просто бесит что многие опенсорсные решения вообще нахуй без тестов, тупо на хомячках ошибки вылавливают, на юзерах по сути
конечно тесты и сишникам нужны
тупо регрессию проверять (что ты и расписал)
другое дело что все же статически типизированный язык и процесс компиляции есть, плюс утилиты стат и дин анализа есть, это очень помогает, сокращает собственно объем тестов
ну, да, тоже в роли капитана очевидность выступил, да ладно
хорошо, например, организованы тесты в sqllite, если кто не знает, как организовать у себя покрытие тестами чистого сишного кода, может туда глянуть

Ответы204171

5 июня, 20:08 435 1203495

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

Ответы203548

5 июня, 21:23 436 1203548

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

Ответы203576

5 июня, 21:47 437 1203576

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

> В чем суть битового сдвига
Бессмысленное деление на два, ни на что уже не влияет (все равно NULL прилетит), убрал. Но вообще, есть аллокаторы, которые по техническим причинам не могут выделить больше, чем SSIZE_MAX (знаковый), а это как раз половина SIZE_MAX.

Ответы203589

5 июня, 22:17 438 1203589

>>1203576
Мощно, спасибо.

6 июня, 15:33 439 1203973

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

Ответы203995203996204007

6 июня, 16:21 440 1203995

>>1203973
По большей части одинаковые.

6 июня, 16:22 441 1203996

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

6 июня, 16:32 442 1204007

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

Потому что они компилируются по-дефолту, если флаги не указывать для 386 - 32х битные и для Athlon 64 (максимум SSE2) - 64 битные. Добавь -mavx2 -O3 и попробуй какой нибудь числодробительный код написать вроде умножения матриц, а потом запусти на процессоре, который все это дело не поддерживает - получишь ошибку времени выполнения.

6 июня, 18:14 443 1204087

Думаю перекатиться с крестов к вам. Всё правильно делаю?

Ответы204091204162

6 июня, 18:17 444 1204091

>>1204087
Конечно, а потом на Фортран

6 июня, 19:09 445 1204159

По заданию надо реализовать две "базы данных" и ГУИ (консольный) для манипулирования ими. Сами "базы" в принципе есть, как двусвязные списки. Саму консольную гуишку навасянить тоже не проблема. Но вот вопрос - а как между ними данные-то гонять? Вот, например, получить из одной "базы" некие данные и в нужном месте вывести. Мне их функцией вытаскивать из списка в виде строки? Или сразу структурой, чтобы удобно выводить, редактировать и обратно упихивать?

Ответы204166

6 июня, 19:11 446 1204162

>>1204087
>Всё правильно делаю?
Ну если ООП не твое, то да.

Ответы204535

6 июня, 19:16 447 1204166

>>1204159
SQLite юзай

6 июня, 19:25 448 1204171

183 Кб, 1440x900560 Кб, 1440x900

>>1202011
>>1202130
>>1202134
>>1203138
>>1203361

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

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

>>1202011-рубист-на-районе

Ответы204180

6 июня, 19:41 449 1204180

>>1204171
> valgrind
-fsanitize

Ответы204206

6 июня, 20:17 450 1204206

>>1204180
https://github.com/exercism/c/issues
https://github.com/exercism/c/issues/239
https://github.com/exercism/c/pulls

7 июня, 11:57 451 1204535

>>1204162
Писал довольно долго на плюсах на уровне "немного лучше залётного ньюфага", потом по работе понадобилось писать на чистой сишке — тогда-то я и понял, что ооп нахуй не нужно само по себе как стандарт, а только в тех случаях, которые этого требуют. И когда пишу на сишке , то прям очень открыто и чисто понимаю, почему в плюсах те или иные вещи сделаны/переделны/добавлены.

7 июня, 14:33 452 1204688

>>1197576
дядь про скобки не забывай фигурные. все что должно выполняться в цикле обязательно должно быть в фигурных скобках. да это си а хули ты хотел, чтоб компилер по табуляции тебе определил что входит в тело а что нет? программа подсчета символов содержит ошибку после скобки в for не нужна точка с запятой. Если не шаришь в точках следования то лучше читай прату для начала.ВДУМЧИВО

Ответы204729

7 июня, 15:17 453 1204729

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

Ответы204767204770

7 июня, 15:18 454 1204731

Хотя у него там ; после фора лишняя.

7 июня, 15:52 455 1204767

>>1204729
>Всё у него правильно.
Посмотри ещё раз.

7 июня, 15:53 456 1204770

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

Ответы204816

7 июня, 16:35 457 1204816

>>1204770
Согласен, скобки лучше не опускать, понижает читаемость.

Ответы204848

7 июня, 17:07 458 1204848

>>1204816
Особенно когда там вокруг пачка #ifdef, затем после условия скобкок нет, но есть else, после которого блок уже в скобках. Получается полный пиздец, по три раза перечитываешь.

161 Кб, 1280x1024
8 июня, 18:47 459 1205784

создаю нахуй массив из 5 элементов а он блять все 8 элементов хранить может нихуя себе че за хуета. хелпуйте. или компилер рофлит

Ответы205798206127

8 июня, 18:52 460 1205798

>>1205784
Ну так лол, этот массив не инициализирован никак, а ты printf печатает %s до '\0'
Где там она встретит нуль, дело случая.

Ответы205853

8 июня, 19:40 461 1205853

>>1205798
Консоль чекай, я задаю ввод из 6, 7, 8 символов и массив инциальзируется. Спрашивается откуда компилер высрал еще несколько элементов?

Ответы205857

8 июня, 19:47 462 1205857

>>1205853
А, scanf не заметил.
Ну так scanf тебе ничего не проверяет.
Сколько её дают, столько и пишет.

Ответы205866

8 июня, 20:09 463 1205866

>>1205857
так а почему в массив то она это все пишет? ведь вроде как массив ограничен пятью элементами, а тут выходит что не 5 а все 8.

Ответы205869

8 июня, 20:12 464 1205869

>>1205866
Ты ей передаёшь указатель на a[0].
До размера массива никому дела нет в этом языке вообще никогда, нигде и ни при каких условиях.

Ответы205895

8 июня, 20:44 465 1205895

>>1205869
> никому дела нет в этом языке вообще никогда
Есть sizeof. В scanf() можно указать максимальный размер буфера: %4s запишет в буфер не более четырёх символов (плюс пятый \0).

Ответы206230

9 июня, 09:15 466 1206120

>>1202367
Тру пацаны в емаксе ебашат. Думаешь Торвальдс ядро в visual studio писал?

9 июня, 09:43 467 1206126

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

Ответы206154

9 июня, 09:45 468 1206127

>>1205784
у тебя массив из 5 симовлов, ты гарантировал системе, что эти 5 байт - твои и ничьи. Потом ты указал scanf, что можешь принять строку произвольной длины, а можешь только 5 символов, но вот в чём проблема: каждая строка на конце должна иметь \0, т.е. ты сканируешь не 5 символов, а 6, из-за чего последний шестой начинает храниться в следующем байте, который как-бы не твой. Чтобы такого говна не было, нужно написать %4s где 4 - длина массива - 1

Ответы206214

9 июня, 09:53 469 1206128

>>1202367
Qt Creator же

9 июня, 11:09 470 1206154

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

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

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

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

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

Ответы206156

9 июня, 11:12 471 1206156

>>1206154
> сложных предсказателей загрузки данных/ветвления
И породив 1000 и 1 дыру в своих ЦП.
И кого он подебил именно? Ты имеешь в виду, что x86-64 подебила конкуретнов?

Ответы206157

9 июня, 11:18 472 1206157

>>1206156

Да, причем даже собственный итаниум от интела. Мипс, помер, спарка - все их пропрочили как "убийцу x86" и все сдохли.

Ответы206159

9 июня, 11:20 473 1206159

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

Ответы206161

9 июня, 11:21 474 1206161

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

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

Ответы206162

9 июня, 11:23 475 1206162

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

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

Ответы206165206311

9 июня, 11:23 476 1206163

Хочу погромировать для Пневматических Кампутеров на ПневмоСи.

Ответы206164

9 июня, 11:25 477 1206164

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

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

Ответы206168

9 июня, 11:25 478 1206165

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

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

9 июня, 11:27 479 1206168

>>1206164
>Аналоговых или цифровых?
Пневматических, работающих на сжатом воздухе

Ответы206170

9 июня, 11:32 480 1206170

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

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

Ответы206171

9 июня, 11:33 481 1206171

>>1206170
>Эффект Коанда
Вот про эти

Ответы206172206174

9 июня, 11:34 482 1206172

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

Ответы206176

9 июня, 11:36 483 1206174

>>1206171

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

https://kristerw.blogspot.com/2017/08/writing-gcc-backend_4.html

Ответы206175

9 июня, 11:38 484 1206175

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

Ответы206177

9 июня, 11:38 485 1206176

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

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

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

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

Ответы206181

9 июня, 11:40 486 1206177

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

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

Ответы206178

9 июня, 11:42 487 1206178

>>1206177
>размером с pdp11 за вычетом компрессора. с ячейками раземром 5х5мм.
Клево и еще механический дисплей, как раньше в аэропортах табло расписаний было.

9 июня, 11:44 488 1206181

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

Ответы206185

988 Кб, 993x1000
9 июня, 11:50 489 1206185

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

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

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

Ответы206187

33 Кб, 364x461
9 июня, 11:57 490 1206187

>>1206185
охуенчик

9 июня, 12:56 491 1206214

>>1206127
понял. спасибо

9 июня, 13:28 492 1206230

>>1205895
>sizeof
Макро времени компиляции, ага.

9 июня, 15:19 493 1206311

>>1206162
Что мне мешает написать говнокод на высокоуровневом языке и скомпилировать его для arm?

9 июня, 16:33 494 1206373

Как написать кроссплатформенное мультипоточное приложение на С? threads.h в glibc не завезли

Ответы206375206407206408206591

9 июня, 16:35 495 1206375

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

Ответы206397

9 июня, 16:51 496 1206397

>>1206375
И чё, единого кроссплатформенного способа нет?

9 июня, 17:00 497 1206407

>>1206373
Это вообще C?

9 июня, 17:02 498 1206408

>>1206373
Хз, OpenMP-зазывалы его позиционируют как кроссплатформенный.
Синтаксис, конечно, уродский. Трясет просто от этих прагм.
Зато переносимо, причём в некоторых случаях собрать можно будет даже на компиляторе без поддержки OMP, ибо прагмы проигнорируются (это если сама структура программы позволит, конечно)

9 июня, 19:27 499 1206591

>>1206373
> threads.h в glibc не завезли
Есть 3rd-party обертки вокруг pthreads. Используй их, а когда в гцц, наконец, реализуют стандарт полностью - выкинешь.

Ответы206615

9 июня, 19:45 500 1206603

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

9 июня, 20:09 501 1206615

>>1206591
pthreads же только для unix систем ведь так?

Ответы206618206625

9 июня, 20:10 502 1206618

>>1206615
Для POSIX-compilant систем, не?

Ответы206619

9 июня, 20:10 503 1206619

>>1206618
> compliant

9 июня, 20:16 504 1206625

>>1206615
> pthreads же только для unix систем
Есть в MinGW.

Алсо, для винды тоже есть легковесные нативные реализации threads.h. Вот, например, из glfw: https://github.com/glfw/glfw/blob/master/deps/tinycthread.c

ПЕРЕКАТ # OP 9 июня, 20:19 505 1206627

>>1206626 (OP)
>>1206626 (OP)
>>1206626 (OP)
>>1206626 (OP)
>>1206626 (OP)

10 июня, 04:58 506 1206895

>>1189727
Смотрите-ка, залетный студент, путающий термины, пытается рассказывать про области применения сишки

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

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

« /pr/В начало тредаВеб-версияНастройки/a//b//mu//s//vg/Все доски

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion