Это копия, сохраненная 1 октября 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь 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/
Бля забыл фото прикрепить, пиздец я еблан
Тот редкий случай, когда в объяснении из книги не только все понятно, но еще и добавить нечего.
Если осилил кривой телнет, значит посылку команд и чтение статусов тем более осилишь. Не пытайся сразу что-то полнофункциональное реализовать, сделай загрузку и скачивание по заранее известным путям (чтобы не ебаться с LIST), в пассивном режиме. Там нужно уметь буквально несколько команд.
перекатился
Можно, без особых проблем, и даже с бонусами в виде адекватных отладчиков.
Ну, т.е. самые общие определения и преимущества, чтобы я потом понимал, зачем я изучаю конкретный отладчик.
Короче, хочу вкатываться сразу в новейший-моднйший-C. Что посоветуете?
> - Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
Код? Но в целом у тебя утечек не будет, после free() будет переменная, указывающая в воздух. Или ты по указателю данные забрал? В общем, тащи код.
Спасибо. А тяжелое вообще чтиво? Ну так, если с KR сравнить или с TCPL Страуструпа?
roll
Roll
>
>
> Я тут сижу и думаю, как можно узнать размер функции в байтах? Звучит тупо, но это реально нужно для одной моей шальной затеи.
Никак. На самом деле компилятор тебе может
1) Её вообще заинлайнить
2) Наоптимизировать вызовы так, что даже с идой без поллитры не разберешься.
3) Чтобы подобную хуйню реализовать тебе в машоб-тредик надо, на нейросеточках учить программу дизассемблировать выхлоп компилятора.
Ну а если тебе очень надо, то есть в GCC ключ -ffunction-sections который позаолит тебе потом из object-файла то что тебе надо прочитать с помощью readelf -S t.o | grep ' .text.'
>Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека"
stdalign не завезли, пришлось делать две ветки windows/linux.
Скрипты внешние что-ли? Если да, то взгляни на Lua.
У меня есть задача записать функцию в бинарный файл. Для этого мне желательно знать ее размер.
Я подумал, что могу оканчивать запись в функцию после байта команды return? Так же можно, наверное?
Я считал 40 байтов с указателя на начало функции. Вот они в hex редакторе. Но в них нет байтов C3 и CB, которые означают return. Неужели функция больше 40 байтов, или же я обосрался с кодом?
>Я подумал, что могу оканчивать запись в функцию после байта команды return? Так же можно, наверное?
1) Команда return из сей в процессе компиляции может стать чем угодно. начиная от ассемблерной ret и заканчивая сшивкой кода разных функций воедино совершенно рандомными регистрами или через стек без каких-либоявных call/ret. В зависимости от желания компилятора.
2) Вангую, ты придумал сам себе какую-то херню и не можешь конкретно написать здесь что именно тебе надо и окажется что нужно тебе было вовсе не "ну пацаны гланды через жопу тянуть расскажите как".
От себя вангану, что ты хочешь навелосипедить JIT-компилятор для С, но не знаешь в этой области кроме самого языка С нихуя. В таком случае тебя стоит отправить окунуться в волшебный мир плюсов и изучать LLVM, как самый быстрый способ сделать то, что тебе надо.
Я хотел позабавиться и сделать считывание функции из бинарного файла. Практической пользы почти никакой, просто из интереса. То есть я беру указатель на функцию и дальше записываю туда байты из бинарного файла. Как мне казалось и как кажется, это должно работать.
>Я считал 40 байтов с указателя на начало функции. Вот они в hex редакторе. Но в них нет байтов C3 и CB, которые означают return. Неужели функция больше 40 байтов, или же я обосрался с кодом?
Бляяяяапаааааааааааа
>Скажи мне где я обосрался, я тупой, извините уж.
В данном случае - ты словил конкретное такое матерое UB, объявив функцию, которая нигде не используется и взяв с неё указатель.
В общей концепции твоего хода мыслей - в непонимании того что функции С - это такая же абстракция, как какие-нибудь лямбда-замыкания из хаскеля и компилятор делает с этими абстракциями то что он посчитает нужным - хочет - выкинет нахуй, хочет - заинлайнит, хочет - сделает вызовы по своему.
Исключение - функции, объявленные как библиотечные путем __declspec(dllexport) и __attribute__((visibility("default"))) в случае гцц и скомпилированные в lib/dll. В таком случае компилятор блюдет соглашение о вызовах и ты действительно можешь там чего-нибуть накопать. Но и в этом случае с твоим ходом мыслей можешь соснуть хуйца.
А если надавать кучу ключей компилятору, чтобы он не инлайнил и т.п.?
То же самое, но с использованием стандартных опердней без велосипедов:
https://gnuu.org/2009/09/18/writing-your-own-toy-compiler/
Это выебывается (читай оптимизирует для предсказателя переходов) visual studio, байты E9 A9 это JMP (считай goto) на реальное начало функции. Посмотри в отладчике оффсет либо интерпретируй следующие байты адреса, чтобы попасть на реальную функцию
Ну вот ты сделал free(), и твой hippo перестал быть валидным, ты не можешь больше к нему обращаться. Поэтому обычно после free(hippo) делают hippo = NULL, чтобы случайно не вляпаться. А утечек нет.
>>34059
Скорее всего ты хочешь dlopen/dlsym или LoadLibrary/GetProcAddress соответственно. Но, конечно же, можно и самому грузить рандомный исполняемый код в память и выполнять, только это нихрена не простая задача.
>>34070
> Я тут сижу и думаю, как можно узнать размер функции в байтах?
В общем случае нельзя. У функции нет четких границ. Твоя функция может начинаться в середине другой функции, а заканчиваться прыжком в середину еще какой-то функции.
>>34089
> stdalign не завезли
Правда что ли? У меня вроде работало. Хедера нет - завези сам. alignof/alignas точно поддеживаются.
> Правда что ли? У меня вроде работало
Глянул. Оно в шланговом тулсете есть, поэтому и работало.
А это, мой дорогой друг, секция данных, там константы лежат. Объясни, что ты хочешь сделать и нахуя.
Открой Visual Studio Command Prompt, напиши dumpbin /ALL main.obj хотя бы.
Не, функция сишная всегда после вызова начинается с байта 55 - PUSH EBP, для указания через EBP на локальные переменные
Вообще тебе может быть легче, взяв старенькую утилиту obj2asm и текстовый исходник .c
открываешь в папке с ней командную строку и пишешь что-то вроде
obj2asm project.obj project.c > output.txt
> нужна чтобы вывод в консоль был перенаправлен в файл
> функция сишная всегда после вызова начинается с байта 55 - PUSH EBP
Чушь. Есть -fomit-frame-pointer, /Oy, есть функции-обертки, есть /hotpatch, втыкающий в начало функции mov edi,edi, есть int getRandomNumber(void) { return 4; }, так что предполагать что-либо о начале функции нельзя.
Привет, двач. У меня тут появилась промлема
int a;
printf("%d\n", a);
почему выводит 4201019 наверное у другних будет другое число, но у меня именно это
Что это за число ? Я просто тупой
Ты не присвоил знначение x, потому printf распечатала мусор из стека (похоже что какой-то адрес, оставшийся в памяти)
Рассказали уже. В переменной лежит адрес возврата, оставшийся в стеке после вызова какой-то функции. Адрес характерный для кодовой секции exe-шника в винде.
Не почему он такой, а почему там какоет непонятное число которое я никуда не записывал я же написал что я тупой, чё ты приебался
Я хочу записать байты функции в текстовый файл, чтобы потом можно было загружать оттуда функцию. Нахуя - не знаю.
Вот это выползло.
Отож. Сам недавно собирался, пришлось в виндовый ифдеф воткнуть __declspec( align( # ) )
if (index == 1 || strcmp(a, b) == 0) { ... }
Правильно ли я понимаю, что если index == 1, то strcmp уже не будет затем вызываться?
Так линкер пиши свой. Или грузи объектники. .bin нормально ты все равно не загрузишь.
>>34913
>Правильно ли я понимаю, что если index == 1, то strcmp уже не будет затем вызываться?
Правильно. Операторы &&, || и частично ?: (когда дело касается второго и третьего операнда) ленивые, и не вычисляют правый операнд, если он не повлияет на значение выражения.
Чтобы вызывался надо поставить |.
Спасибо.
Какой ты злой, все лабы уже написал?
SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Rus");
ничего не помогает, MinGW.
На clang все норм работает.
По умолчанию в консоле 866 локаль используется
>Потому что исходник в UTF-8, наверное. Но лучше всего его в UTF-8 и оставить.
т.е. от кодировки исходников генерируется различный объектный код?
Нет. В Си есть source charset и execution charset. Если они отличаются, то компилятор транслирует строковые литералы. Если execution charset не совпадает с фактическим (т.е., если по-русски, строковые литералы в бинарнике не в той кодировке, что ожидает консоль), ты видишь крякозябры.
Еще полтора года есть подводный камень: консоль с кодировкой UTF-8 в Windows 7 работает через пень-колоду. Иногда не работает вовсе.
Не считается.
К слодению и вычитанию
унарные
Нет. В Си есть source charset и execution charset. Если они отличаются, то компилятор транслирует строковые литералы. Если execution charset не совпадает с фактическим (т.е., если по-русски, строковые литералы в бинарнике не в той кодировке, что ожидает консоль), ты видишь крякозябры.
Я? Какого бота?
Все, понял.
почему
0061FF24
вот тут инт хранится
0061FF28
а вот тут чар, да ? Тогда почему 4 байта выделилось ? Можете пояснить, просто я тупой и в книге это не объяснялось
0061FF2C
> Тогда почему 4 байта выделилось
Выделился байт, остальные три - выравнивание, чтобы следующий член структуры получил адрес, кратный четырем. Это, в свою очередь, нужно для того, чтобы процессору было удобнее (и/или быстрее) его читать. На x86 ты можешь сделать #pragma pack, чтобы структуры упаковывались плотно: >>1229352, но на многих RISC-архитектурах процессор вообще не может прочитать слово по невыравненному адресу - сразу alignment fault, гроб-гроб-кладбище. Если хочешь подробнее: http://www.catb.org/esr/structure-packing/ (где-то было и на русском), но можешь просто не заморачиваться, компилятор обо всем позаботится пока ты не захочешь SSE: >>1229171.
>>36610
Как-то из моего ответа не очевидно, что для char выравнивания не требуется (если очень вкратце, примитивный тип выравнивается на свой размер), т.е., char a; char b; будут лежать рядом, без дыр. Так же и short a; short b; или даже short a; char b; char c;. Собственно, в перестановке полей структуры так, чтобы не было дыр, и заключается "искусство" ручной упаковки структур по ссылке выше.
>>36611
Да, ничем. У этих байтов нет имени, к ним нельзя обращаться (физически можно, конечно, выебнуться, но по стандарту нельзя). Чем оно заполнится - зависит от расположения структуры. Статическая память (глобальная) - скорее всего, там будут нули. Стек или куча - мусор.
Ээээ. Ну я тебе выше ссылку дал. И стандарт, но в нем сложно что навскидку найти. И википедия, и стековерфлоу, что в них плохого? И вообще, в теории (с точки зрения стандарта Си), тебя не должно волновать какое-то там выравнивание. У тебя есть offsetof() и sizeof(), а остальное не твое дело.
Да, спасибо анон, я просто слепой даун
void func (int t)
{
struct {
char a[10];
char b[10];
char c[10];
} arr[30];
for (int i = 0; i < 25; i++)
puts(arr.a);
// ... далее ещё код, где используется arr.a
}
Мне нужно, чтобы при t == 1 вместо arr.a вызывался arr.b во всей функции, а при t == 2 arr.c
То есть типа такого:
if (t == 1)
var = b;
if (t == 2)
var = c;
arr.$var
Как это на Си сделать?
void func (int t)
{
struct {
char a[10];
char b[10];
char c[10];
} arr[30];
for (int i = 0; i < 25; i++)
puts(arr.a);
// ... далее ещё код, где используется arr.a
}
Мне нужно, чтобы при t == 1 вместо arr.a вызывался arr.b во всей функции, а при t == 2 arr.c
То есть типа такого:
if (t == 1)
var = b;
if (t == 2)
var = c;
arr.$var
Как это на Си сделать?
Там после arr везде i в квадратных скобках.
Спасибо тебе!
> главное не проебать разный align компилятораом при оптимизациях, endian и прочие тонкости выстрела себе в ногу.
> Мне нужно, чтобы при t == 1 вместо arr.a вызывался arr.b во всей функции, а при t == 2 arr.c
Нихуя не понял, что тебе нужно, но видимо, ты хочешь трехмерный массив вместо массива структур, но боишься: arr[30][3][10]. Ну и используешь, хоть puts(arr[ i][0]), хоть arr[ i][t].
>>36695
> хэдер с функциями. Нужно ли внутри него совать #include
Да, если ты используешь в хедере типы или макросы из stdio.h (например FILE). Это правило хорошего тона, чтобы тот, кто подключает твой хедер не задумывался, что там нужно подключить до него и в каком порядке.
>>36698
> то в мейн файле он тебе не понадобится
Если мэйн использует функции из stdio.h, нужно подключать stdio.h явно. Потому что реализация anonlib.h может измениться, он уберет из своего anonlib.h инклуд stdio.h, и все сломается.
>>36842
> Есть легальная возможность изменить тип члена структуры без использования union?
Ну можно ∗(othertype ∗) &structure.member, но это не совсем легальная возможность. Хотя все так делают.
>>36867
> Почему если я передам функциибез прототипа принимающей аргумент типа int
Перефразируй или покажи пример. Если ты в printf суешь дабл вместо инта, то он просто не знает, что нужно преобразовывать дабл в инт.
>>36890
> если мы выделили char buf[1024], то мы в любом случае будем столько памяти тратить.
Ты не переживай, у тебя стек кроме этого килобайта еще сотню "впустую" тратит. Но ты можешь выделить много, посчитать длину и перевыделить ровно столько, сколько нужно, получив кучу других проблем из-за своей экономии.
>Ты не переживай, у тебя стек кроме этого килобайта еще сотню "впустую" тратит. Но ты можешь выделить много, посчитать длину и перевыделить ровно столько, сколько нужно, получив кучу других проблем из-за своей экономии.
Я вот это и делаю, получается пиздец какой-то несусветный.
> Я вот это и делаю, получается пиздец какой-то несусветный.
Я не знаю, какую проблему ты решаешь, но можешь почитать про таблицы строк. Делаешь динамический массив, кладешь строки вплотную, при необходимости делаешь realloc. Но до строк придется ходить по двум указателям: по адресу массива и по индексу первого символа строки внутри массива. Прямой указатель на строку долго хранить нельзя, потому что при realloc() массив вместе с твоей строкой может уехать в рандомное место кучи.
Че делать если простейшие крестики-нолики у меня вышли в 100 строчек ? Как понять как писать правильно ? https://pastebin.com/z0S2Cqck
тиктактое было бы прикольно еслиб вы указали мне на мои недочеты я почти уверен что функцию check_combo можно сделать по другому, но я не увидел как
На количество строчек насрать.
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) у функций без параметров сразу выдает крестоблядь.
В крестах тоже написать void не лишнее
Читаемость
Спасибо, анон
Но я не понял как сделать check_combos через цикл
Мож написать если не сложно ? Или объяснить
> Но я не понял как сделать check_combos через цикл
Ну как-то так: https://pastebin.com/esCWGyK5 Если сообщения выпилить, будет весьма кратенько. В функцию передавать координаты последнего хода и значок сходившего. Алсо, подразумевается игровое поле в виде массива строк, а не столбцов, т.е., field[y][x], а не field[x][y].
>Ну и стандартное отсутствие (void) у функций без параметров сразу выдает крестоблядь
C-петушку неприятно, лол. Ссу тебе на голову.
крестобоярин
Ты там определился, throw() или noexcept?
> Ну можно ∗(othertype ∗) &structure.member, но это не совсем легальная возможность. Хотя все так делают.
Попробовал в gcc, разницы никакой, int не стал float. Покажи на примере, как этим пользоваться.
Мля, да всё работает, уже не надо. Просто надо было в printf ещё приводить.
вот простейший пример. передаю ну как бы инт и спецом в прототипе не указываю что функция cube принимает аргумент типа double. на выводе получаю 0 при вводе любого числа. Вопрос почему так? разве по логике передачу фактического аргумента функции нельзя сравнить с присваиванием переменной типа double(в данном случае она имеет имя a). ну как бы я так себе представляю передачу аргумента типа переменной a присвоится значение n из функции main которое идет. ну хз короче
> не указываю что функция cube принимает аргумент типа double.
Непонятно, зачем ты с этим возишься, если программа очевидно сломана. Это, кстати, хороший пример, почему пустые скобки триггерят >>37113 сишников. Диагностики по этому поводу по умолчанию в гцц нет (но можно включать -Wmissing-prototypes), потому что раньше такой код был нормальным, да и сейчас иногда требуется.
Пустые скобки в твоей декларации означают любое количество любых аргументов. Когда при вызове функции компилятор не знает типов аргументов, он приводит все аргументы к дефолтным типам: все целые (char, short и т. д.) к интам (если не влезут - к лонгам), плавающую точку к даблам. Т.е., в твоем случае в аргументы попадает int. А дальше мы попадаем в cube(), и у нас происходит undefined behavior, потому что типы фактически переданных аргументов не совпали с ожидаемыми. И все, дальше ни о чем думать не нужно - программа сломана, дело закрыто.
Но похуй, объясню, откуда берется "ноль". В 32-битном коде 64-битный дабл при передаче в качестве аргумента кладется в виде двух 32-битных слов. Т.е., твоя функция cube() видит стек примерно так:
> ...
> адрес возрвата
> младшие слово (32 бита) дабла, у тебя сюда попадает твой инт
> старшее слово (32 бита) дабла, тут какой-то мусор (стек-то не пуст)
> ...
Из двух слов собирается дабл, инт идет в младшие 32 бита дабла (в младшие биты мантиссы, которые почти ни на что не влияют), мусор в старшие. И если у мусора не было нескольких (хотя бы трех) старших битов вполне нормальная ситуация, если там какой-нибудь указатель или адрес возврата, дабл получается положительнным и с маленькой экспонентой. Умножение усугубляет дело, делая экспоненту настолько маленькой, что она, возможно, даже перестает влезать в дабл, и в printf() уже передается настоящий ноль. Попробуй сделать printf("%g\n", a); в cube(), чтобы оценить, какое маленькое число ты получаешь на входе.
В 64-битном коде все проще - там первый целочисленный аргумент (или указатель) кладется в rdi (твой инт как раз туда попадает), а значения с плавающей точкой передаются через регистры SSE - первый аргумент через xmm0, а ты туда ничего не кладешь. Но так как твоя программа только что стартовала и скорее всего еще не успела что-либо оставить в регистрах SSE, то cube() достает оттуда дефолтный ноль.
Мораль сам придумаешь?
> не указываю что функция cube принимает аргумент типа double.
Непонятно, зачем ты с этим возишься, если программа очевидно сломана. Это, кстати, хороший пример, почему пустые скобки триггерят >>37113 сишников. Диагностики по этому поводу по умолчанию в гцц нет (но можно включать -Wmissing-prototypes), потому что раньше такой код был нормальным, да и сейчас иногда требуется.
Пустые скобки в твоей декларации означают любое количество любых аргументов. Когда при вызове функции компилятор не знает типов аргументов, он приводит все аргументы к дефолтным типам: все целые (char, short и т. д.) к интам (если не влезут - к лонгам), плавающую точку к даблам. Т.е., в твоем случае в аргументы попадает int. А дальше мы попадаем в cube(), и у нас происходит undefined behavior, потому что типы фактически переданных аргументов не совпали с ожидаемыми. И все, дальше ни о чем думать не нужно - программа сломана, дело закрыто.
Но похуй, объясню, откуда берется "ноль". В 32-битном коде 64-битный дабл при передаче в качестве аргумента кладется в виде двух 32-битных слов. Т.е., твоя функция cube() видит стек примерно так:
> ...
> адрес возрвата
> младшие слово (32 бита) дабла, у тебя сюда попадает твой инт
> старшее слово (32 бита) дабла, тут какой-то мусор (стек-то не пуст)
> ...
Из двух слов собирается дабл, инт идет в младшие 32 бита дабла (в младшие биты мантиссы, которые почти ни на что не влияют), мусор в старшие. И если у мусора не было нескольких (хотя бы трех) старших битов вполне нормальная ситуация, если там какой-нибудь указатель или адрес возврата, дабл получается положительнным и с маленькой экспонентой. Умножение усугубляет дело, делая экспоненту настолько маленькой, что она, возможно, даже перестает влезать в дабл, и в printf() уже передается настоящий ноль. Попробуй сделать printf("%g\n", a); в cube(), чтобы оценить, какое маленькое число ты получаешь на входе.
В 64-битном коде все проще - там первый целочисленный аргумент (или указатель) кладется в rdi (твой инт как раз туда попадает), а значения с плавающей точкой передаются через регистры SSE - первый аргумент через xmm0, а ты туда ничего не кладешь. Но так как твоя программа только что стартовала и скорее всего еще не успела что-либо оставить в регистрах SSE, то cube() достает оттуда дефолтный ноль.
Мораль сам придумаешь?
roll
Попробуй ножной
Есть задача:
while(...)
{
while(...)
{
как отсюда выбраться наружу внешнего вайла, не используя abort(), terminate(), exit() и goto
}
}
Нагуглил только возможность возвращать значения, если это всё изначально было внутри функции. Но должны быть еще варианты, какие не знаю. Подскажете?
To be continued...
Правильно - goto или обернуть в функцию и использовать return (последнее предпочтительно). Допустимо - добавить дополнительную переменную и условие во внешнем цикле, как посоветовали выше.
Согласен с этим.
К примеру, написал что-то вроде:
int value = 100, *pointer = &value;
т.е. и переменную объявил, и адресок взял, и все одной строкой.
Следуя логике советчиков - мне пiзда. Если так, то почему?
Чем однострочная запись хуже той, что на пике?
Да, ресурс так себе, знаю. Просто стало любопытно, почему так.
БЛЯБЛЯБЛЯ!!! АТЕНШОН!!! не та картинка
> Следуя логике советчиков - мне пiзда
Логика советчиков не в том. С точки зрения синтаксиса все ок. Но:
// При беглом взгляде кажется (особенно новичкам), что y и z - указатели, но нет.
// Это просто-напросто хуже читается. И это основная причина так не делать.
int ∗x, y, z;
А бывает еще вот такое форматирование, которое запутывает еще больше (поэтому нормальные люди звездочку пишут рядом с переменной, а не с типом):
int∗ x, y, z;
Нормальные — это те, которые яйцо разбивают с правильной стороны, следуя всем мудрым доводам твоего лагеря и игнорируя глупые доводы приверженцев противоположного?
Нормальные - это те, которые следуют древнему завету "декларация отражает использование". Если пишешь int∗ foo, будь последователен, делай дереференс int bar = ∗ foo; Не забудь также о printf("square: %d\n", ∗ foo ∗ ∗ foo);
goto и return нормальный юзкейс. В ядре линукса можно много где увидеть, хотя там обычно один return, на нем меткаerr_exit: и к нему делается goto.
>Goto это антипаттерн.
Это, конечно верно - но иногда просто нет других вариантов.
Но редко, да.
bool terminated = false;
while
{
while
{
while
{
while
{
....
terminated = true;
break;
}
if(terminated)
break;
}
if(terminated)
break;
}
if(terminated)
break;
}
Говнокод уровня легкой олигофрении, поздравляю.
Мы постоянно апстримим свой драйвер в netnet-next-branch линукса, да и не только мы юзаем goto.
Алсо: http://koblents.com/Ches/Links/Month-Mar-2013/20-Using-Goto-in-Linux-Kernel-Code/
>Goto это антипаттерн. За такое нужно увольнять.
Пошто его все так люто хейтят? Просто каждый считает своим долгом обосрать goto.
Что в нем такого плохого? Объективно. Реальные причины есть, или из разряда "все хейтят и я буду"?
Старый мем, повторяют как обезьяны.
Всё, что они могут сказать, написано в
Edgar Dijkstra: Go To Statement Considered Harmful
в своё время.
goto используется overДохрена раз в ведре Linux.
>Пошто его все так люто хейтят?
Потому что лапша.
Потому что структурное программирование придумано для того, чтобы принуждать умственно неполноценных дебилов вроде вас всех меньше говнокодить.
ООП, кстати, тоже в том числе для этого.
Ни разу не юзал гото, просто не пишу глубокие вложения, можно было бы выскочить с гото - выскочил.
Потому что надо быть адекватом, а не кукарекать за идиому.
>просто не пишу глубокие вложения
2 - уже может быть глубоким, кстати.
Впрочем, крудомартышкам это в любом случае не нужно.
Какие рабочие нагрузки выбрать при установке MS Visual Studio, чтобы работать с Си?
>рабочие нагрузки
Пришлось даже гуглить что это лол
Ну хз чел, я бы советовал бежать нахуй от майкрософтовского поделия и юзать труЪ стафф.
Обычный текстовый реактор и gcc все что тебе нужно, базарю.
Как проект разрастется напишешь makefile.
Потому что в общем равноценно возврату в любую точку кода в функции, даже не хочется рассматривать как специальный юзкейс.
Ыыы, так же можно ещё в while(0){} скоп запрыгнуть, ну ахринеть. Эксклюзивный так скоп только для гото)000)0
Иногда ещё clang можно юзать, у нас как-то порт на другую платформу не собирался на гцц, а на кланге собрался.
Мне надо написать серверную часть с ГУИ, потому что, сука, клиентская часть на Си.
Я Си то плохо знаю, а тут ещё почитал, что хрен слепишь графику.
Была не была, может тут ответят на мой ответ про TCP Socket'ы:
>Есть ли какой-нибудь выход, кроме как сливать значения передаваемых переменных в string с уникальными маркерами, а потом долго и уныло их парсить, перебирая каждую переменную?
Изначально хотел передавать структуру (потому что много данных типа bool, uint8_t, char), но в питоне нет структур... А для Си я граф. оболочку ни разу не писал. Как, впрочем, и на других языках.
Короче, mingw-w64 и SublimeText норм?
Смотрел ещё Eclipse - чем-то похожа на одну фирменную среду разработки под микроконтроллеры.
>Короче, mingw-w64 и SublimeText норм?
>Смотрел ещё Eclipse - чем-то похожа на одну фирменную среду разработки под микроконтроллеры.
Да, норм, mingw-w64 это пак gcc, g++ и прочего, под винду, gcc он и в африке gcc.
Сам пользуюсь нотепад++, всем устраивает, после кое каких настроек приобретает вид аля IDE, см. пик.
SublimeText лично не щупал, но думаю она норм, выглядит симпатично.
Эклипс да, ее вроде как юзают аврщики и ардуинщики часто. Тоже норм.
Многие еще vim юзают, что вообще мега труЪ.
Насчет ГУЯ - я тоже озадачен этой темой, но пока думаю над архитектурой и самим кодом.
Могу подсказать только направление куда копать, и пару либ, большего, увы, не делал:
https://habr.com/post/319106/ - Присматриваюсь к ней, но пока щупать не решаюсь.
https://github.com/wjakob/nanogui
Если пишешь под линукс, попробуй поковырять xlib.
Если кросс платформ - лучшее решение будет опен жл, у нуклеара в примерах есть рендер жл-овский.
> в питоне нет структур
import struct; help(struct)
>>39054
> лучшее решение будет опен жл
> nanogui
> nuklear
Даже не знаю, какой совет хуже. Вот если бы он игру писал - тогда еще норм, но для сервера гуй на опенгл - это что-то запредельное.
Сам посоветую не страдать хуйней и написать гуй на Python/Qt5 (если он каким-то местом в проекте имеется) или C++/Qt5. Можно подумать о Gtk+, но если в требованиях в том числе и винда, то лучше все же Qt.
>но для сервера гуй
Нормальные люди делают гуй на хтмл, серверу послушать лишний порт не тяжело
Тоже хороший вариант.
>import struct; help(struct)
Лол, загуглил "python структуры" а там давай втирать, что как таковых структур в питоне нет и что они не соответствуют структурам из Си; потом загуглил "uint8_t python", пишут что нет такого типа данных готового.
>Нормальные люди делают гуй на хтмл
Слишком много гемора с освоением, для хоббийного проекта то.
Нет.
Он просто перегрузил слово операция.
Умножение на ноль тоже сводится к компайл-тайм константе, но умножение от этого оператором быть не перестает. Алсо, в C99 и выше есть VLA, для которых sizeof работает не в компайл-тайм:
int foo = scanf("%d");
int bar[foo];
printf("run-time sizeof: %zu\n", sizeof(bar));
Сначала архитектура написана, а что дальше я не понимаю.
SJLJ/SEH - это поддерживаемые модели исключений крестов (в Си в принципе нету). POSIX/Win32 - поддерживаемые модели потоков. Если собираешься линковаться с чужими длл (особенно с MSVC-шными) - выбирай win32.
к&r неплохой перевод, я вообще тупо эту книгу выдрачивал до просветления, уникальная книга, плотность информации в ней зашкаливает
есть еще недооцененная книга кернигана - "unix, программиное окружение", я бы посоветовал ее даже тем кто не планирует кодить под линуксы, хорошенько промывает мозг
Спасибо большое.
Алсо, вот я у себя дома нашел книжку Демидович Е.Ь "Основы алгоритмизации и программирования" 2 издание.2008
Си сильно поменялся с 2008 года?
Прост с моника и телефона сейчас не кайф читать(я так питон учил, и подустал) А тут такая книга дома, могу подучить с бумаги.
Еще есть книжка дома С/C++ Т.А. Павловская 2007
https://habr.com/post/244281/
Посмотрел - подходит.
И ,похоже, графики кривых отрисовывать тоже можно.
Блядь, но с жабо-скриптами я вобще не знаком. Короче, кругом жопа.
> С/C++ Т.А. Павловская 2007
У меня валяется 2003 кажись, эта книга сделает тебя крестовиком, а не сишником.
А, ну Rust, конечно, ещё C# может заменить.
Так, что по-твоему системное?
И почему тогда был назван Rust, а не C++?
C++ отличная замена C, ты не теряешь скиллов С, просто по сути получаешь более хороший компилятор.
Писец, лучше не обсуждать языки вообще никогда и нигде.
А зачем? В Си и так все неплохо
>Почему в шапке нет Steven C. Mcconnell Code Complete ?
Потому что она не про конкретный язык, а про программирование в целом.
>>40414
> Кресты проигрывают в скорости си
Нет. Если предположить, что и на Си, и на C++ пишет разбирающийся в языке человек, Си проигрывает крестам по скорости (из-за шаблонов, из-за constexpr, из-за тех вещей, которые сложно выразить лаконичным синтаксисом Си, но можно крестовыми заклинаниями). Но стать человеком, разбирающимся в Си - гораздо проще, поэтому обычно сишный код обгоняет крестовый.
Все твои шаблоны и т.д. это скорость написания кода, а не скорость его работы.
И на си пишутся обычно операционные системы и драйверы, где хуй знает вообще можно применить шаблоны, в таком широком смысле.тем более я говорил про линукс, там крестам вообще нет места, под Винду и на крестах пишут, ето так
kill(-1) убивает все запущенные процессы? Это прямо как rm -rf /
Просто kill(-1, SIGKILL) грохнуло мне все запущенные процессы.
> Все твои шаблоны и т.д. это скорость написания кода, а не скорость его работы.
Нет. Например, на Си ты вместо шаблонов сделаешь void *, и компилятор не сможет это отптимизировать так же качественно. И вообще, в целом, в сишном коде у тебя будет больше ненужных дереференсов указателей и вызовов функций. Но ты, конечно, можешь все разворачивать, приправляя мешаниной дефайнов, превращая код в абсолютно нечитаемый.
бляя загугли electron или photon
даже однорукая макака без мозга сможет в этоговно
откуда вы лезете уёбки7
Никак, в С нет потоков.
Модель памяти в С++ рассматривается в книге Энтони Уильямс "Параллельное программирование на C++ в действии"
Во-первых, я другой анон, так что я не знаб кому, что ты говорил. Во-вторых, ссылка на описание ссылок С11, а не на кресты.
Ссылку не открывай
@
Дебаты разводи
Ну тогда и тебе добра.
У меня головная боль от переизбытка информации.
Я прост скачал книгу http://1.maintracker.org/forum/viewtopic.php?t=452291 и планирую прочитать её. Она хооршая? Она дсат мне работу и научит делать прилоежния на смартфоны и прилоежния/игры?
Тебе в крестотред. И нет, для смартфонов одного C++ маловато. Можно, но маловато - нужна еще и Java.
И что делать тгда? ИСкать версию 2010+?
просто уже зебался каждый день оухевать от кол-ва книг, курсов, видео на тубе, хочу просто сесть и начать читать что-нибудь, а эта книга вроде очень фундаметнальная и аж на 700 стр...
400 из них это база, которую знают даже дети, остальные 300 устаревшее легаси говно, которое никто не использует.
https://www.opennet.ru/opennews/art.shtml?num=49059
В GNU C Library добавили поддержку потоков ISO C (threads.h), определённых в спецификации ISO/IEC 9899:2011). Для использования потоков в приложениях необходимо связывание с libpthread.
Там немного есть:
Р. Лав - Linux. Системное программирование
Иванов Н.Н. - Программирование в Linux
Есть стандартная либа, в ней определен стандарт на потоки, а реализации - удивительное дело, отличаются для разных ОС.
А что тебе еще надо? В стандарт добавили потоки, а дальше на каждой ОС своя реализация. На прыщах glibc, на *bsd libc и т.д.
pthreads nice, OpenMP - блевотина в плане решёточного синтаксиса.
Вот <thread> топчик, он везде реализован, и у него в какой-то степени pthread-like синтаксис.
>>40392
>Так, что по-твоему системное?
Это значит, что ты можешь выбросить рантайм и стандартную библиотеку и с помощью одного лишь компилятора под таргет-архитектуру чото сделать. Если без рантайма и стандартной библиотеки обломинго - значит не системное.
Ыхы, он подразумевает, что baremetal - не рантайм.
Хотя если дословно, рантайм - это рантайм и есть.
>рантайм - это рантайм и есть
Какое пидерское словечко, это же стандартные либы которые свободно доступны в юнихах и по пидерски в шиндовсе.
Умник какой.
А это теперь уже стало программированием на чистом железе? Я как-то в универе на маняторе цвет пикселя напрямую поменял, я теперь тоже baremetal программист?
ну и дибилизм пиздец
> Какая от этого практическая польза
В одном потоке рабоать с пользовательским вводом и сетью, во втором рисовать с фиксированным фреймрейтом, еще в трех - считать что-то тяжелое. Алсо, с блокирующим IO в отдельном потоке работать гораздо проще, чем с неблокирующим IO со всякими poll и select в основном потоке.
>Алсо, с блокирующим IO в отдельном потоке работать гораздо проще, чем с неблокирующим IO со всякими poll и select в основном потоке.
Это где так?
Везде. Оба подхода - обычное дело и в Linux, и в Windows.
>Вы тут смотрю потоки обсуждаете
Если писать что-то сложнее хеллоуворлда, то они обязательно понадобятся.
> Вообще претензии к стандартной библиотеке языка, 99 юзкейсов которого - это велосипедить реализации библиотек и системных вызовов с нуля
Зачем велосипедить, если есть уже готовые сторонние библиотеки? Или ты хочешь, чтобы стандартная разжирела?
>Вы тут смотрю потоки обсуждаете, но что это дает? Какая от этого практическая польза?
В 21 веке процессоры многоядерные. Производительность на ядро растет всё меньше и меньше. Писать однопоточный код уже признано однозначным зашкваром. Тот кто его пишет считается дремучей лалкой из времен pentium4/athlonxp
>Зачем велосипедить, если есть уже готовые сторонние библиотеки?
Потому что они завязаны на конкретную OS. А OS еще нет. Есть только голая железяка и конпелятор, умеющий в неё.
>Я как-то в универе на маняторе цвет пикселя напрямую поменял, я теперь тоже baremetal программист?
Нет. Ты хуй и паскаль.
У тебя каргокульт многопоточности, пососи сисю
Что за хуйня? Читаю Мозга Кернигана с Денисом, а там блядь ФУНКЦИИ БЕЗ ТИПА, т.е. что то типа
foo (x,y) {пошла моча;}
Что за троллинг? Я прост с крестов начинаю, а тут такие ужасы...
>неявный int
Ух блядь. И в параметрах функции так же?
А то я уже думал может файл книги битый или какая то опечатка или что угодно.
Чёт орнул. А допустимость конструкции auto int тебя не удивит?
Оператор return. Не могу понять немного суть использования (не в функции). return 0 - типа успешное завершение программы. А вот допустим видел кусок кода, в начале данные на инпут от юзера идут и код чекает удовлетворяют ли они условиям и идёт 3 штуки if в конце которых return 1; return 2; return 3 соответственно. Вот этот момент кто-нибудь может объяснить на пальцах?
> The C Programming Language
В технических книгах сложный английский?
Есть смысл пробовать читать в оригинале, если с английским знаком только по интернетам, но никогда его не учил?
Если прога ничего не должна возвращать то и return не нужен.
Читай мануал дальше. Там всё объяснено.
Прога завершается и return высирается ОС, а дальше уже она сама решает что с этим говном делать. Читай как и зачем в Юниксах пайпы делают, это из этой оперы.
>>42640 - продолжение
Это никакой не авто, это умолчание для одного типа.
Ты, верно, слишком молод, раз орёшь по таким мелочам
// ensure proper usage
if (argc != 2)
{
printf("Usage: fifteen d\n");
return 1;
}
// ensure valid dimensions
d = atoi(argv[1]);
if (d < DIM_MIN || d > DIM_MAX)
{
printf("Board must be between %i x %i and %i x %i, inclusive.\n",
DIM_MIN, DIM_MIN, DIM_MAX, DIM_MAX);
return 2;
}
// open log
FILE* file = fopen("log.txt", "w");
if (file == NULL)
{
return 3;
}
Вот сам код
Тебе же сказали, почитай стандартные значения кодов возврата.
Зачем ты код принёс.и на будущее заливай код в идеон или сорт оф, а в тред ссылку
У юзера винды есть Рихтер и есть соответствующая глава в MSDN. После этого достаточно лишь прочитать описание threads.h в стандарте.
>>42408
> В 21 веке процессоры многоядерные
> Писать однопоточный код уже признано однозначным зашкваром
Вот только процессов тоже больше одного. Писать многопоточный код без необходимости - это извращение уровня FizzBuzzEnterpriseEdition.
>>42566
Да, раньше в языке было еще больше способов стрелять себе в ногу с переподвыверта.
>>42627
0 - это EXIT_SUCCESS. Все остальное на твое усмотрение. Можешь обойтись лишь EXIT_SUCCESS/EXIT_FAILURE, можешь возвращать номер стадии, на которой произошла ошибка (как в коде, о котором ты говоришь). Или, например, в MS-DOS была команда choice, использовалась для написания батников - она предлагала нажать одну из заданных в аргументах клавиш и возвращала ее порядковый номер. Так тоже можно.
Мне нужно чтобы я запустил прогу, а дебаггер показывал, какая часть исходного кода выполняется. Типа, нажал кнопку в проге, и он тут же подсветил участок кода. Чтобы можно было посмотреть какие переменные в памяти, чтобы можно было останавливать выполнение в произвольном месте и например отматывать назад или выполнять код по шагам/тактам.
Работаю на винде. Но в принципе, если есть такое только под линукс, то ок. Хорошо бы чтобы он был опенсорсный.
Спасибо, что-то вроде проясняется после твоего ответа. А можешь объяснить FizzBuzzEnterpriseEdition это что такое? ФиззБазз что такое знаю, а всё в целом что подразумевает?
И этот неявный инт - это архаика и теперь так писать дурной тон, правильно?
В любой иде такое есть, в той же студии.
> А можешь объяснить FizzBuzzEnterpriseEdition это что такое?
Погугли.
> И этот неявный инт - это архаика и теперь так писать дурной тон, правильно?
Правильно. В С99 и выше уже запрещено.
>>43132
Ты не поверишь, но gdb. Собираешь с -ggdb. Кроме того, на винде Visual Studio, Pelles C и windbg все умеют в source-level отладку.
> и например отматывать назад
Нинужно.
Вот пример из книги https://ideone.com/oJaSnL объявление структуры и объединения у меня вызвало подозрение, попробовал запустить, офк ничего не пошло, пока не убрал булы, размер структуры с ними 16 , без них 4, хули так много? хотя размер була 1, я так понял что в структуре у меня засели int на 4 позиции bool 4 опять инт и опять бул. Это так?
Так вот, такую же мешанину из short, int и bool делать нельзя? Что происходит с битовыми полями при смешивании типов, почему по ссылке все работает норм?
> Так вот, такую же мешанину из short, int и bool делать нельзя?
Делать мешанину можно, но битовые поля не ок с точки зрения производительности. Все это стоило сделать настоящими bool и int, экономия тут ни к чему.
> Что происходит с битовыми полями при смешивании типов
Ничего не происходит, тип элемента битового поля может быть bool или int. Единственное, чего нельзя - указывать битов больше, чем в реальных singed/unsigned int или bool.
> почему по ссылке все работает норм?
Потому что и должно работать норм.
> офк ничего не пошло, пока не убрал булы
Возможно, у тебя компилятор не умеет в C99, возможно, ты просто -std=c99 или -std=c11 забыл. Тащи сообщение об ошибке.
c11 включен, даже варнингов нет.
Вот мой выхлоп:
Исходные настройки окна:
Окно непрозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.
Настройки окна с использованием представления unsigned short:
Окно непрозрачно.
Цвет фона черный.
Рамка не отображается.
Стиль рамки сплошной.
Цвет рамки черный.
комбинация битов 00000000000000000000000000000001
Измененные настройки окна:
Окно прозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.
Настройки окна с использованием представления unsigned short:
Окно прозрачно.
Цвет фона голубой.
Рамка не отображается.
Стиль рамки пунктирный.
Цвет рамки красный.
Комбинация битов 00000000000000000001001000001100
c11 включен, даже варнингов нет.
Вот мой выхлоп:
Исходные настройки окна:
Окно непрозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.
Настройки окна с использованием представления unsigned short:
Окно непрозрачно.
Цвет фона черный.
Рамка не отображается.
Стиль рамки сплошной.
Цвет рамки черный.
комбинация битов 00000000000000000000000000000001
Измененные настройки окна:
Окно прозрачно.
Цвет фона желтый.
Рамка отображается.
Цвет рамки зеленый.
Стиль рамки штриховой.
Настройки окна с использованием представления unsigned short:
Окно прозрачно.
Цвет фона голубой.
Рамка не отображается.
Стиль рамки пунктирный.
Цвет рамки красный.
Комбинация битов 00000000000000000001001000001100
Во, теперь понял, в чем твоя проблема. Дело в том, что GCC "оптимизирует" битфилды таким образом, что члены разных типов выравниваются на границу инта. Получается бит для bool + 31 бит выравнивания, 7 бит для цвета и безымянного члена + 25 бит выравнивания, 1+31 для bool и выравнивания и т. д. Всего 4 инта, т.е., 16 байтов. Скажи -mno-ms-bitfields или собирай шлангом, там этот ключ по умолчанию, а для GCC-шного поведения нужно специально попросить -mms-bitfields.
>собирай шлангом, там этот ключ по умолчанию
я им и собирал, так а вообще это выравнивание битовых полей в стандарте не прописано?
> я им и собирал
Мда, ну значит у меня просто старый шланг.
> а вообще это выравнивание битовых полей в стандарте не прописано?
В стандарте всегда крайне расплывчатые формулировки всего, что выходит за пределы абстрактной машины. Код в Прате непортабелен, потому что делает предположения относительно раскладки битфилдов: компилятор может выделить под элемент char, а может и int, может начать заполнение со старшего бита, а может с младшего. Но то конкретное поведение, на которое ты напоролся - стандарту противоречит. Даже если компилятор выделит всего байт для первого bool, в байте останется еще достаточно места, чтобы туда влезли fill_color и анонимный член, и в этом случае компилятор обязан их туда положить.
ясно, спасибо
Гондон, съеби.
Даже, если пофиксить эту ошибку, у него не будет это нормально работать. У него не будет считаться последнее слово в файле, но с этой ошибкой пусть он уже сам разбирается, она довольно тривиальна.
Но это все равно говнокод и тебе придется этот блок еще раз переделывать, потому-что у тебя не будет считаться последнее слово.
На винде есть dll файлы, а мне бы что нибудь похожее, только кросс платформенное.
Допустим, я написал в таком модуле некие функции, структуры и т.д., в общем модуль с некоей функциональностью.
Потом где-то отдельно, скомпилировал сишный код этого модуля в такую вот библиотеку, и могу ее смело подключать к основной программе, чтобы в ней появилось нужная мне функциональность.
Чтобы почитать по этой теме? Интересует как сам формат таких библиотек, так и механизм компиляции и их подключения.
Интересно было бы взглянуть на какие нибудь уже существующие реализации, если таковые есть.
Хотя я бы предпочел пилить свой велосипед, так интереснее + я в этом гарантированно разберусь.
> а мне бы что нибудь похожее, только кросс платформенное
Оберни dlopen/LoadLibrary, оберни dlsym/GetProcAddress и не выделывайся попусту. Не стоит оно того, особенно если ты кроссплатформенно хочешь, лол.
> Чтобы почитать по этой теме?
John Levine "Linkers and Loaders"
> Интересует как сам формат таких библиотек
Ты же велосипед собрался пилить. Как положишь, так и будет. Тебе понадобится положить: код, данные, имена экспортов-импортов, позиции в коде, куда они указывают (вместе с именами называется "символы"), позиции в коде, которые зависят от адреса, по которому код загружен и способы эти позиции пропатчить (вместе с адресами называется "поправки"). И вот тут ты начинаешь сосать с кроссплатформенностью еще больше, потому что на некоторых архитектурах количество типов поправок исчисляется десятками.
> механизм компиляции
Ну ты такой короч пишешь ld-скрипт или каштомный линкер.
> их подключения
mmap/VirtualAlloc + mprotect/VirtualProtect
Смотрю, а в тырнете пишут, что всякие линухи зануляют страницы сами после использования чтобы приложения не шарились у друг друга в куче.
А где-то пишут, что недостаточно секьюрно/опция в таком-то дистре отключена из-за перформанса.
Короче, кто ведает состоянием page zeroing'а на современных никсах? Когда, где, при каких условиях?
Гугли autotools
Пишешь обычные библиотеки, через autotools делаешь кроссплатформенный configure файл, который потом генерирует makefile под нужную платформу.
Как написан язык си ? На каком языке ? Мб есть сурс код у кого ? Буду благодарен просто интересно, мб в будущем доделаю язык и сделаю нормальный импортинг файлов лол
Ебанутый, С - это как русский, оба языка и не могут быть как то написаны в стиле программы, есть компиляторы С, вот их много, из маленьких которые можно смотреть выбирай PCC или TCC, ссылку на последний тебе дали.
Просто иди нахуй.
Моя реализация работает криво.
Он вроде не совсем про то. Он про то, должно ли ядро обнулять страницы перед передачей их чужому процессу. Должно, обнуляет.
Он же изначально просто затереть хотел память.
>Должно, обнуляет.
Можно скомпилировать чтоб не обнуляло. вроде есть опция, мне лень искать
А ещё в этой статье не очень изящное решение.
в gcc нет memset_s, но можно сделать указатель на функцию с сигнатурой мемсет, но только у указателя на память volatile добавить. И вызывать мемсет_с
Напоминаю, что это смешная шутка, но её надо шутить к крестотреде, когда им networking ещё к файловой системе добавят
Не, я не шучу. Просто тупой. На Си не нужен менеджер, потому что всё пишут с нуля, не считая стандартных библиотек?
Ответа так и нет. Я не про пакетный менеджер для себя, а про базу готовых библиотек.
Качай линух, ставь себе что хочешь любым пакетным менеджером.
Писец, нюфаги поехали из-за сраных Го с Питоном и интересуются , почему в языке нет пакменов. Я в шоке.
Ты опять не понял. При чём здесь пакетный менеджер линукса? Это не централизованное хранилище библиотек для Си. Да, с помощью него можно управлять исходниками, формировать свои пакеты, но это всё нужно делать самому. А я про централизованное хранилище, чтобы ставить и обновлять библиотеки, а не копировать их самому откуда-то вручную и самому следить за версиями.
Попробую пояснить в другом ключе.
Библиотеки для нас - не перчатки, мы их не меняем по сто раз в неделю, а вся работа с библиотекой не сводится для нас в import os.
Так яснее?
apt-get
Тредом ошибся?
uint8_t ret = __builtin_return_address(0);
ret=(uint32_t)(ret-4)+ret;
return ret;
}
int main(){
printf("%p %p\n",call_me(),(void*)call_me);
return 0;
}
typedef void (*fnptr)();
fnptr foo(void) {
return (fnptr)foo;
}
Я хочу именно возвращаемый тип тот же.
Сам язык не написан, он существует в голове у людей. Другой анон привел аналогию, си это как русский. Ты можешь написать программу которая умеет писать на Си, читать Си, исполнять Си, но ты не можешь написать Си.
То есть можно написать Си на человеческом, то есть типа доки написать, стандарты там, но это не совсем Си.
Может быть в gcc ключ есть какой?
> в gcc ключ есть
Почему он такой странный?
-I и без пробела указывать путь?
Можно как-то проще? Если положить в одну директорию с gcc.exe, то пойдет?
Какую стороннюю библиотеку, для начала?
Проще скинуть в корневой каталог main.c и подключить: в самом .c файле (если прога только из него и состоит) или в файле-заголовке .h.
Должно само подтянуться без всяких параметров.
cs50.h
> Проще скинуть в корневой каталог main.c и подключить: в самом .c файле
Пробовал, не получилось.
>cs50.h
https://github.com/cs50/libcs50
Должно помочь добавление параметра -lcs50 к линкеру.
Чтобы не возиться с путями - пусть лежит там же - в корне проекта.
https://cs50.stackexchange.com/questions/7291/how-do-i-install-the-cs50-library-to-my-local-os
Попробуй ещё параметр -lm добавить.
> Note the use of quotes instead of angled brackets.
Сработало, но теперь это:
> undefined reference to `GetString'
> collect2.exe: error: ld returned 1 exit status
:-)
>Это не централизованное хранилище библиотек для Си.
Репы линуксовых дистров централизованные. Там могут храниться библиотеки не только для одного языка программирования, но это сишникам не мешает.
Твоё недоумение понятно. Это когда ты под писи на линуксе, например, пишешь у тебя printf в любом случае выводит текст, даже если ты перенос строки (\n) не поставил в конце и читать о таких вещах в книге крайне удивительно, потому что такое поведение воспринимается даже совсем новчиками либо как нечто нелогичное, либо как какой-то атавизм, тем более после того, как выясняется, что и без переноса строки всё прекрасно выводится. А я вот однако умудрился столкнуться с этой хуйнёй когда реализовал weak-linked функции _read и _write (через которые работает io), чтобы сделать маленький интерактивный шелл для микроконтроллера по uart'у. И тогда поведение printf'а и всяких putchar меня удивило, потому что я через них выводил строчки начиная с символа новой строки, а не заканчивая им, то есть как printf("\nstring"), а не printf("string\n") - в конце концов нужно же было как-то сделать вывод приглашения шелла, например. В результате строка начинавшаяся с символа новой строки выводилась только после того, как выполнялась строчка кода, выводящая другую строку. В тексте на скриншотах объясняют природу этого феномена через разъяснение механики работы ввода-вывода - наличия буфера.
>>31686
roll
С -I указываешь путь к директории с заголовочниками либы, с -L - путь к директории, где лежиь либа (libимя.a), c -lимя поключаешь библиотеку (или -lимя.a, если имя не соответствует стандарту). Класть свое говно в директории установленного гцц категорически не рекомендуется. Чтобы не писать каждый раз все это руками, делаешь мэйкфайл.
>>45071
> Как получить список запущенных процессов?
Прогулкой по procfs (/proc).
>>45086
Нинужно. Переход с одной версии либы на другую должен быть взвешенным и осознанным решением.
>Прогулкой по 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]
В винде есть Toolhelp-функции и NtQuerySystemInformation в API, есть dbghelp.dll, можно даже парсить PEB, если нужна дополнительная информация о процессах. Очевидно, что кроссплатформенно такие вещи не делаются.
> procfs is gradually becoming phased out in FreeBSD
Сочувствую.
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, как так то блять?
Покажи командную строку, как собираешь; убери ключевое слово static из .h - единственные static-функции, которые имеет смысл класть в .h - это static inline. Ну и скорее всего, ты при сборке указываешь один .c файл, но не указываешь второй.
Ладно, я еблан, надо было в сублайме изменить параметры компиляции или мейкфайлом делать.
Будут ли косяки если я буду включать все сурсы в параметре компилятора? даже не относящиеся к программе, компилятор их заигнорит?
> Будут ли косяки если я буду включать все сурсы в параметре компилятора?
Пока учишь язык, обо что-нибудь обязательно споткнешься, хотя качественный код с правильно расставленными статиками для функций и переменных от такого ломаться не должен.
Лучше просто сделай мэйкфайл, саблайм в них отлично может.
и почему компилятор ругается когда стоит статик в заголовочном?
Box.h:26:12: warning: unused function 'checkDepth' [-Wunused-function]
> а почему все ровно не могу обращаться к чек функциям
Значит не убрал статики, не перекомпилировал box.c или еще что-то, нам-то откуда знать, что ты там написал и как собираешь?
>>45239
> Box.h:26:12: warning: unused function 'checkDepth' [-Wunused-function]
Потому что в main.c ты не используешь эту функцию, а объявлена она как статическая, т.е., static говорит, что функция существует только в данном файле. А если она "существует" в main.c, но не используется, то нахуй она тебе нужна?
Как сделать правильно, а не как в статье: если checkXXX не нужны вне box.c, удаляешь их объявления из box.h нахуй и кладешь их в начало box.c. Или удаляешь объявления вообще и кладешь определения (тела) в начало box.с, добавляя к ним static (часто именно так и делают, если нет перекрестных зависимостей между функциями). Если check нужны вне box.c, тогда просто удаляешь ключевые слова static из box.h, и функции станут доступны из любого файла.
Turbo C++ Version 3.00
https://pastebin.com/8AD21GEP
Turbo Link 5.0
Error: Undefined symbol _PRINTF in module MAIN.CPP
Компилирую:
TC\TCC.EXE -ID:\TEST\INCLUDE -LD:\TEST\LIB -c -oMAIN.OBJ -ml MAIN.CPP
TC\TCC.EXE -ID:\TEST\INCLUDE -LD:\TEST\LIB -c -oTEST.OBJ -ml TEST.CPP
TC\TLINK.EXE -i TEST.OBJ MAIN.OBJ, MAIN.EXE
В чём может быть проблема?
функция не может модифицировать переменные в вызывающей функции
Но к примеру тут https://ideone.com/f4VZYD она же модифицирует. Или я чего то не понимаю?
Про Doxygen вычитал:
Doxygen генерирует документацию на основе набора исходных текстов и также может быть настроен для извлечения структуры программы из недокументированных исходных кодов. Возможно составление графов зависимостей программных объектов, диаграмм классов и исходных кодов с гиперссылками.
Есть ли еще инструменты с таким функционалом?
Ананасы, а как используя аргумент exceptfds (четвертый аргумент) в системном вызове select() получить собственно тип исключения? Это вообще возможно или нужно всё переделать на poll() и смотреть на возвращаемые биты в revents структуры дескриптора struct pollfd?
Здесь функция модифицирует память, на которую указывает переменная, а не сам указатель (который собственно был передан функции).
Но в общем твое непонимание понятно: в книге имеется в виду, что в вызываемую функцию передаются копии параметров. Т.е. передавая в функцию указатель на память, вызываемая функция может использовать этот указатель как угодно, в том числе модифицировать память, на которую он указывает, но вот само значение указателя (т.е. адрес масива) остается таким же в вызывающей функции, что бы ты не делал.
Вот блять, спасибо
Анонче, пихаем шорт или что том у нас двухбайное в чар, какая половина будет в чаре? Старшая или младшя?
Я слишком тупой чтобы обясните мне в бинарном коде.
Младшая. А чего ты в модуле понять не можешь? Это просто такой способ сказать "старшие биты выбрасываются". Представим, что у тебя не двоичные разряды, а десятичные, и у тебя есть 12345678, из которого тебе надо 4 разряда - старшие разряды ты отбрасываешь. Можешь это выразить как: 12345678 % 104 = 12345678 % 10000 = 5678. То же самое с битами: есть 16-битное xxxxxxxxyyyyyyyy, тебе нужно впихнуть его в 8 бит, и ты выбрасываешь старшие разряды. Можешь это записать как xxxxxxxxyyyyyyyy % 28 = xxxxxxxxyyyyyyyy % 256 = yyyyyyyy.
>старшие биты выбрасываются
Вот оно.
Не ну ахуеть, вот деление по модулю нахуй понятнее да. Шутники блядь.
Без него жизни нет
Наоборот сдвиги и маска - это лайфхаки для деления и остатка для частного случая в виде степеней двойки.
Так компилятор все равно деление сдвигами и масками делает.
Нет, там столько же сишного кода в процентах.
я чето не о том подумал и про порядок вычисления написал.
Куда бы ты не воткнул 5/9 в инте - компилятор рассчитает эту константу во время компиляции и воткнет 0. Что в начале выражения, что в конце
Во втором примере, кстати, они оставили fahr в int.
Инт целое, флоат с плавающей точкой. 5 разделив на 9 ты не получаешь целое. Ну и уж если совсем доебаться, то константой а заодно и мелкой оптимизацией запись float fahr = 0x3f000000; лучше оставить, а коммент добавить что это за константа.
> Упражнение 1.6. Проверьте, что выражение getchar () ! = EOF действительно равно
1 или 0.
Как? У меня только 1 выводит.
Упражнение 1.7. Напишите программу для вывода значения константы EOF.
Как? У меня -1 получается.
>>47343
> 5 разделив на 9 ты не получаешь целое
Согласен, поэтому и нужно celsius в float, а почему fahr в int не оставили?
Всё ещё не понимаю, почему они двум переменным сменили тип на float.
Изменится, тогда всё выглядит няшнее, если смотреть на типы. Они только в одной строчке получаются разные, а в остальных одинаковые.
Если под виндой сидишь, то ctrl + z, если под линуксом - Ctrl+D. Либо ещё перенаправление потока ввода с фала можно сделать и по итогу 0 выдаст.
> С float будет меньше преобразований int/float на каждом шаге цикла.
Наоборот ведь, смотри маленькие синие буковки.
Я поэтому и задал вопрос.
В глаза ебусь. В общем, я думал, что там вcему float выставили: в том числе и lower/upper/step.
roll.
А то, и по ФОРТРАНУ.
>VLA
> while we continue to work to remove all VLAs in the kernel: of the ~115 cases found in v4.16, after the v4.19 merge window we should be down to about 13 remaining, most of them in crypto code, all of which have patches under review
https://www.phoronix.com/scan.php?page=news_item&px=Linux-4.19-STACKLEAK-GCC
Но почему
по че му?
Если нет, то как вы в таком случае поступаете, тупо меняете локаль на англоязычную?
> Но почему
Потому что ты заранее знаешь, сколько памяти на стеке ты можешь позволить себе выделить (и тогда просто выделяешь массив фиксированного размера), либо ты не знаешь, поэтому не ограничиваешь максимальный размер массива, рано или поздно пытаешься выделить много и получаешь переполнение стека. Вывод: VLA нинужны.
>>48323
> готовые функции strtod() и atof(), которые не зависят от локали
Есть. strtod() и atof(). При старте у тебя локаль "C", где разделитель - точка. Если меняешь локаль и не хочешь локальные разделители (или файл парсишь, например) - выставь LC_NUMERIC в "C", потом вернешь.
Как парсить простой ini файл?
[SectionName]
keyName=value
…
[SectionName]
keyName=value
…
и т.д.
Читаешь построчно, опционально убираешь из начала и конца прочитанной строки все isspace(). Если строчка пуста или начинается с ; - пропускаешь. Если строчка начинается с [ - читаешь и запоминаешь имя текущей секции, проверяешь, что после ] нет мусора. Иначе ищешь первый =, читаешь до = имя параметра, после - значение. Что ты дальше с этим будешь делать - дело твое. Можешь в словарик сложить, можешь сразу применять, можешь на каждый ini_get("section", "key") парсить заново в поисках сначала нужной секции, а потом нужного параметра в секции.
твой кэп
Лол, это если на жс писать, где каждую неделю новый фреймворк, а для Си и 35 норм.
>в C99 и выше есть VLA
Про "и выше" надо бы поаккуратнее.
> Variable length arrays are a conditional feature that implementations need not support; see 6.10.8.3.)
— https://port70.net/~nsz/c/c11/n1570.html#6.7.6.2p4
По факту оно есть. Так же как и типы из stdint.h, например, которые тоже optional.
> Упражнение 1.9. Напишите программу для копирования входного потока в выходной с
заменой каждой строки, состоящей из одного или нескольких пробелов, одним пробелом.
https://pastebin.com/0eEVzG3k
> Упражнение 1.10. Напишите программу для копирования входного потока в выходной с заменой знаков табуляции на \t, символов возврата назад (Backspace) на \b, а обратных косых черт — на \ \. Это сделает табуляции и символы возврата легко читаемыми в потоке.
https://pastebin.com/iLgcxjF5
> Пробелы.
Нет, неправильно. Имеется в виду, что для файла типа:
foo
...
...bar
(точки - пробелы) ты должен вывести:
foo
.
...bar
А та программа, что написал ты, абсолютно ничего не делает. Вторая вроде ок.
Считаешь пробелы, пока не встретишь не-пробел. Если встретил конец строки - выводишь один пробел и конец строки. Если встретил что-то еще - выводишь столько пробелов, сколько насчитал, выводишь встреченный символ, выводишь символы до конца строки включительно. Идешь на следующую итерацию.
Посмотрел парочку решений отсюда:
https://clc-wiki.net/wiki/K&R2_solutions:Chapter_1:Exercise_9
Они немного другое делают, ведь у них получается вместо
> foo
> .
> ...bar
foo
.
.bar
Ну там не line, а string, так что это, видимо, переводопроблемы. Требуется схлапывать последовательности из нескольких пробелов в один: foo...............bar -> foo.bar. В целом суть та же, просто чуть меньше условий.
>типы из 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 мегабайт чисел, это это уже 10 гигов.
Можно каким-то образом реализовать расшаренную область памяти? Или это достигается только инжектом с чтением памяти чужого процесса?
Собственно, мне даже за 100 мегабайт по голове дали, я придумал, как оптимизировать это в несколько раз, но всё равно дублировать данные между процессами не хочется.
Алсо, пока что не придумал, как эти данные перенести собственно в код. Сейчас они прямо там и вычисляются, но если их билдить с экзешником, то это 100 мегабайт экзешник получается - пиздец какой-то.
> Можно каким-то образом реализовать расшаренную область памяти
Можно. mmap с MAP_SHARED, shm_open(), все дела. А вообще, ты уверен, что тебе нужны отдельные процессы, а не потоки?
300к коллизий на миллион элементов, это нормальный показатель для хеш функции?
>Можно. mmap с MAP_SHARED, shm_open(), все дела.
Получится иметь во всех процессах указатели на переменные в этой памяти? Это вот прям так работает из коробки? При этом все процессы всегда будут читать не_с_диска?
>А вообще, ты уверен, что тебе нужны отдельные процессы, а не потоки?
Да, хотя я и не уверен, почему именно. Я пишу статическую либу, а параллелиться это будет на уровень выше, там другие люди решения принимают.
Да, забыл сказать, что скорость очень критична.
Ёпта, есть ещё такая штука как COW.
По сути, даже если ты не будешь явно задавать shared-область, ядро навряд ли будет делать дубликаты, пока ты не испачкаешь страницы.
Да, оно реально будет работать так, как тебе тот анон показал.
Такого быть не может.
Ну очевидно же, что у идеальной функции будет 1 коллизия на 2n элементов, где n - количество бит в хэше.
Набросал прототип. Да, действительно всё работает так, как мне надо. Спасибо.
Правда, shm_open() по имени как-то смутил, несерьезно что ли это, мало ли какой конфликт.
Алсо, насколько неудобно будет портировать это под винду? Может и не понадобится, но я не уверен, что смогу обойтись никсами.
> мало ли какой конфликт
mkstemp()
> насколько неудобно будет портировать это под винду
Это базовая возможность всех более-менее полноценных ОС. CreateFileMapping (именованный)/MapViewOfFile.
Тем не менее, криптографы обычно ожидают коллизию уже среди 2^(n/2) элементов (парадокс о задаче о днях рождения).
К сожалению, хедеры в плюсы как раз из Си и пришли. У современных посонов модули, а мы все еще текст препроцессором копипастим.
https://ideone.com/ZtKovP
>У современных посонов модули
Почему эти крестоносцы модули не накатят? Они же все из себя такие ПРОДВИНУТЫЕ
Ну вот ты вызвал свою функцию, исполнил два нопа, а дальше? А дальше, после нопов, у тебя в выделенной тобой странице памяти идут нули. А нули эти - add[rax],al. А в rax тебя что? Говно какое-нибудь. Вот оно и падает. Что оно должно делать дальше? Как оно вернется, чтобы выполнять вот эти твои виртуалфри? Алсо, тебе в >>1216107 (OP), а не сюда.
>>52563
Они почти накатили уже, и они как-то буэ. Как бы нам тоже не завезли под шумок в C21.
>исполнил два нопа, а дальше?
Я же выделил память только под два байта, то есть sizeof(code). Почему оно исполняется дальше?
Можно для танкиста, кто эти современные посоны, что у них за модули и чем плоха препроцессорная подстановка?
Потому что процессор исполняет инструкции одну за другой (если они не какой-то сорт бранча), и ему похуй, сколько ты там скопировал. А выделить меньше, чем страницу ты тоже не можешь. Вот и получается, у тебя либо access violation, потому что нули - это mov, пишущий куда-то не туда, либо access violation, потому что после страницы ничего нету. В общем, прочитай про ассемблер что-нибудь, про вызов функций, все такое.
Подстановка всем плоха, она замедляет компиляцию и затрудняет автоматический анализ исходников. Заодно хедеры заставляют тебя при изменении сигнатуры функции править ее в двух местах. В лучшем мире компилятор автоматически брал бы сигнатуру из объектника, если мы распространяем собранные либы, либо из исходника, если исходники доступны.
Современные посоны - это программисты на скриптовых языках, где такого говна нет, а скоро и программисты на крестах: https://medium.com/@wrongway4you/brief-article-on-c-modules-f58287a6c64 (первый результат из гугла, ты мог бы и сам найти!).
>править ее в двух местах
ой бля, как тяжело, а давайте запилим йобу поверх йобы, чтобы оно само делалось
Ой бля, как просто переносить код на новую архитектуру, давайте продолжим пилить юниксы на ассемблере.
>https://medium.com/@wrongway4you/brief-article-on-c-modules-f58287a6c64
А по запросу какому? С++ modules?
Я правда не догоняю, о чем вообще речь идет.
Короче, это вещь нужная и ее стоит изучить и юзать, так?
Стандарт еще не вышел, можешь пока погодить. Но там уже черновик вылизывают, так что скоро. Опять мы кресты в треде про няшную обсуждаем. Ну что ж такое-то!
>переносить код на новую архитектуру,
Кого ты там переносить собрался? Никогда проблем не было, но тут вкатились смузихлебы
Link-time optimizations. Компилятор генерит аннотированный байткод, а линкер схлапывает все объектники, после чего уже генерит машинный код. Это позволяет выкидывать неиспользуемые функции, инлайнить часто вызываемые функции, даже если они не были объявлены как static inline, мержить функции с одинаковым телом и много чего еще. В гцц включается флагом -flto, в студии это называется link-time code generation и включается -GL.
Примеров в нете чет толком не могу найти, либо очень запутанный код, а я в Си не так давно, перловые регулярки знаю хорошо, но вот въезжание в api libpcre2 дается с очень большим трудом.
Буду благодарен если покажите как char *subject = "test1 test2 test2", с помощью pcre2_substitute, заменить регуляркой "s/(test)2$/\13/"
https://www.pcre.org/current/doc/html/pcre2demo.html
тут вон под конец есть. Какая-то сложная ебола этот PCRE, но, видимо, лучшее, что есть для С.
#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);
}
помимо того, что криво вставил текст
Отделяй операторы пробелом, не делай слишком много инициализаций в одну строчку.
Для бинарной записи открывай файл как '"wb".
Почему у тебя не работает - не разбирался.
ап (спасите, гнуплот кормить нечем)
> pcre2_substitute
Так в томто и дело что pcre2_substitute там в демо нет, поэтому и прошу чтоб анон помог, с простым примером
По виду должно работать. Посмотри, может fopen не сработал. Может, ты вообще не в той папке смотришь?
Возвращает 0, создаётся файл .dat в нужной папке. Сам файл пустой. Гнуплот, логично, ругается. Пишу в Geany на шиндовс 10, компиллятор tdm-gcc
Благодарю. Деградировал малость, исправлюсь.
Смотря что ты имеешь ввиду под "знать математику".
И смотря чем ты собираешься заниматься. Знакомый веб-дизайнер пользуется очень ограниченным набором мат. приёмов и знаний, хватает для фронт и бэк энда. А кто-то, как мой препод в институте, вообще говорит, что если человек не сдал матан - его нельзя подпускать к компу.
>человек не сдал матан - его нельзя подпускать к ЭВМ
Прфиксил в стиле вузовских пердунов не могущих ни в то и не в другое
Это копия, сохраненная 1 октября 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.