Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 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 помогает читать сложные сишные декларации.
>>1634117 > возможно с платиной Да. Проверяют возвращаемые значения, в данном случае - результат malloc(). Многие проверяют и при использовании, но по мне так для аргументов достаточно assert() вкатить (и то нахуй не нужно), если это не внешняя функция, которая реализует интерфейс модуля. Вот для внешней надо проверять все. Алсо, обработать ошибку выделения памяти правильно очень сложно, и в каком-нибудь консолеговне проще всего сделать обертку уровня if (!malloc()) exit() и не думоть.
>>1634198 В книжках у тестеров что то такое попадалось. Функция получает что-то на вход и выдает выход Надо поделить все множество возможных входов на уникальные классы. Например, ты пишешь parseFloat(const char*). 3.0 и 4.0 будут в одном уникальном классе, 3.0, -3.0, 3e-1, Inf, zhopa - в разных. Значит надо проверять такие ситуации, как: null, пустая строка, строка с правильным числом, строка с неправильным числом. Решить к чему относится строка из двух чисел. Решить к чему относится строка, начинающаяся с числа, но заканчивающаяся мусором. Сами категории тоже надо подразделять. Правильные числа - проверять целые числа, вещественные числа, отрицательные числа, научную запись, NaN, Inf и т.д. Решить что будет если в начале два плюса, если после числа пробелы, если после плюса пробел и т.д. Неправильные числа - проверять что будет если подать очень длинное число, что будет если подать перед числом плюс и минус, или два минуса
>>1634624 Забыл дописать - когда у тебя будут уникальные классы, надо проверять граничные случаи, например тебе не надо проверять все положительные, а только граничные - 0.0, 1.0, 1.175494e-38, 3.402823e+38...
>>1634624 Это понятно, да, но как тесты оформлять? Писать программу, влючать в неё .с файл, который хотим проверить, и там вызывать функции с заранее определённым входом и ожидать от них определённого выхода?
>>1634728 Может и есть, но мне хочется tests first approach опробовать, как в tdd. Просто на маленьких учебных задачках. Валгринд для этого разворачивать как-то несуразно.
>>1634777 Мне не хотелось бы держать это в одном файле, если честно. На мой взгляд так будет некрасиво. Наверное, поступлю как написал выше. Сделаю отдельный .с, в который тупо инклудом буду брать программу, и проводить тесты.
>>1637424 месяц, дальше забываешь про дроч языка и достигаешь просветления через прикладнуху (юниксовые проги с продвинутым функционалом, всякие байтоебские кодировщики пишешь), иногда "повышая квалификацю" годным чтивом про хорошие практики
у меня переполняется значение, измнения типа данных на long, long long, unsigned long и т.д. не помогает почему-то. Что делать? Как сделать так чтобы он верный результат давал?
>>1639020 Сейчас вот задумался, что это немного противоречит архитектуре языка программирования, хех. Ведь, по сути, речь идет о хранении ключевых слов в переменной.
>>1639020 Воздержись от void* без крайней необходимости. Язык тебе дал перегрузки функций fun(int), fun(float)
Еще можно передавать тип вторым параметром enum { INT_TYPE, FLOAT_TYPE } fun(void_ptr, INT_TYPE)
В C++ можно было бы на шаблонах что то нагородить fun<int>(ptr), fun<float>(ptr) >>1639024 Это нормально, в более высокоуровневых языках есть рефлексия, но она всегда требует большого оверхеда.
>>1639126 Ну она через return идёт, там вроде автоматические преобразование любых типов к обычному int со знаком идёт. Я конечно не про, но я бы просто в принт это сделал и всё.
>>1639178 Двачую https://en.wikipedia.org/wiki/Exit_status Windows uses 32-bit unsigned integers as exit codes, although the command interpreter treats them as signed В линуксе тоже вроде код возврата 32 битный, более того в некоторых частях системы он вообще 1 байтный.
>>1639321 Есть msys+mingw32, а есть msys2, где много всякого, в том числе mingw-w64. Фактически msys - это окружение (и инсталлятор), компилятор вообще можно отдельно ставить, если ./configure не интересует.
Есть бинарное дерево, в каждой ноде лежит имя животного в массиве, и лист с их видами. Каждая ячейка листа тоже массив. Хочу вывест на экран содержимое ячейки.
У листа есть опция перебора всех ячеек и применения функции к ним. Хочу вывести имя пета рядом с видом для этого пишу функцию, которая принимает содержимое ноды дерева, делает функцию для печати содержимого ячейки листа и перебирает лист. vscode на такое жалуется (пишет, что ожидал ;), а gcc спокойно компилирует и это работает.
Я правильно понимаю, что это какое-то расширение от gcc и так делать не надо? И как делать тогда надо, чтобы нужное число строк печатать для любого списка в ячейке?
>>1639525 А как тогда печатать для каждого вида животного его имя? Имя нам известно один раз, в ноде дерева, потом мы передаём управление листу, чтобы он сделал void showPetKind(ListItem kind) { printf("%s\n", kind.petkind); } над каждой ячейкой. Как передать ему ещё и и имя? Или менять функцию void TraverseList(const List plist, void (pfun)(ListItem item)); чтобы она вместо void (pfun)(ListItem item) принимала void (pfun)(ListItem item, char *petname)?
Доброго времени суток. Что аноны могут посоветовать по англоязычной литературе, чтобы в кратчайшие сроки въехать в C, если уже имеется достаточный опыт работы с C++? Хотелось бы книгу, которая была бы ориентирована не на совсем зеленых, но и не была слишком техническим материалом (как The C Programming Language). Подумываю взять Дейтелов. Что скажете, нормально или слишком много базы?
>>1639541 Тащемта можно объявить функцию внутри функции, но определять вложенную функцию нельзя. Это значит, что ты можешь написать прототип функции внутри другой функции, но определение обязан писать вне функций.
Освоил побитовые операции в си, ну понял как это работает устроено. Аноны, молю поясните мне ньюфане на пальцах ну где примерно это можно применять на практие? ну интересно пиздец. Душные мудаки которые будут нарочит односложно и неопределённо отвечать не пишите мне. Я знаю здесь анон был хороший который мне задачи помогал решать который мне алгоритм переполнения хороший показал. МОЛЮ ОТЗОВИСЬ
>>1640426 >побитовые операции в си Побитовые операции везде одинаковы и вообще это математика >где примерно это можно применять на практике Битовые поля и матрицы используются в логике приложения ради перформанса Кроме этого только в кодировке >Душные мудаки Ты сам душный долбаеб неосилятор плачущий на мылочах вместо чтения полторых статей
>>1640426 Мигать светодиодами на чипах. Да везде блджад. В хэшах, в наборах которые сеты, в crc32, в проверках четности, в псевдорандоме, во всяких быстрых делениях, округлениях, извлечении корней. Вообще вопрос уровня где используется вычитание.
>>1640432 Спасибо тебе тоже, анчоус за ответ, у тебя более разврнутый чем у предыдущего анона.
Алсо >Мигать светодиодами на чипах. да когда-нибудь я научусь писать драйвера и программировать микроконтроллеры как же я буду отрываться и эксперементировать. спасибо, анчоус ещё раз.
>>1640432 Мне очень понравилось в ручную это просчитывать если честно побитовые операции. Я даже себя проверил по всем пунктам. Это то чего я ожидал от программирования. Помню когда в веб 2 года назад вкатывался искренне охуевал и думал что это за гавно унылое. А тут прикольно люблю когда всё так разобрано до винтика прозрачно и понятно, низкуровневость это охуено, если помечтать уже то может быть когда-нибудь я вкачу своё ньюфажное ебало и в ассемблеры
>>1640434 Есть крутая книжка Алгоритмические трюки лоя программистов. Конечно сейчас процессоры с набором инструкций поьогаче и компиляторы стали поумнее, поэтому она менее актуальна, но там про это.
>>1640328 Понятно, что можно объявить, вопрос не в этом. Вопрос, как получить желаемое поведение без применения nested functions? Потому что с ними очень удобно в две строки это получилось >>1639510, так как гцц разрешает.
>>1640434 >>1640426 Это чтоли до сих пор тот вкатышь который здесь с января срёт своими идиотскими вопросами и просит проверить задачи из кернигана? Когда ты уже отсюда съебёшь то.
>>1637594 >достигаешь просветления через прикладнуху (юниксовые проги с продвинутым функционалом, всякие байтоебские кодировщики пишешь), Откуда всё это брать? Читал Дейтеллов последние главы типы данных (списки, стек), препроцессор. работа с памятью, goto - на всё это по несколько страничек и конец. Как детектив на самом интересном месте обрывается.
>>1640774 Ну очевидно же, что у тебя массив объектов, а работаешь ты с ним как с одним объектом. Воткни после json_tokener_parse: parsed_json = json_object_array_get_idx(parsed_json, 0);
Анончик, который тут про побитовые спрашивает, задачками грузит, про эмбеддед мечтает и тому подобное. Я с тебя, конечно, люто проигрываю, но добра тебе, и не кринжуй сильно, когда вспомнишь свои высеры. Когда-нибудь ты обязательно станешь на голову выше уже трудоустроенных, но не рефлексирующих по труъшным наукам быдлокодеров. Главное, уважай математику и вообще все абстрактное, это сложнее и почетнее, чем может показаться. Не проебись. А asm и прочее - это да, с этим надо наебаться как минимум в молодости, даже если монетизацию байтоебства не осилишь в будущем. Без этого, как без велосипеда в детстве, будешь в некотором смысле несчастным человеком. мимо узнал про двач спустя год с небольшим после вката по K&R
>>1641674 >пук Я ж не говорю про классический матан по Зоричу. Взять того же Кнута Concrete mathematics, ахуэнно жи... Чувак, ни одна фундаментальная книга по алгоритмам (без которой ты нихуя серьезного сам не осилишь, как кодер) не доступна без математического бэкграунда, во многих таких книгах это даже прилагается первой главой или в дополнении, но там сумбурно, а в деле становления Кармаком вообще спешка ни к чему, и так заебаться успеешь раз семьдесят за годы просветления, стало быть, нехуй нагонять сумбур, а лучше взять книжулю отдельно, забыть про далекий конец пути, сбросить напряжение и получать удовольствие от процесса. Кто этого не понимает, тот проебанное поколения, и я не про возраст, а в принципе. Заебали ЧСВ мудаки, которые своим куриным мозгом пытаются оценить ценность того, что лишь осилив и заценишь. Это иной уровень существования, это как рассказывать червяку, в чем прикол виртуозной езды на мотоцикле. Обнял, анон.
>>1641700 >книга по алгоритмам Это говно только кукаретики и вкатыши читают. Потом бегуют со своим мохнатым О пока их нахуй от рабочего кода не пошлют. >классический матан Сорта говн
В этом треде спрашивать про makefiles? Нашёл вот такой совет на стаке: использовать для простого создания директорий $(info $(shell mkdir -p $(DIRS))) вместо $(shell mkdir -p $(DIRS)) https://stackoverflow.com/questions/1950926/create-directories-using-make-file#comment89152187_45048948 потому что вывод mkdir, согласно постеру, вторая будет ошибки прямо в мейкфайл записывать. Проверил это, убрав -p, так что она всегда генерировала mkdir: cannot create directory : File exists.
Так вот, большой разницы между $(info $(shell и $(shell я не обнаружил, info только пустую строку добавляет, а ошибка и так и так выводится в терминал. Сама info вроде рандомные строчки читать не предлагает (или в мейкфайлах своя инфо?). О чём он вообще?
Решил только что первую задачу из k&r с байтовыми операциями. Пол дня над ней бился хотя понимал как все эти операторы работают. Непонятно было просто как манипулировать ноликом и единичкой но таки я сделал и программа прошла все тесты. Шикарно, только сильнее убедился что си это то что мне нужно.
там где точки - табы. как думаеш што делает? will be pasted into the Makefile, leading to syntax errors at best, означает что шелл без инфо это кодогенерация.
>>1642210 И ещё вопрос, как заставить $(info ...) на пустой строке не печатать лайнбрейк? Тот же $(info $(shell mkdir -p $(DIRS))) делает пустую строку. Как и, судя по моим экспериментам, любой $(info ) Это как-то чинится? Можно ли отправить вывод в /дев/нулл?
20 в двоиной это 10100, я ожидаю результат 01011(11 в десятичной), а получаю -21 что в двоичной равно -10101. Со знаками то понятно, непонятно почему нули с единицами не меняются так как ожидается.
>>1642880 Ты не можешь просто не учитывать ведущие нули. Поэтому у тебя не 10100, а 000...010100.(с учетом размера int) И 11 в десятичной ты никак не получишь Ну а разница в 1 из за представления в дополнительном двоичном коде (two complement). -21 выглядит не так как ты написал. Проверь на 1 = b00000001, -1 = b11111110
>>1642882 Ой мне лень сейчас уже, вот продли правую табличку вручную и все поймешь. Я и так в прошлом посте опечатался. Короче -(x) в двоичном будет (~x)+1. Алсо попробуй на беззнаковых.
>>1642880 короче смотри нужно не в двоичной системе считать, а в типе int
в int 32 твоё число это 00000000 00000000 00000000 00010100 теперь мы делаем отрицание
11111111 11111111 11111111 11101011 и получаем такое число.
Если у тебя тип unsigned без знака то это будет равно в десятичном 4294967275
Если у тебя signed который по умолчанию со знаком то это надо высчитать вот так 4 294 967 275 - 2 147 483 647 = 2 147 483 628 2 147 483 648 - 2 147 483 628 + 1 = 21 Ну и так как было отрицание то плюсовой бит меняем на минусово и получаем -21.
На конце цифры выделил специально чтобы диапазоны понимал почему получилось 21 а не 20. Потому что 0 это положительное. а в отрицательном 0 нет, поэтому в отрицательном больше на 1, чем в положительном.
А на 1 прибавляется потому что 0 в реверсе это будет -1, а 1 в реверсе это будет -2. ну ты короче надеюсь ты понел.
Анон, скомпилил C# .net standard либу через CoreRT, путь к либе указан как #define PathToLibrary "..\\NativeLibrary\\bin\\x64\\release\\netstandard2.0\\win-x64\\publish\\NativeLibrary.dll"
DLL Export Viewer(пик1) видит функцию в либе без проблем. В main.C : https://pastebin.com/u41ytwDY Line1 - не выводится, т.е файл найден Line2 - После LoadLibrary в handle NULL Line3 - В ErrorCode 126 Если не ошибаюсь Error Code 126 = Модуль не найден, хотя Line1 его находит. Как решить эту траблу, ебусь уже 25ый день.
>>1643255 Ну да, ты правильно вот сказал метко и коротко, объяснил бы ему раз такой талант имеешь. Если старший бит 0 число положительное, если 1 то отрицательное.
>>1643028 Ну там есть lea и 4 разных регистра. В третьей функции же все в один регистр считается из памяти, плюс сдвиг по таблице он быстрее считается, так что хуй знает!
>>1642921 Второй вариант. Будет работать на практике так же как и первый, просто потому что если развернуть код вызова этих функций и убрать фолдинг констант, который ты бенчмаркаешь, блядь от он будет ==.
>>1643367 > В третьей функции же все в один регистр считается из памяти, плюс сдвиг по таблице он быстрее считается, так что хуй знает! Зато ты можешь ирл огресть хуеву тонну индирекций (которых офк никогда не будет в твоём хэловорде на 1кб), и твой третий вариант будет сосать хуй. Нет, дети, если у вас кол-во оперативки > кэша то так делать не надо.
>>1643256 Пшёл нахуй, порватка. Какая связь вообще между старшим битом и фошистами, ещё и ёбанными? Хуле смерти желаешь, сам фошист что-ли? Гугли старший бит, гугли, сука, вилкой бытраблять гугли: https://ru.wikipedia.org/wiki/Старший_бит
>>1643553 маня, успокойся. я сам айти пидор о чём очень сильно жалею, но увы уже много трудов въебал в этот чан с гавном под названием АЙТИ. и мне поздно переквалицифроваться. как же меня бесят мои коллеги душные мудаки, никакого юмора, всё сразу в штыки, слово не то его использовать низя, вот ты классикал айти выблядок. Сука, я мог бы работать с тётями сраками в офисе и слушать про их детей и мужей, да где угодно, хоть с гречневыми пидорахами, но только в этом чане с гавном под названием айти с заносчивыми и душными мудаками которые за нетакое слово уже ебут тебе мозг.
>>1643605 >хоть с гречневыми пидорахами Тебе кто-то мешает релокейтнуться на Украину?
>но только в этом чане с гавном под названием айти с заносчивыми и душными мудаками которые за нетакое слово уже ебут тебе мозг Специфика байтойобов, на самом деле. Ещё подобным страдают бэкэндеры, попробуй потусоваться с челиками из других областей, ахуеешь от разнообразия айтишников в природе.
Читаю черные книги игровых движков, закончил часть про движок Вульфа. Понимаю, что никогда не смогу даже попытаться сделать свой аналог даже с современными возможностями.
>>1643678 С современными возможностями как раз сложнее делать вещи типа вульфа, потому что видеокарты пошли другим путем и его методы слишком противоестественны. Это как писать самомодифицирующийся код на ассемблере сегодня, а лет 30 назад это было нормой.
>>1644476 >С современными возможностями как раз сложнее делать вещи типа вульфа, А чё тебе мешает делать ручной софтверный рендеринг? В sdl2 можно тупо ебать байтики текстуры. Потом одной функцией копировать текстуру на экран, вуаля.
>>1644864 Думоть надо. Рейкастинг писать. Как работает рендер на основе BSP - вообше не вкурил. И один хрен потребуется i7 девятого поколения и 1080, чтобы добиться 30 кадров. Мимо
Есть ли смысл компилировать под всякие MMX и более новые процы, а не ставить i586 и не париться? Оптимизирует ли компилятор? Или все равно придется руками дрочить ассемблерные вставки? В игровых движках вроде как SSE вполне себе используется.
>>1645124 Возьми gcc.godbolt.org и посмотри на примере каких-нибудь скалярных произведений. Если хочется что-то самому добавить то используй не вставки, а интринсики.
>>1645124 В идеале надо определить черту, начиная с каких процов клиенты тебе не интересны. Ну или делать отдельно сборку для MMX и для i586, возможно вынеся нужные функции в либу.
>>1645968 >SevenBits = byte & 127; //даёт 7 последних бит. >FirstBit = byte >> 7; //даёт старший бит. А дальше, что хочешь там, то и делаешь с ними. Можешь выебать их шлангом, потому что CLang.
>>1645978 Не совсем так. Пусть есть массив байт: [10101010, 01010101, 00000000, 11111111] надо получить массив, вроде: [1010101, 0010101, 01000000, 0011111, 111] или типа того, а потом раскодировать обратно.
Основная задача - представить байтовый массив в виде строки, состоящей исключительно из символов 7-ми битного ASCII, а для этого, надо получить массив этих 7-ми битных значений. Но сделать это надо так, чтобы потом из него, из этого массива, было возможным получить назад эти байты, ебучие. Причём в виде - первозданном, а не непохеренном всякими кракозбликами, наподобие https://ru.wikipedia.org/wiki/Заменяющий_символ
>>1645986 Ну почему же? Каждый ASCII-символ можно представить 7-ю битами, согласно таблице ASCII: https://ru.wikipedia.org/wiki/ASCII#ASCII_Table >>1645988 Вот, нашёл какой-то код на JavaScript, для разрезания байтового массива на произвольное количество бит. https://stackoverflow.com/a/8133543 Но там биты в виде строк, а надо чтобы числа были. Может поможет как-то намалякать годноту, а то я уже заебался... Хз.
>>1646013 https://ideone.com/gbo25F Котороче, так и не смог понять, как хорошо задать размер второму массиву. Реквестирую помощь анона в этом вопросе. В остальном работает, хоть и коряво.
>>1646026 Слышь, пехотинец, ты так забегался со своими калашами на море, что аж немного рамсы попутал и затёр не по теме ваще, да ещё и не по масти. За такое, даже в пехоте пёрышком чикают, в ты чё ваще не курсах? Реквест изначальный же, был о том, как массивы байтовые передёрнуть, и этот вот >>1646015, вроде что-то знает. Только вот на JavaScript эту хреновину не пришпандорить - слишком сложный синтаксис, и пунктуация, да.
>>1646030 Чиво? Был массив восьмибитных чаров, стал массив восьмибитных чаров, где первый бит ничего не значит и всегда 0. То есть значения семибитные.
>>1646013 >Но там биты в виде строк, а надо чтобы числа были. Так быть не может. Числа все фиксированной длины, не меньше 8 бит, так что тебе придется вместе с числом хранить его настоящий размер в битах. Для строк такое не нужно, потому что строки могут быть любой длины и уже включают в себя размер.
>>1646040 >Чиво? Был массив восьмибитных чаров, стал массив восьмибитных чаров, >где первый бит ничего не значит и всегда 0. То есть значения семибитные. Хм, ну я же просил массив с int, или byte, а не char'ы. Да, я вижу - семибитные коды у них, но как их оттуда вытащить в массив? И вообще, я же хочу на JavaScript этот алго, а у тебя там вот такое вот: >buffer |= *foo;
>Есть мнение, что он не понимает, что такое разбиение. Слышь ты, умник?! Хуле тут понимать-то, а? Про понятия решил мне растереть, да? Берётся короче еблет и разбивается в мясо, по-бырому - вот и всё разбиение.
>>1646013 Потому что у него нигде не сказано что на входе только ascii символы Если на входе только ascii символы то там вообще ничего делать не надо for(int i =0; i<size; i++) out=inp&0x7f; А если резать по обычному то там может получиться такое 11111110 00000011 11111111 -> 1111111 00000000 11111111... т.е. NULL-байт в поток
>>1646140 Вообще-то, было сказано, что на входе - байты, это массив байт, со значениями от 0 до 255 (8 бит). На выходе же - должны бы быть тоже массив, тоже байты, но имеющие значение от 0 до 127. И их должно бы быть чутка побольше. Я не знаю как в Си, и это вопрос скорее по алгоритмам, вцелом, и я решил задать его в треде по Си, так как считаю, что вы больше разбираетесь в этих вот битовых операторах, и прочих низкоуровневых операциях.
Тот факт, что массиве из байт - может быть нулевой байт, в JavaScript, вовсе не значит что это конец строки. Я вот, просто для прикола, открыл консоль браузера (клавиша F12), и вписал туда это: >console.log('NULL_BYTE1:\0NULL_BYTE2:\0NULL_BYTE3:\0); и вижу длинную строчку.
Короче, надо бы как-то наварганить, обратимый алгоритм, получения именно байт причём произвольной, заданной битности. В данном случае - битность 7, значит массив содержит 7-ми битные значения, или 6-ти битные, 1 битные... Как в вон том JavaScript'e, только цифрами байты в массиве, и обратимо чтобы.
>>1646154 А причем тут javascript если это тред по C? А вообще задача элементарная, вот накидал неоптимизированный вариант, для последнего байта проверку надо отдельно делать чтобы не вылезать за границу массива но мне лень.
>>1646098 >Хм, ну я же просил массив с int, или byte, а не char'ы. char это и есть байт, потому что состоит из восьми бит.
>Да, я вижу - семибитные коды у них, но как их оттуда вытащить в массив? Они уже в массиве ciphered. Я же даже напечатал его для тебя между раскодированными текстами.
>И вообще, я же хочу на JavaScript этот алго, А он умеет работать с отдельными битами?
>а у тебя там вот такое вот: >>buffer |= *foo; это и есть работа с битами. Или ты планируешь получить биты, не зная ничего бит?
>>1646140 >А если резать по обычному то там может получиться такое >11111110 00000011 11111111 -> 1111111 00000000 11111111... т.е. NULL-байт в поток Это ничего страшного, если работать с этим как с массивом, то ты знаешь его размер, а эти байты вполне нормально расшифровываются.
>>1646277 >char это и есть байт, потому что состоит из восьми бит.
Вывод верный, но объяснение неправильное. В стандарте нет гарнтии, что сhar состоит из восьми бит. В нём не менее восьми бит. Так же, гарантируется, что размер char-a - один байт, вернее, формально, что sizeof возращает 1 на char и всех его квалифицированных вариантах.
>>1646323 >В стандарте нет гарнтии, что сhar состоит из восьми бит. Дело в том, что для того кода нет разницы, какой конкретно формат будет из восьми бит. Я просто ответил, что в том коде char — это байт фактически.
>>1646279 Это нестрашно, если ты работаешь и с тем и с тем сам, но если это передается где-то по сети, оно может случайно пройти через какой нибудь прокси сервер, который посчитает что это 0-terminated строка. Маловероятно, конечно, но base64 именно для того и придумали.
Аноны. Помогите мне пожалуйста. Нужно сделать лабу по системному программированию под linux на Си. Вроде бы написал (хотя я пока только из одного текстового файла читаю, который щадаю в самом коде а не во время вызова исполняемого кода, но это я потом легко исправлю). Условие и код здесь по ссылке ideone.com/h3ed25 Скорее всего я где-то облажался, но нк понимаю где, объясните как исправить, анончики. Надеюсь на вас.
>>1646367 Делать за тебя я, конечно, не буду, хотя это быстрее, чем писать этот пост. Но код производит впечатление, что ты решаешь задачу методом тыка. После fork() у тебя запущены две одинаковые программы, но запущены не сначала, а с этого места. И каждая программа изнутри должна узнать, какая она из двух. Про это тебе должен был рассказать return форка, но тебе на него, почему-то, похуй. На самом деле, все просто, но иногда с концептуально новой идеей надо переспать. Именно поэтому весьма хуево запускать хвосты по учебе и компенсировать регулярность занятий интенсивностью за день до дедлайна. Документация в помощь, анон.
>>1634080 (OP) Это пони-тред? Расскажите, надо ли добавлять .git/ в .gitignore? Оно вроде так уже автомагически работает, но я нигде не могу найти, где это в документации написано.
>>1646367 Ээээ блядь, да у тебя и char указатель, ну в пизду. Я вон вообще про двач узнал спустя год с небольшим, как в Сишку вкатился. Нехуй на форуме делать с такими элементарными вопросами.
»1646384 Вот я тоже как раз подумал что дело в этом. Проблема в том что я не знаю как сделать так чтобы процессы занимались разными задачами в одной программе. »1646387 >Но код производит впечатление, что ты решаешь задачу методом тыка. Именно это я в общем-то и делаю. >Именно поэтому весьма хуево запускать хвосты по учебе и компенсировать регулярность занятий интенсивностью за день до дедлайна. На лекциях лектор нам вообще ничего не объяснял про системные вызовы. >Документация в помощь, анон. Да читал я документацию по fork и все равно не понял как сделать так чтобы разные процессы решали разные задачи а не одну и ту же вместе.
>>1646402 Разметку проебал >>1646384 Вот я тоже как раз подумал что дело в этом. Проблема в том что я не знаю как сделать так чтобы процессы занимались разными задачами в одной программе. >>1646387 >Но код производит впечатление, что ты решаешь задачу методом тыка. Именно это я в общем-то и делаю. >Именно поэтому весьма хуево запускать хвосты по учебе и компенсировать регулярность занятий интенсивностью за день до дедлайна. На лекциях лектор нам вообще ничего не объяснял про системные вызовы. >Документация в помощь, анон. Да читал я документацию по fork и все равно не понял как сделать так чтобы разные процессы решали разные задачи а не одну и ту же вместе.
>>1646403 >Вот я тоже как раз подумал что дело в этом. Проблема в том что я не знаю как сделать так чтобы процессы занимались разными задачами в одной программе. Читай. Это довольно просто.
>>1646391 Функция read вторым элементом принимает указатель, на буфер. В данром случае чтение побайтовое, поэтому я объявил указател на char, а не char. За жоементарные ошибки мне и самому неловко, но лаба горит. >>1646399 Спасибо, анон.
>>1647395 сравнение это брэнч, его надо предсказывать всегда, а с умножением линейный код, на гпу в шедерах используется такая техника убирание брэнчей нопремер
>>1647399 >на гпу в шедерах используется такая техника Потому что умножение, это то, что гпу делает хорошо. Как на тракторе быстрее через поле грязи проехать, а на легковушке в объезд.
Пытаюсь перехватить руками дескрипторы процесса. форкаюсь, забираю стдаут, экзеклю это, и раскрашиваю аутпут. Чайлл обрабатывается следующей функцией. Как видите принты до экзека никуда не приходят, а вот вывод эха нормально обрабатывается. НО! Если до вызова dup2() добавить ещё один принт, то он выведется (нераскрашенным, что естественно), и каким-то образом повлияет на остальные два принта, что их нормально перехватит и раскрасит.
Я подумал, что дело во времени, что родитель не успевает создать буфер и всё это, но добавление в чайда sleep() ничего не меняет.
>>1647506 Чайлд пишет в стдаут, он буферизируется (не попадает в файловый дескриптор), ты запускаешь эхо, он пишет в файловый дескриптор. Тем временем ты читаешь из файлового дескриптора. Где нужно сбросить буфер, чтобы операции вывода в файловый дескриптор попали в правильном порядке? Правильно, перед тем, как ты будешь писать напрямую в дескриптор, т.е., прямо перед execv.
>>1647686 > что происходит в 27-й строчке Undefined behavior. Да, если следовать стандарту, на сишке нельзя написать стандартную либу для сишки. Живи с этим.
Простите за глупый вопрос, но сколько файловых дескрипторов должно быть у программы? Я вот сделал простейшую printf("%d\n", getpid()); sleep(40); и у неё зачем-то 60 файловых дескрипторов. Откуда?
Перечитай ещё раз стандарт. Для char'а есть куча исключений: любой валидный указатель кастится в валидный указатель на char. Более того, к области памяти можно обращатьcя не только по её эффективному типу, но и по указателю на char.
>>1647810 Могли бы и сказать, что среда запуска может накидать за щеку дескрипторов. Это электрон шрифты всякие навтыкал, и ручек к разделяемой памяти.
>>1645968 >Как можно обратимо, закодировать массив байт в масив 7-ми битных значений, и наоборот - декодировать в байты? >>1645972 >SevenBits = byte & 127; //даёт 7 последних бит. >FirstBit = byte >> 7; //даёт старший бит. >>1645974 >Так а... С массивом-то как ёпты, бля? А если у него ещё и произвольная длина? >>1645978 >Ты спрашиваешь, как можно закодировать 8 бит в 7, чтобы оно потом обратно в 8 бит раскодировалось? >>1645983 >многабукафф >>1645986 >Ложь, пиздёж и провокация. >>1646013 >Вот этого, гляжу, не объебёшь. >>1646014 >Дебажу расшифровку, не очкуй. >>1646015 >Неведомая шняга, на JS не катит. >>1646035 Да, твоя тема - нормас на си пахает. >>1646026 Код, вроде рабочий, но из-за буфера с большим int и операции '|=' портировать на JS - не получилось. >>1646039 Схулей размер ещё бит хранить, Ы? >>1646140 Там на входе - байты. >>1646157 Подобную последовательность битовых операций, примерно, я и реквестировал здесь. >>1646277 Мне надо было семибитные числа в массиве, а не восьмибитные. Да, в JavaScript тоже есть bitwise operators. Только числа там ограниченное значение имеют, поэтому твой буфер не сработал. >>1646279 Хотя JavaScript'у и пофиг на нулли, но всё-же да, спецсимволы лучше убрать нафиг. >>1646323 Да, ведь байт от 0 до 127 - это тоже восьмибайтный байт, но зато - он может быть представлен одним ASCII-символом.
В общем, смарите, как я рубасы запилил: >>1648469 → (архивач: https://arhivach.ng/thread/546415/#1648469 ) Это совершенно новый, инновационный стандарт в IT-индустрии. Можете юзать, кароч, и гонять, ксорить и конвертить эти ваши - байты. Бесплатно и без СМС. Код открытый. Добра, всем.
>>1648675 Какой эталонный шизодебил, нафантазировал себе бреда и купается в нем. По любому пердоля линуксоидная, они как раз такие обычно, туппппые как баррраны и такие же упертые необучаемые.
>>1649132 >Байтом он быть не перестаёт, а байт - это 8 бит. >>1649129 >Если не нужна кирилица. Там RUBase128, кириллица используется чтобы сделать символы печатными, как в base64. Удивительным образом, вся кириллица с латинницей плюс цифры - впихивается в 128 символов. Таблица символов ASCII же, содержит в себе спецсимволы, которые не дают строке отображаться, из-за чего строка не может быть скопирована, после кодирования. Например, вот этот самый NULL-байт посреди строчки - дико выбешивает, так как означает конец строки. C RUBase128 всей этой хуйни нет, но там нужна конвертация из 8-ми битных байт в 7-ми битные, над чем пришлось ебать как подзаморочиться. А RUBase256 вообще кодирует все 256 байт, безо всяких выебонов, только вот длина данных чуть больше в самих этих байтах, просто по причине того, что символы берутся из Unicode, и кодируются более чем одним байтом, ну и пофиг.
>>1649543 Во-первых, чтобы поддерживать проекты, которым уже по хуй знает сколько лет. Во-вторых, чтобы учить нюфагов. В плюсах куча высокоуровенных фич (ссылки, RAII, наследование, смартпоинтеры, стдлиб где уже есть все структуры данных и тд), которые скрывают происходящее под ними, а чтобы писать быстрый код нужно понимать, как там всё байтойобится прд капотом.
>>1650099 Почему он так жрет память? В С скобочек больше и точка с запятой на каждой части команды. Наоборот же лишние знаки должны больше заполнить памяти.
>>1649706 >Под микроконтролле пишут даже на питоне Для быстрого прототипирования, в основном. Серьезное никто ничего не пишет, потому, что все интерпретаторы скриптовой хуйни сильно урезанные и скорости проца нехватает. >крестах На микроконтроллерах свои особые кресты с костылями. Это не не совсем кресты, а скорее си с классами. Тк основные крестовые фичи либо не работают, либо нахуй не нужны из-за нехватки ресурсов. А байтоёбствовать удобнее на сишечке на которой написаны большинство библиотек.
>>1650305 Не парься братиш, тут половина треда не видела программируемые микрочи в жизни, не говоря уже о промышленном БМ. Так, детки из школы 21 в перерыве между перерывами попукивают свое важное мнение
>>1650338 Начни с выражения своих мыслей. Простейшая практика, никаких наук учить не надо, но творит чудеса, сразу выявляя даунов, у которых мыслей нет, но думают что есть.
>>1650703 Никак. Continue переходит к следующей итерации ТЕКУЩЕГО цикла. Тебе нужен break и флаг. Во вложеном цикле выставляешь флаг, делаешь break, во внешнем цикле проверяешь флаг и делаешь continue, потом сбросить флаг не забудь.
>>1650203 Не понимаю, то ли я гений (не может быть), то ли дебилов массово в пробирках штампуют. Си с классами это тоже кресты, потому что в сях классов нет. Как можно не понимать очевидного, при том что тут и других вариантов даже нет. И даже без классов кресты это кресты, потому что в любой момент если захочешь классы будут. В этом и достоинтсво, что много есть, но ничего не навязано, можно сделать как в примитивном си, так и сложные вещи, а можно что-то среднее, да как угодно. А убогая сишка в которой кроме ограничений нет ничего, это ненужный нигде мусор. Очевидно же, ведь ограничения это недостаток, а не достоинств ство.
Проблема в том, что семантику Сишечки можно объять разумом, а сематика Си++ - это блядь просто огромное море лютого пиздеца, там нету правил, там нету даже правил с исключениями, там исключения из исключений исключений из правил. На каждый чих, на каждую блядскую фичу создано по сематической сущности, абсолютно бессистемно, в постоянной погоне за модой. Поэтому, ты можешь комфортно работать только в небольшом подножестве языка. И не надо мне, блядь, говорить про то, что мол, кококо, нормальному чуваку норм. На руках тоже можно ходить повседневно, но не факт что это признак большого ума.
>>1651421 И? Это плохо? Каждый работает в том подмножестве, которое ему по уму. Тупой работает в области си, поумнее работает с классами, еще умнее работает с шаблонными библиотеками и так далее. Или еще лучше, начинающий как вначале, но со временем умнеет , охватывая больше, но этот процесс неограничен, учиться можно всю жизнь, настолько язык глубок. Это же буквально рай для умного человека. Да и в целом, язык, охватывающий всё для всех и каждого, это же буквально бог, божественный язык.
Так что ненравится? То, что ты не осиливаешь ВСЁ И СРАЗУ? Что нельзя написать "я знаю в совершенстве". Что от этого у тебя комплекс и боль от осознания собственного несовершенства? И поэтому ГОВНО НИГУЖНА УБЕРИТЕ ОТ МЕНЯ! Так? Так. Поздравляю, классический дебил. И даже если бы сбежишь от си плюс плюс, так что он перестанет тебе напоминать что дебил, тебе все равно об этом напомнят, я например, или другие люди. В мине все равно везде естб не дебилы и при виде такого тупого тебя они молчать не будут. От себя не убежишь.
>>1650961 > Не понимаю, то ли я гений >>1651457 > И? Это плохо? Каждый работает в том подмножестве, которое ему по уму. Тупой работает в области си, поумнее работает с классами, еще умнее работает с шаблонными библиотеками и так далее. Или еще лучше, начинающий как вначале, но со временем умнеет , охватывая больше, но этот процесс неограничен, учиться можно всю жизнь, настолько язык глубок. Это же буквально рай для умного человека. Да и в целом, язык, охватывающий всё для всех и каждого, это же буквально бог, божественный язык. Вот это шизоид, вот это да! Для офигенных любителей языков и выразительности есть хаскель и теория типа tapl, но судя по твоей бредятине ты до такого не дорос. C++ постоянно накачивают разного качества фичами, тебе говорят, что для написания выразительного (и производительного) кода нужно себя сильно ограничивать в использовании языковых конструкций. И это не из-за какого-то там "ума", большинство хороших кодерков смогут прикрутить к проекту любую фичу из языка. И учить всю жизнь можно cs, а не какой-то отдельный язык.
>>1651473 >C++ постоянно накачивают разного качества фичами, тебе говорят, что для Классическая безмозглая модная шлюха блондтнка. 1) Гонится за последней модой 2) Главное для ней - чужое мнение
Мань, куда ты лезешь, программирование не для такого сброда. Язык это инструмент, его используют как нужно конкретному мастеру для его задач. Не существует никакой моды и что там другие говорят себе в зеркало тоже их личное дело. Мастер использует то, что ему удобно для его дела. Своя голова, самостоятельное мышление. Тупым шлюхам не понять.
Как следить за очисткой ресурсов на си (без эксепшенов) ? Goto? Do-while цикл? Проще конечно разделить функцию на подпрограммы, но не всегда есть возможность.
>>1651485 Ты только что выдрал отдельный тезис из моего поста и зачем-то попытался подкрепить его продолжение своими убогими аналогиями. Зачем я только отвечал тебе... Вот, цитируя полностью: >> для написания выразительного (и производительного) кода нужно себя сильно ограничивать в использовании языковых конструкций. У тебя видимо вообще никакого опыта разработки нет.
>>1651485 >Тупым шлюхам не понять. А теперь я доведу до тебя небольшое противоречие, выходящее из твоих прошлых постов, которые отлично проглядываются в треде. Комитет так же остановил эволюцию стандарта С, как и твой ебнутый "мастер", не пользующийся какой-то "модой". Плюсовые фичи в С не пролезли. Для реализации ООП, шаблонов, исключений можно использовать макросы (которые иногда и в кресты приходится тащить, хотя страуструп очень сильно старался), программистам в отрасли этого хватает. Тогда, собственно, не совсем понятны твои претензии к С как к языку.
Помогите пожалуйста написать код правильно или пофиксить готовый. Спасибо. Задание:написать программу, которая считывает английский текст из файла и выводит его на экран, заменив прописной каждую первую букву слов, начинающихся с гласной буквы.
using System; using System.IO;
class Program { static void Main() { string path = @"D:\text.txt"; try { using (StreamReader sr = new StreamReader(path)) {
for (int i = 0; i < split.Length; i++) for (int j = 0; j < alf.Length; j++) if (split.StartsWith(alf[j].ToString(), StringComparison.InvariantCultureIgnoreCase)) {
Console.WriteLine(split); break; }
} } catch (Exception e) { Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); Console.ReadKey(); } Console.ReadKey(); } }
>>1651695 Можно не нести шизобред, если нужно ООП, шаблоны, исключения, берешь и используешь их, а если не нужны не используешь. С++ позволяет всё, делай что хочешь как хочешь без ограничений.
С же это поледка для компашки шизиков разработчиков ядра линукс. Примерно как Git, только гит оказался полезным и за пределами шизокружка, а си нет, ведь уже есть то же самое, но с плюсами.
Пиздец, мне одному в последний год стало мерзко даже читать хуйню что тут пишут, но я все равно сюда захожу и ахуеваю с того что у этих студентишек в головах?
>>1651761 я здесь с 10-гo января где-тo. захoтел научиться писать на с++. сперва выучил oбщие oснoвы пoгрoмирoвания на базе питoн. пoтoм пришёл сюда и начал k&r книгу делать. щас на 56-й странице в данный мoмент. терпи, книгу прoйду и уйду из треда в с++ страуструпа делать
>>1651770 Чё? Я не про ньюфагов которые задают шизовопросы уровня анон почему це це или что такое баит, а про шидерьмо вроде поста через один наверх от того на который ты ответил
>>1651753 >>1651757 Скажи мне, гений, что произойдет/ты будешь делать если у тебя в обработчике сигнала внутри многопоточного сетевого софта развалится, например, тобою обожаемый оператор new?
>>1651841 Ты не увиливай, а четко мне укажи каким инструментом языка ты эту ситуацию "локализуешь" и в какой подпрограмме/функции какого процесса. А еще я не знаю про какие дефайны ты там говорил, попробуй примерно указать конструкцию, которую они оборачивают в коде.
>>1651862 Оператор new не справился с задачей и выдал std::bad_alloc. В обработчике обработать ошибочную ситуацию невозможно (как всегда, хехе).
Дефайны мне тут никакие не приплетай, они здесь не нужны. Про аллокаторы можешь меня тоже не спрашивать, я тебе могу хоть mmap в оператор завернуть, это не имеет разницы.
>>1651885 Еще раз, товарищ зеленый, здесь нет никаких ооп и шаблонов, никаких дефайнов и языка Си. Я поставил вам вопрос: >>в обработчике сигнала внутри многопоточного сетевого софта присутствовал оператор new, он выдал std::bad_alloc Вопрос стоит только в рамках языка C++. Мне очень, очень интересно, как бы вы средствами языка локализовали и обработали эту ошибку.
>>1652014 Ты не мне такой вопрос задавай, а шизику, который решил здесь устроить очень содержательное сравнение крестов и сей. Условие я дописал к посту чтобы он окончательно обосрался и больше ничего сюда не писал. И, как ожидалось, его уже давно не видно. Завершение процесса или передача управления из обрабочика сигнала - вопрос общий для двух языков. Просто реализация исключений (в т.ч. в виде C-макросов или C++) не позволяет им выбрасываться из обработчика сигнала.
>>1651894 >товарищ зеленый Тут только ты >здесь нет никаких ооп и шаблонов, никаких дефайнов Вот же >>1651695 >Для реализации ООП, шаблонов, исключений можно использовать макросы >Вопрос стоит только в рамках языка C++ Ты ошибся тредом. >Мне очень, очень интересно, как бы вы средствами языка локализовали Никто тебе не писал что "только средствами языка". Просто когда я уже найду место, где программа упала, ты все еще будешь разматывать макросы и пытаться понять в какой же строчке это произошло. >И, как ожидалось, его уже давно не видно. Потому что у меня есть чем развлечься вечером и без твоей тупости.
>>1652279 >А как обработать возврат NULL malloc'ом? И так и так падаем.
Самое простое - крашнуть прогу. Если не крашнуть самому - могут начаться злодейства. Если чуть поумнее, то можно созранить состояние проги, не используя дополнительного выделения памяти (и опять же крашнуться после). Если у тебя какой-то хитрый алгоритм, который адаптивно жрёт дохуя памяти, можешь это просто использовать как сигнал пойти по пути меньшего пожирания этой самой памяти . Не обрабатывать ошибки выделения памяти (да и ошибки вообще) - признак долбоёба.
>>1652336 Правильно, но я указывал что эта злодейская ошибка случилась с malloc (new) внутри обработчика сигнала. >>1652279 Была бы данная ошибка внутри обычной процедуры - можно было бы откатить все действия процедуры назад и вернуться с кодом ошибки. Но она произошла не в процедуре, а в другом контексте. Из этого выходит что эксепшен нельзя выкинуть из обработчика, он не попадет ни в один catch и терминирует программу. Ну и получается нам нужно (в условиях текущего стандарта c++) эксепшен ловить на месте и лезть в древние posix_c siglongjmp/setcontext чтобы сменить контекст вручную. Или лезть в boost.asio, где уже разработали нужные оберточки, с тем же успехом прикручиваются нужные интерфейсы в виде библиотек к сям.
И вот как-то так выходит, что еще надо на data layout обратить внимание, с сишным api поработать, какую-то часть стандартной библиотеки переписать, поработать с легаси. И так в некоторых проектах проектах мы просто приходим к си, где язык дополняют либы и container_of.
>>1634080 (OP) Подскажите, какая разница между языками D и C? Вот прям пример на одном, пример на другом. Везде одни словеса пространные, и я ничего не понимаю. Это если вообще найти возможно - назвали же ёпанавашу 1 буквой.
лаб1 Значение некорректно из-за преобразования char в float, но когда я пробую получать в float значение пишет что определенно слишком типов, как мне получить нужное значение в клавиатуры чтобы функция работала корректно?
>>1653293 "&" я так понимаю это ссылка на участок в памяти где хранится переменная или что это? Почему без нее не работает и как это правильно использовать? В примере я ничего подобного не видел Таки работает, большое спасибо, если бы не ты, я бы долго пердолился
>>1653301 >В примере я ничего подобного не видел Потому что char str1[20] означает, что str1 >это ссылка на участок в памяти где хранится массив из 20 чаров. >как это правильно использовать? Пока просто запомни, что в сканфе нужно писать &. Почему и как потом разберёшься.
>>1653777 Да кого вообще волнует название переменных в очередном мертворожденном прототипе проекта, который я никогда не доведу до конца, так как программист как из говна пуля?
Почему чтобы скомпилировать программу под разные платформы нужно заниматься какой-то херней, а не нажать две кнопки? Допустим есть программа hello world SDL2. Сам SDL кроссплатформенный, есть костыль-компилятор mingw с прослойкой для запуска этого дела под шиндовс, но для его работы все равно нужен отдельный пакет специально заточенный под mingw. Разве там не те же исходные тексты что и под линупс? Почему он не может взять include просто из линукса?
Отличие для меня лишь в том что в линуксе libSDL2 будет установлен в пакете, а в шиндовс эта DLL будет лежать в папке с программой, остальную совместимость должен обеспечить mingw. Не? В чем сложность?
>>1655108 > Разве там не те же исходные тексты что и под линупс Берешь те же тексты, mingw, configure, make, все дела, но это долго. А готовый пакет ты распаковал куда-нибудь, cc mygovnokod.c -Lmysdl2path -Imysdl2path -lSDL2 и все. Или даже без -L/I, если положишь в правильные директории.
>>1655108 SDL это библиотека, библиотека это тоже программа, программы распространяются в бинарниках, а не исходном коде. Бинарники разные на разных системах, и не только windows, они и на каждом линуксе разные. В пакете находятся бинарники, поэтому пакеты везде разные, не только относящиеся к mingw. >совместимость должен обеспечить mingw. Не? Не. Разные системы разные, совместимости нет нигде, это прорагандистские бредни для идиотов. Точнее, есть только в windows обратная совместимость (старые программы работают на новых виндах), но не наоборот. На других системах кроме винды и такого нет, там вообще полное отсутствие совместимости.
>>1655214 Я знаю что в линуксе все пакетами и я хочу в два клика собрать и под винду и под линукс из линукса. Под линукс он собирает естественно нормально, но для cygwin нужен какой-то свой пакет т.к. он не видит инклуды которые есть в системе.
Короче я все понял. В пакетах специфичных для cygwin идут dll и *.a файлы.
Я просто хотел чтобы как в python pip install все загружалось и подсасывалось само, а не я голову ебал как это слинковать: >i686-w64-mingw32-gcc -I"./SDL2-2.0.12/i686-w64-mingw32/include/" -w -Wl,-subsystem,windows concept.c -L"./SDL2-2.0.12/i686-w64-mingw32/lib/" -lmingw32 -lSDL2main -lSDL2
>>1655262 >Я просто хотел чтобы как в python pip Питон и пхп это веб-скрипты, они не имеют платформы и вообще не программы, а скрипты. А на си пишутся программы, а программа это такая штука, которая под платформу написана. Отсюда натуральный вывод: мультиплатформенных программ не существует, что означает, любому хуесосу с кукареками про "мультиплатформенность" в треде языка си нужно пиздовать нахуй отсюда. Не туда зашел, петушок.
>>1655301 >Питон и пхп это веб-скрипты, они не имеют платформы и вообще не программы, а скрипты. К чему имеет биндинги (qt, sdl2) оно подсасывает само.
>>1655303 Твой набор слов не имеет смысла, бредятина. Не понимаешь разницу между программой и скриптом и мелешь чушь как результат. Иди нахуй, сначала обучись элементарной компьютерной грамотности, а потом приходи. Здесь тред си, а не обучения чайников основам компьютерной грамотности.
>>1655306 >Твой набор слов не имеет смысла, бредятина. Это ты даун. В питон если сделать pip install мне не надо отдельно качать SDL чтобы pySDL2 заработал.
До того как я начал разбираться речь шла о дистрибуции и инфраструктуре, а не чем отличается скрипты от программ. Не знаю почему ты сагрился и тяфкать начал.
>а программа это такая штука, которая под платформу написана. Отсюда натуральный вывод: мультиплатформенных программ не существует Говорилось очевидно про сам исходный код и ты это знаешь, токсик. Через какие костыли оно будет собираться мне не важно. Мне важно чтобы все пакеты нужные для этого были доступны в два клика, как это сделано в менеджере пакетов для cygwin например. Даже в арче есть костыли чтобы это не искать в отличии от debian'а. Я сетовал на то что даже в python с pip install есть такой функционал и он качает в том числе бинарники, не надо искать ничего, могли бы в рамках mingw реализовать подобное.
>>1655314 Терминальный необучаемый дебил, как и ожидалось от веб-макаки. Нельзя лезть в алгебру не зная арифметики. В школе не зря учат последовательно, снизу вверх. Но как только кончается школа, дебилы радостно лезут сразу в дебри, не понимая элементарных основ, ведь больше нет няньки в лице государственной принудительной системы образования, а сами за себя сообразить своими куцыми мозгами не могут.
>>1655417 А вот, например, надо в функцию передать строку или структуру. Можно конечно всю строку в стек запихнуть (нет), а можно просто указатель передать на начало строки.
Ананасы, сколько времени понадобится, что Си был заменен более современными системными языками программирования (как тот же Раст)? 10-20 лет? Я люблю Си, но мир же не будет вечно жрать говно от эксплоитов, которые существуют только благодаря тому, что Си еще не умер (ну и легаси код крестов без RAII). Ваши прогнозы?
>>1655960 А в чем проблема? Он быстрый как кресты, на нем уже ядро ОС написали и пишут дрова, включая дрова на уже существующие ОС. Если не системный, то какой? На нем легко можно байтоёбить.
[CODE] window_caption[150] = ""; program_name = "Test"; program_version = "0.0"; FPS = 150; snprintf(window_caption, sizeof(window_caption), "%s v%s", program_name, program_version); snprintf(window_caption, sizeof(window_caption), "%s; FPS: %u", window_caption, fps_current); [/CODE] Хочу сложить строку caption = caption + "text" Почему во втором snprintf у меня не выводится %s, только FPS: %u? snprintf не работает сама в себя? (linux)
>>1655988 > Он быстрый как кресты, на нем уже ядро ОС написали и пишут дрова Слышал такое слово в слово про C#.
> А в чем проблема? В реализации linked list на две страницы.
>>1656131 > snprintf не работает сама в себя Нет. Первый аргумент объявлен как restrict, значит компилятор имеет полное право подразумевать, что других указателей на window_caption в функцию не передали, и применять соответствующие оптимизации.
> Хочу сложить строку caption = caption + "text" strcat или n = sprintf(buffer, ...); n = snprintf(buffer + n, ...) (с проверкой ошибок и соответствующим уменьшением размера буфера, разумеется).
>>1656145 > Слышал такое слово в слово про C#. Щас бы писать ОС и дрова на языке, который исполняется виртуальной машиной, ммм... (да-да, я знаю, что дотнет кор умеет компилиться в нативный код), но во времена появления сишарпа такого не было и такого ты слышать явно не мог, да и этого не происходило вовсе, а на Расте УЖЕ написана ОС и УЖЕ написано неплохое кол-во системных утилит, как для языка, которому лишь 5 лет. Через 15 лет он убьет Си точно, про кресты не могу сказать.
> В реализации linked list на две страницы. И? Обернут в стандартную либу и все, кого это должно ебать, если у тебя программа в итоге защищена от целого класса атак, причем самых опасных.
>>1656171 Он никакой не мой. Но поясни почему, аргументы такие себе. Почему язык, превосходящий другие языки для таких же целей, только старые, не может в перспективе его убить?
>>1656169 >дрова на языке, который исполняется виртуальной машиной, ммм.. Какбэ... Виртуальные драйвера уже в виндовс95 выполнялись (потому что как ты ещё сделаешь многозадачность на одноядерном процессоре) и писали их думаю на сишке. мимокрестовик
>>1656176 >превосходящий другие языки На словах пиздунов, а на деле мы имеем Firefox - самое тупое, тормозное, жирнющее говнище из миллиона процессов, которому чтобы отобразить текстовые веб-странички нужен кластер суперкомпьютеров чтобы не тормозить. Вдобавок текущее как шлюха из всех дыр водопадами, просирая бесконечное количество гигабайт памяти. Такая-то скорость, надежность и безопасность, хоть вот прямо щас весь софт на свете переписывай на этом говне, чтобы миру пизда настала.
>>1656145 >Первый аргумент объявлен как restrict, значит компилятор имеет полное право подразумевать, что других указателей на window_caption в функцию не передали
Спасибо, добавил переменную buffer через которую теперь делаю.
>>1656344 >Сталь — плохой сплав, вон какие грузовики гигантские и дорогие приходится из неё делать, чтобы руду возить. >Покажи лёгкий грузовик, который с такой же задачей справится >Риии, из стали говно тяжеленное делают и чинить сложно!
>>1656465 Почему раст сосет, а Си топ? Ладно там кресты, это реально монстр, там реализованы все возможные парадигмы, можн окак байтоебить, так и писать абстракциями чуть ли не как на петоне (на поздних стандартах офк). Но Си? В нем же нет ничего. Да, быстрый, но по бенчмаркам раст == си по скорости, но при этом полностью безопасен в плане памяти. Почему никто не может конструктивно ответить. Нечего ответить по существу? Так так и скажите, что сливаетесь.
>>1656531 Ладно братиш ты нас раскрыл, на самом деле мы все данво на расте а тут просто отыгрываем разговор студентов из молодости, давай в раст-тред, там пообщаемся на вопросы твои ответим
>>1656169 > на Расте УЖЕ написана ОС На C# УЖЕ написана ОС
> во времена появления сишарпа такого не было Было. Те же самые разговоры были, что, мол, сейчас вот заживем. И программы без уязвимостей будут, и сишка уже умерла, и жабке пизда заодно.
> И? Обернут в стандартную либу и все И все, останется только виртуальную машину добавить. А на сишке это две строки, которые даже в отдельную функцию часто не оборачивают.
>>1656176 > язык, превосходящий другие языки Сишке ты говоришь "зделой", и оно делает да, с UB, если ты не понимаешь, что ты делаешь, и почему. Расту нужно вылизать анус, чтобы он возможно согласился зделоть, и у тебя все равно будут те же самые проблемы, что и в сишке, потому что без ансейфа в расте можно только хелловорлды писать. В результате мы платим больше и за это имеем лишь больше проблем и потенциальные полпроцента прироста производительности из-за лучшего анализа алиасинга, но когда-нибудь потом.
>>1656531 >Почему раст сосет, а Си топ? 1. С Проще освоить. 2. Есть на любой платформе. Качественный компилятор 3. Язык стабильный. 4. Куча справочных материалов. 5. Не нужны обертки чтобы использовать сишные либы. 6. Куча тулзов для профилирования, статического анализа 7. Можно работать за деньги
>>1656678 > На C# УЖЕ написана ОС Сишарп изначально не позиционировался как системный язык, в отличие от раста. > И все, останется только виртуальную машину добавить. А на сишке это две строки, которые даже в отдельную функцию часто не оборачивают. Две строки? Развернуть структуру, написать функции удаления/добавления элемента в список, где опять же могут быть проблемы с памятью. > Сишке ты говоришь "зделой", и оно делает да, с UB, если ты не понимаешь, что ты делаешь, и почему. Расту нужно вылизать анус, чтобы он возможно согласился зделоть, и у тебя все равно будут те же самые проблемы, что и в сишке, потому что без ансейфа в расте можно только хелловорлды писать. В результате мы платим больше и за это имеем лишь больше проблем и потенциальные полпроцента прироста производительности из-за лучшего анализа алиасинга, но когда-нибудь потом. даже уязвимый код в ансейфе почти невозможно поиметь, у растовых бинарях мемори лэйаут абсолютно другой, там переполнения блять в ансейфе не работают, максимум могут быть траблы с указателями, и то в адовом говнокоде. При этом при аудите сорцов можно будет сфокусироваться именно на ансейфе, потому что другое просто неуявимо. И шанс проебать баг, тем более критический, сокращается в охуилярд раз
>>1656685 1. И проще прострелить себе ебало, ибо сегфолт и Си - братья навек 2. Дело времени, причем недолгого 3. Стабильный в крашах, мемори ликах, гуляющих указателях, переполнениях, UB? Безусловно 4. И? У раста тоже есть книга и пиздатая документация, не аргумент 5. Дело времени х2, язык молод, но растет как Алёша на астероидах 6. Куда тулзов для статического анализа, а 80% кода на Си имеют дыры, лол 7. Огромное количество компаний, которые занимаются блокчейном, уже перешли на раст, ибо там безопасность превыше всего.
>>1656727 В мире нет ни одного зарегитрированного случая взлома растового бинаря. А попытки уже были. Его память неуязвима, там только специально можно что-то сделать
>>1656733 Вот когда будет сравнимое количество софта на расте - будут и взломы не будет, он умрет раньше. А пока пишут только всякое говно, которое иначе написали бы даже не на си или крестах, а на питоне.
>>1656742 Количество написанного софта в этом случае не повлияет - проблемы Си были известны с момента рождения этого языка. Если вдруг весь мир перейдет на раст - магическим образом не смогут взломать то, что не взламывается, только если нарочито не плодят бэкдоры
>>1656754 Где рабочий эксплоит к этому, Маня? Даже если в расте есть какая-то там дыра, из-за мемори лэйаута, который устроен не так, как в сишных бинарях, ты не сможешь это эксплуатировать нормально.
нубас тайм Есть структура SDL_Surface img = NULL; Я хочу загрузить в нее изображение. В обычном варианте это будет выглядеть как: SDL_Surface img = IMG_Load("../img_path/test.png); Но я хочу чтобы это делалось через мою функцию вида: bool loadImageToSurface (SDL_Surface destination, char path) Т.е. она возвращает 0 если все норм, и 1 если ошибка. Вопрос, как в нее надо передавать SDL_surface чтобы функция именно с внешей переменной работала? Через & не работает.
На других платформах то же самое - если кекогерцы не кукурузные, значит есть всевозможные Side-channel уязвимости, которые даже на сраном жаваскрипте без эксплойта в нейтив код юзаются.
>>1656917 >Где рабочий эксплоит к этому, Маня? С козырей зашел, мое увожение. Нельзя написать эксплоид к расту, если растоговно нигде не используется. Нечего взламывать, понимаешь?
100% безопасность из коробки если нету unsafe, то безопасно рабочих эксплоитов нету <<-- Вы находитесь здесь да, взломали, но ничего серьезного сами виноваты, надо было нормально писать
>>1657110 > на сраном жаваскрипте без эксплойта в нейтив код юзаются В лабораторных условиях при правильной фазе луны. Но это никак не относится к нинужности раста.
>>1657052 говорилось именно про уязвимости памяти, а не в общем. Раст мартышке не даст скомпилить бинарь, где есть переполнение/висячий указатель/двойное освобождения памяти.
>>1657134 да будет тебе известно есть такое понятие, как proof of concept. Пишут эксплоит, чтобы чисто показать возможность локального/удаленного исполнения кода, дабы показать, что уязвимость не пластмассовая, а найти кого взломать всегда можно. Я тебе открою секрет, его нет просто потому, что его не смогли написать.
>>1657236 Есть, но: а) При тестах на такой род уязвимостей можно смело концентрироваться на местах, где есть ансейф, ибо другие места защищены уж точно б) В случае проблем с памятью, в виду специфики лэйаута в памяти растовых бинарей, заиметь контроль над исполнением программы почти нереально. Техники взлома, которые работают в Си и крестах, там бесполезны
>>1657282 Лолшто, как тебе компилятор поможет? Ты знаешь что такео возвратно-ориентированное программирование вообще или нет? В расте ты не моешь писать за пределы буфера и не можешь заебнуть указатели и насрать в кучу. Это никак не связано с тем, что ты сказал.
>>1657288 >Лолшто, как тебе компилятор поможет? Ты знаешь что такео возвратно-ориентированное программирование вообще или нет? ты чё такой борзый? дыши ровнее.
> В расте ты не моешь писать за пределы буфера и не можешь заебнуть указатели и насрать в кучу. если есть ансейф - то можно. и есть библиотеки, которым ты доверяешь что они безгрешные.
> Это никак не связано с тем, что ты сказал. в смысле не связанно? ты затираешь возврат на стеке в заранее известны код, где-то у ret. и прыгаешь дальше, выполняя свою задачу чужими руками. тупо гугл даже выдаёт опцию в гцц, например -fcf-protection . а сколько там стек протекторов
>>1657301 >Хуйня. А вот прогонять через санитайзеры - это всегда хорошо. не, не хуйня. я хочу максимальную переносимость. и не хочу печатать лишние скобочки.
>>1657302 > если есть ансейф - то можно. и есть библиотеки, которым ты доверяешь что они безгрешные. Раст на пути юзать только растовые либы. > в смысле не связанно? ты затираешь возврат на стеке в заранее известны код, где-то у ret. и прыгаешь дальше, выполняя свою задачу чужими руками. тупо гугл даже выдаёт опцию в гцц, например -fcf-protection . а сколько там стек протекторов Во-первых, бинари как правило не компилят с этой опцией, особенно если они должны быть быстрыми, так как эта мера имеет сильное влияние на скорость исполнения. Во-вторых, есть модифицированная техника обойти и эту защиту -> https://marcoramilli.com/2016/06/23/from-rop-to-lop-bypassing-control-flow-enforcement/, приятного аппетита и с добрым утром, нашли способ как это обходить еще в 2015-2016. В-третьих, стек протекторы - слабая защита. Если у тебя есть примитив либо на чтение, либо на запась (даже 1 из них сгодится) - ты сливаешь значение протектора и переписываешь его его же значением, чтобы он при возврате не крашнул прогу, либо при примитиве на запись ты записываешь ЗА протектор, сразу перезаписывая сам адрес непосредственно. В-четвертых, на стэке свет клином не сошелся, есть еще куча.
>>1657304 > я хочу максимальную переносимость Скажи, сколько твоих хелловорлдов (в штуках) было скомпилировано и запущено на платформах, где нет поддержки C11?
>>1657322 ну, логично что на всякую гайку найдётся болт. не буду спорить, мне не очень интересно. но хорошо, и да, литературу по взломам я читаю только старую из 00х, чисто в развлекательных целях.
>>1657326 я пишу на старые системы. например спектрум. sdcc вроде есть поддержка, но нет Compound literals. Variable-length arrays.
да и смысл в новых стандартах? писал бы на пк - может быть, но тоже вряд ли. просто не вижу смысла. статик ассерт можно самому написать, фикс-типы самому определить. треды поставляются отдельно. атомики - ничего не могу сказать.
Что значит "взять стека" и "вернуть в стек"? Аноны, поясните что это такое на компьютере, в книге просот хуяк и ни с того ни с чего про какой-то стек пошла речь без его определения. В интернете гуглил ничего не понял. Молю, помогите. Что такое стэк на компьютере?
>>1657793 Стек это структура данных в которую можно помещать какую-то информацию. Стек работает по принципу первый пришел - последний вышел. Тоесть если ты положишь в стек сначала 1, потом 2, потом 3. Ты вытаскиваться будет сначала 3, потом 2, потом 1. Почитай внимательней, там скорее всего где-то упоминается что именно за стек. Так как есть некоторые нюансы. Алсо если ты читаешь описание алгоритма то там возможно неявно подразумевается что ты создашь стек который и будешь использовать.
>>1657891 Еще при запуске программы для нее создается служебная структура-стек которая используется для хранения адресов возврата, аргументов, некоторых переменных. Когда говорят "стек" могут подразумевать ее, но к ней нет прямого разумного способа доступа, поэтому фразочки типа "взять стека" и "вернуть в стек" к ней не применимы. Обычно используется что-то типа "переменная хранится на стеке". А если в него и пишут что-то - то там пишут по адресам.
>>1657497 В винде есть привилегии, требующиеся для разных действий, выполняемых системной, их наличие у процесса зависит от способа запуска и от пользователя, под которым процесс запущен. Но даже если программа запущена из-под админа, некоторые привилегии по умолчанию выключены (возьми Process Explorer или Process Hacker, и в свойствах процесса на вкладке Security увидишь). Код включает SeDebugPrivilege.
>>1657898 > к ней нет прямого разумного способа доступа _alloca()
Есть библиотека состоящая из единственного .h файла. Как её заинклудить в несколько моих? Оно ругается: "<название_функции> уже определено в другом объектном файле"
>>1658186 Хмм, не помогло, #pragma once тоже не помогло. Заметил только разницу, если инклудить непосредственно в каждый мой файл, линкер вываливает целую кучу конфликтов, похоже все функции какие есть, а если положить в stdafx.h (который везде заинклужен), тогда выводит конфликты только тех функций, которые я реально вызывал, и их зависимые.
>>1658203 Сделай всем функциям static, все заработает, но без -flto код в бинарнике будет дублироваться. Чтобы не дублировался, нужно использовать нормальные библиотеки, как у людей.
Стоит задача написать брутфорс расшифровщик с одного алгоритма. Естественно надо писать на многоядерное применение, а еще лучше делать это на видеокартах. Понимания как писать для видеократ такую хуету нет, как и для многоядерного паралельного вычисления. Решил посмотрел как там это все для видеокарт делаетя и офигел. Чето не хочется все это изучать про видеокарты ради одной задачи. Что можете посоветовать где копать? И что такая работа может стоить если заказать на стороне?
А то хотел локально на радеоне (мак) на нем попробовать оптимизировать вычислительную задачу, что бы потом не парясь запускать в облаке, на чем-то от Nvidia.
А потом смотрю, книги все о нем старые, релизов давно нет.
Пожалуйста, пользуйтесь https://ideone.com/#, https://wandbox.org/ или 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 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://github.com/kozross/awesome-c
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №52: http://arhivach.ng/thread/529928/
- №53: http://arhivach.ng/thread/529929/
- №54: http://arhivach.ng/thread/535256/