Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному /clang/
Аноним18/07/23 Втр 04:34:09№27707681
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный 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 помогает читать сложные сишные декларации. Прошлый: >>2713428 (OP)
>>2771440 Это не продолжение ли предыдущего треда с умопомрачительными примерами работы со строками в циклах с очень неожиданными итераторами? Лучше бы на двачах звёздочка без проблем ставилась. Вот уж где зашквар. Здесь же айтишники одни сидят. А то приходится вот это - ★ ставить... Или я чего-то не знаю? )
Я вот до поры до времени не знал, что это - int★ value, value; // - указатель и экземпляр, а не 2 указателя... Вот это действительно подлянка. Потому что в куче примеров по инету пишут как попало. После этого стал писать звезду рядом с именем всегда, чтобы визуально отражало сущность творимого. int ★xlink, x = 5; xlink = &x;
Блять какой же странный язык без готовых библиотек и функций как в питоне. Вот например ввод пользователя - откуда блять из головы у меня должно вылезти fgets stdin.
>>2772140 Учебник тебе должен про обвязку рассказать. Это вроде POSIX. Терминал, ну. Есть ещё stderr для всякого дебага, чтобы вывод не засорять, потому как обычно его по конвейеру дальше часто передают, другим утилитам.
>>2772363 В первых версиях структур не было. А когда они появились, то поля были общими. Именно поэтому у структур в UNIX часто встречается префикс связанный с ее именем. Зато не нужны были union, ведь если ты определил поле A первым в структуре, то теперь оно будет во всех структурах помещается автоматически на offset:0
Вот есть у меня цепочка функций, по большинству передается const state указатель. В одной из функций беру неконстантный указатель на поле стейта через каст (очень нужен кусочек памяти, а он там есть свободный). Чем это чревато?
Допустим, есть у меня функция send_char(char c), которая отправляет символ в UART. Как к ней прикрутить какую-нибудь printf-подобную функцию, чтобы удобно печатать всякие строки с форматированием?
Знаю, что можно malloc'ом выделить память, напечатать в неё через sprintf(), а потом побайтово отправить результат, но есть ли варик как-нибудь обойтись без промежуточного выделения памяти (и без ломания stdout, а то я видел, как народ в нём что-то переопределяет с этой целью)?
>>2774456 Мне это надо не на Линуксе, то есть работать через /dev/tty* в моём случае не варик. У меня код работает на голом железе, а send_char — функция, которая пишет прямиком в регистры.
Вот здесь пример, как чел берёт stdout и переопределяет внутри него указатель на функцию (put)(), чтобы печатать в UART AVR'овского микроконтроллера. https://wiki.loliot.net/docs/mcu/avr/avr-printf/ Наверное, надо как-нибудь его адаптировать для работы с произвольным FILE и скармливать его fprintf'у
глупый вопрос
Аноним20/07/23 Чтв 22:25:32№277548618
У меня крайне глупый вопрос. Вот такой код: #include<stdio.h> int main(int v, charv) { printf("%d\n",stdin); } Почему у меня выводит большое число? Разве это не дискриптор, который есть в самом начале у программы(а потому его значение не должно ведь быть огромным)?
Вот накачал я книг этих, которых советовали, штук 10. Ни в одной из них внятно не написано как работать с .dll и .so файлами. Даже нигде не написано, как загрузить библиотеку и заюзать её в сях. До сих пор гуглю, мне только выскакивают LoadLibrary() из винапи и dlopen() из dlfcn.h. Ну вроде dlopen() стандартный способ, щас буду проверять.
Удивительно - вообще 0 упоминаний об этом в книгах, что не так с ними? В файлах любой проги на С написанной покопаться если, то там будут тонны этих .dll и .so, но в книгах почему-то про это забыли нормально написать. А это явно база, классика, и это знать надо.
>>2777113 Си это универсальный мультиплатформенный язык, а .dll и .so это конкретные платформы Windows и Linux, поэтому эти вещи не попадают в контекст языка. Тебе надо искать книги "Программирование на <платформанейм>". Для винды это Рихтер, "Windows для профессионалов", разжевано дальше некуда, если осилишь, будешь супер-хакером визардом творящим чудеса.
>>2777129 потому что их овер 40 лет разрабатывают (гну до линукса существовал) и овер 40 лет в списках рассылки просьбы добавить очередную опцию от очередного скриптописателя на баше.
>>2777239 Чтобы изучать что-либо достаточно это и делать. А вот чтобы писать программы надо изучать платформу под которую пишешь, ты ведь пишешь реальную программу под реальное железо, а не фантазируешь в вакууме.
>>2777255 Умничать можно и с меньшим кол-вом воды. Мне просто интересно как лучше подойти к стандартной библиотеке Си, чтобы изучить все (либо просто понять что делает та или иная ф-ция), потому что в википедии как-то совсем всё скудно описано, да и в других статейках, что я встречал не так чтобы всё подробно расписано (например как у Столярова про stdio.h), поэтому и интересуюсь, мб, у вас есть какая-то имбовая книга, либо статья, которая расставит все точки над и.
>>2777261 Чтобы изучить фсе, начни со старых источников, вроде книжек кернигана или мануалов к старым юниксам. Так ты узнаешь, что действительно лежит в основе бибятеки С. Дальше полирни это чтением старых (простых) исходников, только не подвиндозного кала со примесью хуй86.
Вопрос такой: могу ли я средствами библиотеки unistd сделать вывод на консоль? Я знаю, что могу использовать scanf из stdio, однако интересно, можно ли такое сделать через unistd.
У меня есть догадка, что нужно что-то вписать в какой-то файл, однако я не имею уверенности, что это так.
Не советую читать исходники. Бред какой-то. Нужно делать маленькие тренеровочные программки своими руками, в том числе и с помощью готовых КОРОТКИХ примеров из учебников и статей, расширяя их функциональность и сравнивая с другими такими же примерами. Просто читать исходники для образования - дичь! Можно разве что обратить внимание на стиль программирования. Но заниматься таким "реверс-образованием", анализируя чей-то готовый код - то ещё извращение. Самому надо, я считаю; по возможности, конечно.
>>2777685 NIH дебил закукарекал. Неумение читать код признак безмозглого имбецила, таких вообще нельзя допускать до компьютеров, кроме как в браузер тыкать одним пальцем.
Единственное и правильное обучение - форкаешь чужую программу и делаешь изменения. Так же как единственный геймдев начинается вовсе не с написания своего движка, а с модов к существующим играм. Кто не умеет читать и использовать чужое, тот и свое не сможет сделать, тупое говно отродье тупого говна.
>>2777417 Я щас качаю исходники на арче вот этой функцией, которая у меня в .bashrc: function getsrc() { asp export $1 && \ pushd $1 && \ makepkg -do --skippgpcheck && \ pushd src } По идее для любого пакетного менеджера такое должно быть. Правда, я скачал так glibc и нихуя не понял даже приблизительно откуда include <stdio.h> забирает тело функций, ведь в stdio.c почти нихуя не написано. И makefile там неебических размеров который тоже нихуя не понять сразу.
Ещё иногда просто git clone делаю с гитового репозитория.
>>2777778 Да, хорошие книжки, но они нужны всего лишь для тех, кому интересна эта тема, а вовсе не для обучения нубов программированию путем пропаганды идеологии NIH. Такая пропаганда воспитывает только дегенератов, и только дегенераты её продвигают и считают верной. Данные книжки тут ни при чем, проблема в людях, и конкретно в данном треде, этих самых дегенератах.
>>2775769 ты будешь в шоки, но в хай левл языках к анонам прилипло слово дескриптор, что сутью своей отражает поинтер на адрес где начинается описание хуйни
>>2775486 stdin это указатель на экземпляр структуры FILE описание которой есть в stdio.h
сишник в этом плане очень гибкий, ему похуй откуда ты читаешь/куда пишешь делаешь прост новый FILE экземпляр и заполняешь структурку данными например через fopen() эта функция сразу салоцирует новый экземпляр и заполнит структуру если фал найдет
типа FILE * myFile = fopen();
myFile теперь такой же "дескриптор" то бишь поинтер на экземпляр FILE куда можно писать и откуда можно читать.
только юзать надо будет функции где в аргумент ты пихаешь поинтер на FILE например fread() иначе будешь читать/писать в stdin stdout по дефолту
из вышесказанного - stdin это указатель/поинтер/дескриптор printf("%d",stdin); печатает адрес stdin в десятичном виде
>>2777113 давай вкратце расскажу есть статичные библиотеки (функций, но лучше будет сказать машкодов) и динамические библиотеки (функций/машкодов)
эти обе хуеты сами из себя представляют скомпиленные из сырцов объектные файлы .o которые уже запакованы в библы .dll .so
например так gcc -shared lib.o lib.so >ну или типа того сами гцц команды погугли я не сильно шарю ну и вот у тебя например появилась статик библа в которой есть машкоды описания функции huyjopa() далее ты ебашишь какой то хеловорлд где тебе понадобилась твоя huyjopa
делаешь что то вроде main(){ huyjopa(); return; }
а значит надо линкануть откуда взять описание как huyjopa работает gcc myapp -L lib.so или типа того опять же погугли команды линковки гцц я руками ничо не собираю
и вот в итоговой приложуни появляются машкоды из библиотеки и твой хеловорд теперь знает что такое huyjopa и чо он делает
с динами библами то же самое, только линковка машкодов происходит прямо в процессе исполнения твоего хеловорда и для таких фокусов надо заинклюдить библу с интерфейсом который умеет тянуть машкоды из динамик библиотеки прямо в процессе выполнения программы
>>2778356 > функций, но лучше будет сказать машко Библиотека содержит таблицу символов и секции с кодом/данными. Символы могут ссылаться внутрь секций или на абсолютные адреса.
Пишу свое ядро ОС и бутлоадером. Как в системе сборки cmake настроить компиляцию и линковку ассемблерных файлов вместе с файлами C++, а также задать кастомный скрипт линкера и слинковать с ним бутлоадер?
>>2780244 >>2780245 Ээээм... Отдельным тагретом прописываешь прогон твоего ассемблерного кода через нужный тебе ассемблер. Потом указываешь этот таргет, как пререквизит к основному таргету и линкуешь там при компиляции полученные object-ы.
Все эти opengl с++ либы после компилирования приложения создают два окна - одно консольное, другое с opengl выводом. Тем не менее любая игрушка открывается в единственном окне. Как мне сделать, чтобы консольное окно не открывалось и не висело в фоне?
>>2780379 Было такое в пердокомпиленной программе, не игре, но тоже вылазило паразитное консольное окно. Пробовал ебаться с опциями компилятора, не помогло, в итоге плюнул и вставил в начало WinMain строчку скрывающую это поганое окно. ShowWindow(GetConsoleWindow(), SW_HIDE);
>>2780317 Можете помочь со сборкой такого простого проекта? У меня уже спортивный интерес собрать его симейком. Руками из обжектов бинарь собирается (хотя, наверное, в неправильном формате), а симейк его собрать не может
>>2780466 Гидра показывает, что libboot.a это эльф файл, внутри него start.s.o с моим кодом и системными секциями. Вроде нормальный формат, что линкер на его ругается?
Итак я закопался в какой то хуйне и не могу решить простейшую задачу. Поэтому прошу помощи.
Сап моряч, есть одна задача.
Дано: две строки текста произвольного размера и набора символов (русские англицкие буковы цифоры управляющие анси последовательности все в перемешку). Задача: запринтить каждую строку в свой блок. Один блок слева, затем пару пробелов как разделитель экрана и затем блок справа.
>>2781532 UPD: Каретку нельзя двигать при помощи АНСИ, запринтить надо без этих фокусов.
Причина ограничения: SetCurPos ставит каретку не учитывая что в консоли могут быть уже напринченые строки от других программ - не подходит. MoveCurUp стирает нижние строки при прыжке каретки наверх - не подходит.
Как же приятно байтобить, ммм. Можно считать бинарную последовательность, а потом ебать ее как душе угодно. Хочешь вывести значение переменной типа short как два символа? Да, пожалуйста, просто скастуй нужный тип к указателю, прибавь смещение и разыменуй. И многое другое... В общем, пока что годно. мимо скриптомакака
>>2783137 >. А ты говно накидывал ? >#define zero 0 >#undef zero Так не работает, потому что в fwrite первым аргументом нужно передать указатель на область памяти откуда будут браться значения.
>>2780379 У вас в типе исполняемого файла установлена консольная подсистема. Для консольной подсистемы Windows автоматически будет создавать консоль (либо берёт родительскую). Чтобы такого не было, нужно задать оконную подсистему в опциях линковщика. В makefile добавь Для консольной подсистемы LDFLAGS+=-subsystem console Для оконной подсистемы LDFLAGS+=-subsystem windows (или вручную пропиши)
>>2784774 Э нет, пидор, для начала пофикси очередность декларации, а потом я смогу не инклюдить хедер парашу. Как это сделано в языках следующего поколения и которые создавались для людей, а не животных.
>>2784779 Я хочу инклюдить cpp файлы без хедеров в любом порядке. С++ этого не позволяет сделать, чем путает ньюфага и заставляет копаться в унитазе полном ошибок.
Анон, подскажи, пожалуйста, почему в тестах постоянна появляются дополнительные элементы в конце строки? Запускаю этот код у себя на линуксе с компиллятором gcc и всё норм, но вот запускаю на кодеворсе, и там какой-то мусор в конце строки.
>>2786339 Ну а второй вариант - ты где то поинтером вышел за пределы и пишешь в строку всякий мусор декодируя это в символы. Но параллельные вычисления это канеш зло, инкрементни до записи, любитель писать все в одну строку.
>>2786342 А что не так, кстати, с параллельными вычислениями? Компилятор то всё равно это раскладывает на машинные коды, а на них это выражение ничем не отличается от того, если ты перенесёшь эти действия на две разные строки. Ну да, возможно, порядок немного изменится, если в представленном примере увеличивается значение, которое лежит по адресу el_in_str, потом предыдущее значение прибавляется к адресу str, после чего увеличенному адресу присваивается значение el_in_arr; то, если мы перенесём инкримент el_in_str на следующую строку, то сначала значение el_in_str будет прибавляться к адресу строки, затем присваиваться элемент из el_in_arr, и после этого будет увеличиваться значение el_in_str и заносится по месту хранения этой переменной. Но суть не меняется - выполняются одни и те же действия.
Или тут дело в том как у них организованы тесты? Т.е., мб, там совсем не участвует компилятор, т.е. мой код не переводится в машинные кода?
>>2786421 Если использовать, кстати, ф-ции из string.h, то всё норм получается. Но я пока их не хочу использовать - по совету Столярова, чтобы лучше понимать, что такое строки в Си.
>>2786416 На твоей машине не отличается, а на другой отличается. Как и байтсдвиги на разных машинах реализованы по разному, как и касты типов на разных машинах реализованы по разному.
>>2786431 Ну да, это то просто! Но вот, когда начинаешь решать подобные задачки, то и начинаешь вникать во всю эту арифметику указателей, во все эти массивы чаров и т.д.
>>2786435 Понимаю, но на предыдущих итерациях решения этой задачки я всё что можно было сайзоффал, но один хер что-то не то получалось.
>>2786435 > Как и байтсдвиги на разных машинах реализованы по разному, как и касты типов на разных машинах реализованы по разному. А эти различия в каких рамках проявляются? В рамках одной модели/линейки/архитектуры/...?
>>2786431 Не обязательно чаров. Там могут лежать вайдчары или вайдинты или вообще мутированные вайдинты которые хавает petchar() например.
Зависит о способа кодирования символа в строке. Как пример русские буквы кодируются двумя байтами, юникод секвенции то же кодируются двумя байтами, ошибка чтения из гетчара кодируется четырьмя байтами.
Чот сегодня день базы. Только что провел ликбез своему патрону по этой хуйне.
>>2786440 У меня сбор статистики скудный. На интеле сигнде бит перезаписывается, на арме нет. Вот и вся моя статистика. Покопай гугол. Разница архитектур обозначает разницу в опкодах, которые соответственно по разному делают вещи.
>>2786444 Потому что только вникаю во все эти нюансы. Это же так просто, анон! Тут пока руку на таких ошибках не набьёшь, то такие элементарные действия не войдут в привычку.
Вообще на Сях тяжело писать что-то большое после высокоуровневых языков. Приходится переизобретать ООП, структуры данных, алгосы, которые обычно лежать в стандартной библиотеке тех же плюсов. Я вообще не понимаю как ядро линуса пишут и как этот говогкод работает. Одно дело небольшая утилитка, а другое дело кодовая база в миллионы строк.
>>2786458 Да ничо тяжелого нет. Дольше просто. И часто есть вилка выбора пихать вычисления на стек или не пихать. В плюсах такой вили не будет, насрет в стек конструкторами деструкторами и не спросит даже.
Я могу только понять нытье за отсутствие стрингов как типа (ну и булевых констант). Но это дело привычки на самом деле.
>>2786462 >Я могу только понять нытье за отсутствие стрингов как типа НИНИУЖНА, особенно для минималистичного и топорного языка как Си. Строки - это как структуры данных, под каждую ситуацию нужна свои. В ту же Аду несколько видов строк не от хорошей жизни добавили, поэтому пусть лучше оставят базовый функционал, а юзеры свои велосипеды под задачу пишут.
>>2786218 Я починил баг с изменением значения константы. Виноватыми оказались касты типов при установке отдельных битов внутри байта. Решение: переписал безтиповым макросом, нет каста типов - нет проблем.
>>2786592 Бля я так и не понял чо вы делаете. Каких то сферических коней в вакууме. Ну окей надо вам слеить строки ну юзаните sprintf() зачем по байту перекладывать.
>>2786599 upd Например через макрообертку va_args, пихаем в макро массив слов, внутри фором клеим управляющуюу строку для sprintf, аллоцируем память, передаем управляющую строку поинтер и va_arglist в спринтф, проходим фором меняя нули на пробелы
>>2786610 бля забыл такую хуйню - спринтф сам аллоцирует сколько надо по печать строки в массив, так что можно просто (следите за руками) напринтить в поинтер со здвигом равным длинне строки слова -1
>>2786618 Первая же строчка с комментом кричит "Говно!". Надо делать так, что сначала вызываешь эту функцию в пассивном режиме, она ничего не делает и только возвращает размер необходимого буфера. Потом этот буфер сам создаешь и вызываешь функцию снова, уже с этим буфером, и она его заполняет результатом. А такая самодеятельность с выделением неизвестно чего внутри функции, а потом попытка это отмазать комментом "НЕ ЗАБУДЬТЕ ПОДТЕРЕТЬ ГОВНО ПОСЛЕ МЕНЯ", ну вы поняли.
>>2786416 Потому что все эти твои ++ читать неудобно. Я не хочу рыть многостраничне мануалы в поиске ответа какой из этих ++ выполнится первым, правый или левый, и какие у них побочные эффекты. Во‐вторых, между краткостью и понятностью я всегда выберу понятность. Я в своём коде всегда использую Value += 1. В‐третьих, вы всерьёз думаете, что компилятор, умеющих такие оптимизации как раскрутка цикла, распространение констант, удаление общих подвыражений, вынос инварианты — он не умеет оптимизировать ++ слева или справа?
>>2786614 Анон, спасибо! Буду иметь ввиду, что так можно делать. Но проблема в том, что каждое слово нужно отделить пробелом, а тут я так понял можно посчитать длину всей строки и её сразу же передать sprintf.
>>2786667 >Во‐вторых, между краткостью и понятностью я всегда выберу понятность. Я в своём коде всегда использую Value += 1. Да, понял, анон! Я просто не думал, что я буду кому-то показывать этот код, но из-за этого '\0' в конце строки, я чёт взгрустнул вчера под конец дня и решил спросить анона. >он не умеет оптимизировать ++ слева или справа? Я не сомневаюсь, что он это умеет, я просто не понимаю, что здесь оптимизировать, ведь в машинных кодах это и так всё до невозможности просто выглядит.
Решил я значиться изучить си. Но у меня немного ООП головного мозга. Собственно. Я тут хочу получить фидбек насчет организации своего кода. Так вообще кто-нибудь пишет на Си? Я просто не очень много смотрел примеров чужого кода сишного. Придумывал на ходу. Вот примерно такой стиль придумал. Думаю суть понятна. Объектов у нас нет, пусть будет структура, а ей сразу определяем как указатель будет обзываться, чтобы постоянно звездочку не дописывать. С о всякими функциями которые надо так же передать в другую функцию - делаем typedef для описания сигнатуры, в потом ссылку на функцию помечаем через прификс d (от delegate)
Ну и функции - так же, чтобы типа сэмулировать неймспейсы и стандартную структуру ООПшную - типа имя модуля, имя подмодуля, типа имя объекта, и собственно - сама функция. Что типа "статичное" - не принимает в себя поинтер на объект, что типа делает что-то с объектом - последним аргументом - поинтер на объект и типа обязательно обзываем его self, ну, типа чтобы сэмулировать привычные this.
Собственно. Я уже сказал. Хочу фидбек по такой вот организации кода. В мире Си - пишет так кто-нибудь? Или мне как в растах-питонах опять надо перестраивать свой майндсет и пытаться как-то иначе все это дело делать?
>>2786737 Просто закинь в ридми свою нотацию по неймингу и не парься. Не знаю алиасы на поинтеры мне не нравятся. Будто чел и жабы пришел и на звезды смотреть не может.
Ладно, я хуйню сморозил. Ставьте звезды где вам нотация пишет их ставить и ебаште те алиасы которые нотация позволяет. Если у вас по неймингу uint8_t ⚹p то так и будет нормально. Если у вас по неймингу typedef uint_8t⚹ uint8_ptr то так и будет нормально.
>>2786886 >Звезды вправо для сойжаков, звезды влево для труолдов. Схуяли? Ветераны линукса и юникса всегда справа ставят, можешь сам их код посмотреть. Алсо, такого типа данных как указатель не существует, так что звездочка должна к переменной относиться. Иначе бы >int⚹ a, b, c; работало для всех одинаково.
А что если ⚹p это составное имя? Ну типа (⚹p) то же самое что (аа) только аа мы не можем разделить на сущности потому что аа не составное имя, а ⚹p можем потому что составное.
>>2786933 >Алсо, такого типа данных как указатель не существует Пошел ты нахуй, пес. Если не существует тогда почему этот код с пика не работает? Жду маневры.
>>2787172 И чего ты подорвался? Код с пика не работает потому что в Си семантика некоторых операторов зависит от контекста. И в данном случае разрабы Си и компилятора сделали так, что при обьявлении указателя ты никак не присвоишь ему значение по значению. оп, каламбур Если написать >int ⚹p; >⚹p = 10; или >int i = 10; >int ⚹p = &i; то все заработает. Алсо, если указатели это такой же тип данных, то почему >int⚹ a, b, c; не работает? и почему я не могу сделать так? >int ⚹(⚹p) = 10;
>>2787212 Ты же сам маняврируешь изходя из топологии деклараций и инструкций, мол это разная хуйня и тут же переспрашиваешь почему это разная хуйня.
>Алсо, если указатели это такой же тип данных, то почему >int⚹ a, b, c; >не работает?
По тем же причинам по которым мой пик не работает.
Объявляй каждый свой инт на отдельной строке int ⚹a; int ⚹b; int ⚹c;
>и почему я не могу сделать так? >int ⚹(⚹p) = 10; А что ты тут пытался сделать? По твоей шизотеории ты пытаешься в инт положить инт, но опять что то пошло не так, да?
У меня возникла мысль что флаги не нужны. Я все флажки засунул в 1 байт чара и чекаю там биты на приедмет труфэлса. А нахуй? Можно ведь просто сделать если чар = 1 делай это если 2 делай то, что по сути избавляет от вичислений быта и многократных проверок на истинность. Булы не нужны. Пруфмивронг.
Подскажите чмоне, который только жс по видео из ютьба изучал что делает код: uint8_t buffer size_t name = strlen((char) buffer); Буфер из файла в нем сначала иду слова, потом цифры и так несколько раз
По идее, это длинна фразы, пока байты можно трактовать как буквы, но я не понимать тогда как это работает
>>2788274 Если буфер это поинтер на насигнединты тогда нэйм это длина строки буффер в байтах записанная в память длинны сайз_т байт Если проще - буферр это строка, нейм это длина строки в байтах (а не в символах).
Я никогда не понимал нафига люди юзают стрлен которая ходит циклом по строке и считает байтики (занимает процессорное время) если можно просто сделай сайзоф (который будет вычислен на этапе конпеляции и не тратит процессорное время)
Другое дело когда ты именно символы считаешь (например только печатные а в строке еще и непечатные), тогда конечно это другой разговор, в строке могул лежать не английские буквы длинной по два байта или непечатные символы по 5 байт например.
>>2788338 Или стрлен проводит анализ байтов на предмет вайдчара вайдинта? Я смотрел реализацию в своей библе и у меня там топорный вайл. Это мне в штаны насрали или так она и реализована у вас?
>>2788623 Такс... Если >wchar_t многие символы имеют в составе нулевой байт Тогда как это вяжется с представлением строк. На вики написано что вайдчары нужны для отображения широких символов (что бы это ни значило, эмодзи в виме какие нибудь), но представление строк это набор байтов в конце которых нулевой байт. Даже если мы пихаем строку в условный wchar_t[] то принтим то мы ее по формату представления строк - тобишь по вайлу пока не встретим нулевой байт.
У меня есть домыслы что кодировка вайдчаров походит на кодировку анси секвенций. У анси 27...какиетобайты...109, тобишь ловишь обратный слеш (27) и пока не будет 109 мы все еще читаем байты анси секвенции. Наверное в вайдчарах так же, тогда вообще не проблема. Типа я знаю байт входа и байт выхода - налепил обработчик и готово.
>>2788624 >Тогда как это вяжется с представлением строк. Прямо. wchar_t это UTF-16LE, нативная кодировка ядра и прочих подсистем Windows. В Windows любые обращения со строками к системе преобразуют эти строки в UTF-16LE (wchar_t), поэтому проще всего и лучше всего сразу писать программы в wchar_t (т.н. юникодные программы), чтобы не срать говном преобразований туда-сюда. Исключение только печать в консоль терминала cmd.exe которая wchar_t не поддерживает из за легаси-совместимости, здесь требуется преобразовывать текст.
Что касается представления текста, недавно как раз вышла программа для дебилов, смотри анимированную гифку.
>вайдчар wide char = wchar_t Фиксированный размер в 2 байта (в винде стандарт), просто тот же char, но широкий. Вроде есть и длиннее, в 3 байта например, но зачем оно надо я не знаю, в основном не надо ни для чего.
>широких символов (что бы это ни значило, эмодзи в виме какие нибудь) Бессмысленная хуйня, которая может означать как вайдчар (выше), так и просто символы длиной более одного байта в кодировках с переменной длиной (UTF-8), такие символы называют мультибайтовыми.
Секвенции нужны только для мультибайтовых символов, чтобы отличать их от символов другой длины. В wchar_t все символы одинаковые, никаких секвенций не нужно и их нет, просто пробегается по массиву как с char, поэтому в wchar_t у каждого элементарного символа ASCII есть нулевой байт, им просто не нужно 2 байта, второй получается лишний с нулевым значением.
>>2787212 >Алсо, если указатели это такой же тип данных, то почему >>int⚹ a, b, c; >не работает? Потому что синтаксис у указателя это звёздочка перед переменной, поэтому вот это работает: >int a, b, *c; это говорит о том, что мы объявили три указателя, которые должны могут указывать на целочисленные переменые.
>>2789339 Работает, почему эти записи не должны работать? Я говорю, что эта запись >>int⚹ a, b, c; не будет создавать три указателя. Ну и те записи, которые ты перечислил, тоже лучше не употреблять, ибо принято звёздочку ставить прям перед переменной без всяких пробелов. Просто с эстетической точки зрения это выглядит более опрятно, и сразу же объясняет то, что та или иная переменная есть указатель.
>>2789379 >int ⚹myfunc(unsigned ⚹ , char ⚹); Менее читабельна чем Для меня наоборот второй вариант менее читабельный. Хз, как это объяснить, но когда я вижу первый вариант, который ты считаешь мене читабельным, то мне сразу понятно, что myfunc должна вернуть указатель. А когда читаю второй вариант, то мозг как бы на мгновение останавливается и начинает вспоминать, что это означает. Мб, конечно, дело привычки, но всё равно более эстетично выглядит первый вариант, когда звёздочка прям перед переменной.
>>2789390 А почему твой мозг считает что должна вернуть указатель на переменную, а не указатель на функцию например, ведь звездочка у имени функции стоит а не у имени переменной?
Я просто пытаюсь понять почему у вас паттерны "сщуность ⚹сущность" обрабатываются проще чем например "сущность ⚹ сущность"
>>2789400 >должна вернуть указатель на переменную, а не указатель на функцию например Указатель на ф-цию? Ф-ция должна вернуть указатель на определённую область памяти, в которой это ф-ция производила какие-то действия. >сущность ⚹ сущность Да просто, потому что это похоже на умножение. >сщуность ⚹сущность А это есть указатель. Просто, когда ты пишешь >int ✱a то тут нет сомнений, что это указатель на целочисленную переменную а. А когда ты пишешь >int ✱ a то это будто ты умножаешь int на а, что мозг первым делом отвергает, потому что это бред.
>>2789411 >указатель на определённую область памяти, в которой это ф-ция производила какие-то действия Ну а вот например так если ... result = printf; return result; }
>>сущность ⚹ сущность >Да просто, потому что это похоже на умножение. >>сщуность ⚹сущность >А это есть указатель. Что насчет a ⚹b? Понимаю что без деклараций не разобраться что есть а что б. Но я намекаю на то что это так же может быть умножением и так же может быть поинтером как и a ⚹ b как и a⚹b и даже a⚹ b Добавим сюда декларации typedef int a; и это поинтер Добавим другие декларации int a,b; и это умножение
>>2789425 >result = printf; >return result; >} А здесь что не так? В result будет записан какой-то мусор, и этот мусор будет возвращён.
>Понимаю что без деклараций не разобраться что есть Ты же сам ответил - всё зависит от деклараций, но когда задекларирован указатель, то читать проще, когда звёздочка перед переменной.
>>2789434 >В result будет записан какой-то мусор Почему ты считаешь что будет записан какой то мусор?
> но когда задекларирован указатель, то читать проще С этим я не спорю. Я спорю с тем что есть формат деклараций прототипов а именно [ тип возвращаемого значение ] пробел [ имяфункции ] скобкаоткрылась... а в ваших декларациях имя функции со звездочкой вы же потом не пишите кол как ⚹myfunc() правильно?
>>2789462 Ты решил меня потроллить тупостью? Резулт в том примере вернет указатель на принтф. Указатель на принф по твоему мусор что ли?
>myfunc это и так указатель, получается, что ты хочешь получить масло масленное. Примеры где ты делаешь колы функций через звезду тащи сюда.
И вообще весь этот холивар проистекает из утверждения о том что такого типа данных как поинтер не существует (да может быть это корректное утверждение с точки зрения того что есть такой тип данных как адрес, но не поинтер, однако я думаю анон имел ввиду совсем другое)
Опять же вернемся к стандартным поинтерам >int ⚹p; В данном случает поинтер это р а не ⚹р и вот почему р++ - двигаем поинтер на sizeof(int), а не ⚹p++ - двигаем поинтер p = arr[30] - устанавливаем поинтер, а не ⚹p = arr[30]
Из всего этого есть один вывод простой p это переменная типа int ⚹.
>>2770768 (OP) 1. Язык Си это часть языка С++? 2. Если это так, то зачем тогда учить отдельно Си? Можно выучит С++ и знать одновременно два языка(Си и С++).
>int a, b, c, d, e, g, h; Откуда у вас вообще возникла идея объявлять все переменные в одной строке? Начитались книжек из 1970‐ых годов? Это плохая практика. В современном мире объявлять переменную следует не в заголовке функции, а как можно ближе к тому месту, где она будет использоваться. И желательно сразу с инициализирующим значением.
Кто нибудь из вас замечал, что форы на цисках работают по шаблону дувайл, а на рисках по шаблону вайл? Как вы думаете отработает ли фор с пика при условии что maxsymb это не 0?
>>2790976 Поддвачну. А вообще идеальным вариантом будет объявлять переменную на своем уровне стека и если нужно делать проброс через поинтер на предыдущий уровень.
>>2790976 > а как можно ближе к тому месту, где она будет использоваться. Нет. Неудобно оценивать размер стека. Смешивается декларативное и императивное.
> И желательно сразу с инициализирующим значением. Нет. Отвлекает от декларативного.
Тематика вопроса не совсем по сям но все же. Объясни как мне (архитектурно) состряпать пир ту пир приложуню? я понимаю как законнектить две машины в локалке, но я не понимаю как законнектить две машины в глобалке. Там же динамические айпишнегы провайдер дает. Сегодня антон был под одним айпишнегом, завтра под другим. И как антона найти тогда? На какой айпишник коннект кидать? Я не понимаю.
>>2791974 Никак. При первом запуске "на холодную" требуется централизованный сервер. Потом уже известные узлы можно хранить в кэше, но кэш со временем протухает и снова потребуется сервер.
>>2792105 Я вот глянул курс лекций по сетям и у меня такой вопрос. Если я посылаю пакет на бродкаст (255.255.255.255) в котором например есть еще порт моей приложуни питупи и какая то инфа (ну например с моим айпишнегом в локалке провайдера плюс какая то идентификационная хрень по типу "это я") - то ведь этот пакет получат поидее вообще все в интернете, правильно? Или нет? Ну и значит этот пакет получит Антон на том конце мира и сможет закешировать какие нить данные и послать уже запросик на коннект. Ну и поидее в обратную сторону так же сработает. Или нет? Я ничего не понимаю...
Ну например такая схема Если дозвон до старого айпишнего ничо не дал - нет узла, узел не тот, там нет порта и тд и тп значит это не антон Шлю бродкаст "АНТОХА ОТЗОВИСЬ" или "АНТОХА ЗВОНИ СЮДА" И либо мне прилетает айпишнег антона и я конекчусь, либо антоха шлет коннект до меня и там рукопожатия писюнов тыры пыры в жопе дыры
Крч подкиньте идею, я не оч понимаю. Есть еще какой то опенфлоу и сдн (не днс).
>>2791974 >Там же динамические айпишнегы провайдер дает в "локалке" тоже могут быть динамические айпишники, зависит от окружения
>И как антона найти тогда знать его айпишник. если поменялся, то узнавать заново
>Если я посылаю пакет на бродкаст (255.255.255.255) бродкаст домен действует на уровне твоей локалки (т.е его получат устройства котороые непосредственно с тобой в локальной сети), если по васянски сказать, то маршрутизаторы такой запрос уже не пропускают.
>подкиньте идею, я не оч понимаю
что подкинуть, у тебя задачка какая? Соединить две машинки глобально можно по разному, но для этого, сюрприз-сюрприз, необходимо знать ip-адрес дальней стороны.
>состряпать пир ту пир приложуню может начать со знакомства с peer-to-peer протоколами? мм, как такая идея? вообще я удивляюсь тому, что с абсолютно нулевыми начальными вводными по сетям ты полез писать ptp приложение на С. похвально, подпишусь на блог.
>>2791258 >Нет. Неудобно оценивать размер стека. Смешивается декларативное и императивное. Какой ещё размер стека, поехавший. Компилятор в целях оптимизации все твои переменные может заменить на константу, либо засунуть в регистр, либо переиспользовать под другие цели. Если тебе нужно руками управлять стеком, тебе нужно на ассемблере писать.
>>2792110 >необходимо знать ip-адрес дальней стороны Да это и так ясно. Какая есть технология чтобы его узнать? Ну вот допустим днс выхлоп по ретрансляции адресов в айпишниги кешируется да, но если в кеше нет нужной записи то мы пойдем звонить по цепочке и спрашивать каждый днс шлюз вплоть до центральных доменных серваков пока не получим соответствие записи хуйжопа какому то айпишнеку.
Ну а существует ли такой же проброс вопроса для Антона? Ну как ты спрашиваю в локалке "АНТОНЫ ЕСТЬ"? Все молчат спрашивам на уровне нашего шлюза знают там антона или нет?
>может начать со знакомства с peer-to-peer протоколами? мм, как такая идея? По-твоему мне надо быть инженером технологом пищепрома чтобы бутерброд себе сделать?
>похвально, подпишусь на блог. Подписывайся конечно.
>>2792577 Неправильно, аналогия такая - надо скачать рецепт бутерброда бесплатно без смс, чтобы вместо бутера из говна и мочи увидеть как нормальные люди делают бутерброд из ветчины и хлеба.
Чел, который пытается p2p приложуху запилить, можешь поступить иначе - раздавать сразу на все айпишники мира. Получается, что, если сегодня у Антона один адрес, а завтра другой, но ты, что сегодня, так и завтра раздаешь инфу на все айпишиники в мире, получается, что никак ты не промахнёшься, если у Антона завтра сменится айпишник. а так, конечно, тебе бы матчасть подучить.
>>2792693 Я так и думал сделать, но говорят бродкасты работают только в локалке. Да и прям на все айпишники мне не надо пои идее. Мне надо мультикастить на анотонову локалку, физически он из локалки никуда не переедет, просто сменит айпишник. Та что почается если под старым айпишником не антон надо врубить мультикаст пока не нащупается антон. Я вот так думаю.
>>2792707 >но говорят бродкасты работают только в локалке ну а зачем броадкаст? пройдись по всем белым айпишникам в цикле, их не так много на самом деле.
>>2792707 >пока не нащупается антон Вчера читал про всякие i2p и фринеты, так вот, они там поголовно используют ключи шифрования (приватник и общий ключ). Не знаю, может тебя это на что-то наведёт, потому что излучать цопе по всему миру это тупо.
>>2792748 Мне кажется достаточно апишнека и порта + фразы приветсвия Если это не антон у него не будет порта открытого. Если это челик слушающий сеть со всем открытыми портами - у него не будет фразы приветсвия.
>>2792315 Дурачек, char tmpbuf3[MAXBUF] колпилятор никуда не соптимизирует. Эта хуйня должна быть на видном месте. А для всего остального незачем делать исключение. Объявления только в начале блока, и желательно в порядке убывания размера.
>>2793242 Вот почему даунам нужно со школы вбивать паскаль, мужик был умный, знал что делал. А если сразу дать нормальный язык, они начинают лепить через жопу, мозгов своих понять нет, таких только дрессировать, сразу, потом будет поздно.
>>2793382 Не пойму в чем суть претензии то? Каждый волен выбирать как ему использвать инструменты языка. Сишник позволяет декларировать новые сущности на каждом слое стека, так хули этим не пользоваться? Еще учитывая что выходя со слоя стека не надо следить за памятью и она автоматически считается освобожденной вотличие от кучи - вообще же супер (ну если без статиков). Если мне вот надо безтайповый своп сделать макросом то как мне его сделать то ты предлагаешь? Задекларировать глобалку и через нее свопать? А почему бы не задекларировать локалку на стеке и свопнуть через нее, а потом удалить локалку при выходе со стека?
Крч мимопроходил нихуя не понял чо тут деды друг друга деснами грызут.
>>2793399 >декларировать новые сущности на каждом слое стека Этот прав! Плюс надо учитывать, что каждая ф-ция должна выполнять одно действие и быть компактной, чтобы не держать в голове овердохуя переменных, когда читаешь код, следовательно, само название ф-ции, а следом и декларирование переменных, при чтении кода, должно сразу давать представление о том, что за алгоритм здесь применяется. А если декларировать переменные хаотичным образом, то получается, надо саму ф-цию разбивать на "блоки", что ломает представление о значении ф-ции.
>>2793242 >Дурачек, char tmpbuf3[MAXBUF] колпилятор никуда не соптимизирует Про оптимизацию «распространение констант» первый раз слышим? Весьма наивно полагать, что такие штуки могут происходить только с переменными а с массивами не могут. Компилятор может выкинуть весь твой тмпбаф3 и заменить его константой, как написано в этой статье https://habr.com/ru/articles/272269/ >Эта хуйня должна быть на видном месте На видном месте — это когда видно где объявлено значит там используется. А когда приходится бегать глазами в заголовок блока, начало функции или вообще прокручивать — это не видно. >и желательно в порядке убывания размера Зачем? Если для выравнивания, то это относится только к полям структур. Одиночные переменные компилятор выравнивает автоматически.
>>2792315 >Компилятор в целях оптимизации все твои переменные может заменить на константу, либо засунуть в регистр, либо переиспользовать под другие цели. В реальности Clang любит захуячить твою переменную в стек, даже когда ты специально кодил так, чтобы в регистрах место оставалось. Стек, по крайней мере маленький, работает со скоростью регистров. Не знаю, как сделано, может у процессора есть кэш стека.
>>2795144 Сколько че ни делал интринсиках SSE2, Clang все время норовит в стек запихнуть, хотя специально экономлю регистры. GCC нет, но быстрее оно не работает.
>>2795271 Работает оно настолько быстро, что там скорее всего никаких обращений к оперативке вообще нет. Может в начале, если это например цикл, из нее читается, а в конце пишется. А при долбежке в цикле выглядит как обращение через rsp, но на самом деле используются какие-то теневые регистры.
>>2795147 >>2795271 Инсрукция может прочитать два регистра и записать третий. За такт таких инсрукций выполняется две и больше. Итого 6 и больше обращений к регистрам. А сколько обращений к памяти за то же время может быть?
Почему гцц смог уместить все в 20 строк, а ебаный шланг размотал эти 20 строк на 60 строк, да и еще зачем-то векторизацию(SSE 128 бит регистры) применил. Старый шланг таки вообще до 200 строк говно размотал.
>>2798277 Тебе ращвернули цикол на 4 или даже на 8, если там упакованные умножения не просто так. Почему? Ты сам сказал шлангу, что хочешь отпимизацию по скорости под хуй сосе.
>>2798277 Чел, хороший компилятор делает Intel, это база, запомни. Никто из серьёзных ребят не компилирует шлангом. В крайнем случае можно майкрософтским компилятором. Шланг и говноцэцэ для мозолеедов, это средства для онанизма, а не компиляторы.
Подскажите а лучше ли сишка++ в плане работы чем например жава? Да сишка вроде как "профессиональнее" но на жаве работа есть и будет всегда потому что востребованность намного выше. Конкуренция тоже выше но это так же значит что легче будет уйти на новое место. По сишке вижу платят больше но вакансий намного меньше, поэтому и спрашиваю. И конечно же не имею понятия насколько "сложнее" сишка++ по сравнению с жавой.
>>2798795 Без высшего образования работы на плюсах нет. Если студент, на третьем курсе ищи интерном место. >>2798810 Работа на крестах собачья, сложная, неблагодарная, плохо оплачиваемая. Не связывайся.
>>2798822 > Без высшего образования работы на плюсах нет. Если студент, на третьем курсе ищи интерном место. Не один раз сталкивался на плюсовых проектах с людьми без высшего образования. Другое дело надо иметь скиллсет, чтобы самостоятельно уметь изучать от и до. А у многих без университета и настояния какого-то подгнившего профФессора с кафедры до бошки какие-то моменты не доходят. > Работа на крестах собачья, сложная, неблагодарная, плохо оплачиваемая. Не связывайся. Если не умеешь себя продать - то все будет именно так, согласен.
>>2799043 Не задавался вопросом, что вероятнее всего clang имеет другие оптимизации врубленные на уровне О2 и О3 в отличии от gcc? Например, подрубает принудительно -march=native там, не? Странно после этого писать что какой-то компилятор говно, а какой-то нет. Это все равно что называть говном clang, потому что он не gcc.
>>2798846 Это вакуха для формошлёпа на Qt-дрисне. В 99% будет микроэлектроника или какая-то очень специфичная предметная область где ты охуеешь, или гейдев, или хайлоад в яндексе. > вышка тут не нужна А ты откликнись, это подразумевается.
>>2798277 Мне думается, что шланг юзает SIMD инструкции. Попробуй получить значение 2^64 и вывести его, если шланг выведет 18446744073709551616, а гцц 0, то вот тебе и ответ, почему шланг юзает 128 битные регистры.
анон, поясни как работает этот makefile, особенно где стоит коммент «это». и пикрил, например. Почему obj5 вызывается?/объявляется? Два раза? Что происходит при первом вызове?
>>2799203 >Это вакуха для формошлёпа на Qt-дрисне Будто что-то плохое, зарплата хороша >В 99% будет микроэлектроника или какая-то очень специфичная предметная область где ты охуеешь Ты будешь там также формошлепить, использовать готовый фреймворк и пулять байтики >или гейдев, или хайлоад в яндексе. Нахуя мне эти единичные случаи? >А ты откликнись, это подразумевается. А я откликался и только додики с заводов требуют вышку Вот еще пример хорошей компании не требуется вышка https://hh.ru/vacancy/82573527
требуют хорошую алгоритмическую базу, но это можно получить без вышки в 2023 году
>>2800110 Да, я вижу, что и там и там int! Я просто подумал, что мб ты сам додумаешься, что нужно просто расширить до ансайнед лонга, чтобы проверить теорию о SIMD инструкции, но не судьба, поэтому подсказка: расширь до ансайнед лонга и проверь.
>>2800242 >>2800258 я вот не ебу чо там за инструкции такие вычурные, но может быть у чела просто шина 64 бита и силанг нативно в лонгах считает чтобы не женглировать байтами мы же вообще ниху не знаем вводных по железкам, но при этом пытаемся построить какие то выводы
>>2799390 >Почему obj5 вызывается?/объявляется? Два раза? obj5 нигде не вызывается. Твой $(obj5) — это переменная, её нельзя вызвать, это не функция.
>$(CC) $(CFLAGS) $< -o $@ //это $(CC) — переменная, в которой содержится имя исполняемого файла компилятора $(CFLAGS) — параметры компилятора $<— это тоже переменная, в ней содержится имя первой зависимости $@ — в этой переменной содержится имя цели
>>2800331 Ну поэтому для начала sizeof(), а потом копать дальше, если будет какая-то разница, ну либо не будет никакой разницы (тогда можно грешить на оптимизацию шланга).
>>2800944 Такая же, ты сам выбираешь идти в проект потеть с математикой или идти в обычный
Мне вряд ли кто-то поверит, но у меня в проекте получали сеньеры 300к без математики и взяли одного задрота гения математики за 150к который расхлебывал все самое сложное
>>2800944 >какой-то супермен им нужен Это заблуждение. Ты просто не знаешь вузовской математики и тебе кажется это чем-то космическим. На самом деле то, что они требуют, решит любой студент 2-3-го курса технического ВУЗа в период сессии. В математике не возникают новые фреймворки каждые 3 года. Там всё настоялось уже 100 лет, этому умеют учить. В математике реально достаточно вдумчиво прочитать один учебник и прорешать в нём задачки, чтобы шарить в этом раз и на всегда, на столетия вперед.
>>2801440 Жопоглаз, ты почитай что на скринах написано. Им нужен не студент, а ветеран С++, Питона, гений науки-решатель нестандартных научных проблем (то есть любых проблем, что работодателю захочется). Им нужен ёбаный господь бог всесильный - затычка во всех дырках, обязанный делать всё и виноватый во всех недоделках, а зарплата - МРОТ.
>>2801701 Я понимаю для чего им нужно решать нестандартные научные проблемы (как бы нефтесервисные компании ушли из России, а потому и кпд у скважин резко снизился), но мне всегда представлялось, что людей, способных решить подобные проблемы плюс продвинуть вперёд технологический уклад страны, нанимают не на hh, а, примерно, как Маск рассказывал, как он переманивал у Гугла типов для OpenAI; либо идут, допустим, в МФТИ и там просят профессора заняться этой проблемой. А тут, блять, hh!!! Это, конечно, показывает уровень менеджмента, которые тупо не могут допетрить, что люди с нужными им качествами с вероятностью, стремящейся к нулю, сидят на hh и ждут подходящую для них вакансию, у подобных суперменов уже и так всё на мази до конца их жизни, и единственный способ их нанять это чем-то заманить.
ебать вы тут конспирологи политологи а между тем это просто техническая вакансия для закрытия таски у хрюнделя никто на нее не пойдет по понятным причинам, а дурака который пойдет сама хрюндель отсеит как долбоеба конченного дефолтно в штат никто не требуется, а хрюндель должен чем то заниматься на работе кроме фильтрации чая через почки, поэтому шлепают такие вот технические вакансии развели срачь на ровном месте
>>2801742 Я практик, человек который проработал не в 1 десятке компаний (меняю работу раз в год), а твои коллеги сидят на 1 месте по 15 лет и даже не понимают как устроен рынок в 2023
коротко: там где нужна сильная математика, об этом напишут жирным текстом и пример таких вакансий я тебе скидывал
Тут 1 чел закончил 2 вышки и форсит что вышка нужна, Другой выучил пайку радиодеталей и форсит что это база третий выучил немецкий и форсит что только с немецким есть будущее в СИ
простите за базовый вопрос, только учусь, но нагуглить почему-то ответ не получается вот у меня есть проект, в котором есть файл cmakelists.txt я его пропускаю через cmake, создавая "MinGW makefiles", потом значит из MinGW использую утилиту сборки mingw32-make и получаю приложение а если мне требуется сменить компилятор на Clang, то какие шаги будут с ним, чтобы из того проекта с cmakelists.txt получить приложение?
>>2803273 Не знаю, как именно в cmakelist и mingw, но для утилиты make в линуксах нужно просто сменить компилятор в условиях makefile. Скорее всего и у тебя должно быть что-то подобное.
>>2803288 > но для утилиты make в линуксах я в винде > set(CMAKE_C_COMPILER clang) так мне не как написать файл, а как скомпилировать уже готовый проект
cmake он на пике что должен для clang делать? в каталоге LLVM/bin я не нахожу аналог mingw32-make, поэтому и спрашиваю как в нем эта цепочка происходит
>>2803300 А дрочить это хорошо или плохо? А анальный секс это хорошо или плохо? А классический секс это хорошо или плохо? А БДСМ и makedome это хорошо или плохо? Это ни хорошо и ни плохо, это всего-лишь различные взгляды на утоление своих похотливых хотелок.
>>2771440 Ну дык логика объявления типов в Си такова, что ты клеишь операторы (скобки, звездочки, []) к имени ровно в таком порядке, в каком их надо будет применить, чтоб получить ту простейшую хрень на выходе слева (int, double, struct psina и т.д.)
>>2790826 Ну, исторически Си появился раньше, а С++ изначально был его расширением, чего не скажешь о последних стандартах, но по-прежнему уделяется внимание тому, чтоб легаси можно было как-то поддерживать/мигрировать, поэтому условная обратная совместимость есть, и нестрого говоря Си можно назвать подмножеством C++. Но...
Во-первых, сишный код без дополнительных флагов, препроцессорных директив и прочих правок не скомпилируется.
Во-вторых, в C++ есть фичи, которые служат настолько исчерпывающей альтернативой многим сишным подходам, что мешать их в одном коде концептуально не по-пацански.
Но учить Си имеет смысл как для будущего сишника, так и для будущего сиплюсплюсника, потому что Си, чисто как язык, можно полностью охватить буквально за пару месяцев, чего не выйдет с C++ (потому что C++ - это путь, на котором ты можешь уже весьма продвинуто программировать, и еще не догадываться о всех приколах языка). Си дает некую законченную базу, некий скелет, который если не полностью подготовит, то поможет не растеряться, когда столкнешься в плюсах с тем, от чего обсирается какая-нибудь скриптомакака. Как минимум в работе с аллокатором. Ну и бонусом гештальт закроешь, что освоил твердую ступеньку.
Алсо, иногда Си пригодится даже более непосредственно. Например, когда работаешь на крестах с какими-то системными либами. Там, где вступает в дело пресловутая "условная совместимость" языков.
>>2803309 >А дрочить это хорошо или плохо? А анальный секс это хорошо или плохо? А классический секс это хорошо или плохо? А БДСМ и makedome это хорошо или плохо? Да.
>>2803424 >Как минимум в работе с аллокатором. в плюсах даже операторов нет блять, только нью и делит, против маллока каллока и реалока / фри хули тут так мало? ты так красиво расписываешь за кресыт но суть проста кресты ооп говно и ненужны, ооп это потребность кабана а не программиста, кабан хочет тяп ляп и в продаккшин оправдывайся
>>2804556 Ну я уже разобрался что у сходу делает мат операцию и говорит системе что х теперь будет 11. Шорткат да но хуйня какая то, если я хочу чтобы переменная что то делала с другой переменной я лучше это отдельно сделаю. А то пройдет неделя и я забуду нахуй что я там накодил и почему нихуя не работает.
>>2804584 >>2804586 да тут нет никакого разночтения эти сахара однозначно читаются, тут дело скорее в том что ++ это самостоятельная инструкция вычисления, а паравозики присваиваний хороши только без вычислений
например int a = b = c = d = 1; это читабельный паравоз и все тут предсказуемо
int a = b = c = d = d + 1; это читабельный паравоз с непредсказуемым результатом
у анона второй вариант и поидее надо просто поставить скобки для приоритета вычисления над присваиванием int a = b = c = d = (d + 1); ну или короткая запись int a = b = c = (d++);
но конечно всегда лучше отдельно сделать инкремент, чтобы потом не дебажить свой говнокод d++; int a = b = c = d;
>>2804595 я бы даже добавил что в языке конечно как бы и присутствуют постфиксные и префиксные операции как раз для разрешения таких вот случаев, но на практике префиксы я почти не вижу потому, что нахуя в голове хранить таблицу приоритетов, когда можно отдельной строкой двинуть счетчи или поинтер и не забивать голову всякой хуйней как скриптомакаки всякие
>>2770768 (OP) Все привет в этом чате. У меня проблема -- я тестировщик, которому временами нужно немного править с/c++ программы, в основном внутренний инструментарий конторы. Из всех знаний по оным языкам -- ОДНА прочитанная книга про С (синяя такая, не помню автора) в уневере, пару фэйловых попыток начать изучать c++ по белой книжке с волной (Страуструп). Могу дебажить код в gdb. знаю про valgrind и fuzzing. Короче анон, я тут что бы учиться программировать -- профессиональным разрабом я уже не стану может это к лучшему. Спасибо за тред.
>>2805346 зависит от того как ты себя продал можешь в мыле ебашить за миску риса, а можешь и хуи пинать за наносеки так что умение себя подать/продать не менее важная хуйня чем профскилы
>>2805346 ну язык простой, поэтому мозгоебли почти не бывают дают задание, пилишь его дня три, попивая кофеек офисный и заедая сибасом на обед попердел пару дней в кресло, скидываешь работу на отдел тестирования и пошел на следующий круг зп 240к
А на C есть что то вроде браузерной консоли как в жаваскрипте? Ну, если код на ходу нельзя менять без компиляции, то хотя бы чтобы можно было туда команды посылать и получать результаты выражений.
Как мне сделать функцию, которую можно вызвать потом и она продолжится с того места где остановилась.
Единственное решение что я могу придумать - это извращения с конечными автоматами, типа:
void foo(fooCtx ctx){
switch(ctx.state){ case 1 : // чет на этот шаг break; case 2 : // чет на этот шаг break; case 3 : // чет на этот шаг break; } }
Но я не верю, что для каждой функции которую я хочу сделать необязательной для выполнения сразу - я должен вот так вот делать. Не может же быть, что в каком-нибудь контроллере, где куча всяких задач и парралельно надо опрашивать датчики - в каждой функции так вот делаеют. Или может?
>>2805647 Ну. Вот в шарпе, допустим, есть вот такая конструкция:
IEnumerable<int> GetInts(int count){ for(int i = 0; i < count; i++) yield return i; }
Ну так вот. Каждый раз, когда я буду обращаться к GetNext() - меня перебросит в метод GetInts и выполнение продолжится с того места где был прошлый yield return.
>>2805665 >А вот как на си подобное сделать - я не понимаю. Никак, я такую шляпу первый раз вижу, пиздец шарподауны ебанулись. Сохраняй состояния, используй глобальные переменные.
>>2805676 >глобальные переменные ну точно скрипткидс Эта хуита для конкурентности придумана, чтобы даже на одном ядре несколько задач выполнялись, хотя бы попеременно.
>>2805681 Потоки не гарантируют, что задачи будут в один временной промежуток выполнены. У тебя может фактически в один момент одно ядро работать по разным системным причинам.
>>2805681 Ну. Я же написал. Вот у меня контролллер. Какой-нибудь дешевый китайский ARM. В моем распоряжении только одно ядро. Мне надо выполнять какие-то задачи. Собственно, какие-то задачи типа чтения с подключенных датчиков - могут долго выполнятся. А надо еще чтобы сверху кто-то подключился и забрал то что уже собрано. Если программа будет ждать, пока с датчика не соберутся данные - она так и повиснуть может навечно, если это какой-нибудь датчик который отсылает данные снизу вверх при изменении значения. А ведь работы много разной. Еще надо к какому-нибудь NTP серверу подключиться и часы подстраивать. Нужно проверять дискретные входы-выходы и фиксировать их состояние в журнал и т.д. И хотелось бы, чтобы на одном потоке, чтобы 1. Не возиться с блокировками и прочим доступом к разделяемым ресурсам. 2. Чтобы у устройства ресурсы просто так не кушать.
>>2805708 > Вот у меня контролллер Ну так он прерывания дергает и прочая железячная специфика там, поток заснул и ждет пока его железо дернет, ты не туда копаешь короче.
>>2805708 >Ну. Я же написал. Вот у меня контролллер. Какой-нибудь дешевый китайский ARM. >В моем распоряжении только одно ядро. >Мне надо выполнять какие-то задачи. Используй ассемблер, в частности инструкции SIMD(single instruction, multiple data). Не знаешь асм - копай в свойства компилятора, чтобы он задействовал simd инструкции, либо делай ассемблерные вставки в Си.
Хотя я наверное придумал, как можно что-то похожее сделать.
Думаю организую EventLoop и на его базе вот такую логику построю.
Типа // events.h
typedef void event_handler(void& context);
void event_enqueue(event_type e, event_handler& handler, void& context); event event_dequeue();
& - указатели, я все еще не знаю как в макабе звоздочки ставить чтобы не курсивом выделялось.
и в основном приложении - буду их обрабатывать.
Просто громоздко как мне кажется получится. Но раз аноны которые за си шарят говорят, что просто продолжить с того места где остановился - нельзя, видимо только так.
>>2805733 Та мне не перед тянками же хвастаться. Просто я прикладной кококодер, которого перекинули на железячный проект, а там все на си и надо с нуля писать.
ля притащили какую то ебалу в тред ну хочешь велосипедить ебани себе отдельным тредом прослушку сокета блять и дергай оттудова сигналы если стандартный механизм прерываний для тебя какая то хуйня ну а так то аноны правы ты просто описываешь стандартные прерывания, ты чота делал хуяк сискол, твой процесс уснул и ждет когда его разбудят после сискола в этот момент врывается мамка одмина со своим жирным процессом и ты превращаешься в зомби
>>2805665 >А вот как на си подобное сделать - я не понимаю. Чего тут понимать, делаешь так же как в шарпе сделано. Изучаешь вопрос и делаешь. Ну или можешь подождать пока за тебя сделают какой-нибудь boost::yield. Удачи.
Видишь ли, у тебя концептуальная ошибка. Си это не абстрактный скрипт как шарп, где под капотом делают что угодно, Си это реальный язык железа, ассемблер. Пока в инструкциях процессора не появится твой yield, его не будет и в Си, не может быть. Всё остальное реализуется на Си, а не в Си, то есть ты либо реализуешь сам, либо ищешь уже написанную библиотеку.
>>2805903 Так на ассемблере я бы просто положил в стек адрес следующей инструкции и нужные аргументы и сделал ret. А потом бы достал из стека следующую инструкцию заполнил регистры и продолжил бы с того места где остановился. Никаких проблем в ассемблере с этим нет.
А в си - я так просто это сделать не могу, как я понял.
>>2806016 Ты не понимаешь как работает компьютер, железо, поэтолму не понимаешь акк работает си, потому что это одно и то же, а ты тупая скрипто-макака.
В данном случае ты спизданул тупость. Стек это аппаратная возможность - железо, он аппаратно только один, поэтому функции сохраняют и восстанавливают состояние только друг за другом - при вложениях. А ты хочешь произвольно оставить на потом, для этого нужно другое место хранения данных кроме общего стека, а компьютер так не работает, нет никакого другого стека, никаких других мест, только один общий, поэтому только вложения друг за другом и никак иначе, никаких "отложить на потом когда захочу" нет и быть не может.
>>2806016 > потом бы достал из стека следующую инструкцию заполнил регистры и продолжил бы с того места где остановился Ты описываешь стандартный возврат из ф-ции. Вызываешь в своей ф-ции ту ф-цию, которая тебе нужна. Вызванная тобою ф-цию делает то, что ты от неё хочешь, и после этого она возвращает управление той ф-ции, из которой ты её вызвал. Если тебе нужно вернуть какое-то значение из ф-ции, то присваиваешь переменной вызов ф-ции. Если тебе это нужно энтое кол-во раз, то организуешь рекурсию, которая будет вызываться энтое кол-во раз, пока не наступит условие выхода из рекурсии. Если тебе это сложно, то организуй цикл с вызовами одной ф-ции из другой, только в этом случае нужно продумать то, как ты будешь сохранять значения, которые тебе будет возвращать вызванная ф-ция (можно для этого создать массив).
Ты сформулируй по-человечески то, что тебе нужно. Либо напиши алгоритм на псевдокоде, только так, чтобы мы все поняли, что этот твой алгоритм должен выполнять.
>>2806099 Можно и список создать, и дерево, тем более, если организовывать рекурсию, и неизвестно изначально сколько данных нужно хранить. Всё зависит от того, что ему нужно в итоге получить.
>>2806134 да, увы, анон измельчал и не может даже сформулировать чо он хочет сделать, если уж человеки не понимают, то как машина может понять?
а вот такой вопрос у меня назрел разве нет способа ретурна из макроса не используя глобалку? ну если учитывать что int a = {printf("huy pizda"),3}; тут а будет 3, то оборачивая такую хуйню в макрос через оператор запятая у меня выходит только глобалку на место тройки подставлять, а без глобалки туда ретурн как то можно воткнуть?
>>2806179 да ну не так топорно же я хочу что то по типу #define MACRO(var) {тут чота делаем,тут результат вычислений}
int a = MACRO(char); например
крч проблема не в том что я не знаю как передаваемый в макрос параметр записать в переменную лол, проблема в том что после оператора запятая ничо не поставить, сишник это отдельной сущностью считает и никак не свяжет с телом вычислений, кроме как если я там буду оперировать какой то глобалкой и сохраню результат в глобалку, а после оператора запятая подставлю глобалку
я вот спрашиваю есть ли вариант без глобалки такое провернуть? ясен хуй это макрос не однострочный по типу #define sum(a,b) (a+b) а многострочный со своей там логикой вычислений и ветвлениями
>>2806194 Анон, я тебе тут не помощник, потому что сам не особо шарю в макросах, но Столяров упоминал конструкцию с do {} while(условие) в теле макроса, возможно, это тебе поможет.
В шапке есть какие нибудь тестики чтобы проверить себя? Там напиши то-то или так то. У меня фантазии нет, только аутизм.
Ну и сразу же спрошу есть ли какой нибудь степ-бай-степ гайд по вкатингу. Самую основу уже выучил, синтаксис и типы даных, конвертеры всякие делал, рандом и базовый матан делал. Все на пару строчек но азы показало. Дальше вроде бы надо про арреи и указатели, наверное.
Ленивый залётный хуесос на связи. Подскажите, мне нужна хэш мапа. Мне надо самому искать код с функцией (не реализовывать же самому), делать с ним файл и это использовать или в дефолтной библе что-то?
>>2806325 кодю в джини единственный недостаток - хоткеи только в энг раскладке работают ебал в рот эти студии с велосипедами из говна, то блять она не знает чо такое джава хотя секунду назад знала, то нахуй кнопка компила пропала и хуй ее назад поставишь ай билять как же сука я заебался с этим всем
мечтаю завязать лайтовый тулчейн из текстовиа шелскриптов и консольки в одной хуйне, большего то и не надо
>>2806333 upd: может не так выразился. Банальный словарь, где ключом будет восьмибитный число (0b00000001 например), а значение - строка. У вас такое есть?
>>2806358 ну ты не дал длину строки так что я затрудняюсь сказать есть ли такое изкаробки но если строка коротенькая и убирается например в 8 байт тогда твоя хэш мапа это просто массив дщнгов или даблов, как хочешь если строки произвольного размера тогда я бы юзнул массив поинтеров на строки, но тогда ты либо юзаешь однобайтный ключ как индекс массива, либо восьмибайтный как адрес строчки, но строчки будут произвольно длинны
>>2806371 ассоциативные массивы в простонародье я всегда обхожу эту тему стороной, но вроде изкаробки есть я просто не понимаю практического применения какой даун будет вытаскивать число через строковые ключи, когда есть например перечисления с нормальным синтаксисом?
>>2806372 Ну смотри. Я ебусь с МК и лсд дисплеем. В дисплей, если по простому, данные записываются передачей определённых чисел. Я передаю один uint8, который обозначает определённый char в дисплее, и дисплей отрисовывает этот char. Я хочу сделать словарь/ассоциативный массив/похуй что, что даст возможность получать по ключу значение (тот самый uint8), что бы передавать в функцию строку, а функция будет бежать по этой строке и по значению знака доставать из словаря значение для отправки в дисплей. Вот такое хочу сделать.
Недавно наткнулся на Zig и ахуел: - Легкий в понимании и с современным синтаксисом - Структуры с функциями больше никакого дроча с организацией кода/объектов/мимикрированием под ооп - Ошибка как возвращаемое значение никаких непонятных стактрейсов, точно видно что и где упало - Comptime - настоящий убийца препроцессора и то, как должно было выглядеть развитие препроцесооров - Есть асинхронщина из коробки, не привязанная к имплементациям ОС - Встроенное тестирование ждал хоть какого то адекватного тестинга пож системщину джва года - Своя кросс-билд система пока make, cmake, пакетный менеджер уже пилится - Встраивается в сишный код хоть сейчас начинай частями переписывать свою байтоёбщину И много чего еще.
Вопрос - а нахуя продолжать писать на сишке, если можно перекатываться в зигу? Литерали та же сишка, только без боли и с нужными вещами. Как бородатые байтоёбы на это смотрят, что говорят?
>>2806526 Я видел, WebStorm, иде-шка для javascript. Сначала кринжанул с уродливого мыльного ненативного васянского гуя с инопланетным устройством и кравиатурными комбинациями для алиенов, после аккуратной красивой студии реально противно. Но потом посмотрел на vscode и увидел то же самое, только намного хуже, и главное функционально нихуя не работает, а WebStorm анализирует любой файл и тут же выводит структуру, подсказки, всё на свете. А потом открыл в нём страницу от гугла с мегабайтами обфусцированной жс-портянки и WebStorm тут же всё отформатировал, буквально мгновенно и можно тут же скроллить и смотреть, без лагов даже (хотя проц в фоне пердит). Итого, совершенно волшебное чудо, летает как ракета, и работает как никто другой. Единственная придирка - мыльные шрифты, ну стандартная линупсо-эппло-гейпараша сделанная с расчетом на 4к мониторы, а на меньшее плевали.
>>2806372 > ассоциативные массивы в простонародье > я просто не понимаю практического применения например, у тебя есть игра, в ней есть монстры, которые имеют id и оно как раз будет строкой, т.к. ты не можешь заменить его числом, потому что если пилить на такую игру еще и моды, то там такой ад начнется, поэтому используют id строковые, бывает как просто имя того самого монстра типа "red_dragon"
>>2806728 > Как бородатые байтоёбы на это смотрят, что говорят? Да, лучше, но долго будет отвоевывать себе пространство Опять же уже есть готовый rust, который уже давно готов и уже отвоевал себе часть ниши, поэтому зигу будет еще сложнее
>>2806736 Зачем строкой, есть же GUID, это обычное целое беззнаковое число, только 128‐битное. Уникальность гарантирована, причём так, чтобы пересчитать все атомы во вселенной.
>>2806761 >>vscode >В 100 раз лучше ДжетБрейновского говна А теперь пруфани. Как в vscode сделать для html файла со свтроенным javascript: автоформат текста, intellisense, всплывающую справку по всем функциям, анализ кода с сообщениями где не так. Со скриншотами, а лучше видео или анимашку.
В WebStorm всё из коробки работает, а в твоём "в 100 раз лучше" что? Нинужно? Пук? Спасибо за внимание.
>>2806728 У тебя подход неверный! Циг хорош, но чтобы его по достоинству оценить, ты должен столкнуться с проблемами в системном программировании, которых лишён этот самый циг. Это как после кодинга на асме ты пересаживаешься на Си и ощущаешь всю мощь и изящество Си, ведь, по сути его и создавали для того, чтобы не кодить огромные системы (UNIX) на асме. С цигом и растом та же ситуация - если ты не пердолился с проблемами, которые возникают при кодинге на Си и плюсах, то как ты поймёшь весь "кайф" кодинга на языках, которые призваны решить проблемы Си и плюсов?
>>2806914 Ну вот видишь, говно твой vscode. Если честно, я его пробовал только за название, думал будет выглядеть как студия, а оказалась та же самая страшенная вебня как и жидбрейны. Только у тех оно хотя бы работает, а это даже не работает. Вот и всё.
>>2806914 И касательно цитаты, я открывал и чистые жс-файлы (плагин для обсидиана) и тоже всё мертво, тупо блокнот голый, ни та что не реагирует, хотя плагин вроде установил этот линтер-хуинтер, но толку ноль. Зато предложил копилот, а потом гордо отрепортил что рахам не положено, мусорное дерьмо.
>>2807210 Работает. Просто ты не сумел настроить. Тебе нужно поставить несколько плюйгинов: C/C++ раскрасит весь сикод и позволит отлаживать программы, устанавливать точки останова мышкой Hex Editor — чтобы смотреть бинарные дампы Makefile Tools — чтобы собирать проекты утилиткой make Memory View — чтобы смотреть память программы
>>2807232 >Hex Editor — чтобы смотреть бинарные дампы мне проще делать objdump > dump.txt >Memory View — чтобы смотреть память программы а это нахуя? мимо
>>2807235 >мне проще делать objdump > dump.txt Чтобы во время отладки можно было навести мышку на переменную или указатель и во всплывающей подсказке увидеть её содержимое. >Memory View — а это нахуя? Чтбы смотреть память по адресу прямо во время отладки. Например, что функции в стэк кладут.
>>2807238 для этого я использую макросы на дебаг которые срут в консольку этими данными прям в рантайме щас бы 500 приложений в тулчейне иметь чтобы обойти стандартный притф(интересующая хуйня)
>>2807242 >для этого я использую макросы на дебаг которые срут в консольку этими данными прям в рантайме О вкусах говна не спорят, но иногда приятно ебануть бряк и через мышку посмотреть, а макросопердолинг это такое.
>>2807242 Мало того, что это засорение кода, которое требует перекомпиляции на каждый чих, так ещё и не выводит всю структуру целиком, а только отдельные переменные или поля. О выводе стека вызовов остаётся только мечтать. Ну и макросы эти не работают в ситуации когда нужно отловить изменение памяти по адресу (поставить точку остановка).
>>2807259 так я микросервисное пишу у меня компил 0 наносек о выводе изменений не понял тебя и про стуктуру то же непонял может ты не знаешь как макросы работают? там для дебага достаточно вставок, в том числе имена полей, имена функций в которых крутишься я еще таймштампы запилил простенькие чтобы чекать профайлинг без профайлинга
кароч чо я тут с вами вожусь, ковыряйте мышкой, я так то не против
>>2807268 >о выводе изменений не понял тебя Кто‐то или что‐то записал в память по адресу. В этот момент нужно чтобы программа остановилась. Я хочу знать какая функция это сделала, распечатать стек вызовов, посмотреть регистры процессора и всё такое прочее. >про стуктуру то же непонял struct student { char firstName[50]; char lastName[50]; }; struct student s;
>>2807528 мне вот лень с тобой спорить, но я думаю тебе будет интересно узнать, что дауны дающие доступ всем подряд к глобал структурам обязаны страдать и заниматься вот такой контрпродуктивной хуетой как >Я хочу знать какая функция это сделала, распечатать стек вызовов, посмотреть регистры процессора и всё такое прочее. очевидно проблема не в том что тебе ниудобна пульнуть в макрос поинтер на структуру и разложить ее внутри вариатиками на свои принты, а в том что архитектура твоего монолита говно
еще меня повеселила твоя аргументация в духе "дядечки написали волшебную палочку я взмахнул и все работаит а я вот написал и ниработаит паитаму ты ниправ"
>>2807580 об архитектуре программы говорит то что ты вынужден смотреть колбэк всех хуйней на стеке и пырить на регистры в поиске виновника которы поменял поля твоей структуры, чо ты тупишь то ептубля, уже на пальцах приходитсся пояснять
>>2806786 > если ты не пердолился с проблемами, которые возникают при кодинге на Си Пердолился. Жаль, что тогда я думал СЛОЖНА ЗНАЧИТ КРУТА, пиздец.
> ты должен столкнуться с проблемами в системном программировании Именно в этом я и пытался хоть что то делать, правда под винду. Дрочил на чистый си и чистую сборку + winapi, в итоге ахуел какое это говно.
>>2806737 >Опять же уже есть готовый rust, который уже давно готов Уже подумывал на него пересесть, стоит ли обмазываться? Хочу его пощупать тк для фронта то же хорош благодоря билд тулам и wasm
>>2806738 СЛОЖНА ЗНАЧИТ КРУТА, ДВУРУЧНИК ДЛЯ ГОСПОД, МАГ ДЛЯ ЛОХОВ
>>2807662 выходит я зря тебя обсирал, полагая что ты очередная формошлепная скриптомакака не осилившая простейший лоулевл язык? вот ты черт, больше так не делай
>>2807657 >Лол, что сложного в Си? Всё сложно. Сам язык простой, но он в таком виде бесполезен. Для использования Си надо знать железо и ОС, вот тут-то и возникает сложность, макаки этого не знают, ведь макакины языки это всё магия, там знать ничего не нужно кроме самого языка, а в Си наоюорот, абсолютная необходимость знать то, чего макаки не знают, это непреодолимая сложность для них.
>>2807583 Мне, в отличие от тебя, хотя бы не нужно ни исходный код программы править, ни перекомпилировать, ни возиться с макросами и фпринтфами, чтобы посмотреть происходящее в реальном времени.
>>2807694 мне не нужно смотреть происходящее в реальном времени ведь я полностью контролирую процесс лол >>2807739 я не буду смотреть, плюсы - говно, давно известный факт
>>2807683 >сё сложно. Сам язык простой, но он в таком виде бесполезен. Ну т.е. происходит подмена сложности предметной области на сложность языка. Если заменить Си на язык Х, то нихуя в общем-то не изменится.
>>2808212 ну ващет изменится перестанешь контролировать срачь на стеке и череду взаимных колбеков конструкторов вызывающих самих себя но это я щитаю идет ноздря в ноздрю с изменением предметной области как раз таки, то бишь поменял сишку на ооп - сменилась предметная область с ручника на автомат, появились волшебные блобы хуйни в хуйне и все в таком роде мимодругой анон
>>2808212 Всё изменится, ты проигнорировал сказанное про магию, а это принципиальная разница, как между черным и белым, небом и землей.
И про предметную область ты чушь спорол. Компьютер и ОС не являются предметной областью, это такой же инструмент как язык. Но в макакиных языках нет компьютера и ОС, ибо они работают в своей виртуалке, которая черный ящик, - магия не доступная и не предназначенная для изучения программистом. А на Си машина реальна и обязательна к изучению, иначе ничего не напишешь кроме бесполезного хеллоуворлда.
>>2806775 > Зачем строкой, есть же GUID, это обычное целое беззнаковое число, только 128‐битное. Уникальность гарантирована, причём так, чтобы пересчитать все атомы во вселенной. потому что в модах id чего-либо приходится часто использовать в скриптах, поэтому его и делают строкой с неймспейсом мода, чтобы убрать коллизии лишние
>>2804291 Так поэтому я и топлю за изучение Си в любом случае, чтоб не было потом на плюсах >тяп ляп и в продаккшин а было pravilno. Живых продуктов с вакансиями на Си может быть не так много, зато есть на плюсах, и есть такие, где в команде правильные традиции.
Да, я вижу, что и там и там int! Я просто подумал, что мб ты сам додумаешься, что нужно просто расширить до ансайнед лонга, чтобы проверить теорию о SIMD инструкции, но не судьба, поэтому подсказка: расширь до ансайнед лонга и проверь
>>2810505 Си это мем. Сюда приходят всякие макаки пишущие на питоне и тому подобном, чтобы "приобщиться". Короче, попиздеть и повесить себе лапшу на уши, что они теперь не совсем опущи. А более честные себе не изменяют и просто заходят написать "си нинужон".
>>2807739 Успокойте меня что такая черная магия на самом деле используется лишь в 5% проектов на сишке и что на реальной работе будет намного проще. Иначе я хуй знает смогу ли я вообще ВКАТ
А вообще я уже понял что нужно смотреть как другие делают и повторять как макака пока не поймешь самостоятельно как это работает. Так решая простые задачки я иногда видел имплементации о который я просто физически не знал и знать не мог.
>>2810671 Это развод чтобы набрать классы. В реальности на галере ты 100% времени говнокодишь хуету чтобы успеть сдать ее вчера. Набравшись опыта ты становишься синьйором помидором и твоя задача перелопатить навермишеленный до тебя говнокод во что то приемлемое. Видиво не смотред, мне похуй.
Вопрос от полного нуба в С. (чат гпт не помогает). Есть два кода и они работают по разному (один просто проверка ифами, другой - цикл с функцией и шаблонами). Почему так? первый
>>2811070 Полагаю сепарация условий не совпадает. А ты сам то как думаешь? В первом варианте твои ифы чекают одни данные, во втором другие, так схерали эти два куска должны делать одно и то же?
>>2811070 У тебя везде пидерское сравнение в ифах по типу if (temp_data & 0b00000001) Если твое темпдата будет 0b11111111 то оно проскочит, нужно сравнивать if ((temp_data & 0b00000001) == 0b00000001) С радача пришел?
>>2811122 >С радача пришел? Yep. Ну сейчас вроде начинает что-то получатся. Это я эти ифы переписал в функцию и перестало всё работать, а оказывается я не заметил, что в конце происходит. >>2811128 Ну шаблонами только учусь пользоваться, увидел в видео, понравилось, что меньше простыни в функциях получается.
как же надоело эти ошибки хэндлить выделение памяти - хэндли нульпоинтеры, разбираешь JSON - чекай типы и проверяй отсутвие нужных структур, как вы с этим миритесь?
Подскажите а в С++ тоже нужно хуячить как можно более изотерический неподдерживаемый код только для того чтобы тебя не могли больше никем заменить, потому что никто нихуя в нем не понимает?
>>2812749 По сути весь сетевой стек так или иначе кастомный. Гугли RFC декларации интересующих тебя протоколов и все увидишь. Можешь по такому же принципу предложить очередной кастомный транспортник, главное задекларировать описание по общепринятому шаблону request for comments (RFC).
>>2812757 Ну хочу написать протокол, по которому боты будут обмениваться командами и выполнять их. Возможно, какой-то паттерн проектирования понадобится, пока не уверен. Пока думаю над двумя частями бота: протокол обмена сообщениями и исполнитель, который выполняет полученные команды. Есть примеры такого?
>>2812828 Пример чего именно? Любой транслятор ЯП пример трансляции байтиков команд в реальное исполнение этих команд. А процессы между собой обмениваются всем известным способом - шлют байты в сокетфайл и из него читают соответственно. Кодируй этот поток как душе угодно, ты же потом раскодировать будешь.
Вопрос от нуба. Подскажите по IDE, чем пользоваться? Я пока начинаю и пишу в редакторе протеуса неудобно, пиздец, но и код я пишу не сложный. Если я установлю avr studio и подключу какую-то библу в файл, у меня будет автокомплит всего того, что есть в библе? Алсо, вс код даст всю функциональность?
Жипити и живой пример на сайте решают одну и ту же проблему совсем по разному. Живой пример нагородил ифов и скобочек а жипити как то умудрилась без ифов Оба варианта работают по разному тоже.
>>2804550 >Почему так? Если ты задиссассемблишь эту операцию, то увидишь, что первым делом переменная по адресу икса копируется в регистр (допустим, rax), потом по адресу этой переменной к ней прибавляется единица, а уже после этих действий идёт копирование значения из регистра rax по адресу игрек, т.е. идёт присваивание предыдущего значения икса игреку. Совет на будущее: Если что-то ломает голову в Си, то дизассембли, для этого, конечно, нужно уметь читать код на асме и пользоваться дизассемблерами типа edb, radare2 (c GUI Cutter), ida, etc.
>>2813485 Для одной операции это выглядит нелогично, но, если ты устраиваешь цикл: for(int i = 0; i < n; i++) { что-то происходит с присваиванием i другим переменым }
То тут и становится ясным для чего нужон этот выверт - для того, чтобы переменная i присваивалась чему-то начиная с нуля, т.е. с самого первого её значения.
>>2813491 Можно и в гдб задиссассемблить, но, если тебе нужно задисассемблить большую и непонятную ф-цию, то тут лучше пройтись по шагам и понять, что она делает, иначе, просто читая дизассемблерный код, можно лишь сильнее запутаться. Так что лучше сразу юзать мощные инструменты, дизассембля простенькие ф-ции, постепенно усложняя себе задачу.
>>2813500 ты сам себе противорчечишь >если большая функция - запутаешься >поэтому юзай мощный дизасембл для маленьких
на деле дизасембл вообще не особо то и нужный инструмент, если только ты не реверс инженер все вопросы по нюансам сишного сахара разжевываются пока усваиваешь базу, в дальнейшем уже нет вопросов почему так нахуй, база усвоена
>>2813550 Ну, давай исходить из того, что всё зависит от источника, из которого ты черпаешь знания по языку Си, если в этом источнике тебе разжевали, почему в той или иной операции получается то, что получается, то, следовательно, не надо; если после получения инфы из твоего источника у тебя остаются вопросы, то ты можешь обратиться к другому источнику, но есть вероятность, что и там ты не найдёшь ответ на тот вопрос, который витает в твоей голове, следовательно, в этой ситуации проще самому исследовать операцию, чем перелопачивать тырнет в поисках нужной тебе информации.
Вроде и несложно и по отдельности все понятно но как же это блядь сложно читать. Мне потребовалось несколько минут только чтобы прочитать и понять что оно нахуй делает, хотя по отдельности каждая строчка проста и понятна. Да и вообще эта документация параша какая то, перемудрили до пизды.
Аноны, подскажите, как мне лучше поступить? Цель: у меня есть исполняемый файл (программа написанная на Си), и я хочу написать программу, в которой я хочу организовать цикл, в котором должен запускаться этот исполняемый файл энтое кол-во раз, а результат его исполнения складывать в другой файл. Что-то не могу найти инфу о работе с исполняемыми файлами.
>>2813598 >Да и вообще эта документация параша какая то, перемудрили до пизды. следствие парашности плюсов страуструпа то же никто не читает за его душку
Я смогу пройти собеседование если у меня есть 10 лет опыта в торговле, серебрянный язык способный уговорить сердитого отца отдать мне его девственную дочь и харизма чтобы управлять десятками людей но нет реального опыта в кодинге?
>>2813651 >отдать мне его девственную дочь Всё зависит от возраста этой его дочери, от положения этого её отца в обществе и от взглядов этой их семьи. Если батя какой-то большой чин в силовых структурах, придерживающийся крайне традиционных ценностей, заставляющий свои семью придерживаться этих же ценностей, и этой его дочери было от 12-15 лет, и он знал, что ты мерзкий педофил, но, несмотря на это, ты его уболтал отдать её тебе, то, получается, что ты совершил чудо, а потому ты можешь рассчитывать на что-то более крутое, чем просто формошлёп без опыта.
>>2813701 >Ну так все ж довольно традиционно. Ты там из средневековья капчуешь, что ли? Сейчас 21-й век и человек до 18-ти это ещё жеребёнок, да с учётом глобальной инфантильности и обилия всего того, что нужно изучить, чтобы голова встала на место и начала думать в правильном направлении, то человек до 25-ти является ещё жеребёнком (но это уже будут традиции 22-го века).
>>2813776 Не, ну, если так рассуждать, то можно дойти и до того, что люди ещё недалеко ушли от обезьян. Поэтому, чтобы не возникало такого спора, я и указал одним из условий - положение бати в обществе, ибо, с большой долей вероятности можно утверждать, если её батя достиг большого чина в силовых структурах, то это делает его как минимум очень дисциплинированным и волевым человеком. Дисциплина и воля это есть два качества сознания, т.е. это говорит о том, что батя живёт не инстинктами, а рассудком, а раз так, то, если он придерживается крайне традиционных ценностей (ходить в церковь, любить женщину, гнобить пидоров, соблюдение законов, и как следствие секс и алкоголь только после 18), то однажды вбив в свой рассудок эти самые традиционные ценности, он от них не откажется, ибо железная воля и дисциплина. Короче, ты прекрасно понимаешь о чём я, просто строишь из себя дурачка.
Не забудьте в шапку перекатного треда влепить двачезвезды ⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹⚹
>>2813804 >если её батя достиг большого чина в силовых структурах, то это делает его как минимум очень дисциплинированным и волевым человеком Чет захихикал с рассуждений домашней корзинки.
>>2813977 Мань, я понимаю, что ты хочешь мне сказать, что есть чины, которые совсем не дисциплинированные и не волевые, и которые просто по блату попали на эту должность, являясь людьми безвольными. Конечно, я с тобой полностью согласен, что есть и такие чины, но этих людей нельзя считать людьми, которые придерживаются крайне традиционных ценностей, ибо они и не против гомосятины, возможно, что и любят это дело, они и не против с детьми, ибо есть и деньги и власть, они и с кайфом торчат на тяжёлых наркотиках, и перечислять их огрехи и слабости можно до бесконечности. Но я же не просто так ввёл условие о том, что этот батя должен быть крайне традиционных ценностей, просто потому что, когда ты живёшь в мире полном соблазнов, и когда у тебя есть и деньги и власть, то, чтобы придерживаться крайне традиционных ценностей, нужно обладать нехилыми яйцами и сильным и здравым рассудком, чтобы не попасть под влияние этих самых соблазнов. А таких людей немало в силовых структурах, и они как правило все дисциплинированные и волевые. Это как раз те люди, благодаря которым нас до сих пор не завоевали хохлы. Ты же программист, почему ты не можешь читать условие задачи?
>>2814034 Ну компилятор же не знает, что мне нужно преобразовать char в int. Поэтому в аргументах физически лежит char. А как он лежит уже зависит от реализации. Значит, это неопределённое поведение, так?
>>2814039 А зачем компилятору что-то преобразовывать? У тебя в переменной лежит целое число, и ты даёшь задание вывести это целое число, которое не превышает выделенной для этого числа памяти, с чем компилятор с лёгкостью и справляется.
>>2814051 Чар и инт это типы данных, которые предназначены для хранения целых чисел. Когда ты передаёшь что-то в printf, то ты указываешь спецификаторы, которые говорят о данных какого типа ты передаёшь в эту ф-цию. У тебя спецификатор %d говорит о том, что ты хочешь передать целое число, после этого ты и передаёшь это самое целое число, которое у тебя хранится в переменной с. Просто это целое число не может превышать 127, чтобы оно имело смысл.
>>2814146 1. Там прямым текстом сказано, что "%d" выводит int. 2. Ты не ответил на мой вопрос. 3. Ткни пальцем, где в статье ответ на мой изначальный вопрос, или объясни своими словами.
Ты говоришь, я буду юзать чар (читай однобайтные знаковые децималы), компилер такой - без базара. Ты говоришь положи по адресу Ц значение 5. Компилер такой без базара и пишет в адрес 0b101 (добавсь слева нули если не понятно). Потому ты говоришь выведи на экран %d компилер говорит без базара, НО %d настроен на вывод четырех байт, а ты записал в один.Происходит неявное преобразование типов, твой чар кастуется к интам (любая студия, апример эклипс, тебе бы ворнинг вывела в этом месте), тобишь компилер просто приклеивает справа нулевые байты (справа а не слева потому что порядок чтения битов и байтов обратный) и пихает в поток вывода (но вообще то это в теории, на практике реализация принтфа завязана на write() которая в сырцах компилера должна лежать, крч в стдлибе нет описания блекбокса как именно это происходит).
В общем, если подводить итоги. В памяти лежат какие то битики. Как их декодировать и что с ними делать определяют типы данных. Как их писать в память/читать из памяти определяет программист. Можешь положить в инт большое число и вывести как строку. Или записать в массив даблов текст. Надеюсь я приоткрыл вам дверцу.
>>2814228 Вообще если разбираться, то на 32битных машинах при любой математике с выражениями меньше 4 байт компилер будет жонглировать и клеить нулевые байты к ним, поэтому если надо написать быстрый прогрух хэшей из рама по 32 битной шине - юзают инты или 4 байтные поинтеры. И по этой же причине в сишке инт кондишен. Потому что 32 битные шины данных это канон.
Крч тебе нужен 1 байт? Компилер грит без базара, грузит 4 байта, отрезает тот который нужен, клеит к нему нулевые и в от ты получил свой байт.
>>2814156 >Там прямым текстом сказано, что "%d" выводит int. Имеется в виду, что может выводить целое число, которое не превышает инт, т.е. 2^32. Пойми, что и чар и инт это представление целого числа, только разница в разрядности. Когда ты хочешь переменной вида чар присвоить какой-либо символ, то этой переменной присваивается не сам этот символ, а его представление в таблице аскии. Допустим:
char c = 'a'; printf("%d", c); // выведет 97 c = 97; printf("%c", 97); // выведет 'a' char a = '!'; printf("%d", a + c); // выведет 120
В памяти компа символы и целые/дробные числа это всего-лишь набор битов, и этими битами ты можешь оперировать, а вид операций зависит от того, как ты говоришь компу интерпретировать эти биты (типы данных, виды спецификаторов).
>>2814228 >Ты говоришь, я буду юзать чар (читай однобайтные знаковые децималы), компилер такой - без базара. Ты говоришь положи по адресу Ц значение 5. Компилер такой без базара и пишет в адрес 0b101 (добавсь слева нули если не понятно). Потому ты говоришь выведи на экран %d компилер говорит без базара, НО %d настроен на вывод четырех байт, а ты записал в один. Происходит неявное преобразование типов, твой чар кастуется к интам (любая студия, апример эклипс, тебе бы ворнинг вывела в этом месте), тобишь компилер просто приклеивает справа нулевые байты (справа а не слева потому что порядок чтения битов и байтов обратный) и пихает в поток вывода (но вообще то это в теории, на практике реализация принтфа завязана на write() которая в сырцах компилера должна лежать, крч в стдлибе нет описания блекбокса как именно это происходит).
Чтобы закрепился пройденный материал предлагаю анону мысленный эксперимент.
int printf(const char ⚹, ...); /⚹ или __VA_ARGLIST__ не помню как прототип описан у принтфа, но по идее линковщик без инклюда либы слинкует описание принтфа по прототипу ⚹/
d = "huy"; int main(void){ printf("%d -> %s \n", d); return 0; }
>>2814243 >printf("%d", a + c); // выведет 120 Я тут чёт проебался, это будет -126, тому что 97 + 33 = 130, но чар может хранить числа до 127, следовательно дальше начинается обратный отсчёт.
>>2814271 >до 127 Ну тащемта это то же спорный момент. Границы типов это не стандарт и на разных машинах по разному бывает. Имеется ввиду что на некоторых машинах верхняя граница выше, на некоторых нижняя ниже. В общем ты понял.
>>2814277 Чар и не зависит от машины. А вот способ декодирования битов из байт ой как зависит. Вон на рисках слова, к примеру, фрагментированные, полслова в начале, полслова в конце, посередине гвоздик слово данных.
>>2814277 Ладно я фигово объяснил. Чар это один байт, он не зависит от машины, ты прав. А вот когда ты пишешь 127 или -126 это не чар, это ты уже декодировал биты из этого байта в децималы. И вот сам процесс декодирования зависит от машины. Если быть точным от процессора, от камня, от его набора инструкций и архитектуры. К римеру я не уверен сможет ли камень на ГПУ вообще раскодировать твой байт как децимал, учитывая что там матядро с инструкциями по флоатам.
>>2814228 Когда вы уже запомните... Никаких битов байтов в стандарте НЕТ. Есть только абстракция на абстракции, выраженная в отвлеченных терминах. Всё. Стандарт C/C++ би лайк; "Ой, чар это один байт, но байт это, короче, не байт, который 8 бит, а любая хуйня, главное, чтобы минимум 256 значений вмещал" "Ой, пук пук, а я хз, что такое INT_MAX + 1, мб INT_MIN, а мб у тебя хуй отвалится, иди нахуй, короче"
То, что ты написал ниже, чушь ебаная. Спойлер: я уже нашёл ответ на свой вопрос сам - арифметический тип меньше инта, например чар, будет преобразован в int всегда без всяких вопросов. А теперь разберём по частям тобою сказанное.
> ты говоришь выведи на экран %d компилер говорит без базара, НО %d настроен на вывод четырех байт, а ты записал в один.Происходит неявное преобразование типов, твой чар кастуется к интам Компилятор не может и не будет смотреть, что за хуйня у тебя в строке формата. Замени строковый литерал в этом примере на строку, которую вводит пользователь в рантайме. Как компилятор эту хуйню предскажет, умник блядь??
> (любая студия, апример эклипс, тебе бы ворнинг вывела в этом месте), тобишь компилер просто приклеивает справа нулевые байты (справа а не слева потому что порядок чтения битов и байтов обратный) и пихает в поток вывода (но вообще то это в теории, на практике реализация принтфа завязана на write() которая в сырцах компилера должна лежать, крч в стдлибе нет описания блекбокса как именно это происходит). "Четыре байта", "приклеивает справа, а не слева", "порядок чтения битов и байтов" - ты понимаешь, что в стандарте нет всей этой хуйни малафьи? Банально "порядок чтения байтов" зависит от endianness конкретного компьютера? АЛЛО, В СТАНДАРТЕ АБСТРАКТНАЯ МАШИНА!
> В общем, если подводить итоги. В памяти лежат какие то битики. Как их декодировать и что с ними делать определяют типы данных. Как их писать в память/читать из памяти определяет программист. Можешь положить в инт большое число и вывести как строку. Или записать в массив даблов текст. Надеюсь я приоткрыл вам дверцу. В этом и проблема. Оттуда и изначальный вопрос: "я положил один байт там, где ожидается 4 байта; компилятор об этом знать не может, следовательно на выходе - рандомная хуйня". Потом оказалось по-другому: https://stackoverflow.com/a/12830110
>>2814302 Я вкурсе. Про пункт б стало интересно, обоснуй. Еще можешь рассказать что побудило тебя написать этот пост, то что в сишке инт кондишен? Как твои утверждения это опровергают? Инты на машине это word величина. Если там 16 битная шина и камень, то инты там двухбайтные. Но все децимальные константы все равно интовые. Так что я не понял с чем именно ты споришь.
>>2814312 > Я вкурсе. Про пункт б стало интересно, обоснуй. Байт не обязан быть 8 бит. Стандарт говорит, что: 1) char это всегда один байт 2) char не может быть меньше 8 бит (но может быть больше, см. CHAR_BIT)
> Еще можешь рассказать что побудило тебя написать этот пост, то что в сишке инт кондишен? Не знаю, про какой ты конкретно пост (видимо, не мой), но меня не интересует, как работает си на конкретной архитектуре. Мне интереснее разобраться, что стандарт гарантирует на любой машине, а что не гарантирует.
>>2814322 >Байт не обязан быть 8 бит. Стандарт говорит, что: >1) char это всегда один байт >2) char не может быть меньше 8 бит (но может быть больше, см. CHAR_BIT) Ну тут вот стандарт то же врет, или ты врешь. Как насчет шестибитных чаров? Я вот пытаюсь понять зачем ты учишь стандарт языка, который напрямую привязан к железкам, а у железок нет стандарта. Глупость какая то. И как стандарт сихи описывает работу с третичной логикой (да такие компы то же были)? Крч пустая трата времени. Глянь дефайны на своей машине и кодь приложуню, не будь макакой которая срет тут нечитабельной хуетой зато по стандарту.
>>2814336 > Почти ничего не гарантирует. Зоопарк разнообразных машин вставил свое слово в написание стандарта. В этом и суть. В том, чтобы не допускать того, что по стандарту является неопределённым поведением. А иначе получается, перешёл с GCC на Clang - умер от уб. Ну или с x86 на ARM, тем более. Мне такое не оч нравится. > Цель? Ты никуда не денешься от конкретной реализации конкретной машины. Смирись с этим макакич. Ты никуда не денешься от опасностей UB и необходимости portability. Смирись с этим.
>>2814355 > >Байт не обязан быть 8 бит. Стандарт говорит, что: > >1) char это всегда один байт > >2) char не может быть меньше 8 бит (но может быть больше, см. CHAR_BIT) > Ну тут вот стандарт то же врет, или ты врешь. > Как насчет шестибитных чаров? Покажи их. У тебя на скрине некий компьютер с шестибитным байтом. Где ты вычитал про 6-битный чар? На таком компьютере либо невозможна реализация Си, либо на нём char будет 12-битным. Два байта с точки зрения машины, но один "байт" с точки зрения языка. И на таком компиляторе sizeof(char) будет равен 1, а CHAR_BIT - 12. > Я вот пытаюсь понять зачем ты учишь стандарт языка, который напрямую привязан к железкам, а у железок нет стандарта. Глупость какая то. Не привязан, вот и весь секрет. То, что он был мотивирован железками, не значит, что стандарт к ним привязан намертво. > И как стандарт сихи описывает работу с третичной логикой (да такие компы то же были)? Во-первых, можно задаться вопросом, как так вышло, что троичных компьютеров нет (и едва ли они были). Во-вторых, опять таки, скорее всего Сишка на таком компьютере просто невозможна (только если преобразованная, нестандартная). Так тоже бывает. И то, я не уверен насчет того, что невозможна. > Крч пустая трата времени. Глянь дефайны на своей машине и кодь приложуню, не будь макакой которая срет тут нечитабельной хуетой зато по стандарту. А потом переносим проект на другой комплюктерн и БАЦ, БАЦ, БАЦ Кстати, никто не запрещает использовать platform-specific и implementation defined фичи, просто делать это надо в меру, и только когда это целесообразно.
Хуй знает о чём вы вообще, но с точки зрения асма, когда ты в принтф передаёшь, что-то типа такого:
char c = 128; printf("%d%", c); \\ он напечатает -128
то вывод на конечных этапах будет выглядеть так:
mov ax, byte[пер_арг] ... syscall
где пер_арг это переданная в принтф переменная c, следовательно, в ах будет значение 0xff == 0b11111111, то есть все остальные нули, которые были переданы в принтф, чтобы преобразовать его к инту не учитываются, иначе было бы напечатано 128. Вообще это дело связано с соглашениями о вызовах, которые требуют выравнивания по 16-ричному адресу, что связано с архитектурой х86_64.
>>2814404 >Вообще это дело связано с соглашениями о вызовах, которые требуют выравнивания по 16-ричному адресу, что связано с архитектурой х86_64. А не, я чёт хуиту сморозил, выравнивание нужно для rsp.
>>2814416 Какое "врёти"? Ты бы хоть прочитал для начала, что я написал. Я сказал, что существование шестибитного компьютера не отменяет того, что в Си байт не может быть шестибитным, хоть ты усрись. Если очень захочется для такого компьютера написать компилятор Си, то придётся сделать байт (char) 12-, 18-, да хоть 60-битным, но 6-ти битным он не будет, иначе это не Си.
>>2814591 Не знаю о чём ты, но, в принципе, типов не так много, поэтому можно и изучить их границы, а там уже на автомате будешь выбирать нужный тебе тип.
>>2814611 Да похуй на вас. Сборище додиков. Один со стандартом носится как со святым писанием, второй кодит неподдерживаемую хуйню, которая для проца еще и неудобная. Ай билять, делайте чо хотите, макаки.
>>2815424 Блин чот я не туда думаю. Наверное трабл в том что чар[10] и в него тупа могут пульнуть строку длиннее и записать в какой нить служебный сегмент всякую бяку. Но эт в теории, чот я не уверен в такой возможности.
>>2815562 На стр. 291 не оч. описана проблема переполнения буфера. Об этом лучше почитать у Криса Касперского, либо в какой-нибудь другой книге по безопасности или в той, где описываются различные виды атак и всяких там мальварей, троянов, и т.д. и т.п.
>>2815573 Ну, грубо говоря, в строку можно закинуть команды машинного кода, которые смогут прыгнуть туда, куда потребует пенетратор. Вообще, я сам не особо в этом шарю, т.к. ещё не дошёл до книг Криса Касперского и других книг по безопасности.
>>2816293 Нет, просто вычитал эту конструкцию >for (i = p; i != id; i = id); в одной книге и хочу понять отличия от этой конструкции >i = p; >if (i != id) i = id;
>>2816312 Ёбанный двач, убирает всё важное! Вот так эта программа выглядит - смысл её в том, что она решает связные задачи, но я хочу понять именно эту конструкции, и то почему именно её употребили.
>>2816474 Тогда другой вопрос. Вот я скастовал, получил 0.000064. Как мне получить uint 0.000064 * 1000000? Синтаксис, моё почтение нахуй. (float)a / b и гадай блять, что за (float) и к чему он относится, к a, или к небу, или к Аллаху или ко всему выражению
>>2817233 Бля. Я тредом промазал... Хотя думаю не важен же тред. Думаю проблемы вима на винде и у сишников должны быть. Так что все равно тута мож кто ответит.
Блять похоже надо реверс инженерингом заниматься. Нихя не понятно стало. Чо там за система окон на макоси? И как на сях под нее чот написать? Дайте пример симпол окна на сях под макось.
На шинде винапи, на юниксах иксы(xlib) а на макоси чо? Пишут что кути, но кути обертка над xlib а иксов в макоси я не обнаружил
Вощим дайте пастбин симпол окна на макось в сях или мне придется зайти в богомерзкий икскод, нахуякать там сипол окно на богомерзком свифте, скомпилить, трансфернуть опкоды в асм и затем из асма ковырять исходник на сях и вот этим всем я ваще не хочу заниматься.
>>2817333 Чо несешь то? Икскод со своим обжектив си или свифт кодирует же. Значит си то же может. Вопрос как? Линковщик силанга то же грит хуй знает чо за Х11 не вижу нихуя. Ну блять заебись сука падла.
>>2817359 На пинусе у меня клава и тачпад в иксах не подтянулись, так что надо будет поковырять хал наверн или иксовые конфиги, крч попердолиться. А я пока не хочу пердолиться, хочу просто оконный хеловорлд на макоси написать. Но вот не получается.
Если тестить на qt то тама кумейк ебучий генерит мейкфайл с мусором под g++ ни того ни другого у меня нет, я даже тестить не буду эту парашу.
Остается загадкой нахуя они так сильно завернули колбеки в жопу иксам, но лично мне прям осейчас абсолютно поебать, я просто не хочу перепрыгивать с сей на свифты ебаные ради как ой то операционки.
>>2818247 Маненько поковырял эту какаву. Судя по выводу тут та же структура что и в свинге жабы. Виндоу в ней панелька и уже в панельке все остальное (хз чо в этой какаве есть, лайоут манагеры, батоны, лейблы...)
>>2818571 Ну вот например обжектив си в файле си скомпиленный с флажками под обжектив си и какава фреймворк буду добавлять как только тесты заведуться, пример на пьюр си пока не завелся потому что он не под эпол силикон, но там есть под эпол силикон.
>>2818589 Пример с википедии на голых иксах не компилился потому что хидеры иксов не лежат по пути из википедии. Пришлось поискать их файндом. Судя по выхлопу я чота нашел.
Проверим лежит ли там нужный xlib.h пик2 говорит что лежит
Ну чтож, теперь у нас два путя: первый - хуярим новую запись в $path консольки чтобы гцц умел цеплять xlib по инклюду <X11/Xlib.h> второй - заинклюдим хлиб с полным прописанным путем до него
Кароче я щас пытаюсь победить эти референсы туповатые, которые не могут найти блять файлы, уже даже скопировал в папочку отдельно, но это не помогло. В общем надо экспортить новый референс для $PATH под путь к Х11 хидерам. Иначе чота прям слишком трудно получается. Займусь этим в следующий раз.
>>2818658 Ну я пока что хз если честно. Вроде бы прописал путь, но чота все равно он не хочет цепляться.
Я пробовал прописывать путь как Х11/инклюдс, пробовал напрямую присвоить путь в переменную Наверное я что то делаю не так, но я пока не знаю что именно.
>>2818721 Да мне кажется это на стаке хуйню советуют. Откуда они взяли вообще переменную окружения C_INCLUDE_PATH? Я прочекал стой zsh и он такой переменной не пользуется. Похоже надо пути прописывать в конфиг набора инструментов gcc или в ckang или в cc, только я пока что не знаю чо там по конфигам и откуда gcc черпает относительные пути.
Ну есть второй вариант - скопировать всю папку хидеров туда где лежит stdio.h, то место ведь gcc уже знает.
Ну и может кто из пердоликов подскажет как прописать пути корректно.
>>2818759 Да хер пойми, я то же так думал, но чот вроде бы и нет выходит. Скомпилил первый пример на чистом си под фреймворк какаву.
Потестил гцц через абсолютные пути до иксов и наконец то цепанулось, но срет ошибками об анделаредах. Прочекал хидеры из папки иксов и реально там тупо нет прототипов функций построения окошек. Ни одной. Хмм. Вот петухи!!!
>>2818765 Да это не поможет. Там в иксовом примере всякие XCreateWindow() и прочие функции задействованы, а в хидерах не лежат их прототипы, то бишь линкеру не от куда их линковать. Это значит что кроме хидеров с дефайнами всякого говна и структур должны быть еще статичные либы по типу libX11.so которую надо уже слинковать по типу gcc ... -lX11 и вот тогда тела этих функций попадут в обджектдамп приложуни и все заработает, но эплопетухи не оставили мне в СДК статик библы
>>2818769 >The value of COMPILER_PATH is a colon-separated list of directories, much like PATH. GCC tries the directories thus specified when searching for subprograms, if it cannot find the subprograms using GCC_EXEC_PREFIX.
>>2818771 >>2818774 >>2818778 Есть вариант чекнуть какаву на предмет как она строит окна, коллдамп глянуть крч. Какава как и кути и всякие там мотиф ксав и прочие хуйни это же обертка над иксами. То бишь так или иначе они тягают иксовые интерфейсы.
>>2818571 Вот первый удачный компил https://pastebin.com/FWq7ZufL Мейкфайл не буду постить, там в шапке комментарий как скомпилить и сурс статьи. В той же статье есть пример на интелы.
В общем я тут немножко поковырялся и вот результаты моих исследований. Эплопетухи вырезали из иксов все интерфейсы через которые можно было бы покодить приложуни на чистых иксах. Но взамен у них есть их собственный фреймворк разного уровня - Cocoa (она же какава, какао, главное не чай "Ява" и не кофискрипт).
Какие то рандомные хидеры иксов лежат, но в них не подцеплены рефернсы вызовов, пользоваться ими нет возможности. Структуры ничего не дают без выполняемого вункционала функций, а их я не нашел.
Зато нашел Глут (опенгл фреймворк со встроенным аппаратным ускорением), метал (то ж какая то херня на эплосиликоне с аппаратной ускорялкой вроде) ну и лоу левел части какавы, которые практически лежат на железках (как иксы например, когда им напрямую говоришь в какой писиай слот писать видеопоток).
Так же в интернетах пишут, что надо ставить XQuarz фреймворк если хочешь писать под иксы. Мне лень пока что с этим заморачиваться, но имейте ввиду.
Компил под либы у эплопетухов как я понял то же приобретает дополнительный флажок в жопе -framework А все фреймворки соответственно лежат кое где, но там нет фреймворка Х11, а те обравки где он есть не имеют статик либ или любого другого описания львиной доли функционала (как я уже и говорил).
Вощим вердикт такой - пьюр си под иксы на ОС Х возможен, но надо ставить фреймворк XQuarz. А так пишем на пьюр си под фреймворк предназначенный для свифта/обжектив си и не паримся.
>>2819494 Нет. Я для себя это делаю. Хочу свою ГЛ потестить, алгоритмику, оптимизации, шейдеры, может быть сделаю какой нить САПР, но пока что особых планов нет, кроме как написать рейтрейсинг и реймарчинг. Есть некоторые задумки как описать моушен на полигональных объектах.
Еще мб пощупаю воксели, но не знаю насколько вообще это будет актуально.
Крч все я сдаюсь. Мне просто нужна была рабочая вью форма для ковыряния пикселей, но с этой трансляцией сишника в обжектив си колбеки внутри карбона заебешься. Надо все колбеки переписывать на сишник, читай портировать карбон на пьюр си.
Попробую ка я лучше XQarz накатить и под иксы поковыряться, там то более менее все знакомо.
а есть те, кто в реальных новых проектах сталкивался с ограничениями, что нужно использовать только C89, а не C99 хотя бы? Только не потому, что так захотелось начальству, а что реальное ограничение техническое. Потому что вроде как уже не осталось таких платформ, где не было бы C99, а при выпуске новых платформ тоже особо желающих не находится, чтобы там был строго C89, а чаще всего вообще прикручивают LLVM и не парятся с языками потом. Видимо уже нет смысла начинать какие-то новые проекты под C89
>>2819879 В BSD такой фигней вроде страдают во имя обратной совместимости. Там все микросервисы внутри sbin написаны по шаблонам ультрастарых стандартов по типу
>>2819934 спасибо, был не в курсе, а еще что-то есть? просто уже даже микроэлектроника уже на c99 как минимум сидит давно или вообще на плюсах с подтягиванием раста, не говоря уже про какие-то там игровые консоли
>>2819879 >вообще прикручивают LLVM и не парятся с языками потом "Не парящиеся с языками" - на пике, вот так говношлепят из говна в мочу и обратно и вместо исправления надеются на боженьку. А могли бы код писать своими руками, но куда там макакам, конечно не могли. На пикче кстати хрюст.
Оператор break откуда выходит? Разве только из тела цикла? Из тела свича ведь он то же выходит. А выходит ли он из записи стека?
Вот например { ...код1... if(1) break; ...код2... }
Как себя ведет процесс в тайо ситуации? При открытии фигурной скобки будут присвоены новые значчения на rbp rsp то бишь это новая запиь стека. Но брейк заставит выйти из нее, или мне надо сделать ретурн чтобы выйти из нее?
В общем есть у меня блок ифов и мне вот надо чтобы при заходе в один из них следующие не вычислялись на истинность, но я та же не хочу использовать оператор goto. В общем надо сделать логику свича ифами по причине того что в свиче можно юзать только константные литералы (если можно так выразиться), а у меня неконстантные по логике.
>>2820318 Блять про стандарты хуй вас заткнешь а такую простую хуйню разложить - пук среньк сразу все в кусты попрятались. Хули толку с вас в этом итт треди тогда? Выебываться мифическими знаниями о хуйне которая никогда не пригодиться?
Полагаю надо делать так ... { ... if(a) { dosomething; return;} if(b) { dosomething; return;} ... } ...
>>2820318 goto нужен как раз для таких ситуаций, когда у тебя есть большое вложение и тебе нужно из него прыгнуть, когда программа уже что-то сделала. Только используй его для прыжка вниз по коду. Этого дебича >>2820475 не слушай, потому что ретёрн это возврат из ф-ции. Если не хочешь юзать goto, тогда переписывай логику, чтобы не было больших вложений, либо тогда каждый иф оформляй в ф-цию, а после выполнения кода возвращайся ретёрном, но это какое-то говнокодерство, ибо проще выпрыгнуть из большого вложения.
Ну ладно, двачик, я вижу вы тут все серьезные дядьки и не хотите обсуждать двустрочные лагоритмы. Ну вот тогда может быть кто то пояснит за этот лагоритм? Почему сишник не пишет число 111 в другой участок памяти? Что за избирательность?
>>2825358 во первых на пастбин почему не залил? не уважаешь нас? хочешь чтобы мы не только в твоем говне ковырялись но еще и в поехавшей разметке макабы?
во вторых где прототипы? ты в мейне юзаешь функции которые описаны позже мейна, а где прототипы? ты вообще компил пробовал делать своего говна? оно не скомпилится по всем правилам, так с херали ты спрашиваешь чо там с твоим массивом происходит если у тебя просто нет бинарника?
Как мне его "установить" при помощи сценариев сборки мэйк? Мейкфайл прикреплю пиками в один не влезло Ну делаю я sudo make install Бинарь залезает в нужный путь вся хурма. Но блять переменная PATH экспортируется только в оболочке вызова мейка, а не глобально. А как мне новый путь добавить в $(PATH) чтобы он теперь там глобально жил то?
>>2827258 У меня есть некоторые догадки, но я пока не знаю как разрешить сей консенсус. Вощим. Мейк использует какой то свой любимый шелл, каждый раз заного запуская оболчку для каждой строчки сценария. И поидее я могу явно указать какой шелл надо юзать (ну например мой родной шелл надо юзать) и тогда мейк экспортнет PATH в моем родном шелле и поидее все заработает.
Но. У юзера может стоять другой шелл. Баш например. Как мне угадать/прочитать какой юзершелл используется и в какой оболочке экспортить PATH?
>>2825358 Что значит массив не читается? Программа падает или что? Стек на Винде 2 мегабайта, поэтому вряд ли ты его переполнил. Скорее всего у тебя запись за пределы массива идёт, которая разрушает весь стек твой . С телефона лень вчитываться , но если инфу об ошибке скинешь, то попробую помочь.