дано: плата с микроконтроллером esp32 и допплеровский датчик движения rcwl-0516. щас расскажу что с этим делать)
для начала схема подключения:
gnd (rcwl-0510) - gnd (esp32) vin - 5v out - любой свободный gpio
суть в том, что при обнаружении движения, датчик выдает напряжение на контакт OUT, программно мы опрашиваем наш gpio pin, и при возникновении там логической единицы понимаем, что китайцы прислали рабочий датчик.
Почему в си используются только строки ASCIIZ? Что если я хочу строки в стиле паскаля: размер строки и массив символов? Допустим даже напишу свои функции для работы с такими строками, но строковые константы (которые в двойных кавычках, типа "привет, мир!") всё равно останутся с '\0' в конце. Как поменять формат строковых констант на свой?
>>3621833 У строк в Паскале есть один минус. Они ограниченны, не больше 255 символов. В С строки в этом смысле лучше, ты войну и мир вместить в одну строку можешь. В Паскале придется мастерить что-то динамическое, типа связного списка. >но строковые константы Писать наверное какой-нибудь конвертор для них, хз. >Как поменять формат строковых констант на свой? Скорее всего никак. Только компилятор переписывать.
>>3622290 Хотя в С тоже придется динамический массив делать для войны и мира. Но ты понял, это просто массив, а не какая-то нетривиальная структура. Но в новом паскале наверное это как-то решили. Последний раз программировал ещё на турбо.
==352074==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7f2e77c00034 at pc 0x5563dcbb222e bp 0x7ffc0c6fa970 sp 0x7ffc0c6fa968 ... ...
именно так это и должно работать, но при попытке собрать эту программу нашим компилятором:
/opt/mipsel-unknown-linux-gnu/bin/mipsel-unknown-linux-gnu-gcc nsm/test_file.c -fsanitize=address -g -O0 -o test_file /opt/mipsel-unknown-linux-gnu/bin/../lib/gcc/mipsel-unknown-linux-gnu/12.2.0/../../../../mipsel-unknown-linux-gnu/bin/ld: cannot find libasan_preinit.o: Нет такого файла или каталога /opt/mipsel-unknown-linux-gnu/bin/../lib/gcc/mipsel-unknown-linux-gnu/12.2.0/../../../../mipsel-unknown-linux-gnu/bin/ld: cannot find -lasan: Нет такого файла или каталога collect2: error: ld returned 1 exit status
>>3622932 Раст успел уже обосраться и в ядре линупса и в сетевой инфраструктуре амазона. Ни какой безопасностью там и не пахнет, если программист накосячил, то раст не спасает. А вот мозги, при написании программ, выносит изрядно.
>>3621833 Странно. Вот тип строки как в паскале, ограничение на длину строки - 4 гига. struct strptr { char *begin; uint32_t len; };
осталось написать функции для сравнения, разбивки на токены, поика символов и всё - класс готов. Можно будет взять кусок текста и пройтись по нему кодом, растащить на токены, и при том ничего никуда не копировать.
Да и от сегфолта с переполнением буфера оно помогает
2026 год, в ситреде платиновая дрочка строк. Убирать 0 из внутреннего буфера = стрелять себе в ногу, если твои строки не собираются жить в песочнице, а логика с оплатой размера строки, но экономии 1 байта...
>>3627129 Там нет экономии в 1 байт, потому что он используется для хранения размера строки, а на деле 1 байта мало, поэтому используют 2 или 4. Так что напротив расход по памяти выше.
плохой язык. в те года можно было сделать лучше, примеры были. лисп пацкаль мл. один только факт, что в недавних сырцах юниха 4 нашли уязвимость говорит о многом о языке. юних кста тоже кал и всё что с ним связано худшее, даже в те времена уже были системы лучше.
>>3635469 да. юних же писали сами создатели языка и обосрались. и тогда уже были лиспы, паскаль, форт, фортран, апл, алгол, симула, пролог, смолтолк даже мл хоть и вышли примерно в одно время, они все безопасные и си в 72м это не си в 78м, когда все эти языки уже были, те уже тогда си был отсталым калом. но си уже так сильно всё засрал, что похуй, это уже не исправить для этого надо убить все сиподобные языки, уничтожить весь софт на них, убить всех программистов, уничтожить всё железо и начать заново. хотя новые сиподобные языки норм типа шарпа
>>3635576 >типа шарпа Более каловый язык ещё поискать. Это буквально синтаксическая помойка, куда тащат абсолютно бесполезный сахарок, ломая изначальную задумку.
>>3635576 Какие ОС написаны на этих "безопасных" языках? Си создавался под конкретные нужды - писать ОС на языке высокого уровня, а не на ассемблере. Также удалось добиться определенной степени кроссплатформенности.
>>3635870 на чём угодно можно писать ос. надо портировать виртуальную машину, в си конретной нет, но есть модель пдп11 и надо портировать библиотеки например стандартную библиотеку. как это сделать? на ассемблере в любом случае для любого языка.
>>3637000 >на чём угодно можно писать ос. >надо портировать виртуальную машину Мне кажется тебе стоит подтянуть знания в этой области прежде, чем писать подобные утверждения.
>>3637034 шиз как ты портируешь языкнейм на платформунейм? все языки построены по принципу, что они выполняются на абстрактной машине в этом и суть абстратных машин они работают с языком и код пишется для них. на жабе под жвм, на си под пдп-11 это модель во что транслируется похуй. поэтому для порта надо чтобы платформа соотвествовала этой модели.
>>3638884 сделать компилятор/препроцессор/постпроцессор/чтоугодно Посмотри на котлин, он умеет компилироваться под джвм, джс и ллвм, потому что компилятор имеет разные бэкенды. мимо
>>3638884 Си транслируется в машинный код конкретной машины. Что gcc, что clang, что msvc. Ни в какую pdp-11 никто ничего не транслируется, если ты не пользуешься древним си, который писали под pdp-11. Причём под каждую платформу пишут свой компилятор си. Например, под ZX Spectrum тоже есть си, но из-за ограничений машины он там даже стандарт не поддерживает и очень урезанный по возможностям. А джава с джв - это совсем другой мир. Это языки под виртуальные машины для которых нужна работающая ОС, которая будет выполнять код этой вм. Ни какую ОС ты не напишешь, потому что без ОС твоя жвм даже не запустится. Это сугубо прикладная программа. А си - это системный язык, на котором можно написать практически что угодно.
Гайс, я собираю shared object (допустим libmylib.so), потом бинарь, к которому линкую библиотеку, находящуюся в той же папке. -L. -lmylib Линкер отрабатывает, ошибок не выкидывает.
При исполнении бинаря падает ошибка, что библиотека не найдена, хотя она в папке с бинарём лежит. > error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
Кто объяснит поч так происходит? При исполнении поиск
>>3639093 >>3638931 о том и речь. трансляция в промежуточный код, который должен отображаться на целевую архитектуру и проблема в точности и качестве такого отображения. и от этого же зависят требования к рантайму. а для ос всё равно придётся писать на языке платформы.
>советую прочитать книгу Брайана Кернигана и Денниса Ритчи «Язык программирования Си» Мы игнорируем тот факт что ее можно прочитать только если ты уже знаешь Си потому что там задачки +- фулл бесполезные?
>>3635576 Как бы не хотелось согласиться, попробуем восстановить реальную ситуацию, которая имела место в то время. >лиспы Тормозной скрипт, для которого только-только научились писать вменяемый GC. Требует передового железа, иначе пригоден лишь как DSL для экспертных систем без строгих требований к производительности. >паскаль Учебный язык. За пределами учебных задач такая же байтопараша, как си. >форт DSL для написания встраиваемых систем. В некоторых задачах тормозит, сцука. >фортран Хорош только библиотеками. В остальном кривая параша, которая с самого начала разрабатывалась бессистемно. В нём даже рекурсии не было, блеать. >апл DSL для математических расчётов. Да ещё с GOTO. >алгол Алгол 60 - неюзабелен из-за call by name, который очень тяжело оптимизировать. Алгол 68 - слишком сложный, был потеснён Паскалем. >Симула См. Алгол 68. >пролог Подмножество Лиспа, расширенное недетерминизмом и тормозной унификацией. Юз кейсы ещё уже, чем у Лиспа. >смоллтолк Экзотичен как Симула и тормознут как Лисп. >мл DSL для доказательств теорем, о котором за пределами Эдинбурга вообще никто не знает. Если не ошибаюсь, в первых версиях даже мутабельных переменных не было. Тормозит как Лисп (в который, собственно говоря, и транслируется).
>>3651724 Если не стесняться гуглить сложные моменты, то там нет ничего такого чего нельзя было бы освоить с нуля. Ну разве что пара алгоритмов, которые можно либо скипнуть либо тоже погуглить. Задачки можно решать с отладчиком если что-то непонятно. А вообще процентов 70 книги это очень простые упражнения. Самый главный плюс КиР в том что она короткая - 150-200 страниц. Тот же Прата уже в 5 раз длинее на все 1000 страниц.
И это бомба. Я забыл про все языки на которых писал до. Зачем, когда можно обращаться указателями на указатели и быть по настоящему счастливым, а не вот это вот все.
>>3653126 SML был очень годным языком, первый и единственный юзабельный со статической типизацией. У Аппеля он компилировался в машкод для мипса и спарка.
>>3651724 Насколько тяжело войти в 2026 в низкоуровневое программирование,есть базовое знание си ,и булевой алгебры и понимание архитектуры фон Неймана но нет коммерческой практики ,и есть ли ейджизм при трудоустройстве? 27 лет
Использую Си, когда нужно переписать или скрыть какую-то логику на Питоне. В повседневных и бизнес задачах сейчас уже в основном бесполезный: телеграм бота, бэкенд вебсайту, десктопное приложение вы на нем писать не будете.
Где сейчас Си и Си++ можно исполтзовать, если речь не о микроконтроллерах и всякой дедовской хйне:
Модификация кода известных программ, например десктоп клиента Телеграма написан на С++, некоторые создают кастомные клиенты, модифицируя разные моменты в телеграмме: пример Котатограм, некограм и тд.
Или тот же браузер Мозилла, на С++, кто-то модифицирует его код, чтобытна базе его создать свой браузер, например с целью большей приватности, например Tor или Camoufox.
Разработка VPN приложений, всяческие средства обзода блокировкой все пишутся на Си или Си++, там где нужно натнизком уровне изменять настройки сети.
Разработка Игр для Андроид. Сам код игры может быть написан на Си++, собран в бинарный файл типа lib.so, другая часть, сам интерфейс написан на Java, и через бридж JNI вызываются функции уже из бинарного файла.
И в общем и целом где нужна работа с графикой, звуком, сетью, все пишется на Си/Си++.
Примеры: PhotoShop, Gimp, VLC player и тд.
Если прям хочется, то можно создать что-то свое, конкурировать с Фотошопом условным вряд ли сможете, скорее как учебный проект, который может перерасти в хороший Опенсорс.
Черные хакеры используют Си/Си++, чтобы писать вредоносное ПО. Хотя тут имхо, любой язык подойдет, тот же питон или джаваскрипт, на любом можно сделать малварь.
Вот это основные наверное направления, ради в которых можно вписаться в изучение Си/Си++.
Cython отличная тема. Он транспиллирует код Python в Си, а затем в бинарный файл (.pyd/.so).
Я его использую, когда к примеру мне нужно продать какую-то программу, но при этом сохранить контроль над интеллектуальной собственностью.
Чтобы покупатель не нашел какого-то другого программиста, не модифицировал код, не "дал другу погонять", не перепродал.
Поэтому да отличная тема, всем советую, кто на Python пишет, но тред не про него конечно.
А по Си, ну честно сказать, тяжело на нем писать, даже те, кто на нем много лет пишет, говорят, что иногда лучше сделать на php, python, js, c# если это сайт/бот/десктоп. Но области применения по прежнему есть, выше расписал.
>>3668063 SML появился только в начале 80х, а современный стандарт вообще только в 90е. До него был только просто ML, на котором ничего, кроме расширений для пруверов, не писали. >первый и единственный юзабельный со статической типизацией В некоторых задачах сабтайпинга не хватает, а так согласен.
>>3673238 >микроконтроллерах и всякой дедовской хйне: Ну как дедовской, вся индустрия это си и плюсы по-сути: промышленные роботы всякие, тачки, самолёты. Всё что ты расписал это какая-то хуета для школьников.
>>3668048 Си - это чистое сияние разума, очищенное созерцанием истинной пустоты войда от привязанностей к паттернам и типам, от страстей исключений и суеты функциональной ереси. По мере просветления ты ощутишь, как последние оковы стандартной библиотеки спадают с тебя и ты обретаешь истинную бинарность.
>>3680958 ООП - это когда абсолютно бессмысленная хуйня придуманная только для того чтобы одного недопрограммиста можно было легко заменить на другого. Вообще орал когда читал СтраусТРАПА и он такой пишет - ну Си короче сложный, я придумал си с классами чтобы проще было нахуй.
>>3696144 >железом Что такое железо? >Может ли он в целом делать это напрямую? В мире погроммистов напрямую - это работа с регистрами устройств, у тебя, допустим, есть устройство с регистрами доступное по такому то адресу, на деле ты будешь долбиться через интерконект (или шину). >Например с сетевой картой Да, вот читни исходник для примера https://github.com/torvalds/linux/tree/master/drivers/net/ethernet/intel/e1000
>>3696218 Предлагаю тебе парсер мат. выражений написать на чистом Си. Особенно AST весело на Си писать. Тебе либо придется делать костыльный аналог полиморфизма, делая свою vtable, либо почувствовать себя магом и кастовать типы, молясь нигде не проебаться.
>>3696632 Окей, у тебя есть struct Node { int num, type; Node* lhs, rhs }. Ты оформил 5 кейсов, 4 операции арифметические и взятия числа. Потом ты подумал. Какой же калькулятор без 1) мат. констант 2) встроенных дефолтных функций вроде корней, синусов и пр. Как выкручиваться будешь?
>>3696678 У меня будет, скажем, штук 20 свичей по инту вместо полиморфизма. Я добавляю новую операцию, надо поправить все свичи. Без правок программа должна упасть на тестах. Если не падает, пишу тесты, которые уронят. И так пока все не заработает. Необходимость ООП сильно преувеличена. В процедурном коде у тебя весь алгоритм перед глазами, хоть там и простыня ифов. С ООП логика размазана по сотням визиторов в сотнях файлов, пара строк на каждый, охуеешь собирать этот пазл.
>>3696698 Всё правильно. Единственный случай, где нужен динамик диспатч - это если количество кейсов заранее неизвестно и они подгружаются динамически (плагины), так что схожий код в одном месте принципиально не поместить. Иначе просто пиши свитч.
если вы искали задачу для пет проекта/вката, то их есть у меня
ни для кого не секрет, что все мы периодически слушаем музяку. кто то по патпиське, кто то качает с зайцевнет. для тех кто качает - некоторые музыкальные коллективы/альбомы/отдельные треки звучат тише/громче остальных
предлагаю вам подумать над проблемой автогромкости (на базе карманного аудиоплеера с гулькиным хуем мощностей)
>>3698391 Это для разговоров по телефону, а не музыки. Музыка по дизайну не одной громкости, выравнивая громкость ты испортишь музыку, всё равно что слушать нейрокал вместо музыки, свинское говноедство.
>>3698528 >выравнивая громкость ты испортишь музыку вот тут поподробнее пжалста тоесть выходит по вашим словам, что ежели я к примеру слушаю элджея на волуме 20 и потом играет агата кристи на тех же волумях но тихо, то прибавив волумя я прорываю пространственно временной континуум и получаю нейрокал?
>>3698555 Это значит ты не можешь слушать стримы, сначала надо закешировать треки полностью и их проанализировать целиком, и только потом слушать. Так и делают музыкальные плееры, сначала сканируют всю фонотеку, а потом только слушаешь. А в реальном времени регулировать громкость, это для разговоров по телефону, чтобы речь было нормально слышно, а музыку это всирает, тупая свинья.
>>3698564 >Так и делают музыкальные плееры ни один плеер так не делает, не надо вводить анона в заблуждение вот играет элджей с айфона по яндекспатпиське и вот агата кристи еле слышно. запускаем тот же самый тест на плеере хуй-сунь-в-чай: результат тот же. и в очередной раз я спрошу, каким образом прибавка волумев на той же тихой агате кристи всирает ее, ответь уж нам, шизло?
Кокой дурак придумал звездочки создавать указатели, но потом вызывать их без звездочки, но зато для разыменования опять использовать звездочку? Типо лишних символов на клаве не хватило? Чтоб потом когда кто-то будет читать вложенные друг в друга указатели нельзя ничего было понять?
>>3701751 полагаю тут дело в кривой нотации звездочка при объявлении указателя относится к типу, а не к имени указателя тип_звезда указатеельнейм вот такой должны была быть трушная нотация, но пендосы все проебали дело закрыто
и вероятно вся эта путаница из за того, што компилер неверно обрабатывает оператор запятая конкретно в этом кейсе
char\ psymbol, psomeshit; //поидее должно быть так, ведь мы создаем две переменные типа указатель на char, но компилер спотыкается об оператор запятая в этом месте и нам приходится явно протягивать объявление типа дальше
char \psymbol, \psomeshit; //тут вы скажете что звездочка относится к имени переменной, но тогда конструкция \psymbol = &strarr[3] должна корректно работать, однако этого не происходит, отсюда мы и делаем вывод, что звездочка относится к типу, а не к имени переменной
>>3701839 Мне нравилось рядом с типом ставить, это же логично. Особенно когда const используешь const char✰ p = нельзя менять туда куда указывает p char✰ const p = нельзя менять поинтер но если ставить рядом с именем const char ✰p char const ✰p то получается не очень, особенно вторая строчка, как по мне.
Но олды-перды ''так принято,, писать ✰ рядом с именем. Потому делаю так же.
>>3702848 Короче погуглил, и старый вариант щёлкнул. Если читать справа налево, то ✰p = указатель, а дальше на что, на конст кар или кар. Если слева-направо читать, то ✰p = переменная типа указатель на кар. >>3702026 Никогда не объявлял несколько переменных в одной строке. Всегда дарил строчку.
не понимаю почему в счетчике используется "count", если count это просто параметр функции? Он же никак не связан с количеством переменных параметров.
Спросил АИ, он сначала сказал что этот параметр должен быть равен количеству переменных параметров, но когда я спросил что он должен значит всегда быть int быстро пошел на попятную лол.
>>3702026 Что мешает однозначно писать char c1; char c2; char c3; ? Всегда угорал с этих "оптимизаций", шизоидные скобочки от КР туда же. Зачем жертвовать читабельностью кода? Чтобы места на дискетке хватило или монитор 13 дюймов как у пра-дидов?
>>3704803 Всё правильно. Во время компиляции создаются два объекта структуры на которые ссылаются указатели p1 и p2. Так делать можно, но не нужно. Велика вероятность, что прилетит по ебалу лопатой, если работаешь в команде.
>>3705078 Мне нейронка говорит что эти указатели будут указывать на мусор, а не на структуры, потому что нет переменной структуры и значит память не выделена под нее. >>3705113 С чего ты взял? Тут очевидно что это тип, даже при инициализации переменной для структуры.
>>3704803 >Разве можно при описании структуры сразу ей присвоить указатель. Нельзя. Если не ошибаюсь, тут мы объявляем переменную p. Тип у этой переменной - указатель. Указатель это просто 8 байт адрес, ему в общем-то насрать что там будет, это просто адрес. Но для компилятора мы говорим что это указатель именно на структуру struct { int val; }
То есть struct { int val } ⚹p; Всё равно что int ⚹p
Ты обьявляешь указатель. Инициализировать ты его можешь адресом, как там и показано &kate
Это всё чисто для компилятора. Так то можно сделать и void ⚹p И уже ему присваивать всё что угодно. Я так делаю, например когда нужно произвольные данные передать в обработчик
вся хуйня в том, што поинтеры на структуры в таком виде нужны лишь для дробности типоразмеров например поинтер на структуру в котором массив из 7 чаров будет 7байт типоразмера (сдвиг по адресу на 7 байт для самых маленьких) практическое применение такой хуйни - за шаг перебрасывать нужное количество байт из одной хуеты в другую, например копирование строк заданного размера, чтение и замена байтпоследовательностей в конвейерных хуйнях по типу буса, етц
>>3703492 у тебя цыгане интернет украли. в соседнем треде все разжевано.
пикчу штоли приклеить, а то какой то скучный тредик
а, вот еще чо добавлю исключительно для неофитов и пожалуй под спойлер спрячу, а то ща начнется
как бы вы там не старались создавать супербыстрые алгоритмы, изучать биг оу и прочую хуйню, у вас абсолютно всегда останутся ограничения по железу. так уж вышло, что типикал шина данных интовая и железо попросту физически не может сделать то, что вы хотите, чтобы оно сделало. вы хотите за 1 шаг цикла пробросить неровный размер байт, да еще и что то длинное? круто классно. вас наверняка похвалит ментор, или все скажут вау на ваше решение по литкоду. но при этом шина данных хлопнет не 1 раз, а проц еще будет туда сюда гонять данные отрезая лишний байт, который вы не хотели получать. очень мало действий по коду и очень много по железу. крч, не забивайте себе голову, пишите по классике, не экономьте память, юзайте интовые размеры и все будет гуд.
>>3705313 >Мне нейронка говорит что эти указатели будут указывать на мусор, а не на структуры, потому что нет переменной структуры и значит память не выделена под нее. Или ты не так понял, или нейронка троллит тебя. Сначала объявляется неименнованный тип структуры, а потом в этом же статементе инициализируются два указателя с выделением памяти для двух структур во время конпеляции. В рантайме ты можешь работать с этими двумя указателями и они будут указывать на структуры, но там будет мусор т.к. сами структуры не инициализированы никакими значениями.
>>3705672 Не слушай этого волка. Выделяются два указателя, два слова. В них мусор. Ты можешь вместо мусора записать адрес структуры. Но структуры еще нет, ее надо выделить.
>>3705930 Это высокоуровневая макака, макака не понимает код, она пишет магические заклинания. Поэтому они так любят нейросети и считают, что нейросети заменят человека, нейросеть как магический джинн, ты ему пук, тот в ответ среньк.
>>3706080 да схуяли это нахуй ты вял то? адреса сжал что ли, сжиматель? там же разжевано что это про сдвиги ++ няхуй -- вот это вот, адресная арифметика ептель моптель
>>3706087 есто ясно, ты ваньку не валяй, отвечай прямо будут ли алоцированы экземпляры под указателями?
>>3706089 >будут ли алоцированы экземпляры Нахуя, если только указатели данного типа объявлены. Их и имеешь в итоге. Если напишешь struct { int age; int name[20]; } ⚹p1, ⚹p2, t1, t2; то будут тебе экземпляры t1 и t2, при этом p1==p2==NULL.
но все равно непонятно схуяли я не могу ПРОСТО вычесть адреса, это же числа ептумать
вот если я из адреса вычитаю инт - тогда выходит я из адреса вычитаю интчислосдвигов типоразмера данного адреса для примера если это поинтер на инт - интчислораз по 4 байта вверх (влево) кому как удобнее
а если я из адреса вычитаю адрес? приходится поебаться почему не ансигнед лонг инт число сдвигов типаоразмера, например? тогда бы ренж был в нуле наверное? ну типа возми любой адрес в памяти и сдвинь квадрилионы раз влево - упрешься в нулл. разве нет? схуяли ОДИН?????
>>3706200 >ну типа возми любой адрес в памяти и сдвинь квадрилионы раз влево - упрешься в нулл Или в 738, или в 921324, а может вообще на месте останешься. >схуяли между адресами интов 1 байт anyptr + 1 == (unsigned long)anyptr + sizeof(any)
>>3706381 Зачем себе жизнь усложнять ненужными мелочами? Цель программирования это писать программы для людей. Зачем тратить время на ёблю с флагами и прочую чушь? Это не влияет на твой скилл писать программы. Ты юзаешь ОС, юзаешь терминал, юзаешь компилятор, а не программируешь на голом железе, но тут внезапно ЭТО ДРУГОЕ, а вот ИДЕ это не тру и плохо-плохо.
>>3706440 не все любят когда их водят за ручку да и вот давеча мне надо было пробросить байтослоп прикинувшись будто бы я кидаю объект класса из обжектив си в какаву, уверен и дэ е слилась бы и посоветовал просто выучить обжектив си
>>3706440 Тогда и не программируй, дворнику куда проще, там тебе и место. Зачем лезть туда где тебе не место и гадить? В любой работе требуется тщательность, даже ботинки полировать надо как следует, а не как попало "зачем себе усложнять жизнь". Неусложнятель значит тунеядец, таких надо пиздить и гнать нахуй. И если что, это касается любой профессии, и начальников, если начальник тоже неусложнятель у которого всегда виноваты подчиненные, такого надо точно так же пиздить и гнать нахуй. Вы все одинаковое бесполезное говно которое только гадит. Ни одна ленивая погань не делает и не сделает никаких полезных программ для людей, только говно наносящее людям вред чтобы на этом нажиться самому.
>>3706218 я думаю считается что тебе незачем вычитать из адреса просто число - ты просто получишь какой-то рандомный или мусорный адрес, а вот когда вычитаешь размер типа то можешь двигаться массиву
>>3707253 Указвтель+число помогает двигаться по массиву. На целое число элементов. Укащатель-указатель показывает пройденное расстояние. В элементах. Надо было сделать хуже?
>>3705639 >проц еще будет туда сюда гонять данные отрезая лишний байт хм но в структурах для решения проблемы data misaligment по умолчанию вставляются паддинги, а запрещаешь принудительное выравнивание ты для того чтобы в бинарный протокол например упаковать, ну и надо делать упаковку/распаковку, и обрабатывать далее уже с выровненными данными
>>3705639 или речь о том что якобы в архитектуре x86 работа с "короткими" интами short int (16 бит) неэффективна тк к инструциям обрабатывающим такие числа приходится компилеру добавлять специальный префикс 0x66 и инструкция становится длиннее на байт? ну дык это в более свежих поколениях процов пофиксили наебашив сверху оптимизаций..
чел тут тебе не церковь 86 у людей и другие архитектуры на руках речь вцелом про неэффективность эффективных решений вот к примеру в бородатые времена придумали б-три как эффективную модель данных с быстрым поиском, в текущих реалиях она неэффективна и простой массив (или хэштейбл) сработает куда быстрее из за аппаратных особенностей поэтму фраза не забивай себе голову хуйней и пиши по классике в интах емко и красноречиво подитоживает все будущие диалоги на эту тему, тут нехуй обсуждать
>>3707839 >б-три как эффективную модель данных с быстрым поиском, в текущих реалиях она неэффективна и простой массив (или хэштейбл) сработает куда быстрее конечно нож острее кувалды б-три для дисковых накопителей оптимизирован, его узлы в страничку памяти помещаются, для индексов реляционных субд это король хештейблы для того что в оперативу умещается, их любят in-memory dm
>>3707839 >другие архитектуры тык в той же arm тоже есть свой simd движок, и работа с короткими интами и char еще более оптимизирована по сравнению с x86
к тому же речь вообще не шла про халфворды или чары хуй знает с чего ты решил что отрезать лишний байт это инт -> шорт инт как вообще в твоей башке сложилась такая математика? хотя похуй я не хочу этого знать, это какой то бредик
паддинги еще приплел блять да структуры неэффективно лежат в памяти, чо сказать то хотел? давай помогу осознать буквы которые ты прочитал и на которые ответил тебе прилетело 8 байт данных, программист заказывал 7. твои действия как проца?
>>3707867 классическая шина данных 32 битной машины например
>>3707869 при чем тут шорты и чары сука мразь бесишь
>>3707871 >классическая шина данных 32 битной машины тык че за "шина данных", о чем речь? nvme ssd через pcie 5.0, причем контроллер прямо в проце озу тоже напрямую в проц, шина памяти, контроллер в проце, это прям физика, проводочки идущие в проц и часть кристалла на проце отвечающая за io
>>3707883 шина по которой приходят данные на процык проводочки по которым текут электрончики и щекотят регистры может тут я неточен в терминах и это шина памяти, тут сорян убшиз ета ти?
>>3707874 >оперативно поработай с пзу теперь, опитимизатор да пожалуйста, давай на каком уровне хочешь говорить? физическом уровне? дык там pcie 5.0, многоканальная передача хоть и протокол последовательный, те же 512 бит кеш линии разделятся на 4 канала и прилетят за такт по 128 бит на канал ос и дб могут работать с минимальным размером данных это размер дисковой страницы, в винде 4кб, итого за 64 такта прилетает страничка из диска в озу естественно через dma те выч блоки проца не задействованы, задействовано только io: контроллер pcie, контроллер памяти, внутренняя шина
>>3707898 >приходят данные на процык тык данные на выч блоки цпу приходят через кеши, в кешах минимальный размер это кеш линия, в совр проце будет 512 бит
ты чо несешь петух пердоль давай свою оптимизированную б-три и долби диск, нехуй в озу грузить ты же отказался от этой идеи и скозал што б-три пзу бейзед алгоритм и што же я вижу грузишь в озу свою хуйню академическую из пердольного века массив в кеш линиях в сотни раз быстрее перебрать чем твоей хуетой заниматься перечитай пост на который ответил все иди нахуй
алсо алгоритм отрезания лишнего байта не описал дважды нахуй
>>3707911 решение на основе б-три оптимизированное под дисковое хранение более универсальное получается, и поэтому оно до сих пор основа для индексов реляционных субд, да, для oltp базы данных ты можешь добавить столько озу чтобы весь кеш дисковой структуры лежал в озу, но для хранилищ данных такое уже может не прокатить хеши рулят в in-memory db
>>3706200 > возникла гипотеза что поинтеры смотрять в нулл > гипотеза > явно описанная в документации > что глобальные переменные инициализируются нулем
>>3619616 (OP) Объясните нюфагу, почему когда я использую malloc, и компилирую через msvc, то независимо от того, сколько байтов я указал в аргументе, я все равно могу поместить в память нихуя не столько? Например, даже если char* c = malloc(1), то я туда могу засунуть строку не из одного, а аж из 80 символов? При том что _msize возвращает именно то значение, которое я указал в качеству аргумента malloc.
>>3707980 Приложению выдают целую страницу и внутри него она что хочет, то воротит. А вот если выйти за пределы, то уже смотритель памяти (не помню как называется) выдаст по ебалу сегфолт.
>>3707919 В беркли дб были дисковые движки на хэшах и деревьях, хэш обычно обгонял дерево, но имел ограничения по объему, и никаких дубликатов и обходов по порядку. >>3707980 UB
>>3707981 А как тогда вообще пользоваться этим вашим мемори алокейшном? Я сейчас даже попробовал прогнать
int i; int* a = malloc(1); for (i = 0; i < 6; i++) a = i;
И оно реально полностью записало мне в память числа от 0 до 9, хотя я выделил даже меньше памяти, чем на одно число нужно, а for (i = 0; i < 10; i++) printf("%i ", a) благополучно мне их выводит, даже если я сразу после a выделил другую область памяти и что-то туда записал, хотя по-идее они должны в памяти по соседству находиться. Это в компиляторе такая защита от индусов сделана или, что вероятнее, я не понимаю, как мемори аллокейшн работет? Если второе, то что именно я не понимаю?
>>3707990 >я написал программу записывающую числа в память >И ОНИ СУКА ЗАПИСАЛИСЬ! не понимаю, что за хуйня? Это называется программирование, как пишешь, так и работает.
Если же не можешь программировать, для таких есть нейросети, ты ей говоришь одно, а она определяет что ты дебил и делает совсем другое. Ура, как удобно, я несу хуйню, а система исправляет как надо.
Да, это очень удобно, только без тебя, ведь если ты тупее системы, значит ты не нужен.
>>3708016 Ты числа записал? Записал. Числа записались? Записались. Что не так сделал компилятор? Ты дебил? Не нравится когда программа работает как ты написал, то есть тебе не нравится собственная тупость? Так при чем тут компилятор? К психиатру сходи, дебил.
>>3708016 Лол, нет. Компилятор C и плюсов уверен, что программист царь и бог и если хочет отстрелить себе ногу значит он так и задумал. Есть конечно предупреждения, но это совсем от долбоебов. А чтобы дерьмо за тобой подтирали - это к статическим анализаторам кода.
>>3708022 >>3707980 Успокойся шизофреник. Конпилятар тут не при чем. У тебя память вообще ОС выделяет, а не компилятор. У библиотеки просто есть функция, условно "обеспечить столько то памяти". Вот она тебе и обеспечила. А то что её реально выделилось больше - иди и билу гейтсу ной. Алокация памяти это вообще не часть языка С. Это просто прослойка над сисколами.
>>3707980 не всегда можешь ты просишь у оси столько то байт ось грит ну типа ок вот адрес начала блока куда можешь насрать сколько там реально свободной памяти знает только ось, но если дала адрес значит точно не меньше запрошенного объема если н дала значит нет цельного фрагмента искомого объема
>>3702577 >звездочка при объявлении указателя относится к типу, а не к имени указателя Почему тогда int* a, b создает не два указателя, а один указатель и одну переменную?
>>3708320 Не совсем так. К твоей программе прилипает c-heap-manager. При запуске программы он у ОС просит большой кусок памяти. Дальше он эту память нарезает на блоки и хранит список свободных блоков. Когда ты просишь память, ты не всегда обращаешься к ОС, ты обращаешься к менеджеру, и он тебе дает указатель на блок, способный вместить как минимум сколько ты запросил. Когда память освобождаешь, то так же освобождается блок и он возвращается в список доступных блоков. Вот если блоков нет, только тогда уже программа идет на поклон к ОС.
>>3709011 Разумеется нет(в смысле да). Указатель это указатель на начало области памяти - адресс. >>3708923 Да можно. Но не факт что получится, а может и не получиться ничего хорошего вовсе, зависит от того куда он указывает.
>>3708923 Доброе утро! Неужели это для тебя открытие. Это же самое первое о чём пишут в си. Строго говоря в си нет "массивов" вообще. Имеется ввиду что нет такого же вот обьекта как в Паскале, там, которому можно было диапазон задать, например. Квадратные скобочки в си это грубо говоря шорткат, то есть i[N] это тоже самое что *(i+N) . Различия всё-таки есть. Например sizeof скобочек выдаёт именно длину массива, а sizeof указателя выдаст 8. То есть что-то типо массива есть, но это не совсем массив.
>>3710916 >Например sizeof скобочек выдаёт именно длину массива, а sizeof указателя выдаст 8. То есть что-то типо массива есть, но это не совсем массив. Только следует помнить, что sizeof скобочек будет работать только в скоупа и сабскоупах, где массив определен. Передай указатель на массив в функцию, и он забудет размер.
>>3710916 >>3710985 массив нельзя передать как аргумент указатель можно твои утверждения неверны, массивы существуют так же как и указатели, механики похожи, сущности разные, шорткаты твоя фантазия
>>3711081 >массивы существуют Назвать этот огрызок от указателя "массивом" не совсем правильно.
Массивы существуют только условно. Но по факту это скорее указатель с дополнительными свойствами.
Начнём с того что массивы можно присваивать. А то что то в С называют "массивом" присвоить нельзя: int *a; int c[3]; int b[3]; b = c //syntax error Зато можно a = b И теперь, ВНЕЗАПНО мы можем индексировать a: a[2]; Это по твоему нормально называть массивном? Массивы в Pascal или других высокоуровневых языках по твоему так себя ведут? Он конечно назван как array, но фактически это не то что подразумевают под массивом.
>>3711085 массив это массив не зависимо от того что ты там себе нафантазировал твои выпады напрямую связаны с непониманием лаконичности и компактности си. ты не туда воюешь. си это язык велосипедов. хочешь присваивать массивы - пиши свой хук для присваивания. хочешь какие то другие массивы - пиши свои массивы. это си, детка, туда ли ты забрел?
>>3711093 В си нет массивов, это указатели, как нет математических чисел, это ячейки памяти определенного размера, и тем более в си нет строк. Си обманчив тем, что выглядит как язык высокого уровня, хотя на самом деле си это ассемблер. Мимо-макаки этого не понимают и ищут свои абстракции которых в си нет. Си это машинный язык, а не скриптовый. Нельзя писать на машинном языке не представляя как работает машина, то есть как твой код работает на машине.
Самый простой пример. Ты объявляешь переменную, это имя и привязанное к нему значение. В си ты должен понимать, что это лишь блок памяти, знать размер этих данных в байтах, а так же место в котором они находятся, стек или куча. Это не какие-то лишние знания, а минимальная необходимость без которой нельзя ничего программировать, получается гадание наугад, бред, нелепость как не зная арифметики заниматься тригонометрией, так не бывает.
>>3703206 vararg в сях это костыль по большей части. В теории ты можешь вместо int count поставить любой аргумент, при вызове подавать ему любые значения и как-нибудь угадывать, сколько пришло аргументов. На практике ты либо идёшь по простому и понятному шаблону, либо ловишь баги и леща от других прогеров, которым придётся копаться в нешаблонном коде. ИМХО в сях лучше наплодить похожих функций с разными наборами аргументов, в 95% случаев это прокатывает. А vararg оставить всяким питонам и языкам с полноценной рефлексией
Какой же хороший язык. Достаточно минималистичный. Ему бы ещё встроить аналог new/delete из c++ и было бы здорово (я знаю про malloc, но эта штука требует подключать хотя бы malloc.h. было бы замечательно, если бы выделение памяти делалось оператором.)
>>3711429 Алгоритмы и сруктуры данных, многопоточка, как работает mmu, как работает шедулер, хуй86 архитектура (можно arm), основы криптографии, tcp/ip, устройство efs/ntfs, чуток баз данных
Всем привет! я из казахстана, я хочу задавть вам хотя глупим, и очевидный, короче как изучить ЯП си, из книг или темачиский сайтов(потипу metanit.com/c) или по книг(по типу язык программирования си) для провиллный изучение си?
>>3711579 Эмбеддед разработчиками, программистами, инженерами электроники, учеными. В общем Си у них это не основная специальность. Часто они совмещают его с другой компетенцией или языком. Чистых СИ вакансий почти нет
>>3711626 >Эмбеддед разработчиками Много ли там вакансий, НЕ связанных с разработкой чего-либо используемого в междоусобицах восточных славян? (религия не позволяет)
>>3711626 привет, для чисти изучение для себя, а про работы даже не знаю, час хочу системный прогграмирвние и системный админстарция, то есть чисти энтузиазм
>>3711614 1. Введение в тему из любого источника: хоть сайты, хоть ютуб, хоть книги (для начинающих) 2. Тренировка основ простыми задачами на leetcode/codeforces 3. Хитрости и приёмы именно Си: книга Кернигана и Ритчи. Пет-проекты (гугли темы для проектов начинающих программистов, бери что по силам) 3.5 Для системного программирования - Таненбаум, Реймонд, исходники и комментарии FreeBSD P.S. Системное администрирование это абсолютно другое направление. Там программировать толком не нужно, максимум скриптовать
>>3712671 >3.5 Для системного программирования - Таненбаум Вот из тех кто его советует, хоть раз открывал его? Это же тупое говно на уровне научпопа. Есть намного лучше курсы/книги: nan2tetris, книга с кометой, xinu project, mmurtl... >3. Хитрости и приёмы именно Си: книга Кернигана и Ритчи. Я бы тебе с ноги уебал, если бы увидел что ты пишешь как они. Effective C берешь и читаешь, а не изучаешь окаменелости.
>>3712722 Не окаменелость а фундамент. В твоём проекте буду писать по твоим стилям/гайдам. В своих буду устраивать филиал IOCCC, и никакой двачер мне не указ. K&R стоит читать, чтобы знать на что Си вообще способен, а уже потом перебирать, что подходит конкретному проекту, а что нет.
>>3712963 Думаю если ты школьник с кучей свободного времени, можно порешать. Но если студент и старше, то это сродни учить геометрию по Началам Евклида, когда тебе нужно учить анализ и линейку.
>>3712963 Можешь попробовать, но он на своем выдуманном ассемблере все разбирает. Если осилишь с упражнениями, то очень круто, но я бы не советовал, если ты не умеешь программировать уже хорошо довольно.
а чем обычная переменная отличается от указателя? обычная переменная: -имеет какой-то адрес в в памяти -имеет какой-то размер (например 4 байта для инт) -по этому адресу лежат данные - содержание переменной
указатель: -имеет какой-то адрес -имеет размер ( 8 байт обычно) -по этому адресу лежат данные - содержание указателя
Разница лишь в том что содержание указателя - это адрес другой переменной.
Но что мешает мне в обычную переменную тоже положить адрес? Адрес - это всего лишь число.
>>3714953 Ты можешь сходить по любому адресу, если захочешь. Но адреса у компилятора и ОС определённые, поэтому промажешь. А раньше указатель состоял из двух адресов - смещения и сегмента. Формат и размер указателя - вещь платформозависимая, и делать с ней что-то стоит с некоторой оглядкой хотя бы на чистоту и корректность кода.
>>3714953 >а чем обычная переменная отличается от указателя? Ничем. Указатель - это переменная.
>Но что мешает мне в обычную переменную тоже положить адрес? Статическая типизация, блядь, тебе мешает. Вы что траллите? Вы читали вообще синтаксис перед тем как что-то писать на С? Представь себе, и int, и char - это всё числа. Но ты не сможешь в char положить int! Ты наверное можешь сказать, но в int то char я могу положить. НЕ МОЖЕШЬ! У тебя просто происходит неявное преобразование char в int. В обратную сторону нужно явно прописать преобразование, типо int a; char b; b = (char)a; То же самое и с адресами. Ты МОЖЕШЬ преобразовать указатель в long int. long long a; void ⚹b; a = (long long)b; Например ты можешь распечатать адрес через printf. Более того, в низкоуровневом программировнии это вполне обычная штука, только в обратную сторону, long long переводить в указатель, обычный пример memory mapped io
#define UART0_BASE 0x4000C000 volatile long long ⚹uart = (volatile long long ⚹)UART0_BASE;
>>3715077 >есть байты с нулями и единицами. Эти нули и единицы с тобой в одной комнате, жид? Всем славяно-ариям известно, что нет никаких "битов", есть устойчивые состояния асинхронного RS-триггера, которые характеризуются электрическими напряжениями на выводах. "Биты" это вам дуракам в школе мозги пудрят. Если человек использует такие слова как "бит" или "указатель", и уж тем более "метод класса" - то это всё, с ним всё потеряно, он глубочайшие промытый идиот, который пользуется жидовскими ТЕР-Минами (террориистическими минами) для веб-макак.
>>3715161 Да, это правда. Понимаю, после 10 лет в вебмакакинге это шокирует. Надо заметить, что это не только относится к компьютерным наукам, но и вообще к самой реальности. Все что ты воспринимаешь это интерпретация.
>>3715165 Бит это прежде всего абстрактная единица информации, не привязанная к конкретной реализации.
>>3715168 >Понимаю, после 10 лет в вебмакакинге это шокирует Ты провёл 10 лет в вебе, не понимая модель памяти? Допустим.
>Бит это прежде всего абстрактная единица информации А "переменная" это какая единица? Абстрактная или конкретная? А электрическое напряжение что, конкретное? Почему тогда электрическое напряжение это буквально разница между двумя числами - потенциалами поля в точках. А потенциал поля это конкретная величина? А потенциальная энергия? Если энергия такая конкретная то почему мы её пощупать не можем а просто циферки считаем?
>>3715169 >Что тебе не понятно в хранении информации? А тебе что непонятно? Не я же про "байты" рассуждать начал. Стало быть тебе видимо что-то непонятно в этой теме, раз пришел в тред си о байтах вопрошать. Что-то не видел синтаксисе си тип "байт". Есть int, есть char, но байтов никаких нет.
>>3715227 >Хуль ты очком крутишь, макака? Совсем от петона мозги высохли? Никогда не умел программировать на python. А язык весьма неплохой между прочим. На нём можно заняться чем-то интеллектуальным, а не копипастить код по байтам.
>Переменная это не единица. Тебе бы логику подтянуть. А утверждение "переменная не единица" это не логика.
>указателю на байт А мог бы ты показать этот твой "указатель на байт"? Что-то ни в одной книге такого нет.
>>3715339 Любой указатель и есть байт. Получается никакого указателя нет, есть только байты. Никакого си тоже нет, есть только байты. Которые всегда 8 бит, даже на PDP-10 для которого между прочим си и создан 🤡
>>3715368 >>3715367 Как же школьник подгорает. Да, в современных системах байт это 8 бит. Минимальный набор битов для адресации. Ну ты еще погугли про перфораторные компьютеры, порази нас эрудицией.
>Любой указатель и есть байт.
Что блядь? Это ты так понял "любой указатель указывает на байт"?
>>3715396 >Что блядь? Ну, если никаких переменных и чисел не существует, а есть только "байты" (или как там это себе в бошке нафантазировал), то стало быть и значение адреса это тоже байты, а стало быть и никаких указателей нет, есть только байты. Ну и функции кстати тоже нет, есть только jmp, ret
>>3715485 А да? Да ну нахуй. А я и не заметил, что тот анон с самого начала несёт хуйню (см. >>3715077 ), либо жиденько троллит.
Тред по С. В си типизация статическая. Тут есть типы переменных, прЕкинь!1 И переменную разных типов нельзя присвоить друг другу. Это тебе не java. В некоторых случаях выполняется неявное преобразование, если оно слишком очевидно, например char a = 2, ну очевидно что оно и в int должно быть 2, смысла отдельно попиисывать это преобразования нет, но в коде его таки прописывают часто, просто для информации, чтобы человек понимал что во что превратилось. А вот 1488 int в char это что? Ну можем взять лишнюю часть, то есть 1488 % 256 = 208. А почему так? Почему не 256? По стандарту C результат такого преобразования implementation-defined. То есть язык си не требует единственного варианта поведения - это уже реализация компилятора решает что делать. Поэтому надо явно написать "вот да, я знаю что делаю, я преобразую char в int". А зачем этот шиз выдал что "всё есть байты" - в душе не ебу. Походу дошколёнок пердежа столрярова надышался на его сайте, открыл для себя умное слово "байт" и носится везде с ним как с открытием. Тред про язык С, а вот ему надо благую весть всем рассказать, что оказывается вся память из байтов состоит. Когда он для себя RS-триггеры из курса автоматики откроет, будет носиться рассказывать всес что битов нет. Вот такая-с аудитория у С. Надо внатуре было нормальные языки учить.
>>3715461 Байты хранят числа. Значение адресов это тоже числа.
Когда я говорю что нет типов, речь о том что типы используются компилятором для интерпретации данных и определения количества байтов с которых будет извлекаться эти данные. Но не что мне не мешает получить адрес байта объекта и пройти по каждому отдельному байту используя указатель на char, достать число из байта и интерпретировать его как мне нужно.
>>3715559 Ты просто не дорос до уровня понимания. Ты даже не понял что за этим стоит философская идея - вся информация с которой мы работаем это интерпретация. Для тебя типы это что-то волшебное и железобетонное, а не технический способ интерпретировать числа из набора байтов.
> И переменную разных типов нельзя присвоить друг другу
Воед знаешь?
Короче, ты спалился когда спросил что такое указатель на байт. То есть ты не понимаешь что указатель именно на один байт и указывает. Видимо сидишь через нейронку строчишь хуйню нихуя не соображая.
>>3715603 >Байты хранят числа. >Значение адресов это тоже числа. Ахахах. Машинные инструкции, внезапно, тоже числа. Еблан. Ты перед тем как своими охуительными "знаниями" выёбываться хотя бы почитал про архитектуру фона Неймана. Ебать ты дебил, вроде ты пытаешься умничать, а нихуя не получается.
>>3715603 >> И переменную разных типов нельзя присвоить друг другу >Воед знаешь? Ахахах дебил, переменной void не существует в СИ. Есть только указатель на void. И его ВНЕЗАПНО нельзя присвоить ничему кроме *void. Что с ебалом. Ахахах дура, ебать.
>>3715735 Не плачь, дите. Ну обосрался, ну значит обосрался. Нахуй жопой вилять? Главное запомни что указатель указывает на байт т.е. хранит адрес байта.
>>3715741 >переменной void не существует в СИ. Есть только указатель на void.
Указатель это тоже внезапно переменная.
> И его ВНЕЗАПНО нельзя присвоить ничему кроме *void.
Да что ты говоришь? Серьезно? Естественно указатель на воид МОЖЕТ указывать на адрес абсолютно любого типа. Это собственно и есть его главная функция.
В общем, я понял что ты вообще нихуя не соображаешь, пройди просто нахуй.
>>3715748 >Ну обосрался, ну значит обосрался. >Нахуй жопой вилять? Это ты сам с собой говоришь, я так понял. Я твоей мамке про это раскажу она тебя ведь к детскому психологу отправит.