Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.Что читать:- Классика от Отцов: http://www.cypress.com/file/56651/download- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.- Годное пособие для гуманитариев: http://web.archive.org/web/20160727235220/http://c.learncodethehardway.org/book/ (автор внезапно захотел денег)- Немного примеров хорошего стиля: 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 помогает читать сложные сишные декларации.Прошлые треды:- №26: https://arhivach.org/thread/315652/- №27: https://arhivach.org/thread/325831/- №28: https://arhivach.org/thread/339326/Шапка: http://piratepad.net/bJ1SdmkZyu
Вкатился. Вопросы по эмбеддед-си здесь задавать?
>>1156415нет
Всё байтоёбите?
>>1156424Всё сагоёбишь?
>>1156415конечно, я почитаю, но отвечать не буду, потому что ничего не знаю.
>>1156422>>1156530Ладно, тогда вопрос по прикладному С:Сейчас у меня есть массив структур с кастомными функциями под микруху для чтения, которым нужно передавать адреса элементов. Вопрос: можно ли этот код который я наиндусил как-то переписать по-человечески с нормальными указателями структуры?Ну и всю структуру затягивать через pgm_block_read я тоже не хочу, потому что потом буду писать код в котором нужно будет затягивать/записывать только одну переменную.Вот описание для функций библиотеки: https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
>>1156547> переписать по-человечески с нормальными указателями структуры?Не совсем понятно, чего ты хочешь. Ты разрешения спрашиваешь? Да, можно. Нет, не особо нужно: под капотом при возврате структуры размером больше, чем влезает в один-два регистра, функции неявно передается указатель на результат, функция его туда пишет, все счастливы. Возможно, для авров компиль более тупой, хуй знает.
>>1156550>Не совсем понятно, чего ты хочешь.Ну я хочу заменить все эти танцы с бубном и инкрементами указателя на что-то вроде ret_test.wind = pgm_read_word(&Profile[time].wind) и так далее, так можно сделать? Какой правильный синтаксис для таких конструкций?
>>1156551тебе не красиво? сделай юнион с char@.
Где прочитать все сдвиги C99 относительно C89?Язык не важен, важна ёмкость изложения.
>>1156629Да хуй там, оказывается можно указывать на сами элементы массива. Жалко только что нету ассемблерного кода для считывания вообще всего блока.
>>1156727Вступление к соответствующему стандарту или справка от Pelles C.
Я невнимателен, или и правда нигде не сказано о том как malloc выравнивает левую границу? Мне два бита нужно, есть вообще какие-то гарантии на этот счёт?
>>1157165> правда нигде не сказано о том как malloc выравнивает левую границуСказано. malloc делает выравнивание так, чтобы оно было достаточным для любого встроенного типа. Для всего остального есть aligned_alloc из C11.> Мне два бита нужноЧо? Тебе бы что-нибудь по архитектуре компов почитать. Минимально адресуемая единица - байт. А на практике, любым маллоком будет выделено не менее sizeof(uintptr_t).
>>1157629>Чо?Мне в указателе, в крайних двух разрядах, необходимо сохранить два флага, в самой переменной, а не в выделяемой памяти я имею в виду.
>>1157905Ты всё-таки почитай как адресуется память и как происходит чтение-запись.
>>1157905тут уже один чувак так делал, в в одном заведении учитесь?по идее гарантий никаких нет. вроде нет соотв. дефайнов на этот счёт. выделяй сразу с запасом. (void@)((uint_ptr)malloc(T + 3) & ~(uint_ptr)3)
>>1157981ой не так. (void@)((uint_ptr)malloc(T + 3) + 3 & ~(uint_ptr)3)
но тогда хранить нужно и настоящий адрес (или смещение). ну понятно - выделяешь ещё sizeof(void@), выравниваешь, вписываешь указатель и смещаешь.у меня кстати по этой теме вопрос, можно как-то сделать обёртку над malloc, но чтобы с тем же именем? или это должна быть поддержка библиотеки, там, альтернативное имя...
>>1157986>можно как-то сделать обёртку над malloc, но чтобы с тем же именемВот тут у мужика что-то вышло, я правда хуй его знает насчёт переносимости.https://habrahabr.ru/company/mailru/blog/281497/>но тогда хранить нужно и настоящий адресТут за два бита битва, а ты целиком адрес хранить предлагаешь.
>>1157993>Вот тут у мужика что-то вышло, я правда хуй его знает насчёт переносимости.хорошая, почитал.>>1157993>Тут за два бита битва, а ты целиком адрес хранить предлагаешь.с другой стороны мы уже выяснили, что освобождать память не надо...
>>1158011Во догонку ещё вроде бы BoehmGc умеет подменять обращения к malloc,А как-то статическую переменную по кратному адресу выровнять можно?
Можно ли как-то реализовать такое?Или только инклюдить через ifndef#define LOH 123#include "../" + LOH + "/file.h"
>>1156306 (OP)родные, покажите реализацию компаратора для типа double, пожалуйста
>>1158374bool AreSame(double a, double b){ return fabs(a - b) < EPSILON;}
>>1158402почему bool а не int?return fabs(a - b) < EPSILON; возвращает + если разность "~0" и - если числа разные, я правильно понял? но ведь компаратор не только говорит разные числа или одинаковые, он еще говорит какое больше
>>1158134#include <stdalign.h> // C11, но есть расширения и для более старых версий стандарта.>>1158137Можно.#define LOH 123#define INCLUDE_CAT(...) INCLUDE_CAT_(__VA_ARGS__)#define INCLUDE_CAT_(...) #__VA_ARGS__// Мы работаем с токенами, поэтому кавычки не нужны, их ставит// INCLUDE_CAT_, а если нужны <> вместо кавычек, то делаем так:// #define INCLUDE_CAT_(...) <__VA_ARGS__>#include INCLUDE_CAT(../LOH/file.h)>>1158442Ну так добей условие-то, в чем проблема-то?double delta = a - b;return (fabs(delta) < EPSILON) ? 0 : (delta < 0) ? -1 : +1;
>>1158603>>1158137Чета я подумал, что оно так может что-нибудь еще в пути к файлу случайно развернуть, если оно совпадет с именем макроса. Например, #define file ERROR оно будет инклудить ../123/ERROR.h, что не есть хорошо. Лучше разворачивать только LOH:#define INCLUDE_BUILD(S) INCLUDE_CAT(../test/S/file.h)#define INCLUDE_CAT(...) #__VA_ARGS__#include INCLUDE_BUILD(LOH)
>>1158603>return (fabs(delta) < EPSILON) ? 0 : (delta < 0) ? -1 : +1;спасибо большое
Ахахах, у вас что, даже нет встроенного сравнения чисел?
>>1159423Ты про spaceshit? Нету. Как ты в него нужный эпсилон передашь? Ах никак, ах авторы компилятора интерпретатора твоего языка лучше тебя знают, какая погрешность у твоих значений?
можно ли обработать SIGTERM?
>>1159459да
День добрый, аноны. Не знаю как более красиво решить задачу:Я делаю выборку из БД и сколько строк она вернет - неизвестно. Проходясь циклом по результату выборки я каждую строку помещаю в структуру, а структуру в массив. Для этого перед каждой выборкой мне приходится сначала выбирать количество записей и на основании его инициализировать массив. То есть приходится делать два запроса, хотя полезные данные возвращает только один из них. Скажите, как мне затолкать результаты выборки в массив заранее не зная его размера?
>>1160046никак, певый скюл запрос с каунт закеширует результат в бд, второй будет бесплатно. ну или читай фиксированными чанками.
>>1160056Хм, ну если на производительности это не скажется то пусть так и остается. Спасибо.
>>1160056>закешируетНе кэш, а буфер. Кэш умеет синхронизироваться.
>>1160046Используй односвязный список, например.
>>1160607Почти двачую. Список чанков, хранящих по n записей - это правильный способ решения проблемы, если производительность критична аж пиздец как. Если нет - realloc тоже сойдет.
Репост из крестового тредаКак в vs2017 (или вообще какими ключами компиляции) смерджить все секции в одну - .text? Я видел в msdn'е статьюю про /merge .rdata=.text, но там не сказано, какой разделитель и как использовать для нескольких секций
>>1162041> но там не сказано, какой разделитель и как использовать для нескольких секцийСделай несколько мержей: /MERGE:.rdata=text /MERGE:.data=.text /MERGE:.bss=.text
>>1160046Наиболее красиво - это выкинуть массив нахуй, и обрабатывать записи по мере поступления. Попробуй, может, получится. В большинстве случаев получается. Тем более что в С++ вроде бэкпортили range из D, так что должно быть несложно. (Не знаю точно так как давно не юзал). Если не получается и по данным надо что-то считать с рандомным доступом, возможно, ты просто хуево знаешь SQL, потому что когда ты его знаешь хорошо, ты выбираешь уже все готовое к применению.
сап двачеры, срачеры, хуячеры, усачеры и тд. Объясните недоразвитой мошонке, мне, в чем разница нахуй между файлами .c и .h. я ебать пишу такой файл с прототипами имен переменных ну да надо переносимость обеспечить сохраняю с расширением .h подключаю через инклуд и все робит, меняю расширение на .c и опять нахуй все робит, ебать думаю я че за хуйня не должно же робить или должно хуй его знает. В общем как я понял .h сделали тупо чтобы не путать с .c файлами походу так. Поправляйте смело меня если не так. Спасибо за внимание нахуй
>>1164019это все еще я, ну вот даже простой пример: подключаю stdio.h вызываю printf все норм, опять же захожу в сборище заголовочных файлов меняю расширение у файла stdio.h на stdio.c в коде тоже все меняю, повторно компилю и опять все норм робит ну и как так
>>1164026а что тебя не устраивает?
>>1164030ну тип так и должно быть? это нормально? то есть если я хочу то могу спокойно писать заголовочные файлы с расширением .c??
>>1164019> в чем разница нахуй между файлами .c и .hДля Си, как языка - ни в чем, можешь хоть .yoba называть все свои файлы. Другие утилиты, например, make, ожидают, что ты назовешь исходник foo.c, чтобы make foo (без Makefile) смог правильно сработать.>>1164036> писать заголовочные файлы с расширением .cМожешь. Некоторые делают кладут static inline функции в отдельные файлы с расширением .inl. В крестах так и вообще разброд и шатания, там есть и .h, и .hpp, и .hxx, и .hh, и даже .h++ раньше было. Ты можешь делать все, что угодно, но старайся быть консистентным и очевидным по мере своих сил.
>>1164060не знаю принято ли тут говорить спасибо, но спасибо.
>>1164019Чисто логическое разделение. Грубо говоря в хэдэрах всё прототипизируется, а в файлах кода реализуется. Можешь проект в лям строк хоть в 1 .c захерачить, но будет ли это удобно? (особенно когда дело коснется препроцессора).Это ты ещё банальным вопросом задался, ведь может быть всякое: .c .h .cc .hh .cpp .hpp .cxx *.hxx и т.д.
>>1164019Заголовки отдельно нужны, чтобы ты мог использовать чужие _скомпилированные_ библиотеки. И чтобы кто-то мог использовать твои.Т.е. в заголовках - "интерфейс", всё, что тебе нужно, чтобы использовать библиотеку. Сами исходники при этом - не нужны.Это как interface в джаве, примерно.Например, ты можешь взять чужую коммерческую библиотеку, на которую исходников тебе в принципе не дадут, и успешно её использовать.Это основной смысл, остальное - структурирование кода и т.п. - по желанию.
>>1156306 (OP)Возник тупой вопрос. Следующие две команды идентичны или нет?double (зв)x = (double(зв))malloc(10 x sizeof(double));double (зв)x = malloc(10 x sizeof(double));Если да, зачем тогда в таких случаях пишут приведение типов?Если нет, не является ли вариант с приведением медленнее чем без него?
>>1164604В Си указатель на void автоматически и неявно кастится к указателю на другой тип (и обратно). В крестах такого нет (у них там type safety типа), поэтому нужен явный каст. Разницы по производительности нет. Каст возвращаемого маллоком значения - классический признак человека, который учил не Си, и не кресты, а некий "си с классами".
>>1164658теоретически это может помочь при рефакторинге. но мы же знаем, что функции должны быть такого размера, чтобы всё было в ней понятно и видно сразу.
>>1164604>Если да, зачем тогда в таких случаях пишут приведение типов?Чтобы обеспечить переносимость сишного кода на кресты.
>>1164941>>1164658Благодарю.Хотя во втором случае возникает вопрос, зачем конпелировать сишный код плюсовым конпелятором.
Чпок!
>>1165130Добрый вечер!Мимо вежливый лось
https://youtu.be/443UNeGrFoMБля, посмотрел видео. Смешанные чувства. С одной стороны он прав, хотя блин... Вроде и бредит немного.
>>11655812 часа смотреть как какой-то петух рассказывает про свой стиль программирования?
Что мне вернется?typedef struct govno{bool pahnet;} govno;govno *today = calloc(sizeof(govno));if (today->pahnet == true){ return(1);}else if (today->pahnet == false){ return(2);}else{ return(3);}
превед двочь. объясните простым язык про конец файла в си, и про то как обрабатываются потоки символов. чайнику полнейшему но в подробностях если не затруднит
>>1166492Не скомпилируется.
>>1166508Системный вызов возвращает некий признак конца файла.Ну вооот
>>1166492В теории представление _Bool может хранить хоть 'y'/'n', и разворачиваться в 0/1 только при использовании в выражениях, хотя на практике никто такой хуйней не страдает. Поэтому если исправить ошибки, вернется 2.>>1166508Задай более развернутый вопрос. Конец файла - это специальное значение, выходящее за пределы диапазона, применяющегося для символов. Его возвращают как индикатор того, что символов больше нет. Физически никакого конца файла уже лет 30 как не существует.
>>1156306 (OP)ребят простите за ламерский вопрос , но интересно куда возвращает значение return доупстим из мейна или та же функция exit куда они выводя значения и где их посмотреть
>>1166602Там до и после мейна ещё код работает.А где посмотреть... погугли программа код возврата
>>1166602> где их посмотреть В винде (в сосноли):app.exeecho %ERRORLEVEL%В линуксе (в сосноли):./appecho $?(или можно приглашение настроить, чтобы код возврата предыдущей команды автоматически выводило). Алсо, можно получать код возврата программно (для этого он и придуман).> куда возвращает значение returnВ main() return EXPR полностью аналогично вызову exit(EXPR);
Господа, переделайте, пожалуйста, Си++ код в Си.https://ideone.com/wLxTJb
>>1166681Отвратительный код. С тебя $10.printf("%.2x\n", 0x0f ^ 0x61);
>>1166687Смешно.Следующий. Только не клоун, пожалуйста.С помощью маски надо одновременно изменить состояние одного \ нескольких битов в байте, не затрагивая не нужные. Порядок бит (как в самом байте, так и в выбираемых для изменения) - MSB...LSB.
>>1166695Очевидно, что когда маска зависит от числа, тебе не нужна маска, потому что результат - константа. А если тебе нужно менять биты в рандомном числе, тебе нужно ДЖВЕ маски - для and-not и для or. Такие дела.
>>1166697В Си++ коде именно так. Поэтому и прошу переписать.Пусть даже за вознаграждение. Разумное. 300к нет.
>>1166700Ну бля. Делоешь маску mask, в которой в которой нолики стоят там, где будешь менять биты (в Си литералы все еще не умеют в binary, если что). Записываешь биты bits, где в нужных местах стоят биты, которые нужно установить. Применяешь.// Будем менять биты 6, 5, 3, 1.uint8_t mask = ~((1 << 6) | (1 << 5) | (1 << 3) | (1 << 1));// Будем ставить биты 6 и 3 в 1, а 5 и 1 в 0.uint8_t bits = (1 << 6) | (1 << 3);// Какой-то байт.uint8_t value = (uint8_t) (rand() & 0xff);// Применяем.value = (value & mask) | bits;> Порядок бит (как в самом байте, так и в выбираемых для изменения) - MSB...LSB.А в крестовом коде LSB->MSB, как у нормальных людей. Ну пиши там (8 - 1 - индекс_бита), если сильно надо.
>>1166709байтоёбы
>>1166709Спасибо попробую собрать. Хотя не уверен, что получится.Дай фейкомыльце, а?Может ещё будут предложения.
>>1166508http://www.c-cpp.ru/content/eofЧто такое потоки символов?
>>1166787> Дай фейкомыльце, а?suck_my_nerd_cock@mail.ru> Может ещё будут предложения. С пошлостями не обращаться.зы: дятел, за каким хуем ты учишься? Пиздуй сраз в макхряк трудоустраиваться
>>1166873Ну смотри. Можно абстрагироваться над файлом и представить себе трубу из которой выливаются символы один за другим. Тебе похуй, откуда они там в трубе берутся - может быть, они из файла читаются, может их пользователь ввел, может их другая программа на лету генерирует, а может они через сеть прилетели. И вот ты читаешь символы, а потом тебе прилетает вместо символа хуй (EOF). Тут-то ты и понимаешь, что больше у этой трубы ловить нечего. Вот это потоки. Потоки символов, байтов или еще какой-нибудь хуйни (в Си - потоки символов).
>>1166787Это >>1166878 если что не я был. Спрашивай тут, если к Си относится, или в прикрепленном, если не относится.
>>1166882В первый раз слышу про потоки, честное слово. Сравнение канализацией попахивает. Тебе может быть пойти на сантехника отучиться?!Если по теме, то тебе необходимо читать файл в бесконечном цикле, опционально добавив задержки на чтение (читай про семафоры) при eof == true, кеш организовать, чтобы не читать файл каждый раз сначала.Посмотри код tail, ключ -f к этой утилите именно то, что тебе надо.
>>1166787Этот >>1166885 быдло мимикрирующее из /б просочившееся сюда, не обращай внимания.
Расскажите про стандарты языка. Что это и как это. Что значит поддержка компилятором стандарта.
>>1166911Все тоже самое, что и в скриптовых языках типа пиздона или эрэнэра.
Создать язык программирования это значит создать компилятор для него получается так? То есть создать некую программу которая будет переводить некие слова в машинный код? Почему тогда раз машинный код для каждого процессора разный то программа написанная мною на моем пк успешно запускается на другом пк с другим поколением процессоров к примеру у меня амд а у приятеля интел
>>1166915Зависит от ОС и кучи других факторов.
>>1166917Можно подробнее?
>>1166917начни со стандартов и то как они связаны с компиляторами
>>1166911> Расскажите про стандарты языка. Что это и как это. Что значит поддержка компилятором стандарта. В Си на текущий момент три стандарта. Это такие документы, очень скучно и подробно описывающие язык. Поддержка стандарта означает, что поддерживаются все нововведения по части синтаксиса (компилятором), а в стандартной библиотеке (если она идет с компилятором) присутствуют все новые функции, наличие которых гарантирует стандарт.>>1166915> Почему тогда раз машинный код для каждого процессора разный Есть архитектура процессоров и архитектура набора команд (instruction set architecture). Вторая меняется очень редко. Например, твой процессор вполне способен выполнять инструкции, которые применялись в середине 80-х. А вот в обратную сторону это, очевидно, не работает. Современные инструкции старый процессор не осилит. И сейчас ты можешь собрать код для процессора с поддержкой AVX и соснуть на каком-нибудь старом ноуте.> у меня амд а у приятеля интелАрхитектура команд у AMD и Intel по большей части одинакова.
>>1166918Подробно писать не буду, ибо заебусь печатать.Есть некий код, компилятор переводит его в машинный код, чтобы у тебя что то на экране появилось - это уже функция ОС, ну там окошко, текст, картинка. (Я сейчас не гвоорю про прямой вывод на экран текста из ассемблера).Короче, программа имеет структуру - заголовок, откомпмлированные инструкции к выполнению на ЦП и т.п.Запуская приложение ЦП анализирует и поэтапно выполняет код(откомпилированные инструкции).Лень откровенно новоря приводить примеры как Си код вюпревращается в ассемблер, который в виде инструкций поступает на конвеер ЦП и как там память кеш и прочие компоненты задействованы.
>>1166919Берем, например ци89. Есть там абстрактная комнда fuck(), которая в наборе инструкций интел и амд ЦП будет соответствовать последовательсти jmp ax, cmp e6, e4... и т.п. У интела это будет инструкция нащываться А, а у АМД Б.
>>1166732Побитовые операции есть даже в javascript, но куда тебе дегенерату знать про это.
>>1166915В ньюфаг-тред.
Аноны, хелпуйте нубу.Задача - вывести ласт слово задом наперёд.Вывод: euelueblueКто пояснит?
>>1166984У тебя принтф печатает с символа, который ты передал и до \0.euelueblue
>>1166984Попробуй печатать символ, а не строку. printf(%c, s)
>>1166992
>>1166992>>1166994Спасибо, так работает.
>>1166997Что за компилятор?
>>1167203Lexicon
>>1167206>LexiconЧто-то не гуглится. Есть ссыль на установщик?
>>1167224Lexicon? Конечно есть: https://transfer.sh/yplpi/Lexicon-8.92.zip
>>1167203gcc 5.4.0
Ничего не понял, вот это >>1166997 говно скомпилируется даже на микроволновке. Какая разница, какой конпелятор?Или гений выше перепутал компилятор с иде?
>>1167423Насколько я понял - да, перепутал. Увидил интерфейс моего саблайма и спросил что за компилятор.
>>1167423Да, перепутал. Всё, придётся выйти покурить в окно. Так дальше жить нельзя.П.С. Мне вот интересно, тут все обиженки, которые мусолят курьёзные случаи в чатиках \ курилке с такими же чуханами, как и они сами? Выглядит так, что вам кто-то насрал на голову, а смыть жижу вы можете только типа "язвительными и остроумными" на самом деле - нет ответами в подобных тредах?Вроде ничего пиздец архи-сложного не спрашивал, лол.
>>1167461тебя даже никто не трогал, взял ещё и обиделся. тебе лечиться надо.
Пишу простой интерпретатор, и для грамотной очистки памяти походу придется заюзать референс каунтинг, но готовых бибилотек или реализаций я не нашел. Если писать самому, то я даже не знаю с чего начать, какая вообще основная идея использования и реализации этой хуйни? Кто может пояснить, желательно с кодом?
>>1166984> длина строки> sizeof(s)
>>1167682У структуры прописываешь поле "рефкаунт", пишешь методы "инкреф" и "декреф". Во втором прописываешь логику освобождения памяти.
>>1167728> пишешь методыНу функции, в смысле
>>1167727И ты сейчас нам пояснишь, почему нужно считать в рантайме через strlen, а не в компайлтайме через sizeof.>>1167682Посмотри на COM (одним глазком только, не нужно в дебри лезть, какой-нибудь вводной статьи хватит).
>>1167741Во-первых, этот костыль работает только для массива, выделенного на стеке, во-вторых, попробуй вынести этот код в функцию и посмотри, что будет.
>>1167728Для подобного существует boehm gchttps://en.m.wikipedia.org/wiki/Boehm_garbage_collector
>>1167764Причина "во-первых" и "во-вторых" одна и та же, sizeof(x)/sizeof(*x) для динамически выделенного массива будет использовать только очень особенный пограммист.
>>1167791>sizeof(x)/sizeof(*x) для динамически выделенного массива будет использовать только очень особенный пограммист.Ты скозал? Ну и что же используют господа, обучавшиеся в Хуеле?
>>1167795Я не настаиваю, конечно, в следующем коде нет ничего противозаконногоint x = malloc(10sizeof(int));printf("%d", sizeof(x) / sizeof(*x));Но результат может немного расстроить.
>>1167803int (зв)x = malloc(10 * sizeof(int));
>>1167803А еще можно после твоего printf сделать x[100]=0xdead. По твоей логике [] зло, нужно написать какую-нибудь array_set(), которая проверяет границы, лишь бы какой-нибудь недоучка не обосрался. Тебе в другой язык с таким подходом.
>>1167863Что ты несешь? Я лишь сказал, что придирки в этом >>1167764 посте надуманные, и разве лишь дебил неопытный попадется на подобную ошибку (на определение числа элементов в массиве, выделенном маллоком). Про добро и зло ты сам домыслил.
>>1167883Так и я о том же.
Друзья, мне нужно как-то записать и вывести кириллицу не используя wchar, что делать?
>>1168611> что делатьБочку. ОС, компилятор, более полное описание задачи?
>>1168612на степика есть задача, где нужно написать программу, принимающую кириллицу, далее дефолтная работа со строкой и вывод. Решил wchar, сказали збс а теперь без wchar, сказали думать в направлении, что кириллица не помещается в char
>>1168616Не знаю, кто такая эта ваша степика, но если у тебя нормальный линукс, ты можешь использовать UTF-8 (на винде тоже можешь, но в винде UTF-8 в консоли можно сделать только в десяточке) - если кириллица не помещается в один char, то может поместиться в несколько char. Про подробности кодирования UTF-8 см. википедию. Но без сборки хотя бы одного символа в wchar_t/char16_t/char32_t ты со строкой нормально не поработаешь (ну, конечно, моооожно, но больно).
>>1168644Но ведь Си действительно мёртв.Сейчас тащат плюсы.Все, кто исползует Си - петухи и опущенцы.
сап, есть прога. Нифига не понятен принцип работы (да, она не совсем правильна). Хелп! Обясните дурачку!
>>1169001Что тебе не понятно? Обычный односвязный список.
>>1169001>for(; pizda;)Мам, смотри, я хакер!
>>1169060Правильные ребята пишут так: for (; ∗current; current = &((*current)->next));
>>1169105Бля, ахуенно жеж.
>>1169060>>1169105Но зачем эта сахарная параша когда есть while/
>>1167804А потом ты поменял тип x, или не ты, что только увеличивает вероятность внесения ошибки
>>1169183>А потомСуп с котом.
>>1156306 (OP)https://pastebin.com/Pdv3jmv9> Error in `main': malloc(): memory corruption (fast): 0x00000000013470e0 Посоны, почему возникает ошибка? Видимо, из-за функции f2, она как-то распидарасивает мою память void*. А как тогда правильно?
>>1170933>memory corruptionпланку памяти смени на новую
>>1170945Где ж я в тюрьме планку памяти достану? Есть ещё варианты?
>>1170933Ты считаешь адреса неправильно. Сделал бы структурку типа struct { double res, x; int y; } и выделял бы ее. А у тебя вот это ок:double ∗x = (double∗)memory;Дальше твой массив y залезает на конец массива x, потому что тебе нужен адрес memory + n ∗ sizeof(double) = memory + 8n, а у тебя сложение (адресная арифметика) для указателя на инт, поэтому ты считаешь memory + n ∗ sizeof(int) = memory + 4n.int ∗y = (int∗)memory + size;Дальше ты скипаешь 2n даблов: memory + sizeof(double) ∗ 2 ∗ n = memory + 16n (адресная арифметика для double), что нихуя не равно memory + (sizeof(double) + sizeof(int)) ∗ n = memory + (2 + 4)n = memory + 6n:double ∗res = (double∗)memory + 2∗size;Соответственно, в этом последнем блоке ты вылезаешь за пределы массива.Можешь считать итеративно:double ∗x = memory;int ∗y = (int ∗)(x + size); // Адресная арифметика для double∗.double ∗res = (double∗)(y + size); // Адресная арифметика для int∗.Это будет работать, если выравнивание, требующееся для дабла равно выравниванию, требующемуся для int. Иначе стоит сложить сначала оба массива даблов, потом уже инты. Но вообще, такой подход говно, не делай так, если не уверен.
>>1170954> memory + (2 + 4)n = memory + 6n:memory + (4 + 8)n = memory + 12n (опечатался).
>>1170954> Но вообще, такой подход говно, не делай так, если не уверен. А как тогда делать?У меня есть некоторая довольно большая структура typedef struct {бла-бла-бла} mystruct;несколько функций типаint f(unsigned size, бла-бла);которые:1. Должны вызываться несколько тысяч раз.2. Содержат в себе кучу различных маллоковtype ∗x = malloc(size ∗ sizeof(тип));Препод сказал, все говно (и он прав, ибо сишный код работает по скорости так же, как питоновский прототип), ирл в таких случаях делают менеджоры памяти. Понятия не имею, что такое менеджер памяти. Потому я добавил в структуру поле void∗, куда засовывается память, которая использовалась бы вместо маллоков внутри функции.А как следовало поступить тогда?Небольшой пример в выше я написал просто чтобы разобраться, почему у меня все неправильно работает.За итеративный способ спасибо, пока так и сделаю.
>>1170963> int f(mystruct structure, unsigned size, бла-бла);Фикс.
>>1170963> Содержат в себе кучу различных маллоковНу так уменьши количество маллоков, посчитай, сколько тебе памяти нужно и выделяй заранее, не внутри цикла, а перед ним. А менеджер памяти у тебя уже есть, ты из него маллок дергаешь, и обогнать его чем-то кастомным может быть сложно.
>>1170951тюрьма психотронная, надеюсь?
>>1170968А я проверил, "итеративный вариант" дал ускорение в полтора раза. Пожалуй, оставлю.
>>1171003Ты точно уверен, что malloc(sizeof(mystruct) * size) медленнее? Я вот не верю в такое.
Народ посмотрите пожалуйста на мой выссер и скажите почему этот кусок говна не хочет запускаться. Битый час сижу над этим дерьмом. P.S. Скорее всего руки у меня кривые. https://ideone.com/iK76G3
>>1171009https://pastebin.com/qD9yFRMqРезультат:f1: 28.039000f2: 19.173000Завтра проверю в gcc, может другие числа будут.
>>1171017Знак умножения пропущен.e определена в константах.Тебе в плюсотред.
>>1171017Добавлю к замечаниям предыдущего анона, что ^ - это оператор побитового исключающего или, а степень - это функция pow().
>>1171021А еще есть exp.
>>1171018Откуда у тебя там вторые + size взялись при вычислении указателей? Зачем? Мы считаем относительно предыдущего указателя. y - это память, следующая за size элементами в x, а res - это память, следующая за size элементами в y.
>>1171020Спасибо что отозвались Аноны, вагон чая и уважения вам. Я поменял но все равно не врубается. https://ideone.com/wgsAbX
>>1171031Английский язык говорить? Сообщение об ошибка читать? Где переменная a объявлять? Нигде не объявлять? Вот и не врубаться.>>1171018Алсо, тест-кейс у тебя был очень хуевый. Сумма там заменится на i * 2, а учитывая, что у f1() сайдэффектов нет (она ничего не возвращает, и вообще почти не влияет на мир за своими пределами), нормальный компилятор вообще может выкинуть все ее содержимое на ненадобностью.
Пардоньте, а нет ли аналага fopen такого, что б ему не нультерминированную строку требовалось передавать, а буфер и его длинну? Или только напрямую с sysenter возиться?
>>1169105Правильные ребята используют tail-рекурсию.
>>1171088>Правильные ребятав плане правильно ебутся в жопы.
>>1171078Системный вызов open() сам хочет нультерменированную строку. Напиши себе обертку, которая будет копировать имя в массив и по указанному офсету втыкать \0.
>>1171234Так и придётся делать, спасибо.
>>1156306 (OP)Поясните за realloc, нужно free вызывать для старого указателя? т.е если new_ptr = realloc(old_ptr, new_size);нужно потом делать free(old_ptr);?
>>1171420Если realloc() сфэйлился, твой указатель остается твоим, и ты должен его освободить. Если realloc() прошел успешно, ты заботишься только о том указателе, который тебе вернули. Старый указатель уже не твой. Кстати, realloc() может вернуть тебе твой же старый указатель, если есть возможность просто добавить памяти в выделенный блок, поэтому было бы странно, если бы тебе нужно было его освобождать.
Ребят, кто знаком с этой звуковой либой (или понимает, что мне нужно), расскажите, почему в output буфер можно писать любые типы, но советуют float'ы (это из-за модуляции волны?).PortAudio supports audio input and output in a variety of sample formats: 8, 16, 24 and 32 bit integer formats and 32 bit floating point, irrespective of the formats supported by the native audio API.Алсо, если я хочу написать простую говорилку текста или мелодию из марио, то что мне нужно знать? Надо взять библиотеку полегче или же книжку потяжелей?
>>1171919Возьми OpenAL и не еби себе мозг.
В чужом коде наткнулся на объявления функций в таком виде:int some_func(a, b) int *a; int b;{ ....}Зачем так делалось?
>>1172438Видимо код совсем древний, во время K&R (ло принятия ANSI стандарта) так писали.
Пытался написать слияние массивов в том стиле, в котором написана qsort.С double и int вроде норм работает, а вот структуры обмениваются полями. Где я накосячил?https://pastebin.com/ZZEzmk0C
>>1172441Это код из проекта, который появился после 2000 года.
>>1172453Да вроде все норм. Смущает только вычисление длины хвоста массива в последних двух memcpy, не понимаю твоей логики. Покажи минимальный компилирующийся пример, который не работает.
>>1172552if(ind1 + ind2 < size_result){....if(ind1 < size1)........memcpy(curr_pos, (char)(arr1) + ind1sizeof_element, (size_result - size2 - ind1)sizeof_element);....if(ind2 < size2)........memcpy(curr_pos, (char)(arr2) + ind2sizeof_element, (size_result - size1 - ind2)sizeof_element);}return EXIT_SUCCESS;После того, как прошли цикл, может случиться лишь один из 3 вариантов:1. ind1 + ind2 == size_result. Тогда места в результирующем массиве не осталось, надо выходить.2. ind1 + ind2 < size_result, но один из массивов (пусть первый) кончился. Тогда ind1 = size1, в результирующем массиве осталось size_result - ind1 - ind2 = size_result - size1 - ind2 ячеек, которые нужно скопировать из второго массива, начиная с ind2-того элемента.Я и сам проверил на паре примеров, вроде все норм. Видимо, я с указателями проебался.
>>1172575> в результирующем массиве осталосьНу я просто не понял, что именно задает юзер в size_result. Допустим, у нас массивы int a[5] = { 0, 1, 2, 3, 4 } и int b[1] = { 0 }, а size_result 10 элементов (если size_result всегда равен сумме длин массивов, то зачем он вообще?), тогда мы копируем: size_result(10) - size2(1) - ind1(1) = 8 элементов. И у нас случается ОЙ.
>>1172576В данной функции (она не вещь в себе, а часть некоторой программы для комбинаторной оптимизации) первых два массива в сумме точно больше результирующего.В первом массиве лежат инициализирующие элементы, во втором -- новые, полученные из инициализирующих. Потом мы выбираем из обоих массивов лучшие элементы и полученный массив делаем новым инициализирующим. Те элементы, что не вошли в новый массив, являются мусором.
>>1172618Хотя можно было бы добавить что-то типа if(size1 + size2 < size_result) {return POSHOL_NAHOOY;}
>>1156306 (OP)Анон, как устроенна работа GPU, у которых есть своя собственная память? Вот я, например, всегда работал с платами с видеокартой, у которой нет встроенной памяти, и здесь всё просто - графика из юзерспейса элементарно копируется в RAM, пинается GPU, который потом по DMA забирает данные, обрабатывает их и пишет результат во фреймбуфер опять же в RAM.
>>1172927> юзерспейса элементарно копируется в RAMВот ето поворот.А где был юзерспейс?
>>1173029В свопе.
Посоны, существует ли какой-нибудь сайт, куда можно выложить код, чтобы его похуесосили, пояснили за элементарные ошибки не те ошибки, которые делают код нерабочим, их я сам могу найти. Ошибки уровня "так делают только мудаки", стиль и прочее?Гитхаб не то. Туда я выложу, и он будет висеть джва года без просмотров.
>>1173221>существует ли какой-нибудь сайтhttps://govnokod.ru/
>>1173221всю жизнь хочешь провести в зависимости от мнения окружающих?
>>1173221https://codereview.stackexchange.com/
>>1173262Благодарю, то что надо.
Встречается такой стиль объявления функций:intfunction(char *s){}Объясните, какие преимущества даёт размещение возвращаемого типа в отдельной строке?При этом в заголовочных файлах эти же в одной строке.
>>1173437Конпелятору похуй. Дело вкуса.
Как в сублайме включить вывод ошибок для Си? Работаю на линухе, если это имеет значение.
Антоны, что использовать для перехвата нажатия клавиши в Си?
>>1173437Если тип возвращаемого значения длинный, или конвенция вызова указывается, то искать глазами имя функции проще:const struct myyoba_data_store * MYLIB_CALLTYPEfunction(void){}>>1173613Билд-система для gcc и/или для Makefile уже есть в комплекте, нажми Ctrl+B. При даблклике на сообщение об ошибке оно переходит к нужной строке. Если хочешь ошибки инлайном, скажи "show_errors_inline": true в настройках. Если у тебя кастомный билд, сделай .sublime-build свой, там всего лишь регэксп для сообщений сочинить.>>1173661В Си - ничего. Какая ОС? Клавиша в графическом приложении или в консоли?
>>1173712>В Си - ничего. Какая ОС? Клавиша в графическом приложении или в консоли? В консоли. ОС - Linux Gentoo.
>>1173739Опиши нормально задачу. У кого ты клавиши перехватывать собрался, зачем? Ты там reptyr какой-нибудь пишешь, или что?
>>1173749Пишу рогалик в терминале.
>>1174056А ты действительно изучил хотя бы основы сишечки?fgets, gets, scanf...
C11, хотя неважно. Есть:#define PROGRAM programПочему вместо того, чтобы работать так:const char msg[]=#PRORGRAM ":Unable to do smth\n"оно (gcc) выдаёт "stray # in somewhere..."Оно работает только так:#define STR(a) #aconst char msg[]=STR(PROGRAM) ":Unable to do smth\n"И тогда в сообщении будет имя программы, как положено.Что-то в связи с последовательностью работы препроцессора, порядком раскрытия макросов чтоли, но мне непонятно, что именно ему мешает по-человечески со мной...
>>1174187Так, только не надо вот говорить, что это потому, что я #PRORGRAM написал.Нее
>>1174187>#define PROGRAM programПопробуй утакуот #define PROGRAM "program"
>>1174195Пробовал, нихрена.Да и бессмысленно это.
>>1174195А, всмысле, потом PROGRAM уже без '#' подставлять?
>>1174201До. У тебя же строка
>>1174187> "stray # in somewhere..."# - это макрооператор, оно часть препроцессора, а не языка, работает только в макросах.> #define STR(a) #aТоже неправильно, оно всего лишь обернет аргумент в кавычки, не попытавшись его раскрыть:#define FOO barSTR(FOO) // Тут получится "FOO", а не "bar".Для раскрытия макросов нужен еще один уровень:#define STR_(a) #a // Обернет в кавычки.#define STR(a) STR_(a) // Выполнит макроподстановку для a.А про #define PROGRAM "program" уже написали выше, строковые литералы отлично конкатенируются безо всяких операторов.
>>1174300> #define FOO barSTR(FOO) // Тут получится "FOO", а не "bar".А почему у меня всегда bar?
>>1174304https://ideone.com/KLwTN3 (внизу)
>>1174310Я упоролся, соре.Всё там, как и ожидалось.
>>1174310Эт что за магия!? оО
сап аноны, поясните за передачу tar архива по tcp с помощью сокетов.
А 9-битовый тип данных можно организовать?А то 8 бит мало, а 16 много, чтобы возводить флаги. Контролируемых ситуаций 9.
>>1174727Хотя каковый в этом смысл, там же всё равно выравниваться в итоге будет по крайней мере по 8 битам, да?
>>1174728Да.
>>1174700Открываешь сокет, передаешь. Не забываешь, что send может передать меньше, чем ты ему сказал, поэтому внимательно обрабатываешь код возврата.
ХелпНужно написать Windows драйвер (мне вроде KMDF подходит), который будет считывать значение TSC: Time stamp counter, счетчик тактов (на самом деле не TSC, а MSR мне нужно) регистра процессора и записывать новое значение в этот регистр.Проблема в том, что я вообще не понимаю как в этом блядском Windows всё работает и не понимаю где взять источник информации.C Линуксом всё просто и аналогичный драйвер (в линуксе это был модуль ядра) я уже написал, потому что по Линуксу тонна материала в интернете.Посоветуйте инфы (книги, ссылки, статьи, можно все на англ, но лучше на русском), чтобы разорбаться в том, как писать драйвера (KMDF) для Windows.В Windows Internals судя по оглавлению не раздела про написание драйверов. А на сайте Microsoft написано мало и не полно как-то, хотя может я и жопой читал
>>1174901Есть книга про драйверопесание под венду, гугли, лентяй
>>1174700man netcat
>>1174901Windows Must Die
>>1175003>Windows Must Die
>>1174901Качаешь DDK (можно, и даже возможно лучше - несвежий какой-нибудь). Читаешь документацию из комплекта (для такой простой хуйни достаточно введение прочитать). Правишь любой простой пример из комплекта. Компилируешь. Алсо, у MS сейчас все свежие примеры на гитхабе лежат.
друзья, помогите с правильным ответом на вопрос: вот например у нас есть указатель на первый элемент массива a и указатель b на nй элемент массива, (b-a+1) - индекс элемента массива, так вот вопрос, нахера мы единицу прибавляем? нужен именно правильный ответ. Заранее спасибо
>>1175326Ну, смотри: спасибо, что посмотрел.
>>1175337объясни, не понял
>>1175343Потому что > указатель на первый а не на нулевой.
>>1175326Правильный ответ: единицу прибавлять не нужно. Если у тебя указатели равны, то их разница 0, и индекс массива тоже 0, ничего прибавлять не нужно. Если у тебя 1-based массивы, то это другой язык, и тебе в другой тред.
>>1175347>>1175349извиняюсь, конечно, указатель на нулевой элемент, я так и ответил, но сказали, что не правильно
>>1175420Шли их нахуй. Смело, решительно. Может ты задание не так понял? Может, тебе количество элементов посчитать с первого по второй указатель? Тогда будет как раз +1). Иначе шли нахуй.
Вроде тот тред. По заданию нужно сделать двустороннюю полудуплексную передачу данных в одном канале между родственными процессами, используя семафоры для синхронизации. Собственно, у меня вопрос - один канал и двусторонняя передача совместимы? Мы же один из дескрипторов обязаны закрыть.
>>1176042хорошее задание, у тебя неплохой препод в вузикеделай его самостаятельно, будет полезно
>>1176042конечно, в этом и суть полудуплексарежим рации
>>1176102>>1176106Так, падажжите. Нам говорили, что при работе с каналом мы обязаны закрыть для себя вход или выход, смотря читаем или пишем. Обратно открыть мы не можем. Так что я как-то не понимаю, как это сделать.
>>1156306 (OP)Поясните за hash функции, как их пишут? Методом тыка? Или есть теория?
>>1176136Давай для начала определимся, что такое канал. По-английскиПо-человечески оно как называется?
>>1176172То, которое pipe(fd)
>>1176170Ты хотя бы википедию почитал прежде чем такой глупый вопрос задавать. Хэш рование, криптография и всякое такое. Там де про алгоритмы узнаешь.
>>1176178Хэш на пике не имеет никакого отношения к криптографии. Дизайнят руками, смотрят на распределение.>>1176174Пайп действительно однонаправленный, но если у тебя parent/child, то тебе нужно просто писать в правильный конец. Закрывать дескрипторы нужно не потому, что иначе не работает, а для того, чтобы read() мог отследить EOF на пайпе (если у тебя открыт write-дескриптор на пайп, read() не вернет 0, даже если на той стороне write-дескриптор закроют).
>>1176184И как тогда мне, спрашивается, "Самостоятельно, используя для синхронизации процессов семафоры, организовать двустороннюю поочередную (полудуплексную) связь процесса-родителя и процесса-ребенка через канал"? В задании-то канал один. Сделаю через два пайпа, хз.
>>1176184>>1176192Алсо, есть идея послать EOF и тем самым схитрить, но быстрый поиск не помог.
>>1176192У тебя два процесса, один пайп. У каждого процесса есть два хэндла - на чтение и на запись. Родитель такой семафором помахал, записал, а потомок читает. Потом потомок помашет, запишет, а родитель прочитает. Получается полудуплекс, ну. Оба могут писать в канал, но в конкретный момент времени - только один. Рации всмомни: - У нас тут какая-то хуйня, приём. - И у нас тоже, приём. - Да ебись оно все конем, конец связи. - вот это тебе и нужно реализовать.
>>1176225Так вон выше говорят, мол, нельзя, read зависнет. В общем-то о таком и думал, но все упиралось в то, что во всех примерах одна сторона пайпа в родителе/потомке таки закрывалась.
>>1176232Это я писал. read() зависнет, если ты будешь в цикле читать. Не читай в цикле - смотри через ioctl(..., FIONREAD...), сколько есть и читай. Прояви фантазию, в общем - там вариантов дохуя.
>>1176236Мы такой хуйни не проходили. Ладно, буду побайтово читать, ожидая встретить нуль-терминатор. Попробую, по крайней мере.
Двач. Вот прочитал я некоторое количество книг из шапки, с переменным успехом решаю задачки на всяких Codefights, Codewars и тд, но до сих пор не могу понять, куда реально можно приложить Си. Посоветуй какие нибудь книжечки с примерами, где поясняются реальные программы.
>>1176675ОС, компиляторы и прочие движки БД.
>>1176675Advanced Programming in UNIX environmentProgramming Applications for Microsoft WindowsЧитай документацию по нужной ОС, читай чужие исходники.> куда реально можно приложить СиКуда угодно. Если тебе нечего написать, зачем ты вообще учил язык?
>>1176675Железо программировать. Хотя это немного узкая область, не каждому интересно это
>>1176675Модуль для питона напиши.
Анон, решаю тут K&R из шапки и застрял на задании 1-18: https://pastebin.com/A7cJtdG1 (там задание тоже написано). Вроде как код написал, в голове всё сходится, но бля, оутпут просто пиздец. Символы, которые я пропускаю, а именно множественные табы и пробелы, заменяются на какую-то хуйню полную. Типа знаки вопроса или что-то на уровне, хотя по сути, я их просто бля пропускаю и всё, забываю на всегда. Познавшие аналы си, подскажите, что не так?
>>1176888Точно хочешь узнать, что не так в твоей реализации (сейчас не могу), или тебе просто задачу решить. Может, перепишешь? Алгоритм простой: ты читаешь всю строку, сколько ее ни есть, но если прочитанный символ - не таб и не пробел, ты запоминаешь его индекс в переменную. Перед выходом просто пишешь по индекс+1 символ '\0'. Четыре строки на тело getline. Если возвращенная getline строка пустая (по нулевой позиции \0), ты ее пропускаешь.
>>1176888Хотя, если что, одна из твоих проблем в том, что i ты инкрементишь каждую итерацию, а в массив по i пишешь не всегда. Судя по высказыванию "оутпут просто пиздец", у тебя в незаписанных элементах массива куски предыдущих строк и прочий мусор.
>>1176932Лол. Спасибо. Действительно в этом и было дело
https://pastebin.com/5FCsNe3TКотаны, почему в файл попадает мусор вместо настоящего содержания конца текста?
Где я объебался и где мой полудуплекс-то?https://pastebin.com/ABTiR204
>>1177300не попадаетно это на другой платформе и с учетом правки параметров вызова calloc
>>1177327>с учетом правки параметров вызова calloc Ошибка появилась из-за смены malloc/calloc.Спасибо, попробую дома на линупше с гцц запустить.
>>1177325Ты бы для наглядности msg высылал, а не всегда [0].Вывод ни о чём.
>>1177362Я хотел высылать msg, но у меня происходит segfault. Что странно.
>>1177363Ну, семафор 0 довольно прозрачный. Но вот с первым дела, конечно...Допустим, родитель первый захватил. Значение семафора 1 равно 1: данных в канале нет, hd=0. Потом сделал семафор 1 нулевым. Освободил нулевой семафор...Пошёл дочерний. Семафор 1 нулевой => данные есть. hd=1 => Дописали единицу к семафору 1. А это признак отсутствия данных для родителя, да? Родитель ничего не читает, а лишь уменьшает семафор на 1, делает его нулевым для нас, а мы снова ему срём и увеличиваем, а он ничего не читает и для нашего чтения уменьшаетМожно поменять в после родителя и дочку.Я правильно понял?
>>1177377Да, в семафоре 1 единица - признак отсутствия данных. Родитель смотрит на него, если в семафоре не ноль - не пытается читать, а сам пишет и ставит ноль. Если же данные были, то он пишет и семафор не трогает. Если данные были, но все свое уже выслано - увеличивает семафор давая понять, что ничего не высылал.
>>1177363Я хз, что если инициализировать нулём semval в main(), а потом просто читать с sem_op=-1, а писать с sem_op=1.Так же прозрачнее будет, ИМО.Вообще, с этой hd как-то некрасиво.
>>1177381Так у тебя после второго цикла родителя/потомка получается, что выставляется значение семафора "читать нельзя", а при этом пишутся данные.Зачем?
>>1177377>>1177386Так он не добавляет 1 к семафору же. S < 5 (выслано меньше пяти сообщений), а if(hd) засунуто в else к первому условию.
>>1177300Потому что нужно выделять на байт больше и дописывать \0 в конец. А вот calloc() там в хуй не уперся, все равно fread() все затрет.
>>1177387А может быть так, что родитель ни разу не даёт потомку ресурс, а потом в конце if(hd) и ставит семафор 1 в единицу, а потомок потом получает ресурсы, но уже не читает?Я понимаю, что ты несколько раз прокрутил, но всё же...
>>1177450Это первое, что я нагуглил и проверил (выделил calloc'ом size+1 элемент), не сработало.Вообще, что делают нормальные люди, если требуется распарсить несколько тысяч файлов на С, имеющих довольно разнообразную структуру (файл содержит список переменных, которые могут идти в любом порядке, и строки-комментарии, начинающиеся с символа "#")? Писать парсер с нуля довольно утомительно.
>>1177520> не сработало-Wall скажи, и тебе компилятор объяснит, кто ты.> что делают нормальные люди, если требуется распарситьБерут flex или его отродья. Хотя такое и вручную несложно написать.
>>1177494В общем, я понел. Пока потомок форкается - предок успевает уже все прокрутить, сам с собою поговорить, удалить семафоры и завершиться. Похоже, что способ снхронизации надо переделать.
>>1156306 (OP)У вас ссылка не рабочая.
В общем, спасибо всем за помощь, таки синхронизировал. Пришлось сделать три семафора, и жопой чую, что можно было проще. Если кто подскажет, как это упростить - буду благодарен.https://pastebin.com/grPm2q6A
>>1177698Гораздо проще это с помощью select делать.
>>1177698Вообще, у тебя основная сложность из-за того, что ты долбишься с тем, что у тебя +-1+1-1+-+-1 везде. Абсолютные бы значения, а не смещения.semctl умеет в SETVAL и GETVAL, ты можешь помирить родителя и потомка на том, что если один записал, то значение P, если другой записал, то значение C, в противном случае ноль. А от 0 до SETVMX можно организовать битовые масочки на "родитель может читать", "родитель может писать", "потомок может читать", "потомок может писать".Но это всё очень абстрактно, сам так не делал.
>>1177698Еее, многопоточность.
>>1177846Многопроцессность , что в Линухе довольно схоже
>>1177651Спасибо.
аноны помогите нуфагу разобраться в коде пжалста, (https://pastebin.com/t27m9qKh)что за конструкция по шагам:1)BYTE b = (BYTE)&k; 2)if(++j==16&&i<398){
>>1178078> BYTE b = (BYTE)&k; Берется указатель на переменную, которая лежит в области данных.> if(++j==16&&i<398){ Распечатывается хексдамп начиная с переменной выше. Зачем в условии вторая часть, я хуй знаю, а первая часть нужна, чтобы втыкать конец строки и (неправильно) печатать адрес после каждых 16 байтов.
>>1177300>https://pastebin.com/5FCsNe3Tint main(){ char filename = "C:/Users/m08kaa3/Desktop/projects/Sheduling/simulation/10/gen_10.spc"; FILE config = fopen(filename, "r"); fseek(config, 0, SEEK_END); long size = ftell(config); fseek(config, 0, SEEK_SET); char * conf_text = malloc(size);memset(conf_text, '\0', size); fread(conf_text, sizeof(char), size, config); printf("%s\n", conf_text);//Если это не выведет лишних символов значит в файле в конце есть мусор. Если мусор пропал то удали эту проверку и уповай на memset(), мусор бывает когда память неинициализирована, даже если она статическая.fseek(config, 0, SEEK_SET);fgets(conf_text, 1024, config);puts(conf_text) fclose(config);free(conf_text);}
Посоветуйте техник парсинга файлов.На-до-е-ло.> просрал символ> просрал разделитель> EOF появился неожиданно> недозаполнил и мне норм> исправил пункты 1-4, но функция парсинга использует 100500 флагов состояния и занимает треть программы
>>1178500Имею в виду литературу, где это есть, статейки занятные, в которых предлагают перейти на perl
>>1178487Обсуждали выше. Размер файла 10, выделили 10 байт памяти, записали 10 байт, но это не сделало эти 10 байт строкой, которую можно вывести через printf, потому что \0 никто не дописал. Выводим это говно, получаем все что угодно - от мусора до сегфолта. На самом деле, можно printf("%.*s\n", size, conf_text);>>1178500Уже советовали flex.
>>1178500>Посоветуйте техник парсинга файлов.recursive descendant
>>1178500>парсинга файловкоких файлов? со смайликами или бинарными залупами?
>>1178568Строки ASCII-символов.
>>1178621Разделяй их на пробелах.
>>1178524Кажется вы там замороченой хуйни насоветовали. Можно же вывести printf("%s\0", buf);
>>1178952Строка -- это массив char@, заканчивающийся нулем.printf("%s\0", buf) говорит: выведи мне строчку buf, потом добавь "\0".Принтф начинает писать buf. Пишет, пишет, пишет, далее варианты:1. Залезает в запрещенную область.2. Упирается в случайно найденном в мусоре 0.В первом случае шлет нахуй, во втором кроме сроки выводит всякое говно.
>>1179127Уговорил чёрт языкатый.sprintf(buf1, "/%%ds\0", size);printf(buf1, buf);
>>1179132фиксить не буду, нутыпонел.
>>1178952>>1179132Лолшто?На самом деле достаточно fwrite(..., stdout), но мы говорили о строках.
ЧЯДНТ?Отслеживается 9 true/false состояний для, соответственно, 9 значений ячейки. Приходится юзать uint16_t.#define BIT_MASK(val) (1<<(val-1))...// Добавить val к маскеban_vals|=BIT_MASK(curval);if(!(ban_vals&BIT_MASK(curval)) write(0, "NIPANIMAT", strlen(<-von_to_govno);Как после OR'а у меня НЕ-И выдаёт тру?Было ...000000000Я заполнил 2,3,5:...000010110Потом чекаю отсутствие, допустим, 2-го, т.е.if(!(...000010110 & ...000000010)) - должен дать false, почему даёт true?
>>1179357Я чот не понял, как ты 9 бит используешь в одном байте?
>>1179535> uint16_tДействительноЯ та мтроеточие ставил, что 7 оставшихся не писать.Забейте, чуда не случилось, я обосрался в другом месте.
>>1179357Запусти дебаг и отследи все, можешь промежуточных переменных добавить.И не еби мозги.
>>1179539Да ты по всем фронтам обосрался. Тебе нужно работать с отдельными байтами по 8 бит, использовать можно тип short. Так то по теме проверки бит на чёткость уже кучи материала, но блядь, это же не строка чтоб сразу сравнивать все 9 из 128 бит.
>>1179543Падажи, uint16_t это 16-битный.
>>1179543И short на наших современных x86_64 чаще всего int16_t, не? А то и больше.
>>1179357Все должно работать. Разве что твоя нумерация битов с единицы сбивает с толку, но она у тебя консистентная, поэтому не приводит к проблемам.
>>1179544Пардон, попутал.
>>1179545Мне кажется что int16_t это нечто другое. Впрочем не вижу смысла использовать именно его. Почему бы не копнуть в сторону bit field?
>>1179551> Впрочем не вижу смысла использовать именно его.Например, есть ограничения по памяти. А так бы я тоже предложил unsigned int или хотя бы что-то типа uint_fast16_t.> Почему бы не копнуть в сторону bit fieldВнутри одной программы вполне норм, хотя и сводится к асболютно тому же коду, что и проверка побитовыми операциями. Плюс установка двух-трех флагов за раз вручную может оказаться дешевле битфилдов. Но битфилды непереносимы, т.е., если у >>1179357 сетевые пакеты, то ему все равно придется доставать флаги из битфилдов и паковать в инты для передачи по сети.
>>1179552Ненужно. Битфилды сформированные из инта будут интом и там и там, разница проявится если разная архитектура и внезапно инт не 32 бита а меньше или больше.
>>1179554> Битфилды сформированные из инта будут интомВот только порядок и выравнивание будут отличаться от компилятора к компилятору.
>>1179555Нахуя это учитывать?
>>1179556Ну что ж ты тупишь? Ты написал свой Телеграм, Вася скомпилировал его вижуал студией под x86, а Петя - gcc под Байкал. У Васи первый флаг располагается в младших битах, а у Пети в старших, и вы не можете даже поговорить об этом, потому что из-за этих различий вы по сути пользуетесь разным протоколом.
>>1179562Так это же нормально иметь под байкал отдельную версию ПО или не? Насколько я знаю архитектура почти гарантия совместимости и правильного межпроцессорного взаимподействия.
>>1179563> отдельную версию ПОНу да, давай велосипеды по двадцать раз переписывать, вместо того чтобы просто сделать flags & SOME_BIT.
>>1179564Нет, давай лезть на более низкий уровень имея те же операции в более высокоуровневом представлении.
>>1179566> давай лезть на более низкий уровеньДавай. Мы пишем на языке, который именно для этого сделан.
>>1179570Ебать ты пряник. Он сделан чтоб ассемблер упростить, а не наоборот.
Что вы тут срётесь, в C главное переносимость и унификация записи. Весь C пропитан унификацией, как бы вы ни принюхивались, ничего другого здесь нет.
>>1179575Моца цопе!
>>1179575> переносимостьЛол. Вырастешь большой - поймешь, что Си - один из самых плохо переносимых языков. В то время как код на каком-нибудь Python заработает на новой машинке без модификаций, в Си тебе придется обмазать его толстым слоем ифдефов, и он все равно где-нибудь упадет.> Весь C пропитан унификациейC пропитан неопределенным поведением, ты перепутал. Тту даже принюхиваться не нужно.
>>1179586тут-туру
Аноны, не по теме конечно, но есть у меня код просто нереально простого чатобота на js, куда бы его разместить? Могу на си портком сделать.
>>1179588Именно. Запускаешь такой свой хелловорлд на DSP с CHAR_BIT=16, и видишь, как твои бананы медленно превращаются в желе.
>>1179586>каком-нибудь Python заработает на новой машинке без модификацийСляжет от версии Питуна, истину глаголю.
>>1179593Есть лишь один истинный питон, и он третий. Поставишь оба.
>>1179592А ты я смотрю умный. Скажи, вот я хотел вебкамеру подключить например к своему хловоролду, но не вкурю, что куда прописывать? Это целый будапешт. Я видел как чувак трёхмерные движки пилит за пол часа, а сам как бы и простейшего не умею, гугл представляет собой лютый пиздец из мешанины hwnd, которые мало того что хуй знает как использовать, так ещё и не найти описания более подробного чем - "это int32, содержит номер окна", это же пиздец. Нет ли бибилиотеки реализующей всю это пвсеводнизкоуровневую хуету искаропки, чтоб вызвал функцию takeFrame(WRBCAM_0, buf, 32, 32); и получаешь заветный кадр в виде массива байт, или это утопия?
>>1179596>Я видел как чувак трёхмерные движки пилит за пол часаМожно ссылку?
>>1179596OpenCV, Qt и прочее
>>1179611Это не на ютубе дебич, а настоящий человек.
>>1179596> Нет ли бибилиотеки реализующей всю это пвсеводнизкоуровневую хуету искаропкиВообще, сейчас модно брать OpenCV и не думать. А так, в винде с камерами вообще плохо, нужен COM, и дальше есть всякие-разные варианты ебли со всякими DirectShow или WIA. Но есть старый, "неподдерживаемый", но тем не менее рабочий и простой метод: https://msdn.microsoft.com/en-us/library/dd757677%28v=vs.85%29.aspx Там буквально несколько строк:создаешь окно capCreateCaptureWindow, шлешь ему WM_CAP_DRIVER_CONNECT, WM_CAP_FILE_SAVEDIB, WM_CAP_DRIVER_DISCONNECT и потом ебешь полученную .bmp как тебе угодно. Можно обойтись без .bmp, там можно установить колбеки на фрейм и т. д.> "это int32, содержит номер окна"Но это действительно номер окна, и это не обязательно int32, это struct HWND *, и тебя не должно ебать, что там внутри. Это вполне нормальный сишный интерфейс, когда либа работает с указателем на incomplete-структуру, и сама она может обращаться к ее полям, а юзер видит только непрозрачный указатель (хэндл).
>>1179612Даже жопнцв пока прикрутишь..
>>1179615ленивая жопа, бери йобареколер, который тебе фреймы будет кидать в папку и считывай от туда своим хелоувердом не забывая удалять
>>1179619>йобареколеррекодер
>>1179614>>1179619Ты не понял моего бугурта. Вот есть структура - про неё много чего написали, но упомянуть что она мне нахуй не нужна, забыли.А я блядь ебусь и 3 дня читаю гугл как эту структуру заполнять, где брать, куда объявить и т.д., чтобы узнать от онона, что эта хуйня может просто висеть где то там и напрягаться по её поводу моветон.
>>1179623Вот надо тебе окно - получай ебалу с гибкими настройками вместо #include vsyaHuinya.h createwindow("заголовок",x,y,w,h);И у винды это ещё по божески, GTK это вообще пиздец.
>>1179624Чувство такое что проектировалось это умными, но наглухо отбитыми придурками и не для людей.
>>1179623кокая структура? может это она тебе не нужна. но винапи говно, это да. вне контекста задачи, твой бугурт нищитовый.
>>1179623> А я блядь ебусь и 3 дня читаю гуглЗачем читать гугл, когда можно читать документацию? Цитата из MSDN:> Window Handle> After creating a window, the creation function returns a window handle that uniquely identifies the window.> A window handle has the HWND data type; an application must use this type when declaring a variable that> holds a window handle. An application uses this handle in other functions to direct their actions to the window.Просто RTFM и все.
>>1179626проблема гтк в том, что они хуярят в ооп стиле на си. шли бы путем тикла.
>>1179630Не вижу ни слова про то что можно неиспользовать эту ебалу. Читал я msdn, затем метался в гугл из за таких же строк, что мол так и так используй это и это, а где взять - а хуй его знает, начинай с первой страницы msdn, вдруг встретишь.
>>1179632Есть у меня одно тёплое воспоминание о GTK, это cairo. Вот уж API проще не встречал, всем бы на него равняться.
>>1179634есть джва тома книжек про погромирование под вындовс 95 на винапи, читай, они актуальны, там все разжовано. настоящие погромисты на столько круты, что ответов на их вопросы в интернете нет.
>>1179596https://pastebin.com/kp4EaUgc вот тебе минимальный пример. Он говно по многим причинам, но из этого уже можно что-то слепить и/или перейти на нормальный метод когда-нибудь позднее. Компиляция: gcc file.c -luser32 -lavicap32, в студии аналогично (user32.lib, avicap32.lib).
Вот отличный пример. Берём эту инструкциюhttps://msdn.microsoft.com/en-us/library/dd757677%28v=vs.85%29.aspxОткрываем первую страницуhttps://msdn.microsoft.com/en-us/library/dd797847(v=vs.85).aspxИ сука таки ни единого слова про подключаемые заголовочные файлы, ни слова в примере вызова функции про то что из себя представляют fOK, hWndC, WM_CAP_DRIVER_CONNECT, где лежат и чего значат.Теперь второй пример.cairographics.org/manual/Открываем документациюhttps://www.cairographics.org/documentation/Первая же страница начинается с лаконичного примера, в котором всё понятно без hWndCdolboёbоvhttps://www.cairographics.org/FAQ/#getting_started
>>1179647>И сука таки ни единого слова про подключаемые заголовочные файлыhttps://msdn.microsoft.com/en-us/library/dd756879(v=vs.85).aspxнаркоман, уходи.
>>1179646Вот пример минимальный, в котором хотяб понятно где int.; Example of making 32-bit PE program as raw code and dataformat PE GUIentry startsection '.text' code readable executable start: push 0 push _caption push _message push 0 call [MessageBoxA] push 0 call [ExitProcess]section '.data' data readable writeable _caption db 'Win32 assembly program',0 _message db 'Hello World!',0section '.idata' import data readable writeable dd 0,0,0,RVA kernel_name,RVA kernel_table dd 0,0,0,RVA user_name,RVA user_table dd 0,0,0,0,0 kernel_table: ExitProcess dd RVA _ExitProcess dd 0 user_table: MessageBoxA dd RVA _MessageBoxA dd 0 kernel_name db 'KERNEL32.DLL',0 user_name db 'USER32.DLL',0 _ExitProcess dw 0 db 'ExitProcess',0 _MessageBoxA dw 0 db 'MessageBoxA',0section '.reloc' fixups data readable discardable ; needed for Win32s
>>1179647> И сука таки ни единого слова про подключаемые заголовочные файлыВ MSDN обычно есть about/using/reference. В about тебе рассказывают, что это такое, как оно работает, нахуй оно нужно, и что вообще существует, в using гайд с примерами, а в reference как раз все описания. Обычно оно все очень сильно перелинковано, но как я уже говорил, технология старая, еще из 95 винды, поэтому ссылок мало. Вот тебе референс про connect:https://msdn.microsoft.com/en-us/library/dd743891%28v=vs.85%29.aspx
>>1179651>https://msdn.microsoft.com/en-us/library/dd743891%28v=vs.85%29.aspxСпасибо кончено. Но я наверное просто не создан для всей этой залупы. Мой уровень это purebasic, не более, всё что сложнее просто перегружает мозг.
>>1179653Моя ссылка недостаточно правильная. Вот тут >>1179649 про макрос, он проще для понимания.
Эх щас бы в 2К19 винапи ковырять...
>>1180787Чому ни? Загугли nirsoft, я когда вижу эти охуенные утилиты весом пару десятков килобайт, но с UI и мощным функционалом, аж трясет от восхищения за того программиста, кто это все дело пилит.
>>1180787Эх, щас бы в 2K19 дотнетоговно напрямую с ядром работало.
А в чем разница между char * = "huj" и char[] = "huj";
>>1181147Второе работает?
>>1181149
>>1181147https://wandbox.org/permlink/Jsv48iUs3doqZInT
>>1181147char*: создает указатель, который указывает на литерал, лежащий в секции данных. Ты можешь изменять сам указатель, но не можешь писать по указателю - строковые литералы ридонли.char[] создает массив достаточного размера, чтобы скопировать в него литерал (и копирует его туда). Так как это массив, то ты, конечно же, можешь изменять содержащуюся там строку.
Чем си может быть лучше плюсов в 2к17?
>>1181196Си можно выучить на приемлемом уровне менее чем за 10 лет. При этом ты будешь знать, что происходит в коде, а не предполагать.
>>1181198А где его сейчас используют? (Кроме GNOME(Слава XFCE)
>>1181200ОС, либы, embedded, прикладной софт тоже иногда.
>>1181196Жрет меньше ресурсов. Это критично для встраиваемых систем.
>>1181205Плохой аргумент. На крестах все еще можно писать в си-стиле.
>>1181215Ты когда-нибудь программировал микроконтроллеры, где килобайты рам можно по пальцам пересчитать?
>>1181226Конечно. Ты понимаешь, что g++ и gcc выдадут тебе идентичный код, если ты не будешь использовать в крестах многие крестовые фичи? При этом ты можешь, продолжать пользоваться теми фичами, которые на код напрямую не влияют, а жизнь проще делают.
>>1181234Ну хз, у нас все на си ваяют. Возможно потому, что проще потом лицензировать (авионика), а не из-за возможностей языка.
>>1181238Так я об этом как раз и сказал выше - стандарт в разы меньше, вариантов хитровыебанного поведения меньше, осилить проще и проверить проще.
>>1181189Стоит дополнить, что в первом случае можно изменять сам указатель, а во втором имя массива является константой.
>>1181239>стандарт в разы меньшеКак будто ты его хоть раз открывал
>>1181363>имя массива является константойЧто ты хотел сказать этим набором слов?Имя целочисленной переменной тоже является константой. Или ты можешь показать код, который переименовывает целочисленную переменную?
>>1181189> строковые литералы ридонлиНе нашёл такого в 6.4.5 String literalsГде это написано?
Посоветуйте справочник для winapi.
>>1181428Советуем справочник для winapi.
>>1181429Он мне не нравится.
>>1181429Cпасибо!
Как врубить поддержку кириллицы в спермянской консоле? Использую GCC.
>>1181366Он имел в виду, что можно ptr++, но нельзя array++, т.е., массив можно рассматривать как константный указатель на его первый элемент.>>1181369> Где это написано?Именно там и написано. Второе предложение логически вытекает из первого, и хотя в большинстве компиляторов в целях совместимости с говнокодом есть возможность "отключить" этот абзац, проще считать строковые литералы константами:> It is unspecified whether these arrays are distinct provided their elements have the> appropriate values. If the program attempts to modify such an array, the behavior is> undefined.>>1181428MSDN, можно старенький и оффлайновый мануал из Platform SDK для XP/2003 - им удобнее пользоваться, но там нет некоторых новых фич.>>1181443Сохраняй исходник в UTF-8, собирай с -fexec-charset=866, потом когда-нибудь научишься делать правильно (возможно, в CRT и консоли винды к этому времени как раз появится полноценный UTF-8). Можешь собирать без -fexec-charset, но запускать в помершелле, он умеет в UTF-8 после chcp 65001. Можешь поставить себе ConEmu, он тоже в UTF-8 может.
>>1181443В нотепаде++ пишешь исходник в CP866
>>1181604Бу! Сгинь!
[CODE]#include <stdio.h>int main(void) { char b[] = "БB"; printf("%x\n", b[0]); return 0;}[/CODE]Почему распечатывает ffffffd0? Почему бы не 000000d0?
>>1181443chcp 1251 - кодировка Windowschcp 65001 - кодировка UTF-8Иногда требуется выбрать для консоли другой шрифт.
>>1181608Потому что char у тебя signed, а char в выражениях, а так же в аргументах variadic-функций подвергается integer promotions: (signed char) 'Б' превращается в (signed int) 'Б', старший бит стоит, значит оно отрицательное, происходит sign-extension, т.е., знаковый бит дублируется влево на всю ширину переменной. Хочешь получить d0 - делай (unsigned char) b[0] (promotion никуда не денется, но будет zero-extension, т.к., unsigned char) или или b[0] & 0xff (promotion опять же никуда не денется, но будет сделано еще для оператора &, получится (0xffffffd0 & 0xff), в результатае посчитается красивый (int) (0xd0), который уже промоутить не нужно, он и так int).>>1181609> chcp 65001 - кодировка UTF-8И тут все виндусы кроме свежих билдов десяточки скажут "ой" при попытке вывести кириллицу.
>>1181608Потому что char - это знаковый тип, где русские буквы это отрицательные числа.Используй unsigned char b[] = "БB";Или так: printf("%x\n", b[0] & 0x00FF);
>>1181610>И тут все виндусы кроме свежих билдов десяточки скажут "ой" при попытке вывести кириллицу.Проверил на Windows 7 с шрифтом Lucida Console:#include <stdio.h>char utf8text[] = {0xD0, 0x90, 0xD0, 0x91, 0xD0, 0x92};int main(void) {printf("%s\n", utf8text);return 0;}С chcp 65001 выводит "АБВ".
>>1181443Кури про wchar и wprintf, нехуй ебаться с кодировками (методы советуемые на форумах работают от раза к разу) правда setlocale все равно надо использовать зато без ебли с настройкой консоли. Либо, если лень писать L перед каждой строкой, то в венде можно пользоваться нестандартной библиотекой tchar.h ну это уже сам кури.
>>1181629>L перед каждой строкойНе советую, в одной проге из-за этого долго пришлось править несовместимость (GCC в Linux использовал 4-байтовые символы Unicode, Visual C++ в винде - 2-байтовые). Нужно применять UTF-8 везде.
>>1181443>врубить поддержку кириллицы в спермянской консолено зачем?
>>1181626А у меня выводит:> АБВ> ВА вместо "Привет, мир!" выводится, например, пикрелейтед. И это тоже 7 со шрифтом Lucida Console. А стабильно оно только с десяточки работает.
>>1181605Зато работает
>>1181766-fexec-charset работает совершенно таким же образом, только не вынуждает хранить исходники в древней кодировке, создавая проблемы с IDE и системами контроля версий.
>>1181738Первый раз такое вижу. Обычно либо выводит русские буквы, либо квадратики.И с chcp 1251 такое же?У тебя какая-то сборка от васяна.
>>1181812C chcp 1251 ок или крякозябры, в зависимости от кодировки выводимых байтиков. Винда - чистая тестовая виртуалка. Более того, с chcp 65001 и WriteFile, к которому сводится твой printf, и WriteConsoleA иногда (а на XP - всегда) фэйлятся и не выводят вообще ничего, поэтому приходится идти длинным (зато надежным) путем. Делается кастомный yoba_printf, который с помощью MultiByteToWideChar преобразует UTF-8 в UTF-16, который уже выводит с помощью WriteConsoleW, и вот с UTF-16 проблем никаких нет, вне зависимости от кодировки, выставленной chcp.
>>1181818>Винда - чистая тестовая виртуалка.А, тогда ясно. Нужно ставить Microsoft Visual C++ redistributable package.На древней msvcrt.dll могут быть любые аномалии. Она родом с XP, где UTF-8 нормально не поддерживался.В десятке видимо обновили.
>>1181824А CRT-то каким местом? Тут же нет разбора строки - %s просто копирует символы в stdout пока не встретит \0, а stdout сводится к _write, а _write к WriteFile. Вот если бы я toupper делал или strtok какой-нибудь, или хотя бы %.2s, тогда да, CRT могла бы что-нибудь испортить.Но ты меня заинтересовал, попробую отладить когда-нибудь и посмотреть, почему такое поведение. Ты чем собирал? Студией?
>>1181824И да, msvcrt - дефолтный рантайм Visual C++ 98, оно же VS6.0. Ее, конечно, обновляли, но родом она еще из маздая.
>>1181603> Он имел в виду, что можно ptr++, но нельзя array++, т.е., массив можно рассматривать как константный указатель на его первый элемент.:facepalm:>> Где это написано?>Именно там и написано.Да, чёт проглядел.
>>1174146Почти.
Дайте идею для проекта небольшого на си.
>>1182057Рыбья головёха?
>>1156306 (OP)Есть кто с мгу? Слейте лабы по с/с++ с меня как обычно
>>1182059Рыбья голова)
Посоны, а что, шланг до сих пор не обзавёлся своим crt? Почто он гццшные crtbegin.o и libgcc требует?
Антоны. Я сделал прогу на winapi, которая должна была менять курсор на рожу моего бати, чтобы его выбесить. Но курсор вовсе пропал и не появляется даже после перезагрузки. Что не так, пиздец.
>>1182173Ты приёмный.
>>1182079Не обзавелся, не вижу в этом ничего плохого.>>1182173Так сходи в панель управления и выставь стандартный, чего ты от нас-то хочешь?
>>1182175>управления Не работает даже так.
>>1182174Поржал всем офисом)
Есть еще те кто использует #pragma pack?
Антоны, если я объявлю в структуре подряд несколько переменных, то они будут распологаться подряд, а если я объявлю их просто внутри функции main(), то их может раскидать по памяти?
>>1182291Да. Упакованные структуры иначе не опишешь.>>1182305Да, переменные компилятор может раскидать (в пределах кадра стека, ествественно, если они автоматические), сдублировать, положить в регистры или вовсе удалить.
Зачем нужны битовые поля?
>>1182329Некоторые люди не могут в побитовые операции, битовые поля проще, удобнее и иногда даже быстрее.
Мне нравится Windows API.
Мне нравится JavaScript.
Я ем говно.
Сап, двач.Пишу программу занимающуюся посимвольной обработкой строк. ОС Linux, компилятор GCC, кодировка UTF-8.Если в строке есть многобайтовые символы, то перед обработкой перевожу строку в wchar_t. Столкнулся с проблемой при обратном переводе в char: не могу найти функцию из стандартных библиотек, которая принимает строку типа wchar_t и возвращает количество байт, которое нужно выделить для записи этой же строки в char. Статическая длина строки отпадает сразу, так как длина входной строки может быть совершенно любого размера.Есть такая функция в стандартной библиотеке и как называется? А то может я и ищу то, чего нет.
>>1182768вроде нет, поскольку я велосипедил подобное сам, но там легко и реализаций миллиардhttps://github.com/JeffBezanson/cutef8/blob/master/utf8.c
>>1182779Знаю, что легко, но хотел найти какой-то общий стандарт, чтобы не пилить велосипеды. Если нет, то напишу сам.
>>1182768А чем переводишь? wctomb говорит, сколько символов нужно - просто просуммируй результаты. Но велосипед будет быстрее.
>>1182768Алсо, я бы на твоем месте не выделывался. Длиннее 4 байтов один code-point не занимает. Если у тебя суррогатные пары уже лежат в одном 32-битном wchar_t, тогда два раза по 4 байта на символ максимум. Выделяй сразу столько, точно влезет, и не нужно будет заниматься бесполезными подсчетами.
>>1182792wctomb, вроде бы, каждый символ отдельно передавать нужно. Я пробовал wcstombs, но он мне постоянно -1 на выход даёт, если в строке есть кириллический символ. Почему так, я разобраться не смог.>>1182795Тоже вариант. Если нет стандартной функции, то либо так сделаю, либо велосипед накидаю.
>>1182768>>1182803Решил проблему.Работу wcstombs я проверял в отдельном файле и забыл вызвать setlocale, поэтому он выкидывал -1 мне. При setlocale (LC_ALL, "") вызов функции wcstombs (NULL, str, 0) возвращает нужное количество байтов для строки в utf-8.
выручай ссач, пишу я такой прогу на си, ну и вызываю функцию sqrt() с аргументом. Начинаю конпелить, а конпелер ругается мол undefined reference to `sqrt'. Дело в том что при передаче в качестве аргумента обычного числа все нормально конпелится и возвращает квадратный корень, то что нужно. однако если в кчестве аргумента передается имя переменной или элемент массива конпелер выводит undefined reference to `sqrt'. выручайте я дно. Кстати ос ubuntu
>>1183093НаркоманияПроверь наличие <math.h>
>>1183093Алсо, тебе эту ошибку, случаем, не линкёр выводит?Сделай -lmath
>>1183095math.h имеется
>>1183093-lmдовун
#include<stdio.h>#include<math.h>main(){ float b=4; float a=sqrt(b); printf("%.1f",a);}
>>1183106gcc -lmдовун
>>1183096> -lmath-lmдовун
>>1183107и шо бэлэтб
>>1183110Обосрался
>>1183110Ди в ньюфаг-треддовун
>>1183110gcc -lm c.c
>>1183112заебал скажи че сделать чтоб робило
все равно
>>1183116gcc c.c -lm
>>1183117бля отдуши чувак. объясни плиз нахуя это нужно было прост в винде такого я не добавлял
>>1183118В винде вся математика в CRT, в той же либе, что и printf и т. д., и она прилинковывается автоматически, по умолчанию. В линуксах отдельно, у них принято делать жизнь максимально неудобной.
>>1183152> В винде вся математика в CRT, в той же либе, что и printf и т. д.И хуй чего выкинешь, все гвоздями намертво прибито.> В линуксах отдельно, у них принято делать жизнь максимально неудобной. Линкуешь только то что нужно. Принцип разделяй и властвуй на шицо, но спермачи кукарекают что-то про неудобство.
>>118315650мб хэлоуворд, кек.
>>1183156>>1183159У тебя по умолчанию динамическая линковка. Можешь все библиотеки мира подключить, это мало повлияет на размер получившегося файла.
>>1183159В сперме хелловорлд 50 метров? Лол. Ибо у меня в дебиане меньше 4Кб. Целый кластер потратил для теста, ёк макарёк.
>>1183161>все библиотеки мира подключитьИ соснуть с переносимостью. Статическая линковка рулит.
>>1183172Ну и вали в свою эпоху a.out
>>1183174Валю, я даже Qt статически линкую
>>1183159Хелловорлд в винде 8к, если динамическая линковка. Или меньше 200к, если статическая.>>1183156> Принцип разделяй и властвуйЗачем разделять, если это стандартная библиотека Си? Давай вообще от либ откажемся, будем линковать printf.o и malloc.o каждый отдельно.> Линукешь только то что нужно.На самом деле для выбора "что нужно" придуманы линкеры.
>>1183219> от либ откажемся, будем линковать printf.o и malloc.o каждый отдельно.Уууууу чо удумал, это ты насаждай в мастдае дистрибьюцию в предкомпилированных файлах. Нам исходники голые подавай, а мы уж как нибудь сами скажем компилятору с чем собрать программу. Усёк, гаврюшенька?
>>1183219>Или меньше 200к, если статическая.Рантайм не забудь скачать и установить
>>1183118>объясни плиз нахуя это нужно было прост в винде такого я не добавлял "так сложилось исторически"
Может ли Rust заменить Сишку? Избавляет от кучи проблем с памятью, соответственно багов и дыр в безопасности меньше
>>1181147Разница чисто визуальная.
>>1183235Нашёл чем гордиться. Шо то хуйня, шо это хуйня. Надо иметь статические бибилиотеки на каждую функцию и линковать автоматически, ато развели ебалу."кококо хочу подключаю хочу неподключаю" - Ты же и так знаешь что подключить придётся, по тому что ты функцию используешь в коде, а не по тому что у тебя гибкая система настроек и свобода действий.
>>1183346В ньюфаг-тред шагом марш!
можно вместоgcc c.c -lmпейсатьgcc -O2 c.cТогда sqrt вместо вызова функции будет реализован инструкциями копро-цессора, на месте.-O1, -Os и -O3 тоже подойдут.
>>1183531Но это не гарантировано. Так что лучше -lm
Почему вы до сих пор не перекатились в энтерпрайз на какой-нибудь джаве? Неужели вам так нравится железо, что готовы получать в 2 раза меньше, при чём прикладывая больше усилий? Я бы так не смог
>>1183265Да я лучше в дворники пойду, чем в интерпрайзы на джавах.
>>1183110Убунтодебил, уходи.
>>1183603Я стал php-developer.
Анончи, напомните как называется версия майкрософтовского конпелятора без ИДЕ?
>>1184720Visual Studio Build Tools, ставится через инсталлер обычной Visual Studio.
>>1184727Вангую, студия мне говна всякого наставит, а я чистое хочу, как 2015 тулс.
Господи я отпишусь в этом треде. Си - Бог всех языков. Лично я учил Си по Великой книге K&R. Задает вам навык программирования на всю вашу жизнь. Воистину, язык Богов.
>>1184778Си — ненужное говно без задач.
>>1184793Борщеязычки говно без задач, а на сишке весь мир держится.
>>1184778Двачую этого дZенствующего.
>>1184755Окей, ставишь билдтулзы с говном на виртуалку, забираешь оттуда PSDK и компиляторы. Профит.
Помогите разобраться с массивом указателей. Почему данный код работает корректно, выдавая пользователю на экран нужные сообщения? int num; scanf("%d", &num); char* errors[] = {"first", "second", "third"}; printf ("%s", errors[num]);В приведенном выше куске кода, если я инициализирую num как 0, 1 и 2, то получаю сообщения "first", "second" и "third", соответственно. Почему? Как я понимаю, чтобы сообщения выдавались, необходимо в printf'е делать разыменование errors[num], то есть добавить звездочку.Сейчас попробую объяснить, как я понимаю массив указателей: В данном случае мы имеем массив указателей errors. В массиве errors хранятся 3 указателя на тип char, которые указывают на массивы из слов. Ниже представлен простенький рисунок. 14, 15 и 16 в ячейках errrors - это, грубо говоря, сами указатели. Соответственно, в приведенном коде выше, когда мы, допустим, printf'аем errors[0], должно выводится 14 (правда, формат в printf'е стоит "%s", но не так важно), однако, как уже сказал, на экран выводится first. Почему? Мб, я как-то неправильно понимаю?
>>1184987Давай разберемся, что такое errors.Errors - это массив указателей на char. Принтф получает на вход УКАЗАТЕЛЬ НА char, и обрабатывает егоименно так (у тебя там %s же, это важно!). Поставь там %i какой-нибудь и получится число.
>>1184778Ну есть в сишке указатели-хуятели и дальше чё? Как ебля с указателями и освобождением памяти прокачает мой скилл в программировании в общем?Ну вот я джавист, прочитал недавно K&R и Прату чисто в академических целях. Никак я свой навык не улучшил. Углубился в старину, посмотрел как писали раньше проги и всё.Ты просто студент без реального опыта работы, который потратил какое-то время на сишку, в отличие от своих друзей, которые дрочили питон какой-нибудь, и возомнил себя ебать гуру.Решают структуры данных, алгоритмы, архитектура. Твоя сишка нахуй не нужна для навыков. Сишка в современном мире - крайне узкоспециализированный язык. Изучать её нужно либо для конкретной работы, либо полистать пару книжек для экскурса в историю. Всё, больше Си тебе ничего не даёт. Это просто изкоспециализированный инструмент.
>>1185071>я джавистДальше не читал. Иди дальше абстрактные фабрики абстрактных билдеров пиши, чмоха.
>>1185073Как же байтослесари триггерятся на джаву)))) Я всё понимаю, потратить на обучение в 3 раза больше времени, и получать в 2-3 раза меньше - конечно это обидно. Остаётся только писать на двачах, что Си - это ебать орудие Богов.
>>1184987> чему? Как я понимаю, чтобы сообщения выдавались, необходимо в printf'е делать разыменование errors[num].Упускаешь, что [ ] сам делает разыменовывание. Смотри: ∗errors - это адрес (указатель на) массива first, правильно? И далее ∗(∗errors) или ∗∗errors - это разыменованный массив first, т.е., символ 'f', но это к делу не относится. А errors[num] это сахарок, полный аналог которого ∗(errors + num), где арифметика - адресная, т.е., errors + 1 = адрес errors + размер одного указателя, а errors + n = адрес errors + размер указателя ∗ n. И потом ∗(...) этот адрес разыменовывает, и ты получаешь адрес строки.> cоответственно, в приведенном коде выше, когда мы, допустим, printf'аем errors[0], должно выводится 14> правда, формат в printf'е стоит "%s", но не так важноСделай %p и получишь свои 14, потому что %p просто берет аргумент arg и формирует текстовое представление указателя: можешь считать, что оно аналогично printf("%x", (unsigned long) arg).А %s берет свой аргумент arg, считает его указателем, и разыменовывает его: делает ∗(arg), ∗(arg + 1), ∗(arg + m), пока не найдет символ \0. Ну и выводит полученные символы, конечно. Поэтому ты видишь текст, а не число.
>>1185053>>1185101А, да, все верно. Перечитал ваши сообщения и понял, какой странный и глупый вопрос я задал, учитывая то, что понимаю, как это работает. Вот к чему недосып приводит. Хотя сам я почему-то минут 40 сидел над рисунком и все никак не мог понять
>>1185101>А %s берет свой аргумент arg, считает его указателем, и разыменовывает его...Вот, теперь точно понял, что именно меня вводило в заблуждение. Я раньше не знал (или не задумывался), что %s разыменовывает указатель. Теперь все точно ясно. Вопрос закрыт. Чуть головой не поехал
>>1156306 (OP)https://pastebin.com/tMRF7673ребят посмотрите код плиз , у меня вопрос , можно ли передать в функцию указатели , так что бы по такому выражению она выделила память ,просто если вставить этот кусок (array = (double@@)malloc(sizeof(double@)@ROW);)в функцию, он отработает , но выдаст ошибку сигментации
>>1185167Не совсем понятно, чего ты хочешь. У тебя в текущем виде программа должна более-менее работать. Хочешь переместить выделение памяти в input_date? Тебе придется тогда как-то вернуть массив. Например, передавать double ∗∗∗array_ptr и после маллока делать ∗array_ptr = array. Или просто возвращать из функции double∗∗, делая return array, а аргумент убрать просто.
>>1185174аааа, понял спасибо , а программа и так хорошо работает
У меня есть указатель void ∗ptr на массив из структур smth.У меня есть sizeof(smth).Как надёжно попасть на i-ый элемент массива?Я же не могу просто сделать так: smth_tmp=∗((char ∗) ptr+sizeof(smth))верно?
>>1185424> smth_tmp=∗((char ∗) ptr+i*sizeof(smth))
>>1185424> Я же не могу просто сделатьМожешь, только левая звездочка там лишняя. Ты либо:smth foo = ∗(smth ∗) ((char ∗) ptr + ...);либоsmth ∗bar = (smth ∗) ((char ∗) ptr + ...);Но лучше скастить к указателю на smth и прибавить i:smth foo = ((smth ∗) ptr);smth ∗bar = (smth ∗) ptr + i;
>>1185428Я структуре присваивал, а не указателю, я просто типа не написал. Оттого и левая звздочка, спасибо.
>>1185428Алсо, в моём случае функция не будет знать типа, т.е. ей передадут только size_t от sizeof(given_type). Так что способ один для меня применим, в отличие от второго.
Как передать во функцию аргументом, безымянный массив?void foo(...,float c[3]){...} ==> foo(...,{1.0f,1.0f,1.0f}); - вроде раньше так делал, а сейчас забыл.
>>1185769Тип забыл. К чему литерал-то кастить? Вот так:foo(..., (float[3]) { 1.0,f 1.0f, 1.0f });
>>1185782О точно! Благослови тебя Сибог
Можете посоветовать годный компилятор для 16 битного real memory mode?
>>1186348Любой. Они все говно. Я предпочитаю борланд, можно ватком, но ватком - это целый свой мирок со своими закидонами.
>>1186365Ну мне хотя бы чтобы работало. В gcc с флагом на 16 бит будет не то?
>>1186367Я вообще не знал, что оно умеет в 16-битный код. Будет не совсем то - с 32-битными регистрами, вон даже какой-то MMX проскочил с -O3. Но запуститься - запустится, наверное. А что за задача у тебя? Тебе точно нужен современный компилятор для ее решения?
>>1186381>А что за задача у тебя?Пишу загрузчик. Мне любой компилятор, главное, чтобы работало.
>>1186384Пиши на асме: читай вторичный загрузчик, переключайся в 32-битный защищенный или нереальный режим и не страдай хуйней. Алсо, прошу прощения за скриншот, там дизасм 32-битный, а код 16-битный.
>>1186388>Пиши на асмеЯ от него ахуеваю. Не понимаю даже чем сегменты от стэка отличаются.
>>1186389На Си ты охуевать будешь гораздо больше. А без знаний о стеке и сегментах как вообще загрузчик писать? Тебе ж этот самый стек настраивать, не говоря уже о дескрипторах сегментов защищенного режима.
>>1186395>На Си ты охуевать будешь гораздо большеНу с указателями проще...
>>1186398В ассемблере у тебя больше контроля. А тут ты будешь ебаться с теми же сегментами, отличать far pointer от near pointer, и заодно ебаться с вызовами BIOS через жопу.> Не понимаю даже чем сегментыfar pointer - это пара 16-битный сегмент, 16-битный офсет (записывается как сегмент:офсет), в реальном режиме все настроено так, что плоский указатель считается как (сегмент ∗ 16) + офсет. В защищенном чуть по-другому, но для защищенного ты выставишь базу всех сегментов в 0, и будешь вообще игнорировать наличие сегментов.> стекuintptr_t stack[4096];uintptr_t ∗stackptr = stack + 4096; // stackptr - это пара ss:(e)sp.// Это делает проц.void push(uintptr_t value) { ∗--stackptr = value; }uintptr_t pop(void) { return *stackptr++; }Больше там ничего нет, в этом твоем стеке.
Вот хочу я передать в функцию функцию.floatinteg(float a, float b, float eps, float (f)()) { float sum = 0.0; while (a < b) { sum += f(a) eps; a += eps; } return sum;}И передаю.floatsquare(float a) { return aa;}res = integ(4.0, 7.0, 0.1, square);Этот код, конечно же, не работает, в res записалось чёрт-те что.Чтобы он правильно работал, надо указать float (f)(float).А если я хочу передавать функцию с неизвестным заранее числом аргументов?
Вот хочу я передать в функцию функцию.floatinteg(float a, float b, float eps, float (∗f)()) { float sum = 0.0; while (a < b) { sum += f(a) ∗ eps; a += eps; } return sum;}И передаю.floatsquare(float a) { return a∗a;}res = integ(4.0, 7.0, 0.1, square);Этот код, конечно же, не работает, в res записалось чёрт-те что.Чтобы он правильно работал, надо указать float (∗f)(float).А если я хочу передавать функцию с неизвестным заранее числом аргументов?
Надо переписать одну прогу с использования graphics.h и 16 бит под современные ОС. Пока думаю над использованием WinAPI для рисования, перехвата стрелок/Fn и прочего. Какие подводные? Алсо, еще надо одну программу с Паскаля так же переписать, но там проблем ожидается поменьше.
>>1186675> Этот код, конечно же, не работает, в res записалось чёрт-те что.Сравни с float square(double a), прочитай про default argument promotions. Алсо, своими пустыми скобками ты отключил контроль типов при вызове функции, готовься к сложно отлавливаемым багам.> А если я хочу передавать функцию с неизвестным заранее числом аргументов?Это крайне хуевая идея. Хотя бы потому что integ это количество аргументов знает (иначе не сможет вызвать f), f количество аргументов знает, а значит тебе никто не мешает правильно задекларировать свою f и не выделываться.Если ты хочешь странного (а вы тут все хотите странного), посмотри в сторону функций с переменным количество аргументов, как printf, например. Сделай механизм детекта количества и типа аргументов в рантайме: stdarg.h, va_list, va_arg - вот это все.>>1186696> Какие подводные?Если собираешься переписать только graphics - поебешься с циклом обработки событий, наверняка придется городить еще дополнительные doevents() в самых неожиданных местах. В целом, это достаточно быстро все портируется. Если собрался переписывать саму прогу, то подводных никаких, но это дольше.
>>1156306 (OP)Работа есть? Смогу прогать мк на военном предприятии? А может быть даже смогу работать дома?
>>1186920Работа есть, крупные города или не эта страна. Про удаленку и не мечтай. К околовоенным не суйся, у них на строчку кода десять страниц пояснений и согласований.
>>1186920Работы вообщем-то дохуя и больше. Все серъёзные фреймворки так или иначе имеют высокопроизводительные части, работающие на C. В эпоху опенсорса все лежит на гитхабе. Увлекайся, разбирайся, форкь, улучшай и тебя рано или поздно позовут работать в буржундию или на удалёночку.
Насколько всирают всякие кодогенераторы для кортексов чисто сишным прогам?
>>1187210Генераторы чего и из чего?
>>1156306 (OP)Друзья, вощем не могу придумать алгоритм решения задачи: есть дерево с файлами и .txt, на вход функции дается корень, каждый .txt содержит символическую(ие) ссылку(и) на другие файлы того же дерева, или тупик, или приз.Нужно найти путь к призу.Сразу понятно, что нужно рекурсивно пройти дерево файлов, а вот как обрабатывать *.txt?мб кто-нибудь встречался с подобной задачей?
>>1187212CubeMX тип
>>1187227Так оно инициализацию генерит, вот тебе не похуй, какой там код.
>>1186675указатель на функция гугли. Берешь инициализируешь как переменную указатель int (*fun)(int , int);при этом у тебе описана функция с такими же аргументами int function(int a, int b){return a+b;}теперь просто передаешь указателю функцию :fun=function;теперь можешь как аргумент пихать указатель.> А если я хочу передавать функцию с неизвестным заранее числом аргументов?если несколько аргументов то <stdarg.h> поможет
>>1187232А мусорные переменные-то зачем создавать? Он вон напрямую передает, как человек, а ты какую-то бесполезную ебанину советуешь.
>>1187235не заметил я просто, саня хуй саси
>>1186893А если указывать указатель на указатель на функцию?Число аргументов всё так же требуется?
>>1187386Описание аргументов требуется не потому, что нехороший Си запрещает указатели на функции с неизвестными аргументами. Просто при вызове функции эти аргументы нужно как-то передавать, а для этого нужно знать их типы, а каким-то другим путем (через астрал?) узнать в рантайме, что вот эта конкретная вызываемая тобой функция хотела первым параметром char вместо int - невозможно. Поэтому Си в таком случае делает лучшее, что он может: определены default argument promotions (например, вместо char будет положен int, а вместо float - double), передаваемые аргументы неявно кастятся к своему дефолтному типу. То же самое делается для необязательных аргументов variadic-функций типа printf - там информация о типах тоже недоступна. Если вызываемая тобой функция именно этого всего и хотела, то все заработает. Если хотела float, а прилетел double - ну ты видел, чем это заканчивается.> А если указывать указатель на указатель на функцию?А какая разница? Проблема не в адресе, а именно в том, как компилятор будет эту функцию вызывать. А так ты мог бы хоть указатель на void передавать, тебе никто не мешает. На самом деле так нельзя: по историческим и архитектурным причинам возможны ситуации, когда указатель на данные и указатель на функцию могут быть численно равны, но указывать на разные вещи. Поэтому кастить между указателями на функцию и указателями на void - это UB, хотя на практике на всех современных распространенных платформах все ок.
>>1187393Очень подробный ответ, спасибо.В общем, такими изворотами лучше заниматься в более приспособленных для этого языках.> Просто при вызове функции эти аргументы нужно как-то передавать, а для этого нужно знать их типы, а каким-то другим путем (через астрал?) узнать в рантайме, что вот эта конкретная вызываемая тобой функция хотела первым параметром char вместо int - невозможноА как в некоторых других языках дело обстоит, не знаешь? Как-то же они умеют и могут в это. Но засчёт чего?>по историческим и архитектурным причинам возможны ситуации,А можешь рассказать поподробней?
>>1187423> А можешь рассказать поподробней?Ну ты даже на x86 можешь написать ОС, которая выставить ненулевую базу сегменту CS или DS так, чтобы физический адрес CS:some_virtual_addr не был (или наоборот был) равен DS:some_virtual_addr. Или вон там кто-то выше про 16-битную сишечку спрашивал - в small-модели памяти near-адреса кода и данных могут совпадать, но фактически код и данные лежат в разных сегментах. Алсо, в некоторых особо упоротых DSP указатели на код хранятся, читаются и присваиваются как physical_addr >> 2.> В общем, такими изворотами лучше заниматься в более приспособленных для этого языках.Я так и не понял, чего ты хочешь добиться. Ты же функцию вызываешь? Значит, ты знаешь, сколько и каких параметров будет. Почему нельзя их в указателе на функцию указать?
>>1187423>Как-то же они умеют и могут в это. Там не явно предается информация о количестве параметров. В Си есть VA_ARG, е еще лучше съеби и не еби господам мозг.
>>1187393>На самом деле так нельзя: по историческим и архитектурным причинам возможны ситуации, когда указатель на данные и указатель на функцию могут быть численно равны, но указывать на разные вещи. Поэтому кастить между указателями на функцию и указателями на void - это UB, хотя на практике на всех современных распространенных платформах все ок.Ну то есть вся абстрактопараша, все питушыные платформы с JIT-компиляцией и GC существуют чисто случайно, потому что авторы компиляторов сишки и плюсов добрые? Охуеть же.
>>1164658>который учил не Си, и не кресты, а некий "си с классами".Сцук, это про меня. Просто практиковаться было интересно на winAPI, литературе часто были примеры с кодом вроде LPTCCONTROLDATA context = LPTCCONTROLDATA)malloc((size_t)sizeof(TCCONTROLDATA)); - что-то вроде, а может и нет, стал уже забывать С с классами - 12 лет не кодил, но зашел в ваш тред понастальгировать после богомерзкого JS-треда с их программированием фреймворков.А ещё тогда полюбил их __try __except
>>1187456>Ну то есть вся абстрактопараша, все питушыные платформы с JIT-компиляцией и GC существуют чисто случайно, потому что авторы компиляторов сишки и плюсов добрые? Типа того, всякие эмуляторы с браузерами напару с операционными системами туда же.По-нормальному запись байтами выполняемого кода в память и последующий вызов оного как функции можно делать онли через вынос этого добра в ассемблер.
>>1187456Именно.Вот такая параша на самом деле UB в сяшке:https://gist.github.com/nickdesaulniers/5299272И на этом UB, считай, построен весь мир. Все мир, карл, может быть в одночасье doomed, и они еще называют сяшку системным языком, хотя ты на сяшке ни одну операционную систему без UB или ассемблера не напишешь.
>>1187423>А как в некоторых других языках дело обстоит, не знаешь? Как-то же они умеют и могут в это. Но засчёт чего?За счет ненативности и рантайма. Рантайм может хранить код как он хочет, компилировать его на лету, хранить различные метаданные, связанные с типами и прочее. Достигается это за счет того что код ненативный и выполняется либо интерпретатором, либо компилируется JIT-компилятором по необходимости со всеми требуемыми проверками во время выполнения. Алсо, тред пора перекатывать.
>>1187480Слишком категорично. Но да, JIT предполагает знание о системе и выход за пределы стандарта Си.
>>1187521 (OP)>>1187521 (OP)>>1187521 (OP)>>1187521 (OP)>>1187521 (OP)
>>1187490А ничего что в этой параше int()() вызывается как int()(int, int)?
>>1187543Ничего. Пустые скобки в Си (но не в крестах) означают, что информация о типах и количестве недоступна. Мы там выше обсуждали.
>>1187838Ничего себе метапрограммирование в крестах. А если у меня эта функция перегружена числом параметров, компилятор разберется и вызовет то что нужно?
Глупый вопрос, но все же спрошу. Допустим, имеется глобальная переменная p = 6;Пишу условие if ((p++) == 7) { ... }В таком случае p будет инкрементировано только в рамках условия if, т.е. p увеличится на 1 и сравнится с цифрой 7, а в глобальном значении останется 6, так? Или же будет инкрементировано на единицу, и уже глобально будет иметь значение 7 во всей программе после проверки условия?
>>1188833> в глобальном значении останется 6, такНе так. Нет никаких рамок условия, есть выражение, и оно вычисляется. Постинкремент меняет переменную, и ему абсолютно похуй, где он сам в это время находится.> p увеличится на 1 и сравнится с цифрой 7Неа. Сначала сравнится, а потом увеличится. Поэтому если p изначально был равен 6, то тело if не выполнится. Но инкремент, разумеется, произойдет в любом случае, поэтому после вычисления выражения в скобках p станет равным 7.Алсо, у нас новый тредик уже >>1187521 (OP).