Это копия, сохраненная 26 июля 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/#, https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2385.pdf
- man/Dash/zealdocs
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
https://github.com/kozross/awesome-c
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №52: http://arhivach.ng/thread/529928/
- №53: http://arhivach.ng/thread/529929/
- №54: http://arhivach.ng/thread/535256/ >>1610764 (OP)
Где я должен делать проверку? В foo или bar? Или в обеих? Вообще нужны ли эти проверки, если есть аннотации? Дискасс.
> возможно с платиной
Да. Проверяют возвращаемые значения, в данном случае - результат malloc(). Многие проверяют и при использовании, но по мне так для аргументов достаточно assert() вкатить (и то нахуй не нужно), если это не внешняя функция, которая реализует интерфейс модуля. Вот для внешней надо проверять все. Алсо, обработать ошибку выделения памяти правильно очень сложно, и в каком-нибудь консолеговне проще всего сделать обертку уровня if (!malloc()) exit() и не думоть.
шутки за 100, хмм
В книжках у тестеров что то такое попадалось.
Функция получает что-то на вход и выдает выход
Надо поделить все множество возможных входов на уникальные классы.
Например, ты пишешь parseFloat(const char*). 3.0 и 4.0 будут в одном уникальном классе, 3.0, -3.0, 3e-1, Inf, zhopa - в разных.
Значит надо проверять такие ситуации, как:
null, пустая строка, строка с правильным числом, строка с неправильным числом. Решить к чему относится строка из двух чисел. Решить к чему относится строка, начинающаяся с числа, но заканчивающаяся мусором.
Сами категории тоже надо подразделять.
Правильные числа - проверять целые числа, вещественные числа, отрицательные числа, научную запись, NaN, Inf и т.д. Решить что будет если в начале два плюса, если после числа пробелы, если после плюса пробел и т.д.
Неправильные числа - проверять что будет если подать очень длинное число, что будет если подать перед числом плюс и минус, или два минуса
Забыл дописать - когда у тебя будут уникальные классы, надо проверять граничные случаи, например тебе не надо проверять все положительные, а только граничные - 0.0, 1.0, 1.175494e-38, 3.402823e+38...
Это понятно, да, но как тесты оформлять? Писать программу, влючать в неё .с файл, который хотим проверить, и там вызывать функции с заранее определённым входом и ожидать от них определённого выхода?
Обычно используют готовые фреймворки для тестирования, наверняка под си что-то есть.
Может и есть, но мне хочется tests first approach опробовать, как в tdd. Просто на маленьких учебных задачках. Валгринд для этого разворачивать как-то несуразно.
Можно просто почти как в питоне:
#ifdef TEST
int main(void) { ...}
#endif
И потом cc -DTEST file.c Для либ очень даже норм.
Мне не хотелось бы держать это в одном файле, если честно. На мой взгляд так будет некрасиво. Наверное, поступлю как написал выше. Сделаю отдельный .с, в который тупо инклудом буду брать программу, и проводить тесты.
Не валгринд разворачивать, а использовать фреймворки
https://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C
Например cmocka (выбрал от балды, сам выбирай)
https://lwn.net/Articles/558106/
Пишешь c- файл с тестами, и отдельно собираешь бинарник, в котором указаны твои нужные c-файлы, и файл с тестами.
https://www.youtube.com/watch?v=T8Yqaol_A5Y
Или лучше С++?
месяц, дальше забываешь про дроч языка и достигаешь просветления через прикладнуху (юниксовые проги с продвинутым функционалом, всякие байтоебские кодировщики пишешь), иногда "повышая квалификацю" годным чтивом про хорошие практики
У кого есть время, и нефиг делать - помогите зафиксить uTox для XP!
https://github.com/username1565/uTox_winXP
А то хуле он конпелируется, но не пашет? Понять не могу.
Разрабы отказались от поддержки Windows XP,
поэтому приходится извращаться со прекомпилированными бинарниками,
заменяя ноды при помощи JavaScript: https://github.com/username1565/uTox_winXP/releases
Можно было бы декомпилировать эти бинарники и получить рабочий исходник,
но я Си не знаю, просто форкнул проект, добавил либы,
и описал процесс компиляции, под Windows XP, вот здесь: https://github.com/username1565/uTox_winXP/commit/cd23deef631183178d113cbac2dd1812f547fd85
А теперь люди жалуются, что бинарник не пашет, а я в душЕ не ебу, чё он не пашет, блядь.
Анон, можно ли как-то хранить имена типов данных в переменной?
К примеру, в функцию приходит void-указатель на какое-либо значение (может быть вещественное число, целое и т.д.).
Для того, чтобы из void получить значение мне необходимо совершить приведение типов, в случае с целыми числами это (int )(void ptr)
Вопрос: а можно ли хранить имя типа в переменной, для того, чтобы писать: (type_name )(void ptr)?
Сейчас вот задумался, что это немного противоречит архитектуре языка программирования, хех. Ведь, по сути, речь идет о хранении ключевых слов в переменной.
Воздержись от void* без крайней необходимости.
Язык тебе дал перегрузки функций fun(int), fun(float)
Еще можно передавать тип вторым параметром
enum { INT_TYPE, FLOAT_TYPE }
fun(void_ptr, INT_TYPE)
В C++ можно было бы на шаблонах что то нагородить fun<int>(ptr), fun<float>(ptr)
>>39024
Это нормально, в более высокоуровневых языках есть рефлексия, но она всегда требует большого оверхеда.
Вот это я тупанул.
Погуглил, в 2011 году добавили какую-то шляпу _Generic
Возможно с ней можно что-то такое делать.
https://stackoverflow.com/questions/479207/how-to-achieve-function-overloading-in-c
>>38867
всё норм, но в консоле попрежнему результат некорректно отображается. помогите, молю.
https://pastebin.com/94FcGuU5
Ну она через return идёт, там вроде автоматические преобразование любых типов к обычному int со знаком идёт. Я конечно не про, но я бы просто в принт это сделал и всё.
Двачую
https://en.wikipedia.org/wiki/Exit_status
Windows uses 32-bit unsigned integers as exit codes, although the command interpreter treats them as signed
В линуксе тоже вроде код возврата 32 битный, более того в некоторых частях системы он вообще 1 байтный.
фу.
Есть msys+mingw32, а есть msys2, где много всякого, в том числе mingw-w64. Фактически msys - это окружение (и инсталлятор), компилятор вообще можно отдельно ставить, если ./configure не интересует.
Есть бинарное дерево, в каждой ноде лежит имя животного в массиве, и лист с их видами. Каждая ячейка листа тоже массив. Хочу вывест на экран содержимое ячейки.
У листа есть опция перебора всех ячеек и применения функции к ним. Хочу вывести имя пета рядом с видом для этого пишу функцию, которая принимает содержимое ноды дерева, делает функцию для печати содержимого ячейки листа и перебирает лист. vscode на такое жалуется (пишет, что ожидал ;), а gcc спокойно компилирует и это работает.
Я правильно понимаю, что это какое-то расширение от gcc и так делать не надо? И как делать тогда надо, чтобы нужное число строк печатать для любого списка в ячейке?
А как тогда печатать для каждого вида животного его имя? Имя нам известно один раз, в ноде дерева, потом мы передаём управление листу, чтобы он сделал
void showPetKind(ListItem kind)
{
printf("%s\n", kind.petkind);
}
над каждой ячейкой. Как передать ему ещё и и имя? Или менять функцию
void TraverseList(const List plist, void (pfun)(ListItem item));
чтобы она вместо void (pfun)(ListItem item) принимала void (pfun)(ListItem item, char *petname)?
Хотелось бы книгу, которая была бы ориентирована не на совсем зеленых, но и не была слишком техническим материалом (как The C Programming Language). Подумываю взять Дейтелов. Что скажете, нормально или слишком много базы?
Тащемта можно объявить функцию внутри функции, но определять вложенную функцию нельзя. Это значит, что ты можешь написать прототип функции внутри другой функции, но определение обязан писать вне функций.
>если уже имеется достаточный опыт работы с C++?
По моему проще загуглить на stackoverflow разницу между c и c++
Ну с какой целью? Ты же сидишь в СИ треде значит учишь его или уже владеешь им и пишешь на нём что-то.
Не понимаю вопроса. У С должна быть какая-то особенная цель? Или ты сидишь в программаче и недоумеваешь, зачем люди программы пишут?
>побитовые операции в си
Побитовые операции везде одинаковы и вообще это математика
>где примерно это можно применять на практике
Битовые поля и матрицы используются в логике приложения ради перформанса
Кроме этого только в кодировке
>Душные мудаки
Ты сам душный долбаеб неосилятор плачущий на мылочах вместо чтения полторых статей
спасибо за ответ,понял. вот так бы сразу.
Мигать светодиодами на чипах.
Да везде блджад. В хэшах, в наборах которые сеты, в crc32, в проверках четности, в псевдорандоме, во всяких быстрых делениях, округлениях, извлечении корней.
Вообще вопрос уровня где используется вычитание.
Спасибо тебе тоже, анчоус за ответ, у тебя более разврнутый чем у предыдущего анона.
Алсо
>Мигать светодиодами на чипах.
да когда-нибудь я научусь писать драйвера и программировать микроконтроллеры как же я буду отрываться и эксперементировать. спасибо, анчоус ещё раз.
Мне очень понравилось в ручную это просчитывать если честно побитовые операции. Я даже себя проверил по всем пунктам. Это то чего я ожидал от программирования. Помню когда в веб 2 года назад вкатывался искренне охуевал и думал что это за гавно унылое. А тут прикольно люблю когда всё так разобрано до винтика прозрачно и понятно, низкуровневость это охуено, если помечтать уже то может быть когда-нибудь я вкачу своё ньюфажное ебало и в ассемблеры
Есть крутая книжка Алгоритмические трюки лоя программистов. Конечно сейчас процессоры с набором инструкций поьогаче и компиляторы стали поумнее, поэтому она менее актуальна, но там про это.
Кастомизированные сорцы Quake 3 (причесали структуру, добавили +- современные GAPI) от создателей CPMA.
На С.
я ничего не понял из того что ты мне сказал, извини. мне такое ещё рано
>достигаешь просветления через прикладнуху (юниксовые проги с продвинутым функционалом, всякие байтоебские кодировщики пишешь),
Откуда всё это брать? Читал Дейтеллов последние главы типы данных (списки, стек), препроцессор. работа с памятью, goto - на всё это по несколько страничек и конец. Как детектив на самом интересном месте обрывается.
#include<stdio.h>
#include<json-c/json.h>
int main(int argc, char argv) {
FILE fp;
char buffer[1024];
struct json_object parsed_json;
struct json_object depth;
struct json_object azimuth;
struct json_object *inclination;
fp = fopen("test2.json","r");
fread(buffer, 1024, 1, fp);
fclose(fp);
parsed_json = json_tokener_parse(buffer);
json_object_object_get_ex(parsed_json, "depth", &depth);
json_object_object_get_ex(parsed_json, "azimuth", &azimuth);
json_object_object_get_ex(parsed_json, "inclination", &inclination);
printf("depth: %10.19f\n", json_object_get_double(depth));
printf("azimuth: %10.19f\n", json_object_get_double(azimuth));
printf("inclination: %10.19f\n", json_object_get_double(inclination));
}
сам json файл:
[
{
"depth": 0.6095999999999999,
"azimuth": 4.60560973674798,
"inclination": 0
}
]
выводит:
depth: 0.0000000000000000000
azimuth: 0.0000000000000000000
inclination: 0.0000000000000000000
что делаю не так?
#include<stdio.h>
#include<json-c/json.h>
int main(int argc, char argv) {
FILE fp;
char buffer[1024];
struct json_object parsed_json;
struct json_object depth;
struct json_object azimuth;
struct json_object *inclination;
fp = fopen("test2.json","r");
fread(buffer, 1024, 1, fp);
fclose(fp);
parsed_json = json_tokener_parse(buffer);
json_object_object_get_ex(parsed_json, "depth", &depth);
json_object_object_get_ex(parsed_json, "azimuth", &azimuth);
json_object_object_get_ex(parsed_json, "inclination", &inclination);
printf("depth: %10.19f\n", json_object_get_double(depth));
printf("azimuth: %10.19f\n", json_object_get_double(azimuth));
printf("inclination: %10.19f\n", json_object_get_double(inclination));
}
сам json файл:
[
{
"depth": 0.6095999999999999,
"azimuth": 4.60560973674798,
"inclination": 0
}
]
выводит:
depth: 0.0000000000000000000
azimuth: 0.0000000000000000000
inclination: 0.0000000000000000000
что делаю не так?
Ну очевидно же, что у тебя массив объектов, а работаешь ты с ним как с одним объектом. Воткни после json_tokener_parse:
parsed_json = json_object_array_get_idx(parsed_json, 0);
большое спасибо, помогло
и нет, мне не было очевидно)
мимо узнал про двач спустя год с небольшим после вката по K&R
>пук
Я ж не говорю про классический матан по Зоричу. Взять того же Кнута Concrete mathematics, ахуэнно жи... Чувак, ни одна фундаментальная книга по алгоритмам (без которой ты нихуя серьезного сам не осилишь, как кодер) не доступна без математического бэкграунда, во многих таких книгах это даже прилагается первой главой или в дополнении, но там сумбурно, а в деле становления Кармаком вообще спешка ни к чему, и так заебаться успеешь раз семьдесят за годы просветления, стало быть, нехуй нагонять сумбур, а лучше взять книжулю отдельно, забыть про далекий конец пути, сбросить напряжение и получать удовольствие от процесса. Кто этого не понимает, тот проебанное поколения, и я не про возраст, а в принципе. Заебали ЧСВ мудаки, которые своим куриным мозгом пытаются оценить ценность того, что лишь осилив и заценишь. Это иной уровень существования, это как рассказывать червяку, в чем прикол виртуозной езды на мотоцикле. Обнял, анон.
>книга по алгоритмам
Это говно только кукаретики и вкатыши читают. Потом бегуют со своим мохнатым О пока их нахуй от рабочего кода не пошлют.
>классический матан
Сорта говн
>Я ж не говорю про классический матан по Зоричу
Иди на хуй со своей второй культурой, обрыган.
использовать для простого создания директорий
$(info $(shell mkdir -p $(DIRS)))
вместо
$(shell mkdir -p $(DIRS))
https://stackoverflow.com/questions/1950926/create-directories-using-make-file#comment89152187_45048948
потому что вывод mkdir, согласно постеру, вторая будет ошибки прямо в мейкфайл записывать. Проверил это, убрав -p, так что она всегда генерировала mkdir: cannot create directory : File exists.
Так вот, большой разницы между $(info $(shell и $(shell я не обнаружил, info только пустую строку добавляет, а ошибка и так и так выводится в терминал. Сама info вроде рандомные строчки читать не предлагает (или в мейкфайлах своя инфо?). О чём он вообще?
all:
$(shell echo hello:)
....$(shell echo echo you)
....$(shell echo echo are)
....$(shell echo echo infected)
corona: hello
там где точки - табы. как думаеш што делает?
will be pasted into the Makefile, leading to syntax errors at best, означает что шелл без инфо это кодогенерация.
Понял, разобрался, спасибо.
И ещё вопрос, как заставить $(info ...) на пустой строке не печатать лайнбрейк? Тот же
$(info $(shell mkdir -p $(DIRS)))
делает пустую строку. Как и, судя по моим экспериментам, любой
$(info )
Это как-то чинится? Можно ли отправить вывод в /дев/нулл?
как с этим бороться?
снова обосрался. давал радианы, а полосочку забыл передвинуть с градусов
int x = 20;
return ~x;
даёт результат -21. Я не понимаю почему.
20 в двоиной это 10100, я ожидаю результат 01011(11 в десятичной), а получаю -21 что в двоичной равно -10101. Со знаками то понятно, непонятно почему нули с единицами не меняются так как ожидается.
Почему так?
Ты не можешь просто не учитывать ведущие нули. Поэтому у тебя не 10100, а 000...010100.(с учетом размера int) И 11 в десятичной ты никак не получишь
Ну а разница в 1 из за представления в дополнительном двоичном коде (two complement). -21 выглядит не так как ты написал. Проверь на 1 = b00000001, -1 = b11111110
ну так напиши мне подробрно как выглядит 21 на самом деле и как происходят эти вычисления все.
Ой мне лень сейчас уже, вот продли правую табличку вручную и все поймешь. Я и так в прошлом посте опечатался. Короче -(x) в двоичном будет (~x)+1. Алсо попробуй на беззнаковых.
Спасибо попытаюсь понять
Автору таблички надо по мордасам набить за пропорциональный шрифт.
Первые два это Cmake и Make.
Третий пик другим способом компиляция и она работает. Что за хуита?
Я все понял, сори :)
На втором месте вариант со структурой по значению, наверное, т.к. нет операций с памятью.
Посос будет разве только только при кешмиссе.
И да, если уж бенчить асм-высер хуеты, то бенчить проход по массивам и прочим структурам данным
короче смотри нужно не в двоичной системе считать, а в типе int
в int 32 твоё число это
00000000 00000000 00000000 00010100 теперь мы делаем отрицание
11111111 11111111 11111111 11101011 и получаем такое число.
Если у тебя тип unsigned без знака то это будет равно в десятичном 4294967275
Если у тебя signed который по умолчанию со знаком то это надо высчитать вот так
4 294 967 275 - 2 147 483 647 = 2 147 483 628
2 147 483 648 - 2 147 483 628 + 1 = 21
Ну и так как было отрицание то плюсовой бит меняем на минусово и получаем -21.
На конце цифры выделил специально чтобы диапазоны понимал почему получилось 21 а не 20.
Потому что 0 это положительное. а в отрицательном 0 нет, поэтому в отрицательном больше на 1, чем в положительном.
А на 1 прибавляется потому что 0 в реверсе это будет -1, а 1 в реверсе это будет -2. ну ты короче надеюсь ты понел.
Всё из-за старшего бита. Он кодирует положительное или же отрицательное число.
#define PathToLibrary "..\\NativeLibrary\\bin\\x64\\release\\netstandard2.0\\win-x64\\publish\\NativeLibrary.dll"
DLL Export Viewer(пик1) видит функцию в либе без проблем.
В main.C :
https://pastebin.com/u41ytwDY
Line1 - не выводится, т.е файл найден
Line2 - После LoadLibrary в handle NULL
Line3 - В ErrorCode 126
Если не ошибаюсь Error Code 126 = Модуль не найден, хотя Line1 его находит.
Как решить эту траблу, ебусь уже 25ый день.
UPD: Либа Shared
dotnet publish /p:NativeLib=Shared -r win-x64 -c release
Пример - тут
https://github.com/dotnet/corert/tree/master/samples/NativeLibrary
Ну да, ты правильно вот сказал метко и коротко, объяснил бы ему раз такой талант имеешь. Если старший бит 0 число положительное, если 1 то отрицательное.
Второй вариант. Будет работать на практике так же как и первый, просто потому что если развернуть код вызова этих функций и убрать фолдинг констант, который ты бенчмаркаешь, блядь от он будет ==.
>>43367
> В третьей функции же все в один регистр считается из памяти, плюс сдвиг по таблице он быстрее считается, так что хуй знает!
Зато ты можешь ирл огресть хуеву тонну индирекций (которых офк никогда не будет в твоём хэловорде на 1кб), и твой третий вариант будет сосать хуй. Нет, дети, если у вас кол-во оперативки > кэша то так делать не надо.
Пшёл нахуй, порватка. Какая связь вообще между старшим битом и фошистами, ещё и ёбанными? Хуле смерти желаешь, сам фошист что-ли? Гугли старший бит, гугли, сука, вилкой бытраблять гугли: https://ru.wikipedia.org/wiki/Старший_бит
>айтишник
Выбрось нахуй это слово из своего вокабуляра, если хочешь чтобы тебя люди серьезно воспринимали.
маня, успокойся. я сам айти пидор о чём очень сильно жалею, но увы уже много трудов въебал в этот чан с гавном под названием АЙТИ. и мне поздно переквалицифроваться. как же меня бесят мои коллеги душные мудаки, никакого юмора, всё сразу в штыки, слово не то его использовать низя, вот ты классикал айти выблядок. Сука, я мог бы работать с тётями сраками в офисе и слушать про их детей и мужей, да где угодно, хоть с гречневыми пидорахами, но только в этом чане с гавном под названием айти с заносчивыми и душными мудаками которые за нетакое слово уже ебут тебе мозг.
>хоть с гречневыми пидорахами
Тебе кто-то мешает релокейтнуться на Украину?
>но только в этом чане с гавном под названием айти с заносчивыми и душными мудаками которые за нетакое слово уже ебут тебе мозг
Специфика байтойобов, на самом деле. Ещё подобным страдают бэкэндеры, попробуй потусоваться с челиками из других областей, ахуеешь от разнообразия айтишников в природе.
Нытик аутист, да еще и либераха.
Всё наоборот же, фронты-питухи с их маняметодичками
Этот айтишник сгорел, несите нового.
>Понимаю, что никогда не смогу даже попытаться сделать свой аналог даже с современными возможностями.
Ну и лох.
С современными возможностями как раз сложнее делать вещи типа вульфа, потому что видеокарты пошли другим путем и его методы слишком противоестественны. Это как писать самомодифицирующийся код на ассемблере сегодня, а лет 30 назад это было нормой.
>С современными возможностями как раз сложнее делать вещи типа вульфа,
А чё тебе мешает делать ручной софтверный рендеринг? В sdl2 можно тупо ебать байтики текстуры. Потом одной функцией копировать текстуру на экран, вуаля.
Думоть надо. Рейкастинг писать. Как работает рендер на основе BSP - вообше не вкурил. И один хрен потребуется i7 девятого поколения и 1080, чтобы добиться 30 кадров.
Мимо
Ну такое себе. Хотя бы в шейдере тогда надо делать.
Чаю
Дико корежит от этих школ с зумерками-программистами из пабликов вконтакте. Опошляют и поганят все и вся вокруг себя.
Возьми gcc.godbolt.org и посмотри на примере каких-нибудь скалярных произведений. Если хочется что-то самому добавить то используй не вставки, а интринсики.
Есть, компилятор оптимизирует по возможности, вставки не придется дрочить.
В идеале надо определить черту, начиная с каких процов клиенты тебе не интересны. Ну или делать отдельно сборку для MMX и для i586, возможно вынеся нужные функции в либу.
да нет пусть в двoичнoм пишет, так удoбнее мне, я тoлькo всё равнo нихуя задания не пoнял.
а пoнял, всё спасибo бoльшoе.
Effective C: An Introduction to Professional C Programming
https://nostarch.com/Effective_C
Наконец свежак по чистому Си!
Кстати, а Столярова тут рекомендуют?
Подскажите пожалуйста...
Как можно обратимо, закодировать массив байт в масив 7-ми битных значений, и наоборот - декодировать в байты?
>SevenBits = byte & 127; //даёт 7 последних бит.
>FirstBit = byte >> 7; //даёт старший бит.
А дальше, что хочешь там, то и делаешь с ними. Можешь выебать их шлангом, потому что CLang.
Жирно.
Ты спрашиваешь, как можно закодировать 8 бит в 7, чтобы оно потом обратно в 8 бит раскодировалось?
Не совсем так.
Пусть есть массив байт:
[10101010, 01010101, 00000000, 11111111]
надо получить массив, вроде:
[1010101, 0010101, 01000000, 0011111, 111] или типа того,
а потом раскодировать обратно.
Основная задача - представить байтовый массив в виде строки,
состоящей исключительно из символов 7-ми битного ASCII,
а для этого, надо получить массив этих 7-ми битных значений.
Но сделать это надо так, чтобы потом из него, из этого массива,
было возможным получить назад эти байты, ебучие.
Причём в виде - первозданном, а не непохеренном всякими кракозбликами,
наподобие https://ru.wikipedia.org/wiki/Заменяющий_символ
Ну почему же? Каждый ASCII-символ можно представить 7-ю битами, согласно таблице ASCII:
https://ru.wikipedia.org/wiki/ASCII#ASCII_Table
>>1645988
Вот, нашёл какой-то код на JavaScript, для разрезания байтового массива на произвольное количество бит.
https://stackoverflow.com/a/8133543
Но там биты в виде строк, а надо чтобы числа были.
Может поможет как-то намалякать годноту, а то я уже заебался... Хз.
boost::transform_width
Обычно используется для кодирования в base64, но и под случай пойдет https://stackoverflow.com/questions/7053538/how-do-i-encode-a-string-to-base64-using-only-boost
https://ideone.com/gbo25F
Котороче, так и не смог понять, как хорошо задать размер второму массиву. Реквестирую помощь анона в этом вопросе. В остальном работает, хоть и коряво.
Слышь, пехотинец, ты так забегался со своими калашами на море,
что аж немного рамсы попутал и затёр не по теме ваще, да ещё и не по масти.
За такое, даже в пехоте пёрышком чикают, в ты чё ваще не курсах?
Реквест изначальный же, был о том, как массивы байтовые передёрнуть,
и этот вот >>46015, вроде что-то знает.
Только вот на JavaScript эту хреновину не пришпандорить -
слишком сложный синтаксис, и пунктуация, да.
Чиво? Был массив восьмибитных чаров, стал массив восьмибитных чаров, где первый бит ничего не значит и всегда 0. То есть значения семибитные.
>Но там биты в виде строк, а надо чтобы числа были.
Так быть не может. Числа все фиксированной длины, не меньше 8 бит, так что тебе придется вместе с числом хранить его настоящий размер в битах. Для строк такое не нужно, потому что строки могут быть любой длины и уже включают в себя размер.
>Чиво? Был массив восьмибитных чаров, стал массив восьмибитных чаров,
>где первый бит ничего не значит и всегда 0. То есть значения семибитные.
Хм, ну я же просил массив с int, или byte, а не char'ы.
Да, я вижу - семибитные коды у них, но как их оттуда вытащить в массив?
И вообще, я же хочу на JavaScript этот алго,
а у тебя там вот такое вот:
>buffer |= *foo;
>Есть мнение, что он не понимает, что такое разбиение.
Слышь ты, умник?! Хуле тут понимать-то, а? Про понятия решил мне растереть, да?
Берётся короче еблет и разбивается в мясо, по-бырому - вот и всё разбиение.
Потому что у него нигде не сказано что на входе только ascii символы
Если на входе только ascii символы то там вообще ничего делать не надо
for(int i =0; i<size; i++) out=inp&0x7f;
А если резать по обычному то там может получиться такое
11111110 00000011 11111111 -> 1111111 00000000 11111111... т.е. NULL-байт в поток
я и русскую имею, тoже ничегo там не пoнял.
Вообще-то, было сказано, что на входе - байты, это массив байт, со значениями от 0 до 255 (8 бит).
На выходе же - должны бы быть тоже массив, тоже байты, но имеющие значение от 0 до 127.
И их должно бы быть чутка побольше.
Я не знаю как в Си, и это вопрос скорее по алгоритмам, вцелом,
и я решил задать его в треде по Си,
так как считаю, что вы больше разбираетесь в этих вот битовых операторах,
и прочих низкоуровневых операциях.
Тот факт, что массиве из байт - может быть нулевой байт,
в JavaScript, вовсе не значит что это конец строки.
Я вот, просто для прикола, открыл консоль браузера (клавиша F12),
и вписал туда это:
>console.log('NULL_BYTE1:\0NULL_BYTE2:\0NULL_BYTE3:\0);
и вижу длинную строчку.
Короче, надо бы как-то наварганить, обратимый алгоритм,
получения именно байт причём произвольной, заданной битности.
В данном случае - битность 7, значит массив содержит 7-ми битные значения, или 6-ти битные, 1 битные...
Как в вон том JavaScript'e, только цифрами байты в массиве, и обратимо чтобы.
А причем тут javascript если это тред по C?
А вообще задача элементарная, вот накидал неоптимизированный вариант, для последнего байта проверку надо отдельно делать чтобы не вылезать за границу массива но мне лень.
>Хм, ну я же просил массив с int, или byte, а не char'ы.
char это и есть байт, потому что состоит из восьми бит.
>Да, я вижу - семибитные коды у них, но как их оттуда вытащить в массив?
Они уже в массиве ciphered. Я же даже напечатал его для тебя между раскодированными текстами.
>И вообще, я же хочу на JavaScript этот алго,
А он умеет работать с отдельными битами?
>а у тебя там вот такое вот:
>>buffer |= *foo;
это и есть работа с битами. Или ты планируешь получить биты, не зная ничего бит?
>вот и всё разбиение
Ну ты и фантазёр, конечно.
>А если резать по обычному то там может получиться такое
>11111110 00000011 11111111 -> 1111111 00000000 11111111... т.е. NULL-байт в поток
Это ничего страшного, если работать с этим как с массивом, то ты знаешь его размер, а эти байты вполне нормально расшифровываются.
>char это и есть байт, потому что состоит из восьми бит.
Вывод верный, но объяснение неправильное. В стандарте нет гарнтии, что сhar состоит из восьми бит. В нём не менее восьми бит. Так же, гарантируется, что размер char-a - один байт, вернее, формально, что sizeof возращает 1 на char и всех его квалифицированных вариантах.
Видал, но как-то дорохо... Добавил в закладки, скачаю через пару месяцев.
>В стандарте нет гарнтии, что сhar состоит из восьми бит.
Дело в том, что для того кода нет разницы, какой конкретно формат будет из восьми бит. Я просто ответил, что в том коде char — это байт фактически.
Это нестрашно, если ты работаешь и с тем и с тем сам, но если это передается где-то по сети, оно может случайно пройти через какой нибудь прокси сервер, который посчитает что это 0-terminated строка. Маловероятно, конечно, но base64 именно для того и придумали.
Вроде бы написал (хотя я пока только из одного текстового файла читаю, который щадаю в самом коде а не во время вызова исполняемого кода, но это я потом легко исправлю).
Условие и код здесь по ссылке ideone.com/h3ed25
Скорее всего я где-то облажался, но нк понимаю где, объясните как исправить, анончики. Надеюсь на вас.
Ну ты форкнуть-то форкнул, но почему у тебя оба процесса одним и тем же занимаются?
Делать за тебя я, конечно, не буду, хотя это быстрее, чем писать этот пост. Но код производит впечатление, что ты решаешь задачу методом тыка. После fork() у тебя запущены две одинаковые программы, но запущены не сначала, а с этого места. И каждая программа изнутри должна узнать, какая она из двух. Про это тебе должен был рассказать return форка, но тебе на него, почему-то, похуй. На самом деле, все просто, но иногда с концептуально новой идеей надо переспать. Именно поэтому весьма хуево запускать хвосты по учебе и компенсировать регулярность занятий интенсивностью за день до дедлайна. Документация в помощь, анон.
Это пони-тред? Расскажите, надо ли добавлять .git/ в .gitignore? Оно вроде так уже автомагически работает, но я нигде не могу найти, где это в документации написано.
Ээээ блядь, да у тебя и char указатель, ну в пизду. Я вон вообще про двач узнал спустя год с небольшим, как в Сишку вкатился. Нехуй на форуме делать с такими элементарными вопросами.
Вот я тоже как раз подумал что дело в этом. Проблема в том что я не знаю как сделать так чтобы процессы занимались разными задачами в одной программе.
»1646387
>Но код производит впечатление, что ты решаешь задачу методом тыка.
Именно это я в общем-то и делаю.
>Именно поэтому весьма хуево запускать хвосты по учебе и компенсировать регулярность занятий интенсивностью за день до дедлайна.
На лекциях лектор нам вообще ничего не объяснял про системные вызовы. >Документация в помощь, анон.
Да читал я документацию по fork и все равно не понял как сделать так чтобы разные процессы решали разные задачи а не одну и ту же вместе.
Разметку проебал
>>46384
Вот я тоже как раз подумал что дело в этом. Проблема в том что я не знаю как сделать так чтобы процессы занимались разными задачами в одной программе.
>>46387
>Но код производит впечатление, что ты решаешь задачу методом тыка.
Именно это я в общем-то и делаю.
>Именно поэтому весьма хуево запускать хвосты по учебе и компенсировать регулярность занятий интенсивностью за день до дедлайна.
На лекциях лектор нам вообще ничего не объяснял про системные вызовы. >Документация в помощь, анон.
Да читал я документацию по fork и все равно не понял как сделать так чтобы разные процессы решали разные задачи а не одну и ту же вместе.
И че, так и не понял, что первая программа получается pid второй, а вторая - 0?
>Вот я тоже как раз подумал что дело в этом. Проблема в том что я не знаю как сделать так чтобы процессы занимались разными задачами в одной программе.
Читай. Это довольно просто.
Спасибо. Осталось объяснить, куда он указывает, и почему ниже у тебя указатель на указатель.
Ты прав, это была моя ошибка.
>(cond) ? s += 32 переписываем как (cond) ? s += 32 cond
fix
(cond) ? s += 32 переписываем как s += 32 (cond)
>на гпу в шедерах используется такая техника
Потому что умножение, это то, что гпу делает хорошо. Как на тракторе быстрее через поле грязи проехать, а на легковушке в объезд.
спасибo пoнял.
А чтo рекoмендуешь в такoм случае испoльзoвать в качестве заглушки? прoстo задача из k&r требует именнo такoй метoд.
Пытаюсь перехватить руками дескрипторы процесса. форкаюсь, забираю стдаут, экзеклю это, и раскрашиваю аутпут. Чайлл обрабатывается следующей функцией.
Как видите принты до экзека никуда не приходят, а вот вывод эха нормально обрабатывается.
НО!
Если до вызова dup2() добавить ещё один принт, то он выведется (нераскрашенным, что естественно), и каким-то образом повлияет на остальные два принта, что их нормально перехватит и раскрасит.
Я подумал, что дело во времени, что родитель не успевает создать буфер и всё это, но добавление в чайда sleep() ничего не меняет.
Объясните, пожалуйста.
https://ideone.com/OcqfBO
ЯННП, но для начала я не вижу у тебя fflush(stdout), а это основная причина "не выводится".
Нет, в чайлда не помогло, ни в одну из этих позиций (в родителя тоже).
А что не понятно? Это, я так понял, стандартный метод по перехвату дескрипторов, если я что-то странное написал, давай поясню.
Чайлд пишет в стдаут, он буферизируется (не попадает в файловый дескриптор), ты запускаешь эхо, он пишет в файловый дескриптор. Тем временем ты читаешь из файлового дескриптора. Где нужно сбросить буфер, чтобы операции вывода в файловый дескриптор попали в правильном порядке? Правильно, перед тем, как ты будешь писать напрямую в дескриптор, т.е., прямо перед execv.
Спасибо, анон, за помошь и объяснение. Я думал, что dup2() заменяет stdout и того уже нет, так что писать можно только в переданный пайп.
дауны, вы. мне нужно такое выражение (условие) ? 1 вариант : 2 вариант. а не ваша хуита переделанная.
Не пoнял.
да лень. вы тут сразу oтвечаете. а так самoму кoпаться нужнo и время тратить.
что происходит в 27-й строчке, зачем это?
уйди пожалуйста
> что происходит в 27-й строчке
Undefined behavior. Да, если следовать стандарту, на сишке нельзя написать стандартную либу для сишки. Живи с этим.
В смысле зачем? Ты минус от плюса не отличаешь?
printf("%d\n", getpid());
sleep(40);
и у неё зачем-то 60 файловых дескрипторов. Откуда?
>Undefined behavior.
С чего ты взял?
Перечитай ещё раз стандарт. Для char'а есть куча исключений: любой валидный указатель кастится в валидный указатель на char. Более того, к области памяти можно обращатьcя не только по её эффективному типу, но и по указателю на char.
Плюс, сравнение указателей гарантированно даёт предсказуемый результат, если это указатели на части одного массива.
Вот только это не части одного массива.
А в чём заключается неопределенность? Адресное пространство процесса же сквозное, так что сравнивать адреса можно.
а да я уже дoдумал, чтo там же тип int, хм. тoгда надo пoдумать пoчему функция не рабoтает.
АХУЕТЬ В КНИГИ КЕРНИНГАНА И РИТЧИ OПЕЧАТКА.
всё равнo функция не рабoтает.
ошибка в v[mid] не извлекается элемент из списка поэтому и ошибка. а почему я не знаю. попробую разобраться
Сколько в книге страниц и на какой странице ты сейчас? Я по k&r с 10-го января где-то учусь, в данный момент на 53 странице где-то.
Ну это нормально, книга техническая сложная с задачами и длинная.
win api
Могли бы и сказать, что среда запуска может накидать за щеку дескрипторов. Это электрон шрифты всякие навтыкал, и ручек к разделяемой памяти.
>Как можно обратимо, закодировать массив байт в масив 7-ми битных значений, и наоборот - декодировать в байты?
>>45972
>SevenBits = byte & 127; //даёт 7 последних бит.
>FirstBit = byte >> 7; //даёт старший бит.
>>45974
>Так а... С массивом-то как ёпты, бля? А если у него ещё и произвольная длина?
>>45978
>Ты спрашиваешь, как можно закодировать 8 бит в 7, чтобы оно потом обратно в 8 бит раскодировалось?
>>45983
>многабукафф
>>45986
>Ложь, пиздёж и провокация.
>>46013
>Вот этого, гляжу, не объебёшь.
>>46014
>Дебажу расшифровку, не очкуй.
>>46015
>Неведомая шняга, на JS не катит.
>>46035
Да, твоя тема - нормас на си пахает.
>>46026
Код, вроде рабочий, но из-за буфера с большим int и операции '|=' портировать на JS - не получилось.
>>46039
Схулей размер ещё бит хранить, Ы?
>>46140
Там на входе - байты.
>>46157
Подобную последовательность битовых операций, примерно, я и реквестировал здесь.
>>46277
Мне надо было семибитные числа в массиве, а не восьмибитные. Да, в JavaScript тоже есть bitwise operators.
Только числа там ограниченное значение имеют, поэтому твой буфер не сработал.
>>46279
Хотя JavaScript'у и пофиг на нулли, но всё-же да, спецсимволы лучше убрать нафиг.
>>46323
Да, ведь байт от 0 до 127 - это тоже восьмибайтный байт, но зато - он может быть представлен одним ASCII-символом.
В общем, смарите, как я рубасы запилил: >>1648469 → (архивач: https://arhivach.ng/thread/546415/#1648469 )
Это совершенно новый, инновационный стандарт в IT-индустрии.
Можете юзать, кароч, и гонять, ксорить и конвертить эти ваши - байты. Бесплатно и без СМС. Код открытый. Добра, всем.
>Как можно обратимо, закодировать массив байт в масив 7-ми битных значений, и наоборот - декодировать в байты?
>>45972
>SevenBits = byte & 127; //даёт 7 последних бит.
>FirstBit = byte >> 7; //даёт старший бит.
>>45974
>Так а... С массивом-то как ёпты, бля? А если у него ещё и произвольная длина?
>>45978
>Ты спрашиваешь, как можно закодировать 8 бит в 7, чтобы оно потом обратно в 8 бит раскодировалось?
>>45983
>многабукафф
>>45986
>Ложь, пиздёж и провокация.
>>46013
>Вот этого, гляжу, не объебёшь.
>>46014
>Дебажу расшифровку, не очкуй.
>>46015
>Неведомая шняга, на JS не катит.
>>46035
Да, твоя тема - нормас на си пахает.
>>46026
Код, вроде рабочий, но из-за буфера с большим int и операции '|=' портировать на JS - не получилось.
>>46039
Схулей размер ещё бит хранить, Ы?
>>46140
Там на входе - байты.
>>46157
Подобную последовательность битовых операций, примерно, я и реквестировал здесь.
>>46277
Мне надо было семибитные числа в массиве, а не восьмибитные. Да, в JavaScript тоже есть bitwise operators.
Только числа там ограниченное значение имеют, поэтому твой буфер не сработал.
>>46279
Хотя JavaScript'у и пофиг на нулли, но всё-же да, спецсимволы лучше убрать нафиг.
>>46323
Да, ведь байт от 0 до 127 - это тоже восьмибайтный байт, но зато - он может быть представлен одним ASCII-символом.
В общем, смарите, как я рубасы запилил: >>1648469 → (архивач: https://arhivach.ng/thread/546415/#1648469 )
Это совершенно новый, инновационный стандарт в IT-индустрии.
Можете юзать, кароч, и гонять, ксорить и конвертить эти ваши - байты. Бесплатно и без СМС. Код открытый. Добра, всем.
Рубасы! Рубасы! Да это же новый стандарт в сфере мультипарадигмального императивного метапрограммирования:
Вот код: https://jsfiddle.net/bxLj7h61/1/
Какой эталонный шизодебил, нафантазировал себе бреда и купается в нем. По любому пердоля линуксоидная, они как раз такие обычно, туппппые как баррраны и такие же упертые необучаемые.
>0 до 127 - это тоже восьмибайтный байт, но зато - он может быть представлен одним ASCII-символом.
Если не нужна кирилица.
>Байтом он быть не перестаёт, а байт - это 8 бит.
>>49129
>Если не нужна кирилица.
Там RUBase128, кириллица используется чтобы сделать символы печатными, как в base64.
Удивительным образом, вся кириллица с латинницей плюс цифры - впихивается в 128 символов.
Таблица символов ASCII же, содержит в себе спецсимволы,
которые не дают строке отображаться, из-за чего строка не может быть скопирована, после кодирования.
Например, вот этот самый NULL-байт посреди строчки - дико выбешивает, так как означает конец строки.
C RUBase128 всей этой хуйни нет, но там нужна конвертация из 8-ми битных байт в 7-ми битные,
над чем пришлось ебать как подзаморочиться.
А RUBase256 вообще кодирует все 256 байт, безо всяких выебонов,
только вот длина данных чуть больше в самих этих байтах, просто по причине того,
что символы берутся из Unicode, и кодируются более чем одним байтом, ну и пофиг.
Зачем нужен с, если есть с++?
с++ разворачивается в довольно непредсказуемые портянки машинного кода
это может быть черезчур для какого нибудь микроконтроллера
Чтобы компилятор для с++ на ассемблере не писать.
>Зачем нужен с, если есть с++?
Потому что не всем нравится feature creep язык программирования
Поддерживать легаси, например ядро линукса.
Под микроконтролле пишут даже на питоне, а на крестах и подавно. Сишка нахуй не нужна.
Современный C написан на С++ ради 10% производительности на максимально низких (для высокоуровневых языков) системных программ
Для него легче написать компилятор
> pt = &ar1[0]
можно, а
> pt = ar1
нельзя
Во-первых, чтобы поддерживать проекты, которым уже по хуй знает сколько лет.
Во-вторых, чтобы учить нюфагов. В плюсах куча высокоуровенных фич (ссылки, RAII, наследование, смартпоинтеры, стдлиб где уже есть все структуры данных и тд), которые скрывают происходящее под ними, а чтобы писать быстрый код нужно понимать, как там всё байтойобится прд капотом.
Почему он так жрет память? В С скобочек больше и точка с запятой на каждой части команды. Наоборот же лишние знаки должны больше заполнить памяти.
>Под микроконтролле пишут даже на питоне
Для быстрого прототипирования, в основном. Серьезное никто ничего не пишет, потому, что все интерпретаторы скриптовой хуйни сильно урезанные и скорости проца нехватает.
>крестах
На микроконтроллерах свои особые кресты с костылями. Это не не совсем кресты, а скорее си с классами. Тк основные крестовые фичи либо не работают, либо нахуй не нужны из-за нехватки ресурсов. А байтоёбствовать удобнее на сишечке на которой написаны большинство библиотек.
Чистый именно под си и заточен. Пердоль та еще.
Не парься братиш, тут половина треда не видела программируемые микрочи в жизни, не говоря уже о промышленном БМ. Так, детки из школы 21 в перерыве между перерывами попукивают свое важное мнение
Начни с выражения своих мыслей. Простейшая практика, никаких наук учить не надо, но творит чудеса, сразу выявляя даунов, у которых мыслей нет, но думают что есть.
>Brian Kernighan, Dennis Ritchie "The C Programming Language"
Откуда взять входной поток для заданий из первой главы?
С клавиатуры вводи.
Никак. Continue переходит к следующей итерации ТЕКУЩЕГО цикла. Тебе нужен break и флаг. Во вложеном цикле выставляешь флаг, делаешь break, во внешнем цикле проверяешь флаг и делаешь continue, потом сбросить флаг не забудь.
Не понимаю, то ли я гений (не может быть), то ли дебилов массово в пробирках штампуют. Си с классами это тоже кресты, потому что в сях классов нет. Как можно не понимать очевидного, при том что тут и других вариантов даже нет. И даже без классов кресты это кресты, потому что в любой момент если захочешь классы будут. В этом и достоинтсво, что много есть, но ничего не навязано, можно сделать как в примитивном си, так и сложные вещи, а можно что-то среднее, да как угодно. А убогая сишка в которой кроме ограничений нет ничего, это ненужный нигде мусор. Очевидно же, ведь ограничения это недостаток, а не достоинств ство.
количество символов перед запятой
Пошел нахуй хохол
Проблема в том, что семантику Сишечки можно объять разумом, а сематика Си++ - это блядь просто огромное море лютого пиздеца, там нету правил, там нету даже правил с исключениями, там исключения из исключений исключений из правил. На каждый чих, на каждую блядскую фичу создано по сематической сущности, абсолютно бессистемно, в постоянной погоне за модой. Поэтому, ты можешь комфортно работать только в небольшом подножестве языка. И не надо мне, блядь, говорить про то, что мол, кококо, нормальному чуваку норм. На руках тоже можно ходить повседневно, но не факт что это признак большого ума.
И? Это плохо? Каждый работает в том подмножестве, которое ему по уму. Тупой работает в области си, поумнее работает с классами, еще умнее работает с шаблонными библиотеками и так далее. Или еще лучше, начинающий как вначале, но со временем умнеет , охватывая больше, но этот процесс неограничен, учиться можно всю жизнь, настолько язык глубок. Это же буквально рай для умного человека. Да и в целом, язык, охватывающий всё для всех и каждого, это же буквально бог, божественный язык.
Так что ненравится? То, что ты не осиливаешь ВСЁ И СРАЗУ? Что нельзя написать "я знаю в совершенстве". Что от этого у тебя комплекс и боль от осознания собственного несовершенства? И поэтому ГОВНО НИГУЖНА УБЕРИТЕ ОТ МЕНЯ! Так? Так. Поздравляю, классический дебил. И даже если бы сбежишь от си плюс плюс, так что он перестанет тебе напоминать что дебил, тебе все равно об этом напомнят, я например, или другие люди. В мине все равно везде естб не дебилы и при виде такого тупого тебя они молчать не будут. От себя не убежишь.
>поумнее работает с классами
И получается ебаный пиздец с логикой и иерархиями.
Мимо не любитель ООП
> Не понимаю, то ли я гений
>>51457
> И? Это плохо? Каждый работает в том подмножестве, которое ему по уму. Тупой работает в области си, поумнее работает с классами, еще умнее работает с шаблонными библиотеками и так далее. Или еще лучше, начинающий как вначале, но со временем умнеет , охватывая больше, но этот процесс неограничен, учиться можно всю жизнь, настолько язык глубок. Это же буквально рай для умного человека. Да и в целом, язык, охватывающий всё для всех и каждого, это же буквально бог, божественный язык.
Вот это шизоид, вот это да! Для офигенных любителей языков и выразительности есть хаскель и теория типа tapl, но судя по твоей бредятине ты до такого не дорос. C++ постоянно накачивают разного качества фичами, тебе говорят, что для написания выразительного (и производительного) кода нужно себя сильно ограничивать в использовании языковых конструкций. И это не из-за какого-то там "ума", большинство хороших кодерков смогут прикрутить к проекту любую фичу из языка.
И учить всю жизнь можно cs, а не какой-то отдельный язык.
>C++ постоянно накачивают разного качества фичами, тебе говорят, что для
Классическая безмозглая модная шлюха блондтнка.
1) Гонится за последней модой
2) Главное для ней - чужое мнение
Мань, куда ты лезешь, программирование не для такого сброда. Язык это инструмент, его используют как нужно конкретному мастеру для его задач. Не существует никакой моды и что там другие говорят себе в зеркало тоже их личное дело. Мастер использует то, что ему удобно для его дела. Своя голова, самостоятельное мышление. Тупым шлюхам не понять.
>Мастер использует то, что ему удобно для его дела. Своя голова, самостоятельное мышление. Тупым шлюхам не понять.
Покажи свой гит?
> Тупой работает в области си, поумнее работает с классами, еще умнее работает с шаблонными библиотеками и так далее.
Толстота.
мимо сеньор
Ты только что выдрал отдельный тезис из моего поста и зачем-то попытался подкрепить его продолжение своими убогими аналогиями. Зачем я только отвечал тебе...
Вот, цитируя полностью:
>> для написания выразительного (и производительного) кода нужно себя сильно ограничивать в использовании языковых конструкций.
У тебя видимо вообще никакого опыта разработки нет.
>Тупым шлюхам не понять.
А теперь я доведу до тебя небольшое противоречие, выходящее из твоих прошлых постов, которые отлично проглядываются в треде. Комитет так же остановил эволюцию стандарта С, как и твой ебнутый "мастер", не пользующийся какой-то "модой". Плюсовые фичи в С не пролезли. Для реализации ООП, шаблонов, исключений можно использовать макросы (которые иногда и в кресты приходится тащить, хотя страуструп очень сильно старался), программистам в отрасли этого хватает. Тогда, собственно, не совсем понятны твои претензии к С как к языку.
Задание:написать программу, которая считывает английский текст из файла и выводит его на экран, заменив прописной каждую первую букву слов, начинающихся с гласной буквы.
using System;
using System.IO;
class Program
{
static void Main()
{
string path = @"D:\text.txt";
try
{
using (StreamReader sr = new StreamReader(path))
{
string str = sr.ReadToEnd();
string alf = "aeiou";
string[] split = str.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < split.Length; i++)
for (int j = 0; j < alf.Length; j++)
if (split.StartsWith(alf[j].ToString(), StringComparison.InvariantCultureIgnoreCase))
{
Console.WriteLine(split);
break;
}
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
Console.ReadKey();
}
Console.ReadKey();
}
}
Задание:написать программу, которая считывает английский текст из файла и выводит его на экран, заменив прописной каждую первую букву слов, начинающихся с гласной буквы.
using System;
using System.IO;
class Program
{
static void Main()
{
string path = @"D:\text.txt";
try
{
using (StreamReader sr = new StreamReader(path))
{
string str = sr.ReadToEnd();
string alf = "aeiou";
string[] split = str.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < split.Length; i++)
for (int j = 0; j < alf.Length; j++)
if (split.StartsWith(alf[j].ToString(), StringComparison.InvariantCultureIgnoreCase))
{
Console.WriteLine(split);
break;
}
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
Console.ReadKey();
}
Console.ReadKey();
}
}
А куда писать, направь будь добр
Нашел, уже не нужно, спасибо.
Ну дайте пример чтo дoлжнo пoстoпить в прoграмму и чтo дoлжнo выйдти из неё.
а пoнял. спасибo. а этo пременимo тoлькo к алфавиту или ещё и цифры нужнo сделать? или тoлькo алфавит?
Можно не нести шизобред, если нужно ООП, шаблоны, исключения, берешь и используешь их, а если не нужны не используешь. С++ позволяет всё, делай что хочешь как хочешь без ограничений.
С же это поледка для компашки шизиков разработчиков ядра линукс. Примерно как Git, только гит оказался полезным и за пределами шизокружка, а си нет, ведь уже есть то же самое, но с плюсами.
Я вот пишу только на питоне, там всё есть.
Так ты не корми, и их не будет.
>Зачем нужен с
Чтобы были уязвимости с переполнением буффера, очевидно, это выгодно мировой закулисе.
Чё? Я не про ньюфагов которые задают шизовопросы уровня анон почему це це или что такое баит, а про шидерьмо вроде поста через один наверх от того на который ты ответил
А пoнял ты прo питoниста тoгo. Думал прoстo чтo вас ньюфани заебали.
А если у тебя там развалится malloc?
Ты не увиливай, а четко мне укажи каким инструментом языка ты эту ситуацию "локализуешь" и в какой подпрограмме/функции какого процесса.
А еще я не знаю про какие дефайны ты там говорил, попробуй примерно указать конструкцию, которую они оборачивают в коде.
>А еще я не знаю про какие дефайны ты там говорил,
>Для реализации ООП, шаблонов, исключений можно использовать макросы
>не увиливай
Ясно.
Какую "ситуацию"? Что такое "развалится оператор new?" Плашка памяти выпадет из слота?
int main(void) {
return 0;
}
или
int main(void)
{
return 0;
}
в книге k&r первый вариант демoнстрируют пoстoяннo
В наше время первое.
Это книга, а у тебя экран. Много бумаги сэкономишь, если лишнюю строку не добавишь?
Оператор new не справился с задачей и выдал std::bad_alloc. В обработчике обработать ошибочную ситуацию невозможно (как всегда, хехе).
Дефайны мне тут никакие не приплетай, они здесь не нужны. Про аллокаторы можешь меня тоже не спрашивать, я тебе могу хоть mmap в оператор завернуть, это не имеет разницы.
>Дефайны мне тут никакие не приплетай
>сам приплетает
>Для реализации ООП, шаблонов, исключений можно использовать макросы
Понятно.
Еще раз, товарищ зеленый, здесь нет никаких ооп и шаблонов, никаких дефайнов и языка Си. Я поставил вам вопрос:
>>в обработчике сигнала внутри многопоточного сетевого софта присутствовал оператор new, он выдал std::bad_alloc
Вопрос стоит только в рамках языка C++. Мне очень, очень интересно, как бы вы средствами языка локализовали и обработали эту ошибку.
>здесь нет языка Си
Зачем тогда срешь в треде си. Срут не от большого ума, катись обратно откуда вылез, даун.
Ты не мне такой вопрос задавай, а шизику, который решил здесь устроить очень содержательное сравнение крестов и сей. Условие я дописал к посту чтобы он окончательно обосрался и больше ничего сюда не писал. И, как ожидалось, его уже давно не видно.
Завершение процесса или передача управления из обрабочика сигнала - вопрос общий для двух языков. Просто реализация исключений (в т.ч. в виде C-макросов или C++) не позволяет им выбрасываться из обработчика сигнала.
>товарищ зеленый
Тут только ты
>здесь нет никаких ооп и шаблонов, никаких дефайнов
Вот же >>51695
>Для реализации ООП, шаблонов, исключений можно использовать макросы
>Вопрос стоит только в рамках языка C++
Ты ошибся тредом.
>Мне очень, очень интересно, как бы вы средствами языка локализовали
Никто тебе не писал что "только средствами языка". Просто когда я уже найду место, где программа упала, ты все еще будешь разматывать макросы и пытаться понять в какой же строчке это произошло.
>И, как ожидалось, его уже давно не видно.
Потому что у меня есть чем развлечься вечером и без твоей тупости.
>>никто не писал "только средствами языка"
Я тебе прямо такой вопрос задал дважды. Ты ничего не можешь ответить.
>А как обработать возврат NULL malloc'ом? И так и так падаем.
Самое простое - крашнуть прогу. Если не крашнуть самому - могут начаться злодейства.
Если чуть поумнее, то можно созранить состояние проги, не используя дополнительного выделения памяти (и опять же крашнуться после).
Если у тебя какой-то хитрый алгоритм, который адаптивно жрёт дохуя памяти, можешь это просто использовать как сигнал пойти по пути меньшего пожирания этой самой памяти
.
Не обрабатывать ошибки выделения памяти (да и ошибки вообще) - признак долбоёба.
Правильно, но я указывал что эта злодейская ошибка случилась с malloc (new) внутри обработчика сигнала.
>>52279
Была бы данная ошибка внутри обычной процедуры - можно было бы откатить все действия процедуры назад и вернуться с кодом ошибки. Но она произошла не в процедуре, а в другом контексте. Из этого выходит что эксепшен нельзя выкинуть из обработчика, он не попадет ни в один catch и терминирует программу. Ну и получается нам нужно (в условиях текущего стандарта c++) эксепшен ловить на месте и лезть в древние posix_c siglongjmp/setcontext чтобы сменить контекст вручную. Или лезть в boost.asio, где уже разработали нужные оберточки, с тем же успехом прикручиваются нужные интерфейсы в виде библиотек к сям.
И вот как-то так выходит, что еще надо на data layout обратить внимание, с сишным api поработать, какую-то часть стандартной библиотеки переписать, поработать с легаси. И так в некоторых проектах проектах мы просто приходим к си, где язык дополняют либы и container_of.
Мнение студента с опытом из laba1, laba2
Бамп.
Подскажите, какая разница между языками D и C? Вот прям пример на одном, пример на другом. Везде одни словеса пространные, и я ничего не понимаю. Это если вообще найти возможно - назвали же ёпанавашу 1 буквой.
А зачем эксепшены? Делаешь cleanup процедуры, чистые данные помечаешь как NULL.
Значение некорректно из-за преобразования char в float, но когда я пробую получать в float значение пишет что определенно слишком типов, как мне получить нужное значение в клавиатуры чтобы функция работала корректно?
getchar() получает символы, при чём по одному. Число 546 — это 3 символа, например. Тебе, видимо, хочется функцию scanf().
Я уже пытался ее прикрутить, но так и не понял как ее правильно прикрутить, покажи пожалуйста
"&" я так понимаю это ссылка на участок в памяти где хранится переменная или что это? Почему без нее не работает и как это правильно использовать? В примере я ничего подобного не видел
Таки работает, большое спасибо, если бы не ты, я бы долго пердолился
>В примере я ничего подобного не видел
Потому что char str1[20] означает, что str1
>это ссылка на участок в памяти где хранится
массив из 20 чаров.
>как это правильно использовать?
Пока просто запомни, что в сканфе нужно писать &. Почему и как потом разберёшься.
>Пока просто запомни, что в сканфе нужно писать &. Почему и как потом разберёшься.
Ок, так и сделаю
>Пока просто запомни, что в сканфе нужно писать &. Почему и как потом разберёшься.
Байтобляди in a nutshell
А потом память течет и миллиарды хакерами воруются.
Хорошо, что Rust и прочие языки ведут свое победное шествие и отправят вас на свалку истории
Бля, Шарп слишком сложный, продолжаю прототипировать на Си
Все. Совсем в шары долблюсь. Забыл указать возвращаемый тип. Спасибо.
Да кого вообще волнует название переменных в очередном мертворожденном прототипе проекта, который я никогда не доведу до конца, так как программист как из говна пуля?
Ну это просто такой показатель знания тобой языка и твоего отношения к программированию. Нормальный человек так не напишет.
Вроде нигде не заявлял, что знаю язык уровнем выше чем "читаю технический текст". В голове всплыло children вместо child - использую.
Всегда пишу childs, замечательно отношусь к программированию, на пиндосов похуй.
Допустим есть программа hello world SDL2. Сам SDL кроссплатформенный, есть костыль-компилятор mingw с прослойкой для запуска этого дела под шиндовс, но для его работы все равно нужен отдельный пакет специально заточенный под mingw. Разве там не те же исходные тексты что и под линупс? Почему он не может взять include просто из линукса?
Отличие для меня лишь в том что в линуксе libSDL2 будет установлен в пакете, а в шиндовс эта DLL будет лежать в папке с программой, остальную совместимость должен обеспечить mingw. Не?
В чем сложность?
полный нубас
> Разве там не те же исходные тексты что и под линупс
Берешь те же тексты, mingw, configure, make, все дела, но это долго. А готовый пакет ты распаковал куда-нибудь, cc mygovnokod.c -Lmysdl2path -Imysdl2path -lSDL2 и все. Или даже без -L/I, если положишь в правильные директории.
SDL это библиотека, библиотека это тоже программа, программы распространяются в бинарниках, а не исходном коде. Бинарники разные на разных системах, и не только windows, они и на каждом линуксе разные. В пакете находятся бинарники, поэтому пакеты везде разные, не только относящиеся к mingw.
>совместимость должен обеспечить mingw. Не?
Не. Разные системы разные, совместимости нет нигде, это прорагандистские бредни для идиотов. Точнее, есть только в windows обратная совместимость (старые программы работают на новых виндах), но не наоборот. На других системах кроме винды и такого нет, там вообще полное отсутствие совместимости.
Я знаю что в линуксе все пакетами и я хочу в два клика собрать и под винду и под линукс из линукса. Под линукс он собирает естественно нормально, но для cygwin нужен какой-то свой пакет т.к. он не видит инклуды которые есть в системе.
Короче я все понял. В пакетах специфичных для cygwin идут dll и *.a файлы.
Я просто хотел чтобы как в python pip install все загружалось и подсасывалось само, а не я голову ебал как это слинковать:
>i686-w64-mingw32-gcc -I"./SDL2-2.0.12/i686-w64-mingw32/include/" -w -Wl,-subsystem,windows concept.c -L"./SDL2-2.0.12/i686-w64-mingw32/lib/" -lmingw32 -lSDL2main -lSDL2
Таскай все эти .dll с собой в одной папке, а компилятору пусть скажет cmake.
>Я просто хотел чтобы как в python pip
Питон и пхп это веб-скрипты, они не имеют платформы и вообще не программы, а скрипты. А на си пишутся программы, а программа это такая штука, которая под платформу написана. Отсюда натуральный вывод: мультиплатформенных программ не существует, что означает, любому хуесосу с кукареками про "мультиплатформенность" в треде языка си нужно пиздовать нахуй отсюда. Не туда зашел, петушок.
>Питон и пхп это веб-скрипты, они не имеют платформы и вообще не программы, а скрипты.
К чему имеет биндинги (qt, sdl2) оно подсасывает само.
Твой набор слов не имеет смысла, бредятина. Не понимаешь разницу между программой и скриптом и мелешь чушь как результат. Иди нахуй, сначала обучись элементарной компьютерной грамотности, а потом приходи. Здесь тред си, а не обучения чайников основам компьютерной грамотности.
>Твой набор слов не имеет смысла, бредятина.
Это ты даун. В питон если сделать pip install мне не надо отдельно качать SDL чтобы pySDL2 заработал.
До того как я начал разбираться речь шла о дистрибуции и инфраструктуре, а не чем отличается скрипты от программ. Не знаю почему ты сагрился и тяфкать начал.
>а программа это такая штука, которая под платформу написана. Отсюда натуральный вывод: мультиплатформенных программ не существует
Говорилось очевидно про сам исходный код и ты это знаешь, токсик. Через какие костыли оно будет собираться мне не важно. Мне важно чтобы все пакеты нужные для этого были доступны в два клика, как это сделано в менеджере пакетов для cygwin например.
Даже в арче есть костыли чтобы это не искать в отличии от debian'а. Я сетовал на то что даже в python с pip install есть такой функционал и он качает в том числе бинарники, не надо искать ничего, могли бы в рамках mingw реализовать подобное.
Терминальный необучаемый дебил, как и ожидалось от веб-макаки. Нельзя лезть в алгебру не зная арифметики. В школе не зря учат последовательно, снизу вверх. Но как только кончается школа, дебилы радостно лезут сразу в дебри, не понимая элементарных основ, ведь больше нет няньки в лице государственной принудительной системы образования, а сами за себя сообразить своими куцыми мозгами не могут.
А вот, например, надо в функцию передать строку или структуру. Можно конечно всю строку в стек запихнуть (нет), а можно просто указатель передать на начало строки.
Си это как раз переносимый язык
Я люблю Си, но мир же не будет вечно жрать говно от эксплоитов, которые существуют только благодаря тому, что Си еще не умер (ну и легаси код крестов без RAII). Ваши прогнозы?
мимо разраб драйверов на богоподобный линукс
А в чем проблема? Он быстрый как кресты, на нем уже ядро ОС написали и пишут дрова, включая дрова на уже существующие ОС. Если не системный, то какой? На нем легко можно байтоёбить.
window_caption[150] = "";
program_name = "Test";
program_version = "0.0";
FPS = 150;
snprintf(window_caption, sizeof(window_caption), "%s v%s", program_name, program_version);
snprintf(window_caption, sizeof(window_caption), "%s; FPS: %u", window_caption, fps_current);
[/CODE]
Хочу сложить строку caption = caption + "text"
Почему во втором snprintf у меня не выводится %s, только FPS: %u? snprintf не работает сама в себя? (linux)
Ага, Лайнус так и побежал побежал переписывать Линукс на раст.
Боюсь что ждать минимум лет 50, скорее всего не на твоём веку.
> Он быстрый как кресты, на нем уже ядро ОС написали и пишут дрова
Слышал такое слово в слово про C#.
> А в чем проблема?
В реализации linked list на две страницы.
>>56131
> snprintf не работает сама в себя
Нет. Первый аргумент объявлен как restrict, значит компилятор имеет полное право подразумевать, что других указателей на window_caption в функцию не передали, и применять соответствующие оптимизации.
> Хочу сложить строку caption = caption + "text"
strcat или n = sprintf(buffer, ...); n = snprintf(buffer + n, ...) (с проверкой ошибок и соответствующим уменьшением размера буфера, разумеется).
> Слышал такое слово в слово про C#.
Щас бы писать ОС и дрова на языке, который исполняется виртуальной машиной, ммм... (да-да, я знаю, что дотнет кор умеет компилиться в нативный код), но во времена появления сишарпа такого не было и такого ты слышать явно не мог, да и этого не происходило вовсе, а на Расте УЖЕ написана ОС и УЖЕ написано неплохое кол-во системных утилит, как для языка, которому лишь 5 лет. Через 15 лет он убьет Си точно, про кресты не могу сказать.
> В реализации linked list на две страницы.
И? Обернут в стандартную либу и все, кого это должно ебать, если у тебя программа в итоге защищена от целого класса атак, причем самых опасных.
Твой раст нужен только на серверах, и то не нужен, ведь там уже есть питон. Мертворожденная поделка.
Он никакой не мой. Но поясни почему, аргументы такие себе. Почему язык, превосходящий другие языки для таких же целей, только старые, не может в перспективе его убить?
>дрова на языке, который исполняется виртуальной машиной, ммм..
Какбэ... Виртуальные драйвера уже в виндовс95 выполнялись (потому что как ты ещё сделаешь многозадачность на одноядерном процессоре) и писали их думаю на сишке.
мимокрестовик
>превосходящий другие языки
На словах пиздунов, а на деле мы имеем Firefox - самое тупое, тормозное, жирнющее говнище из миллиона процессов, которому чтобы отобразить текстовые веб-странички нужен кластер суперкомпьютеров чтобы не тормозить. Вдобавок текущее как шлюха из всех дыр водопадами, просирая бесконечное количество гигабайт памяти. Такая-то скорость, надежность и безопасность, хоть вот прямо щас весь софт на свете переписывай на этом говне, чтобы миру пизда настала.
Покажи мне дрова для винды/линуха на расте.
И тут ты такой показываешь тонкий, красивый, лёгкий, полнофункциональный браузер для современного веба.
>Первый аргумент объявлен как restrict, значит компилятор имеет полное право подразумевать, что других указателей на window_caption в функцию не передали
Спасибо, добавил переменную buffer через которую теперь делаю.
И тут я показал язык, на котором даже его создатели высирают парашу говна, хуже в мире не найти. Теперь подмойся и скройся, выродок.
>Сталь — плохой сплав, вон какие грузовики гигантские и дорогие приходится из неё делать, чтобы руду возить.
>Покажи лёгкий грузовик, который с такой же задачей справится
>Риии, из стали говно тяжеленное делают и чинить сложно!
Почему раст сосет, а Си топ? Ладно там кресты, это реально монстр, там реализованы все возможные парадигмы, можн окак байтоебить, так и писать абстракциями чуть ли не как на петоне (на поздних стандартах офк).
Но Си? В нем же нет ничего. Да, быстрый, но по бенчмаркам раст == си по скорости, но при этом полностью безопасен в плане памяти. Почему никто не может конструктивно ответить. Нечего ответить по существу? Так так и скажите, что сливаетесь.
Ладно братиш ты нас раскрыл, на самом деле мы все данво на расте а тут просто отыгрываем разговор студентов из молодости, давай в раст-тред, там пообщаемся на вопросы твои ответим
> на Расте УЖЕ написана ОС
На C# УЖЕ написана ОС
> во времена появления сишарпа такого не было
Было. Те же самые разговоры были, что, мол, сейчас вот заживем. И программы без уязвимостей будут, и сишка уже умерла, и жабке пизда заодно.
> И? Обернут в стандартную либу и все
И все, останется только виртуальную машину добавить. А на сишке это две строки, которые даже в отдельную функцию часто не оборачивают.
>>56176
> язык, превосходящий другие языки
Сишке ты говоришь "зделой", и оно делает да, с UB, если ты не понимаешь, что ты делаешь, и почему. Расту нужно вылизать анус, чтобы он возможно согласился зделоть, и у тебя все равно будут те же самые проблемы, что и в сишке, потому что без ансейфа в расте можно только хелловорлды писать. В результате мы платим больше и за это имеем лишь больше проблем и потенциальные полпроцента прироста производительности из-за лучшего анализа алиасинга, но когда-нибудь потом.
>Почему раст сосет, а Си топ?
1. С Проще освоить.
2. Есть на любой платформе. Качественный компилятор
3. Язык стабильный.
4. Куча справочных материалов.
5. Не нужны обертки чтобы использовать сишные либы.
6. Куча тулзов для профилирования, статического анализа
7. Можно работать за деньги
> На C# УЖЕ написана ОС
Сишарп изначально не позиционировался как системный язык, в отличие от раста.
> И все, останется только виртуальную машину добавить. А на сишке это две строки, которые даже в отдельную функцию часто не оборачивают.
Две строки? Развернуть структуру, написать функции удаления/добавления элемента в список, где опять же могут быть проблемы с памятью.
> Сишке ты говоришь "зделой", и оно делает да, с UB, если ты не понимаешь, что ты делаешь, и почему. Расту нужно вылизать анус, чтобы он возможно согласился зделоть, и у тебя все равно будут те же самые проблемы, что и в сишке, потому что без ансейфа в расте можно только хелловорлды писать. В результате мы платим больше и за это имеем лишь больше проблем и потенциальные полпроцента прироста производительности из-за лучшего анализа алиасинга, но когда-нибудь потом.
даже уязвимый код в ансейфе почти невозможно поиметь, у растовых бинарях мемори лэйаут абсолютно другой, там переполнения блять в ансейфе не работают, максимум могут быть траблы с указателями, и то в адовом говнокоде. При этом при аудите сорцов можно будет сфокусироваться именно на ансейфе, потому что другое просто неуявимо. И шанс проебать баг, тем более критический, сокращается в охуилярд раз
1. И проще прострелить себе ебало, ибо сегфолт и Си - братья навек
2. Дело времени, причем недолгого
3. Стабильный в крашах, мемори ликах, гуляющих указателях, переполнениях, UB? Безусловно
4. И? У раста тоже есть книга и пиздатая документация, не аргумент
5. Дело времени х2, язык молод, но растет как Алёша на астероидах
6. Куда тулзов для статического анализа, а 80% кода на Си имеют дыры, лол
7. Огромное количество компаний, которые занимаются блокчейном, уже перешли на раст, ибо там безопасность превыше всего.
Угомонись, Раст исправляет какую то одну микроуязвимость, все остальные дыры будут в нем те же
В мире нет ни одного зарегитрированного случая взлома растового бинаря. А попытки уже были. Его память неуязвима, там только специально можно что-то сделать
Вот когда будет сравнимое количество софта на расте - будут и взломы не будет, он умрет раньше. А пока пишут только всякое говно, которое иначе написали бы даже не на си или крестах, а на питоне.
Количество написанного софта в этом случае не повлияет - проблемы Си были известны с момента рождения этого языка. Если вдруг весь мир перейдет на раст - магическим образом не смогут взломать то, что не взламывается, только если нарочито не плодят бэкдоры
Ой что это у нас тут, буффер оверфлоу в стандартной либе. А я тебе говорил не высовывайся, обосут
Растошизики, успокойтесь. Сишку не сместить, вам только если кресты с гейдева какого-нибудь вымещать, но и то не факт.
Сделать PROCESSENTRY32W* дополнительным аргументом, возвращать int-овый статускод. Алсо, у тебя рот в winapi измазан, вытри.
Ебан, ты? Важные для компиля/системы статус коды в винапи уже завернуты, для себя возвращай чё хочешь и как хочешь
Ахуеть, ты как это сделал? Я уже полгода-год туда не захаживал.
Какую-то хуйню напечатал, не смотрите.
Где рабочий эксплоит к этому, Маня? Даже если в расте есть какая-то там дыра, из-за мемори лэйаута, который устроен не так, как в сишных бинарях, ты не сможешь это эксплуатировать нормально.
Хуйню не неси, долбаеб.
Ебан, вернись уже в свой тред. Ломают и будут ломать твой Раст, как и сишку, пока мы все на х86 сидим
А на других платформах что? По-моему тот же ARM и RISC-V не имеет никакой разницы в плане эксплуатации программ
мимоанон
Если pederust не дает мартышкам срать в память, то это не значит, что выходной бинарь на 100% безопасный
Есть структура SDL_Surface img = NULL;
Я хочу загрузить в нее изображение.
В обычном варианте это будет выглядеть как:
SDL_Surface img = IMG_Load("../img_path/test.png);
Но я хочу чтобы это делалось через мою функцию вида:
bool loadImageToSurface (SDL_Surface destination, char path)
Т.е. она возвращает 0 если все норм, и 1 если ошибка.
Вопрос, как в нее надо передавать SDL_surface чтобы функция именно с внешей переменной работала? Через & не работает.
>>57071
В чём проблема? Вот так сделай.
https://pastebin.com/G6LZ9sS4
На других платформах то же самое - если кекогерцы не кукурузные, значит есть всевозможные Side-channel уязвимости, которые даже на сраном жаваскрипте без эксплойта в нейтив код юзаются.
>Где рабочий эксплоит к этому, Маня?
С козырей зашел, мое увожение. Нельзя написать эксплоид к расту, если растоговно нигде не используется. Нечего взламывать, понимаешь?
100% безопасность из коробки
если нету unsafe, то безопасно
рабочих эксплоитов нету <<-- Вы находитесь здесь
да, взломали, но ничего серьезного
сами виноваты, надо было нормально писать
> на сраном жаваскрипте без эксплойта в нейтив код юзаются
В лабораторных условиях при правильной фазе луны. Но это никак не относится к нинужности раста.
дебилушка, пока есть уязвимости в железе - хоть на залупе своей пиши - выломают
нормально или хуйня? https://pastebin.com/v9mXETRv
говорилось именно про уязвимости памяти, а не в общем. Раст мартышке не даст скомпилить бинарь, где есть переполнение/висячий указатель/двойное освобождения памяти.
да будет тебе известно есть такое понятие, как proof of concept. Пишут эксплоит, чтобы чисто показать возможность локального/удаленного исполнения кода, дабы показать, что уязвимость не пластмассовая, а найти кого взломать всегда можно.
Я тебе открою секрет, его нет просто потому, что его не смогли написать.
Есть, но:
а) При тестах на такой род уязвимостей можно смело концентрироваться на местах, где есть ансейф, ибо другие места защищены уж точно
б) В случае проблем с памятью, в виду специфики лэйаута в памяти растовых бинарей, заиметь контроль над исполнением программы почти нереально. Техники взлома, которые работают в Си и крестах, там бесполезны
а какие сейчас техники взлома в плане передачи управления на произвольный код? стек и память разве исполняемые всё ещё?
Возвратно-ориентированное программирование, приятного гуглежа. Шеллкод не вхуяривают уже лет как 10, с подключением.
>Возвратно-ориентированное программирование, приятного гуглежа
и как этому противостоит раст? эта проблема решается на уровне компилятора.
Лолшто, как тебе компилятор поможет? Ты знаешь что такео возвратно-ориентированное программирование вообще или нет?
В расте ты не моешь писать за пределы буфера и не можешь заебнуть указатели и насрать в кучу. Это никак не связано с тем, что ты сказал.
>Лолшто, как тебе компилятор поможет? Ты знаешь что такео возвратно-ориентированное программирование вообще или нет?
ты чё такой борзый? дыши ровнее.
> В расте ты не моешь писать за пределы буфера и не можешь заебнуть указатели и насрать в кучу.
если есть ансейф - то можно. и есть библиотеки, которым ты доверяешь что они безгрешные.
> Это никак не связано с тем, что ты сказал.
в смысле не связанно? ты затираешь возврат на стеке в заранее известны код, где-то у ret. и прыгаешь дальше, выполняя свою задачу чужими руками. тупо гугл даже выдаёт опцию в гцц, например -fcf-protection . а сколько там стек протекторов
>Хуйня. А вот прогонять через санитайзеры - это всегда хорошо.
не, не хуйня. я хочу максимальную переносимость. и не хочу печатать лишние скобочки.
или мне так показалось. в общем, мне бы друзей найти, а то я пишу в стол и никому ничего не показываю. мотивации всё меньше.
> если есть ансейф - то можно. и есть библиотеки, которым ты доверяешь что они безгрешные.
Раст на пути юзать только растовые либы.
> в смысле не связанно? ты затираешь возврат на стеке в заранее известны код, где-то у ret. и прыгаешь дальше, выполняя свою задачу чужими руками. тупо гугл даже выдаёт опцию в гцц, например -fcf-protection . а сколько там стек протекторов
Во-первых, бинари как правило не компилят с этой опцией, особенно если они должны быть быстрыми, так как эта мера имеет сильное влияние на скорость исполнения. Во-вторых, есть модифицированная техника обойти и эту защиту -> https://marcoramilli.com/2016/06/23/from-rop-to-lop-bypassing-control-flow-enforcement/, приятного аппетита и с добрым утром, нашли способ как это обходить еще в 2015-2016. В-третьих, стек протекторы - слабая защита. Если у тебя есть примитив либо на чтение, либо на запась (даже 1 из них сгодится) - ты сливаешь значение протектора и переписываешь его его же значением, чтобы он при возврате не крашнул прогу, либо при примитиве на запись ты записываешь ЗА протектор, сразу перезаписывая сам адрес непосредственно. В-четвертых, на стэке свет клином не сошелся, есть еще куча.
> я хочу максимальную переносимость
Скажи, сколько твоих хелловорлдов (в штуках) было скомпилировано и запущено на платформах, где нет поддержки C11?
ну, логично что на всякую гайку найдётся болт. не буду спорить, мне не очень интересно. но хорошо, и да, литературу по взломам я читаю только старую из 00х, чисто в развлекательных целях.
>>57326
я пишу на старые системы. например спектрум. sdcc вроде есть поддержка, но нет
Compound literals.
Variable-length arrays.
да и смысл в новых стандартах? писал бы на пк - может быть, но тоже вряд ли. просто не вижу смысла.
статик ассерт можно самому написать, фикс-типы самому определить. треды поставляются отдельно. атомики - ничего не могу сказать.
Стек это структура данных в которую можно помещать какую-то информацию. Стек работает по принципу первый пришел - последний вышел. Тоесть если ты положишь в стек сначала 1, потом 2, потом 3. Ты вытаскиваться будет сначала 3, потом 2, потом 1. Почитай внимательней, там скорее всего где-то упоминается что именно за стек. Так как есть некоторые нюансы. Алсо если ты читаешь описание алгоритма то там возможно неявно подразумевается что ты создашь стек который и будешь использовать.
а спасибо, я это уже читал.
видимо это
> если ты читаешь описание алгоритма то там возможно неявно подразумевается что ты создашь стек который и будешь использовать.
там описание программы, ну да просто не понял откуда они там стэк взяли. всё спасибо, анчоусы.
Еще при запуске программы для нее создается служебная структура-стек которая используется для хранения адресов возврата, аргументов, некоторых переменных. Когда говорят "стек" могут подразумевать ее, но к ней нет прямого разумного способа доступа, поэтому фразочки типа "взять стека" и "вернуть в стек" к ней не применимы. Обычно используется что-то типа "переменная хранится на стеке". А если в него и пишут что-то - то там пишут по адресам.
В винде есть привилегии, требующиеся для разных действий, выполняемых системной, их наличие у процесса зависит от способа запуска и от пользователя, под которым процесс запущен. Но даже если программа запущена из-под админа, некоторые привилегии по умолчанию выключены (возьми Process Explorer или Process Hacker, и в свойствах процесса на вкладке Security увидишь). Код включает SeDebugPrivilege.
>>57898
> к ней нет прямого разумного способа доступа
_alloca()
Хмм, не помогло, #pragma once тоже не помогло.
Заметил только разницу, если инклудить непосредственно в каждый мой файл, линкер вываливает целую кучу конфликтов, похоже все функции какие есть, а если положить в stdafx.h (который везде заинклужен), тогда выводит конфликты только тех функций, которые я реально вызывал, и их зависимые.
На глаз очень классно, видно, что мужик шарит.
Мне кажется, большая часть хейта в его сторону исходит от неосиляторов.
Дебил, ты вопрос читал?
Да вот , сижу читаю про CUDA, правда не хотелось бы привязыватьсяся к nvidia только. Надо потом постмотреть по OpenCl.
Ты с OpenCl работал?
>>59535
Как удачно, как раз хотел задать о них вопрос.
А opencl умер?
Последний релиз в 17 году.
А то хотел локально на радеоне (мак) на нем попробовать оптимизировать вычислительную задачу, что бы потом не парясь запускать в облаке, на чем-то от Nvidia.
А потом смотрю, книги все о нем старые, релизов давно нет.
Сейчас есть альтернативы?
Спс
Но выбор между opencl, hip и cuda (с трансляцией в HIP), все равно стоит.
Байтоебы, помогите выбрать, что перспективнее, если у тебя карточка amd.
Это копия, сохраненная 26 июля 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.