Это копия, сохраненная 13 мая 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/ https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2583.pdf (октябрь)
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
https://github.com/kozross/awesome-c
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №64: https://arhivach.net/thread/623166/
- №65: https://arhivach.net/thread/637465/
- №66: https://arhivach.net/thread/637469/ >>1873113 (OP)
>ch = st;
Ты пишешь значение байта (т.е. 0x20) в адрес. Если нужно в ch зафиксировать адрес то: ch = st + i * sizeof(char);
И возможно далее fputs(0x20, stdout) приводит к сигсгеву. Асло если ты хочешь "поймать" правый крайний пробел, то очевидно лучше начинать с конца массива.
В таких тонкостях памяти процесса я ещё не разбирался (и не особо знаю где инфу взять).
>ch = st + i * sizeof(char)
А зачем i + sizeof есть квадратные скобки могут разыменовать?
>Асло если ты хочешь "поймать" правый крайний пробел
По Прате надо было первый попавшийся.
>>04973
>или же ch = &st;
Так это же вроде взятие адреса самой переменной указателя, а не значения по нему хранящегося.
Макаба зачем-то съедает квадратные скобки.
Должно так:
ch = &st(i);
Только скобки разумеется квадратные. Так ты берешь адрес байта с пробелом. Без амперсанда - просто записываешь значение (0х20) этого байта в возвращаемый адрес.
>По Прате надо было первый попавшийся.
Тогда после лайна с получением адреса первого пробела напиши break; И как вариант - https://pastebin.com/wK2rePHk
Я правда так и не понял, чем тебе strchr() не угодил.
>Я правда так и не понял, чем тебе strchr() не угодил.
Угодил, на нём и переписал, просто было интересно в чём дело - в долбёжке в глаза.
Как людям норм работать с int при написании целых ОС, когда там то 2 байта, то 4? Или вся суть заключается в том, чтобы взять самый быстрый тип int (обычно) и от него плясать беря чуть меньше или чуть больше уже в зависимости от ситуации?
Люди давно придумали stdint.h: uint8_t, uint64_t и прочее. А еще в ядре определены всякие __u8
Раст тут не новатор нихуя. Хотя мне тоже кажется странным килотонны UB закладывать в стандарт языка изначально.
Самофикс: разная размерность типов - не UB, а просто неопределенность, зависящая от платформы, разумеется.
Есть желающие заработать 500р? Меня заебало мучаться с этим языком, хочу сдать и забыть уже, ибо это 1 предмет, все остальное мы пишем на человеческих языках.
Нужно на СИ написать функцию, аналог линуксовой команды find без использования system()
Нужно чтобы эта функция проходила по каталогу, который передан как параметр, выглядеть должна вот так
void find(char path, char type, charname){...}
Соответственно к примеру, find("Folder/", "-name", ".txt)" должна находить все файлы в Folder с расширением .txt. и выводить их в консоль. обозначает все файлы, find ("Folder/", "-type d", "t*"), должна найти в Folder все каталоги начинающиеся с t и вывести в консоль.
А , да, без всяких конченных либ, без conio.h, windows.h и тд, чисто либы, которые заложены в линуксовой среде так скажем, соответственно, это компилировалось с помощью команды gcc -ansi -Wall -o main main.c к примеру пусть файл называется main
Кому интересно - оставляйте свою телегу. Думаю, для людей, которые любят этот язык тут работы на минут 15-20.
двач удаляет звездочку, ну вы поняли короч, что 'звездочка.txt' это все файлы с расширением txt
>аналог линуксовой команды find
Хуясе ты ибанат))00)
Find может даже твою мать найти и трахнуть прямо в консоле.
Ну это хорошо, в нашем случае версия упрощенная, остальной функционал я сам уж.
>>05588
спасибо, это решает мою задачу. Так то у меня проект написан, основная ебля была с тем, чтобы искать все файлы, то бишь аналог звездочка.txt реализовать.
Еще вопрос.
Как добиться вывода в таком виде? Просто не очень понимаю, как динамически такие штуки делать.
Обмазать счетчиками и ифами. Ничего сложного.
Интересуют 2 вопроса:
Как узнать у системы наличие одного из этих редакторов, кроме поиска бинарника?
Как вызвать запуск бинарника не через system("...").
По второму нарыл только всякие exec* функции, но у них не удаётся разобраться с передачей параметров запуска редактора, а именно пути к файлу. Т.е. я смог вызвать только запуск nano без аргументов.
Буду благодарен за ответ на любой из вопросов!
В линуксах дефолтный для юзера редактор лежит в переменной окружения EDITOR - его и используй.
А в чём проблема сделать строку с нужными аргументами и вызвать system ("$EDITOR путь-к-хуйне")
n - переменная, в неё значение до этого считается. Прикрутить фор и забивать им нули - решение неочинь, да?
Ты не можешь без фокусов в си создать массив размером с переменную.
В любом случае почему бы тебе не написать конкретную ошибку компилятора
memset(arr, 0, sizeof(arr));
Либо же для массива, объявленного где-то и переданного в функцию:
memset(arr, 0, sizeof(×arr) × length);
В чем Раст новатор так это в удобных названиях для точных типов, мне кажется в C людям просто лень вбивать uint64_t и PRId64, SCNd64, и все просто пользуются long long и прочими стандартными типами. Ну Расту было проще, не надо было поддерживать legacy. Я ждал, что кто-то недостатки перечислит такого подхода как я выше описал, но мне кажется даже если код выкладывать с такими забиндеными Растовыми типами вместо uint64_t, то все даже очевиднее будет, чем разбирать все эти (num)_t в конце, просто u64 и ничего лишнего.
PRIu64, SCNu64 соответствуют uint64_t фикс*
Это да, названия отбитые. Тут уже вопросы к дедушкам, какого хрена они не сделали жесткую размерность типов, а нахуевертили черти что.
>какого хрена они не сделали жесткую размерность типов
Мультиплатформенный язык программирования. У разного железа разные размерности.
А растоговно, как и любая скриптопараша, работает само в себе, в своем манямирке, безотносительно железа, поэтому там и можно сделать одно фиксированное навсегда и навезде.
Все всегда можно сделать фиксированным. Вопрос в том, как оно будет адресоваться и сколько инструкций потребует для выполнения.
Хочешь сказать логично из 8 16 32 64 битных репрезентаций сделать не 4 точных типа, а 5 где два из них будут иметь одну размерность на стыке и не будет очевидно до проверки, где это происходит? В стиле либо int = long, либо long = long long. У C просто плохая историческая практика закрепилась из-за того что все добавляли постепенно как тот же long long в C99 и по-разному определяли типы постепенно поднимая размерности. Вне этого подхода сейчас на любом железе будут и 8 16 32 64 битные варианты хранения чисел, кроме совсем экзотического legacy.
А еще бывает short = int. Тоже прекрасно.
Людям не нужна разрядность. Людям нужен тип целое число. Например количество аргументов в строке, количество строчек в меню.
Разрядность нужна единицам байтоебов с хитрыми битовыми алгоритмами.
Людям надо знать, сколько в их целое число поместится. А то можно сделать int, а окажется, что он размером в два байта и хопа - переполнение.
Пасиба, не знал о такой переменной окружения. А exec'ом как пользоваться не знаешь? Пишут, что system уязвим.
int это размер соответствующий железу. На 32-битном проце будет 32 бита, и т.п. Это значит, что один и тот же код на любом железе будет аналогичный, т.е. код предсказуемый, ты знаешь какой код пишешь.
Если же int привязать к размеру (возьмем к примеру 32 бит), тогда на 16-битном процессоре, который не может оперировать 32 битными числами, сгенерится лишний код, чтобы выполнить это уже в два прохода, а на 64-битном проце, который всё равно оперирует только 64-битными числами, ты тупо просрешь в никуда половину размера.
И то и другое получается непредсказуемый говнокод. Такое говно никому не нужно.
Повторяю. Си - язык програмиирования железа, это значит, важен код который ты пишешь, ты должен знать какой код пишешь. Если же ты предпочитаешь результат, а какой код там высрется тебе похуй, это будет не программирование (железа), а алгоритмический скриптомакакинг.
Скриптомакака - как плохой начальник. Не знает и не понимает что делают подчиненные и срать хотел. Его волнует только результат "чтобы было сделано, ведь нужно отчитаться перед высшим начальством/заказчиком/инвесторами". А что там у работников, которые это реалдьно делают, емук позуй, какая у них нагрузка, и вообще. Он делает так, если сделано, хорошо, если не сделано, надо нанять других, кто может, а этих уволить.
Вот и у скриптомакак такое же отношение к компьютьеру. Если не работает, нужно выкинуть компьютер и заменить на новый, коиторый сможет.
> int соответствует железу
> Си язык программирования железа
> ПУК СРЕНЬК АЛГОРИТМ CRC32 не работает потому что на этом железе int 16 битный
Разговор не о том, что нефиксированные типы не нужны, а о том, что фиксированные очевидно нужно было делать из коробки, а не костылем сбоку.
https://news.ycombinator.com/item?id=3112704
В этом языке все реализуется костылем сбоку
Пердопроблемы. В винде всю жизнь есть DWORD, BYTE и т.д. Пользуйся наздоровье, всё из коробки.
Единственное, что в винде нормально сделали. И то названия всратые. DWORD это сколько, блядь? Раньше это было 16 бит, щас в MSDN написано, что это 32.
Так, я обосрался. Это раньше слово было 16 бит, двойное 32, а сейчас слово 32, но DWORD==32 оставлен из соображений совместимости.
>DWORD это сколько, блядь?
sizeof() в помощь. А вот пихать цифры в названия типов это плохая идея, слова лучше запоминаются и меньше путаются и мельтешат.
u64 плохо запоминается?
rm -f
Можно запросто, в 80-е 12-летние песдюки вкатывались даже в ассемблер - такие потом игры писали на продажу. Читай книжки, их для начала достаточно.
Что касается подводных.
Пока не поймёшь указатели и представление данных в памяти - в сишники путь тебе закрыт. Это не очевидно, но преподы считают это самой сложной темой для вкатунов.
Далее, язык Си ненавидит людей и ищет любую возможность нам поднасрать. Мы называем это "неопределенное поведение", "undefined behavior", или просто "UB". На примере. Допустим, ты пишешь a=b+с, и результат не помещается в a. В нормальном языке - Жабе - происходит переполнение и у тебя в a просто неправильный, но ожидаемый результат. Си не таков: компилятор считает, что ты обязан быть богом программирования, и UB в твоём коде означает лишь, что этот код просто никогда не должен исполняться. И он запросто может взять и убрать из итоговой программы огромную простыню кода, потому что в ней содержится это самое UB. А ты потом ищи, где в программе из сотен тысяч строк спряталась неочевидная лажа.
Последнее - в чистом виде на Си новые проекты уже практически не встречаются. Практически весь код на Си - старьё типа nginx или linux, где и без тебя всё збс. Причин писать на нём что-то новое очень мало. Даже микроконтроллеры с 1КБ памяти на борту уже, бывает, поддерживают C++. Поэтому сколько бы ты Си не задрачивал, зарплату это тебе не прибавит.
Я сходу могу назвать новый проект на сишке - janus-gateway. Как раз щас с ним разбираюсь.
На самом деле сишники охуенно востребованы. С оговоркой: сишные боги. Крупные компании используют сишку. Либо патчат ядра, либо пилят какие-то свои нахлобучки для сетей, или что-то еще подобное.
А еще это огромный запас существующего кода и вылизанные быстрые библиотеки. Когда мне нужно было написать очень быстрый видеосервер, я его нахуярил за пару месяцев на сишке с использованием libevent для веб-части. Разумеется, он рвет по скорости все существующие поделия.
>>07959
Я в свое время вкатился в программирования, изучая сишку, пока был школием. Потом активно изучал питон и сишку подзабросил. Однако опыт разработки на питоне был полезен, когда я вернулся в сишку, потому что в сишке как нигде необходимо хорошо уметь в проектирование, иначе у тебя получится кривое падучее говно. Ну и еще всякие штуки типа параллелизма на питоне несколько проще изучать в силу наличия большого количества высокоуровневых абстракций.
Но вообще, ящитаю, одна сишка с высокой долей вероятности будет бесполезна, если только ты не ядерщик или эмбеддер. Вероятнее всего тебе потребуется знать еще два-три языка. На скриптухе или высокоуровневом писать бизнес-логику, на сишке - критичные к производительности вещи.
>Допустим, ты пишешь a=b+с, и результат не помещается в a. В нормальном языке - Жабе - происходит переполнение и у тебя в a просто неправильный, но ожидаемый результат. Си не таков: компилятор считает, что ты обязан быть богом программирования, и UB в твоём коде означает лишь, что этот код просто никогда не должен исполняться. И он запросто может взять и убрать из итоговой программы огромную простыню кода, потому что в ней содержится это самое UB.
По-моему ты гонишь, не может компилятор в таком случае выкинуть код. UB значит, что результат может быть любым, условно ты можешь получить число по модулю, а можешь 0.
Но это скорее про случаи m[x++] = m[x++] + n[x++]. Просто вот так не надо писать и всё, одни какие-то подобные случаи прописаны в стандартах, другие нет.
Просто сложение с переполнением будет транслировано в обычную ассемблерную команду, предсказуемую, и компилятор просто предполагает, что ты знаешь, что делаешь, и переполнения не будет, это не случай UB.
>Причин писать на нём что-то новое очень мало.
Тут ты тоже не прав, поскольку Си это один из основных языков для расширений, а плюсы тут плохо стыкуются, и реально много пишут на Си, без плюсов.
Это местный форсер, который срет примером со сложением повсюду. В компиляторах есть флаги чтобы отлавливать целочисленные переполнения, в стандарте это UB потому что на разных аппаратных платформах это работает по разному, а сишка, в отличие от джавы, должна работать везде.
char ar[ROWS][COLS] = .....
char (звезда)ptrs[ROWS]
ptrs[0] = &ar[0][0]
Ложная тревога, вывод был по строкам.
Ты описываешь implementation defined, а не UB. Это явления другой категории.
При UB компилятор действительно может убирать инструкции. Условный пример, ты делаешь какое то UB, а потом пишешь if(cond) {...} компилятор волен полностью выкинуть этот код, потому что по его мнению cond никогда не выполнится, потому что считается что UB в программе отсутствуют.
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void FillPtr(int arr, int n)
{
arr = (int)malloc(n sizeof(int));
for (int i = 0; i < n; i++)
{
arr = (int)malloc(n sizeof(int));
}
}
int main()
{
int arr;
int n;
scanf_s("%d", &n);
FillPtr(arr, n);
}
А зачем ты 1 раз и потом еще n раз малочишь арр?
Найс, поставил эту вашу макабукоду.
#include <stdio.h>
#include <malloc.h>
void FillPtr(int arr, int n)
{
arr = (int)malloc(n sizeof(int));
for(int i = 0 ; i < n; i++)
{
arr = (int)malloc(n sizeof(int));
}
}
int main()
{
int arr;
int n;
scanf_s("%d", &n);
FillPtr(arr, n);
}
А теперь собственно ошибка вылезает на этом моменте
for(i = 1;i < rows;i++)
{
if(ar[0] < (звезда)ptrs[i-1])
{
ptrs[i-1] = &ar[0];
ptrs = &ar[i-1][0];
}
if(ar[0] > (звезда)ptrs[i-1])
continue;
}
Да снова нормально не скопировалось
Короче ебал его рот, вот pastebin, проблема в цикле, внутри функции
https://pastebin.com/MNku6ski
А сама цель:
указатель 0 = &элемент обычного двумерного массива 0 0
Как пример:
Обычный массив: c b a d f
Массив указателей: 0 1 2 34
if(b < 0) в данном случае меньше
{
0 = &b;
1 = &c;
}
То есть сортировка строк из двумерного массива в алфавитном порядке без изменения исходного массива.
> Я сходу могу назвать новый проект на сишке - janus-gateway. Как раз щас с ним разбираюсь.
Ну да, писать на Сишке можно и сейчас, но нахуя? Этот проект по описанию просто идеален для Go или Rust, а они, поди, решили, что без языка 50-летней давности им ощущения не те.
> На самом деле сишники охуенно востребованы. С оговоркой: сишные боги.
Может где и востребованы, а в наших ебенях (ДС, то есть) сишный мидл получает 70к, а гошный - 140, при гораздо менее мозгоебной и более перспективной работе последнего.
> Тут ты тоже не прав, поскольку Си это один из основных языков для расширений, а плюсы тут плохо стыкуются, и реально много пишут на Си, без плюсов.
Нормально они стыкуются, в них встроена совместимость с Си в обе стороны. То, что интерфейсы библиотек принято описывать сишным хидером не значит, что в новых проектах следует использовать ебанутый язык, в котором типовые структуры данных каждый раз приходится изобретать заново.
> По-моему ты гонишь, не может компилятор в таком случае выкинуть код. UB значит, что результат может быть любым, условно ты можешь получить число по модулю, а можешь 0.
Нет, не гоню. Сам посмотри вот эту статью: https://dspace.mit.edu/bitstream/handle/1721.1/86949/Kaashoek_Undefined behavior.pdf - суть в том, что Си (а с ним и Си++) может удалить вообще весь код, который сам по себе может привести к UB. В том числе проверки, этот UB предотвращающие! Учитывая, что в стандарте Си UB упоминается больше 500 раз, язык этот стоит воспринимать как язык ковбоев, ищущих острых ощущений в области седалища.
>>08040
Ага, а вот и ковбой Горбатой горы подоспел. Я тебе напомню, что платформы, в которых числа не представлены в виде two's complement, устарели ещё до твоего рождения, и с тех пор весь дрочь на оптимизацию при помощи UB идёт строго в убыток. Но ты-то на Си не пишешь, а только пиздишь, так что убеждать тебя в чем-то бесперспективно. Пару раз проведешь неделю овертаймов в поиске ебанутых UB - поумнеешь.
>>08091
Дело-то в том, что в Си переполнения действительно UB. Вот пидорок выше правильно пишет, что есть в компиляторах флаги, переводящие некоторые UB в implementation defined. В этом и дело - ты приличный человек и предполагаешь, что и Си проектировали приличные люди. А они уёбки, понатыкавшие в языке сотни ждущих своего часа мин. И всё ради 10% производительности в 10% микробенчмарков. Казалось бы, студенческого уровня косяк - ради пары процентов скорости сломать программу - а оказывается, там целый комитет старых гондонов сидит, стандарты пишет.
> Я сходу могу назвать новый проект на сишке - janus-gateway. Как раз щас с ним разбираюсь.
Ну да, писать на Сишке можно и сейчас, но нахуя? Этот проект по описанию просто идеален для Go или Rust, а они, поди, решили, что без языка 50-летней давности им ощущения не те.
> На самом деле сишники охуенно востребованы. С оговоркой: сишные боги.
Может где и востребованы, а в наших ебенях (ДС, то есть) сишный мидл получает 70к, а гошный - 140, при гораздо менее мозгоебной и более перспективной работе последнего.
> Тут ты тоже не прав, поскольку Си это один из основных языков для расширений, а плюсы тут плохо стыкуются, и реально много пишут на Си, без плюсов.
Нормально они стыкуются, в них встроена совместимость с Си в обе стороны. То, что интерфейсы библиотек принято описывать сишным хидером не значит, что в новых проектах следует использовать ебанутый язык, в котором типовые структуры данных каждый раз приходится изобретать заново.
> По-моему ты гонишь, не может компилятор в таком случае выкинуть код. UB значит, что результат может быть любым, условно ты можешь получить число по модулю, а можешь 0.
Нет, не гоню. Сам посмотри вот эту статью: https://dspace.mit.edu/bitstream/handle/1721.1/86949/Kaashoek_Undefined behavior.pdf - суть в том, что Си (а с ним и Си++) может удалить вообще весь код, который сам по себе может привести к UB. В том числе проверки, этот UB предотвращающие! Учитывая, что в стандарте Си UB упоминается больше 500 раз, язык этот стоит воспринимать как язык ковбоев, ищущих острых ощущений в области седалища.
>>08040
Ага, а вот и ковбой Горбатой горы подоспел. Я тебе напомню, что платформы, в которых числа не представлены в виде two's complement, устарели ещё до твоего рождения, и с тех пор весь дрочь на оптимизацию при помощи UB идёт строго в убыток. Но ты-то на Си не пишешь, а только пиздишь, так что убеждать тебя в чем-то бесперспективно. Пару раз проведешь неделю овертаймов в поиске ебанутых UB - поумнеешь.
>>08091
Дело-то в том, что в Си переполнения действительно UB. Вот пидорок выше правильно пишет, что есть в компиляторах флаги, переводящие некоторые UB в implementation defined. В этом и дело - ты приличный человек и предполагаешь, что и Си проектировали приличные люди. А они уёбки, понатыкавшие в языке сотни ждущих своего часа мин. И всё ради 10% производительности в 10% микробенчмарков. Казалось бы, студенческого уровня косяк - ради пары процентов скорости сломать программу - а оказывается, там целый комитет старых гондонов сидит, стандарты пишет.
Хуя тебе печет от сишки
> Этот проект по описанию просто идеален для Go
Сборка мусора вызовет непредсказуемые задержки в передаче видео. Я хоть и обеими руками за гошечку для микросервисов, но тут она явно не к месту. Для своего сервера я выбрал сишку именно по этой причине.
> Rust
Уже лучше, но слишком сырой слишком для продакшна как по мне.
> Может где и востребованы, а в наших ебенях (ДС, то есть) сишный мидл получает 70к
Я же написал: сишные боги. В яндексе/мейле/етц топовый сишник стартует с 200k и идет дальше. Это я тебе как экс-яндексоид говорю.
Топовый пхпшник лол сука тоже с 200к стартует, только он вообще не ебет что такое память, потоки, процессы и так далее, тупо пишет дтохи, контроллеры, говносервисы да говновалидацию да в базу лазает.
Кому что, многим ебать байты не уперлось, а вот писать бизнес логику на пыхе норм. Совершенно разные задачи.
Очевидно что этим людям нужно сидеть в пхп треде, а не расказывать нам как им неинтересна сишка
Так речь вообще о другом шла.
Я ничего не знаю о рынке пхпшников, но мне кажется что топовый должен как раз знать сишку, чтобы фиксить ядро этого говна. Имхо, за пхп можно получать столько только если удачно примазаться на старте и сидеть сеньером в техкомитете, либо работая на западного барина. Кто вообще наймет пхпшника-онли с улицы за что-то большее 100к?
> Кто вообще наймет пхпшника-онли с улицы за что-то большее 100к?
Любая крупная компания у которой есть бэк на пыхе?
Не, ты не понял мой вопрос. Допустим, в компании есть бек на пыхе. Зачем компании нанимать пыхомакаку за зарплату больше миски риса, если кроме пыха она ничего не умеет?
В яндексе есть racktables, который написан на пыхе. Соответственно, есть несколько человек, которые его поддерживают. Так вот у них у всех кроме пыха еще пяток языков в запасе, и пых далеко не основной. Зарплата соответствующая.
Ну а нахуй компании, у которой кроме пыхи и гошки на бэке нихуя нет, нанимать такого спеца?
> Зачем компании нанимать пыхомакаку за зарплату больше миски риса
Потому что нормальный бэкендер не пойдет работать за миску риса.
> если кроме пыха она ничего не умеет?
А что он должен уметь еще? Ну само собой он может в БД, брокеры, кеши, куберы и прочее, ведь он бэкенд разработчик. Зачем ему знать 5 языков? каждый одинаково хуево
У вас сишников своя реальность где 200к деньжища?
Нормальный бекендер будет знать не только пых.
> У вас сишников своя реальность где 200к деньжища?
Я тебе просто пример привел. Сишник, работающий на западного барина, поднимает гораздо больше. Но таких сишников нужно ограниченное количество.
> Нормальный бекендер будет знать не только пых.
Ну будет знать пыху + го или пыху + питон/ноду, зачем ему 5 языков?
Или SQL, HTML и прочее тоже идет в счет?
> Сишник, работающий на западного барина, поднимает гораздо больше.
Кто угодно получает больше на западном рынке.
Ща тебе нонейм с двача пояснит, что твой опыт не опыт, а сам ты сисадмин, если не знаешь... делаем ставки чего. Я бы поставил на кложу/элексир. Или раст.
>>08482
Господа, чтобы сразу не было ко мне претензий. Я сужу с позиции большого тырпрайза, поскольку работал в основном именно там, пока не ушел на вольные хлеба.
Ситуаций может быть много. Первая - когда сидит команда и пилит не конкретный сервис, а инфраструктуру. Поскольку опенсорс в чистом виде обычно слабо подходит для использования, поэтом его допиливают и поддерживают по месту. Один сервис на пхп, другой на питоне, третий - на гошечке, а сбоку крутится какой-нибудь четвертый, на ноде. Потом оказывается, что что-нибудь не справляется с нагрузкой и это кусками переписывается на си или плюсах. Как правило, все члены команды знают все перечисленные языки. Плюс, некоторые являются адептами чего-нибудь экзотического, типа M4. SQL и прочее за языки не считается, это должно быть само собой разумеющееся.
Опция два. Сидят ядерщики и пишут какие-то ядерные модули на сях. Стоят дорого.
Опция три. Программиста берут на конкретный проект. Обычно он знает полтора языка, нужных проекту. Платят ему не очень много.
Что до моего личного определения "нормального бекендера" - это человек, который не только может что-то писать на каком-то языке, но понимает еще и тонкости оптимизации, сеть, ось и умеет в архитектуру. При необходимости может пойти и попатчить ядро или любой опенсорс, чтобы решить свою локальную проблему.
Да ну бросьте оба. Я же не фанбой отбитый. Просто пересказываю то, что видел сам. Просто если чел не может докопаться до глубинной проблемы, связанной с интерпретатором того же пыха, то что он будет делать? Заведет тикет на гитхабе что ли? Будет по форумам ходить?
Проблемы, которые приходится решать в больших проектах, обычно относятся к классу "я погуглил, но нашел только свой собственный вопрос на SO".
Я не говорю, что PHP+SQL+JS-онли ребята не нужны. Нужны, конечно. Просто получают они меньше чем тот класс, который я привел в первой опции.
> Просто если чел не может докопаться до глубинной проблемы, связанной с интерпретатором того же пыха
Тут вообще орнул, как часто ты лезешь чинить интерпретатор? Так и вижу как e-commerce или банк пишет патчи для интерпретатора пыхи, там большинство кодеров пишут на жабе или пхп и никогда подобным не занимались, а зп могут быть вполне норм.
> Я не говорю, что PHP+SQL+JS-онли ребята не нужны. Нужны, конечно. Просто получают они меньше чем тот класс, который я привел в первой опции.
Ну 200к они легко получают, про работу на запад за доллары я вообще молчу.
> как часто ты лезешь чинить интерпретатор?
PHP не чинил ни разу, так как не пишу на нем. Раза три чинил питон, и за последний год нашел несколько багов в ядре, которые аффектят юзерспейс. Один из них весьма древний.
Ты наглухо ебанутый и оторванный от реальности как будто, если 200к для тебя деньги, то их получают, 300к тимлиды тоже получают, тупо за крудошлепские сервисы с пыхой да симфони, да там кафка, кубернетес и прочая хуйня, но сам язык там пхп и другой язык там не нужен, никакой интерпретатор там никто не дописывает. На джаваскрипте так же, никто лезть в v8 не будет переписывать, а пишут бэк там вчерашние формошлепы фронтендеры, еще хуже чем на пхп в плане архитектуры.
Джава мир вообще в себя погружен, если в пхп мире еще го стал популярен где пыха говно, так джава в принципе в вебе все может делать кроме ебанутого числодробления наверное. Джава тимлид в крупной компании в ДС получает за свой говноспринг 300-400к.
На запад же можно как бы и вордпресс говно за 3к баксов в мес делать, можно и за 7к в мес говноконсумеры на ноде к кафке приделывать. Без какого либо там си, FFI, JNI и так далее
>Раза три чинил питон, и за последний год нашел несколько багов в ядре, которые аффектят юзерспейс
У меня есть знакомый питонист, не знает как в питоне gc работает, получает 200к.
Глаза разуй, еблан. Я тебе сказал, что СИШНИК получат ОТ 200к. Поскольку сумма обсуждается в рублях, то речь, очевидно, идет о рашке.
Ну, всякое бывает. Речь изначально шла о том, что сишка дает преимущества в работае и позволяет поднять себе ценник.
Так ты же про толкового и в крупной компании, пока таким станешь уже седым станешь.
>и позволяет поднять себе ценник.
Очень сомнительно, если проект байтоебский то да. А когда ты пишешь условный маркетплейс, банкинг или агрегатор какой нибудь хуйни, то это вообще непонятно зачем нужно.
Ну почему же. Знаю челика, ему 35. Работает в яндексе, в основном хуярит ядро, по мелочи пишет на питоне и гошечке. Стоит дорого.
Толковость появляется от опыта работы. Если годами json`ы перекладывать, то понятно, можно до седых мудей таким не стать. Если вписаться в технически сложный проект и не сидеть в нем до скончания времен, то опыт и наберется.
А тут уже вопрос, чем именно ты хочешь заниматься. Если маркетплейсами - то да, необходимость почти нулевая. А если какой-нибудь сверхвысокий асинхронный хайлоад (r) (c) (tm), то там это нужно. Деньги уже другие, разумеется. Полмиллиона и выше.
Ты скозал, манька?
пойду дальше другие срачи посмотрю
хочу подключить <xxxxxx> вот так через <>
как в codeblocks или в терминале єто делать?
>Что до моего личного определения "нормального бекендера" - это человек, который не только может что-то писать на каком-то языке, но понимает еще и тонкости оптимизации, сеть, ось и умеет в архитектуру. При необходимости может пойти и попатчить ядро или любой опенсорс, чтобы решить свою локальную проблему.
Ты таких ИРЛ вообще встречал хоть раз?
Да
Причем без шуток. Знакомый погромист и либы чужие патчил, когда находил дефекты в них, и архитектурой занимался, оптимизацией производительности, а сам по себе мастер по написанию кода для бэкэнда.
Да. Работал с такими челиками в разных командах. Как правило после рашкинских компаний они перекатываются куда-то в более интересные места. Например, челик со знанием сей, плюсов, питона и тонкостей сетей (плюс цисок, жуниперов и хуевеев) укатился в спейсикс. Другой челик с таким же набором - в фейсбук. Родственник мой пилил распределенные системы. Ну и я тоже, т.к. работал в упомянутых командах. Я в сетях особо не разбираюсь, но у меня прокачан скилл проектирования архитектуры и распределенных систем. Укатился в свой софтово-железячный стартап.
https://pastebin.com/FnRrs2tn
Перемешивает биты в числе особым образом, чтобы вышло число с симметрией относительно центра? Хуй знает, запутанный обмен, лень разбираться больше 5 минут, такое прямо в IOCCC отправлять после должной доработки, лол.
Разобрался
Мне кажется, что такой подход был уместен, когда были архитектуры условно 16-битные и 15-битные, 32-битные и 27-битные, двоичные и экспериментальные троичные.
Но когда на ПК int 32-битный, а на ардуине 16-битный и алгоритм перестаёт работать, то это плохо.
Да, такой подход не уместен, он единственно возможен, ибо других не может быть.
Посмотри на пики. Есть два робота, большой и маленький, и язык программирования роботов. Ты пишешь команду:
>сделать_шаг();
В результате, оба робота должны одинаково сделать шаг, и похуй что первый робот выполнит поставленную задачу - раздавить вон того тупого еблана вроде тебя слева, а второй шагнет на пару сантиметров и ничего не добьется. Это нормально, так и должно быть. А вот игнорировать спецификации роботов и хотеть чтобы любой робот одной командой выполнял одинаковую задачу, т.е. одной командой первый робот просто делает шаг, а второй разбегается, подпрыгивает, достает нож и втыкает его в шею цели, т.к. весом убить еблана не может, зато задача выполнена. Такая поебень - не программирование, и никому не нужна, кроме тупых ебланов, которых надо вычистить как вредные органические отходы, заражающие планету.
Бред. Современный мир омонополен несколькими крупными производителями микроэлектроники и все они двоичные, а их регистры в большинстве своём кратны восьми и являются степенью двойки. И очевидно, что каждое 32-битное число, когда к нему добавляется 1 должно либо увеличено на единицу, либо переполнено и обнулено. А когда один и тот же тип ведёт себя как сумасшедший на разных машинах, это очень плохо. Представь, написал ты машине variable++, а она вместо того, чтобы увеличить значения на единицу, вызывает rm -rf /*. Нарушаются все принципы, которые только можно.
Зачем вообще в таком случае программировать на сижке, если можно сразу на ассемблере? Там и изучения спецификации машин, и библиотеки можно оптимизировать под готовые инструкции. В одной машине не будет инструкции для синуса и придётся функцией посчитать. А в другой будет, но значение плюс-минус 0.1, ещё и рандомное каждый раз, потому что считается через аналоговую электронику. Вот будет веселье программисту! Все графические и физические движки будет переписывать на ассемблер. Настоящее программирование, как положено настоящему мужику!
Я не мужик, так что я такое не выбираю. Мои алгоритмы должны работать одинаково на всех машинах. Чтобы один и тот же код можно было запустить хоть на ПК, хоть на микроконтроллере и он исполнился правильно.
И, даже, на разных типах, для чего в современных языках программирования есть дженерики и темплейты (сишные макросы до них не дорастут).
То, что ты описал не нужно нормальным людям, но я не считаю, что вас надо уничтожать. У вас есть право на своё мнение и вы можете заниматься байтоёбством сколько хотите.
Хотя, действительно, есть ряд задач, где можно типы сделать не совсем ясными. Например, флоат для 3D-графики. Не всегда важно, будет single или double считаться в шейдере, потому что в большинстве программ отображение графики будет почти одинаковым. Ну, может цвета пикселей или их расположение будет немного другим. В таком случае уместно вводить отдельный тип, который может себя вести как халф, сингл или дабл.
Бред. Современный мир омонополен несколькими крупными производителями микроэлектроники и все они двоичные, а их регистры в большинстве своём кратны восьми и являются степенью двойки. И очевидно, что каждое 32-битное число, когда к нему добавляется 1 должно либо увеличено на единицу, либо переполнено и обнулено. А когда один и тот же тип ведёт себя как сумасшедший на разных машинах, это очень плохо. Представь, написал ты машине variable++, а она вместо того, чтобы увеличить значения на единицу, вызывает rm -rf /*. Нарушаются все принципы, которые только можно.
Зачем вообще в таком случае программировать на сижке, если можно сразу на ассемблере? Там и изучения спецификации машин, и библиотеки можно оптимизировать под готовые инструкции. В одной машине не будет инструкции для синуса и придётся функцией посчитать. А в другой будет, но значение плюс-минус 0.1, ещё и рандомное каждый раз, потому что считается через аналоговую электронику. Вот будет веселье программисту! Все графические и физические движки будет переписывать на ассемблер. Настоящее программирование, как положено настоящему мужику!
Я не мужик, так что я такое не выбираю. Мои алгоритмы должны работать одинаково на всех машинах. Чтобы один и тот же код можно было запустить хоть на ПК, хоть на микроконтроллере и он исполнился правильно.
И, даже, на разных типах, для чего в современных языках программирования есть дженерики и темплейты (сишные макросы до них не дорастут).
То, что ты описал не нужно нормальным людям, но я не считаю, что вас надо уничтожать. У вас есть право на своё мнение и вы можете заниматься байтоёбством сколько хотите.
Хотя, действительно, есть ряд задач, где можно типы сделать не совсем ясными. Например, флоат для 3D-графики. Не всегда важно, будет single или double считаться в шейдере, потому что в большинстве программ отображение графики будет почти одинаковым. Ну, может цвета пикселей или их расположение будет немного другим. В таком случае уместно вводить отдельный тип, который может себя вести как халф, сингл или дабл.
>Бред
Ридинг компрехенсион скрипто-дебила. Катись обратно в свои скриптотреды, там давно типы все одинаковые. Зачем сюда, в программирование лезешь? А понимаешь, что выродок, подсознательно понимаешь, что тут умные люди, не чета таким как ты, вот и пытаешься примазаться. Но это бесполезно, говно не умеет ничего кроме как срать, лучше от этого не станешь.
>Мои алгоритмы
Си - язык программирования железа, а не алгоритмическая параша для первоклашек и сходных с ними по интеллекту дегенератов.
Езе раз: СИ - НЕ АЛГОРИТМИЧЕСКАЯ ПАРАША. Ферштейн?
> Бред. Современный мир омонополен несколькими крупными производителями микроэлектроники и все они двоичные, а их регистры в большинстве своём кратны восьми и являются степенью двойки. И очевидно, что каждое 32-битное число, когда к нему добавляется 1 должно либо увеличено на единицу, либо переполнено и обнулено. А когда один и тот же тип ведёт себя как сумасшедший на разных машинах, это очень плохо.
А прям много таких машин где int ведёт себя как сумасшедший?
> Представь, написал ты машине variable++, а она вместо того, чтобы увеличить значения на единицу, вызывает rm -rf /*. Нарушаются все принципы, которые только можно.
Поехавший пример однако.
> Зачем вообще в таком случае программировать на сижке, если можно сразу на ассемблере?
Лучше сразу на сигаре.
> Там и изучения спецификации машин, и библиотеки можно оптимизировать под готовые инструкции. В одной машине не будет инструкции для синуса и придётся функцией посчитать. А в другой будет, но значение плюс-минус 0.1, ещё и рандомное каждый раз, потому что считается через аналоговую электронику. Вот будет веселье программисту! Все графические и физические движки будет переписывать на ассемблер. Настоящее программирование, как положено настоящему мужику!
Чтоб такой хуйни не было и пилят более комплексные языки программирования.
А если какая-то функция на железке неадекватная, и не ведёт себя так как на другом железе - ее выносят в specific функционал, и делают реализацию чтобы вело оно себя так как и везде.
> Я не мужик, так что я такое не выбираю. Мои алгоритмы должны работать одинаково на всех машинах. Чтобы один и тот же код можно было запустить хоть на ПК, хоть на микроконтроллере и он исполнился правильно.
Замечу ты это про предыдущий абзац, а там сказано тобой же про ассемблер. А где собственно Си тут?
> И, даже, на разных типах, для чего в современных языках программирования есть дженерики и темплейты (сишные макросы до них не дорастут).
Не понял к чему это тут.
> То, что ты описал не нужно нормальным людям, но я не считаю, что вас надо уничтожать. У вас есть право на своё мнение и вы можете заниматься байтоёбством сколько хотите.
Да ты поехавший. Привел в пример ассемблер. И рассказывает что мы какие-то не такие.
> Хотя, действительно, есть ряд задач, где можно типы сделать не совсем ясными. Например, флоат для 3D-графики. Не всегда важно, будет single или double считаться в шейдере, потому что в большинстве программ отображение графики будет почти одинаковым. Ну, может цвета пикселей или их расположение будет немного другим. В таком случае уместно вводить отдельный тип, который может себя вести как халф, сингл или дабл.
Вообще разница есть между float и double в графике. Как минимум в производительности, и в точности. Особенно когда считаешь геометрию. Или сраное сглаживание.
> Бред. Современный мир омонополен несколькими крупными производителями микроэлектроники и все они двоичные, а их регистры в большинстве своём кратны восьми и являются степенью двойки. И очевидно, что каждое 32-битное число, когда к нему добавляется 1 должно либо увеличено на единицу, либо переполнено и обнулено. А когда один и тот же тип ведёт себя как сумасшедший на разных машинах, это очень плохо.
А прям много таких машин где int ведёт себя как сумасшедший?
> Представь, написал ты машине variable++, а она вместо того, чтобы увеличить значения на единицу, вызывает rm -rf /*. Нарушаются все принципы, которые только можно.
Поехавший пример однако.
> Зачем вообще в таком случае программировать на сижке, если можно сразу на ассемблере?
Лучше сразу на сигаре.
> Там и изучения спецификации машин, и библиотеки можно оптимизировать под готовые инструкции. В одной машине не будет инструкции для синуса и придётся функцией посчитать. А в другой будет, но значение плюс-минус 0.1, ещё и рандомное каждый раз, потому что считается через аналоговую электронику. Вот будет веселье программисту! Все графические и физические движки будет переписывать на ассемблер. Настоящее программирование, как положено настоящему мужику!
Чтоб такой хуйни не было и пилят более комплексные языки программирования.
А если какая-то функция на железке неадекватная, и не ведёт себя так как на другом железе - ее выносят в specific функционал, и делают реализацию чтобы вело оно себя так как и везде.
> Я не мужик, так что я такое не выбираю. Мои алгоритмы должны работать одинаково на всех машинах. Чтобы один и тот же код можно было запустить хоть на ПК, хоть на микроконтроллере и он исполнился правильно.
Замечу ты это про предыдущий абзац, а там сказано тобой же про ассемблер. А где собственно Си тут?
> И, даже, на разных типах, для чего в современных языках программирования есть дженерики и темплейты (сишные макросы до них не дорастут).
Не понял к чему это тут.
> То, что ты описал не нужно нормальным людям, но я не считаю, что вас надо уничтожать. У вас есть право на своё мнение и вы можете заниматься байтоёбством сколько хотите.
Да ты поехавший. Привел в пример ассемблер. И рассказывает что мы какие-то не такие.
> Хотя, действительно, есть ряд задач, где можно типы сделать не совсем ясными. Например, флоат для 3D-графики. Не всегда важно, будет single или double считаться в шейдере, потому что в большинстве программ отображение графики будет почти одинаковым. Ну, может цвета пикселей или их расположение будет немного другим. В таком случае уместно вводить отдельный тип, который может себя вести как халф, сингл или дабл.
Вообще разница есть между float и double в графике. Как минимум в производительности, и в точности. Особенно когда считаешь геометрию. Или сраное сглаживание.
Тебе стандарт и традиция гарантируют для инта +-32767. Если ты знаешь, что в алгоритме нужен больший диапазон, не используй инт. И тогда не будет никакого "перестает работать".
Гораздо опасней существование в языке unsigned.
В си нет двумерных массивов в полноценном смысле (например вида [ , ])
Так что по сути у тебя массив массивов.
Я знаю. Функция по сигнатуре принимает переменную хранящую указатель на указатель. Но поему-то в качестве аргумента можно просто прописать указатель на строку и он запишется в локальный массив указателей на указатели т.е в двумерный массив функции. По-моему это какая-то очень неочевидная хуйня.
Короче в качестве аргумента был передан одномерный массив, но поему то он автоматически был записан в первую строку локального двумерного.
братишь, занимаешься графикой?
ты какой-то обиженка
есть железо, есть алгоритмы - в чем проблема? Одно без другого - как ручка без чернил (ну или чернила без ручки)
Нам как фронтендеры нужны с их красивыми сайтиками, или питонисты с их джанко и мл
так и хардварники с их управлением памятью, оптимизацией и прочим
выпей уже таблеток, а?
Скорее всего он имеет в виду, что при декременте оно не может уйти в отрицательные числа и вызовет где-нибудь переполнение.
Вообще было бы здорово иметь возможность отлавливать такое, как с делением на ноль.
И даже для машины subb, subd, subl и subq это разные инструкции, работающие с соотвествующим размером.
>Скорее всего он имеет в виду, что при декременте оно не может уйти в отрицательные числа и вызовет где-нибудь переполнение.
Ровным счётом та же проблема с signed.
ХЗ, давно не писал на Си, но вроде как хорошим тоном считается использовать int32_t/uint32_t
Не знаю как объяснить попроще, но это не массив указателей, там нет индирекции
https://nullprogram.com/blog/2016/10/27/
Без ассемблера возможно понять?
-1 > 2u
>>12424
>Поясняю: пикрил 1 - опасно; пикрил 2 - безопасно.
И первое, и второе - опасно, если воткнуть в анус.
f(i) { if (i+1<0) puts("f"); }
g(i) { if (i<0) puts("g"); }
main()
{
f(0x7fffffff);
g(0x7fffffff+1);
}
Тем что это UB (undefined behaviour) то есть компилятор может считать что ты написал некорректный код и выкинуть его или поменять на другой. Хуже того, вся программа считается UB.
>Тем что это UB (undefined behaviour)
А где здесь ЮБ? Если сегментация не нарушается, а переполнение только-только зажигает OF и сама память меняет значение с TYPE_MAX на TYPE_MIN (и наоборот). Я конечно понимаю, что такое посредственно может вызвать перезапись буффера (например записать 0х7ff байт вместо одного), но эта проблема вроде как отдельно решается.
>то есть компилятор может считать что ты написал некорректный код и выкинуть его или поменять на другой.
Это как? Конпелятор будет предугадывать или даже вычислять, что там случится в рантайме? Меня траллируют, да?
UB в ящыке Си, никаких О флагов в языке не существует. Это не ассемблер.
Конпелятор делает оптимизации, которые меняют поведение кода в случае переполнений.
Вот это
> if (i+1<0)
может заменить на
> if (i < -1)
сэкономив одну инструкцию.
Подставь maxint на место i. Первый иф будет истина, второй ложь.
Обыкновенно. Включи голову: int не отлавливает переполнение, значит что нужно сделать? Нуууу!? Конечно же написать свой manyaint который будет отлавливать. Ты программист или кто? Кто еще за тебя будет программировать твои маняхотелки, кроме тебя самого? Язык имеет все средства для реализации чего угодно, так что вперед и с песней.
Бля, охуительная история. Я думал ты что-нибудь умное расскажешь, а ты предложил навернуть абстракцию поверх обычной переменной.
>дайте мне абстракцию, мам
>ну на, держи
>бля, охуительные истории, абстракцию предлагают
С дефектами мышления в программировании делать нечего.
Кстати да, есть вероятность что он передает внутрь строку указателем из .data, из-за этого ловит сегфолт.
Где ты в моем сообщении увидел слово "абстракция", клоун?
> С дефектами мышления в программировании делать нечего
Вот именно, пиздуй из профессии. Мало ли что ты там увидишь в следующий раз в коде, вдруг тебе послание с нибиру мерещиться начнет.
компилятор поменяй
Ну, дебилом бы я тебя не назвал. Просто не очень умный.
Читай что такое динамическое выделение памяти, а конкретно calloc.
Stephen Prata, C Primer Plus
Chapter 11: Character Strings and String Functions
Досконально раздраконена тема, просто досконально. Прочитай и все вопросы про массивы/ссылки/строки отпадут начисто.
Вопрос тупой, и мне заранее стыдно, но не у кого спросить.
Смотрю на сорс моей любимой игрули детства:
https://github.com/videogamepreservation/descent
ГДЕ ТОЧКА ВХОДА?
Типа main.c или что-то такое?
>>11951
https://github.com/sgreenlee/C-Primer-Plus-Exercises/blob/master/ch12/exercise09.c
Самое странное что всё прекрасно передаётся (одномерный массив в качестве двумерного в find_word).
To build the executable, you should be able to just run maked1.bat.
Descentr.exe should be built in the main subdirectory.
Да, вывод получается очень медленный, но зато кодить просто - для начального нубоуровня сойдет.
>MiniLibX
Всегда удивляло, откуда берут такое васянское говнище (поддерживает даже BSD! ебать) без нормальной документации, сделанное на коленке даунами, которое даже скомпилироваться не может нормально?
> Вот это говнокод, пиздец
Вся суть. Раньше писали крутые игры, а теперь пишут красивый код и дрочат на историю комитов, на тесты, на линтеры... что угодно, только бы не заниматься делом.
Можно писать красивый код и не дрочить на коммиты. Лично я обмазываюсь линтерами из параноидальных соображений.
Закодил змейку. Пипец сложновато. Ели кто хочет оценить уровень говнокода, то архив с бинарниками и исходниками прилагаю в картинке.
Раньше каритнку и архив склеивали просто вместе. Но сейчас хитрый Абу что то там нашатал и теперь его макаба вырезает все архивы у раржипегов. Сейчас надо разобраться в структуре формата джипег или пнг, покурить документацию, и встраивать архивы в подходящие для этого места внутри файла. Я так сделол.
Ах тыж вредоносный анон
Хочу Borland C/С++ IDE настроить на win10.
Какие варианты? Вроде нагуглил сборку от Раджеша Шрияпутры, но хуй я позволю этому говну ступить на мой пека.
Пиздос какие страшные куклы!
https://pastebin.com/etpP4MdD
По одному очень долго и много.
heater_plates_t heaters;
heaters.plate[0].profile[0].id = 1; // например
Не пойму, как присобавить заполнение, как у массива структур:
temp_profile_t heater[] = { // массив структур
{0, "Profile 1", true, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0},
1, "Profile 2", true, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0},
2, "Profile 3", true, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0},
3, "Profile 4", true, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0},
4, "Profile 5", true, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}
},
{0, "Profile 1", true, {0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},
1, "Profile 2", true, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0},
2, "Profile 3", true, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0},
3, "Profile 4", true, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0},
4, "Profile 5", true, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0}
},
};
(type){ initializer }, зовется compound literal.
> По одному очень долго и много.
Сделай функцию.
>>18898
Возвращать нельзя только массивы, являющиеся автоматическими переменными. Т.е., которые лежат в стеке, и которые нельзя возвратить по значению из-за того, что в выражениях (в том числе и в return) массив деградирует до указателя. Например, если обернуть в структуру, то уже можно.
>>19194
> кто-то ещё остался
Мне кажется, что тред себя исчерпал или вся борда?. Но кое-кто остался, и они иногда еще отвечают.
Функцию инициализации напиши. Все равно понадобится если будет увеличение объема данных или например будешь их грузить из файла.
Вимп.
УК РФ
1. for(int i = SIZE; i; i--)
2. for(int i = 0; i < SIZE; i++)
3. for(int i = 1; i <= SIZE; i++)
4. for(int i = 1; i < SIZE + 1; i++)
+ unrolling от 8-и шагов дает прирост ощутимый
Деды вообще документаций не писали и ничего не оставляли кроме пары комментариев. Хочешь пользоваться? Сам правь исходники и исправляй ошибки. Иначе как все развиваться будет то, если до тебя все было написано, тут значит идеальная ситуация.
int i; пиши в начале функции, это сэкономит время на выделение регистра!
В 1980-м, да. Если сегодня, то смотри выдачу компилятора, удивишься.
Обратный цикл всегда быстрее будет. Так как меньше затрат на вычисление переменной i.
Нет, избавиться от глобалки не могу, используется везде, я умру бегать по куче файлов\функций передавая одну переменную
Код в студию.
Прагма тут вообще не при чем: что с ней, что с ifdef'ами у него глобалка объявляется в каждом .c-файле, включающем хедер.
Тут скорее интереснее, каким образом на маке "всио собиралось".
Где почитать как более менее нормально программировать?
Каждый раз настроение от этой хуйни падает.
Там сложно
Ну сравнить одно число с другим и определить какое больше это две разные операции, мне кажется четкое сравнение быстрее будет, чем побитовое решение где больше, а где меньше, хотя хз
> Почему у меня каждый раз полукаются макароны из функций?
Большие функции или много маленьких?
> Где почитать как более менее нормально программировать?
Ядро bsd, linux.
Когда хочу добавить новый функционал, то не могу просто написать все в новую функцию, приходится редактировать старые функции тоже. Получается все размазанно по всей программе и добавлять новый код все сложней и запутанней.
Это все придет с опытом, без этого никак. А вообще, читай "Чистый код", "совершенный код" и тому подобное. Принцип SOLID. Язык Си конечно низкоуровневый и не очень выразительный, поэтому провоцирует слишком закапываться в детали реализации - в других языках там бы просто гонялись объекты взад вперед, а каждая функция занималась только своей маленькой задачей.
Рассматривай каждую функцию как один маленький модуль.
С нулевой зависимостью от макросов, глобальных переменных. Здесь лучше расширять интерфейс, нежели увеличивать зависимость от ебеней. На нижнем уровне пишешь из таких вот функций, на верхнем - из больших процедур.
Особо не надеюсь, но может кто то подскажет название. Читал в сосничестве около десятка лет назад книжку. Там всякие советы по написанию кода были. Половина книжки была про Си вторая про плюсы.
Книгам место в сортире. Чтобы познать дао, надо писать и читать код ядра.
Дай ссылку на код ядра.
git clone https://github.com/username/projectname.git (получить с ГитХаба)
git init projectname (инициализировать Гит, если это новый проект, а не скопирован с ГитХаба)
git remote add origin https://github.com/username/projectname.git (связать инет адрес с origin)
git add . (поместить файлы в папке под слежку git)
git commit -m "Добавил фичу №34" (зацементировать изменения)
git push origin master (отправить на ГитХаб в определенный ранее origin) (потом вроде как можно просто git push -u)
Поставь себе терминал нормальный на Винде и гит тоже, ты как я понял через сайт все делал, там это сделано для экстренных случаев, так делать не стоит. И так в этой сфере даже минимально развиться не сможешь. Я чутка набросал команды основные, сам давно не пользовался.
git add можно без .
git init projectname создаст папку отдельную, если хочешь в этой же папке стартануть, то просто git init
А я тут посмотрел, тебе и терминал не нужен, на Винде Гит с включенным терминалом поставляется в программу саму.
Есть mit'шный курс по операционным системам на си, где нужно допиливать xv6. Хорошая штука, всем советую.
мимо
>может удалить вообще весь код, который сам по себе может привести к UB. В том числе проверки, этот UB предотвращающие!
Бля, дебилы, делают UB в "проверке", "предотвращающей" UB, компилятор удаляет "проверку"
-- РРЯЯ, конпелятор меня ненавидит!
Господа, посоветуйте атомарный инкремент/декрементдля size_t, ну чтоб переносимый. Спасибо.
Самый тупой способ - бахнуть 2 статические инлайн функции для инкремента и декремента в заголовочнике, внутри функций детектить компилятор через условную компиляцию и сделать вызов нужных builtin функций для атомарных операций из нужного компилятора. Подключаешь заголовочник - есть переносимые атомики для size_t. Как-то так.
Есть один uint32.
Как узнать, сколько всего битов в нем равны единице?
Короче говоря, нужна функция, которая бы брала аргументом uint32 и выдавала число битков в нем.
Пока что на ум приходит только простым перебором, типо 32 раза сдвигать число, проверять первый бит и если единица инкрементировать счетчик, но может есть более быстрые и рациональные способы?
>статические инлайн функции
Помню как то прогал давно на с89 и нужна была инлайн функция для быстродействия, но компилятор её не поддерживал.
Единственным способом задать инлайн функции (в том числе и с аргументами) получилось только через макрос.
__builtin_popcount и подобные
Это реально в какой то задаче понадобилось? Или это просто в универе задание со звездочкой?
Я заебался смотреть 20 минутные видосы и хуй поймёшь.
Я так и не понимаю почему иногда массив чаров я могу отправлять в функцию, а иногда выходит ошибка. Или что почитать. Или только в процессе драк с компилятором можно привыкнуть к синтаксису?
Бывает нужно если число используется как битовая маска
Например у тебя есть массив объектов, и массив uint32 который используется как маска какие объекты активны, какие нет. И тебе нужно посчитать сколько объектов активны.
И то, и то кусок памяти. Один определен в секции в исполняемом файле, а какой-то выделяется в рантайме. Разница только в выделении и освобождении(если требуется) этой памятьи.
Вполне возможно ты где-то с синтаксисом ошибся.
В некоторых протоколах минимальный контроль ошибок делается выставлением бита четности.
Братиш, а вот если я пока не пользуюсь массивами больше 100100 зачем мне динамический может ещё понадобится?
Мне вот надо передать массив в функцию и там его обозначить нулями, отправляю Статик массив если я правильно понял, но он не хочет...
#include <stdio.h>
void array_nuller(int x, char array)
{
int j;
int i;
i = 0;
j = 0;
while (++i < x)
{
while (array[++j] < x)
array[j] = 48;
array[j] = 0;
}
}
int main ()
{
int x;
x = 4;
char array[x][x];
array_nuller(x, array);
return (0);
}
main2.c:25:18: warning: incompatible integer to pointer conversion passing 'char'
to parameter of type 'char ' [-Wint-conversion]
array_nuller(x, array[x][x]);
^~~~~~~~~~~
main2.c:3:33: note: passing argument to parameter 'array' here
void array_nuller(int x, char *array)
^
1 warning generated.
}
Братиш, а вот если я пока не пользуюсь массивами больше 100100 зачем мне динамический может ещё понадобится?
Мне вот надо передать массив в функцию и там его обозначить нулями, отправляю Статик массив если я правильно понял, но он не хочет...
#include <stdio.h>
void array_nuller(int x, char array)
{
int j;
int i;
i = 0;
j = 0;
while (++i < x)
{
while (array[++j] < x)
array[j] = 48;
array[j] = 0;
}
}
int main ()
{
int x;
x = 4;
char array[x][x];
array_nuller(x, array);
return (0);
}
main2.c:25:18: warning: incompatible integer to pointer conversion passing 'char'
to parameter of type 'char ' [-Wint-conversion]
array_nuller(x, array[x][x]);
^~~~~~~~~~~
main2.c:3:33: note: passing argument to parameter 'array' here
void array_nuller(int x, char *array)
^
1 warning generated.
}
Будто я знаю зачем тебе это. Поставь себе задачу и думай как ее решить лучше.
Нихера не статик. Ты выделил на стеке. Массив внутри с массивами. Судя по всему передаешь в функцию которая ожидает чисто указатель. Что это за ерунда?
Тебе б синтаксис учить и вникать почему все так. Язык Си тупее чем ты думаешь. И думать за тебя он не будет.
Это понятно, но это обычно на ходу считается же - принимаешь каждый бит и сдвигаешь, потом в конце смотришь сошлось или нет - popcount тут не нужен.
Харкач звёздочки убрал во входных в функции
Функция Array_nuller принимает инт, и чар array
Я хочу двумерный массив забить ноликами. Чяднт?
Может в чар инт пишешь?
void array_nuller(int x, char жж array)
{
int j;
int i;
i = 0;
j = 0;
while (++i < x)
{
while (array[++j] < x)
array[j] = 48;
array[j] = 0;
}
}
int main ()
{
int x;
x = 4;
char array[x][x];
array_nuller(x, array);
return (0);
}
void array_nuller(int x, char жж array)
{
int j;
int i;
i = 0;
j = 0;
while (++i < x)
{
while (array[++j] < x)
array[j] = 48;
array[j] = 0;
}
}
int main ()
{
int x;
x = 4;
char array[x][x];
array_nuller(x, array);
return (0);
}
Это если какой нибудь уарт программируешь, а когда надо послать целиком битый пакет для проверки?
Переведи его в двоичную систему исчисления через рекурсию, либо через циклы, сложи результаты в массив, как я помню с помощью рекурсии у тебя все как надо сложится, а в цикле сам смотри как. Ну и посчитвй единицы в числе. Как пример.
>более быстрые
Если память - не проблема (не жёсткий эмбеддед), то самое быстрое будет таблица на 64к с заранее расчитываемыми при старте программы (ну или например при компиляции если кресты, или захардкодить) значениями числа битов для всех двухбайтовых чисел. Тупо берешь пару чисел по индексу верхних и нижних двух байт твоего числа и складываешь.
Ну ок, если 64к не влезет, пусть будет таблица на 256 чисел и складываем 4 числа, а не 2.
>я хочу двумерный массив забить ноликами
Не понял твоего кода вообще, но вот решение.
https://pastebin.com/UQk0xYtR - вот версия, где указатели скрыты синтаксическим сахаром в виде доступа к элементам через индексы массива, по сути там только указатель передается в функцию, и мы просто скрываем указательную арифметику.
https://pastebin.com/AAPzDuXt - вот версия с чистыми указателями, в ассемблерном выхлопе и то и другое идентично будет.
Это VLA (Variable Length Array), если хочешь попроще то просто замени ptr[][side] на ptr[][4], но потеряется гибкость и тебе все равно придется передавать side как формальный аргумент, так что смысла в этом мало.
>array[++j] < x
могу ошибиться, но ты сравниваешь адрес с интежером. о чем тебе и вопит конпелятор
Vec v = (...)
Data data = inv (v, get, 1)
превращался в
Data data = Vec__get(v, 1)
Поковырялся с _Generic, но там вообще странное мутное говнище получается.
Спасибо.
Имя типа по объекту, насколько я понимаю, можно только в С++ получить. Хотя возможно gcc предоставляет какой-то спрятанный builtin_type_name для C. Но в документации пусто об этом.
Остальное вроде не проблема, по типу VA_ARGS с двумя подчеркиваниями в начале и в конце, указатель на объект кидать первым аргументом во все функции, ну и функции накидать с нужными именами.
>VS community
Visual Studio Code в смысле? Я просто перекатываюсь с пайтона на С/С++ для числовых вычислений, не особо разбираюсь в обстановке. Научных дистрибутивов типа Анаконды, я так понимаю, для С нету.
Попробуй кодогенерацию.
Нет, VS community это Visual Studio версии Community (а не платный энтерпрайз и прочее)
Visual Studio Code это вообще блокнот с продвинутой подсветкой и плагинами, то есть другое.
Ок, спасибо. Как я понимаю, я устанавливаю VS community, открываю книгу Праты и начинаю знакомство с основами, а после этого можно будет перейти и к другим специфическим вещам типа пикрила, да?
>Code-Block иде
О, спасибо, а то я начал устанавливать VS community, выбрал Clang-компилятор, а там сразу до десятка Гб на жестком диске затребовало, которых у меня нет.
У меня на диске С места нету (дома компьютер старый, всего 30 Гб на диске С, свободно 2), а VS community туда почему-то лезет, даже если я все устанавливаю на диск D.
ставь мс-компилятор
google benchmark, ну или сам напиши свой бенчмарк через rdtsc или QueryPerformanceCounter в винде
Проверяемую функцию - в отдельный файл.
Удалил игры и порнуху кстати, уже 2 недели не играю просто сижу пишу код и бегаю. Не могу отпустить Си сука такой интересный язык, а деньги зарабатывать надо и деньги кончаются что делать сука стать бомжом с макбуком?
Я весь год сидел занимался Сишечкой, вон в игры вкатываюсь но как оказалось знание физики и математики нужно чтобы получалось годно, а еще алгоритмы и структуры данных. Но я 9 классник, планирую поступать в какую нибудь шарагу при техническом вузе или заканчивать 10 и 11. Благо к деградаций интерес исчез и всё что я делаю это код и учеба
А да, че высрался то, ребят я хотел заработать деньги на вебе, я долбоеб же да? Или у меня есть перспективы всё таки зарабатывать без корочки на Сишечке и плюсах на учёбу и покушать?
А да мне 23.
23 летний 9 классник
Охуеть чувак ты крут.
Извини, диск? Или ты имеешь ввиду освоить как следует Си выше уровня вкатывальщика (На данный момент я разбираю ресурсы на awesome c, и параллельно вот уже заканчиваю Прату) и вкатываться в веб?
Я имею в виду что для веба тебе тоже придется купить новый диск, потому что там очень раздутые инструменты по десятку гигов. Голый хтмл в блокноте там не котируется, тебе придется пачками выкачивать либы зависимостей.
А всё понял. Спасибо за совет дружище. Если интересно. Я все таки продолжу глобальное изучение C, пока не изучу всё что связано. И попробую работу найти, а там если получится то в плюсы.
короче вопрос к вам всем (если увидете это сообщение в Си треде - не обессудьте, похожий вопрос просто)
короче я вот школотрон 23 лет, в этом году заканчиваю шарагу
в ООО РогаИКопыта я занимался топовыми задачами, связанными с железом (ну всм не один тянул проект, а в команде в роли ждуна) типа датчиков в металургии, контроллеров приводов и прч штуках
занимался этим два года
но есть трабл - в этой конторе даже у руководителей зп 45-50, у меня ее вообще нет - чалюсь там только из-за кайфа работы с реальным железом и я вот хочу сменить профессию
но смотрю на хабр карьеру/ххру - пиздец
из ОЙТИ одни жанги\спинг\датасосист
А в си одни НИИУУПГУИПМС, где с зп, думаю, также
че, все вообще плохо? я зря учился роботов программировать 6 лет бля?
пока варианты такие man gcc, глава в прате programming mechanics. В КиР вроде нет про это.
Мне немного надо, прост ликбез для курса в шараге.
Про тулчейн для новичков
проживу пару лет с этой зп? Есть в районе 100? 150?
Ты ёбнулся что ли? Какие 100-150? На питоне / джаваскрипте еще реально такие суммы поднимать. Сишники сосут бибу. 80-90 потолок.За пару лет ты такого опыта не наберешься.
Посмотрел на hh и indeed С/С++ эмбеду в ДС платят 150-300К в мес, сибирь 60-120, на востоке 80-150. Поляндия 7000$ сеньору.
Считаю, что не стёб. В ДС и дс2 зарплаты большие даже на не очень существенных должностях.
Сука я понимаю что здесь всё мертво уже давным давно потому что с долбоебами общаться никто не хочет, но сука свои мозги то можно использовать иногда?
Это ты вот этому >>36322 и этому >>36318 скажи. На хх он смотрел, лол. Я ДСник говорю, что Сишники потихоньку вытесняются скриптодебилами. Ржавчина и змея, увы отъедают нишу. Эмбеддед навроде ардуины/стм32 только на западе хорошо оплачивается, но туда абы кого с курсами на юдему за плечами не возьмут.
бля мне кажется, что ты стебешься надо мной
тут другой вопрос, скорее, в том, что не очень то и премиальные компашки
реально концер залупки и прочее
но иногда платят, причем иногда даже неплохо
хз насколько такой опыт будет катироваться за бугром
> Ржавчина и змея, увы отъедают нишу
нишу чего они отъедают? ты ведь не будет стмки (лпцшки прочий сброд) программировать на питоне? ну камон
Имхо, наоборот вся эта залупа только развивается
ИоТ набирает обороты, робототехника набирает обороты
появились направления у Шмяндекса, сбера
Всегда ей касперский, нвидиа, хуевей
короче хуйню сказал, все норм и сишников
мне, кстати, интересно, у байтоебов яндекс тоже спрашивает АЛГОРИТМЫ сортировки и прочее говно?
>ИоТ набирает обороты, робототехника набирает обороты
Я про ИоТ слышу уже лет 7, а про робототехнику так вообще всю жизнь.
Но на самом деле нет никакой робототехники, нет ИоТ. В РФ уж точно нет, максимум на западе стартапы есть и крупные концерны, где нужны промышленные роботы.
согласен
но еще, пожалуй, скажу, что в сколково есть N стартапов с роботами
но вообще сколково это страна ардуино и машинного обучения ЛОЛ
>Ржавчина и змея
А как же реалтаймовость? Если на расте еще можно как-то извернуться (и то большой вопрос как его к RTOS прикручивать), то питон сразу мимо. И да, реалтайм это в первую очередь не про скорость, а ее предсказуемость.
Правильно я понимаю, что мне нужно брать какой-то микроконтроллер, совмещённый с USB интерфейсом, что-то типа ATmega88, подключать его ко внутренним USB и писать драйвер?
Есть варианты проще или наоборот - совершенней и гибче?
Как получить входные команды, кроме USB?
Как бы ты это сделал?
Надеюсь, не промахнулся разделом/тредом.
> алгоритмический скриптомакакинг.
> Скриптомакака - как плохой начальник.
Эк тебя разворотило. Сравнил зп настоящих интеллектуалов эмбеддеров и глупых никудышных "скриптомакак"?
Как новичку развиваться лучше? Писать свои проги и выкладывать на всеобщее обозрение? Олимпиады? Или же проектик какой нибудь сделать, типа часов или другой полезной утвари? Идти в контору напрашиваться или завод?
бля, школотрон, ты чего так на работу попасть хочешь? Конечно, обучение на работе имеет место быть, но не это обучение из рарзяда "вот структуры в си делаются ТАК, а перифирия работает ТАК" - это все уник + свои доп занятия. К моменту выхода на работу ты максимум должен быть не очень знаком со стеком (специфичный проц, мб какая-нибудь задроченная архитектура системы)
лучше поступить на соотвествующую кафедру и там хреначить курсовые нормально, а не "чтобы сдать"
при условии, что ты найдешь годного научника, проекты могут быть и правда серьезными
Кстати советую не проебывать микропроцессорную технику
если же по каким-либо причинам тебе прям нужно пойти на работу (ну вдруг родители не могут содержать, это норм), то, конечно, пет проекты топ.
Но если тебя твои смогут до 3 курса содержать, то лучше наберись знаний на курсачах + петика
а с 3 курса уже дерзай
Чёрт, так и знал.
Если под прыщами, то через псевдофс /proc. Можно напрямую общаться. Скрипт на питоне с гуи можно запиздячить. Си + gui либы tk/gtk так же легко пишуться.
А что именно "да"? я просто спрашивал, как ее имплементировать. а то для меня подобные трики, словно поиск нарика по шприцу, оставленному в заброшенном толчке пару недель назад.
Ух ты, вот это тема. Програмную часть понял, буду пробовать, как контроллер приедет.
Не ждал ответа, репостнул в rа.
Спасибо!
взял бы платку arduino
(писать под нее можно и на с)
с usb. настроил бы на ней uart
написал бы консольную прогу
которая через com порт будет
общаться с этой ардуиной
и приговнякал бы к ардуинке
этот разноцветный светодиод
>взял бы платку arduino
Ну это совсем на поверхности идея. Но выглядеть будет совсем вырвиглазно. Хотелось бы чего-то компактнее.
Arduino:
+ Больше доков/проще вкат
+ Больше доступных интерфейсов искаропки
- Труднее запихнуть в корпус ноута
- Энергопотребление
На втором пике контроллер с USB на борту, его должно хватить.
>хакнуть встроенный диод?
Да, например. Решение красивое и аккуратное, если с исполнением не налажать. По аппаратной/програмной части идей нет?
Cтавлю внутрь PIC, cажаю на USB и командую им через псевдофс.
Если не в силах сам написать - погугли и скопипасть чужой макрос, в ядре Линукс точно есть container_of.
Уже не школотрон, но это подходит и под меня. Благодарю.
Пожалуйста. Изучай линукс. Для embedded, разных IoT, модулей навроде стм/ардуино — это просто кайф. Сперма/макакоось таких возможностей не имеет. И разработка простая будет, поддержка, сообщество огромное. Весьма рекомендую. Только предварительно почитай про внутреннее устройство линукса.
есть ли ихние РЕЦЕПТЫ и СТИЛИ программирования?
где почитать какие ЗАДАЧИ в nasa jpl надо кодить на СЯХ?
Наверное таким же образом как и родительский процесс может знать pid дочернего процесса.
А наращивается с 0 до 10 при некотором условии. Б начинает расти при условии, что А >= 5, и рост Б заканчивается при Б = А.
Что быстрее? Внутри цикла А наращивать Б, каждый раз проверяя условие, что А >= 5, или вынести наращивание Б в отдельный цикл за цикл для А и перед наращиванием Б проверить один раз, что А >= Б, но каждый раз проверять, равны ли А и Б? Я предусматриваю возможность, что по достижению цикла с Б, А может быть равно чему угодно от 0 до 10.
>Что сказать то хотел?
Что неудавшиеся программисты идут в аналитики и пишут вот такие ТЗ, а мы типа телепаты и должны это говно разбирать.
Если А будет параметром цикла то Б надо в нем же и изменять.
А я где-то писал про установку прыщей как основной системы?
fseek
>В РФ уж точно нет
по сути промышленная роботехника это синоним автоматизированных конвеерных линий на производстве
но при этом в россии нет собственного станкостроения сегодня вообще
в 89 году делали 120 тысяч станков, сегодня - меньше тысячи
соответственно, никакой речи о автоматизированном промышленном производстве не может идти, когда у нас нет производства обычного оборудования, лол
https://docs.microsoft.com/en-us/windows/win32/ProcThread/creating-a-child-process-with-redirected-input-and-output
Я не понимаю, как исправить.
Я могу только вот так, но не уверен, что не будет ошибок.
1. assert() поднимает SIGABT? Если да, то можно использовать
>signal(SIGABT, uninit);
чтобы в самом uninit() засейвить данные и деаллоцировать память?
2. у errno только три значения? некостыльно пилить свое errno в пределах программы и маскировать его каждой функцией в случае ошибки?
3. setjmp() сохраняет регистры в буффер и соответствующий адрес?
как это можно использовать для управления ошибками.
>и деаллоцировать память?
Нет. У обработчиков сигналов куча ограничение, динамическое управление памятью одно из них.
> Почитал про error handling и появилось несколько вопросов.
> 1. assert() поднимает SIGABT? Если да, то можно использовать
> >signal(SIGABT, uninit);
> чтобы в самом uninit() засейвить данные и деаллоцировать память?
Зачем деаллоцировать память при выходе из программы?
По-моему есть смысл только файловые дескрипторы закрыть.
> 2. у errno только три значения? некостыльно пилить свое errno в пределах программы и маскировать его каждой функцией в случае ошибки?
Около 140 значений у errno, если верить заголовочнику.
> 3. setjmp() сохраняет регистры в буффер и соответствующий адрес?
> как это можно использовать для управления ошибками.
longjmp вернёт выполнение в место где была вызвана функция setjmp.
Хуевая идея это использовать для управления ошибками.
В самом конце есть 2 функции XlogDecrypt и XlogEncrypt, скажите что написать в этом коде, чтобы передать в функции строку(либо хекс, я не уверен) и мне выдало ответ, прошу хелп
Желательно в виде простой строки в консоль, алсо можете написать как вообще запускать си код, пока сам пойду гугллить
scanf("%c", &stavka);
i++;
//getchar();
printf("Âû ââåëè %c\n", stavka);
scanf("%*[^\n]");
if (stavka == 'a' || stavka == 'b' || stavka == 'c' || stavka== 'q'){
flag = 0;
}
else {
flag = 1;
printf("Íåâåðíûå äàííûå ïîâòîðèòå ââîä %c %d ðàç\n", stavka, i );
}
} while (flag);
Понял что могу онлайн компилировать и нужно видимо просто мейн функцию прописать, главный вопрос для меня
uchar __stdcall XlogDecrypt(uchar data, int *psize)
звездочка как я понимаю это указатель, как мне правильно вызвать функцию? Что в нее передавать, даже не до конца понимаю что такое uchar, указатель на символ определенно размерности? Т.е в эту функцию передаются символы, он с ними работает и возвращает тоже символы? Верно? А передавать в функцию мне нужно указатели на каждый символ, так?
Нет. Я по-прежнему жду помощи в изучении обмена данными между родительским и дочерним процессами по анонимному каналу в винде.
бля, санек, я настучу твоему пм что ты на дваче ищещь решение того за что тебе в принципе на фирме платят деньги
Не знаю кто ты, даун, но мне похуй. Я, честно сказать, никого из вас в отделе за людей даже не считаю.
Я вообще мимодурачек, случайно подписался на взлом тиктока блять, уже в горле эта хуйня сидит и разбираться в си нет сил, поэтому тут спрашиваю
Ооо, по Прате что ли модифицированное задание решаешь. А зачем тебе вообще if else, если с конкретным значением сравниваешь, тут switch нужен.
Думаю если ты поймёшь, что в данном случае на самом деле означает n, у тебя отпадут вопросы.
Отдельную функцию ввода хочу сделать, а потом свитч.
что мне нужно написать в юзерспейсе, чтобы прямо сейчас сжечь собственную мать?
Программу для расчетов и обязательно юзать avx инструкции, avx инструкции, avx инструкции, avx инструкции, avx инструкции.
да там делов-то, всего ничего, осталось только понять как сраный код на си запускать, там типы данных, которые видимо даже не инклюдяться никак и никак не обосзначаются типа алиасом, uchar, вот что за хуйня как и LOCAL
Программу для коммуникации с драйвером режима ядра. А уже в драйвере организовываешь прямой доступ к портам/памяти.
Да, я мудак, не заметил что в инклюдах не <> а ""
Родительский процесс:
http://www.cpp.sh/2ywbo
Дочерний процесс:
http://www.cpp.sh/44jqe
В родительском процессе на 78 строке пытаюсь заменить строку на свою, статичную. Делаю это с целью разобраться, как вводить данные в канал внутри родительского процесса. Моё изменение никак не влияет на вывод. fputs что там делает с каналом? Как же записать туда свои данные?
(gcc $(cflags) -c prog.c -o prog.o 2>&1)
> logcompileprog.log
Таким образом, чтобы его можно было бы применять к разным сурсам (и соотвественно получать разные выходные файлы и логфайлы тоже).
Т.е. сделать нечто вроде
recipe prog.c
Есть такая возможность в мейке?
нихуя себе что с форматированием
>вкатиться в nasa jpl
Поступаешь в МВТУ им. Дауна на ракетную инженерию (возможно еще робототехника будет норм), ходишь в МКЦ, крутишься кабанчиком, вкатываешься в науку, идешь в магистратуру сколтеха, в аспирантуру за рубеж, там находишь нужных людей, которые тебя в nasa jpl перевезут. И вот тогда можешь начинать программировать космические корабли и марсоходы.
Но скорее всего ты проебешься и окажешься инженером-конструктором на ГКНПЦ им. Хруничева или другом менее понтовом заводе Роскосмоса, где будешь 10 лет работать за зп 50-60к.
При битоебле, разумеется!
#include<unistd.h>
int main()
{
int nb = 56667;
char c[10];
int i;
int a;
i = 0;
a = 0;
if (nb < 0)
{
nb = -nb;
a = 1;
}
while (nb > 9)
{
c[i++] = (nb % 10) + '0';
nb = nb / 10;
}
c[i++] = nb;
if (a == 1)
{
c = '-';
}
while (i >= 0) write(1, &c[i--], 1);
}
#include<unistd.h>
int main()
{
int nb = 56667;
char c[10];
int i;
int a;
i = 0;
a = 0;
if (nb < 0)
{
nb = -nb;
a = 1;
}
while (nb > 9)
{
c[i++] = (nb % 10) + '0';
nb = nb / 10;
}
c[i++] = nb;
if (a == 1)
{
c = '-';
}
while (i >= 0) write(1, &c[i--], 1);
}
int main()
{
int nb = 56667;
char c[10];
int i;
int a;
i = 0;
a = 0;
if (nb < 0)
{
nb = -nb;
a = 1;
}
while (nb > 9)
{
c[i++] = (nb % 10) + '0';
nb = nb / 10;
}
c[i++] = nb;
if (a == 1)
{
c = '-';
}
while (i >= 0) write(1, &c[i--], 1);
}
int main()
{
int nb = 56667;
char c[10];
int i;
int a;
i = 0;
a = 0;
if (nb < 0)
{
nb = -nb;
a = 1;
}
while (nb > 9)
{
c[i++] = (nb % 10) + '0';
nb = nb / 10;
}
c[i++] = nb;
if (a == 1)
{
c = '-';
}
while (i >= 0) write(1, &c[i--], 1);
}
>Подскажите, где же я проебываю первую цифру?
Пошаговое выполнение кода в средстве отладки для чего создано, а?
И чо?
Ну напихал бы в исходник отладочной печати в эту консоль, ч0 как маленький?
ЧЯНТД? Почему newList возвращает указатель на список из одного элемента, а значения полей равны нулю?
Не судите строго, только сегодня сел за более-менее серьёзное изучение.
Ну берешь и пишешь. Вроде всё ясно? Ну, пиши, чо.
ERROR: Conditional jump or move depends on uninitialised value(s)
(Stopped running after the first error. Please fix your code.)
Продолжай булимене серьозное изучение.
malloc() возвращает другой адрес с полученной памятью. head же указывает на рандомную ебань и так же будет передан вызывающей функции. Как фиксить - думой сам.
https://pastebin.com/1jFRM8Kc
ну если ты и сейчас не поймешь, где обосрался, то это всё нахуй, край пиздец.
жидко пукнул с нынешних хакеров
две звёздочкиhead = ¤t
1) Автоматизация. Вместо несуществующих создаются пустые файлы, и сборка по-новой запускается.
2) Написать виртуальную файловую систему.
3) Перебрать исходники препроцессора.
а накидайте практических задачек(гитхаб, литкод, реддит), где обсуждают именно то что нужно знать и уметь на СЯХ, чтобы работать в nasa/jpl ?
или типа такого
https://yurichev.com/mirrors/C/JPL_Coding_Standard_C.pdf
наскок сильно надо шарить в математике и стат.анализе?
или просто прорешать все алгоритмы на чисто си, запомнить это, а дальше можно копипастить куски кода с гитхаба тупо ориентируясь на наса стандарт?
или нужно прям АКАДЕМИЧЕСКИ знать матешу прежде чем запускать gcc+vi ?
За первый вариант спасибки. Я хоть и думал про такие извороты, но не мог предположить, что это называется автоматизация, а не костыли.
И теперь у меня два сценария сборки: в первом спавнится заполненный хидер, во втором пустой файл с тем же названием.
И все работае, так что еще раз спасибо.
Это называется автоматизация только когда скрипт запускает сборку, получает себе stderr, анализирует его регекспами, находит там несуществующие хедеры, создает их и перезапускает сборку. Я это имел в виду, если что.
Почему по достижении return'а, судя по отладчику программа зависает на последней строке функции, даёт приглашение на ввод, но при этом не возвращается в main?
>так что непонятно о достижении какого return идет речь
Самого первого, при инициализации корневого узла.
Блять это что за обучение нахуй такое? ПРИДУМАЛИ МАССИВЫ ИЗ СТРУКТУР И ДОЛБОЕБ ВСЁ РАВНО БУДЕТ ИСПОЛЬЗОВАТЬ ДЛЯ ЭТОГО УКАЗАТЕЛИ!
Скорее всего не аллокатор, а компиляторная оптимизация. НУ А ХУЛЕ НЕТ ТА?
Мож там просто хипы были рядом друг с другом, короче думаю так всё было:
Короче каждый раз шла аллокация 16 байтов, (2 инта + еще одна такая же структура), 8 байтов занимались, остальные оставались, шла еще такая же аллокация, на том самом месте где был указатель занимались оставшиеся 8 байтов, и так до конца, в итоге в конце остается незанятая ячейка памяти из 8 байтов. Либо куча дыр, но я ставлю на вытекание памяти. Там не используется освобождение, можно стенкой посмотреть.
Нихуя не понял
Сам пишу не на си, просто есть очень большое желание понять, как оно там внутри все работает. Нужно в сторону poll/epoll смотреть? Есть какие-нибудь годные гайды или книги?
Почитай любые книжки по ядру: как шедулер работает, как процесс блокируется... На этом фоне poll - простенькая надстройка.
А с чего начать? Я сам студент, курс по осям будет только осенью, да и вряд ли там сильно глубоко в ядро залезем.
Для начала курс на степике может пройти, а потом книжки по ядру ОС почитать?
Объясни в чем суть двух постов и как ты это понял?
Инициализация должна проходить успешно: посмотри внимательно тайпдефы и декларации, или скинь их.
>>55767
Ну линкед листы это довольно весело для обучалок.
>>55779
Там всегонавсего каждую итерацию инициализировался новый нод который не привязывался к предыдущему.
Да, самые обыкновенные меморилики.
Ааа ему надо было сначала аллокацию головному ноду сделать.
Где смеяться?
head = malloc(sizeof(node));
init(head);
for(crt=head;;) {
crt->next = malloc(sizeof(node));
crt = crt->next;
init(crt);
}
crt->next = 0x00;
Этого хватит? Дефолтного тутора хватит на сайте гнома? Или книжку взять?
А то хочется отвлечься от монотонной зубрежки, вообще пишу всякие задачки на сторонних ресурсах, но там тоже монотонность. Хочется написать что нибудь уже.
Хуя круто как. И понятно.
>Как по хардкору вкатиться в неблокирующий и асинхронный I/O?
Если тебе прям на уровне epoll/C надо... Ну тогда напиши для начала какой-нибудь простенький HTTP-сервер на блокируемых сокетах. Все реквест-хедеры пропусти, отдай клиенту статус, Content-Type и Hello, World! У тебя будет маленький исходный код, с которым уже можно экспериментировать. А то как так, сей в глаза не видел, но хочу сразу в ядро и шедулер. Там до шедулера у многих серьезных кодеров типа конструкторов всяких golang и nodejs проблемы возникали, типа как лучше распространить асинхронность на потоки, чтобы ядра проца не простаивали.
>>55850
>Этого хватит?
Попробуй и поймешь.
>Инициализация должна проходить успешно: посмотри внимательно тайпдефы и декларации, или скинь их
Вероятно основная проблема в том, что в main инзерты вызываются внутри цикла с передачей им в качестве аргумента адрес i-того элемента массива типа Data
for(int i = 0;i < 5;i++) Insert(&my, arr(i));
Просто если адрес обычных переменных Data (не массивных) передавать в несколько копипастнутых строчек Insert, то всё нормально работает.
Insert(&my, &a);
Insert(&my, &b);
Insert(&my, &c);
Insert(&my, &d);
Insert(&my, &e);
>арр(ай)
ты пердеашь сам эленметн ,н5 адреs.
нужн0 воТ так вот :
ампарсанд арр(ай); илии арр плюс ай.
А прикинь, каково кодировать malloc, ведь ты не можешь сделать malloc(sizeof node), потому что у тебя еще нет malloc.
>а елсе у меня етсь ммап() и брик(), но ищо нет маллок() что тт на эт0 скажеw)))
Блок с длиной -1 в дереве, если не хватает, то растим память. Но тут какая-то хуйня в треде вообще творится. С готовым malloc не можем дерево построить.
Здесь не в маллоке дело, а именно в цикле, т.к если просто переменные передавать, то всё нормально, все указатели на выделенные участки памяти на месте. Инсерт просто на корневом ноде останавливаться .
4to ne tak?
Цефал
Нахуе здесь безусловный переход на следующую иструкцию?
avr
-Os
Итак у меня есть программа, которая генерирует MISRAC код из блок-диаграмм. Есть драйвера и прочие пляски с регистрами написанные мной. Я могу взять и поменять блок диаграммы и перегенерировать код, так что допиливать что-то в автоматическом коде тупо - быстро сотрется.
Есть неиспользуемый файл Task0.c (сгенерированый):
...
void Task0(void){
_simple_float_calc();
return;
}
Task0() не вызывается нигде
Есть определение функции в другом файле(тоже сгенерированном):
void _simple_float_calc(void){
многокод;
}
Есть вызов _simple_float_calc в каком-то месте ОДИН ЕДИНСТВЕННЫЙ ВО ВСЕЙ ПРОГРАММЕ (call 0x154)
Нахуй он сгенерировал Task0() если она не используется?
Нахуй он спиздил мои 4 байта памяти и 3 такта процессора?
inline на _simple_float_calc() поставить не могу потому что уже объяснил почему.
Ща попробую в в мейке написать чтоб удалял Task0.c перед началом веселухи.
Сука мне чтобы влезть в 8кб не хватает 40 байт карл
avr
-Os
Итак у меня есть программа, которая генерирует MISRAC код из блок-диаграмм. Есть драйвера и прочие пляски с регистрами написанные мной. Я могу взять и поменять блок диаграммы и перегенерировать код, так что допиливать что-то в автоматическом коде тупо - быстро сотрется.
Есть неиспользуемый файл Task0.c (сгенерированый):
...
void Task0(void){
_simple_float_calc();
return;
}
Task0() не вызывается нигде
Есть определение функции в другом файле(тоже сгенерированном):
void _simple_float_calc(void){
многокод;
}
Есть вызов _simple_float_calc в каком-то месте ОДИН ЕДИНСТВЕННЫЙ ВО ВСЕЙ ПРОГРАММЕ (call 0x154)
Нахуй он сгенерировал Task0() если она не используется?
Нахуй он спиздил мои 4 байта памяти и 3 такта процессора?
inline на _simple_float_calc() поставить не могу потому что уже объяснил почему.
Ща попробую в в мейке написать чтоб удалял Task0.c перед началом веселухи.
Сука мне чтобы влезть в 8кб не хватает 40 байт карл
Ну да, остаётся удалить этот файл. Нахуя сгенерировал? Ну раз есть глобальная функция - должен быть код. Их по идее может убирать умный компоновщик, но я дед и ни разу им не пользовался.
там такая программа которая генерит таски под autosar или как void void функции. просто не генерировать низя...
они полностью идентичны, или clock() возвращает время процесса, в то время как time() - календарное время?
Ну почитай доки ептыть. Слоск возвращает число таймерных прерываний, пришедших во время выполнения программы.
>> 1958625
>> 1958625
>> 1958625
>> 1958625
>>1958625 (OP)
>>1958625 (OP)
>>1958625 (OP)
>>1958625 (OP)
>>1958625 (OP)
Это копия, сохраненная 13 мая 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.