Это копия, сохраненная 21 октября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлый: >>2713428 (OP)
как же вы заебали Edition
Это не продолжение ли предыдущего треда с умопомрачительными примерами работы со строками в циклах с очень неожиданными итераторами? Лучше бы на двачах звёздочка без проблем ставилась. Вот уж где зашквар. Здесь же айтишники одни сидят. А то приходится вот это - ★ ставить... Или я чего-то не знаю? )
int★ value, value; // - указатель и экземпляр, а не 2 указателя...
Вот это действительно подлянка. Потому что в куче примеров по инету пишут как попало. После этого стал писать звезду рядом с именем всегда, чтобы визуально отражало сущность творимого.
int ★xlink, x = 5; xlink = &x;
Учебник тебе должен про обвязку рассказать. Это вроде POSIX. Терминал, ну. Есть ещё stderr для всякого дебага, чтобы вывод не засорять, потому как обычно его по конвейеру дальше часто передают, другим утилитам.
Так его делали чтобы ядра операционок писать, там изначально нужна была работа со структурами и жонглирование указателями.
В первых версиях структур не было. А когда они появились, то поля были общими. Именно поэтому у структур в UNIX часто встречается префикс связанный с ее именем. Зато не нужны были union, ведь если ты определил поле A первым в структуре, то теперь оно будет во всех структурах помещается автоматически на offset:0
>откуда блять из головы у меня должно вылезти fgets stdin
Это стандартая библиотека C (stdlib). Соответственно, читай доки к stdlib. Например:
https://www.tutorialspoint.com/c_standard_library/c_standard_library_quick_guide.htm
Помог анону — задай вопрос сам:
Допустим, есть у меня функция send_char(char c), которая отправляет символ в UART. Как к ней прикрутить какую-нибудь printf-подобную функцию, чтобы удобно печатать всякие строки с форматированием?
Знаю, что можно malloc'ом выделить память, напечатать в неё через sprintf(), а потом побайтово отправить результат, но есть ли варик как-нибудь обойтись без промежуточного выделения памяти (и без ломания stdout, а то я видел, как народ в нём что-то переопределяет с этой целью)?
Спасибо, анон. А как превратить send_char(char c) в ТВОЙ_ФАЙЛ? Наверное, это ключевой вопрос.
Мне это надо не на Линуксе, то есть работать через /dev/tty* в моём случае не варик. У меня код работает на голом железе, а send_char — функция, которая пишет прямиком в регистры.
https://github.com/mpaland/printf#streamlike-usage
Попробуй это, возможно подобные функцию уже есть в твоей силибе.
Вот такой код:
#include<stdio.h>
int main(int v, charv)
{
printf("%d\n",stdin);
}
Почему у меня выводит большое число?
Разве это не дискриптор, который есть в самом начале у программы(а потому его значение не должно ведь быть огромным)?
Годный проект, остановился на нём. Спасибо.
Удивительно - вообще 0 упоминаний об этом в книгах, что не так с ними? В файлах любой проги на С написанной покопаться если, то там будут тонны этих .dll и .so, но в книгах почему-то про это забыли нормально написать. А это явно база, классика, и это знать надо.
Си это универсальный мультиплатформенный язык, а .dll и .so это конкретные платформы Windows и Linux, поэтому эти вещи не попадают в контекст языка. Тебе надо искать книги "Программирование на <платформанейм>". Для винды это Рихтер, "Windows для профессионалов", разжевано дальше некуда, если осилишь, будешь супер-хакером визардом творящим чудеса.
8000 строчек loc на сях. Как мне такое осилить?
потому что их овер 40 лет разрабатывают (гну до линукса существовал) и овер 40 лет в списках рассылки просьбы добавить очередную опцию от очередного скриптописателя на баше.
Получается, что, чтобы изучить стандартную библиотеку Си, нужно также читать эти книги "Программирование на <платформанейм>"?
Чтобы изучать что-либо достаточно это и делать. А вот чтобы писать программы надо изучать платформу под которую пишешь, ты ведь пишешь реальную программу под реальное железо, а не фантазируешь в вакууме.
Умничать можно и с меньшим кол-вом воды. Мне просто интересно как лучше подойти к стандартной библиотеке Си, чтобы изучить все (либо просто понять что делает та или иная ф-ция), потому что в википедии как-то совсем всё скудно описано, да и в других статейках, что я встречал не так чтобы всё подробно расписано (например как у Столярова про stdio.h), поэтому и интересуюсь, мб, у вас есть какая-то имбовая книга, либо статья, которая расставит все точки над и.
Чтобы изучить фсе, начни со старых источников, вроде книжек кернигана или мануалов к старым юниксам. Так ты узнаешь, что действительно лежит в основе бибятеки С. Дальше полирни это чтением старых (простых) исходников, только не подвиндозного кала со примесью хуй86.
Я знаю, что могу использовать scanf из stdio, однако интересно, можно ли такое сделать через unistd.
У меня есть догадка, что нужно что-то вписать в какой-то файл, однако я не имею уверенности, что это так.
>вроде книжек кернигана
"Unix. Программное окружение" вроде этой?
>Дальше полирни это чтением старых (простых) исходников
А это как искать?
NIH дебил закукарекал. Неумение читать код признак безмозглого имбецила, таких вообще нельзя допускать до компьютеров, кроме как в браузер тыкать одним пальцем.
Единственное и правильное обучение - форкаешь чужую программу и делаешь изменения. Так же как единственный геймдев начинается вовсе не с написания своего движка, а с модов к существующим играм. Кто не умеет читать и использовать чужое, тот и свое не сможет сделать, тупое говно отродье тупого говна.
а хули тут так дорого, 30$ почти за книжку в 100 страниц. хуй дойдет в рф, в интернете не спиздить. мертвый материал.
Я щас качаю исходники на арче вот этой функцией, которая у меня в .bashrc:
function getsrc()
{
asp export $1 && \
pushd $1 && \
makepkg -do --skippgpcheck && \
pushd src
}
По идее для любого пакетного менеджера такое должно быть.
Правда, я скачал так glibc и нихуя не понял даже приблизительно откуда include <stdio.h> забирает тело функций, ведь в stdio.c почти нихуя не написано. И makefile там неебических размеров который тоже нихуя не понять сразу.
Ещё иногда просто git clone делаю с гитового репозитория.
ладно, для редиса есть на сайте, для компилятора нашел на каком-то турбобите как в 2008. пока хватит.
Понял, анон, спасибо!
Да, хорошие книжки, но они нужны всего лишь для тех, кому интересна эта тема, а вовсе не для обучения нубов программированию путем пропаганды идеологии NIH. Такая пропаганда воспитывает только дегенератов, и только дегенераты её продвигают и считают верной. Данные книжки тут ни при чем, проблема в людях, и конкретно в данном треде, этих самых дегенератах.
Он весьма и весьма продвинут в техническом плане, это тебе не ебануть за вечерок.
ты будешь в шоки, но в хай левл языках к анонам прилипло слово дескриптор, что сутью своей отражает поинтер на адрес где начинается описание хуйни
stdin это указатель на экземпляр структуры FILE описание которой есть в stdio.h
сишник в этом плане очень гибкий, ему похуй откуда ты читаешь/куда пишешь делаешь прост новый FILE экземпляр и заполняешь структурку данными например через fopen() эта функция сразу салоцирует новый экземпляр и заполнит структуру если фал найдет
типа FILE * myFile = fopen();
myFile теперь такой же "дескриптор" то бишь поинтер на экземпляр FILE куда можно писать и откуда можно читать.
только юзать надо будет функции где в аргумент ты пихаешь поинтер на FILE например fread() иначе будешь читать/писать в stdin stdout по дефолту
из вышесказанного - stdin это указатель/поинтер/дескриптор
printf("%d",stdin); печатает адрес stdin в десятичном виде
давай вкратце расскажу
есть статичные библиотеки (функций, но лучше будет сказать машкодов) и динамические библиотеки (функций/машкодов)
эти обе хуеты сами из себя представляют скомпиленные из сырцов объектные файлы .o которые уже запакованы в библы .dll .so
например так gcc -shared lib.o lib.so
>ну или типа того сами гцц команды погугли я не сильно шарю
ну и вот у тебя например появилась статик библа в которой есть машкоды описания функции huyjopa()
далее ты ебашишь какой то хеловорлд где тебе понадобилась твоя huyjopa
делаешь что то вроде
main(){
huyjopa();
return;
}
а значит надо линкануть откуда взять описание как huyjopa работает
gcc myapp -L lib.so
или типа того опять же погугли команды линковки гцц я руками ничо не собираю
и вот в итоговой приложуни появляются машкоды из библиотеки и твой хеловорд теперь знает что такое huyjopa и чо он делает
с динами библами то же самое, только линковка машкодов происходит прямо в процессе исполнения твоего хеловорда и для таких фокусов надо заинклюдить библу с интерфейсом который умеет тянуть машкоды из динамик библиотеки прямо в процессе выполнения программы
надеюсь понятно расписал как это работает
> функций, но лучше будет сказать машко
Библиотека содержит таблицу символов и секции с кодом/данными.
Символы могут ссылаться внутрь секций или на абсолютные адреса.
Как читать коды, которые не понимаешь? Код низкоуровневый, нужно понимать эту предметную область. Мне интересна эта либа https://github.com/uNetworking/uSockets
Вот за это спасибо, анонче!!
https://stepik.org/course/73618/syllabus
у меня лично жопа сломалась, но я питоно-скрипторебенок
Я и не должен понимать дебилов. Обосновать не можешь, потому что нечем.
да хуйни любым скриптовиком который знаешь
башскриптом собери например, чо ты симейк дрочишь если не знаешь его команд?
зарой его
Было такое в пердокомпиленной программе, не игре, но тоже вылазило паразитное консольное окно. Пробовал ебаться с опциями компилятора, не помогло, в итоге плюнул и вставил в начало WinMain строчку скрывающую это поганое окно.
ShowWindow(GetConsoleWindow(), SW_HIDE);
Можете помочь со сборкой такого простого проекта? У меня уже спортивный интерес собрать его симейком. Руками из обжектов бинарь собирается (хотя, наверное, в неправильном формате), а симейк его собрать не может
https://gitflic.ru/project/aoizora/operating-systems
:-1: error: /usr/lib/gcc/x86_64-pc-linux-gnu/13.1.1/../../../../lib/libgcc_s.so.1: error adding symbols: file in wrong format
Гидра показывает, что libboot.a это эльф файл, внутри него start.s.o с моим кодом и системными секциями. Вроде нормальный формат, что линкер на его ругается?
Сап моряч, есть одна задача.
Дано: две строки текста произвольного размера и набора символов (русские англицкие буковы цифоры управляющие анси последовательности все в перемешку).
Задача: запринтить каждую строку в свой блок. Один блок слева, затем пару пробелов как разделитель экрана и затем блок справа.
UPD:
Каретку нельзя двигать при помощи АНСИ, запринтить надо без этих фокусов.
Причина ограничения: SetCurPos ставит каретку не учитывая что в консоли могут быть уже напринченые строки от других программ - не подходит. MoveCurUp стирает нижние строки при прыжке каретки наверх - не подходит.
Хуюрсес. Алгоритм давай.
Можно считать бинарную последовательность, а потом ебать ее как душе угодно. Хочешь вывести значение переменной типа short как два символа? Да, пожалуйста, просто скастуй нужный тип к указателю, прибавь смещение и разыменуй. И многое другое...
В общем, пока что годно.
мимо скриптомакака
>. А ты говно накидывал
?
>#define zero 0
>#undef zero
Так не работает, потому что в fwrite первым аргументом нужно передать указатель на область памяти откуда будут браться значения.
У вас в типе исполняемого файла установлена консольная подсистема.
Для консольной подсистемы Windows автоматически будет создавать консоль (либо берёт родительскую). Чтобы такого не было, нужно задать оконную подсистему в опциях линковщика. В makefile добавь
Для консольной подсистемы
LDFLAGS+=-subsystem console
Для оконной подсистемы
LDFLAGS+=-subsystem windows
(или вручную пропиши)
Что такое хедер-файлы?
Зачем кастрировать инструментарий? Не нравится тебе инклюдить хидеры, не инклюдь.
Э нет, пидор, для начала пофикси очередность декларации, а потом я смогу не инклюдить хедер парашу. Как это сделано в языках следующего поколения и которые создавались для людей, а не животных.
Я хочу инклюдить cpp файлы без хедеров в любом порядке. С++ этого не позволяет сделать, чем путает ньюфага и заставляет копаться в унитазе полном ошибок.
А нито ты заинклюдишь баивую картиначку в тредик?)))))))
Видали чо могу? Меняю конст ансигнед инт по желанию левой пятки. Блять как побороть эту хуйню и почему это возможно?
Анон, подскажи, пожалуйста, почему в тестах постоянна появляются дополнительные элементы в конце строки? Запускаю этот код у себя на линуксе с компиллятором gcc и всё норм, но вот запускаю на кодеворсе, и там какой-то мусор в конце строки.
Предполагаю твои плавающие баги связаны с параллельными вычислениями.
Ну а второй вариант - ты где то поинтером вышел за пределы и пишешь в строку всякий мусор декодируя это в символы.
Но параллельные вычисления это канеш зло, инкрементни до записи, любитель писать все в одну строку.
Ладно, анон, спасибо! Завтра тогда продолжу пердол, сейчас уже спать пора.
А что не так, кстати, с параллельными вычислениями? Компилятор то всё равно это раскладывает на машинные коды, а на них это выражение ничем не отличается от того, если ты перенесёшь эти действия на две разные строки. Ну да, возможно, порядок немного изменится, если в представленном примере увеличивается значение, которое лежит по адресу el_in_str, потом предыдущее значение прибавляется к адресу str, после чего увеличенному адресу присваивается значение el_in_arr; то, если мы перенесём инкримент el_in_str на следующую строку, то сначала значение el_in_str будет прибавляться к адресу строки, затем присваиваться элемент из el_in_arr, и после этого будет увеличиваться значение el_in_str и заносится по месту хранения этой переменной. Но суть не меняется - выполняются одни и те же действия.
Или тут дело в том как у них организованы тесты? Т.е., мб, там совсем не участвует компилятор, т.е. мой код не переводится в машинные кода?
Если использовать, кстати, ф-ции из string.h, то всё норм получается. Но я пока их не хочу использовать - по совету Столярова, чтобы лучше понимать, что такое строки в Си.
На твоей машине не отличается, а на другой отличается. Как и байтсдвиги на разных машинах реализованы по разному, как и касты типов на разных машинах реализованы по разному.
Это база по K&R C lang
Ну да, это то просто! Но вот, когда начинаешь решать подобные задачки, то и начинаешь вникать во всю эту арифметику указателей, во все эти массивы чаров и т.д.
>>786435
Понимаю, но на предыдущих итерациях решения этой задачки я всё что можно было сайзоффал, но один хер что-то не то получалось.
> Как и байтсдвиги на разных машинах реализованы по разному, как и касты типов на разных машинах реализованы по разному.
А эти различия в каких рамках проявляются? В рамках одной модели/линейки/архитектуры/...?
Точняк!!!!!! Анон, спасибо!!! Долбанные массивы чаров с '\0' на конце.
> Ну да, это то просто!
Если это просто, то почему ты не смог найти ошибку в своём решении? М?
Не обязательно чаров. Там могут лежать вайдчары или вайдинты или вообще мутированные вайдинты которые хавает petchar() например.
Зависит о способа кодирования символа в строке. Как пример русские буквы кодируются двумя байтами, юникод секвенции то же кодируются двумя байтами, ошибка чтения из гетчара кодируется четырьмя байтами.
Чот сегодня день базы. Только что провел ликбез своему патрону по этой хуйне.
У меня сбор статистики скудный. На интеле сигнде бит перезаписывается, на арме нет. Вот и вся моя статистика. Покопай гугол. Разница архитектур обозначает разницу в опкодах, которые соответственно по разному делают вещи.
Потому что только вникаю во все эти нюансы. Это же так просто, анон! Тут пока руку на таких ошибках не набьёшь, то такие элементарные действия не войдут в привычку.
Там, наверное, невероятно высокий уровень комментариев.
Да ничо тяжелого нет. Дольше просто. И часто есть вилка выбора пихать вычисления на стек или не пихать. В плюсах такой вили не будет, насрет в стек конструкторами деструкторами и не спросит даже.
Я могу только понять нытье за отсутствие стрингов как типа (ну и булевых констант). Но это дело привычки на самом деле.
>Я могу только понять нытье за отсутствие стрингов как типа
НИНИУЖНА, особенно для минималистичного и топорного языка как Си. Строки - это как структуры данных, под каждую ситуацию нужна свои.
В ту же Аду несколько видов строк не от хорошей жизни добавили, поэтому пусть лучше оставят базовый функционал, а юзеры свои велосипеды под задачу пишут.
Я починил баг с изменением значения константы.
Виноватыми оказались касты типов при установке отдельных битов внутри байта. Решение: переписал безтиповым макросом, нет каста типов - нет проблем.
>>786333
Вот попытался что-то наговнокодить: https://0x0.st/H28D.c
На пекарне и в браузере работает.
Бля я так и не понял чо вы делаете. Каких то сферических коней в вакууме. Ну окей надо вам слеить строки ну юзаните sprintf() зачем по байту перекладывать.
>Бля я так и не понял чо вы делаете
Там задание выше по треду. Плюс, анон не хочет вызывать сторонние функции.
upd
Например через макрообертку va_args, пихаем в макро массив слов, внутри фором клеим управляющуюу строку для sprintf, аллоцируем память, передаем управляющую строку поинтер и va_arglist в спринтф, проходим фором меняя нули на пробелы
решил в псеводокоде
>>786605
sprintf это стандартная печать
Анон учится и хочет вручную такие вещи пописать, чтобы со строками разобраться, а ты ему уже вариадики суешь.
бля забыл такую хуйню - спринтф сам аллоцирует сколько надо по печать строки в массив, так что можно просто (следите за руками) напринтить в поинтер со здвигом равным длинне строки слова -1
типа
char * str = "";
for tralivali
sprintf(str+shif, "%s ", words);
puts(str);
да вариадики я для себя подумал, чисто мозги подразмять
Вот как раз есть похожий мультипликатор строк навелосипеженый, можно его доработать под прием массива слов и решение готово.
Первая же строчка с комментом кричит "Говно!".
Надо делать так, что сначала вызываешь эту функцию в пассивном режиме, она ничего не делает и только возвращает размер необходимого буфера. Потом этот буфер сам создаешь и вызываешь функцию снова, уже с этим буфером, и она его заполняет результатом. А такая самодеятельность с выделением неизвестно чего внутри функции, а потом попытка это отмазать комментом "НЕ ЗАБУДЬТЕ ПОДТЕРЕТЬ ГОВНО ПОСЛЕ МЕНЯ", ну вы поняли.
Да мне просто лень было контрол це контрол вэ делать для другого алгоритма и я накодил это, так что чо ты ругаешься, это же не либа какая.
Такое работает для хеллоуворлда из двух функций. В реальной же программе ты тут же сам забудешь и получай текущую память.
Потому что все эти твои ++ читать неудобно. Я не хочу рыть многостраничне мануалы в поиске ответа какой из этих ++ выполнится первым, правый или левый, и какие у них побочные эффекты.
Во‐вторых, между краткостью и понятностью я всегда выберу понятность. Я в своём коде всегда использую Value += 1.
В‐третьих, вы всерьёз думаете, что компилятор, умеющих такие оптимизации как раскрутка цикла, распространение констант, удаление общих подвыражений, вынос инварианты — он не умеет оптимизировать ++ слева или справа?
Анон, спасибо! Буду иметь ввиду, что так можно делать. Но проблема в том, что каждое слово нужно отделить пробелом, а тут я так понял можно посчитать длину всей строки и её сразу же передать sprintf.
>>786667
>Во‐вторых, между краткостью и понятностью я всегда выберу понятность. Я в своём коде всегда использую Value += 1.
Да, понял, анон! Я просто не думал, что я буду кому-то показывать этот код, но из-за этого '\0' в конце строки, я чёт взгрустнул вчера под конец дня и решил спросить анона.
>он не умеет оптимизировать ++ слева или справа?
Я не сомневаюсь, что он это умеет, я просто не понимаю, что здесь оптимизировать, ведь в машинных кодах это и так всё до невозможности просто выглядит.
Но у меня немного ООП головного мозга.
Собственно. Я тут хочу получить фидбек насчет организации своего кода.
Так вообще кто-нибудь пишет на Си?
Я просто не очень много смотрел примеров чужого кода сишного. Придумывал на ходу. Вот примерно такой стиль придумал.
Думаю суть понятна. Объектов у нас нет, пусть будет структура, а ей сразу определяем как указатель будет обзываться, чтобы постоянно звездочку не дописывать. С о всякими функциями которые надо так же передать в другую функцию - делаем typedef для описания сигнатуры, в потом ссылку на функцию помечаем через прификс d (от delegate)
Ну и функции - так же, чтобы типа сэмулировать неймспейсы и стандартную структуру ООПшную - типа имя модуля, имя подмодуля, типа имя объекта, и собственно - сама функция. Что типа "статичное" - не принимает в себя поинтер на объект, что типа делает что-то с объектом - последним аргументом - поинтер на объект и типа обязательно обзываем его self, ну, типа чтобы сэмулировать привычные this.
Собственно. Я уже сказал. Хочу фидбек по такой вот организации кода. В мире Си - пишет так кто-нибудь? Или мне как в растах-питонах опять надо перестраивать свой майндсет и пытаться как-то иначе все это дело делать?
Это и есть кусок из двустрочного хеловорлда.
Просто закинь в ридми свою нотацию по неймингу и не парься.
Не знаю алиасы на поинтеры мне не нравятся. Будто чел и жабы пришел и на звезды смотреть не может.
Звезды вправо для сойжаков, звезды влево для труолдов. Бикоз звезда относится к типу. uint8_t* тип.
>>786871
Ладно, я хуйню сморозил. Ставьте звезды где вам нотация пишет их ставить и ебаште те алиасы которые нотация позволяет.
Если у вас по неймингу uint8_t ⚹p то так и будет нормально.
Если у вас по неймингу typedef uint_8t⚹ uint8_ptr то так и будет нормально.
И ебаните уже в шапку двачезвезды ⚹⚹⚹
>Звезды вправо для сойжаков, звезды влево для труолдов.
Схуяли? Ветераны линукса и юникса всегда справа ставят, можешь сам их код посмотреть.
Алсо, такого типа данных как указатель не существует, так что звездочка должна к переменной относиться. Иначе бы
>int⚹ a, b, c;
работало для всех одинаково.
Нет не должна. Вот например тип куда ты кастуешь (int⚹).
В юниксах вообще олдовый АНСИ стайл с обратной совместимостью. Например
int
main()
{
return 0;
}
Я вот считаю что звезды это отличная тема для обсуждений и она не раскрыта.
Нотацию можно строго определить только пройдя через типичные примеры нейминга и написаний.
Вот несколько примеров
int⚹ func(int⚹ ptr){}
int ⚹func(int ⚹ptr){}
int⚹ p, ⚹ b;
int ⚹p, ⚹b;
a = (int⚹)c;
a = (int ⚹)c;
Сами выбирайте себе звездную нотацию. Я выбрал не парится и ставлю в центре int ⚹ ptr
Этот прав. Между звездой и именем типа всегда пробел.
>Алсо, такого типа данных как указатель не существует
Пошел ты нахуй, пес. Если не существует тогда почему этот код с пика не работает? Жду маневры.
И чего ты подорвался?
Код с пика не работает потому что в Си семантика некоторых операторов зависит от контекста. И в данном случае разрабы Си и компилятора сделали так, что при обьявлении указателя ты никак не присвоишь ему значение по значению. оп, каламбур
Если написать
>int ⚹p;
>⚹p = 10;
или
>int i = 10;
>int ⚹p = &i;
то все заработает.
Алсо, если указатели это такой же тип данных, то почему
>int⚹ a, b, c;
не работает?
и почему я не могу сделать так?
>int ⚹(⚹p) = 10;
Ты же сам маняврируешь изходя из топологии деклараций и инструкций, мол это разная хуйня и тут же переспрашиваешь почему это разная хуйня.
>Алсо, если указатели это такой же тип данных, то почему
>int⚹ a, b, c;
>не работает?
По тем же причинам по которым мой пик не работает.
Объявляй каждый свой инт на отдельной строке
int ⚹a;
int ⚹b;
int ⚹c;
>и почему я не могу сделать так?
>int ⚹(⚹p) = 10;
А что ты тут пытался сделать? По твоей шизотеории ты пытаешься в инт положить инт, но опять что то пошло не так, да?
Я начал писать пасту, но потом подумал нахуй оно мне надо? Ты просто тупой, иди на хуй.
инб4: пук срень, ряя, ты слился
Доделал первую часть без хуюрсесов.
Буду допиливать флажки покраски буковок и пульну этот лагоритм в основной проект. Хуй саси
Булы не нужны. Пруфмивронг.
uint8_t buffer
size_t name = strlen((char) buffer);
Буфер из файла в нем сначала иду слова, потом цифры и так несколько раз
По идее, это длинна фразы, пока байты можно трактовать как буквы, но я не понимать тогда как это работает
Если буфер это поинтер на насигнединты тогда нэйм это длина строки буффер в байтах записанная в память длинны сайз_т байт
Если проще - буферр это строка, нейм это длина строки в байтах (а не в символах).
Кстати говоря
Я никогда не понимал нафига люди юзают стрлен которая ходит циклом по строке и считает байтики (занимает процессорное время) если можно просто сделай сайзоф (который будет вычислен на этапе конпеляции и не тратит процессорное время)
Другое дело когда ты именно символы считаешь (например только печатные а в строке еще и непечатные), тогда конечно это другой разговор, в строке могул лежать не английские буквы длинной по два байта или непечатные символы по 5 байт например.
Или стрлен проводит анализ байтов на предмет вайдчара вайдинта? Я смотрел реализацию в своей библе и у меня там топорный вайл. Это мне в штаны насрали или так она и реализована у вас?
>Кстати говоря
Как узнать размер строки по поинтеру? Только проходя вайлом до нулевого байта. Так что ответ такой:
Для
type_t ⚹ str = "string";
size_t len = strlen(str):
Для
type_t str[] = "string";
size_t len = sizeof(str);
А что не так?
>Только проходя вайлом до нулевого байта.
UTF-8 сложнее, нужна библиотека-парсер каждого символа.
>>788601
Ткни пальцем на нулевые байты я не вижу.
https://wiki.iarduino.ru/page/encoding-arduino/
Может ардуиновика врет, но тут табличка утф8
Такс... Если
>wchar_t многие символы имеют в составе нулевой байт
Тогда как это вяжется с представлением строк. На вики написано что вайдчары нужны для отображения широких символов (что бы это ни значило, эмодзи в виме какие нибудь), но представление строк это набор байтов в конце которых нулевой байт.
Даже если мы пихаем строку в условный wchar_t[] то принтим то мы ее по формату представления строк - тобишь по вайлу пока не встретим нулевой байт.
???
>Тогда как это вяжется с представлением строк.
Прямо.
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 байта, второй получается лишний с нулевым значением.
Двач - образовач! Спасибо, анон!
>Алсо, если указатели это такой же тип данных, то почему
>>int⚹ a, b, c;
>не работает?
Потому что синтаксис у указателя это звёздочка перед переменной, поэтому вот это работает:
>int a, b, *c;
это говорит о том, что мы объявили три указателя, которые должны могут указывать на целочисленные переменые.
>в винде стандарт
Смешно звучит, учитывая что винда не поддерживает ни один страндарт целиком.
Я вас умоляю, вы так говорите будто такая запись
int ⚹ a, ⚹ b, ⚹ c;
или такая
int⚹ a,⚹ b,⚹ c;
не работает.
Да даже вне деклараций например
int⚹ p = &a;
⚹ p = 1;
Работает, почему эти записи не должны работать? Я говорю, что эта запись
>>int⚹ a, b, c;
не будет создавать три указателя. Ну и те записи, которые ты перечислил, тоже лучше не употреблять, ибо принято звёздочку ставить прям перед переменной без всяких пробелов. Просто с эстетической точки зрения это выглядит более опрятно, и сразу же объясняет то, что та или иная переменная есть указатель.
За это и начался спор. Что например при декларе переменных читабельнее ставить у переменной, а при декларе прототипов при типе.
Например
int ⚹myfunc(unsigned ⚹ , char ⚹); Менее читабельна чем
int⚹ myfunc( unsigned⚹ , char⚹ );
>int ⚹myfunc(unsigned ⚹ , char ⚹); Менее читабельна чем
Для меня наоборот второй вариант менее читабельный.
Хз, как это объяснить, но когда я вижу первый вариант, который ты считаешь мене читабельным, то мне сразу понятно, что myfunc должна вернуть указатель. А когда читаю второй вариант, то мозг как бы на мгновение останавливается и начинает вспоминать, что это означает. Мб, конечно, дело привычки, но всё равно более эстетично выглядит первый вариант, когда звёздочка прям перед переменной.
А почему твой мозг считает что должна вернуть указатель на переменную, а не указатель на функцию например, ведь звездочка у имени функции стоит а не у имени переменной?
Я просто пытаюсь понять почему у вас паттерны "сщуность ⚹сущность" обрабатываются проще чем например "сущность ⚹ сущность"
>должна вернуть указатель на переменную, а не указатель на функцию например
Указатель на ф-цию? Ф-ция должна вернуть указатель на определённую область памяти, в которой это ф-ция производила какие-то действия.
>сущность ⚹ сущность
Да просто, потому что это похоже на умножение.
>сщуность ⚹сущность
А это есть указатель.
Просто, когда ты пишешь
>int ✱a
то тут нет сомнений, что это указатель на целочисленную переменную а.
А когда ты пишешь
>int ✱ a
то это будто ты умножаешь int на а, что мозг первым делом отвергает, потому что это бред.
>указатель на определённую область памяти, в которой это ф-ция производила какие-то действия
Ну а вот например так если
...
result = printf;
return result;
}
>>сущность ⚹ сущность
>Да просто, потому что это похоже на умножение.
>>сщуность ⚹сущность
>А это есть указатель.
Что насчет a ⚹b? Понимаю что без деклараций не разобраться что есть а что б. Но я намекаю на то что это так же может быть умножением и так же может быть поинтером как и a ⚹ b как и a⚹b и даже a⚹ b
Добавим сюда декларации typedef int a; и это поинтер
Добавим другие декларации int a,b; и это умножение
>result = printf;
>return result;
>}
А здесь что не так? В result будет записан какой-то мусор, и этот мусор будет возвращён.
>Понимаю что без деклараций не разобраться что есть
Ты же сам ответил - всё зависит от деклараций, но когда задекларирован указатель, то читать проще, когда звёздочка перед переменной.
>В result будет записан какой-то мусор
Почему ты считаешь что будет записан какой то мусор?
> но когда задекларирован указатель, то читать проще
С этим я не спорю. Я спорю с тем что есть формат деклараций прототипов а именно
[ тип возвращаемого значение ] пробел [ имяфункции ] скобкаоткрылась...
а в ваших декларациях имя функции со звездочкой
вы же потом не пишите кол как ⚹myfunc() правильно?
Что то я устал разжевывать очевидное.
>Почему ты считаешь что будет записан какой то мусор?
Запусти код, который ты написал и сам всё увидишь.
>вы же потом не пишите кол как ⚹myfunc() правильно?
Вот ссылка, которая тебе поможет:
https://metanit.com/c/tutorial/5.11.php#:~:text=%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%20%D0%BD%D0%B0%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E%20%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%20%D1%81%D0%BE%D0%B1%D0%BE%D0%B9,%D0%BD%D0%B0%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E%20%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D0%B5%D0%B5%20%D0%B8%D0%BC%D1%8F.
myfunc это и так указатель, получается, что ты хочешь получить масло масленное.
Ты решил меня потроллить тупостью? Резулт в том примере вернет указатель на принтф. Указатель на принф по твоему мусор что ли?
>myfunc это и так указатель, получается, что ты хочешь получить масло масленное.
Примеры где ты делаешь колы функций через звезду тащи сюда.
И вообще весь этот холивар проистекает из утверждения о том что такого типа данных как поинтер не существует (да может быть это корректное утверждение с точки зрения того что есть такой тип данных как адрес, но не поинтер, однако я думаю анон имел ввиду совсем другое)
Опять же вернемся к стандартным поинтерам
>int ⚹p;
В данном случает поинтер это р а не ⚹р и вот почему
р++ - двигаем поинтер на sizeof(int), а не ⚹p++ - двигаем поинтер
p = arr[30] - устанавливаем поинтер, а не ⚹p = arr[30]
Из всего этого есть один вывод простой
p это переменная типа int ⚹.
Я закончил.
Допустим, что я через сокеты передаю строку. Вопрос такой: есть ли ограничение на размер передаваемой строки при использовании сокета?
Есть ещё один момент: так как с советами на линуксах я знаком, но не знаю, что есть в windows.
Да, есть. Не больше двух гигабайт.
Дело привычки. Деды через пробел.
1. Язык Си это часть языка С++?
2. Если это так, то зачем тогда учить отдельно Си? Можно выучит С++ и знать одновременно два языка(Си и С++).
>int a, b, c, d, e, g, h;
Откуда у вас вообще возникла идея объявлять все переменные в одной строке? Начитались книжек из 1970‐ых годов? Это плохая практика.
В современном мире объявлять переменную следует не в заголовке функции, а как можно ближе к тому месту, где она будет использоваться. И желательно сразу с инициализирующим значением.
Поддвачну. А вообще идеальным вариантом будет объявлять переменную на своем уровне стека и если нужно делать проброс через поинтер на предыдущий уровень.
Да, отработает.
> а как можно ближе к тому месту, где она будет использоваться.
Нет. Неудобно оценивать размер стека. Смешивается декларативное и императивное.
> И желательно сразу с инициализирующим значением.
Нет. Отвлекает от декларативного.
Тематика вопроса не совсем по сям но все же. Объясни как мне (архитектурно) состряпать пир ту пир приложуню? я понимаю как законнектить две машины в локалке, но я не понимаю как законнектить две машины в глобалке. Там же динамические айпишнегы провайдер дает. Сегодня антон был под одним айпишнегом, завтра под другим. И как антона найти тогда? На какой айпишник коннект кидать? Я не понимаю.
Никак. При первом запуске "на холодную" требуется централизованный сервер. Потом уже известные узлы можно хранить в кэше, но кэш со временем протухает и снова потребуется сервер.
Я вот глянул курс лекций по сетям и у меня такой вопрос. Если я посылаю пакет на бродкаст (255.255.255.255) в котором например есть еще порт моей приложуни питупи и какая то инфа (ну например с моим айпишнегом в локалке провайдера плюс какая то идентификационная хрень по типу "это я") - то ведь этот пакет получат поидее вообще все в интернете, правильно? Или нет? Ну и значит этот пакет получит Антон на том конце мира и сможет закешировать какие нить данные и послать уже запросик на коннект. Ну и поидее в обратную сторону так же сработает. Или нет? Я ничего не понимаю...
Ну например такая схема
Если дозвон до старого айпишнего ничо не дал - нет узла, узел не тот, там нет порта и тд и тп значит это не антон
Шлю бродкаст "АНТОХА ОТЗОВИСЬ" или "АНТОХА ЗВОНИ СЮДА"
И либо мне прилетает айпишнег антона и я конекчусь, либо антоха шлет коннект до меня и там рукопожатия писюнов тыры пыры в жопе дыры
Крч подкиньте идею, я не оч понимаю. Есть еще какой то опенфлоу и сдн (не днс).
>Там же динамические айпишнегы провайдер дает
в "локалке" тоже могут быть динамические айпишники, зависит от окружения
>И как антона найти тогда
знать его айпишник. если поменялся, то узнавать заново
>Если я посылаю пакет на бродкаст (255.255.255.255)
бродкаст домен действует на уровне твоей локалки (т.е его получат устройства котороые непосредственно с тобой в локальной сети), если по васянски сказать, то маршрутизаторы такой запрос уже не пропускают.
>подкиньте идею, я не оч понимаю
что подкинуть, у тебя задачка какая? Соединить две машинки глобально можно по разному, но для этого, сюрприз-сюрприз, необходимо знать ip-адрес дальней стороны.
>состряпать пир ту пир приложуню
может начать со знакомства с peer-to-peer протоколами? мм, как такая идея? вообще я удивляюсь тому, что с абсолютно нулевыми начальными вводными по сетям ты полез писать ptp приложение на С. похвально, подпишусь на блог.
Широковещание в интернете не работает, только в локалке.
Еще раз, для дебилов - НИКАК, нужен централизованный (известный всем желающим подключиться) сервер который сообщит им адреса.
Собрал либу в Вижуал Студио, работает не правильно, собрал в ГЦЦ, работает правильно, куда копать? Оптимизацию отключил.
>Нет. Неудобно оценивать размер стека. Смешивается декларативное и императивное.
Какой ещё размер стека, поехавший. Компилятор в целях оптимизации все твои переменные может заменить на константу, либо засунуть в регистр, либо переиспользовать под другие цели.
Если тебе нужно руками управлять стеком, тебе нужно на ассемблере писать.
>необходимо знать ip-адрес дальней стороны
Да это и так ясно. Какая есть технология чтобы его узнать? Ну вот допустим днс выхлоп по ретрансляции адресов в айпишниги кешируется да, но если в кеше нет нужной записи то мы пойдем звонить по цепочке и спрашивать каждый днс шлюз вплоть до центральных доменных серваков пока не получим соответствие записи хуйжопа какому то айпишнеку.
Ну а существует ли такой же проброс вопроса для Антона? Ну как ты спрашиваю в локалке "АНТОНЫ ЕСТЬ"? Все молчат спрашивам на уровне нашего шлюза знают там антона или нет?
>может начать со знакомства с peer-to-peer протоколами? мм, как такая идея?
По-твоему мне надо быть инженером технологом пищепрома чтобы бутерброд себе сделать?
>похвально, подпишусь на блог.
Подписывайся конечно.
Неправильно, аналогия такая - надо скачать рецепт бутерброда бесплатно без смс, чтобы вместо бутера из говна и мочи увидеть как нормальные люди делают бутерброд из ветчины и хлеба.
Аналогия такая. У меня есть ветчина и есть хлеб. И я пытаюсь выснить как их сложить чтобы получился бутерброд.
Так все таки, могу я как то у всяких там главных узлов отвечающих за выдачу айпишнеков спросить какой айпишник дали антону сегодня?
>узлов отвечающих за выдачу айпишнеков спросить какой айпишник дали антону сегодня?
наверное. что за узлы, кстати?
>могу я как то у всяких там главных узлов отвечающих за выдачу айпишнеков спросить какой айпишник дали антону сегодня?
Я так и думал сделать, но говорят бродкасты работают только в локалке. Да и прям на все айпишники мне не надо пои идее. Мне надо мультикастить на анотонову локалку, физически он из локалки никуда не переедет, просто сменит айпишник. Та что почается если под старым айпишником не антон надо врубить мультикаст пока не нащупается антон. Я вот так думаю.
>но говорят бродкасты работают только в локалке
ну а зачем броадкаст? пройдись по всем белым айпишникам в цикле, их не так много на самом деле.
>пока не нащупается антон
Вчера читал про всякие i2p и фринеты, так вот, они там поголовно используют ключи шифрования (приватник и общий ключ). Не знаю, может тебя это на что-то наведёт, потому что излучать цопе по всему миру это тупо.
Так они шифрование используют, чтобы понять к тому антону ты подключаешься или нет, это самое, что не наесть про коннекты.
Мне кажется достаточно апишнека и порта + фразы приветсвия
Если это не антон у него не будет порта открытого. Если это челик слушающий сеть со всем открытыми портами - у него не будет фразы приветсвия.
Ну я тебе примерно об этом и толкую.
Дурачек, char tmpbuf3[MAXBUF] колпилятор никуда не соптимизирует. Эта хуйня должна быть на видном месте. А для всего остального незачем делать исключение. Объявления только в начале блока, и желательно в порядке убывания размера.
Вот почему даунам нужно со школы вбивать паскаль, мужик был умный, знал что делал. А если сразу дать нормальный язык, они начинают лепить через жопу, мозгов своих понять нет, таких только дрессировать, сразу, потом будет поздно.
576x1024, 0:48
Не пойму в чем суть претензии то? Каждый волен выбирать как ему использвать инструменты языка. Сишник позволяет декларировать новые сущности на каждом слое стека, так хули этим не пользоваться? Еще учитывая что выходя со слоя стека не надо следить за памятью и она автоматически считается освобожденной вотличие от кучи - вообще же супер (ну если без статиков). Если мне вот надо безтайповый своп сделать макросом то как мне его сделать то ты предлагаешь? Задекларировать глобалку и через нее свопать? А почему бы не задекларировать локалку на стеке и свопнуть через нее, а потом удалить локалку при выходе со стека?
Крч мимопроходил нихуя не понял чо тут деды друг друга деснами грызут.
>декларировать новые сущности на каждом слое стека
Этот прав! Плюс надо учитывать, что каждая ф-ция должна выполнять одно действие и быть компактной, чтобы не держать в голове овердохуя переменных, когда читаешь код, следовательно, само название ф-ции, а следом и декларирование переменных, при чтении кода, должно сразу давать представление о том, что за алгоритм здесь применяется. А если декларировать переменные хаотичным образом, то получается, надо саму ф-цию разбивать на "блоки", что ломает представление о значении ф-ции.
>Дурачек, char tmpbuf3[MAXBUF] колпилятор никуда не соптимизирует
Про оптимизацию «распространение констант» первый раз слышим? Весьма наивно полагать, что такие штуки могут происходить только с переменными а с массивами не могут. Компилятор может выкинуть весь твой тмпбаф3 и заменить его константой, как написано в этой статье https://habr.com/ru/articles/272269/
>Эта хуйня должна быть на видном месте
На видном месте — это когда видно где объявлено значит там используется. А когда приходится бегать глазами в заголовок блока, начало функции или вообще прокручивать — это не видно.
>и желательно в порядке убывания размера
Зачем? Если для выравнивания, то это относится только к полям структур. Одиночные переменные компилятор выравнивает автоматически.
Ответственность за перекат в новый тред лежит на аноне.
Начиная примерно с 2010 года в ОС адреса памяти не реальные, а виртуальные, живи теперь с этим
А где почитать можно.
Какого нахуй 2010, это уже как 300 лет виртуальные адреса.
Да любая современная IDE вроде студии.
Даже VSCode можно научить показывать адреса переменных: ставим плюйгины «Hex Editor» и «MemoryView».
>Компилятор в целях оптимизации все твои переменные может заменить на константу, либо засунуть в регистр, либо переиспользовать под другие цели.
В реальности Clang любит захуячить твою переменную в стек, даже когда ты специально кодил так, чтобы в регистрах место оставалось. Стек, по крайней мере маленький, работает со скоростью регистров. Не знаю, как сделано, может у процессора есть кэш стека.
Сколько че ни делал интринсиках SSE2, Clang все время норовит в стек запихнуть, хотя специально экономлю регистры. GCC нет, но быстрее оно не работает.
А что не так? К стеку доступ константный, всегда знаешь где что лежит. Единственное ограничение это оперативка наверное.
Работает оно настолько быстро, что там скорее всего никаких обращений к оперативке вообще нет. Может в начале, если это например цикл, из нее читается, а в конце пишется. А при долбежке в цикле выглядит как обращение через rsp, но на самом деле используются какие-то теневые регистры.
Почему гцц смог уместить все в 20 строк, а ебаный шланг размотал эти 20 строк на 60 строк, да и еще зачем-то векторизацию(SSE 128 бит регистры) применил. Старый шланг таки вообще до 200 строк говно размотал.
Тебе ращвернули цикол на 4 или даже на 8, если там упакованные умножения не просто так. Почему? Ты сам сказал шлангу, что хочешь отпимизацию по скорости под хуй сосе.
Чел, хороший компилятор делает Intel, это база, запомни. Никто из серьёзных ребят не компилирует шлангом. В крайнем случае можно майкрософтским компилятором. Шланг и говноцэцэ для мозолеедов, это средства для онанизма, а не компиляторы.
Ахахухаха.
> Без высшего образования работы на плюсах нет. Если студент, на третьем курсе ищи интерном место.
Не один раз сталкивался на плюсовых проектах с людьми без высшего образования. Другое дело надо иметь скиллсет, чтобы самостоятельно уметь изучать от и до. А у многих без университета и настояния какого-то подгнившего профФессора с кафедры до бошки какие-то моменты не доходят.
> Работа на крестах собачья, сложная, неблагодарная, плохо оплачиваемая. Не связывайся.
Если не умеешь себя продать - то все будет именно так, согласен.
>Без высшего образования работы на плюсах нет
кто тебе сказал ? батя с государственного предприятия?
https://hh.ru/vacancy/84720366
Вот не последняя компания и вышка тут не нужна и таких 90% на рынке труда
Ты вроде сам включил О3 оптимизации, а потом имеешь претензии к компилятору. Это глупо.
Так гцц +- одинаковый код генерирует. А вот шланг
Шланга, вот такая вот шланга.
Не задавался вопросом, что вероятнее всего clang имеет другие оптимизации врубленные на уровне О2 и О3 в отличии от gcc? Например, подрубает принудительно -march=native там, не?
Странно после этого писать что какой-то компилятор говно, а какой-то нет. Это все равно что называть говном clang, потому что он не gcc.
Мимо формошлеп JSON-грузчик
280к в месяц даже не знаю базу алгебры за 6 класс
Это вакуха для формошлёпа на Qt-дрисне. В 99% будет микроэлектроника или какая-то очень специфичная предметная область где ты охуеешь, или гейдев, или хайлоад в яндексе.
> вышка тут не нужна
А ты откликнись, это подразумевается.
Справку, она у них охуительна, ну и любую доступную книгу на выбор пару глав вступления
Ньюфаня в трхеде, ясно
Мне думается, что шланг юзает SIMD инструкции. Попробуй получить значение 2^64 и вывести его, если шланг выведет 18446744073709551616, а гцц 0, то вот тебе и ответ, почему шланг юзает 128 битные регистры.
CFLAGS=-c -Wall -Werror -Wextra
LDFLAGS3=
EXE3=../../build/Quest_3
SRCS3=\
../data_libs/data_io.c\
../data_libs/data_stat.c\
../data_module/data_process.c\
../yet_another_decision_module/decision.c\
main_executable_module.c\
sort.c
OBJS3=$(SRCS3:.c=.o)
LDFLAGS4=
EXE4=../../build/Quest_4
SRCS4=\
../data_libs/data_stat.c\
../data_module/data_process.c\
../yet_another_decision_module/decision.c\
sort.c
OBJS4=$(SRCS4:.c=.o)
STAT_SRCS=../data_libs/data_stat.c
STAT_OBJS=$(STAT_SRCS:.c=.o)
STAT_LIB=data_stat.a
LDFLAGS5=-L. data_stat.a
EXE5=../../build/Quest_5
SRCS5=\
../data_libs/data_io.c\
../data_module/data_process.c\
../yet_another_decision_module/decision.c\
main_executable_module.c\
sort.c
OBJS5=$(SRCS5:.c=.o)
DYN_SRCS=\
../data_libs/data_stat.c\
../data_module/data_process.c
DYN_OBJS=$(DYN_SRCS:.c=.o)
DYN_LIB=data_process.so
LDFLAGS6=-Wl,-rpath,.
EXE6=../../build/Quest_6
SRCS6=\
../data_libs/data_io.c\
../yet_another_decision_module/decision.c\
main_executable_module.c\
sort.c
OBJS6=$(SRCS6:.c=.o)
all : build
$(EXE3) : $(OBJS3)
$(CC) $(LDFLAGS3) $(OBJS3) -o $@
$(EXE4) : $(OBJS4)
$(CC) $(CFLAGS) -DFLAG main_executable_module.c -o main_executable_module.o
$(CC) $(LDFLAGS4) $(OBJS4) main_executable_module.o -o $@
$(EXE5) : $(OBJS5)
$(CC) $(LDFLAGS5) $(OBJS5) -o $@
$(EXE6) : $(OBJS6) $(DYN_LIB)
$(CC) -o $@ $(OBJS6) -L. $(DYN_LIB) $(LDFLAGS6)
.c.o :
$(CC) $(CFLAGS) $< -o $@ //это
build : $(SRCS3) $(EXE3)
build_with_macro : $(SRCS4) $(EXE4)
$(STAT_LIB) : $(STAT_OBJS)
ar rc $(STAT_LIB) $(STAT_OBJS)
$(DYN_LIB) : $(DYN_OBJS)
$(CC) -shared -o $(DYN_LIB) $(DYN_OBJS)
build_with_static : $(STAT_SRCS) $(STAT_LIB) $(SRCS5) $(EXE5)
build_with_dynamic : $(DYN_SRCS) $(DYN_LIB) $(SRCS6) $(EXE6)
clean :
rm -rf $(EXE3) $(EXE4) $(EXE5) $(EXE6) $(OBJS3) $(STAT_LIB) $(DYN_LIB)
rebuild : clean build
run3:
$(EXE3)
run4:
$(EXE4)
run5:
$(EXE5)
run6:
$(EXE6)
анон, поясни как работает этот makefile, особенно где стоит коммент «это».
и пикрил, например. Почему obj5 вызывается?/объявляется? Два раза? Что происходит при первом вызове?
CFLAGS=-c -Wall -Werror -Wextra
LDFLAGS3=
EXE3=../../build/Quest_3
SRCS3=\
../data_libs/data_io.c\
../data_libs/data_stat.c\
../data_module/data_process.c\
../yet_another_decision_module/decision.c\
main_executable_module.c\
sort.c
OBJS3=$(SRCS3:.c=.o)
LDFLAGS4=
EXE4=../../build/Quest_4
SRCS4=\
../data_libs/data_stat.c\
../data_module/data_process.c\
../yet_another_decision_module/decision.c\
sort.c
OBJS4=$(SRCS4:.c=.o)
STAT_SRCS=../data_libs/data_stat.c
STAT_OBJS=$(STAT_SRCS:.c=.o)
STAT_LIB=data_stat.a
LDFLAGS5=-L. data_stat.a
EXE5=../../build/Quest_5
SRCS5=\
../data_libs/data_io.c\
../data_module/data_process.c\
../yet_another_decision_module/decision.c\
main_executable_module.c\
sort.c
OBJS5=$(SRCS5:.c=.o)
DYN_SRCS=\
../data_libs/data_stat.c\
../data_module/data_process.c
DYN_OBJS=$(DYN_SRCS:.c=.o)
DYN_LIB=data_process.so
LDFLAGS6=-Wl,-rpath,.
EXE6=../../build/Quest_6
SRCS6=\
../data_libs/data_io.c\
../yet_another_decision_module/decision.c\
main_executable_module.c\
sort.c
OBJS6=$(SRCS6:.c=.o)
all : build
$(EXE3) : $(OBJS3)
$(CC) $(LDFLAGS3) $(OBJS3) -o $@
$(EXE4) : $(OBJS4)
$(CC) $(CFLAGS) -DFLAG main_executable_module.c -o main_executable_module.o
$(CC) $(LDFLAGS4) $(OBJS4) main_executable_module.o -o $@
$(EXE5) : $(OBJS5)
$(CC) $(LDFLAGS5) $(OBJS5) -o $@
$(EXE6) : $(OBJS6) $(DYN_LIB)
$(CC) -o $@ $(OBJS6) -L. $(DYN_LIB) $(LDFLAGS6)
.c.o :
$(CC) $(CFLAGS) $< -o $@ //это
build : $(SRCS3) $(EXE3)
build_with_macro : $(SRCS4) $(EXE4)
$(STAT_LIB) : $(STAT_OBJS)
ar rc $(STAT_LIB) $(STAT_OBJS)
$(DYN_LIB) : $(DYN_OBJS)
$(CC) -shared -o $(DYN_LIB) $(DYN_OBJS)
build_with_static : $(STAT_SRCS) $(STAT_LIB) $(SRCS5) $(EXE5)
build_with_dynamic : $(DYN_SRCS) $(DYN_LIB) $(SRCS6) $(EXE6)
clean :
rm -rf $(EXE3) $(EXE4) $(EXE5) $(EXE6) $(OBJS3) $(STAT_LIB) $(DYN_LIB)
rebuild : clean build
run3:
$(EXE3)
run4:
$(EXE4)
run5:
$(EXE5)
run6:
$(EXE6)
анон, поясни как работает этот makefile, особенно где стоит коммент «это».
и пикрил, например. Почему obj5 вызывается?/объявляется? Два раза? Что происходит при первом вызове?
>Это вакуха для формошлёпа на Qt-дрисне
Будто что-то плохое, зарплата хороша
>В 99% будет микроэлектроника или какая-то очень специфичная предметная область где ты охуеешь
Ты будешь там также формошлепить, использовать готовый фреймворк и пулять байтики
>или гейдев, или хайлоад в яндексе.
Нахуя мне эти единичные случаи?
>А ты откликнись, это подразумевается.
А я откликался и только додики с заводов требуют вышку
Вот еще пример хорошей компании не требуется вышка
https://hh.ru/vacancy/82573527
требуют хорошую алгоритмическую базу, но это можно получить без вышки в 2023 году
Да, я вижу, что и там и там int! Я просто подумал, что мб ты сам додумаешься, что нужно просто расширить до ансайнед лонга, чтобы проверить теорию о SIMD инструкции, но не судьба, поэтому подсказка: расширь до ансайнед лонга и проверь.
Можно вообще поступить как белые люди, а не как мы пытаемся сделать - sizeof(unsigned long long), и сравни это значение у gcc и у шланга.
>Почему obj5 вызывается?/объявляется? Два раза?
obj5 нигде не вызывается. Твой $(obj5) — это переменная, её нельзя вызвать, это не функция.
>$(CC) $(CFLAGS) $< -o $@ //это
$(CC) — переменная, в которой содержится имя исполняемого файла компилятора
$(CFLAGS) — параметры компилятора
$<— это тоже переменная, в ней содержится имя первой зависимости
$@ — в этой переменной содержится имя цели
Ну поэтому для начала sizeof(), а потом копать дальше, если будет какая-то разница, ну либо не будет никакой разницы (тогда можно грешить на оптимизацию шланга).
>>или гейдев, или хайлоад в яндексе
А для этого что нужно подтянуть? Или в какую сторону развиваться?
Учишь фреймворк который написал яндекс
учишь фреймворк который написан под игры
формошлепишь по фреймворку
И что, и это всё? И для хайлоада даже асм не нужон? И не нужны алгосы с математикой? Чёт ты мне здесь прохладные какие-то заливаешь в уши.
Ты девопс для хайлода?
Алгосы нужны базовые
Математика базовая 1-11 класс
Если нужен человек с хорошей математикой, то это пишут очень четко в вакансии
https://hh.ru/vacancy/82829548
Так устроен рынок, а кто тут пишет обратное - это теоретики не выходившие на рынок 5 и более лет
Такая же, ты сам выбираешь идти в проект потеть с математикой или идти в обычный
Мне вряд ли кто-то поверит, но у меня в проекте получали сеньеры 300к без математики и взяли одного задрота гения математики за 150к который расхлебывал все самое сложное
вот и думай
>какой-то супермен им нужен
Это заблуждение. Ты просто не знаешь вузовской математики и тебе кажется это чем-то космическим.
На самом деле то, что они требуют, решит любой студент 2-3-го курса технического ВУЗа в период сессии.
В математике не возникают новые фреймворки каждые 3 года. Там всё настоялось уже 100 лет, этому умеют учить. В математике реально достаточно вдумчиво прочитать один учебник и прорешать в нём задачки, чтобы шарить в этом раз и на всегда, на столетия вперед.
Жопоглаз, ты почитай что на скринах написано. Им нужен не студент, а ветеран С++, Питона, гений науки-решатель нестандартных научных проблем (то есть любых проблем, что работодателю захочется). Им нужен ёбаный господь бог всесильный - затычка во всех дырках, обязанный делать всё и виноватый во всех недоделках, а зарплата - МРОТ.
Я понимаю для чего им нужно решать нестандартные научные проблемы (как бы нефтесервисные компании ушли из России, а потому и кпд у скважин резко снизился), но мне всегда представлялось, что людей, способных решить подобные проблемы плюс продвинуть вперёд технологический уклад страны, нанимают не на hh, а, примерно, как Маск рассказывал, как он переманивал у Гугла типов для OpenAI; либо идут, допустим, в МФТИ и там просят профессора заняться этой проблемой. А тут, блять, hh!!! Это, конечно, показывает уровень менеджмента, которые тупо не могут допетрить, что люди с нужными им качествами с вероятностью, стремящейся к нулю, сидят на hh и ждут подходящую для них вакансию, у подобных суперменов уже и так всё на мази до конца их жизни, и единственный способ их нанять это чем-то заманить.
а между тем это просто техническая вакансия для закрытия таски у хрюнделя
никто на нее не пойдет по понятным причинам, а дурака который пойдет сама хрюндель отсеит как долбоеба конченного
дефолтно в штат никто не требуется, а хрюндель должен чем то заниматься на работе кроме фильтрации чая через почки, поэтому шлепают такие вот технические вакансии
развели срачь на ровном месте
Я практик, человек который проработал не в 1 десятке компаний (меняю работу раз в год), а твои коллеги сидят на 1 месте по 15 лет и даже не понимают как устроен рынок в 2023
коротко: там где нужна сильная математика, об этом напишут жирным текстом и пример таких вакансий я тебе скидывал
Тут 1 чел закончил 2 вышки и форсит что вышка нужна,
Другой выучил пайку радиодеталей и форсит что это база
третий выучил немецкий и форсит что только с немецким есть будущее в СИ
Нет не в количестве плюсов в конце, это я уже знаю.
вот у меня есть проект, в котором есть файл cmakelists.txt я его пропускаю через cmake, создавая "MinGW makefiles", потом значит из MinGW использую утилиту сборки mingw32-make и получаю приложение
а если мне требуется сменить компилятор на Clang, то какие шаги будут с ним, чтобы из того проекта с cmakelists.txt получить приложение?
Не знаю, как именно в cmakelist и mingw, но для утилиты make в линуксах нужно просто сменить компилятор в условиях makefile. Скорее всего и у тебя должно быть что-то подобное.
set(CMAKE_C_COMPILER clang)
> но для утилиты make в линуксах
я в винде
> set(CMAKE_C_COMPILER clang)
так мне не как написать файл, а как скомпилировать уже готовый проект
cmake он на пике что должен для clang делать?
в каталоге LLVM/bin я не нахожу аналог mingw32-make, поэтому и спрашиваю как в нем эта цепочка происходит
А дрочить это хорошо или плохо? А анальный секс это хорошо или плохо? А классический секс это хорошо или плохо? А БДСМ и makedome это хорошо или плохо?
Это ни хорошо и ни плохо, это всего-лишь различные взгляды на утоление своих похотливых хотелок.
Ну дык логика объявления типов в Си такова, что ты клеишь операторы (скобки, звездочки, []) к имени ровно в таком порядке, в каком их надо будет применить, чтоб получить ту простейшую хрень на выходе слева (int, double, struct psina и т.д.)
Что еще за C+? TempleOS чтоли?
Ну, исторически Си появился раньше, а С++ изначально был его расширением, чего не скажешь о последних стандартах, но по-прежнему уделяется внимание тому, чтоб легаси можно было как-то поддерживать/мигрировать, поэтому условная обратная совместимость есть, и нестрого говоря Си можно назвать подмножеством C++. Но...
Во-первых, сишный код без дополнительных флагов, препроцессорных директив и прочих правок не скомпилируется.
Во-вторых, в C++ есть фичи, которые служат настолько исчерпывающей альтернативой многим сишным подходам, что мешать их в одном коде концептуально не по-пацански.
Но учить Си имеет смысл как для будущего сишника, так и для будущего сиплюсплюсника, потому что Си, чисто как язык, можно полностью охватить буквально за пару месяцев, чего не выйдет с C++ (потому что C++ - это путь, на котором ты можешь уже весьма продвинуто программировать, и еще не догадываться о всех приколах языка). Си дает некую законченную базу, некий скелет, который если не полностью подготовит, то поможет не растеряться, когда столкнешься в плюсах с тем, от чего обсирается какая-нибудь скриптомакака. Как минимум в работе с аллокатором. Ну и бонусом гештальт закроешь, что освоил твердую ступеньку.
Алсо, иногда Си пригодится даже более непосредственно. Например, когда работаешь на крестах с какими-то системными либами. Там, где вступает в дело пресловутая "условная совместимость" языков.
>А дрочить это хорошо или плохо? А анальный секс это хорошо или плохо? А классический секс это хорошо или плохо? А БДСМ и makedome это хорошо или плохо?
Да.
Согласен. Подписываю контракт не читая.
>Как минимум в работе с аллокатором.
в плюсах даже операторов нет блять, только нью и делит, против маллока каллока и реалока / фри
хули тут так мало? ты так красиво расписываешь за кресыт но суть проста кресты ооп говно и ненужны, ооп это потребность кабана а не программиста, кабан хочет тяп ляп и в продаккшин
оправдывайся
int x = 10;
int y = x++;
х станет 11 но у останется десяткой
Почему так? Моя простая житейская логика ломается об эту операцию. Ведь у должно стать 11 потому что задается х=10 и потом прибавляется 1.
Ну я уже разобрался что у сходу делает мат операцию и говорит системе что х теперь будет 11. Шорткат да но хуйня какая то, если я хочу чтобы переменная что то делала с другой переменной я лучше это отдельно сделаю. А то пройдет неделя и я забуду нахуй что я там накодил и почему нихуя не работает.
int y = ++x;
если хочешь сначала вычислить инкремент до всех остальных операций но это неточно я не проверял
Так и есть, кто-то любит ввернуть такое и радуется, кто-то пишет в умных книжках, что лучше многословнее, но однозначно. Вечная хуйня.
Так и есть, кто-то любит ввернуть такое и радуется, кто-то пишет в умных книжках, что лучше многословнее, но однозначно. Вечная хуйня.
>>804586
да тут нет никакого разночтения
эти сахара однозначно читаются, тут дело скорее в том что ++ это самостоятельная инструкция вычисления, а паравозики присваиваний хороши только без вычислений
например
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;
я бы даже добавил что в языке конечно как бы и присутствуют постфиксные и префиксные операции как раз для разрешения таких вот случаев, но на практике префиксы я почти не вижу потому, что нахуя в голове хранить таблицу приоритетов, когда можно отдельной строкой двинуть счетчи или поинтер и не забивать голову всякой хуйней как скриптомакаки всякие
Все привет в этом чате. У меня проблема -- я тестировщик, которому временами нужно немного править с/c++ программы, в основном внутренний инструментарий конторы. Из всех знаний по оным языкам -- ОДНА прочитанная книга про С (синяя такая, не помню автора) в уневере, пару фэйловых попыток начать изучать c++ по белой книжке с волной (Страуструп). Могу дебажить код в gdb. знаю про valgrind и fuzzing. Короче анон, я тут что бы учиться программировать -- профессиональным разрабом я уже не стану может это к лучшему.
Спасибо за тред.
Пупсик, вопрос то в чем?
зависит от того как ты себя продал
можешь в мыле ебашить за миску риса, а можешь и хуи пинать за наносеки
так что умение себя подать/продать не менее важная хуйня чем профскилы
ну язык простой, поэтому мозгоебли почти не бывают
дают задание, пилишь его дня три, попивая кофеек офисный и заедая сибасом на обед
попердел пару дней в кресло, скидываешь работу на отдел тестирования и пошел на следующий круг
зп 240к
бля ты чо не знаешь философию Си? если тебе нужен какой то велосипед - сделай его сам, хуйлан
Я хочу разобраться.
Как мне сделать функцию, которую можно вызвать потом и она продолжится с того места где остановилась.
Единственное решение что я могу придумать - это извращения с конечными автоматами, типа:
void foo(fooCtx ctx){
switch(ctx.state){
case 1 : // чет на этот шаг
break;
case 2 : // чет на этот шаг
break;
case 3 : // чет на этот шаг
break;
}
}
Но я не верю, что для каждой функции которую я хочу сделать необязательной для выполнения сразу - я должен вот так вот делать.
Не может же быть, что в каком-нибудь контроллере, где куча всяких задач и парралельно надо опрашивать датчики - в каждой функции так вот делаеют.
Или может?
Пожалуйста, поделитесь мудростью.
Ну. Вот в шарпе, допустим, есть вот такая конструкция:
IEnumerable<int> GetInts(int count){
for(int i = 0; i < count; i++)
yield return i;
}
Ну так вот. Каждый раз, когда я буду обращаться к GetNext() - меня перебросит в метод GetInts и выполнение продолжится с того места где был прошлый yield return.
Т.е. я могу вот так вот сделать:
IEnumerable<object> DoSomething(){
var now = DateTime.Now;
while(now.AddSeconds(10) >= Datetime.Now)
{
yield return null;
}
// какой-то полезный код.
}
Ну а сверху я вот такие вот "подзадачи" где-то храню и обхожу. И все в одном потоке.
А вот как на си подобное сделать - я не понимаю.
Ну. Вот в шарпе, допустим, есть вот такая конструкция:
IEnumerable<int> GetInts(int count){
for(int i = 0; i < count; i++)
yield return i;
}
Ну так вот. Каждый раз, когда я буду обращаться к GetNext() - меня перебросит в метод GetInts и выполнение продолжится с того места где был прошлый yield return.
Т.е. я могу вот так вот сделать:
IEnumerable<object> DoSomething(){
var now = DateTime.Now;
while(now.AddSeconds(10) >= Datetime.Now)
{
yield return null;
}
// какой-то полезный код.
}
Ну а сверху я вот такие вот "подзадачи" где-то храню и обхожу. И все в одном потоке.
А вот как на си подобное сделать - я не понимаю.
>А вот как на си подобное сделать - я не понимаю.
Никак, я такую шляпу первый раз вижу, пиздец шарподауны ебанулись. Сохраняй состояния, используй глобальные переменные.
Так а нахуя это нужно то? Ебани потоков, нет говно какое то нужно в язык тянуть
>глобальные переменные
ну точно скрипткидс
Эта хуита для конкурентности придумана, чтобы даже на одном ядре несколько задач выполнялись, хотя бы попеременно.
>чтобы даже на одном ядре несколько задач выполнялись, хотя бы попеременно.
Ты наверное pthread не осилил?
>чтобы даже на одном ядре несколько задач выполнялись, хотя бы попеременно.
Ты наверное pthread не осилил?
Потоки не гарантируют, что задачи будут в один временной промежуток выполнены. У тебя может фактически в один момент одно ядро работать по разным системным причинам.
В обще по хую, уноси свое не нужное
Т.е с потоками основной примитив это pthread_join делать
Ну. Я же написал. Вот у меня контролллер. Какой-нибудь дешевый китайский ARM.
В моем распоряжении только одно ядро.
Мне надо выполнять какие-то задачи. Собственно, какие-то задачи типа чтения с подключенных датчиков - могут долго выполнятся. А надо еще чтобы сверху кто-то подключился и забрал то что уже собрано.
Если программа будет ждать, пока с датчика не соберутся данные - она так и повиснуть может навечно, если это какой-нибудь датчик который отсылает данные снизу вверх при изменении значения.
А ведь работы много разной. Еще надо к какому-нибудь NTP серверу подключиться и часы подстраивать. Нужно проверять дискретные входы-выходы и фиксировать их состояние в журнал и т.д.
И хотелось бы, чтобы на одном потоке, чтобы 1. Не возиться с блокировками и прочим доступом к разделяемым ресурсам. 2. Чтобы у устройства ресурсы просто так не кушать.
> Вот у меня контролллер
Ну так он прерывания дергает и прочая железячная специфика там, поток заснул и ждет пока его железо дернет, ты не туда копаешь короче.
>Ну. Я же написал. Вот у меня контролллер. Какой-нибудь дешевый китайский ARM.
>В моем распоряжении только одно ядро.
>Мне надо выполнять какие-то задачи.
Используй ассемблер, в частности инструкции SIMD(single instruction, multiple data). Не знаешь асм - копай в свойства компилятора, чтобы он задействовал simd инструкции, либо делай ассемблерные вставки в Си.
>>805717
Чет я не уверен в этом всем.
Хотя я наверное придумал, как можно что-то похожее сделать.
Думаю организую EventLoop и на его базе вот такую логику построю.
Типа
// events.h
typedef void event_handler(void& context);
void event_enqueue(event_type e, event_handler& handler, void& context);
event event_dequeue();
& - указатели, я все еще не знаю как в макабе звоздочки ставить чтобы не курсивом выделялось.
и в основном приложении - буду их обрабатывать.
Просто громоздко как мне кажется получится. Но раз аноны которые за си шарят говорят, что просто продолжить с того места где остановился - нельзя, видимо только так.
Возьми многороточную либу https://libuv.org/
Нода на ней работает, быдешь перед тянками хвастаться
Та мне не перед тянками же хвастаться.
Просто я прикладной кококодер, которого перекинули на железячный проект, а там все на си и надо с нуля писать.
>что просто продолжить с того места где остановился
Используй рекурсию. Это же очень похоже на рекурсию.
ну хочешь велосипедить ебани себе отдельным тредом прослушку сокета блять и дергай оттудова сигналы если стандартный механизм прерываний для тебя какая то хуйня
ну а так то аноны правы ты просто описываешь стандартные прерывания, ты чота делал хуяк сискол, твой процесс уснул и ждет когда его разбудят после сискола в этот момент врывается мамка одмина со своим жирным процессом и ты превращаешься в зомби
>А вот как на си подобное сделать - я не понимаю.
Чего тут понимать, делаешь так же как в шарпе сделано. Изучаешь вопрос и делаешь. Ну или можешь подождать пока за тебя сделают какой-нибудь boost::yield. Удачи.
Видишь ли, у тебя концептуальная ошибка. Си это не абстрактный скрипт как шарп, где под капотом делают что угодно, Си это реальный язык железа, ассемблер. Пока в инструкциях процессора не появится твой yield, его не будет и в Си, не может быть. Всё остальное реализуется на Си, а не в Си, то есть ты либо реализуешь сам, либо ищешь уже написанную библиотеку.
Так на ассемблере я бы просто положил в стек адрес следующей инструкции и нужные аргументы и сделал ret. А потом бы достал из стека следующую инструкцию заполнил регистры и продолжил бы с того места где остановился. Никаких проблем в ассемблере с этим нет.
А в си - я так просто это сделать не могу, как я понял.
Ты не понимаешь как работает компьютер, железо, поэтолму не понимаешь акк работает си, потому что это одно и то же, а ты тупая скрипто-макака.
В данном случае ты спизданул тупость. Стек это аппаратная возможность - железо, он аппаратно только один, поэтому функции сохраняют и восстанавливают состояние только друг за другом - при вложениях. А ты хочешь произвольно оставить на потом, для этого нужно другое место хранения данных кроме общего стека, а компьютер так не работает, нет никакого другого стека, никаких других мест, только один общий, поэтому только вложения друг за другом и никак иначе, никаких "отложить на потом когда захочу" нет и быть не может.
> потом бы достал из стека следующую инструкцию заполнил регистры и продолжил бы с того места где остановился
Ты описываешь стандартный возврат из ф-ции. Вызываешь в своей ф-ции ту ф-цию, которая тебе нужна. Вызванная тобою ф-цию делает то, что ты от неё хочешь, и после этого она возвращает управление той ф-ции, из которой ты её вызвал. Если тебе нужно вернуть какое-то значение из ф-ции, то присваиваешь переменной вызов ф-ции. Если тебе это нужно энтое кол-во раз, то организуешь рекурсию, которая будет вызываться энтое кол-во раз, пока не наступит условие выхода из рекурсии. Если тебе это сложно, то организуй цикл с вызовами одной ф-ции из другой, только в этом случае нужно продумать то, как ты будешь сохранять значения, которые тебе будет возвращать вызванная ф-ция (можно для этого создать массив).
Ты сформулируй по-человечески то, что тебе нужно. Либо напиши алгоритм на псевдокоде, только так, чтобы мы все поняли, что этот твой алгоритм должен выполнять.
>можно для этого создать массив
или статиком объйвить переменную
статики пробрасываются по уровням стека
Можно и список создать, и дерево, тем более, если организовывать рекурсию, и неизвестно изначально сколько данных нужно хранить. Всё зависит от того, что ему нужно в итоге получить.
да, увы, анон измельчал и не может даже сформулировать чо он хочет сделать, если уж человеки не понимают, то как машина может понять?
а вот такой вопрос у меня назрел
разве нет способа ретурна из макроса не используя глобалку?
ну если учитывать что int a = {printf("huy pizda"),3}; тут а будет 3, то оборачивая такую хуйню в макрос через оператор запятая у меня выходит только глобалку на место тройки подставлять, а без глобалки туда ретурн как то можно воткнуть?
Ну, объявить макрос с параметром, а когда вызsвваешь макрос, то указываешь то, что нужно подставить на место этого параметра. Типа такого:
#define MACROS (VAR) \
a = {pprintf("huy pizda"),VAR};
Вызов макроса делается так:
MACROS(3);
да ну не так топорно же
я хочу что то по типу
#define MACRO(var) {тут чота делаем,тут результат вычислений}
int a = MACRO(char); например
крч проблема не в том что я не знаю как передаваемый в макрос параметр записать в переменную лол, проблема в том что после оператора запятая ничо не поставить, сишник это отдельной сущностью считает и никак не свяжет с телом вычислений, кроме как если я там буду оперировать какой то глобалкой и сохраню результат в глобалку, а после оператора запятая подставлю глобалку
я вот спрашиваю есть ли вариант без глобалки такое провернуть?
ясен хуй это макрос не однострочный по типу
#define sum(a,b) (a+b)
а многострочный со своей там логикой вычислений и ветвлениями
Анон, я тебе тут не помощник, потому что сам не особо шарю в макросах, но Столяров упоминал конструкцию с do {} while(условие) в теле макроса, возможно, это тебе поможет.
Ну и сразу же спрошу есть ли какой нибудь степ-бай-степ гайд по вкатингу. Самую основу уже выучил, синтаксис и типы даных, конвертеры всякие делал, рандом и базовый матан делал. Все на пару строчек но азы показало.
Дальше вроде бы надо про арреи и указатели, наверное.
кодю в джини единственный недостаток - хоткеи только в энг раскладке работают
ебал в рот эти студии с велосипедами из говна, то блять она не знает чо такое джава хотя секунду назад знала, то нахуй кнопка компила пропала и хуй ее назад поставишь ай билять как же сука я заебался с этим всем
мечтаю завязать лайтовый тулчейн из текстовиа шелскриптов и консольки в одной хуйне, большего то и не надо
upd: может не так выразился. Банальный словарь, где ключом будет восьмибитный число (0b00000001 например), а значение - строка. У вас такое есть?
ну ты не дал длину строки так что я затрудняюсь сказать есть ли такое изкаробки
но если строка коротенькая и убирается например в 8 байт тогда твоя хэш мапа это просто массив дщнгов или даблов, как хочешь
если строки произвольного размера тогда я бы юзнул массив поинтеров на строки, но тогда ты либо юзаешь однобайтный ключ как индекс массива, либо восьмибайтный как адрес строчки, но строчки будут произвольно длинны
Это будет алфавит. Я перепутал,
ключ - char ('a', 'b', etc),
значение - числа (0b00000001, 0b00000010 etc).
ассоциативные массивы в простонародье
я всегда обхожу эту тему стороной, но вроде изкаробки есть
я просто не понимаю практического применения
какой даун будет вытаскивать число через строковые ключи, когда есть например перечисления с нормальным синтаксисом?
upd:
строки это числа - можешь в эту сторону подумать и понять что это снова обычный массив получается
Ну смотри. Я ебусь с МК и лсд дисплеем. В дисплей, если по простому, данные записываются передачей определённых чисел. Я передаю один uint8, который обозначает определённый char в дисплее, и дисплей отрисовывает этот char.
Я хочу сделать словарь/ассоциативный массив/похуй что, что даст возможность получать по ключу значение (тот самый uint8), что бы передавать в функцию строку, а функция будет бежать по этой строке и по значению знака доставать из словаря значение для отправки в дисплей. Вот такое хочу сделать.
да делай, флаг тебе в руки
повторяю, буковки это числа, вообще все это числа, это просто биты, а как ты их декодируешь дело десятое
например
int a[100] = {0};
a[97] = 1;
if( a['a'] ) printf("huy pizda");
все работает потому что 'a' = 97 побитовое представление сам вычислишь если тебе надо.
Вроде понял. Благодарю.
>немного перегружена
>немного
Ты еще говноподелия от ДжетБрейнса не видел, вот там пиздец адов
- Легкий в понимании и с современным синтаксисом
- Структуры с функциями больше никакого дроча с организацией кода/объектов/мимикрированием под ооп
- Ошибка как возвращаемое значение никаких непонятных стактрейсов, точно видно что и где упало
- Comptime - настоящий убийца препроцессора и то, как должно было выглядеть развитие препроцесооров
- Есть асинхронщина из коробки, не привязанная к имплементациям ОС
- Встроенное тестирование ждал хоть какого то адекватного тестинга пож системщину джва года
- Своя кросс-билд система пока make, cmake, пакетный менеджер уже пилится
- Встраивается в сишный код хоть сейчас начинай частями переписывать свою байтоёбщину
И много чего еще.
Вопрос - а нахуя продолжать писать на сишке, если можно перекатываться в зигу? Литерали та же сишка, только без боли и с нужными вещами.
Как бородатые байтоёбы на это смотрят, что говорят?
Или я просто поддался хайпу?
Я видел, WebStorm, иде-шка для javascript. Сначала кринжанул с уродливого мыльного ненативного васянского гуя с инопланетным устройством и кравиатурными комбинациями для алиенов, после аккуратной красивой студии реально противно. Но потом посмотрел на vscode и увидел то же самое, только намного хуже, и главное функционально нихуя не работает, а WebStorm анализирует любой файл и тут же выводит структуру, подсказки, всё на свете. А потом открыл в нём страницу от гугла с мегабайтами обфусцированной жс-портянки и WebStorm тут же всё отформатировал, буквально мгновенно и можно тут же скроллить и смотреть, без лагов даже (хотя проц в фоне пердит). Итого, совершенно волшебное чудо, летает как ракета, и работает как никто другой. Единственная придирка - мыльные шрифты, ну стандартная линупсо-эппло-гейпараша сделанная с расчетом на 4к мониторы, а на меньшее плевали.
> ассоциативные массивы в простонародье
> я просто не понимаю практического применения
например, у тебя есть игра, в ней есть монстры, которые имеют id и оно как раз будет строкой, т.к. ты не можешь заменить его числом, потому что если пилить на такую игру еще и моды, то там такой ад начнется, поэтому используют id строковые, бывает как просто имя того самого монстра типа "red_dragon"
> Как бородатые байтоёбы на это смотрят, что говорят?
Да, лучше, но долго будет отвоевывать себе пространство
Опять же уже есть готовый rust, который уже давно готов и уже отвоевал себе часть ниши, поэтому зигу будет еще сложнее
>только без боли и с нужными вещами
зигодоун спокундрий, если у тебя жопа болит от сишки пиши на питухоне
>которые имеют id и оно как раз будет строкой, т.к. ты не можешь заменить его числом
окей зумер
>всё отформатировал
Все что угодно может форматировать код, всегда эту залупу отключаю.
>vscode
В 100 раз лучше ДжетБрейновского говна
Зачем строкой, есть же GUID, это обычное целое беззнаковое число, только 128‐битное. Уникальность гарантирована, причём так, чтобы пересчитать все атомы во вселенной.
>>vscode
>В 100 раз лучше ДжетБрейновского говна
А теперь пруфани. Как в vscode сделать для html файла со свтроенным javascript: автоформат текста, intellisense, всплывающую справку по всем функциям, анализ кода с сообщениями где не так. Со скриншотами, а лучше видео или анимашку.
В WebStorm всё из коробки работает, а в твоём "в 100 раз лучше" что? Нинужно? Пук? Спасибо за внимание.
У тебя подход неверный! Циг хорош, но чтобы его по достоинству оценить, ты должен столкнуться с проблемами в системном программировании, которых лишён этот самый циг. Это как после кодинга на асме ты пересаживаешься на Си и ощущаешь всю мощь и изящество Си, ведь, по сути его и создавали для того, чтобы не кодить огромные системы (UNIX) на асме.
С цигом и растом та же ситуация - если ты не пердолился с проблемами, которые возникают при кодинге на Си и плюсах, то как ты поймёшь весь "кайф" кодинга на языках, которые призваны решить проблемы Си и плюсов?
Видел, там еще хуже. Поэтому плюнул сразу же как увидел что его рекомендуют. Дауны спецом газлайтят я клянусь.
>javascript
у вас вроде был отдельный топик, что вы тут делаете со своими языками сценариев для покраски кнопочек?
>для html файла со свтроенным javascript
Ебать ты поехавший. Сам ищи, плагин какой нибудь для VS нужен
Ну вот видишь, говно твой vscode.
Если честно, я его пробовал только за название, думал будет выглядеть как студия, а оказалась та же самая страшенная вебня как и жидбрейны. Только у тех оно хотя бы работает, а это даже не работает. Вот и всё.
И касательно цитаты, я открывал и чистые жс-файлы (плагин для обсидиана) и тоже всё мертво, тупо блокнот голый, ни та что не реагирует, хотя плагин вроде установил этот линтер-хуинтер, но толку ноль. Зато предложил копилот, а потом гордо отрепортил что рахам не положено, мусорное дерьмо.
Работает. Просто ты не сумел настроить.
Тебе нужно поставить несколько плюйгинов:
C/C++ раскрасит весь сикод и позволит отлаживать программы, устанавливать точки останова мышкой
Hex Editor — чтобы смотреть бинарные дампы
Makefile Tools — чтобы собирать проекты утилиткой make
Memory View — чтобы смотреть память программы
>Hex Editor — чтобы смотреть бинарные дампы
мне проще делать objdump > dump.txt
>Memory View — чтобы смотреть память программы
а это нахуя?
мимо
в том что массив хоть и использует механизм указателей сам таковым не является (почти цитата из K&R)
>мне проще делать objdump > dump.txt
Чтобы во время отладки можно было навести мышку на переменную или указатель и во всплывающей подсказке увидеть её содержимое.
>Memory View — а это нахуя?
Чтбы смотреть память по адресу прямо во время отладки. Например, что функции в стэк кладут.
для этого я использую макросы на дебаг которые срут в консольку этими данными прям в рантайме
щас бы 500 приложений в тулчейне иметь чтобы обойти стандартный притф(интересующая хуйня)
Так он ЖС ковыряет, а плугин на ВС не додумался поискать
>для этого я использую макросы на дебаг которые срут в консольку этими данными прям в рантайме
О вкусах говна не спорят, но иногда приятно ебануть бряк и через мышку посмотреть, а макросопердолинг это такое.
Мало того, что это засорение кода, которое требует перекомпиляции на каждый чих, так ещё и не выводит всю структуру целиком, а только отдельные переменные или поля. О выводе стека вызовов остаётся только мечтать.
Ну и макросы эти не работают в ситуации когда нужно отловить изменение памяти по адресу (поставить точку остановка).
Ну а чо, заебись, на моей старой пеке v8 5 часов собирается, как раз 2 макроса можно за день вставлять.
так я микросервисное пишу у меня компил 0 наносек
о выводе изменений не понял тебя и про стуктуру то же непонял
может ты не знаешь как макросы работают? там для дебага достаточно вставок, в том числе имена полей, имена функций в которых крутишься
я еще таймштампы запилил простенькие чтобы чекать профайлинг без профайлинга
кароч чо я тут с вами вожусь, ковыряйте мышкой, я так то не против
>о выводе изменений не понял тебя
Кто‐то или что‐то записал в память по адресу. В этот момент нужно чтобы программа остановилась. Я хочу знать какая функция это сделала, распечатать стек вызовов, посмотреть регистры процессора и всё такое прочее.
>про стуктуру то же непонял
struct student {
char firstName[50];
char lastName[50];
};
struct student s;
Не работает:
printf("%s", s);
А в отладчике print s работает.
мне вот лень с тобой спорить, но я думаю тебе будет интересно узнать, что дауны дающие доступ всем подряд к глобал структурам обязаны страдать и заниматься вот такой контрпродуктивной хуетой как
>Я хочу знать какая функция это сделала, распечатать стек вызовов, посмотреть регистры процессора и всё такое прочее.
очевидно проблема не в том что тебе ниудобна пульнуть в макрос поинтер на структуру и разложить ее внутри вариатиками на свои принты, а в том что архитектура твоего монолита говно
еще меня повеселила твоя аргументация в духе "дядечки написали волшебную палочку я взмахнул и все работаит а я вот написал и ниработаит паитаму ты ниправ"
посерьезнее будь
Чёт не понял. Каким образом возможность отладчика распечатать все поля структуры одной инструкцией print s говорит об архитектуре программы?
об архитектуре программы говорит то что ты вынужден смотреть колбэк всех хуйней на стеке и пырить на регистры в поиске виновника которы поменял поля твоей структуры, чо ты тупишь то ептубля, уже на пальцах приходитсся пояснять
> если ты не пердолился с проблемами, которые возникают при кодинге на Си
Пердолился. Жаль, что тогда я думал СЛОЖНА ЗНАЧИТ КРУТА, пиздец.
> ты должен столкнуться с проблемами в системном программировании
Именно в этом я и пытался хоть что то делать, правда под винду. Дрочил на чистый си и чистую сборку + winapi, в итоге ахуел какое это говно.
>>806737
>Опять же уже есть готовый rust, который уже давно готов
Уже подумывал на него пересесть, стоит ли обмазываться? Хочу его пощупать тк для фронта то же хорош благодоря билд тулам и wasm
>>806738
СЛОЖНА ЗНАЧИТ КРУТА, ДВУРУЧНИК ДЛЯ ГОСПОД, МАГ ДЛЯ ЛОХОВ
Сделал оконное приложенире со всеми необходимыми внутренностями + не мало контьролов + запросы к wmi
>огда я думал СЛОЖНА ЗНАЧИТ КРУТА, пиздец.
>СЛОЖНА ЗНАЧИТ КРУТА, ДВУРУЧНИК ДЛЯ ГОСПОД, МАГ ДЛЯ ЛОХОВ
Лол, что сложного в Си?
выходит я зря тебя обсирал, полагая что ты очередная формошлепная скриптомакака не осилившая простейший лоулевл язык? вот ты черт, больше так не делай
>Лол, что сложного в Си?
Всё сложно. Сам язык простой, но он в таком виде бесполезен. Для использования Си надо знать железо и ОС, вот тут-то и возникает сложность, макаки этого не знают, ведь макакины языки это всё магия, там знать ничего не нужно кроме самого языка, а в Си наоюорот, абсолютная необходимость знать то, чего макаки не знают, это непреодолимая сложность для них.
Мне, в отличие от тебя, хотя бы не нужно ни исходный код программы править, ни перекомпилировать, ни возиться с макросами и фпринтфами, чтобы посмотреть происходящее в реальном времени.
ну ващет изменится
перестанешь контролировать срачь на стеке и череду взаимных колбеков конструкторов вызывающих самих себя
но это я щитаю идет ноздря в ноздрю с изменением предметной области как раз таки, то бишь поменял сишку на ооп - сменилась предметная область с ручника на автомат, появились волшебные блобы хуйни в хуйне и все в таком роде
мимодругой анон
Так у тебя программы уровня «лабораторная работа первого семестра», там и контролировать нечего, вся программа в одной main умещается.
Всё изменится, ты проигнорировал сказанное про магию, а это принципиальная разница, как между черным и белым, небом и землей.
И про предметную область ты чушь спорол. Компьютер и ОС не являются предметной областью, это такой же инструмент как язык. Но в макакиных языках нет компьютера и ОС, ибо они работают в своей виртуалке, которая черный ящик, - магия не доступная и не предназначенная для изучения программистом. А на Си машина реальна и обязательна к изучению, иначе ничего не напишешь кроме бесполезного хеллоуворлда.
у теб вообще программы нет лол
Та я же не призываю совсем не спорить, просто не хочется, чтобы и этот тред скатился в бесконечный спор о хуй пойми о чём.
> Зачем строкой, есть же GUID, это обычное целое беззнаковое число, только 128‐битное. Уникальность гарантирована, причём так, чтобы пересчитать все атомы во вселенной.
потому что в модах id чего-либо приходится часто использовать в скриптах, поэтому его и делают строкой с неймспейсом мода, чтобы убрать коллизии лишние
Так поэтому я и топлю за изучение Си в любом случае, чтоб не было потом на плюсах
>тяп ляп и в продаккшин
а было pravilno. Живых продуктов с вакансиями на Си может быть не так много, зато есть на плюсах, и есть такие, где в команде правильные традиции.
Си это мем. Сюда приходят всякие макаки пишущие на питоне и тому подобном, чтобы "приобщиться". Короче, попиздеть и повесить себе лапшу на уши, что они теперь не совсем опущи. А более честные себе не изменяют и просто заходят написать "си нинужон".
попробуй линуксовые программы на Си поддерживать
Ну чота никто в треди так и не выучил его. Многие сдались и теперь убеждают себя что это не они лошки подзаборные, а это "си нинужон".
Успокойте меня что такая черная магия на самом деле используется лишь в 5% проектов на сишке и что на реальной работе будет намного проще. Иначе я хуй знает смогу ли я вообще ВКАТ
Это развод чтобы набрать классы. В реальности на галере ты 100% времени говнокодишь хуету чтобы успеть сдать ее вчера. Набравшись опыта ты становишься синьйором помидором и твоя задача перелопатить навермишеленный до тебя говнокод во что то приемлемое. Видиво не смотред, мне похуй.
>навермишеленный до тебя говнокод
навермишеленный тобой говнокод пока ты становился синьором
а потом приходит озарение "итак сойдет"
первый
if (temp_data & 0b10000000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b01000000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00100000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00010000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00001000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00000100) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00000010) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00000001) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
второй
#define REGISTER_DATA_0 REGISTER_PORT &= ~(1 << DS)
#define REGISTER_DATA_1 REGISTER_PORT |= (1 << DS)
#define REGISTER_SHIFT_CLOCK_0 REGISTER_PORT &= ~(1 << SH_CP)
#define REGISTER_SHIFT_CLOCK_1 REGISTER_PORT |= (1 << SH_CP)
void push_bit(int type) {
if (type) {
REGISTER_DATA_1;
}
else {
REGISTER_DATA_0;
}
REGISTER_SHIFT_CLOCK_1;
REGISTER_SHIFT_CLOCK_0;
}
unsigned int mask;
for (mask = 0x80; mask >= 0x1; mask >>= 1) {
push_bit(temp_data & mask);
}
первый
if (temp_data & 0b10000000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b01000000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00100000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00010000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00001000) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00000100) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00000010) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
REGISTER_PORT |= (1 << SH_CP); // SH_CP 1
REGISTER_PORT &= ~(1 << SH_CP); // SH_CP 0
if (temp_data & 0b00000001) {
REGISTER_PORT |= (1 << DS);
}
else {
REGISTER_PORT &= ~(1 << DS);
}
второй
#define REGISTER_DATA_0 REGISTER_PORT &= ~(1 << DS)
#define REGISTER_DATA_1 REGISTER_PORT |= (1 << DS)
#define REGISTER_SHIFT_CLOCK_0 REGISTER_PORT &= ~(1 << SH_CP)
#define REGISTER_SHIFT_CLOCK_1 REGISTER_PORT |= (1 << SH_CP)
void push_bit(int type) {
if (type) {
REGISTER_DATA_1;
}
else {
REGISTER_DATA_0;
}
REGISTER_SHIFT_CLOCK_1;
REGISTER_SHIFT_CLOCK_0;
}
unsigned int mask;
for (mask = 0x80; mask >= 0x1; mask >>= 1) {
push_bit(temp_data & mask);
}
Ну это если ты в той же галере и на том же проекте доперделся до сеньера. Сам понимаешь что это уровень фантастики.
Почему я не могу заменить одну реализацию другой и что бы всё работало так же?
Полагаю сепарация условий не совпадает. А ты сам то как думаешь? В первом варианте твои ифы чекают одни данные, во втором другие, так схерали эти два куска должны делать одно и то же?
>Почему другие?
Автора кодов надо спросить почему. Чекай ифы. Пока не прочекаешь спать не ляжешь!
Реально, я слепой далбоёб. На последней итерации мы не "хлопаем" защёлкой. Благодарю.
У тебя везде пидерское сравнение в ифах по типу
if (temp_data & 0b00000001)
Если твое темпдата будет 0b11111111 то оно проскочит, нужно сравнивать
if ((temp_data & 0b00000001) == 0b00000001)
С радача пришел?
А вот кстати философский вопрос. Что быстрее?
if( вычисляемое == невычисляемое )
if( невычисляемое == вычисляемое )
>С радача пришел?
Yep. Ну сейчас вроде начинает что-то получатся. Это я эти ифы переписал в функцию и перестало всё работать, а оказывается я не заметил, что в конце происходит.
>>811128
Ну шаблонами только учусь пользоваться, увидел в видео, понравилось, что меньше простыни в функциях получается.
Вот я это и спрашиваю собсна.
>int должен быть не меньше 2х байт.
снится по ночам, как ваш код собрали компилятором, который 2 байта только предоставляет?
Ничо страшного, обрастет ифдефами как взрослый кроссплатформенный мальчуган.
Я еще не умею быстро...
выделение памяти - хэндли нульпоинтеры, разбираешь JSON - чекай типы и проверяй отсутвие нужных структур, как вы с этим миритесь?
еще бесит андефайнед символы, приходится хэндлить отсутствующие переменные
В плюсах надо СТЛ переписывать каждый поенедельник, иначе никруто.
А если выделение памяти завершится неудачей? Предлагаешь не проверять такую ситуацию? Кто должен отвечать за это?
Кабан, спок
Чо значит поверх? Ты хочешь кастомный транспортный протокол, или кастомный какой? Кастомный межсетевой, кастомный канальный?
Продолжай себя утешать.
По сути весь сетевой стек так или иначе кастомный. Гугли RFC декларации интересующих тебя протоколов и все увидишь. Можешь по такому же принципу предложить очередной кастомный транспортник, главное задекларировать описание по общепринятому шаблону request for comments (RFC).
Ну хочу написать протокол, по которому боты будут обмениваться командами и выполнять их. Возможно, какой-то паттерн проектирования понадобится, пока не уверен. Пока думаю над двумя частями бота: протокол обмена сообщениями и исполнитель, который выполняет полученные команды. Есть примеры такого?
Пример чего именно? Любой транслятор ЯП пример трансляции байтиков команд в реальное исполнение этих команд. А процессы между собой обмениваются всем известным способом - шлют байты в сокетфайл и из него читают соответственно. Кодируй этот поток как душе угодно, ты же потом раскодировать будешь.
>>2812926
Это сокращение от европейские геи.
VSCode + PlatformIO. Если микрухи прошиваешь. Ничего удобнее не придумали пока что.
Я продолжительное время юзал эклипс. Отличная тачка, только надо настройки проковырять чтобы поехала.
Оба варианта работают по разному тоже.
Ща кодю в джини. Потихоньку пишу свой джини с блекджеком и воркспейсами.
Учи алгоритмы, дискретную математику, устройство и принцип работы компьютера и будет тебе счастье. Ты же в треде Си, в конце концов!!!
>я на крестах...
Как откинешься, тогда и приступай к изучению того, что я перечислил, и тогда ты будешь нагибать гопоту.
>int y = x++;
Тут сперва присваивание, а затем прибавление единицы. То есть, сперва вставляется сам x, и как бы на след. строке x = x + 1
>int y = ++x;
А тут сперва прибавление единицы, а затем уже присваивание. Как бы суть ты поняла, этот код превращается в
>x = x + 1;
>int y = x;
>Почему так?
Если ты задиссассемблишь эту операцию, то увидишь, что первым делом переменная по адресу икса копируется в регистр (допустим, rax), потом по адресу этой переменной к ней прибавляется единица, а уже после этих действий идёт копирование значения из регистра rax по адресу игрек, т.е. идёт присваивание предыдущего значения икса игреку.
Совет на будущее: Если что-то ломает голову в Си, то дизассембли, для этого, конечно, нужно уметь читать код на асме и пользоваться дизассемблерами типа edb, radare2 (c GUI Cutter), ida, etc.
Для одной операции это выглядит нелогично, но, если ты устраиваешь цикл:
for(int i = 0; i < n; i++) {
что-то происходит
с присваиванием
i другим переменым
}
То тут и становится ясным для чего нужон этот выверт - для того, чтобы переменная i присваивалась чему-то начиная с нуля, т.е. с самого первого её значения.
Можно и в гдб задиссассемблить, но, если тебе нужно задисассемблить большую и непонятную ф-цию, то тут лучше пройтись по шагам и понять, что она делает, иначе, просто читая дизассемблерный код, можно лишь сильнее запутаться. Так что лучше сразу юзать мощные инструменты, дизассембля простенькие ф-ции, постепенно усложняя себе задачу.
ты сам себе противорчечишь
>если большая функция - запутаешься
>поэтому юзай мощный дизасембл для маленьких
на деле дизасембл вообще не особо то и нужный инструмент, если только ты не реверс инженер
все вопросы по нюансам сишного сахара разжевываются пока усваиваешь базу, в дальнейшем уже нет вопросов почему так нахуй, база усвоена
Ладно, убедил! Действительно, для базы можно и без мощных инструментов обойтись.
Можно но нужно ли? Может лучше сходу в воду? С прыжка в огонька? На коня с разбегу?
Тогда бы первой программой в учебнике была бы тредсейв пир ту пир ботнет срущий хеловоррлдами.
Ну, давай исходить из того, что всё зависит от источника, из которого ты черпаешь знания по языку Си, если в этом источнике тебе разжевали, почему в той или иной операции получается то, что получается, то, следовательно, не надо; если после получения инфы из твоего источника у тебя остаются вопросы, то ты можешь обратиться к другому источнику, но есть вероятность, что и там ты не найдёшь ответ на тот вопрос, который витает в твоей голове, следовательно, в этой ситуации проще самому исследовать операцию, чем перелопачивать тырнет в поисках нужной тебе информации.
Ну вот я смотрю докумнтацию на сайте а там в примере вот такая хуйня
for (const char* str: {" #1 test", "\t #2 test", "#3 test"})
{
std::string line;
std::getline(std::istringstream{str}, line);
std::cout << "getline returns:\t" << quoted(line) << '\n';
std::istringstream iss{str};
std::getline(iss >> std::ws, line);
std::cout << "ws + getline returns:\t" << quoted(line) << '\n';
Вроде и несложно и по отдельности все понятно но как же это блядь сложно читать. Мне потребовалось несколько минут только чтобы прочитать и понять что оно нахуй делает, хотя по отдельности каждая строчка проста и понятна.
Да и вообще эта документация параша какая то, перемудрили до пизды.
>Да и вообще эта документация параша какая то, перемудрили до пизды.
следствие парашности плюсов
страуструпа то же никто не читает за его душку
Я эти ваши плюсы чёт совсем не понимаю. Обычно тут может помочь какой-нибудь дебагер, чтобы можно было бы пройтись по шагам.
Я кажись понял!! Можно же открыть файл на запись и организовать цикл, который будет складывать результат в открытый на запись файл.
>отдать мне его девственную дочь
Всё зависит от возраста этой его дочери, от положения этого её отца в обществе и от взглядов этой их семьи. Если батя какой-то большой чин в силовых структурах, придерживающийся крайне традиционных ценностей, заставляющий свои семью придерживаться этих же ценностей, и этой его дочери было от 12-15 лет, и он знал, что ты мерзкий педофил, но, несмотря на это, ты его уболтал отдать её тебе, то, получается, что ты совершил чудо, а потому ты можешь рассчитывать на что-то более крутое, чем просто формошлёп без опыта.
>крайне традиционных ценностей
>дочери было от 12-15 лет
Ну так все ж довольно традиционно. Иногда и в 11 уже в брак отдавали.
>Ну так все ж довольно традиционно.
Ты там из средневековья капчуешь, что ли? Сейчас 21-й век и человек до 18-ти это ещё жеребёнок, да с учётом глобальной инфантильности и обилия всего того, что нужно изучить, чтобы голова встала на место и начала думать в правильном направлении, то человек до 25-ти является ещё жеребёнком (но это уже будут традиции 22-го века).
У людей в головах все еще мозги средневековья, да, ты как погромист должен знать.
Не, ну, если так рассуждать, то можно дойти и до того, что люди ещё недалеко ушли от обезьян. Поэтому, чтобы не возникало такого спора, я и указал одним из условий - положение бати в обществе, ибо, с большой долей вероятности можно утверждать, если её батя достиг большого чина в силовых структурах, то это делает его как минимум очень дисциплинированным и волевым человеком. Дисциплина и воля это есть два качества сознания, т.е. это говорит о том, что батя живёт не инстинктами, а рассудком, а раз так, то, если он придерживается крайне традиционных ценностей (ходить в церковь, любить женщину, гнобить пидоров, соблюдение законов, и как следствие секс и алкоголь только после 18), то однажды вбив в свой рассудок эти самые традиционные ценности, он от них не откажется, ибо железная воля и дисциплина.
Короче, ты прекрасно понимаешь о чём я, просто строишь из себя дурачка.
Вот отсыпал вам нимножка.
>если её батя достиг большого чина в силовых структурах, то это делает его как минимум очень дисциплинированным и волевым человеком
Чет захихикал с рассуждений домашней корзинки.
Мань, я понимаю, что ты хочешь мне сказать, что есть чины, которые совсем не дисциплинированные и не волевые, и которые просто по блату попали на эту должность, являясь людьми безвольными. Конечно, я с тобой полностью согласен, что есть и такие чины, но этих людей нельзя считать людьми, которые придерживаются крайне традиционных ценностей, ибо они и не против гомосятины, возможно, что и любят это дело, они и не против с детьми, ибо есть и деньги и власть, они и с кайфом торчат на тяжёлых наркотиках, и перечислять их огрехи и слабости можно до бесконечности. Но я же не просто так ввёл условие о том, что этот батя должен быть крайне традиционных ценностей, просто потому что, когда ты живёшь в мире полном соблазнов, и когда у тебя есть и деньги и власть, то, чтобы придерживаться крайне традиционных ценностей, нужно обладать нехилыми яйцами и сильным и здравым рассудком, чтобы не попасть под влияние этих самых соблазнов. А таких людей немало в силовых структурах, и они как правило все дисциплинированные и волевые. Это как раз те люди, благодаря которым нас до сих пор не завоевали хохлы.
Ты же программист, почему ты не можешь читать условие задачи?
Ну компилятор же не знает, что мне нужно преобразовать char в int. Поэтому в аргументах физически лежит char. А как он лежит уже зависит от реализации. Значит, это неопределённое поведение, так?
А зачем компилятору что-то преобразовывать? У тебя в переменной лежит целое число, и ты даёшь задание вывести это целое число, которое не превышает выделенной для этого числа памяти, с чем компилятор с лёгкостью и справляется.
Так char и int разного размера. "%d" ожидает int, но получает char, даже не зная об этом.
Чар и инт это типы данных, которые предназначены для хранения целых чисел. Когда ты передаёшь что-то в printf, то ты указываешь спецификаторы, которые говорят о данных какого типа ты передаёшь в эту ф-цию. У тебя спецификатор %d говорит о том, что ты хочешь передать целое число, после этого ты и передаёшь это самое целое число, которое у тебя хранится в переменной с. Просто это целое число не может превышать 127, чтобы оно имело смысл.
Залупу им за щеку только могут дать.
Как ты тогда объясняешь существование спецификаторов "%ld", "%lld", "%hd" и пр.? "%d" запрашивает не целое число, а именно int.
Здесь объясняется про спецификаторы, но про типы данных тебе нужно читать отдельно.
1. Там прямым текстом сказано, что "%d" выводит int.
2. Ты не ответил на мой вопрос.
3. Ткни пальцем, где в статье ответ на мой изначальный вопрос, или объясни своими словами.
>>814156
>>814147
>>814103
>>814051
>>814046
>>814039
Когда вы уже запомните...
В памяти лежат голые биты. Никаких интов чаров флоатов. Просто биты в байтах по виртуальным адресам. Все.
Ты говоришь, я буду юзать чар (читай однобайтные знаковые децималы), компилер такой - без базара. Ты говоришь положи по адресу Ц значение 5. Компилер такой без базара и пишет в адрес 0b101 (добавсь слева нули если не понятно). Потому ты говоришь выведи на экран %d компилер говорит без базара, НО %d настроен на вывод четырех байт, а ты записал в один.Происходит неявное преобразование типов, твой чар кастуется к интам (любая студия, апример эклипс, тебе бы ворнинг вывела в этом месте), тобишь компилер просто приклеивает справа нулевые байты (справа а не слева потому что порядок чтения битов и байтов обратный) и пихает в поток вывода (но вообще то это в теории, на практике реализация принтфа завязана на write() которая в сырцах компилера должна лежать, крч в стдлибе нет описания блекбокса как именно это происходит).
В общем, если подводить итоги. В памяти лежат какие то битики. Как их декодировать и что с ними делать определяют типы данных. Как их писать в память/читать из памяти определяет программист. Можешь положить в инт большое число и вывести как строку. Или записать в массив даблов текст. Надеюсь я приоткрыл вам дверцу.
Вообще если разбираться, то на 32битных машинах при любой математике с выражениями меньше 4 байт компилер будет жонглировать и клеить нулевые байты к ним, поэтому если надо написать быстрый прогрух хэшей из рама по 32 битной шине - юзают инты или 4 байтные поинтеры. И по этой же причине в сишке инт кондишен. Потому что 32 битные шины данных это канон.
Крч тебе нужен 1 байт? Компилер грит без базара, грузит 4 байта, отрезает тот который нужен, клеит к нему нулевые и в от ты получил свой байт.
>Там прямым текстом сказано, что "%d" выводит int.
Имеется в виду, что может выводить целое число, которое не превышает инт, т.е. 2^32. Пойми, что и чар и инт это представление целого числа, только разница в разрядности. Когда ты хочешь переменной вида чар присвоить какой-либо символ, то этой переменной присваивается не сам этот символ, а его представление в таблице аскии. Допустим:
char c = 'a';
printf("%d", c); // выведет 97
c = 97;
printf("%c", 97); // выведет 'a'
char a = '!';
printf("%d", a + c); // выведет 120
В памяти компа символы и целые/дробные числа это всего-лишь набор битов, и этими битами ты можешь оперировать, а вид операций зависит от того, как ты говоришь компу интерпретировать эти биты (типы данных, виды спецификаторов).
>Ты говоришь, я буду юзать чар (читай однобайтные знаковые децималы), компилер такой - без базара. Ты говоришь положи по адресу Ц значение 5. Компилер такой без базара и пишет в адрес 0b101 (добавсь слева нули если не понятно). Потому ты говоришь выведи на экран %d компилер говорит без базара, НО %d настроен на вывод четырех байт, а ты записал в один. Происходит неявное преобразование типов, твой чар кастуется к интам (любая студия, апример эклипс, тебе бы ворнинг вывела в этом месте), тобишь компилер просто приклеивает справа нулевые байты (справа а не слева потому что порядок чтения битов и байтов обратный) и пихает в поток вывода (но вообще то это в теории, на практике реализация принтфа завязана на write() которая в сырцах компилера должна лежать, крч в стдлибе нет описания блекбокса как именно это происходит).
Вот это хорошее объяснение.
int printf(const char ⚹, ...); /⚹ или __VA_ARGLIST__ не помню как прототип описан у принтфа, но по идее линковщик без инклюда либы слинкует описание принтфа по прототипу ⚹/
d = "huy";
int main(void){
printf("%d -> %s \n", d);
return 0;
}
>printf("%d", a + c); // выведет 120
Я тут чёт проебался, это будет -126, тому что 97 + 33 = 130, но чар может хранить числа до 127, следовательно дальше начинается обратный отсчёт.
>до 127
Ну тащемта это то же спорный момент. Границы типов это не стандарт и на разных машинах по разному бывает. Имеется ввиду что на некоторых машинах верхняя граница выше, на некоторых нижняя ниже. В общем ты понял.
Чар же всегда был одним байтом. Байт это универсальная единица измерения, поэтому чар не должен зависеть от машины.
Чар и не зависит от машины. А вот способ декодирования битов из байт ой как зависит. Вон на рисках слова, к примеру, фрагментированные, полслова в начале, полслова в конце, посередине гвоздик слово данных.
Ладно я фигово объяснил. Чар это один байт, он не зависит от машины, ты прав. А вот когда ты пишешь 127 или -126 это не чар, это ты уже декодировал биты из этого байта в децималы. И вот сам процесс декодирования зависит от машины. Если быть точным от процессора, от камня, от его набора инструкций и архитектуры. К римеру я не уверен сможет ли камень на ГПУ вообще раскодировать твой байт как децимал, учитывая что там матядро с инструкциями по флоатам.
Когда вы уже запомните...
Никаких битов байтов в стандарте НЕТ. Есть только абстракция на абстракции, выраженная в отвлеченных терминах. Всё.
Стандарт C/C++ би лайк;
"Ой, чар это один байт, но байт это, короче, не байт, который 8 бит, а любая хуйня, главное, чтобы минимум 256 значений вмещал"
"Ой, пук пук, а я хз, что такое INT_MAX + 1, мб INT_MIN, а мб у тебя хуй отвалится, иди нахуй, короче"
То, что ты написал ниже, чушь ебаная. Спойлер: я уже нашёл ответ на свой вопрос сам - арифметический тип меньше инта, например чар, будет преобразован в int всегда без всяких вопросов. А теперь разберём по частям тобою сказанное.
> ты говоришь выведи на экран %d компилер говорит без базара, НО %d настроен на вывод четырех байт, а ты записал в один.Происходит неявное преобразование типов, твой чар кастуется к интам
Компилятор не может и не будет смотреть, что за хуйня у тебя в строке формата. Замени строковый литерал в этом примере на строку, которую вводит пользователь в рантайме. Как компилятор эту хуйню предскажет, умник блядь??
> (любая студия, апример эклипс, тебе бы ворнинг вывела в этом месте), тобишь компилер просто приклеивает справа нулевые байты (справа а не слева потому что порядок чтения битов и байтов обратный) и пихает в поток вывода (но вообще то это в теории, на практике реализация принтфа завязана на write() которая в сырцах компилера должна лежать, крч в стдлибе нет описания блекбокса как именно это происходит).
"Четыре байта", "приклеивает справа, а не слева", "порядок чтения битов и байтов" - ты понимаешь, что в стандарте нет всей этой хуйни малафьи? Банально "порядок чтения байтов" зависит от endianness конкретного компьютера? АЛЛО, В СТАНДАРТЕ АБСТРАКТНАЯ МАШИНА!
> В общем, если подводить итоги. В памяти лежат какие то битики. Как их декодировать и что с ними делать определяют типы данных. Как их писать в память/читать из памяти определяет программист. Можешь положить в инт большое число и вывести как строку. Или записать в массив даблов текст. Надеюсь я приоткрыл вам дверцу.
В этом и проблема. Оттуда и изначальный вопрос: "я положил один байт там, где ожидается 4 байта; компилятор об этом знать не может, следовательно на выходе - рандомная хуйня". Потом оказалось по-другому: https://stackoverflow.com/a/12830110
Когда вы уже запомните...
Никаких битов байтов в стандарте НЕТ. Есть только абстракция на абстракции, выраженная в отвлеченных терминах. Всё.
Стандарт C/C++ би лайк;
"Ой, чар это один байт, но байт это, короче, не байт, который 8 бит, а любая хуйня, главное, чтобы минимум 256 значений вмещал"
"Ой, пук пук, а я хз, что такое INT_MAX + 1, мб INT_MIN, а мб у тебя хуй отвалится, иди нахуй, короче"
То, что ты написал ниже, чушь ебаная. Спойлер: я уже нашёл ответ на свой вопрос сам - арифметический тип меньше инта, например чар, будет преобразован в int всегда без всяких вопросов. А теперь разберём по частям тобою сказанное.
> ты говоришь выведи на экран %d компилер говорит без базара, НО %d настроен на вывод четырех байт, а ты записал в один.Происходит неявное преобразование типов, твой чар кастуется к интам
Компилятор не может и не будет смотреть, что за хуйня у тебя в строке формата. Замени строковый литерал в этом примере на строку, которую вводит пользователь в рантайме. Как компилятор эту хуйню предскажет, умник блядь??
> (любая студия, апример эклипс, тебе бы ворнинг вывела в этом месте), тобишь компилер просто приклеивает справа нулевые байты (справа а не слева потому что порядок чтения битов и байтов обратный) и пихает в поток вывода (но вообще то это в теории, на практике реализация принтфа завязана на write() которая в сырцах компилера должна лежать, крч в стдлибе нет описания блекбокса как именно это происходит).
"Четыре байта", "приклеивает справа, а не слева", "порядок чтения битов и байтов" - ты понимаешь, что в стандарте нет всей этой хуйни малафьи? Банально "порядок чтения байтов" зависит от endianness конкретного компьютера? АЛЛО, В СТАНДАРТЕ АБСТРАКТНАЯ МАШИНА!
> В общем, если подводить итоги. В памяти лежат какие то битики. Как их декодировать и что с ними делать определяют типы данных. Как их писать в память/читать из памяти определяет программист. Можешь положить в инт большое число и вывести как строку. Или записать в массив даблов текст. Надеюсь я приоткрыл вам дверцу.
В этом и проблема. Оттуда и изначальный вопрос: "я положил один байт там, где ожидается 4 байта; компилятор об этом знать не может, следовательно на выходе - рандомная хуйня". Потом оказалось по-другому: https://stackoverflow.com/a/12830110
Ты же в курсе, что:
а) int это не всегда 4 байта;
б) int не всегда 32-битный, даже если он 4 байта?
Я вкурсе. Про пункт б стало интересно, обоснуй. Еще можешь рассказать что побудило тебя написать этот пост, то что в сишке инт кондишен? Как твои утверждения это опровергают? Инты на машине это word величина. Если там 16 битная шина и камень, то инты там двухбайтные. Но все децимальные константы все равно интовые. Так что я не понял с чем именно ты споришь.
> Я вкурсе. Про пункт б стало интересно, обоснуй.
Байт не обязан быть 8 бит. Стандарт говорит, что:
1) char это всегда один байт
2) char не может быть меньше 8 бит (но может быть больше, см. CHAR_BIT)
> Еще можешь рассказать что побудило тебя написать этот пост, то что в сишке инт кондишен?
Не знаю, про какой ты конкретно пост (видимо, не мой), но меня не интересует, как работает си на конкретной архитектуре. Мне интереснее разобраться, что стандарт гарантирует на любой машине, а что не гарантирует.
>Байт не обязан быть 8 бит. Стандарт говорит, что:
>1) char это всегда один байт
>2) char не может быть меньше 8 бит (но может быть больше, см. CHAR_BIT)
Ну тут вот стандарт то же врет, или ты врешь.
Как насчет шестибитных чаров? Я вот пытаюсь понять зачем ты учишь стандарт языка, который напрямую привязан к железкам, а у железок нет стандарта. Глупость какая то. И как стандарт сихи описывает работу с третичной логикой (да такие компы то же были)? Крч пустая трата времени. Глянь дефайны на своей машине и кодь приложуню, не будь макакой которая срет тут нечитабельной хуетой зато по стандарту.
> Почти ничего не гарантирует. Зоопарк разнообразных машин вставил свое слово в написание стандарта.
В этом и суть. В том, чтобы не допускать того, что по стандарту является неопределённым поведением. А иначе получается, перешёл с GCC на Clang - умер от уб. Ну или с x86 на ARM, тем более. Мне такое не оч нравится.
> Цель? Ты никуда не денешься от конкретной реализации конкретной машины. Смирись с этим макакич.
Ты никуда не денешься от опасностей UB и необходимости portability. Смирись с этим.
> >Байт не обязан быть 8 бит. Стандарт говорит, что:
> >1) char это всегда один байт
> >2) char не может быть меньше 8 бит (но может быть больше, см. CHAR_BIT)
> Ну тут вот стандарт то же врет, или ты врешь.
> Как насчет шестибитных чаров?
Покажи их. У тебя на скрине некий компьютер с шестибитным байтом. Где ты вычитал про 6-битный чар? На таком компьютере либо невозможна реализация Си, либо на нём char будет 12-битным. Два байта с точки зрения машины, но один "байт" с точки зрения языка. И на таком компиляторе sizeof(char) будет равен 1, а CHAR_BIT - 12.
> Я вот пытаюсь понять зачем ты учишь стандарт языка, который напрямую привязан к железкам, а у железок нет стандарта. Глупость какая то.
Не привязан, вот и весь секрет. То, что он был мотивирован железками, не значит, что стандарт к ним привязан намертво.
> И как стандарт сихи описывает работу с третичной логикой (да такие компы то же были)?
Во-первых, можно задаться вопросом, как так вышло, что троичных компьютеров нет (и едва ли они были). Во-вторых, опять таки, скорее всего Сишка на таком компьютере просто невозможна (только если преобразованная, нестандартная). Так тоже бывает. И то, я не уверен насчет того, что невозможна.
> Крч пустая трата времени. Глянь дефайны на своей машине и кодь приложуню, не будь макакой которая срет тут нечитабельной хуетой зато по стандарту.
А потом переносим проект на другой комплюктерн и БАЦ, БАЦ, БАЦ
Кстати, никто не запрещает использовать platform-specific и implementation defined фичи, просто делать это надо в меру, и только когда это целесообразно.
В каком примере? Про принтф я и не говорил, что это уб, а спрашивал. Если ты про INT_MAX + 1, то сорян, но даун здесь ты, а не я :(
char c = 128;
printf("%d%", c); \\ он напечатает -128
то вывод на конечных этапах будет выглядеть так:
mov ax, byte[пер_арг]
...
syscall
где пер_арг это переданная в принтф переменная c, следовательно, в ах будет значение 0xff == 0b11111111, то есть все остальные нули, которые были переданы в принтф, чтобы преобразовать его к инту не учитываются, иначе было бы напечатано 128.
Вообще это дело связано с соглашениями о вызовах, которые требуют выравнивания по 16-ричному адресу, что связано с архитектурой х86_64.
>Вообще это дело связано с соглашениями о вызовах, которые требуют выравнивания по 16-ричному адресу, что связано с архитектурой х86_64.
А не, я чёт хуиту сморозил, выравнивание нужно для rsp.
Какое "врёти"? Ты бы хоть прочитал для начала, что я написал. Я сказал, что существование шестибитного компьютера не отменяет того, что в Си байт не может быть шестибитным, хоть ты усрись. Если очень захочется для такого компьютера написать компилятор Си, то придётся сделать байт (char) 12-, 18-, да хоть 60-битным, но 6-ти битным он не будет, иначе это не Си.
Нет, не выходит, потому что байт в стандарте это не то же самое, что машинный байт. Ты пойми, слово одно и тоже, но значения разные.
Пиздос, я чёт вчера и здесь объебался, ведь -128 == 0b10000000 в двоичном представлении. Чёт вчера везде где только можно объебался.
Не знаю о чём ты, но, в принципе, типов не так много, поэтому можно и изучить их границы, а там уже на автомате будешь выбирать нужный тебе тип.
Да похуй на вас. Сборище додиков. Один со стандартом носится как со святым писанием, второй кодит неподдерживаемую хуйню, которая для проца еще и неудобная. Ай билять, делайте чо хотите, макаки.
Ладно
Денис, ты? Я твой одноклассник.
Как будет безопасно?
Вайлом по гетчару разбирать поток?
Блин чот я не туда думаю. Наверное трабл в том что чар[10] и в него тупа могут пульнуть строку длиннее и записать в какой нить служебный сегмент всякую бяку. Но эт в теории, чот я не уверен в такой возможности.
На стр. 291 не оч. описана проблема переполнения буфера. Об этом лучше почитать у Криса Касперского, либо в какой-нибудь другой книге по безопасности или в той, где описываются различные виды атак и всяких там мальварей, троянов, и т.д. и т.п.
Ну, грубо говоря, в строку можно закинуть команды машинного кода, которые смогут прыгнуть туда, куда потребует пенетратор. Вообще, я сам не особо в этом шарю, т.к. ещё не дошёл до книг Криса Касперского и других книг по безопасности.
Что такое UB? Вижу что о нем часто говорят в треде, но лично его еще не встречал. Звучит как интересный мужик.
>Я так сделал
Бедный Дениска, написал целый абзац о том что так делать не надо а оне делают. Ну и кто типерь дурак?
>Ускоряется работа программ (так как не нужно проверять всевозможные «маргинальные» случаи).
Маргинал! Покинь тред уважаемых господ!
> char c = 128;
> printf("%d%", c); \\ он напечатает -128
так просто смотри, что тебе умный компилятор пишет и не делай так
А я сделал мейкфайл для твоего хелловорлда. Кооперация.
for (i = p; i != id; i = id);
от этой:
i = p;
if (i != id) i = id;
где id[] это целочисленный массив, а p это целое число, которое принимает программа через ф-цию scanf()?
Нет, просто вычитал эту конструкцию
>for (i = p; i != id; i = id);
в одной книге и хочу понять отличия от этой конструкции
>i = p;
>if (i != id) i = id;
Ёбанный двач, убирает всё важное!
Вот так эта программа выглядит - смысл её в том, что она решает связные задачи, но я хочу понять именно эту конструкции, и то почему именно её употребили.
https://pastebin.com/rHg1RsX2
Седжвик "Алгоритмы на Си"
Там есть объяснение, но мне не понятно, почему именно эту конструкцию применили.
Разница в том что фор работает по шаблону ду вайл и один прокрут тела точно будет, а потому фор крутанет 2 цикла
Иф выполнится 1 раз
Нахуй оно тебе надо - да мне похуй.
Протестировано на рисках.
Поправь если я не понял алгоритм.
>фор крутанет 2 цикла
1, но точно крутанет его даже если по условиям не должен, стартовый прокрут как в ду вайле
другое дело что у анона тела форов пустые, та что книжка хуйню какюу то предлагает писать
Это у вас такие приколы, да? Как мне дробное число получить-то блять?
Тогда другой вопрос. Вот я скастовал, получил
0.000064. Как мне получить uint 0.000064 * 1000000?
Синтаксис, моё почтение нахуй. (float)a / b и гадай блять, что за (float) и к чему он относится, к a, или к небу, или к Аллаху или ко всему выражению
прекрасный синтаксис, самый лучший в мире
можно одним движением поменять вычисления например вот так
float a = 12.5;
float b = 6.3;
float result1 = (float) a / (float) b;
int result2 = (int) a / (int) b;
int result3 = (int)(a/b);
float result4 = a/(int)b;
сильно не придирайся к примерам, чисто на коленке нацарапал
А есть возможность кастить в uint8/16 etc например, или каст не влияет на выделение памяти, а просто говорит компилятору тип?
Можешь кастить uint16_t в uint8_t и так далее, будет сохраняться младший байт.
Да, я маг! Волшебник!
Теперь вопрос. Как прикрутить к нему LS, чтобы подсказочки там, ссылочки, переход к определению и всякие рефакторинги, чтобы как в VSCode короче.
Бля. Я тредом промазал...
Хотя думаю не важен же тред. Думаю проблемы вима на винде и у сишников должны быть. Так что все равно тута мож кто ответит.
Ни вим миллиард плагинов. Пояндекси те что делают твои штуки хуюки. Мимо сижу на ви.
На шинде винапи, на юниксах иксы(xlib) а на макоси чо? Пишут что кути, но кути обертка над xlib а иксов в макоси я не обнаружил
Вощим дайте пастбин симпол окна на макось в сях или мне придется зайти в богомерзкий икскод, нахуякать там сипол окно на богомерзком свифте, скомпилить, трансфернуть опкоды в асм и затем из асма ковырять исходник на сях и вот этим всем я ваще не хочу заниматься.
Чо несешь то? Икскод со своим обжектив си или свифт кодирует же. Значит си то же может. Вопрос как?
Линковщик силанга то же грит хуй знает чо за Х11 не вижу нихуя.
Ну блять заебись сука падла.
На пинусе у меня клава и тачпад в иксах не подтянулись, так что надо будет поковырять хал наверн или иксовые конфиги, крч попердолиться. А я пока не хочу пердолиться, хочу просто оконный хеловорлд на макоси написать. Но вот не получается.
Если тестить на qt то тама кумейк ебучий генерит мейкфайл с мусором под g++ ни того ни другого у меня нет, я даже тестить не буду эту парашу.
ГТК вестимо на макоси не бывает.
Остается хлиб. Кыс кыс кыс блять.
Ну так то да. Дипиай на скринах слышком высокий для дефолтных гну/линуксов. То же один из маркеров эплодевайсов.
>>817308
>>817333
В общем я нашел вот эту какаву
https://translated.turbopages.org/proxy_u/en-ru.ru.2a6d2fe7-64e8b0be-645589d1-74722d776562/https/stackoverflow.com/questions/30269329/creating-a-windowed-application-in-pure-c-on-macos
Остается загадкой нахуя они так сильно завернули колбеки в жопу иксам, но лично мне прям осейчас абсолютно поебать, я просто не хочу перепрыгивать с сей на свифты ебаные ради как ой то операционки.
Маненько поковырял эту какаву. Судя по выводу тут та же структура что и в свинге жабы. Виндоу в ней панелька и уже в панельке все остальное (хз чо в этой какаве есть, лайоут манагеры, батоны, лейблы...)
Крч пойду читать про какаву и с чем ее едят.
делись
Ну вот например обжектив си в файле си скомпиленный с флажками под обжектив си и какава фреймворк
буду добавлять как только тесты заведуться, пример на пьюр си пока не завелся потому что он не под эпол силикон, но там есть под эпол силикон.
Пример с википедии на голых иксах не компилился потому что хидеры иксов не лежат по пути из википедии. Пришлось поискать их файндом. Судя по выхлопу я чота нашел.
Проверим лежит ли там нужный xlib.h пик2 говорит что лежит
Ну чтож, теперь у нас два путя:
первый - хуярим новую запись в $path консольки чтобы гцц умел цеплять xlib по инклюду <X11/Xlib.h>
второй - заинклюдим хлиб с полным прописанным путем до него
Кароче я щас пытаюсь победить эти референсы туповатые, которые не могут найти блять файлы, уже даже скопировал в папочку отдельно, но это не помогло. В общем надо экспортить новый референс для $PATH под путь к Х11 хидерам. Иначе чота прям слишком трудно получается. Займусь этим в следующий раз.
Ну я пока что хз если честно.
Вроде бы прописал путь, но чота все равно он не хочет цепляться.
Я пробовал прописывать путь как Х11/инклюдс, пробовал напрямую присвоить путь в переменную
Наверное я что то делаю не так, но я пока не знаю что именно.
Да мне кажется это на стаке хуйню советуют. Откуда они взяли вообще переменную окружения C_INCLUDE_PATH? Я прочекал стой zsh и он такой переменной не пользуется. Похоже надо пути прописывать в конфиг набора инструментов gcc или в ckang или в cc, только я пока что не знаю чо там по конфигам и откуда gcc черпает относительные пути.
Ну есть второй вариант - скопировать всю папку хидеров туда где лежит stdio.h, то место ведь gcc уже знает.
Ну и может кто из пердоликов подскажет как прописать пути корректно.
>набора инструментов gcc или в ckang или в cc
Так они же же должны пользовать пути баша/зэтша?
Да хер пойми, я то же так думал, но чот вроде бы и нет выходит.
Скомпилил первый пример на чистом си под фреймворк какаву.
Потестил гцц через абсолютные пути до иксов и наконец то цепанулось, но срет ошибками об анделаредах. Прочекал хидеры из папки иксов и реально там тупо нет прототипов функций построения окошек. Ни одной. Хмм. Вот петухи!!!
Вот здесь пишут, что у линкера путь LIBRARY_PATH
https://stackoverflow.com/questions/15836423/gcc-how-to-add-before-the-default-linker-search-path-by-default-library-path-no
Да это не поможет. Там в иксовом примере всякие XCreateWindow() и прочие функции задействованы, а в хидерах не лежат их прототипы, то бишь линкеру не от куда их линковать. Это значит что кроме хидеров с дефайнами всякого говна и структур должны быть еще статичные либы по типу libX11.so которую надо уже слинковать по типу gcc ... -lX11 и вот тогда тела этих функций попадут в обджектдамп приложуни и все заработает, но эплопетухи не оставили мне в СДК статик библы
>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.
А это не пробовал?
Хз, может тоже мимио, но, мб, тебя наведёт на что-то, либо ты ещё что-то интересное расскажешь
https://opensource.com/article/22/5/dynamic-linking-modular-libraries-linux
Крепись, анонче! Ты близок!!
Вот первый удачный компил
https://pastebin.com/FWq7ZufL
Мейкфайл не буду постить, там в шапке комментарий как скомпилить и сурс статьи. В той же статье есть пример на интелы.
Какие то рандомные хидеры иксов лежат, но в них не подцеплены рефернсы вызовов, пользоваться ими нет возможности. Структуры ничего не дают без выполняемого вункционала функций, а их я не нашел.
Зато нашел Глут (опенгл фреймворк со встроенным аппаратным ускорением), метал (то ж какая то херня на эплосиликоне с аппаратной ускорялкой вроде) ну и лоу левел части какавы, которые практически лежат на железках (как иксы например, когда им напрямую говоришь в какой писиай слот писать видеопоток).
Так же в интернетах пишут, что надо ставить XQuarz фреймворк если хочешь писать под иксы. Мне лень пока что с этим заморачиваться, но имейте ввиду.
Компил под либы у эплопетухов как я понял то же приобретает дополнительный флажок в жопе -framework
А все фреймворки соответственно лежат кое где, но там нет фреймворка Х11, а те обравки где он есть не имеют статик либ или любого другого описания львиной доли функционала (как я уже и говорил).
Вощим вердикт такой - пьюр си под иксы на ОС Х возможен, но надо ставить фреймворк XQuarz. А так пишем на пьюр си под фреймворк предназначенный для свифта/обжектив си и не паримся.
Так же вот тут чистый сишник с примерами той же какавы (ну я так понял карбон это часть какавы)
Евент лупы, хэндлеры, таймеры и прочие хай левел оконные штуки дрюки.
http://preserve.mactech.com/articles/mactech/Vol.17/17.07/July01Cover2/index.html
Нет. Я для себя это делаю. Хочу свою ГЛ потестить, алгоритмику, оптимизации, шейдеры, может быть сделаю какой нить САПР, но пока что особых планов нет, кроме как написать рейтрейсинг и реймарчинг. Есть некоторые задумки как описать моушен на полигональных объектах.
Еще мб пощупаю воксели, но не знаю насколько вообще это будет актуально.
Попробую ка я лучше XQarz накатить и под иксы поковыряться, там то более менее все знакомо.
Понял! Знатно ты долбишься с этим, конечно.
Только не потому, что так захотелось начальству, а что реальное ограничение техническое. Потому что вроде как уже не осталось таких платформ, где не было бы C99, а при выпуске новых платформ тоже особо желающих не находится, чтобы там был строго C89, а чаще всего вообще прикручивают LLVM и не парятся с языками потом.
Видимо уже нет смысла начинать какие-то новые проекты под C89
В BSD такой фигней вроде страдают во имя обратной совместимости. Там все микросервисы внутри sbin написаны по шаблонам ультрастарых стандартов по типу
int
main ()
{
return 0;
}
спасибо, был не в курсе, а еще что-то есть?
просто уже даже микроэлектроника уже на c99 как минимум сидит давно или вообще на плюсах с подтягиванием раста, не говоря уже про какие-то там игровые консоли
>вообще прикручивают LLVM и не парятся с языками потом
"Не парящиеся с языками" - на пике, вот так говношлепят из говна в мочу и обратно и вместо исправления надеются на боженьку. А могли бы код писать своими руками, но куда там макакам, конечно не могли. На пикче кстати хрюст.
Да разве не поебать чо там говношлепы делают? Пусть хоть на скратче микрухи кодируют какая нам разница? Рыночек порешает рано или поздно.
ну мне к тому, что все новые либы уже можно на C99 спокойно писать, а то вкусностей там есть, хочется, получается везде кроме BSD это зайдет
Оператор break откуда выходит? Разве только из тела цикла? Из тела свича ведь он то же выходит. А выходит ли он из записи стека?
Вот например
{ ...код1... if(1) break; ...код2... }
Как себя ведет процесс в тайо ситуации? При открытии фигурной скобки будут присвоены новые значчения на rbp rsp то бишь это новая запиь стека. Но брейк заставит выйти из нее, или мне надо сделать ретурн чтобы выйти из нее?
В общем есть у меня блок ифов и мне вот надо чтобы при заходе в один из них следующие не вычислялись на истинность, но я та же не хочу использовать оператор goto. В общем надо сделать логику свича ифами по причине того что в свиче можно юзать только константные литералы (если можно так выразиться), а у меня неконстантные по логике.
Блять про стандарты хуй вас заткнешь а такую простую хуйню разложить - пук среньк сразу все в кусты попрятались. Хули толку с вас в этом итт треди тогда? Выебываться мифическими знаниями о хуйне которая никогда не пригодиться?
Полагаю надо делать так
...
{
...
if(a) { dosomething; return;}
if(b) { dosomething; return;}
...
}
...
/thread
тебе надо чтобы каждую ветку каждый раз что ли проверял твой свич?
goto нужен как раз для таких ситуаций, когда у тебя есть большое вложение и тебе нужно из него прыгнуть, когда программа уже что-то сделала. Только используй его для прыжка вниз по коду. Этого дебича >>820475 не слушай, потому что ретёрн это возврат из ф-ции. Если не хочешь юзать goto, тогда переписывай логику, чтобы не было больших вложений, либо тогда каждый иф оформляй в ф-цию, а после выполнения кода возвращайся ретёрном, но это какое-то говнокодерство, ибо проще выпрыгнуть из большого вложения.
Хмм, вот это тема.
>З.Ы.: напомните, почему goto считается зашкваром?
Бэд стайл. Предубеждения. Интересно линтер переваривает гоуту?
Ну вот тогда может быть кто то пояснит за этот лагоритм? Почему сишник не пишет число 111 в другой участок памяти? Что за избирательность?
Точняк! Спасибо, уже голова опухла.
Да, ты угадал, код парсера из doas, хрен знает что это такое и где почитать вообще можно.
Странные у тебя увлечения - смотреть сырцы утилиты, которая хуй знает чо делает.
#include <stdio.h>
#include <unistd.h>
int main(){
void holp();
void printsetka(char setka[4][4]);
char setka[4][4];
for(int b=0;b<4;b++){
for(int k=0;k<4;k++){
setka[k] = '#';
}}
int a,b,c,d;
while (0 == 0){
for(a = 0; a < 4; a++){
setka[0][a] = 'X';
printsetka(setka);
setka[0][a] = '#';
sleep(2);
}
for(b = 1; b < 4; b++){
setka[3] = 'X';
printsetka(setka);
setka[3] = '#';
sleep(2);
}
for(c = 2; c > -1; c--){
setka[3][c] = 'X';
printsetka(setka);
setka[3][c] = '#';
sleep(2);
}
for(d = 2; d > 0; d--){
setka[d][0] = 'X';
printsetka(setka);
setka[d][0] = '#';
sleep(2);
}}}
void printsetka(char setka[4][4]){
for(int b=0; b<4;b++){
printf("\n");
for(int y=0;y<4;y++){
printf("%c ",setka[y]);
}
printf("\n");
}
printf("\033[2J\033[1;1H");
}
#include <stdio.h>
#include <unistd.h>
int main(){
void holp();
void printsetka(char setka[4][4]);
char setka[4][4];
for(int b=0;b<4;b++){
for(int k=0;k<4;k++){
setka[k] = '#';
}}
int a,b,c,d;
while (0 == 0){
for(a = 0; a < 4; a++){
setka[0][a] = 'X';
printsetka(setka);
setka[0][a] = '#';
sleep(2);
}
for(b = 1; b < 4; b++){
setka[3] = 'X';
printsetka(setka);
setka[3] = '#';
sleep(2);
}
for(c = 2; c > -1; c--){
setka[3][c] = 'X';
printsetka(setka);
setka[3][c] = '#';
sleep(2);
}
for(d = 2; d > 0; d--){
setka[d][0] = 'X';
printsetka(setka);
setka[d][0] = '#';
sleep(2);
}}}
void printsetka(char setka[4][4]){
for(int b=0; b<4;b++){
printf("\n");
for(int y=0;y<4;y++){
printf("%c ",setka[y]);
}
printf("\n");
}
printf("\033[2J\033[1;1H");
}
во первых на пастбин почему не залил? не уважаешь нас? хочешь чтобы мы не только в твоем говне ковырялись но еще и в поехавшей разметке макабы?
во вторых где прототипы? ты в мейне юзаешь функции которые описаны позже мейна, а где прототипы? ты вообще компил пробовал делать своего говна? оно не скомпилится по всем правилам, так с херали ты спрашиваешь чо там с твоим массивом происходит если у тебя просто нет бинарника?
в третьих поздравляю с днем знаний
У меня есть бинарник.
Как мне его "установить" при помощи сценариев сборки мэйк?
Мейкфайл прикреплю пиками в один не влезло
Ну делаю я sudo make install
Бинарь залезает в нужный путь вся хурма. Но блять переменная PATH экспортируется только в оболочке вызова мейка, а не глобально. А как мне новый путь добавить в $(PATH) чтобы он теперь там глобально жил то?
У меня есть некоторые догадки, но я пока не знаю как разрешить сей консенсус.
Вощим. Мейк использует какой то свой любимый шелл, каждый раз заного запуская оболчку для каждой строчки сценария. И поидее я могу явно указать какой шелл надо юзать (ну например мой родной шелл надо юзать) и тогда мейк экспортнет PATH в моем родном шелле и поидее все заработает.
Но. У юзера может стоять другой шелл. Баш например. Как мне угадать/прочитать какой юзершелл используется и в какой оболочке экспортить PATH?
Что значит массив не читается? Программа падает или что? Стек на Винде 2 мегабайта, поэтому вряд ли ты его переполнил. Скорее всего у тебя запись за пределы массива идёт, которая разрушает весь стек твой . С телефона лень вчитываться , но если инфу об ошибке скинешь, то попробую помочь.
Да хуй знает. Не забудь двачезвезды в шапку добавить. Выше по треду были.
>>2835039 (OP)
>>2835039 (OP)
>>2835039 (OP)
>>2835039 (OP)
>>2835039 (OP)
этот удалён >>834709
кто же вас научил по гайдам в ютюби смотри без смс и регистрации писать один и тот же нейм структуры и типдефа?
typedef struct {
} name;
struct name {
};
а по поводу твоего IDE хз, вероятно как раз из за нейминга он желает чтобы ты там указал struct result ведь у тебя нейминг похерен
стдио чо не в угловых скобках?
>Где можно посмотреть, как реализуется кастомный протокол поверх tcp/udp?
гугли
zeroaccess botnet analysis
zeus gameover botnet analysis
sality botnet analysis
kelihos botnet analysis
conficker botnet p2p protocol
Это копия, сохраненная 21 октября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.