Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
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)
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов). - http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
>>1232129 Если осилил кривой телнет, значит посылку команд и чтение статусов тем более осилишь. Не пытайся сразу что-то полнофункциональное реализовать, сделай загрузку и скачивание по заранее известным путям (чтобы не ебаться с LIST), в пассивном режиме. Там нужно уметь буквально несколько команд.
Что почитать, чтобы в принципе понимать, что мне даёт отладчик по сравнению с puts("Nya") для проверки, по какому поути пошла программа. Ну, т.е. самые общие определения и преимущества, чтобы я потом понимал, зачем я изучаю конкретный отладчик.
Антоны, тут у меня одна проблема. Функция - возвращает указатель на структуру. Например я результат функции сохранил в переменной и затем заебашил free. Будет утечка?
Собираюсь вкатиться в вашу сказку, решил начать с теории, сейчас читаю К&R. Стивен Прата на очереди, когда к практике перейду. Рекоммендации из шапки просмотрел, но есть пара вопросов: какой же из конопляторов оптимальней для 32бит, и что можно почитать по Win API для сишки?
Здраствуйте. Шапку смотрел, но не понял, есть ли книжка по C текущего стандарта, которая бы учила программированию с нуля? KR читать готов, но кажется так будет лишний шаг с переучиванием с девятсотлохматого стандарта на актуальный. Короче, хочу вкатываться сразу в новейший-моднйший-C. Что посоветуете?
> - Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
>>1233533 Код? Но в целом у тебя утечек не будет, после free() будет переменная, указывающая в воздух. Или ты по указателю данные забрал? В общем, тащи код.
>>1234070 > > > Я тут сижу и думаю, как можно узнать размер функции в байтах? Звучит тупо, но это реально нужно для одной моей шальной затеи.
Никак. На самом деле компилятор тебе может
1) Её вообще заинлайнить 2) Наоптимизировать вызовы так, что даже с идой без поллитры не разберешься. 3) Чтобы подобную хуйню реализовать тебе в машоб-тредик надо, на нейросеточках учить программу дизассемблировать выхлоп компилятора.
Ну а если тебе очень надо, то есть в GCC ключ -ffunction-sections который позаолит тебе потом из object-файла то что тебе надо прочитать с помощью readelf -S t.o | grep ' .text.'
>>1231397 (OP) >Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека" stdalign не завезли, пришлось делать две ветки windows/linux.
>>1234110 Я считал 40 байтов с указателя на начало функции. Вот они в hex редакторе. Но в них нет байтов C3 и CB, которые означают return. Неужели функция больше 40 байтов, или же я обосрался с кодом?
>>1234110 >Я подумал, что могу оканчивать запись в функцию после байта команды return? Так же можно, наверное?
1) Команда return из сей в процессе компиляции может стать чем угодно. начиная от ассемблерной ret и заканчивая сшивкой кода разных функций воедино совершенно рандомными регистрами или через стек без каких-либоявных call/ret. В зависимости от желания компилятора.
2) Вангую, ты придумал сам себе какую-то херню и не можешь конкретно написать здесь что именно тебе надо и окажется что нужно тебе было вовсе не "ну пацаны гланды через жопу тянуть расскажите как".
От себя вангану, что ты хочешь навелосипедить JIT-компилятор для С, но не знаешь в этой области кроме самого языка С нихуя. В таком случае тебя стоит отправить окунуться в волшебный мир плюсов и изучать LLVM, как самый быстрый способ сделать то, что тебе надо.
>>1234117 Я хотел позабавиться и сделать считывание функции из бинарного файла. Практической пользы почти никакой, просто из интереса. То есть я беру указатель на функцию и дальше записываю туда байты из бинарного файла. Как мне казалось и как кажется, это должно работать.
>>1234115 >Я считал 40 байтов с указателя на начало функции. Вот они в hex редакторе. Но в них нет байтов C3 и CB, которые означают return. Неужели функция больше 40 байтов, или же я обосрался с кодом?
>>1234122 >Скажи мне где я обосрался, я тупой, извините уж.
В данном случае - ты словил конкретное такое матерое UB, объявив функцию, которая нигде не используется и взяв с неё указатель.
В общей концепции твоего хода мыслей - в непонимании того что функции С - это такая же абстракция, как какие-нибудь лямбда-замыкания из хаскеля и компилятор делает с этими абстракциями то что он посчитает нужным - хочет - выкинет нахуй, хочет - заинлайнит, хочет - сделает вызовы по своему.
Исключение - функции, объявленные как библиотечные путем __declspec(dllexport) и __attribute__((visibility("default"))) в случае гцц и скомпилированные в lib/dll. В таком случае компилятор блюдет соглашение о вызовах и ты действительно можешь там чего-нибуть накопать. Но и в этом случае с твоим ходом мыслей можешь соснуть хуйца.
>>1234115 Это выебывается (читай оптимизирует для предсказателя переходов) visual studio, байты E9 A9 это JMP (считай goto) на реальное начало функции. Посмотри в отладчике оффсет либо интерпретируй следующие байты адреса, чтобы попасть на реальную функцию
>>1233968 Ну вот ты сделал free(), и твой hippo перестал быть валидным, ты не можешь больше к нему обращаться. Поэтому обычно после free(hippo) делают hippo = NULL, чтобы случайно не вляпаться. А утечек нет.
>>1234059 Скорее всего ты хочешь dlopen/dlsym или LoadLibrary/GetProcAddress соответственно. Но, конечно же, можно и самому грузить рандомный исполняемый код в память и выполнять, только это нихрена не простая задача.
>>1234070 > Я тут сижу и думаю, как можно узнать размер функции в байтах? В общем случае нельзя. У функции нет четких границ. Твоя функция может начинаться в середине другой функции, а заканчиваться прыжком в середину еще какой-то функции.
>>1234089 > stdalign не завезли Правда что ли? У меня вроде работало. Хедера нет - завези сам. alignof/alignas точно поддеживаются.
>>1234315 Вообще тебе может быть легче, взяв старенькую утилиту obj2asm и текстовый исходник .c открываешь в папке с ней командную строку и пишешь что-то вроде
obj2asm project.obj project.c > output.txt
> нужна чтобы вывод в консоль был перенаправлен в файл
>>1234334 > функция сишная всегда после вызова начинается с байта 55 - PUSH EBP Чушь. Есть -fomit-frame-pointer, /Oy, есть функции-обертки, есть /hotpatch, втыкающий в начало функции mov edi,edi, есть int getRandomNumber(void) { return 4; }, так что предполагать что-либо о начале функции нельзя.
>>1231397 (OP) Привет, двач. У меня тут появилась промлема int a; printf("%d\n", a); почему выводит 4201019 наверное у другних будет другое число, но у меня именно это Что это за число ? Я просто тупой
>>1234434 Рассказали уже. В переменной лежит адрес возврата, оставшийся в стеке после вызова какой-то функции. Адрес характерный для кодовой секции exe-шника в винде.
>>1234523 Так линкер пиши свой. Или грузи объектники. .bin нормально ты все равно не загрузишь.
>>1234913 >Правильно ли я понимаю, что если index == 1, то strcmp уже не будет затем вызываться? Правильно. Операторы &&, || и частично ?: (когда дело касается второго и третьего операнда) ленивые, и не вычисляют правый операнд, если он не повлияет на значение выражения.
Анон подскажи почему кракозябры на винде в консоли SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Rus"); ничего не помогает, MinGW. На clang все норм работает.
>>1235807 >Потому что исходник в UTF-8, наверное. Но лучше всего его в UTF-8 и оставить. т.е. от кодировки исходников генерируется различный объектный код?
>>1235817 Нет. В Си есть source charset и execution charset. Если они отличаются, то компилятор транслирует строковые литералы. Если execution charset не совпадает с фактическим (т.е., если по-русски, строковые литералы в бинарнике не в той кодировке, что ожидает консоль), ты видишь крякозябры.
>>1235823 >>1235817 А насчет того, почему лучше не трогать source charset - потому что у гцц по умолчанию UTF-8, у всякие редакторов UTF-8, в линупсе UTF-8, на всяких гитхабах UTF-8.
>>1235799 >>1235807 >Рекомендую >>1224213 вот это решение, пока тред еще не уплыл. SetConsole[Output]CP убери. Короче методом научного тыка нашел более красивый способ: SetConsoleCP(CP_UTF8); SetConsoleOutputCP(CP_UTF8); Мб кому пригодится
>>1236389 Нет. В Си есть source charset и execution charset. Если они отличаются, то компилятор транслирует строковые литералы. Если execution charset не совпадает с фактическим (т.е., если по-русски, строковые литералы в бинарнике не в той кодировке, что ожидает консоль), ты видишь крякозябры.
>>1231397 (OP) почему 0061FF24 вот тут инт хранится 0061FF28 а вот тут чар, да ? Тогда почему 4 байта выделилось ? Можете пояснить, просто я тупой и в книге это не объяснялось 0061FF2C
>>1236609 > Тогда почему 4 байта выделилось Выделился байт, остальные три - выравнивание, чтобы следующий член структуры получил адрес, кратный четырем. Это, в свою очередь, нужно для того, чтобы процессору было удобнее (и/или быстрее) его читать. На x86 ты можешь сделать #pragma pack, чтобы структуры упаковывались плотно: >>1229352, но на многих RISC-архитектурах процессор вообще не может прочитать слово по невыравненному адресу - сразу alignment fault, гроб-гроб-кладбище. Если хочешь подробнее: http://www.catb.org/esr/structure-packing/ (где-то было и на русском), но можешь просто не заморачиваться, компилятор обо всем позаботится пока ты не захочешь SSE: >>1229171.
>>1236609 >>1236610 Как-то из моего ответа не очевидно, что для char выравнивания не требуется (если очень вкратце, примитивный тип выравнивается на свой размер), т.е., char a; char b; будут лежать рядом, без дыр. Так же и short a; short b; или даже short a; char b; char c;. Собственно, в перестановке полей структуры так, чтобы не было дыр, и заключается "искусство" ручной упаковки структур по ссылке выше.
>>1236611 Да, ничем. У этих байтов нет имени, к ним нельзя обращаться (физически можно, конечно, выебнуться, но по стандарту нельзя). Чем оно заполнится - зависит от расположения структуры. Статическая память (глобальная) - скорее всего, там будут нули. Стек или куча - мусор.
>>1236610 >>1236611 А где ты эту инфу взял ? Хочу нормально разобраться в сишке, а не чтоб смотреть на двачи\стаковерфловы каждый раз когда чего-то не понимаю
>>1236613 Ээээ. Ну я тебе выше ссылку дал. И стандарт, но в нем сложно что навскидку найти. И википедия, и стековерфлоу, что в них плохого? И вообще, в теории (с точки зрения стандарта Си), тебя не должно волновать какое-то там выравнивание. У тебя есть offsetof() и sizeof(), а остальное не твое дело.
Почему если я передам функциибез прототипа принимающей аргумент типа int значение double то фактический аргумент не получит новое значение? Разве не работает принцип усечения дробной части?
Как можно реализовать ввод строки, чтобы выделять памяти только столько сколько нужно? Иначе же получается, например, если мы выделили char buf[1024], то мы в любом случае будем столько памяти тратить.
>>1236669 > Мне нужно, чтобы при t == 1 вместо arr.a вызывался arr.b во всей функции, а при t == 2 arr.c Нихуя не понял, что тебе нужно, но видимо, ты хочешь трехмерный массив вместо массива структур, но боишься: arr[30][3][10]. Ну и используешь, хоть puts(arr[ i][0]), хоть arr[ i][t].
>>1236695 > хэдер с функциями. Нужно ли внутри него совать #include Да, если ты используешь в хедере типы или макросы из stdio.h (например FILE). Это правило хорошего тона, чтобы тот, кто подключает твой хедер не задумывался, что там нужно подключить до него и в каком порядке.
>>1236698 > то в мейн файле он тебе не понадобится Если мэйн использует функции из stdio.h, нужно подключать stdio.h явно. Потому что реализация anonlib.h может измениться, он уберет из своего anonlib.h инклуд stdio.h, и все сломается.
>>1236842 > Есть легальная возможность изменить тип члена структуры без использования union? Ну можно ∗(othertype ∗) &structure.member, но это не совсем легальная возможность. Хотя все так делают.
>>1236867 > Почему если я передам функциибез прототипа принимающей аргумент типа int Перефразируй или покажи пример. Если ты в printf суешь дабл вместо инта, то он просто не знает, что нужно преобразовывать дабл в инт.
>>1236890 > если мы выделили char buf[1024], то мы в любом случае будем столько памяти тратить. Ты не переживай, у тебя стек кроме этого килобайта еще сотню "впустую" тратит. Но ты можешь выделить много, посчитать длину и перевыделить ровно столько, сколько нужно, получив кучу других проблем из-за своей экономии.
>>1236895 >Ты не переживай, у тебя стек кроме этого килобайта еще сотню "впустую" тратит. Но ты можешь выделить много, посчитать длину и перевыделить ровно столько, сколько нужно, получив кучу других проблем из-за своей экономии. Я вот это и делаю, получается пиздец какой-то несусветный.
>>1236899 > Я вот это и делаю, получается пиздец какой-то несусветный. Я не знаю, какую проблему ты решаешь, но можешь почитать про таблицы строк. Делаешь динамический массив, кладешь строки вплотную, при необходимости делаешь realloc. Но до строк придется ходить по двум указателям: по адресу массива и по индексу первого символа строки внутри массива. Прямой указатель на строку долго хранить нельзя, потому что при realloc() массив вместе с твоей строкой может уехать в рандомное место кучи.
>>1231397 (OP) Че делать если простейшие крестики-нолики у меня вышли в 100 строчек ? Как понять как писать правильно ? https://pastebin.com/z0S2Cqck тиктактое было бы прикольно еслиб вы указали мне на мои недочеты я почти уверен что функцию check_combo можно сделать по другому, но я не увидел как
>>1236912 1) В game() твой while можно заменить на for (turnscount = 0; turnscount < 9; turnscount++) и по выходу из цикла говорить, что ничья, а там, где у тебя the "winner is ..." выходить сразу из функции. 2) Кусок с goto вынеси в функцию, которая крутится в while и матерится, пока игрок не введет нормальные координаты. Координаты можешь по указателям возвращать или глобальными переменными, если в указатели пока не можешь. 3) Игра пошаговая, check_combo может проверять только выигрыш того игрока, который только что сходил - это упростит check_combo сразу вдвое. И проверять можно вложенными for(), а не вручную. И еще можно смотреть, куда человек сходил: если он сходил в первую строку во второй столбец, то очевидно и проверять нужно только первую строку и второй столбец. Но не факт, что такой код будет проще, потому что есть еще и диагонали. 4) Найди уже в своей IDE автоформатирование кода, или какой-нибудь astyle осиль, или clang-format, или сразу пиши красиво. У тебя кое-где скобки не на своих местах. 5) Ну и стандартное отсутствие (void) у функций без параметров сразу выдает крестоблядь.
>>1236946 > Но я не понял как сделать check_combos через цикл Ну как-то так: https://pastebin.com/esCWGyK5 Если сообщения выпилить, будет весьма кратенько. В функцию передавать координаты последнего хода и значок сходившего. Алсо, подразумевается игровое поле в виде массива строк, а не столбцов, т.е., field[y][x], а не field[x][y].
>>1236925 >Ну и стандартное отсутствие (void) у функций без параметров сразу выдает крестоблядь C-петушку неприятно, лол. Ссу тебе на голову. крестобоярин
>>1236895 вот простейший пример. передаю ну как бы инт и спецом в прототипе не указываю что функция cube принимает аргумент типа double. на выводе получаю 0 при вводе любого числа. Вопрос почему так? разве по логике передачу фактического аргумента функции нельзя сравнить с присваиванием переменной типа double(в данном случае она имеет имя a). ну как бы я так себе представляю передачу аргумента типа переменной a присвоится значение n из функции main которое идет. ну хз короче
>>1237298 > не указываю что функция cube принимает аргумент типа double. Непонятно, зачем ты с этим возишься, если программа очевидно сломана. Это, кстати, хороший пример, почему пустые скобки триггерят >>1237113 сишников. Диагностики по этому поводу по умолчанию в гцц нет (но можно включать -Wmissing-prototypes), потому что раньше такой код был нормальным, да и сейчас иногда требуется.
Пустые скобки в твоей декларации означают любое количество любых аргументов. Когда при вызове функции компилятор не знает типов аргументов, он приводит все аргументы к дефолтным типам: все целые (char, short и т. д.) к интам (если не влезут - к лонгам), плавающую точку к даблам. Т.е., в твоем случае в аргументы попадает int. А дальше мы попадаем в cube(), и у нас происходит undefined behavior, потому что типы фактически переданных аргументов не совпали с ожидаемыми. И все, дальше ни о чем думать не нужно - программа сломана, дело закрыто.
Но похуй, объясню, откуда берется "ноль". В 32-битном коде 64-битный дабл при передаче в качестве аргумента кладется в виде двух 32-битных слов. Т.е., твоя функция cube() видит стек примерно так: > ... > адрес возрвата > младшие слово (32 бита) дабла, у тебя сюда попадает твой инт > старшее слово (32 бита) дабла, тут какой-то мусор (стек-то не пуст) > ... Из двух слов собирается дабл, инт идет в младшие 32 бита дабла (в младшие биты мантиссы, которые почти ни на что не влияют), мусор в старшие. И если у мусора не было нескольких (хотя бы трех) старших битов вполне нормальная ситуация, если там какой-нибудь указатель или адрес возврата, дабл получается положительнным и с маленькой экспонентой. Умножение усугубляет дело, делая экспоненту настолько маленькой, что она, возможно, даже перестает влезать в дабл, и в printf() уже передается настоящий ноль. Попробуй сделать printf("%g\n", a); в cube(), чтобы оценить, какое маленькое число ты получаешь на входе.
В 64-битном коде все проще - там первый целочисленный аргумент (или указатель) кладется в rdi (твой инт как раз туда попадает), а значения с плавающей точкой передаются через регистры SSE - первый аргумент через xmm0, а ты туда ничего не кладешь. Но так как твоя программа только что стартовала и скорее всего еще не успела что-либо оставить в регистрах SSE, то cube() достает оттуда дефолтный ноль.
>>1238504 Правильно - goto или обернуть в функцию и использовать return (последнее предпочтительно). Допустимо - добавить дополнительную переменную и условие во внешнем цикле, как посоветовали выше.
Сап. Этим советам, на первом пике, можно верить? Интересует второй, про смешивание. К примеру, написал что-то вроде: int value = 100, *pointer = &value; т.е. и переменную объявил, и адресок взял, и все одной строкой. Следуя логике советчиков - мне пiзда. Если так, то почему? Чем однострочная запись хуже той, что на пике? Да, ресурс так себе, знаю. Просто стало любопытно, почему так.
>>1238605 > Следуя логике советчиков - мне пiзда Логика советчиков не в том. С точки зрения синтаксиса все ок. Но:
// При беглом взгляде кажется (особенно новичкам), что y и z - указатели, но нет. // Это просто-напросто хуже читается. И это основная причина так не делать. int ∗x, y, z;
>>1238625 А бывает еще вот такое форматирование, которое запутывает еще больше (поэтому нормальные люди звездочку пишут рядом с переменной, а не с типом): int∗ x, y, z;
>>1238625 >>1238631 Спасибо. По поводу форматирования еще встречал когда звездочку ставят как знак умножения, типа int * p А на читаемость больше по моему влияют грамотные имена переменных и указателей(и всего остального). Но да, построчно конечно понятнее.
>>1238507 А как это должно мне помочь, если во внешний цикл будет while(1)? continue же только „доматывает“ итерацию внутреннего цикла и идет на следующую, а если в обоих условиях 1?
Есть какие-то дополнительные возможности, если приложение многопоточное?
>>1238631 Нормальные — это те, которые яйцо разбивают с правильной стороны, следуя всем мудрым доводам твоего лагеря и игнорируя глупые доводы приверженцев противоположного?
>>1238688 Нормальные - это те, которые следуют древнему завету "декларация отражает использование". Если пишешь int∗ foo, будь последователен, делай дереференс int bar = ∗ foo; Не забудь также о printf("square: %d\n", ∗ foo ∗ ∗ foo);
>>1238718 goto и return нормальный юзкейс. В ядре линукса можно много где увидеть, хотя там обычно один return, на нем меткаerr_exit: и к нему делается goto.
>>1238729 >Goto это антипаттерн. За такое нужно увольнять. Пошто его все так люто хейтят? Просто каждый считает своим долгом обосрать goto. Что в нем такого плохого? Объективно. Реальные причины есть, или из разряда "все хейтят и я буду"?
>>1238779 Старый мем, повторяют как обезьяны. Всё, что они могут сказать, написано в Edgar Dijkstra: Go To Statement Considered Harmful в своё время. goto используется overДохрена раз в ведре Linux.
>>1238779 >Пошто его все так люто хейтят? Потому что лапша. Потому что структурное программирование придумано для того, чтобы принуждать умственно неполноценных дебилов вроде вас всех меньше говнокодить. ООП, кстати, тоже в том числе для этого.
>>1238797 Ни разу не юзал гото, просто не пишу глубокие вложения, можно было бы выскочить с гото - выскочил. Потому что надо быть адекватом, а не кукарекать за идиому.
>>1238931 >рабочие нагрузки Пришлось даже гуглить что это лол Ну хз чел, я бы советовал бежать нахуй от майкрософтовского поделия и юзать труЪ стафф. Обычный текстовый реактор и gcc все что тебе нужно, базарю. Как проект разрастется напишешь makefile.
Почему никто не вспомнил про использование goto для возвращения в начало функции? Другие методы(рекурсия) либо замусоривают стек, либо выглядят уж точно уродливей, чем метка в начале функции.
>>1238984 Потому что в общем равноценно возврату в любую точку кода в функции, даже не хочется рассматривать как специальный юзкейс. Ыыы, так же можно ещё в while(0){} скоп запрыгнуть, ну ахринеть. Эксклюзивный так скоп только для гото)000)0
>>1238962 Мне надо написать серверную часть с ГУИ, потому что, сука, клиентская часть на Си. Я Си то плохо знаю, а тут ещё почитал, что хрен слепишь графику.
Была не была, может тут ответят на мой ответ про TCP Socket'ы: >Есть ли какой-нибудь выход, кроме как сливать значения передаваемых переменных в string с уникальными маркерами, а потом долго и уныло их парсить, перебирая каждую переменную? Изначально хотел передавать структуру (потому что много данных типа bool, uint8_t, char), но в питоне нет структур... А для Си я граф. оболочку ни разу не писал. Как, впрочем, и на других языках.
Короче, mingw-w64 и SublimeText норм? Смотрел ещё Eclipse - чем-то похожа на одну фирменную среду разработки под микроконтроллеры.
>>1239017 >Короче, mingw-w64 и SublimeText норм? >Смотрел ещё Eclipse - чем-то похожа на одну фирменную среду разработки под микроконтроллеры. Да, норм, mingw-w64 это пак gcc, g++ и прочего, под винду, gcc он и в африке gcc. Сам пользуюсь нотепад++, всем устраивает, после кое каких настроек приобретает вид аля IDE, см. пик. SublimeText лично не щупал, но думаю она норм, выглядит симпатично. Эклипс да, ее вроде как юзают аврщики и ардуинщики часто. Тоже норм. Многие еще vim юзают, что вообще мега труЪ.
Насчет ГУЯ - я тоже озадачен этой темой, но пока думаю над архитектурой и самим кодом. Могу подсказать только направление куда копать, и пару либ, большего, увы, не делал: https://habr.com/post/319106/ - Присматриваюсь к ней, но пока щупать не решаюсь. https://github.com/wjakob/nanogui Если пишешь под линукс, попробуй поковырять xlib. Если кросс платформ - лучшее решение будет опен жл, у нуклеара в примерах есть рендер жл-овский.
>>1239017 >>1239054 Вот еще вспомнил, есть замечательная вещь - tcl/tk tcl - скриптовый язык, tk - графическая либа к нему. На этой связке довольно часто пишут ГУИ к консольным программам на си.
>>1239017 > в питоне нет структур import struct; help(struct)
>>1239054 > лучшее решение будет опен жл > nanogui > nuklear Даже не знаю, какой совет хуже. Вот если бы он игру писал - тогда еще норм, но для сервера гуй на опенгл - это что-то запредельное.
Сам посоветую не страдать хуйней и написать гуй на Python/Qt5 (если он каким-то местом в проекте имеется) или C++/Qt5. Можно подумать о Gtk+, но если в требованиях в том числе и винда, то лучше все же Qt.
>>1239195 >import struct; help(struct) Лол, загуглил "python структуры" а там давай втирать, что как таковых структур в питоне нет и что они не соответствуют структурам из Си; потом загуглил "uint8_t python", пишут что нет такого типа данных готового.
>Нормальные люди делают гуй на хтмл Слишком много гемора с освоением, для хоббийного проекта то.
>>1239786 Умножение на ноль тоже сводится к компайл-тайм константе, но умножение от этого оператором быть не перестает. Алсо, в C99 и выше есть VLA, для которых sizeof работает не в компайл-тайм: int foo = scanf("%d"); int bar[foo]; printf("run-time sizeof: %zu\n", sizeof(bar));
>>1239804 SJLJ/SEH - это поддерживаемые модели исключений крестов (в Си в принципе нету). POSIX/Win32 - поддерживаемые модели потоков. Если собираешься линковаться с чужими длл (особенно с MSVC-шными) - выбирай win32.
>>1240199 к&r неплохой перевод, я вообще тупо эту книгу выдрачивал до просветления, уникальная книга, плотность информации в ней зашкаливает есть еще недооцененная книга кернигана - "unix, программиное окружение", я бы посоветовал ее даже тем кто не планирует кодить под линуксы, хорошенько промывает мозг
>>1240215 Спасибо большое. Алсо, вот я у себя дома нашел книжку Демидович Е.Ь "Основы алгоритмизации и программирования" 2 издание.2008 Си сильно поменялся с 2008 года? Прост с моника и телефона сейчас не кайф читать(я так питон учил, и подустал) А тут такая книга дома, могу подучить с бумаги.
>>1240390 Так, что по-твоему системное? И почему тогда был назван Rust, а не C++? C++ отличная замена C, ты не теряешь скиллов С, просто по сути получаешь более хороший компилятор.
>>1240260 >Почему в шапке нет Steven C. Mcconnell Code Complete ? Потому что она не про конкретный язык, а про программирование в целом.
>>1240414 > Кресты проигрывают в скорости си Нет. Если предположить, что и на Си, и на C++ пишет разбирающийся в языке человек, Си проигрывает крестам по скорости (из-за шаблонов, из-за constexpr, из-за тех вещей, которые сложно выразить лаконичным синтаксисом Си, но можно крестовыми заклинаниями). Но стать человеком, разбирающимся в Си - гораздо проще, поэтому обычно сишный код обгоняет крестовый.
>>1240436 Все твои шаблоны и т.д. это скорость написания кода, а не скорость его работы. И на си пишутся обычно операционные системы и драйверы, где хуй знает вообще можно применить шаблоны, в таком широком смысле.тем более я говорил про линукс, там крестам вообще нет места, под Винду и на крестах пишут, ето так
>>1240482 > Все твои шаблоны и т.д. это скорость написания кода, а не скорость его работы. Нет. Например, на Си ты вместо шаблонов сделаешь void *, и компилятор не сможет это отптимизировать так же качественно. И вообще, в целом, в сишном коде у тебя будет больше ненужных дереференсов указателей и вызовов функций. Но ты, конечно, можешь все разворачивать, приправляя мешаниной дефайнов, превращая код в абсолютно нечитаемый.
>>1240836 Это уже скачал, но хочу начать именно с C, или вообще пофиг? >>1240837 >https://en.cppreference.com/w/c/thread Собственно об том и вопрос, что по этой ссылочке смотрю в книгу, вижу фигу. Есть что-то популярнее? Может на ютюбе разжевалово от индусов для прочих бичей?
просто уже зебался каждый день оухевать от кол-ва книг, курсов, видео на тубе, хочу просто сесть и начать читать что-нибудь, а эта книга вроде очень фундаметнальная и аж на 700 стр...
>>1240836 https://www.opennet.ru/opennews/art.shtml?num=49059 В GNU C Library добавили поддержку потоков ISO C (threads.h), определённых в спецификации ISO/IEC 9899:2011). Для использования потоков в приложениях необходимо связывание с libpthread.
>>1241064 Ну и APUE тогда уж. Правда, опять-таки, спрашивалось, как в С текут. А в главе 5 >>1240836 как раз модель памяти с точки зрения проектировщиков языка. А что аналогичное для С вы можете доставить?
>>1241577 >Возвращаю из функции указатель на саму себя, ну и что ты мне сделаешь? Возвращаю из функции указатель на саму себя, ну и что ты мне сделаешь? >>1241572 Как скажете, спасибо за прототипы функций, ИСОСИ!
>>1241724 pthreads nice, OpenMP - блевотина в плане решёточного синтаксиса. Вот <thread> топчик, он везде реализован, и у него в какой-то степени pthread-like синтаксис.
Это значит, что ты можешь выбросить рантайм и стандартную библиотеку и с помощью одного лишь компилятора под таргет-архитектуру чото сделать. Если без рантайма и стандартной библиотеки обломинго - значит не системное.
>>1241845 А это теперь уже стало программированием на чистом железе? Я как-то в универе на маняторе цвет пикселя напрямую поменял, я теперь тоже baremetal программист? ну и дибилизм пиздец
Вы тут смотрю потоки обсуждаете, но что это дает? Какая от этого практическая польза? Типа распараллелить вычисления или что? Сорян, я еще немного нюфак. Знаю только что есть потоки типа stdin, stdout и stderr.
>>1242239 > Какая от этого практическая польза В одном потоке рабоать с пользовательским вводом и сетью, во втором рисовать с фиксированным фреймрейтом, еще в трех - считать что-то тяжелое. Алсо, с блокирующим IO в отдельном потоке работать гораздо проще, чем с неблокирующим IO со всякими poll и select в основном потоке.
>>1242243 >Алсо, с блокирующим IO в отдельном потоке работать гораздо проще, чем с неблокирующим IO со всякими poll и select в основном потоке. Это где так?
>>1242239 >Вы тут смотрю потоки обсуждаете, но что это дает? Какая от этого практическая польза?
В 21 веке процессоры многоядерные. Производительность на ядро растет всё меньше и меньше. Писать однопоточный код уже признано однозначным зашкваром. Тот кто его пишет считается дремучей лалкой из времен pentium4/athlonxp
>>1231397 (OP) АААААА !!!блядь! Что за хуйня? Читаю Мозга Кернигана с Денисом, а там блядь ФУНКЦИИ БЕЗ ТИПА, т.е. что то типа foo (x,y) {пошла моча;} Что за троллинг? Я прост с крестов начинаю, а тут такие ужасы...
Анон, привет! Сорри за нубские вопросы заранее. Только начал изучать Си. Оператор return. Не могу понять немного суть использования (не в функции). return 0 - типа успешное завершение программы. А вот допустим видел кусок кода, в начале данные на инпут от юзера идут и код чекает удовлетворяют ли они условиям и идёт 3 штуки if в конце которых return 1; return 2; return 3 соответственно. Вот этот момент кто-нибудь может объяснить на пальцах?
> The C Programming Language В технических книгах сложный английский? Есть смысл пробовать читать в оригинале, если с английским знаком только по интернетам, но никогда его не учил?
>>1242634 не насилуй себя на начальном уровне. В языке Си много тонких мест, и если ты их проебёшь из-за незнания английского, то нахуй выёбываться. Один хуй тебе придётся читать доки ко всем либам только в оригинале.
>>1242627 return - точка выхода из программы. Всё сворачивается автоматические переменные убиваются и остаётся только то что ты повесил на return. Если прога ничего не должна возвращать то и return не нужен. Читай мануал дальше. Там всё объяснено.
А млять, неправильно прочёл что ты там срашивал. Прога завершается и return высирается ОС, а дальше уже она сама решает что с этим говном делать. Читай как и зачем в Юниксах пайпы делают, это из этой оперы. >>1242640 - продолжение
// ensure valid dimensions d = atoi(argv[1]); if (d < DIM_MIN || d > DIM_MAX) { printf("Board must be between %i x %i and %i x %i, inclusive.\n", DIM_MIN, DIM_MIN, DIM_MAX, DIM_MAX); return 2; }
// open log FILE* file = fopen("log.txt", "w"); if (file == NULL) { return 3; } Вот сам код
>>1242678 Тебе же сказали, почитай стандартные значения кодов возврата. Зачем ты код принёс.и на будущее заливай код в идеон или сорт оф, а в тред ссылку
>>1242354 У юзера винды есть Рихтер и есть соответствующая глава в MSDN. После этого достаточно лишь прочитать описание threads.h в стандарте.
>>1242408 > В 21 веке процессоры многоядерные > Писать однопоточный код уже признано однозначным зашкваром Вот только процессов тоже больше одного. Писать многопоточный код без необходимости - это извращение уровня FizzBuzzEnterpriseEdition.
>>1242566 Да, раньше в языке было еще больше способов стрелять себе в ногу с переподвыверта.
>>1242627 0 - это EXIT_SUCCESS. Все остальное на твое усмотрение. Можешь обойтись лишь EXIT_SUCCESS/EXIT_FAILURE, можешь возвращать номер стадии, на которой произошла ошибка (как в коде, о котором ты говоришь). Или, например, в MS-DOS была команда choice, использовалась для написания батников - она предлагала нажать одну из заданных в аргументах клавиш и возвращала ее порядковый номер. Так тоже можно.
Сап. Подскажите какой дебаггер выбрать. Мне нужно чтобы я запустил прогу, а дебаггер показывал, какая часть исходного кода выполняется. Типа, нажал кнопку в проге, и он тут же подсветил участок кода. Чтобы можно было посмотреть какие переменные в памяти, чтобы можно было останавливать выполнение в произвольном месте и например отматывать назад или выполнять код по шагам/тактам. Работаю на винде. Но в принципе, если есть такое только под линукс, то ок. Хорошо бы чтобы он был опенсорсный.
>>1242686 Спасибо, что-то вроде проясняется после твоего ответа. А можешь объяснить FizzBuzzEnterpriseEdition это что такое? ФиззБазз что такое знаю, а всё в целом что подразумевает?
И этот неявный инт - это архаика и теперь так писать дурной тон, правильно?
Вопросы по Прате: Вот пример из книги https://ideone.com/oJaSnL объявление структуры и объединения у меня вызвало подозрение, попробовал запустить, офк ничего не пошло, пока не убрал булы, размер структуры с ними 16 , без них 4, хули так много? хотя размер була 1, я так понял что в структуре у меня засели int на 4 позиции bool 4 опять инт и опять бул. Это так? Так вот, такую же мешанину из short, int и bool делать нельзя? Что происходит с битовыми полями при смешивании типов, почему по ссылке все работает норм?
>>1243322 > Так вот, такую же мешанину из short, int и bool делать нельзя? Делать мешанину можно, но битовые поля не ок с точки зрения производительности. Все это стоило сделать настоящими bool и int, экономия тут ни к чему.
> Что происходит с битовыми полями при смешивании типов Ничего не происходит, тип элемента битового поля может быть bool или int. Единственное, чего нельзя - указывать битов больше, чем в реальных singed/unsigned int или bool.
> почему по ссылке все работает норм? Потому что и должно работать норм.
> офк ничего не пошло, пока не убрал булы Возможно, у тебя компилятор не умеет в C99, возможно, ты просто -std=c99 или -std=c11 забыл. Тащи сообщение об ошибке.
>>1243334 c11 включен, даже варнингов нет. Вот мой выхлоп:
Исходные настройки окна: Окно непрозрачно. Цвет фона желтый. Рамка отображается. Цвет рамки зеленый. Стиль рамки штриховой.
Настройки окна с использованием представления unsigned short: Окно непрозрачно. Цвет фона черный. Рамка не отображается. Стиль рамки сплошной. Цвет рамки черный. комбинация битов 00000000000000000000000000000001
Измененные настройки окна: Окно прозрачно. Цвет фона желтый. Рамка отображается. Цвет рамки зеленый. Стиль рамки штриховой.
Настройки окна с использованием представления unsigned short: Окно прозрачно. Цвет фона голубой. Рамка не отображается. Стиль рамки пунктирный. Цвет рамки красный. Комбинация битов 00000000000000000001001000001100
>>1243338 Во, теперь понял, в чем твоя проблема. Дело в том, что GCC "оптимизирует" битфилды таким образом, что члены разных типов выравниваются на границу инта. Получается бит для bool + 31 бит выравнивания, 7 бит для цвета и безымянного члена + 25 бит выравнивания, 1+31 для bool и выравнивания и т. д. Всего 4 инта, т.е., 16 байтов. Скажи -mno-ms-bitfields или собирай шлангом, там этот ключ по умолчанию, а для GCC-шного поведения нужно специально попросить -mms-bitfields.
>>1243345 > я им и собирал Мда, ну значит у меня просто старый шланг.
> а вообще это выравнивание битовых полей в стандарте не прописано? В стандарте всегда крайне расплывчатые формулировки всего, что выходит за пределы абстрактной машины. Код в Прате непортабелен, потому что делает предположения относительно раскладки битфилдов: компилятор может выделить под элемент char, а может и int, может начать заполнение со старшего бита, а может с младшего. Но то конкретное поведение, на которое ты напоролся - стандарту противоречит. Даже если компилятор выделит всего байт для первого bool, в байте останется еще достаточно места, чтобы туда влезли fill_color и анонимный член, и в этом случае компилятор обязан их туда положить.
В теории эта программа https://ideone.com/gBSvuQ должна выводить количество слов определенной длины, на практике ничего не работает, что я делаю не так?
>>1243679 Даже, если пофиксить эту ошибку, у него не будет это нормально работать. У него не будет считаться последнее слово в файле, но с этой ошибкой пусть он уже сам разбирается, она довольно тривиальна.
Аноны, какие есть способы организации динамических библиотек? На винде есть dll файлы, а мне бы что нибудь похожее, только кросс платформенное. Допустим, я написал в таком модуле некие функции, структуры и т.д., в общем модуль с некоей функциональностью. Потом где-то отдельно, скомпилировал сишный код этого модуля в такую вот библиотеку, и могу ее смело подключать к основной программе, чтобы в ней появилось нужная мне функциональность. Чтобы почитать по этой теме? Интересует как сам формат таких библиотек, так и механизм компиляции и их подключения. Интересно было бы взглянуть на какие нибудь уже существующие реализации, если таковые есть. Хотя я бы предпочел пилить свой велосипед, так интереснее + я в этом гарантированно разберусь.
>>1243934 > а мне бы что нибудь похожее, только кросс платформенное Оберни dlopen/LoadLibrary, оберни dlsym/GetProcAddress и не выделывайся попусту. Не стоит оно того, особенно если ты кроссплатформенно хочешь, лол.
> Чтобы почитать по этой теме? John Levine "Linkers and Loaders"
> Интересует как сам формат таких библиотек Ты же велосипед собрался пилить. Как положишь, так и будет. Тебе понадобится положить: код, данные, имена экспортов-импортов, позиции в коде, куда они указывают (вместе с именами называется "символы"), позиции в коде, которые зависят от адреса, по которому код загружен и способы эти позиции пропатчить (вместе с адресами называется "поправки"). И вот тут ты начинаешь сосать с кроссплатформенностью еще больше, потому что на некоторых архитектурах количество типов поправок исчисляется десятками.
> механизм компиляции Ну ты такой короч пишешь ld-скрипт или каштомный линкер.
> их подключения mmap/VirtualAlloc + mprotect/VirtualProtect
Сап, написал всякой хрени, которая предосиавляет интерфейс malloc/free, но перед free зануляет область памяти. Смотрю, а в тырнете пишут, что всякие линухи зануляют страницы сами после использования чтобы приложения не шарились у друг друга в куче. А где-то пишут, что недостаточно секьюрно/опция в таком-то дистре отключена из-за перформанса. Короче, кто ведает состоянием page zeroing'а на современных никсах? Когда, где, при каких условиях?
>>1243934 Гугли autotools Пишешь обычные библиотеки, через autotools делаешь кроссплатформенный configure файл, который потом генерирует makefile под нужную платформу.
>>1231397 (OP) Как написан язык си ? На каком языке ? Мб есть сурс код у кого ? Буду благодарен просто интересно, мб в будущем доделаю язык и сделаю нормальный импортинг файлов лол
>>1244571 Ебанутый, С - это как русский, оба языка и не могут быть как то написаны в стиле программы, есть компиляторы С, вот их много, из маленьких которые можно смотреть выбирай PCC или TCC, ссылку на последний тебе дали.
>>1244577 Спасибо. >>1244604 Почитаю энивэй. >>1244623 PG_ZERO, походу, по дефолту в конфиге не отображается. Наверное, надо эмбеддед врубить. Правда, эта опция тоже не совсем то, она отвечает за произвольный зероинг в состоянии idle. Можно нагуглить коммит стрекозаБДСМ из 2016 за подробностями
>>1244577 А ещё в этой статье не очень изящное решение. в gcc нет memset_s, но можно сделать указатель на функцию с сигнатурой мемсет, но только у указателя на память volatile добавить. И вызывать мемсет_с
>>1244644 Качай линух, ставь себе что хочешь любым пакетным менеджером. Писец, нюфаги поехали из-за сраных Го с Питоном и интересуются , почему в языке нет пакменов. Я в шоке.
>>1244647 Ты опять не понял. При чём здесь пакетный менеджер линукса? Это не централизованное хранилище библиотек для Си. Да, с помощью него можно управлять исходниками, формировать свои пакеты, но это всё нужно делать самому. А я про централизованное хранилище, чтобы ставить и обновлять библиотеки, а не копировать их самому откуда-то вручную и самому следить за версиями.
>>1244665 Попробую пояснить в другом ключе. Библиотеки для нас - не перчатки, мы их не меняем по сто раз в неделю, а вся работа с библиотекой не сводится для нас в import os. Так яснее?
>>1244583 Сам язык не написан, он существует в голове у людей. Другой анон привел аналогию, си это как русский. Ты можешь написать программу которая умеет писать на Си, читать Си, исполнять Си, но ты не можешь написать Си.
>>1244831 > в gcc ключ есть Почему он такой странный? -I и без пробела указывать путь? Можно как-то проще? Если положить в одну директорию с gcc.exe, то пойдет?
>>1244874 >cs50.h https://github.com/cs50/libcs50 Должно помочь добавление параметра -lcs50 к линкеру. Чтобы не возиться с путями - пусть лежит там же - в корне проекта.
>>1231675 Твоё недоумение понятно. Это когда ты под писи на линуксе, например, пишешь у тебя printf в любом случае выводит текст, даже если ты перенос строки (\n) не поставил в конце и читать о таких вещах в книге крайне удивительно, потому что такое поведение воспринимается даже совсем новчиками либо как нечто нелогичное, либо как какой-то атавизм, тем более после того, как выясняется, что и без переноса строки всё прекрасно выводится. А я вот однако умудрился столкнуться с этой хуйнёй когда реализовал weak-linked функции _read и _write (через которые работает io), чтобы сделать маленький интерактивный шелл для микроконтроллера по uart'у. И тогда поведение printf'а и всяких putchar меня удивило, потому что я через них выводил строчки начиная с символа новой строки, а не заканчивая им, то есть как printf("\nstring"), а не printf("string\n") - в конце концов нужно же было как-то сделать вывод приглашения шелла, например. В результате строка начинавшаяся с символа новой строки выводилась только после того, как выполнялась строчка кода, выводящая другую строку. В тексте на скриншотах объясняют природу этого феномена через разъяснение механики работы ввода-вывода - наличия буфера.
>>1244831 С -I указываешь путь к директории с заголовочниками либы, с -L - путь к директории, где лежиь либа (libимя.a), c -lимя поключаешь библиотеку (или -lимя.a, если имя не соответствует стандарту). Класть свое говно в директории установленного гцц категорически не рекомендуется. Чтобы не писать каждый раз все это руками, делаешь мэйкфайл.
>>1245071 > Как получить список запущенных процессов? Прогулкой по procfs (/proc).
>>1245086 Нинужно. Переход с одной версии либы на другую должен быть взвешенным и осознанным решением.
>>1245191 >Прогулкой по procfs (/proc). Это только на линуксах. >As of February 2011, procfs is gradually becoming phased out in FreeBSD.[1] It was removed from OpenBSD in version 5.7, which was released in May 2015, because it "always suffered from race conditions and is now unused".[2]
>>1245198 В винде есть Toolhelp-функции и NtQuerySystemInformation в API, есть dbghelp.dll, можно даже парсить PEB, если нужна дополнительная информация о процессах. Очевидно, что кроссплатформенно такие вещи не делаются.
> procfs is gradually becoming phased out in FreeBSD Сочувствую.
Что за хуйня https://learnc.info/c/opaque_pointers.html In file included from F:\Documents\workspace\test\src\sec.c:2: F:\Documents\workspace\test\src/header.h:25:12: warning: unused function 'checkDepth' [-Wunused-function] static int checkDepth(unsigned); ^ F:\Documents\workspace\test\src/header.h:26:12: warning: unused function 'checkHeight' [-Wunused-function] static int checkHeight(unsigned); ^ F:\Documents\workspace\test\src/header.h:27:12: warning: unused function 'checkWidth' [-Wunused-function] static int checkWidth(unsigned); ^ 3 warnings generated. sec-7987a8.o : error LNK2019: ссылка на неразрешенный внешний символ createBox в функции main sec-7987a8.o : error LNK2019: ссылка на неразрешенный внешний символ getVolume в функции main sec-7987a8.o : error LNK2019: ссылка на неразрешенный внешний символ setWidth в функции main F:\Documents\workspace\test/bin/sec.exe : fatal error LNK1120: неразрешенных внешних элементов: 3 clang.exe: error: linker command failed with exit code 1120 (use -v to see invocation) [Finished in 0.3s] как так то, функцию креэйт добавил, не могу никак понять что за гавно? {ули он не видит, компилю шлангом, да и гцц ту же ересь несет. Бля они тупо не видят Box.c, как так то блять?
>>1245226 Покажи командную строку, как собираешь; убери ключевое слово static из .h - единственные static-функции, которые имеет смысл класть в .h - это static inline. Ну и скорее всего, ты при сборке указываешь один .c файл, но не указываешь второй.
>>1245226 Ладно, я еблан, надо было в сублайме изменить параметры компиляции или мейкфайлом делать. Будут ли косяки если я буду включать все сурсы в параметре компилятора? даже не относящиеся к программе, компилятор их заигнорит?
>>1245230 > Будут ли косяки если я буду включать все сурсы в параметре компилятора? Пока учишь язык, обо что-нибудь обязательно споткнешься, хотя качественный код с правильно расставленными статиками для функций и переменных от такого ломаться не должен.
Лучше просто сделай мэйкфайл, саблайм в них отлично может.
>>1245226 >>1245229 >убери ключевое слово static из .h вот не понимаю, убираю я статик, а почему все ровно не могу обращаться к чек функциям из main? они же ничем не отличаются от геттеров и сеттеров. Или я уже в глаза долблюсь?
>>1245236 > а почему все ровно не могу обращаться к чек функциям Значит не убрал статики, не перекомпилировал box.c или еще что-то, нам-то откуда знать, что ты там написал и как собираешь?
>>1245239 > Box.h:26:12: warning: unused function 'checkDepth' [-Wunused-function] Потому что в main.c ты не используешь эту функцию, а объявлена она как статическая, т.е., static говорит, что функция существует только в данном файле. А если она "существует" в main.c, но не используется, то нахуй она тебе нужна?
Как сделать правильно, а не как в статье: если checkXXX не нужны вне box.c, удаляешь их объявления из box.h нахуй и кладешь их в начало box.c. Или удаляешь объявления вообще и кладешь определения (тела) в начало box.с, добавляя к ним static (часто именно так и делают, если нет перекрестных зависимостей между функциями). Если check нужны вне box.c, тогда просто удаляешь ключевые слова static из box.h, и функции станут доступны из любого файла.
Не могу разобраться с массивами. В книге написано: в С вызываемая функция не может модифицировать переменные в вызывающей функции Но к примеру тут https://ideone.com/f4VZYD она же модифицирует. Или я чего то не понимаю?
Какие есть инструменты анализа кода и построения структуры программы ? Про Doxygen вычитал: Doxygen генерирует документацию на основе набора исходных текстов и также может быть настроен для извлечения структуры программы из недокументированных исходных кодов. Возможно составление графов зависимостей программных объектов, диаграмм классов и исходных кодов с гиперссылками. Есть ли еще инструменты с таким функционалом?
>>1231397 (OP) Ананасы, а как используя аргумент exceptfds (четвертый аргумент) в системном вызове select() получить собственно тип исключения? Это вообще возможно или нужно всё переделать на poll() и смотреть на возвращаемые биты в revents структуры дескриптора struct pollfd?
>>1246048 >https://ideone.com/f4VZYD Здесь функция модифицирует память, на которую указывает переменная, а не сам указатель (который собственно был передан функции). Но в общем твое непонимание понятно: в книге имеется в виду, что в вызываемую функцию передаются копии параметров. Т.е. передавая в функцию указатель на память, вызываемая функция может использовать этот указатель как угодно, в том числе модифицировать память, на которую он указывает, но вот само значение указателя (т.е. адрес масива) остается таким же в вызывающей функции, что бы ты не делал.
Да блядь, какое нахуй деление по модулю нахуй! Анонче, пихаем шорт или что том у нас двухбайное в чар, какая половина будет в чаре? Старшая или младшя? Я слишком тупой чтобы обясните мне в бинарном коде.
>>1246351 Младшая. А чего ты в модуле понять не можешь? Это просто такой способ сказать "старшие биты выбрасываются". Представим, что у тебя не двоичные разряды, а десятичные, и у тебя есть 12345678, из которого тебе надо 4 разряда - старшие разряды ты отбрасываешь. Можешь это выразить как: 12345678 % 104 = 12345678 % 10000 = 5678. То же самое с битами: есть 16-битное xxxxxxxxyyyyyyyy, тебе нужно впихнуть его в 8 бит, и ты выбрасываешь старшие разряды. Можешь это записать как xxxxxxxxyyyyyyyy % 28 = xxxxxxxxyyyyyyyy % 256 = yyyyyyyy.
>>1247292 я чето не о том подумал и про порядок вычисления написал. Куда бы ты не воткнул 5/9 в инте - компилятор рассчитает эту константу во время компиляции и воткнет 0. Что в начале выражения, что в конце
>>1247292 Инт целое, флоат с плавающей точкой. 5 разделив на 9 ты не получаешь целое. Ну и уж если совсем доебаться, то константой а заодно и мелкой оптимизацией запись float fahr = 0x3f000000; лучше оставить, а коммент добавить что это за константа.
> Упражнение 1.6. Проверьте, что выражение getchar () ! = EOF действительно равно 1 или 0. Как? У меня только 1 выводит. Упражнение 1.7. Напишите программу для вывода значения константы EOF. Как? У меня -1 получается. >>1247343 > 5 разделив на 9 ты не получаешь целое Согласен, поэтому и нужно celsius в float, а почему fahr в int не оставили?
>>1247354 Если под виндой сидишь, то ctrl + z, если под линуксом - Ctrl+D. Либо ещё перенаправление потока ввода с фала можно сделать и по итогу 0 выдаст.
>>1247031 Прямо в стандарте в Annex C есть прямо списком.
>>1247349 С float будет меньше преобразований int/float на каждом шаге цикла. Еще с float можно задать шаг в 0.5 - для такой таблички вполне естественное решение.
>>1247391 > С float будет меньше преобразований int/float на каждом шаге цикла. Наоборот ведь, смотри маленькие синие буковки. Я поэтому и задал вопрос.
Есть ли готовые функции strtod() и atof(), которые не зависят от локали? Если нет, то как вы в таком случае поступаете, тупо меняете локаль на англоязычную?
>>1248176 > Но почему Потому что ты заранее знаешь, сколько памяти на стеке ты можешь позволить себе выделить (и тогда просто выделяешь массив фиксированного размера), либо ты не знаешь, поэтому не ограничиваешь максимальный размер массива, рано или поздно пытаешься выделить много и получаешь переполнение стека. Вывод: VLA нинужны.
>>1248323 > готовые функции strtod() и atof(), которые не зависят от локали Есть. strtod() и atof(). При старте у тебя локаль "C", где разделитель - точка. Если меняешь локаль и не хочешь локальные разделители (или файл парсишь, например) - выставь LC_NUMERIC в "C", потом вернешь.
>>1248397 Читаешь построчно, опционально убираешь из начала и конца прочитанной строки все isspace(). Если строчка пуста или начинается с ; - пропускаешь. Если строчка начинается с [ - читаешь и запоминаешь имя текущей секции, проверяешь, что после ] нет мусора. Иначе ищешь первый =, читаешь до = имя параметра, после - значение. Что ты дальше с этим будешь делать - дело твое. Можешь в словарик сложить, можешь сразу применять, можешь на каждый ini_get("section", "key") парсить заново в поисках сначала нужной секции, а потом нужного параметра в секции. твой кэп
Я вообще правильно понимаю, что от меня хотят или нет?
> Упражнение 1.9. Напишите программу для копирования входного потока в выходной с заменой каждой строки, состоящей из одного или нескольких пробелов, одним пробелом. https://pastebin.com/0eEVzG3k > Упражнение 1.10. Напишите программу для копирования входного потока в выходной с заменой знаков табуляции на \t, символов возврата назад (Backspace) на \b, а обратных косых черт — на \ \. Это сделает табуляции и символы возврата легко читаемыми в потоке. https://pastebin.com/iLgcxjF5
>>1249235 > Пробелы. Нет, неправильно. Имеется в виду, что для файла типа: foo ... ...bar (точки - пробелы) ты должен вывести: foo . ...bar А та программа, что написал ты, абсолютно ничего не делает. Вторая вроде ок.
>>1249405 Считаешь пробелы, пока не встретишь не-пробел. Если встретил конец строки - выводишь один пробел и конец строки. Если встретил что-то еще - выводишь столько пробелов, сколько насчитал, выводишь встреченный символ, выводишь символы до конца строки включительно. Идешь на следующую итерацию.
>>1249576 Ну там не line, а string, так что это, видимо, переводопроблемы. Требуется схлапывать последовательности из нескольких пробелов в один: foo...............bar -> foo.bar. В целом суть та же, просто чуть меньше условий.
>>1248825 >типы из stdint.h, например, которые тоже optional. optional бывает разный, лол > These types are optional. However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two's complement representation, it shall define the corresponding typedef names. https://port70.net/~nsz/c/c11/n1570.html#7.20.1.1p3
Так что stdint.h фактически не optional. Или ты много платформ знаешь, которые не попадают под эти условия?
Есть большой набор чисел, который один раз были посчитаны при запуске программы, а теперь их нужно использовать, не вычисляя повторно. Допустим, 100 мегабайт данных.
Но проблема в том, что процессов может быть очень много, которые эти данные будут использовать. И если 100 процессов загрузят себе по 100 мегабайт чисел, это это уже 10 гигов.
Можно каким-то образом реализовать расшаренную область памяти? Или это достигается только инжектом с чтением памяти чужого процесса?
Собственно, мне даже за 100 мегабайт по голове дали, я придумал, как оптимизировать это в несколько раз, но всё равно дублировать данные между процессами не хочется.
Алсо, пока что не придумал, как эти данные перенести собственно в код. Сейчас они прямо там и вычисляются, но если их билдить с экзешником, то это 100 мегабайт экзешник получается - пиздец какой-то.
>>1251152 > Можно каким-то образом реализовать расшаренную область памяти Можно. mmap с MAP_SHARED, shm_open(), все дела. А вообще, ты уверен, что тебе нужны отдельные процессы, а не потоки?
>>1251166 >Можно. mmap с MAP_SHARED, shm_open(), все дела. Получится иметь во всех процессах указатели на переменные в этой памяти? Это вот прям так работает из коробки? При этом все процессы всегда будут читать не_с_диска?
>А вообще, ты уверен, что тебе нужны отдельные процессы, а не потоки? Да, хотя я и не уверен, почему именно. Я пишу статическую либу, а параллелиться это будет на уровень выше, там другие люди решения принимают.
>>1251173 Ёпта, есть ещё такая штука как COW. По сути, даже если ты не будешь явно задавать shared-область, ядро навряд ли будет делать дубликаты, пока ты не испачкаешь страницы. Да, оно реально будет работать так, как тебе тот анон показал.
> насколько неудобно будет портировать это под винду Это базовая возможность всех более-менее полноценных ОС. CreateFileMapping (именованный)/MapViewOfFile.
Пытаюсь исполнять машинный код при помощи апишного VirtualAlloc значит... Но почему-то оно выдает exception на то, что я пытаюсь лезть в защищенные области памяти. Как это объяснить? https://ideone.com/ZtKovP
>>1252561 Ну вот ты вызвал свою функцию, исполнил два нопа, а дальше? А дальше, после нопов, у тебя в выделенной тобой странице памяти идут нули. А нули эти - add[rax],al. А в rax тебя что? Говно какое-нибудь. Вот оно и падает. Что оно должно делать дальше? Как оно вернется, чтобы выполнять вот эти твои виртуалфри? Алсо, тебе в >>1216107 (OP), а не сюда.
>>1252563 Они почти накатили уже, и они как-то буэ. Как бы нам тоже не завезли под шумок в C21.
>>1252617 Потому что процессор исполняет инструкции одну за другой (если они не какой-то сорт бранча), и ему похуй, сколько ты там скопировал. А выделить меньше, чем страницу ты тоже не можешь. Вот и получается, у тебя либо access violation, потому что нули - это mov, пишущий куда-то не туда, либо access violation, потому что после страницы ничего нету. В общем, прочитай про ассемблер что-нибудь, про вызов функций, все такое.
>>1252626 Подстановка всем плоха, она замедляет компиляцию и затрудняет автоматический анализ исходников. Заодно хедеры заставляют тебя при изменении сигнатуры функции править ее в двух местах. В лучшем мире компилятор автоматически брал бы сигнатуру из объектника, если мы распространяем собранные либы, либо из исходника, если исходники доступны.
>>1252659 Стандарт еще не вышел, можешь пока погодить. Но там уже черновик вылизывают, так что скоро. Опять мы кресты в треде про няшную обсуждаем. Ну что ж такое-то!
>>1252890 Link-time optimizations. Компилятор генерит аннотированный байткод, а линкер схлапывает все объектники, после чего уже генерит машинный код. Это позволяет выкидывать неиспользуемые функции, инлайнить часто вызываемые функции, даже если они не были объявлены как static inline, мержить функции с одинаковым телом и много чего еще. В гцц включается флагом -flto, в студии это называется link-time code generation и включается -GL.
Может ктонибуть набросать простой пример как юзать pcre2_substitute? Примеров в нете чет толком не могу найти, либо очень запутанный код, а я в Си не так давно, перловые регулярки знаю хорошо, но вот въезжание в api libpcre2 дается с очень большим трудом. Буду благодарен если покажите как char *subject = "test1 test2 test2", с помощью pcre2_substitute, заменить регуляркой "s/(test)2$/\13/"
Господа, пишу в Geany следующее и получаю пустой .dat файл, рассчитывая на набор координат для графика. Где я долбоёб? #include <stdio.h> #include <math.h> int main() { FILE*f; double a,b,st,x,y,y8=1./0.; int i,n; f=fopen("02hyp.dat","w"); a=-1.; b=1.; n=301; st=(b-a)/(n-1); x=a-st; for (i=0; i<0; i++) { x+=st; y=1./x; if (fabs(y)>100.) y=y8; fprintf(f,"%lf %lf\n",x,y); } fclose(f); return(0); }
>>1253711 И смотря чем ты собираешься заниматься. Знакомый веб-дизайнер пользуется очень ограниченным набором мат. приёмов и знаний, хватает для фронт и бэк энда. А кто-то, как мой препод в институте, вообще говорит, что если человек не сдал матан - его нельзя подпускать к компу.
Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №29: https://arhivach.cf/thread/347271/
- №30: https://arhivach.cf/thread/366174/
- №31: https://arhivach.cf/thread/366210/