Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002) Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) "Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов). - http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
>>1518919 (OP) Нужно сохранить файл. Так вот, он сохраняется куда-то в "С:\Documents and Settings\User\Application Data\proga\file.ololo" А надо его сохранить рядом с папкой, откуда exe запускается. Так вот, вопрос: как из строки С:\Documents and Settings\User\Application Data\proga\file.ololo получить file.ololo и как правильно его сохранить так, чтобы путь указать относительный, и относительно папки с программой? Путь содержится в переменной static char Жpath, где вместо Ж - звёздочка, от которой разметка здесь едет.
>>1519065 >Так вот, он сохраняется куда-то Так вот, ты программист или не туда зашел петушок? Файлы не сохраняются сами куда-то, они сохраняются куда ты написал сохраняться.
>>1519154 Я спросил о том, как из полного пути в переменной >const char ☀path = "С:\Documents and Settings\User\Application Data\proga\file.ololo получить file.ololo"; извлечь только имя файла >char ☀name = "file.ololo";
>>1519351 Ну и как правильно сохранить этот file.ololo в папку, рядом с exe-шником. То есть, какой путь относительный должен быть у файла? Ну, там "./file.ololo", или "/file.ololo" или же просто "file.ololo", чтобы оно сохранилось и не выёбывалось мне больше.
Почему эта адская херня компилится, как вы вообще живете сишники? https://pastebin.com/9itmEmmz Правильно лия понимаю что чтобы строки всегда хранятся в переменных под названием "буфер" на топ уровнях? А так же в одном буфере могут лежать разные типы?
>>1519499 >Почему эта адская херня компилится, как вы вообще живете сишники? Ну так это же не жс, а прокладка над ассемблером, понятное дело что тебя в написании подобной хуйни никто не ограничивает. >Правильно лия понимаю что чтобы строки всегда хранятся в переменных Да в каких хочешь храни, лол, нет. >на топ уровнях В скомпилированном бинарнике конечно в отдельную секцию вынесутся компилятором, но в коде — нет. >А так же в одном буфере могут лежать разные типы? Да, вопрос только в том как ты эти типы интерпретировать будешь. Си вообще похуй на подобные вещи, это же ебучий кроссплатформенный ассемблер, для него это всё байтики.
>>1519499 И именно на подобной хуйне, кстати, базируется 80% "сливательных" уязвимостей и просто эксплойтов всего, что торчит в сеть (если например запихать туда снаружи нужное кол-во мусора, то можно получить доступ ко всем внутренним данным, или просто внедритьсвой код). Так что ты теперь у мамки хацкер, поздравляю.
>>1519439 помимо вариадиков, при помощи union ты можешь для одного и того же куска памяти иметь разные представления к, примеру, можно (зная платформу) разобрать вещественное число на мантиссу-экспоненту или как оно там будет представляться или к примеру, представить 64 разрядное целое как 2 32х разрядных или представить пакет в бинарном протоколе как целый кусок памяти или как набор полей или представить битовое поле как целый набор битов, так и как набор битовых полей ну, в общем, наверное, уже понял, все такие применения (помимо эмуляции variant)
>>1519351 > извлечь только имя файла strrchr('\\'), strrchr('/'), выбираешь тот, у которого адрес больше, прибавляешь 1. Если оба NULL, то у тебя уже имя файла без директорий. Можешь сделать то же самое циклом, будет быстрее.
>>1519509 А в чем проблема реализовать? Просто переменные жирные получатся.
>>1519559 > зная платформу > представить битовое поле как целый набор битов И потом начинаются всякие -mms-bitfields. Нахуй. Если ты начал полагаться на то, как именно лежат биты в битфилде - у тебя уже проблема, просто ты о ней еще не знаешь.
> представить пакет в бинарном протоколе как целый кусок памяти А потом ты такой портируешь свой код на мк (сейчас это модно, IoT всякие), а там выравнивание другое сказал бы про endianess, но PowerPC успешно сдох, и эта проблема уже не так актуальна. Пакеты парсят/собирают исключительно struct.field = get_u32() (руками, наколеночной кодогенерацией или какими-нибудь протобуферами). Если ты делаешь не так, у тебя опять же проблема, об которую ты однажды споткнешься.
Поэтому union - это такая хуйня для экономии памяти, не более. Ну еще можно сжав зубы иногда делать type punning (хотя проще -fno-strict-aliasing и скастить кастом).
>>1519576 >А в чем проблема реализовать? Просто переменные жирные получатся. Ни в чём, можно даже и без жирных переменных. Просто получится хуйня на постном масле вместо встроенной в язык конструкции.
>А потом ты такой портируешь свой код на мк Михалыч, ну не хватает мужыкам на заводе работы, ну хуле ты докопался?
>>1519585 > ну хуле ты докопался? Потому что мне недавно дали вот такое: struct smth { ... union { long xxx_offset_in_file; // Лежит в файле. struct something_else ∗xxx_ptr; // Патчится при загрузке. } some_field; ...; }; Эта хуйня записана в файлы (тупо fwrite), формат файлов ломать нельзя, файлы обрабатываются софтом, а софт надо собрать под 64-битную машину (ну 2019 на дворе, пора бы уже). А еще эти юнионы не выровнены. Представляешь, как весело править это говно?
>>1519576 >Если ты начал полагаться на то, как именно лежат биты в битфилде для внутреннего представления в программе - норм понятно что наружу это не должно торчать
>>1519576 >union - это такая хуйня для экономии памяти это стандартная ошибка, считать что union для экономии памяти не для экономии, а для того чтобы представлять один кусок памяти разными способами
>>1519632 > у тебя пожатые структуры будут, без выравнивания Именно. А потом я их читаю там, где выравнивание обязательное, и ко мне приезжает автобус SIGBUS.
> как форматировать ваши ебаные реаллоки Считай размер заранее, переноси аргументы в соответствии со стайлгайдом (обычно после переноса либо просто втыкают дополнительный уровень табуляции, либо располагают аргументы ровно под предыдущими).
>>1519668 >79 Удобно же. Можно лампово кодить в текстовом режиме 720x400 на ЭЛТ. >Считай размер заранее Точно! Как только не пробовал, а эта святая простота в голову не пришла.
Рот ебал ваших макросов с бэкслешами! Вот вам приоритетная очередь, крч... https://pastebin.com/K1E1VmxT Пользуйтесь. За три бакса могу сделать, чтоб PQpop реаллокал обратно.
бляяяяяяя..... это хуета не работает нормально. Чем больше файл, тем сильнее его раздувает после закодирования, а после раскодирования вообще пидорасит не по-детски. 50000 байт еще точь-в-точь восстанавливает, а 100000 уже по бороде. ЧЗХЙНЬСКНХЙБЛДЬ??
>>1519871 Впрочем, я посмотрел еще. > невозможно с первого раза правильно написать хафмана
Знаешь, чем linked list от дерева отличается? И как это связано с тем, что выхлоп вот этой маленькой, но очень известной программы сжимается неверно, даже если исправить предыдущую проблему?
#include <stdio.h> int main(void){int a=0,b=1,n,i;for(i=34;i--;){n=a+b;a=b;b=n;while(n--)putchar('Q'-i);}}
>>1518919 (OP) Аноны, подскажите по вопросу. Как правильно делать проверку переменной на превышение ее максимального значения. Например длинну массива или некий счетчик.
Я всегда пишу <= >= < > Но часто в другом коде встречаю ==
И решил задуматься почему. Мой вариант позволяет в некоторых ситуациях программе нормализоваться после сбоя и или будет иметь повторяемое поведение. С другой стороны, теоретически существуют ошибки, которые могут остаться незамеченными и их отлов будет пиздецовым гемороем.
В то же время срыв == ведет к UB и с одной стороны максимизирует ошибку, с другой дебаг подобной херни может тоже быть проблемным.
>>1519880 так, эта штука пишет символы от '0' до 'Q': '0' - fibonacci1 раз '1' - fibonacci2 раз и т.д. С таким распределением получается 0 01 001 0001 00001 000001 ... Ладно, в худшем случае придется за раз класть больше 32 бит. Я предусмотрел 64, но надо бы 256. Фиксится как нефиг делать, и у меня другая проблема. Делал пресловутый дебаг принтфом, чтоб посмотреть, какие самые длинные коды получались (52). И почему именно первые 50000 байтов из Мартина Идена оно восстанавливает нормально, а если взять 100000 - то пиздос?
>>1519876 Да лень было test.c красиво писать. Да, кто-то может не знать, не повесить какой-то файл на дескриптор и попробовать закодировать с клавиатуры.
>>1519600 >софт надо собрать под 64-битную машину (ну 2019 на дворе, пора бы уже) Это не причина, а долбоебизм и вредительство - ломание работающего без причин и имитация деятельности этим якобы переписыванием.
>>1521205 > прекопроцессор Не знаю такого слова, но подозреваю, что ты хочешь сс -E.
>>1521222 Ну мы-то откуда знаем? Пример тащи, рассказывай, какой у тебя компилятор и т.д. Может у тебя 64-битный код вообще, а ты ему __stdcall пихаешь.
>>1521264 Все таки тихий час - чудодейственная мера. Там ведь библиотека только в собранном виде уже, а я когда инструментами 2008-й студии компилировал и линковал с ней, все было норм, но на 10-ке работало только в режиме совместимости (оно winsock юзает), и я в ответ на эту жалобу от пользователя решил поступить радикально, поставил на ноут 10-ку, инструменты сборки от новой студии и прописал путь к компилятору с целевой архитектурой x64. Пиздос. А ведь между XP и x64 огромная пропасть, в которой еще ой как много места для x32. Пиздос я кретин, только сейчас это осознал. Всем добра.
>>1519505 > для него это всё байтики. То есть char это основная единица в C? Но ведь существуют только 256 битовых масок для одного байта, то есть можно получить всего ничего букв. А где в комплюктере можно поглядеть какой букве какое число соответсвует? То есть если инт состоит из 4 байт, а в байте у нас три десятичных разряда, то в инте 3x4 десятичных разряда, то если 456 789 987 899 какой либо инт, из него можно выслюнить 4 char (456, 789, 987, 899) ?
>>1521293 > А где в комплюктере можно поглядеть какой букве какое число соответсвует? Компьютеру по большей части похуй. Как запрограммируешь - так и будет. Где и как лежат кодовые таблицы - зависит от ОС. Но у нормальных людей уже юникод давно, юникод смотрят на unicode.org (если хватит усидчивости, чтобы продраться сквозь тысячи страниц стандарта).
> то в инте 3x4 десятичных разряда Десятичные разряды неудобные, поэтому 32-битный int представляют как 4 char (даже в сишке есть распространенное расширение под это: char c = 'A'; unsigned int x = 'ABCD').
>>1521308 Думаю, без расширения можно: int64_t istr = ∗(const int64_t ∗)"pidoras"; И потом передавать куда угодно без всяких выстрелов в ногу и медленных копирований. А распечатывать так: puts((const char ∗)&istr);
Аноны, мне тут интересно стало за RAR-архивы. Насколько я понял, сама магия сжатия является секретом фирмы, и опенсорснут только алгоритм декодирования, чтоб пользователи платформ, до которых не дотянулся компилятор разрабов, могли хоть существующие архивы распаковывать. Однако сказано, что этот опенсорс нельзя использовать в целях реверс-инжиниринга заветного сжатия. Вот мне любопытно, как это контролируется. Ведь если таки взломать тему и выдать за собственную разработку, то варианта два: либо WinRAR соснули, либо защита интеллектуальной собственности действительно жесткая, и тогда даже случайно изобрести то же самое нельзя. Но всякие алгоритмы - это целая научная дисциплина, которая в теории способна вскрыть целое множество возможных алгоритмов, и ее не заставишь обходить интеллектуальную собственность, как слепые пятна. Разработал, продал, красавчик, но пора и честь знать, ты ведь не из каменного века все это развил, сам небось юзал достижения дедов, как миленький, вот и свое, будь добр, в достояние общественности, так сказать... А я че спросить-то хотел - неужели никто так и не хакнул? Быть может, ты анон? м?? м??? м???? Или, как вариант, где-то существует сжималка, превосходящая RAR в одни ворота, и на последний знающим людям давно похуй.
>>1521427 Намного лучше. Хотя бы тем, что любые архивы не из DOS поддерживают юникод, то есть все. А zip всё еще какашка, корраптящая имена файлов. И это в 2020 году, пиздец, интернету уже 20 лет, а zip всё еще говно говна из каменного века. Да, я знаю что теперь пропатчили, но уже поздно, слишком поздно, мир засран кривым zip дерьмом так что уже не вычистишь.
Сегодня пол дня ебался с тем, что не мог писать в массив (писать то писал, но оно мне возвращало нули) который я статически объявил в хеадере. Где можно почитать про все этого говно чтобы настроить себе понимание как и куда я могу домогаться до данных в программе.
>>1521455 При чем тут я? Ты качаешь из интернета rar и ты уверен что с ним всё в порядке. Ты качаешь zip и нет никаких гарантий что файлы там не попорчены, это русская рулетка. Zip зашкварен, им попросту нельзя пользоваться, т.к. нет никаких гарантий что все пользуются правильной его версией с правильными флагами.
>>1521476 спасибо, я уже вкурил тк переменная обьявлялась как static в хеадере, то каждый исходник, импортирующий его имел собственную его копию с одним именем.
теперь мне интересен вопрос по поводу возвращаемых данных, удобно чекать успешность выполнения через логику, те возвращать какой-либо значение отличное от null и 0. то что main() возвращает ноль - так сложилось исторически?
>>1521510 Что ты имеешь ввиду? Я к тому что массив чаров это одна строка, он же пытается сделать массив массивов. как то можно это сделать таким образом?
Привет, хороший тред. Поскольку я на си вкатился со скриптовых языков, у меня в голове закрепилась привычка что рантайм в случае чего потом потычет в то место где что то не так. Когда особенно много изменений в код вношу и внезапно программа начинает падать, просто теряюсь, но помаленьку мне вносить изменения тоже некомфортно. Можно ли какимнибудь дебагером эти драные нульпоинтеры отловить? Потому как остальное вроде как при компиляции отлавливается, особенно с -wall в llvm.
>>1521873 разрезай приложения на функционально отдельные части, для удобства контроля промежуточного состояния данных. ну и используй дебагер - все нормальные иде могут дебажить искоробки. если работаешь много с кучей - юзай valgrind
Народ, возвращаюсь к Си, давно его изучал. Ничего если я некоторые места в К&R пропускаю, там программы большие, просто лень их смотреть, лучше написать что-то свое. После КР планирую начать прату, и хочу написать какой-то свой проект. Все это делаю для того, чтобы начать изучать реверс инжиниринг. Все нормально у меня или нет?
>>1522452 странный вопрос. начал изучение С лет 8 назад, за это время написал игру на спектрум (sdcc+asm), реверсить что-либо желание как не было так и не появилось.
>>1522532 Может быть дашь совет какой? Как вкатиться в низкоуровневое программирование? Нравится СИ, вот теперь пересматриваю главы КР 4, чтобы хорошо все запомнить про области видимости, связывание и т.д. (курс на степике прохожу). Куда дальше двигаться, какие проекты писать? Какие проекты на Си написать, чтобы так сказать, был норм уровень, и можно было переходить к ассемблеру?
>>1522664 > В си надо вкатывать с архитектуры процессора и ассемблера. Что бы уверенней использовать запрещенные стандартом языка приемы и завязываться на архитектурно зависимые хаки? Может в каком то ограниченном и архитектурно-зависимом коде это и допустимо, но во всех остальных случаях я бы предложил всем таким людям питаться путем прокачивания еды через трубочку введенную в анальное отверстие, ведь та самая дырка, в отличии от первой которая загружена еще и дыханием, большую часть времени все равно тупо простаивает, а архитектура организма вполне позволяет ее задействовать для подкачивания питания в желудок параллельно.
>>1522725 > Может в каком то ограниченном и архитектурно-зависимом коде это и допустимо Когда подрастешь, ты узнаешь, что весь сколько-нибудь сложный код на Си напрочь непереносим. В лучшем случае непереносимые части лежат в отдельной либе, но они обязательно есть.
Есть какие-то адекватные практики для написания модулей с дженерик алгоритмами, которые принимают обработчик/предикат - типа лямбду, чтоб эта самая лямбда не была указателем на функцию и не вызывалась по 100500 раз, гоняя стек как дрочер в кустах, а инлайнилась? Очевидно, сам алгоритм должен компилиться отдельно с каждым исходником, юзающим его, то есть находиться в заголовочном файле, а стало быть самому являться inline, чтоб линкер не охуел. Сам прибегал к дефайну перед инклудом, типа макрос-обработчик, но это какая-то лютая дичь, к тому же в одном коде не получиться дважды с разными типами данных использовать. Писать еще и сам алгоритм макросом - какой-то оверкилл, хочется все таки компиляторной семантики, а не препроцессорной. Можно пойти дальше и предусмотреть несколько версий: #ifdef YOBA_ALGO_CMP_1 inilne void yoba_algo_1(...) {...} #endif #ifdef YOBA_ALGO_CMP_2 inilne void yoba_algo_2(...) {...} #endif И так далее. Содержимое фигурных скобок идентично, тоже какими-то дефайнами можно его штамповать. Но это же лютая дичь.
Есть мысля, что для бытовых задач сойдет и производительность с вызовами функции, зато чистеньким интерфейсом, а для конкретных сложных высоконагруженных задач все вспомогательные структуры данных реализовывать эксклюзивно, монолитно с основным кодом, не претендуя на реюзабельность этой хуеты, абстрагированной математически, но не технически. Но ведь чувствуется, что вот она, заветная универсальность, всего-то пары синтаксических ништяков не хватает, эх... дискасс.
>>1523016 >для бытовых задач сойдет и производительность с вызовами функции она всегда сойдёт. не знаю таких ситуаций когда CALL-RET был большой проблемой. на старых системах это ещё и выигрыш в размере кода.
>>1523017 >на старых Противоположность актуальных же. Где-то у Таненбаума читал, что узкие места смещается то в сторону гигагерцев, то в сторону гигабайтов. И вот в наше время предпочтительней загрузить память, которой жопой жуй, инлайнами и прочей векторизацией, чтоб процы, которые бедняжки уже давно уперлись в потолок по тактовой мощности, смог задействовать все свои альтернативные законы Мура вроде первых кешей, конвееров, хуееров и т.д.
>>1523016 >Сам прибегал к дефайну перед инклудом, типа макрос-обработчик, но это какая-то лютая дичь, к тому же в одном коде не получиться дважды с разными типами данных использовать Самое адекватное. Смотри например gnu scientific library. И с типами спокойно используется.
//yoba.inc inilne void yoba_algo_##YOBANUMBER_##YOBATYPE(...) { if (YOBAPREDICTATE) }
>>1523022 и что ты бенчмаркал? звучит как разница зависящая от компиляции и позиции солнца в системе - загрузки её другими процессами. давай конкретный воспроизводимый пример.
>>1523025 но из этих кешей, чем меньше программа, тем реже тебя будут вытеснять другие программы системы.
хотя этот тезис я слышу давно, что больше писать давно выгодней. ну хз, я не упираюсь в своих задачах в это.
>>1523075 Тебе шашечки или ехать? Меня вот тоже от с++ ажтрясет, особенно от его перегруженности. Я си ковыряю только для хобби поделок, тк что-то серьезное на нем не написать, а для решения личных нужд он не подходит - питон лучше. Если ты хочешь связать с этим свою профессию - дрочить Си тоже не вариант, рынок узкий, вакансий мало, а поработав с любым динамическим языком/удобным статическим (например go или шарп) ты поймешь что нюансы этих языков не значительны на фоне знания фреймворка, и зная один можно с минимальными усилиями перекатываться в другой. Так что просто определись что ты в итоге хочешь получить от языка и нужно ли тебе вкатываться в низкоуровщину или хватит просто тыкать ее палкой для петпроектов.
>>1523054 >давай конкретный воспроизводимый пример Да мне уже неловко как-то свою хуиту светить. https://github.com/PolazhinetsA/lzwarc Короче, скармливаю этому говну 212-мебагабайтовую оффлайн версию HTML-справочника по стандартной библиотеке C++ (cppreference.com), оно сжимает до 75, и после того, как захерачил всю хеш-таблицу инлайнами, стало делать это не за 10 сек, а за 5. Вот прям стабильно. >от позиции солнца в системе Ровно первый раз. Потом все, что надо, уже в нужных кешах, и жесткий диск перестает быть узким местом.
>>1523167 прикольно. только я пока не могу скомпилировать без ключа оптимизации. и у тебя варнингов столько, и это ещё без флагов. зачем ты ставишь перед аллоками конкретный тип, если присваиваешь другим типам? тогда уже присваивай к void@
>>1523808 >без -O3 Потому что я поскупился продублировать инлайны из htbl.h для линкера, а без оптимизаций конпелятор такие продвинутые пожелания не выполняет и херачит вызовы. >каст маллоков Где конкретно? В макросо-реализованных расширяемых структурах данных с заголовочными интами по отрицательным индексам - для арифметики указателей. Типа, выделил память начиная с этих интов, но взял указатель уже на однородный буфер, что парой слов дальше, ведь к элементам чаще обращаешься, чем к контрольным счетчикам.
>>1523811 Ну, я и не хотел их юзать, пока не попробовал и не увидел значительную разницу в скорости. Именно htbl прям стопицот раз/нсек дергается. Не критичные вещи там чистенько по-отдельности идут, с инкапсуляцией (typedef в .c, void в интерфейсе) - так, чтоб потом эти ништяки в любой другой проект стащить можно было.
>>1523824 > , а без оптимизаций конпелятор такие продвинутые пожелания не выполняет и херачит вызовы. он вообще не соберёт проект. ты правила не знаешь, проставь везде static inline .
сегфаулт словил когда сжимал glext.h lzwarc a ./tmp/arch.lzw ~/dwn/glext.h
компилировал на cygwin32.
./lzwarc x ./arch-inline.huff ./html_book-e.tar а вот это выдало файл с названием html_book-e.tarhtml_book.tar
Сука, на днях думал запилить двухплатформенность, запилил ifdef-elif-endif(__linux__,_WIN32) хедер с обертками для pthread_create/_beginthread и т.д., сделал мютексы, добрался до condition variable и подгорела жопа. Почему Microsoft такое говно??? Почему всякие CRITICAL_SECTINO, SRWLOCK, всратые названия функций, которые без автодополнения заебешься печатать??? Почему не предусмотрели использование обычных няшных универсальных мютексов в атомиках ожидания cond.var? По ходу просто выпилю многопоточность, ебать бы и ебать для виндоблядей стараться...
>>1523830 >дык оно ж не умеет в тары, оно только свои) какая разница, это просто файл. я думал можно один файл запаковать, а потом распаковать со своим именем.
>>1523830 >у меня все норм, сжимает в добрых трое я кажется понял что я там повредил.
>>1523832 Неделю назад переписал на C++, но, не поверишь, только что, вот прям перед этим скрином психанул, взял и rm -rf cpp. Пофиг, она неактуальная была. >>1523833 Аа.. по скрину не понял, в чем прикол. >>1523834 htbl_init? Так там вместо каллбэков макросы перед инклудом. Лямбды через конструктор - на случай использования в менее замороченном и более красивом коде.
>>1523826 >./lzwarc x ./arch-inline.huff ./html_book-e.tar >а вот это выдало файл с названием html_book-e.tarhtml_book.tar А, ну все правильно, там задается папка назначения, а не имя выходного файла. Ведь файлов в архиве может быть много, они со своими именами распаковываются. А слитно, потому что путь назначением со слешем в конце писать надо. Да, у меня с автоматизацией всех этих пользовательских нюансов вообще тьма-тьмущая, даже вскрывать не стоит)
>>1523839 да я тебе патч с тестом дам. хотя я уже вижу разницу всего в 114 на 101 секнд. щас сделаю сборку без каллбеков но и без инлайнов, и думаю, будет тоже что и с инлайном.
>>1523840 Думаю, с одним большим файлом не должно быть такой разницы, как с множеством маленьких, потому что словарь до 2^14 забивается и отпадают обращения к хеш-таблице по поводу добавления.
>>1523836 >Да, у меня с автоматизацией всех этих пользовательских нюансов вообще тьма-тьмущая, даже вскрывать не стоит) Типичная олимпиадная пердоля. Даже с командной строкой обосрался сделать нормально, что уж говорить про графические интерфейсы. Вот почему линукс говно и останется говном вечно.
и того: да хз. разница не значительна, как по мне. не понятно, будет ли она на больших числах увеличиваться. мне кажется тебе лучше задуматься, почему у тебя один файл кодируется в 2 раза дольше и сжимается в 2.5 хуже, чем сотни. я бы вообще не делал поддержку многофайловости - для этого есть tar.
Довольно давно пишу на Си, но философскими вопросами начал задаваться не так давно.
Понимаю, что в Си нет конкретно понятия "модуль", но всё же хотелось бы понять с философской точки зрения структуру современного приложения на Си с высоты птичьего полёта. Как вообще в этом разобраться? Хотел скачать книжку Си в 21 веке на русском, но петухи поудаляли все ссылки с Вконтакта. Может есть у кого?
Есть ли какие-то принципы типа "Один .c файл - одна ответственность" для Си? Есть что-то типа SOLID для Си?
>>1524006 >А у них есть какие-то документы описывающие архитектуру? Читать миллиарды кода не хочется, хочется взглянуть в целом, с высоты. Есть, но придется поискать по сайту. Плюс там обычно не вся архитектура, а какие-то отдельные куски. Да и код обычно не такой уж и сложный, можно за пару дней общее представление составить.
Работа с аудио и видео. Работа со всяким компьютер виженом. Низкоуровневая работа с сетью. Создание утилит для Линукс. Да ты ахуел такие вопросы задавать? М? :3
>>1524160 Хард реал тайм, где запрещено динамическое выделение памяти. Навигационное оборудование, управление всякими рулями и тормозами, искусственные водители ритма сердца, вощим все от чего зависит твоя жопа ирл.
>>1523016 а попробуй на крестах там есть, к примеру, обобщенные лямбда-функции, которые инлайнятся (при включении оптимизирующих флагов компилятора, само собой) вдобавок ты всегда это сможешь контролировать просматривая ассемблерный листинг (даже онлайн godbolt) да и обобщенный код приятней писать на шаблонах, чем на макросах но я не настаиваю, и не ради холивара это написал
>>1523857 >патч Ой, чувствую себя обезьяной. Я и свое-то добро заливаю через кнопку upload, потому что github перестал водить за руку, что в консольке прописать, при создании репозитория. А это вообще хз, как юзать. >задуматься Потому что в разных файлах разнохарактерные данные, а я сброс зажравшегося словаря поленился сделать. Файлы, уже сжатые более совершенным алгоритмом, даже больше становятся после LZW, но когда их отдельно прогоняешь, архиватор видит невыгодную разницу и оставляет исходный. >для этого есть tar Дык мне интересно все в комплексе пилить. Так-то без 10 лет опыта, квадратных очков и тельняшки вообще кроме велосипедов мало что сделаешь.
>>1524446 Да кресты вообще вкусная штука, позволяет на двух стульях сидеть: и синтаксический сахар со всякими автоматизациями, как у сверхвысокоуровневого языка, и как на сишечке пишешь, где надо. Но у меня пока вкус до чистой Сишечки.
Решил написать пару трей куевин для мониторинга на сишном гтк и какой же ебаный пиздец Работающий раньше в <3.14 функционал полностью помечен как депрекейтед, какая-то часть вообще пидорнута и нужно ролбечиться На замену добавлен очередной велосипед связанный вообще с уведовлениями, где трей икон это седьмая вода на киселе и вообще ненужно. Еще и анально прикручено к дбусу
Я что-то делаю не так или тут и в правду полемеры проебаны и проще перекатиться на плюсы? Мимо веб макакич
>>1524460 >Напрямую через WinAPI ебашить надо. Лучше в сибилдере кинуть компонент мышкой на форму, клик, пык, и готово. С винапи можно баловаться если твоя программа уже написана на msvc, тогда уже деваться некуда. А линуксовые либы вроде qt и gtk на винде это как кушать шваброй через жопу.
Цель блять была написать хеллоуворлдовую трей апплекуху чтобы выпаршивать балансы со всех счетов и нагрузку на впски
Сначала было лень заморчаиваться и пошел ковырять JS Вспомнив 200мб рам хромиум врапперах и ограниченном системном интерфейсе понял что затея так себе
Питон не люблю но попробовал и его Накатив бинды на бинды биндов ffi я ибу что Написал первый хеллоуворлд, скомплюклировал, рам все равно каким-то боком жрало 40мб+ Не люблю питон и решил просто катиться дальше
Поднимаю штангу DSLы в две строчки Qt5 бинды отсутствуют, приходится пердолить GTK Вдруг выясняется, что нужно писать свои сишные структы и прочий пездец разворачивая забинженные объекты в фп пердоленье и обратно Нашел бинды повыше, поковырял формочки но нужным мне systemtray отсутствувал
Решил попробовать С, заодно разобраться в этих поентерах маллоках и прочей куйне Опять какой-то пиздец с GTK, что указал выше
>>1524474 вообще, по странному случаю вспоминаю подкаст слушал, там обсуждали это проблему. как не странно, но говорят на дельфи можно норм накросплатформить на эту тему.
а ещё wxWidget и что-то там ещё они упоминали, не помню уже...
>>1524474 под линуксом? какой de? у каждого de есть не одно приложение, которое позволяет кастомизировать трей, всего лишь пиша высокоуровневые скрипты.. вплоть до однострочников на баше..
>>1524608 Сижу на ш3 и знаю про блокс и тд Хотелось что-то все-таки накодить и может допилить в будущем билдер таких треев Скопировал хеллоуворлд Qt5 C++, уже допердолелся до парса первой нужной страницы Доволен как слон
>>1524612 если чего то "хочется накодить" то пишешь програмку на си которая будет тебе выдавать инфу по нагрузке на впски в cout, настраиваешь i3status чтобы он подхватывал эту программку и все вторая програмка будет выдавать твои балансы со счетов, также в cout НО непонятно зачем, имхо скриптовыми обвязками (которых полно в i3status) либо заменами i3status можно это быстрее сделать
>>1524786 или возможно тебе будет удобней выводить информацию не в строку, а вообще иметь системный монитор на экране, тогда и вообще надо conky настраивать
>>1524646 >imgui Прикольная тема. Можно делать окошки интерфейсов прямо в играх с полноценной графикой, и я не заметил тормозов даже на старом ноутбуке.
Вычитал что linux гораздо лучше подходит для программирования на Си чем Виндовз и установил Линукс Минт. Что то пошло совсем не так. Я думал поставлю Clion прокликивая кнопочки далее, в автоматическом режиме там всё найдётся, со всем состыкуется, интегрируется и вот это вот всё и я буду сидеть да прогать свои хелловорлды. Но нет. Оказалось надо поставить cmake, надо поставить gdb, надо поставить libc6-dew и потом я обнаружил что Clion справляется с хелловорлдом, а вот с вычислением квадратного корня уже не справляется. Не знает что такое sqrt() и оказалось что дело даже не в Clion, набрал код в текстовом редакторе, запустил на выполнение консольной командой и ошибка /tmp/cch0LAjo.o: In function `main': main.c:(.text+0x4f): undefined reference to `sqrt' collect2: error: ld returned 1 exit status (строка #include <math.h> в наличии) Что это за нахер вообще? Чем же линукс лучше виндовз в контексте программирования на си?
>>1526100 В любой IDE под Windows достаточно всего лишь указать подключаемые библиотеки в самом коде программы, который ещё и проверяется как минимум на синтаксические ошибки и запускай программу на здоровье. А тут пердолинг какой то В Clion установленной в Windows были непонятные мне и не работающие в Windows опции: профилировщик, валгринд мемчек, чего-то там с гитхабом. Я ожидал что в линуксе это всё заработает само собой, а в итоге получил что теперь данная IDE без пердолинга с терминалом реально ничего сложнее хеллоуворлда не пишет
Ладно, хрен с ним с Clion. Я думал в линуксе присутствует некая стандартная IDE для языка Си, из палаты мер и весов, отполированная десятилетиями, но и тут я оказался неправ. Сразу два проёба, никакой золотой IDE нет и Clion установить в Линуксе оказалось сложнее чем в Windows
>>1526119 Команды терминала всего лишь отображают этапы сборки проекта, что в свою очередь относится к знанию языка. Ну, то бишь, знание, как это все конпелируемое работает, есть мастхев именно для Сишника.
>>1526511 Си это ебаный язык для ёбнутых, меня знакомый попросил задачку решить а я не могу заставить это дерьмо из функции массив символов передать нормально.
BLYAD - это имя локальной переменной, которая содержит в себе адрес первого элементам массива, память под который выделена в стеке. Функция SUKA завершила своё работу и пямять, которую занимали её локальные переменные в стеке - совободилась. Поэтому, когда ты обращаешься к этой памяти, программа тебе говорит: ТЫ ЧЁ АХУЕЛ ПЕС? ИСПОЛЬЗУЙ MALLOC ЕСЛИ ХОЧЕШЬ СОЗДАТЬ МАССИВ НЕ В СТЕКЕ, А В КУЧЕ!
>>1526541 Чё, хорошо, когда за тебя джава сама управляет ресурсами? Ты выделил на стеке массив чаров в функции, после выхода за область видимости он удаляется, а ты возвращаешь указатель на эту область памяти. Ты должен его через new объявлять и не забыть после вызова функции через delete[] удалить.
>>1526632 > Массивы и другие большие объекты нельзя возвращать Массивы нельзя возвращать, потому что синтаксис не позволяет, а синтаксис не позволяет по историческим причинам. Структуры любого размера (в том числе структуры, внутри которых массив) возвращать можно, там внутри немного магии, но все равно можно.
>>1526601 > "a" константный Это просто следствие того, что массивы нельзя присваивать. А нельзя присваивать, потому что массив по правую сторону от = как обычно деградирует до указателя.
> нельзя написать Еще как можно. int ∗b = (int[]) {4, 5};
>>1526967 ты сабж читал? если ты создаёшь массив внутри функции и вызываешь её, то в стеке инициализируется несколько полей памяти, которые закрепляются за массивом, после того как функция завершается все эти поля изымаются из стека и сразу же занимаются перемнными из следующих команд. Как ты собрался их возвращать?
Тебе стоит изучить как работает вызов функции на ассемблере. Во-первых, значение этой переменной может быть не обязательно в стеке, а может быть в регистре. Во-вторых, у каждой функции есть адрес возврата, куда она возвращает управления по окончанию своей работы и есть специальное соглашение, куда функция записывает то что называется её возвращаемым значением, чтобы это значение можно было использовать в вызывавшем функцию коде.
> после того как функция завершается все эти поля изымаются из стека и сразу же занимаются перемнными из следующих команд Все так. Только тебя это ебет в одном лишь случае: если ты вернул указатель на локальные переменные. Так делать не нужно. Если ты возвращаешь структуру, и эта структура в регистры не влезает, то вызывающая функция неявно создает под нее переменную, и результат в эту переменную копируется, т.е. фактически struct s func(void) { struct s result = {0}; return result; } преобразуется к struct s∗ func(struct s ∗hidden_buffer) {struct s result = {0}; ∗hidden_buffer = result; return hidden_buffer; }. И никаких проблем. Можно было бы возвращать и массивы точно таким же образом, но вот беда: когда ты пишешь return array, сишка видит return &array[0]. Такие дела.
Буквально вчера узнал про такое заведение , как школа 21 / 42 и т д. Пишу в этот тред, так как там учат велосипедному Си и интересует мнение блатных анонов. Стоит ли лезть в это болото, если на дворе 21 век, а мне не обязательно знать как мои предки выкапывали сральник на улице? И почему их взгляд остановился на Си, че не Ассемблер?
Конкретно к Си у меня нет никаких претензий или негатива, как может показаться. У меня есть негатив к тому, что я должен делать банальные задачи в каловом редакторе, не используя некоторые дефолтные функции (да-да по типу printf). И кому эти навыки нужны в 21веке, где все стремится к скорости, а не к качеству.
Если что, то это мелкий слив заданий - https://github.com/jraleman/42 . Piscines - бассеин, местный жаргон, прописка в хату. 4 недели по 10 часов в день.
Пока челики пыхтят по 70 часов в неделю, то другие проходят питон+ дата сайенс на курсере и устраиваются через пол года за 100 к девальвированных рублей. И где нуб трапа?
> Стоит ли лезть в это болото, если на дворе 21 век, а мне не обязательно знать как мои предки выкапывали сральник на улице? мне похуй, можешь не знать.
> И почему их взгляд остановился на Си, че не Ассемблер? а то ты сам не знаешь ответ на этот вопрос.
> И кому эти навыки нужны в 21веке, где все стремится к скорости, а не к качеству. > И где нуб трапа? хуй знает, я не работаю, мне лень.
Казалось бы, просто возьми значение символа да передай в функцию. КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ КАЗАЛОСЬ БЫ ПРОСТО ВОЗЬМИ ЗНЧЕНИЕ СИМВОЛА ДА ПЕРЕДАЙ В ФУНКЦИЮ
КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ
КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ КАЗАЛОСЬ БЫ ВОЗЬМИ ВТОРОЙ ЭЛЕМЕНТ ДА ПРИСВОЙ
Анон спрашивает, как функция возвращает значение переменной, если значения переменных хранятся в стеке, который освобождается. Я ему отвечаю, что значение не обязательно может хранится в стеке. Можно значение переменной записать в регистр и функция может вернуть значение в регистре. Для этого надо знать ассемблер.
Или может ты отрицаешь, что когда я пишу на ассемблере ret, то я ПЕРЕХОЖУ по адресу откуда мою процедуру вызвал вызывающий код?
Я хотя бы потрудился чё-то в памяти освежить из универского курса асемблера, прежде чем пукнуть, а ты просто сренькаешь.
>>1527159 Тут проблем намного меньше. Значение возвращается так же как возвращается указатель, это по факту стандартный тип языка, инт, флот, чар, поинтер, которым язык может свободно оперировать. В C нет механизмов оперировать с массивами как с отдельными юнитами. > C does not provide any operators for processing an entire string of characters as a unit. page 87
>>1527358 Проблема в том, что есть char и есть char, и к char нужно добавить char, но ещё проблема в том что нельзя из char* взять рандомный элемент и перенести его в другую функцию.
>>1527463 я её даже не искал. но если бы меня спросили за сортировку, я бы из жопы пузерёк достал и был бы таков. зачем мне это говно запоминать даже? если нужно прочитаю на википедии - освежу в памяти.
Мне кажется, что когда спрашивают за сортировку, то они не хотят этим сказать, что ты её будешь писать, а хотят проверить какие ты знаешь методы сортировки и знаешь ли ты как они работают, то есть понимаешь ли какую сортировку в каком случае применять.
>>1527501 ничего я не понимаю, я знаю только квиксорт и всё. объяснить я его не смогу. сортировка это узкоспециализированная хуйня, над ней бьются серьёзные математики, а мы просто пользуемся, как мы пользуемся процессором не переизобретая его.
но сколько я программирую, я не понимаю, откуда вообще может взяться массив памяти в один момент который ещё и нужно отсортировать? чаще данные приходят последовательно, или ты их обрабатываешь последовательно. и зачем заниматься свопом данных, быстрей формировать список.
>>1527545 сортировать то по разному надо кому то быстро, не учитывая того что в наихудшем случае будет провал по скорости (привет быстрая сортировка) кому то нужно делать частичные сортировки (например, осортировать только для 5ти первых) кому то нужно делать стабильные сортировки (те у которых не меняется порядок следования одинаковых элементов) кому то нужно делать вообще сортировку последовательностей, те данных которые не влезают целиком в доступную оперативную память и оказывается, что все те виды сортировок, что препод тебе в вузике на втором курсе уныло рисовал на доске, потребны..
>>1527736 Сбрасывать память целиком не надо, потому что вписать какой-нибудь char в новую версию структуры, в итоге проебаться в alignment'ом и долго искать баги.
Сложно ли написать свою виртуальную машину в целях обучения? Сам на С никогда не работал (вебмакака та самая я). Но давно уже хотел попробовать что-то низкоуровневое, интересно как это все работает. Вот пока железо изучаю, ассемблер, потом Си подключить хочу
>>1527813 > Сложно ли написать свою виртуальную машину в целях обучения? Нет, не сложно. Простейшая виртуальная машина это switch(opcode) внутри бесконечного цикла.
>>1527736 Если задача - хранить, то можно использовать битфилды (хотя в первую очередь стоит подумать, нужна ли тебе такая экономия на памяти за счет процессора). Если задача - передавать между машинами, тогда однозначно маски, потому что про битфилды обещаний со стороны языка мало, а компиляторов много. В крайнем случае, если тебе пиздец как нужна скорость (т.е., если вариант с масками и сборкой из байтиков уже написан и тормозит), тогда можно и memcpy поверх структуры с битфилдами, но с проверкой внутри сборочного скрипта, что компилятор реализует все так, как ты ожидаешь, а не как ему больше нравится.
> но с проверкой внутри сборочного скрипта, что компилятор реализует все так, как ты ожидаешь
О, а я тоже подумал, что хорошо бы написать некий тест, который проверяет всё ли располагается в памяти "как ожидается" и если да, то через указатель, если нет, копируем с масками.
>>1527962 Пока на ум приходит только одна идея, сконвертировать float/double в char через snprinf() или asprinf() найти '.' через strchr() и дальше уже напечатать через %s Это единственно верное решение?
На сколько я знаю, у printf есть модификатор, которые позволяет урезать число цифр после запятой, но не до запятой.
Если написать printf("%1.1f", 13.14); То вывод будет 13.1 Если написать printf("%10.1f", 13.14); То вывод будет ________13.1 (где _ - это пробел) То есть модификатор для целой части может выводить дополнительные пробелы, но не может уменьшать количество цифр в целой части.
Так что выход для тебя - выделить дробную часть и вывести её как отдельное число.
Можешь сильно упороться, разобраться побитово как хранится в памяти число с плавающей точкой и выделить оттуда дробную часть. Погугли, "как хранится в памяти double", слабоумие и отвага!
точнее так float f = 45,676; int i = f; float fraction = f - i; float intermediate = fraction *1000; int r = intermediate; printf(".%d", r); как же клево знать арифметику. и немножко алгебры
>>1527288 "питон+ дата сайенс на курсере и устраиваются через пол года за 100 к девальвированных рублей" Инфа сто процентов или "но есть один ньюанс" ?
Аноны, норм практика объявлять структуры типа struct { type1 memb1; type2 memb2; ... char stroka[0x1000]; }; но не маллокать для каждого экземпляра все 4+ килобайта? Типа, именно эта строка в конце дается только один раз, и места требует ровно под свою длину, но лежит в виде фиксированного массива внутри структуры, чтоб обращаться по офсету от адреса самой структуры, а не дополнительные указатели разыменовывать. И менеджер кучи вдвое меньше дрочится, когда таких структур 100500, и память экономится...
>>1528160 Ты, вероятно, имел в виду: struct { type1 memb1; type2 memb2; ... char stroka[]; // char stroka[1] в С89 }; Да, абсолютно нормальная практика.
>>1528166 ох, мне пора баеньки.. Действительно, к чему это 0x1000, когда никто смотреть не будет, по размеру ли я индексируюсь. Не знал, что в C99 можно без [1]. Спасибо, анон.
>>1527359 >В C нет механизмов оперировать с массивами как с отдельными юнитами. >>1526632 Вдумайся в смысл. То что нет способоа это ежу поеятно, капитан, это аообще не вопрос. Проблема в том что само желание возвращать массивы в си это дебилизм, признак незнания языка. Возможности нет не потому что разработчикам было лень или еще что, а потому что и ре должно быть такой возможности, в стек нельзя совать большие объекты. Да, структуру можно, но структура не большая по дефолту, лишь несколько чисел, а массивы большие как правило, их смысл - хранилище данных, база, а смысл структуры лишь обертка для нескольких переменных.
Весь вопрос не в доках к языку, что есть или нет, а в непонимании что си это не алгоритмический язык абстрагированный от железа, в таком случае естественно ожидать возвратов всего, а машинный язык, привязанный к аппаратной архитектуре, чем является стек.
Это вежливая просьба к компилятору, что хорошо бы чтобы ассемблерный код этой функции был вставлен прямо в ассемблерный код программы в каждом том месте, где функция вызывается. Это, при правильном использовании, позволяет сэкономить на "... passing arguments variables, return address, return value, stack mantle and its dismantle, etc."
>>1529557 Везде. И если тебе так не кажется - присмотрись! Все в мире пропитано духом Си, и без K&R не видать тебе просветления ни в одной отрасли погроммизма.
Почему все такие мудаки и не хотят запилить <threads.h>? Что стоит просто взять и сделать? Могу сейчас сам обертки pthread набросать и за деньги продать, раз такое дело.
>>1529670 так бля, разобрался, у меня glibc 2.27, а потоки c11 завезли в 2.28, но ОС не спешит перекатываться на свежие версии, а накатить прям вместо той, что стоит по-дефолту, чревато поломкой при обновлениях. pizdos
>>1529622 >примеры из книги не компилируются Только из последней главы, где системные вызовы. И это не сильно мешает разбирать сами примеры.
>Устаревший типа Багаж в виде K&R тебе только поможет врубиться в нововведения, обузой он уж точно не будет. Там всего 200 страниц, остальное справочник.
Кто помнит книгу, аноны? Я правильно понимаю что все строки сохраняются в огромный буфер, который мы делали в прошлой главе, и который является екстернал переменной?
>>1529898 Нет. Теперь в буфере сохраняются только указатели на строки, но не сами строки. Аллок, который ты подсветил как раз выделяет ровно столько памяти, сколько нужно под текущую строчку.
>>1529904 Так без этого кода эта программа не будет работать? У нас же есть функция strcpy(char , char ), которая копирует в огромный буфер allocbuf[] наши строчки одна за другой? И указатели, которые лежат в массиве ведут на куски этого буфера?
>>1518919 (OP) >- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download >- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до. Ролл. От 0 до 4 Мозг и Денис, от 5 до 9 Стивен
Так, блядь, я верю, что вы мне поможете. Я написал программу для одной конторы, которая косплеит HTTP на сокетах, и встал вопрос, как именно, без всяких АПИшечек и прочих ништяков, собрать правильную строку "HTTP/1.1 200 OK" и "HTTP/1.1 400 Bad Request" ДА ХОТЬ ПО БАЙТАМ 0xb 0x7 0xJa 0xPidoras вообще похуй, чтоб для браузера клиента это не мусор был. м???? м???????????
>>1530643 какая аутентификация? Короче, моя программа полностью хавает POST-запрос с JSON-ом в конце, парсит всю хуйню и т.д. и т.п., после чего сразу отвечает 200 или 400. Там еще какая-то промежуточная перекличка должна быть??
>>1530713 бля, у меня уже все жестко написано по-байтоебски, мне бы только разобраться с последней траблой - чтоб клиент, который не догадывается, что его запросы обрабатываются на уровне laba2.c, видел серьезный такой, усатый в тельняшке респонс
>>1518919 (OP) Как лучше всего (в плане оптимизации - скорость выполнения, количество тактов) заполнять память по указателю? char offset; for(offset = 0; ... ; offset++) { (char ∗)(0x123 + offset) = data; }
Анон, N тредов назад советовавший мне делать HTTP сервер велосипедами на сокетах, ебучий ты содомит! >что ты как джавист сказал он мне, когда я приперся с вопросами про HTTP Server API для Windows... Нахуй это ваше байтоебство - психическое отклонение.
>>1530634 > Что не так в этой божественной строке кода? У нас TCP. В редких, но все же вероятных ситуациях строка может отправиться не полностью, счастливой отладки. Алсо, где вторая пара \r\n в конце?
>>1530855 ptr + offset не всегда возможно оптимизировать до ptr += offset автоматически (алиасинг и все такое).
>>1531225 Я уже и \r\n, и \r\n\r\n, и \r\n\r\n\r\n\r\n пробовал. А кейс с разбиением 30-байтовой строки на части (лол) - не моя ответственность, я респонс отправляю, а принимает его полноценная реализация протокола.
>>1531248 В тестовом клиенте (ниже) его и юзаю, но winhttp - это же только для клиентского и есть, нет? Непонятно, как там серверную очередь делать, для этого видимо HTTP Server API существует. Я ошибаюсь? >>1531252 После закрытия дочернего сокета разве не должно флашиться? И нет, проблема не в этом. Мой тестовый клиент все распечатывает (200/400). А нормальным программам почему-то похуй.
>>1531239 > пробовал Хорошо, а что именно у тебя не работает? Какого поведения ты хочешь от браузера, и что происходит? Ты хочешь вежливо послать нахуй браузер? Так отправляй полный респонс: "HTTP/1.1 400 Bad request\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\nGo fuck yourself."
>>1531282 А браузер не отображает status line, если кроме нее ничего нет? Вообще, это я с браузером решил поиграться. Там свой клиент, и мне жалуются, что вообще никакого ответа с сервера нету, хотя знающе так говорили, что хватит любой хуйни типа 200/400. Неловко ламповый Си-тредик этим загружать... Пойду спать, забей анон.
>>1531291 > знающе так говорили, что хватит любой хуйни типа 200/400 Хватит, чтобы браузер понял, что у тебя ошибка. А чтобы еще и пользователь понял, нужно посылать тело.
> жалуются, что вообще никакого ответа с сервера нету А ты точно соединение правильно закрываешь? SO_LINGER там или shutdown() какой-нибудь? Может там клиент не хочет неожиданно получать -1 от recv().
Кстати необязательно серверу закрывать соединение после каждого пука. Достаточно на клиенте запустить в паралельном треде цикл который читает из сокета а в главном функцию которая в него пишет.
>>1533552 >я умный и красивый И что? Это ни как не связано с тем, на что ты отвечаешь. Видимо не такой уж и умный, раз не понимаешь, что "ум" - вещь многогранная, в зависимости от ситуации и контекста означающая совсем разные вещи. Видишь, в данном контексте ты довольно тупой, но в других можешь быть и умным.
Ну это, мне надо буффер символов, в который с одной стороны можно класть символы, с другой вытаксивать. Как такое заебенить? Дабл линкед лист очевидно говно мочи, т.к. пойнтер занимает больше места чем символ.
>>1535571 ну, к примеру, у тебя будут так называемые "чанки", это массивы фиксированной длины, связанные между собой в список, память под чанки же может выделяться через организацию пула это один из вариантов реализации, коих много
>>1535587 >>1535588 то есть обычно очереди реализуют как подвид дек, а деки в свою очередь имеют несколько возможных реализаций, к примеру через кольцевой буфер, либо как набор чанков, связанных списком или еще как.. посмотри на википедии, лол
https://ideone.com/4bcVv1#stdin Аноны, поясните, пожалуйста, что не так? Выходит пикрил. Думал что это из-за того что использую i-1 в строке, которая с нуля идет, но попробовал переписать с начальным i - единицей, все равно эта ошибка вылазит, в чем проблема?
(на сайте не компилируется, т..к не открывает string.h, через vs19 компилируется, но выходит пикрил при попытке ввода слов)
>>1536869 > Аноны, поясните, пожалуйста, что не так? 1) Пользуешься уебищными функциями с _s. 2) gets_s() хочет два аргумента, передаешь один. 3) Не проверяешь конец строки (не ввел точку в конце - получил вот эту самую С0000005). И во внутреннем цикле тоже не проверяешь. 4) Не проверяешь, что symb сам пробел. Остальное вроде ок.
как вы обозначаете тип указателя char^ alloc(int n) или char ^alloc(int n)
в книге настаивается на втором варианте, так как это мнемоник который показывает нам что чтобы его развернуть надо поставить перед переменной звёздочку. Но я никак не могу привыкнуть как не пытаюсь (после плюсов) и подмывает юзать первый вариант.
>>1537372 Писать звездочку слитно с типом кажется хорошей идеей ровно тогда, когда объявляешь одну переменную, являющуюся простым указателем (или указателем на простой указатель). Как только начинаются указатели на функции, указатели на многомерные массивы, много указателей char ∗p, ∗q; сразу приходит понимание, что первый вариант - полная хуета.
>>1537396 А зачем мешать? Что за двоемыслие? Смысл всех этих декорирующих звездочек, скобок и прочего в том и только в том, чтоб отобразить последовательность операций, приводящих к описанному типу. Нечего тут косплеить.
Привет. Вопрос про кодогенерацию. Есть ли какие-то нативные средства, чтоб вместо ja[0] += pidoras[0], ja[1] += pidoras[1], ja[2] += pidoras[2] Писать YOBA_MACRO(ja, +=, pidoras, 3) ? Отдельно для трех, например, легко сделать #define COMBINE3(dst, op, src) \ (dst[0] op src[0], dst[1] op src[1], dst[2] op src[2]) Но умеет ли препроцессор генерировать N аналогичных строк по шаблону?
>>1537874 > Есть ли какие-то нативные средства Да. Внешний кодогенератор на питоне, перле, баше или даже на самой сишке.
> Но умеет ли препроцессор генерировать N Сорт оф. Ты можешь дважды вызывать combine3 из другого макроса, тот другой тоже вызывать дважды, и... тридцати двух уровней вложенности тебе точно хватит.
>>1537882 >>1537888 В принципе, можно цикл в макросе сделать, а его уже конпелятор векторизует. Но меня привлекает именно через запятую в круглых скобках, чтоб можно было таким же элементарным выражением где угодно вставлять, как настоящий вызов функции. Хотя, на практике мне это не нужно...
>>1537479 Смысл написания чтобы было натурально человеку. Это машинному парсеру удобнее единообразие, но не человеку. Если у тебя ведро с болтами на плечах, тогда вопросов нет.
>>1537372 оба варианта говно, делай тайпдеф pchar >>1537376 >char ∗p, ∗q; а с pchar p,q; ни у кого не будет сомнений в семантике и тупых ошибок асло больше одного обьявления на строку в большинстве случаев - говнокод мимокрестовик
>>1537963 >больше одного обьявления на строку в большинстве случаев - говнокод >мимокрестовик Всегда стараюсь объявлять переменные одной строкой и в самом начале подпрограммы.
>>1537372 Если объявляется переменная, то звезда относится к этой переменной, соответственно и место ей рядом с именем переменной. Если объявляется функция, то звезда относится к типу возвращаемого значения, а переменной как таковой нету, соответственно ее уместнее приклеить к типу. Так подсказки intellisense более внятно читаются, на мой взгляд.
Алсо, в с++ не во всех контекстах возможно придерживаться строго одного стиля.
>>1538144 Нет таких условностей, анон. Функция тоже может возвращать указатель на многомерный массив или указатель на функцию, например. Только отображение последовательности операций, чтоб получить тип слева, и никак иначе. Остальное от гуманитариев. Привыкнув к написанию слитно с типом даже в отдельных случаях, неизбежно будешь путаться, столкнувшись, скажем, с typedef float (EdgeList ∗)[2][3]; Если в голову приходят мысли писать иначе, значит логика Сишных деклараций НЕ ОСИЛЕНА, поциент не мыслит верными категориями, и каждый нетривиальный случай для него мини-головоломка, что есть совсем не айс.
>>1538277 Ну, например, ты хранишь какие-то 24-битовые штуки по адресам, кратным dword. Размер 3 байта, выравнивание 4 байта. А еще в многомерных массивах бывает выравнивание начал строк. В bmp каждый пуксель - 3 байта (RGB), но даже если шириника картинки - 611, все равно каждая строка будет начинаться с адреса, кратного 4.
>>1538377 Не совсем понял ок 24 битовая штука.. 24 / 8 = 3 байта пусть есть массив ХХХOOOOO|XXXOOOOO|XXXOOOOO|... То есть X это полезная нагрузка, O это пустые байты, чтобы блок XXXOOOOO делился на dword ? То есть XXX - размер (3) OOOOO - выравнивание (4) а что тогда XXXOOOOO ?
>>1537959 Ты хочешь дать шлангу в stdin имена файлов через пробел? Я понимаю, если бы единственный исходник распечатать в пайп, это еще логично (тоже не работает). Короче, палю годноту. Обратные кавычки есть. $ clang `find ../LearnC/` Команда внутри выполняется и ее вывод встает заместо кавычек. Да, анон выше поправил, потому что ls папки не печатает путь, а конпелятор не знает, где ты ls-ил. Алсо, хз зачем даже find, когда можно просто clang ../LearnC/∗.c
>>1538461 Хуя ты от первоначального тезиса оторвался в 2 хода... Говно - интерфейс сишных библиотек от мелкомягких. Используются они на винде. Чувствуешь? Анон назвал X говном, потому что X говно, обозначив то, что имеет ввиду, более кратким названием Y, где используется X. Ты же обвинил его в предвзятости к Y. Трагически погибни. Добрый вечер.
>>1538715 Ну, в Си тоже есть касты, где приходится всю матрешку без имени описывать. И что? Абсолютно та же логика. Имя предполагается под первоприоритетным оператором.
>>1538811 (int (∗[])(char ∗, const char ∗))ptr Интерпретировать ptr, как массив указателей на функцию, принимающую две строки и вовращающую целое число. Такое же "анонимное" обозначение типа применяется в шаблонах std::vector<int (∗[])(char ∗, const char ∗)> v; Вот и вектор таких массивов. В обоих случаях логика описания типа та же, что и при объявлении переменной int (∗pfunc[])(char ∗, const char ∗)
>>1538829 >std::vector<int (∗[])(char ∗, const char ∗)> v; Думаю в 2019 году нормальный человек напишет using proc = int(string, const string); vector<vector<proc>> v; // опционально array а не вот это легаси бяку
>>1538997 У которого обложка как на оп-пике. Он тоже не идеален, но ошибки там обычно очевидны. Можешь держать под рукой на всякий случай оригинальное издание.
Где-то читал маняоправдания, что HEX с головой, и компактнее, и у бородатого сишника спинной уже научен мысленно превращать bbc1a23 в нули и единицы, и то, и сё, но это БЛЯДЬ не оправдания! Это ж пиздос какой-то.
Нет, я конечно восхищен чистокровностью языка, насколько его серьезно оберегают от избытка фич и все такое, но... seriously?!?! Это же базовейшая хуйня из ассемблера!!
Мне кажется (пусть аноны поправят, если что) что когда ты пишешь:
char c = 0xF0;
то происходит переполнение, так как char может принимать значения от 1111 1111 = -127 до 0111 1111 = +127 И из-за этого переполнения у тебя вместо 0xF0 в "c" оказывается 0x0F но почему это так происходит, вместо того чтобы в char оказалось число 1.111 0000 = -112, я не знаю.
>>1539011 да легко, например надо по разному обрабатывать данные в зависимости от айди источника и приемника, причем набор обработчиков задается динамически >>1539132 отрицательные числа кодируются в дополнительном коде, гугли
>>1539416 кажется такая простая задача, посчитать сколько состояний может закодировать 8 последовательно расположеных бит, но вот хуй ты сможешь обьяснить как это сделать и посчитать. Если сомневаешься, скажи мне слёту как посчитать сколько состояний может закодировать 2 байта
>>1539132 Как же я с вас хуею. Значит так, бля! Слушаем внимательно. Сначала был унцыгнед: 00000000 = 0 . . . 11111111 = 255 (= 256-1 = 2^8-1) Потом появился цыгнед: XXXXXXXX цыгн подчеркнут. Если цыгн=0, то все как обычно, а если цыгн=1, то берется значение унцыгнед минус мощность типа 2^8. Таким образом, 11111111 из примера выше превращается в 0-1. И таким же образом мы по-христиански делим весь набор на негатительные и позитительные, при чем операции сложения и вычитания дрочат биты точно так же, выдавая корректный результат после всех переполнений.
>>1539081 Типичное пердольное "нинужно". Сидят царьки и командуют. А как реализовывается власть? Конечно через угнетение: не даешь что плебсам надо и получаешь удовольствие от их мучений и беспомощности исправить положение.
>>1540169 лучше зделать and 0xff с этим интом чтобы получить последний байт присвоить его в чар. потом сдвигай вправо на 8 бит и опять делай этот and. получиш второй байт и так далее в цикле ебони 4 раза
Пожалуйста, пользуйтесь https://ideone.com/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2385.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://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №47: http://arhivach.ng/thread/475391/
- №48: http://arhivach.ng/thread/495505/
- №49: http://arhivach.ng/thread/496205/