[Ответить в тред] Ответить в тред

Check this out!


<<
Назад | Вниз | Каталог | Обновить тред | Автообновление
521 | 24 | 150

C Programming Language #33 /clang/ Аноним # OP  27/08/18 Пнд 20:14:11  1253747  
C Programming L[...].png (78Кб, 792x1023)
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь https://ideone.com/ или http://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 (драфт)
- man/Dash/zealdocs

Чем конпелировать:

- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.

Что еще почитать:

http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.

Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.

Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).

Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.

Ben Klemens "21st Century C: C Tips from the New School" (2012)

Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)

Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)

MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard

Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C

Онлайн-утилиты:

- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.

Прошлые треды:

- №30: https://arhivach.cf/thread/366174/
- №31: https://arhivach.cf/thread/366210/
- №32: https://arhivach.cf/thread/375538/
Аноним 27/08/18 Пнд 20:41:03  1253759
Первыйнах
Аноним 27/08/18 Пнд 20:43:11  1253760
>>1253759
съеби
Аноним 27/08/18 Пнд 20:48:33  1253763
>>1253760
Проверяй
Аноним 28/08/18 Втр 16:12:26  1254138
В чем преимущество Си перед Растом?
Аноним 28/08/18 Втр 16:15:54  1254140
>>1254138
> В чем преимущество Си перед Растом?

В имеющихся компиляторах. И библиотеках.
Аноним 28/08/18 Втр 16:18:10  1254143
>>1254138

Я имел ввиду тхт аспекты, а не наработанные тонны легаси
Аноним 28/08/18 Втр 16:18:44  1254144
>>1254140

опс
>>1254143
Аноним 28/08/18 Втр 16:53:55  1254176
>>1254143
Ты путаешь легаси и инфраструктуру. А еще си до некоторого предела проще.
Аноним 28/08/18 Втр 17:10:32  1254208
>>1254138
Один сделали больше 45 лет назад и он до сих пор нужен, другой сделали недавно и он уже востребован.
Аноним 28/08/18 Втр 17:11:05  1254209
>>1254208
>фиксатор
не востребован
Аноним 28/08/18 Втр 17:13:06  1254212
>>1253759
>номер поста #2
>первонах
Аноним 28/08/18 Втр 17:15:35  1254215
>>1253747 (OP)
Хелоу гайз, счаз усиленно занимаюсь си и всем сопутствующем, очень нравится , но задумался как потом зарабатывать на чистом си , посмотрел вакансии и всем программисты хай лвл языков, понятно что всегда можно писать что то свое на си , но в интерпрайзе что делать то потом ?
Аноним 28/08/18 Втр 17:18:38  1254218
>>1254215
Си никому не нужен. Си мёртв, а оп некрофил.
Аноним 28/08/18 Втр 17:20:11  1254220
>>1254218
странно язык оч крутой , прикольно на нем реализовывать вещи которые есть в других языках , да и вообще удобный
Аноним # OP  29/08/18 Срд 00:04:09  1254468
>>1254218
ОП, конечно, некрофил, ты прав. Он пишет на Си фор фуд. Некоторые заказчики ОПа до сих пор не то, что от крестов шарахаются, а даже от C11/C99. Такие дела.

>>1254215
В интерпрайзах Си нет, там надо быстро сделать, потом выбросить и снова сделать. В embedded Си востребован, ни про какие расты там не слышали. Но сам по себе, без знания предметной области, Си нигде и никому нахуй не уперся. Впрочем, как и большинство других языков.
Аноним 29/08/18 Срд 00:16:52  1254471
>>1253747 (OP)
Блядь, перестаньте называть язык C clangом, имбицилы. С каких это пор шланг стал единственным компилятором языка, если он не может собрать Ядро.
Аноним 29/08/18 Срд 00:18:33  1254473
>>1254218
Ядро, как минимум... Умер твой мозг. C будет еще долго жить, хотя конечно под современные процессоры он не очень явно. Все эти оптимизации компиляторов работают с вероятностью почти нихуя ( 1 / дохуя ).
Аноним # OP  29/08/18 Срд 00:37:51  1254476
>>1254471
Никто не называет и не путает с компилятором. Имеется в виду c language, потому что просто "c" - слишком коротко. Тег был добавлен модером для одного из предыдущих тредов, он же прописан в навигаторе в прикрепе. Если есть лучший вариант тега - проси модера исправить.
Аноним 29/08/18 Срд 00:45:03  1254478
>>1254476
Я понимаю, но это вам не язык Go, который является глаголом в английском языке. Язык этот слишком стар чтобы его так называть.
Аноним 29/08/18 Срд 01:39:46  1254496
>>1254476
>есть лучший вариант тега
ansic
мимо господин
Аноним 29/08/18 Срд 01:49:17  1254497
>>1254496
Распарсил с третьего раза, думал что-то про асики и прочие верилоги. Алсо, почему анси, а не исо?
Аноним 29/08/18 Срд 05:15:35  1254519
>>1253425
так и некто и не помог мне с pcre2_substitute :(
Аноним 29/08/18 Срд 05:19:49  1254520
>>1254476
>Если есть лучший вариант тега

plain С
Аноним 29/08/18 Срд 06:31:47  1254527
>>1254497
>исо
isoc
звучит по пидерски
Аноним 29/08/18 Срд 06:35:04  1254528
>>1254519
никто в здравом уме регулярками на си не парсит, есть Перл и если очень нужно есть Бизон
мимо парсерогосподин
Аноним 29/08/18 Срд 09:49:09  1254564
>>1254473
>C будет еще долго жить, хотя конечно под современные процессоры он не очень явно

альтернативы?
Аноним 29/08/18 Срд 10:59:58  1254591
>>1254564
Раст
Аноним 29/08/18 Срд 11:17:16  1254599
>>1254215
Вакансии называются «программист Linux».
Аноним 29/08/18 Срд 12:26:34  1254624
>>1254591
>Раст
Педераст
Аноним 29/08/18 Срд 12:27:44  1254625
>>1254591

жирно

не говоря о его детских проблемах, шанс что он займёт хоть какое то весомое место на интерпрайзер - ничтожно мал, ибо никто не будет переходить на ржавчину, с готовой сишной\плюсовой базы, взаимозаменяемой.

Язык уровня - накатать пет проект

https://www.viva64.com/ru/b/0324/
Аноним 29/08/18 Срд 12:35:09  1254627
>>1254625
>Язык уровня - накатать пет проект
Чмошники движок мозилы на него потащили, пизда ей... аж триасет...
Аноним 29/08/18 Срд 13:19:43  1254642
>>1254625
Не жирно. В расте как-раз есть явные векторные типы. А это пиздец как важно на сегодня. Не заставлять asm-говновставками векторизацию делать ебясь с выравниванием, и не надеятся блядь на уличную магию компилятора что он ебать не взбредет и не решит что векторизация невозможна.
Аноним 29/08/18 Срд 13:21:03  1254644
>>1254625
>
>Язык уровня - накатать пет проект
Да, ладно эксперт диванный. Язык вполне уже селфхостед.
Аноним 29/08/18 Срд 13:22:13  1254645
>>1254528
парсеродобоеб.

Если бы знал хоть теорию немного, то знал бы что лексированием занимается lex (flex).
Аноним 29/08/18 Срд 13:43:08  1254653
>>1254625
>детских проблемах
Каких? Я любопытный.
Аноним 29/08/18 Срд 15:34:41  1254736
>>1254645
Их в паре юзают, ты чё на него напал, а?
Дерзкий чтоль?
Аноним 29/08/18 Срд 15:36:58  1254738
>>1254653
Нет, ты ехидный и злой, а не любопытный, тебя это не очень-то и интересует на самом деле, ухади.
Аноним 29/08/18 Срд 16:08:05  1254765
>>1254473
>Все эти оптимизации компиляторов работают с вероятностью почти нихуя
Ну ты и спец. Т.е разницы между -O0 и -Os у тебя нет?
Аноним 29/08/18 Срд 17:13:14  1254823
>>1254528
> никто в здравом уме регулярками на си не парсит

Чем здравый ум Сишника отличается от здравого ума Perl`овчанина или тогоже PHP`девелопера, которые для парсинга везде юзают PCRE, а в PHP так и вообще юзают эту самую libpcre2, только API от Сишного отличается в куда более понятную сторону
Аноним 29/08/18 Срд 22:10:15  1255013
>>1254765
У меня вот криптобиблиотека, собранная с -O2 даёт выигрыш в производительности В ДВА РАЗА по сравнению с -О0.
Аноним 29/08/18 Срд 22:13:02  1255017
>>1255013
march/mtune юзаешь?
Аноним 30/08/18 Чтв 03:18:16  1255106
153538475015669[...].jpg (183Кб, 700x933)
>>1254823
>PCRE — библиотека, реализующая работу регулярных выражений в стиле Perl.
>отличается от здравого ума Perl
>PHP`девелопера, которые для парсинга везде юзают PCRE, а в PHP так и вообще юзают эту самую libpcre2
Аноним 30/08/18 Чтв 12:12:25  1255233
>>1254738
Неправда.
Аноним 01/09/18 Суб 15:24:31  1256579
Есть разница между char* andron = "sosi" и char andron[] соси?
Аноним 01/09/18 Суб 15:25:38  1256580
>>1256579
char andron[] = "sosi"*
Аноним 01/09/18 Суб 15:57:22  1256602
>>1256579
static char foo[] = "sosi"; // Строка в секции данных, писать можно (не более sizeof("sosi")). Инициализация при компиляции.

char foo[] = "sosi"; // Вне функции аналогично предыдущему (не считая linkage). Внутри функции: фактически выделяет 5 символов на стеке и инициализирует их символами (т.е., каждый раз при входе в функцию будет делаться strcpy(foo, "sosi")). Зато реентерабельно.

static const char foo[] = "sosi"; // Строка в секции данных, писать нельзя. При использовании foo поведение будет полностью аналогично тому, как если бы ты написал вместо foo сразу "sosi" (обратное в большинстве случаев тоже верно: чаще всего использование строкового литерала создает вот такую переменную в секции данных). Инициализация при компиляции. Наиболее предпочтительный способ, если ты не собираешься писать в строку, но хочешь дать ей имя.

char ∗foo = "sosi"; // Хранит адрес строки из 5 символов, которая лежит где-то в секции данных. Т.е., фактически, это аналогично static const char literalXXX[] = "sosi"; char ∗foo = literalXXX; Правильнее сразу говорить const char ∗foo, потому что писать в литералы нельзя. При доступе к отдельным символам (foo[n]) будет лишний дереференс по сравнению со предыдущим вариантом.
Аноним 01/09/18 Суб 16:05:27  1256610
>>1256602
Ой, что-то у тебя никуда писать нельзя.
Аноним 01/09/18 Суб 16:06:59  1256612
>>1256610
В первые два варианта можно. В последний тоже можно, но только в саму переменную foo, без дереференса.
Аноним 01/09/18 Суб 16:08:05  1256614
>>1256612
> только в саму переменную
Почему?
Аноним 01/09/18 Суб 16:17:26  1256621
>>1256614
> Почему?
Ну вот же:
> фактически, это аналогично static const char literalXXX[] = "sosi"; char ∗foo = literalXXX;
Ты не можешь делать ∗foo = 'l' или foo[1] = 'e', потому что это изменение уже не самого foo, а того, на что он указывает, т.е., literalXXX, а он const (и даже если он не const почему-либо в каком-либо компиляторе, писать все равно запрещено). А вот в сам foo ты можешь присвоить другой литерал или другой символьный массив, или другой указатель, никто тебе не мешает:
foo = "xxx";
static const char bar[] = "yyy";
foo = bar;
char baz[6];
foo = baz; // А вот сейчас foo указывает на массив, который можно изменять, поэтому можно:
∗foo = 'h'; foo[1] = 'e'; 2[foo] = 'l'; strcpy(foo + 3, "lo");
Аноним 01/09/18 Суб 16:26:00  1256622
>>1256621
>foo = bar;
После этой строчки на литерал "ххх" больше ничего не указывает?
Аноним 01/09/18 Суб 16:43:21  1256630
>>1256622
> После этой строчки на литерал "ххх" больше ничего не указывает?
Ну, в идеальном мире да. Но, так как в литералы писать все равно нельзя (или, наоборот: нельзя писать, чтобы можно было так делать), компиляторы могут устранять дублирование строковых литералов в секции данных. Вот этот код может трижды напечатать один и тот же адрес:
const char ∗ptr = "xxx";
printf("%p %p %p\n", "xxx", "xxx", ptr);
Мало того, вот этот код тоже может напечатать один и тот же адрес (т.е., если одна строка является концом другой, они могут схлопнуться):
printf("%p %p\n", "hello, world", "world" -7); // 7 = sizeof("hello, ")
Аноним 01/09/18 Суб 16:47:38  1256635
>>1256630
>Ну, в идеальном мире да.
Так же можно засрать литералами всю память, а указетелей на них не останется.
Аноним 01/09/18 Суб 16:50:38  1256637
>>1256602
Спасибо за отличное объяснение!
>т.е., каждый раз при входе в функцию
Когда именно это происходит?
Аноним 01/09/18 Суб 17:03:06  1256640
>>1256635
> указетелей на них не останется
Ну и хуй с ними. Твоя программа все равно в память целиком грузится, и от того, что на литерал есть указатель, или на него нет указателя, размер секции данных не поменяется.

>>1256637
> Когда именно это происходит?
Детали реализации. Когда-то после того, как код функции получил управление (т.е., функция была вызвана) и до того, как переменная будет использована. В целом, примерно так:
void foo(void) { char bar[] = "test"; puts("bar"); }
// превратится в:
void foo(void) { char bar[5]; static const literal_test[] = "test"; strcpy(bar, literal_test); puts(bar); }
// естественно, в этом конкретном случае даже хуевый компилятор со включенными оптимизациями сгенерирует:
void foo(void) { char bar[4]; static const literal_test[] = "test"; strcpy(bar, literal_test); puts(barliteral_test); }
Но если bar не только выводить, но и модифицировать, с условиями и т.п., то такое уже не соптимизируешь.
Аноним 01/09/18 Суб 17:03:54  1256641
>>1256640
> puts("bar");
puts(bar), ну ты понял
Аноним 01/09/18 Суб 17:38:00  1256658
>>1256640
>Но если bar не только выводить, но и модифицировать, с условиями и т.п., то такое уже не соптимизируешь.
Где ты такими заумностями научился? Годы проведенные с дизассемблером и отладчиком?
Аноним 01/09/18 Суб 18:38:39  1256702
image.png (574Кб, 1920x1080)
image.png (530Кб, 1920x1080)
image.png (583Кб, 1920x1080)
image.png (356Кб, 1920x1080)
Пишу как-то для себя структуры для работы с .lnk форматом. https://msdn.microsoft.com/en-us/library/dd871305.aspx

Здесь есть битовое поле LinkFlags (первый пик), чье последнее значение (второй пик) оставляет 4 пустых бита после себя (третий пик). Надо инициализировать его как unsigned : KeepLocalIDListForUNCTarget : 5 (четвертый пик) или как?
Аноним 01/09/18 Суб 18:44:14  1256707
https://ideone.com/8tRloy - насколько эта функция определения размера массива стабильна? Всегда ли будет выполняться условие выхода из цикла ровно, когда кончается массив?
Аноним 01/09/18 Суб 19:37:03  1256737
>>1256707
Нет надёжного способа определить размер объекта, не прибегая к sizeof().
Аноним 01/09/18 Суб 19:40:28  1256738
>>1256737
sizeof на массив не работат к сожалению же. Он, вроде, возвращает размер первого элемента массива и все.
Аноним 01/09/18 Суб 19:44:16  1256741
>>1256738
Не, передай ему указатель на первый элемент aka имя массива.
Аноним 01/09/18 Суб 20:31:41  1256791
>>1256707
Ты только что изобрел strlen
К размеру массива это никакого отношения не имеет.
Аноним 01/09/18 Суб 20:44:08  1256797
>>1256791
Ебать я умный!
Аноним 01/09/18 Суб 21:37:22  1256820
test
Аноним 01/09/18 Суб 21:43:10  1256822
>>1256820
На QA учишься?
Аноним 01/09/18 Суб 21:46:52  1256823
>>1256822
На инженера-физика, правда уже жалею.
Капчу старую вернули, чё ты язвишь тут мне...
Аноним 01/09/18 Суб 21:54:36  1256826
>>1256741
Работает только для статических массивов.
Аноним 01/09/18 Суб 21:57:23  1256830
>>1256826
Постарайтесь не всирать переменную, в которой храните размер области памяти из кучи, когда выделяете.
Аноним 01/09/18 Суб 21:59:18  1256831
>>1256830
Да это я так, для ньюфагов пометку сделал.

У меня всё хорошо.
Аноним 01/09/18 Суб 23:37:09  1256858
Мудрецы, напомните, мне нужен массив элементами которого является переменные массив. Как это будет хранится, как массив указателей или как смещение?
Аноним 02/09/18 Вск 01:56:32  1256912
>>1256858
> элементами которого является переменные массив
Чо? Переменные типа массив? Или динамический массив? Или VLA?

> Как это будет хранится, как массив указателей или как смещение?
Если ты про int foo[2][3], то оно хранится точно так же, как записано: два массива по три элемента. Элементы массива один за другим, массивы один за другим. Т.е. {{1,2,3},{4,5,6}} -> {1,2,3,4,5,6}. Если тебе нужен массив динамических массивов, то да, ты сделаешь массив либо с простыми указателями на данные, либо со структурами типа data_ptr/elements_used/elements_avail.

>>1256738
> sizeof на массив не работат к сожалению же
Есть идиома: #define countof(arr) (sizeof(arr) / sizeof((arr)[0])), она отлично работает, пока ты скармливаешь ей массив (или VLA). Она не работает с указателями, потому что указатель не несет информации о размере. Она не работает для аргументов фукнций типа void foo(int arg[3]) { printf("%zu\n", countof(arg)); }, потому что аргументы функций неявно кастятся к указателям и, естественно, при этом теряют информацию о размере.

>>1256707
> Всегда ли будет выполняться условие выхода из цикла ровно, когда кончается массив?
Если ты всегда будешь заканчивать свой массив нулевым элементом. Этот подход имеет право на жизнь. Как заметили выше, он используется для строк >>1256791, но его используют не только для строк, а еще, например, для массивов структур, когда нет возможности передать информацию о размере, но есть возможность сделать какой-то невалидный элемент (sentinel), который будет использоваться только чтобы пометить конец массива.

Например, в импортах PE-файла в винде список DLL (массив структур IMAGE_IMPORT_DESCRIPTOR), заканчивается нулевым структурой, инициализированной нулями, а список функций для каждой из этих DLL - массив структур IMAGE_THUNK_DATA, тоже заканчивается нулем. Эти списки генерируются линкером, и из-за особенностей подхода к сборке таблицы импортов, было проще завершать списки нулевыми элементами, чем писать куда-то количество длл и функций.

>>1256702
> Надо инициализировать его как unsigned : KeepLocalIDListForUNCTarget : 5 (четвертый пик) или как?
Начнем с того, что не надо пользоваться битфилдами для парсинга бинарных файлов. У нас не далее как в прошлом треде были грабли: где-то около >>1243344. Твой KeepLocalIDListForUNCTarget очевидный однобитовый bool, за которым идут пять неиспользуемых битов. Для KeepLocalIDListForUNCTarget ты делаешь bool KeepLocalIDListForUNCTarget:1 или bit KeepLocalIDListForUNCTarget:1 (хуй знает, как твой bit определен). Затем, если ты целиком и полностью доверяешь компилятору, можешь больше ничего не писать. Если частично доверяешь, можешь сделать безымянный член unsigned:5, явно указав, что 5 бит не используются, или сделать unsigned:0, сказав компилятору, чтобы больше в этот битфилд ничего не пихал.
Аноним 02/09/18 Вск 06:55:00  1256933
>>1256912
>Если тебе нужен массив динамических массивов, т
Мне нужен массив статических массивов переменного размера, но тратить на него 64бита слишком дохуя, придется пилить массив смещений на буфер данных. И подумать о том, чтобы конпелятор не распидарасил его своим выравниванием.
Аноним 02/09/18 Вск 08:29:02  1256945
Есть
char buf[512] = "abcd kl jcd wef";
char m1[100], m2[100];

sscanf(buf, format, m1, m2);

Мне нужно, чтобы в m1 оказалось abcd, а в m2 вся оставшаяся часть строки. В реальности оставшаяся часть строки может быть разной, с другим количеством пробелов. Как составить format для такого?
Аноним 02/09/18 Вск 09:29:27  1256962
>>1256912
Разве не надо сделать unsigned : 4? Так как у меня меня всего 5 битов, а один занят под KeepLocalIDListForUNCTarget.
И прости за тупой вопрос, что означает именно unsigned в битовых полях?
Аноним 02/09/18 Вск 09:37:17  1256965
>>1256912
>Начнем с того, что не надо пользоваться битфилдами для парсинга бинарных файлов.
И как мне тогда парсить подобные структуры? Сделать кучу чаров и вытаскивать биты побитовыми операциями что ли? Я просто новичок в этом деле, особо сказать за это не могу.
Аноним 02/09/18 Вск 09:45:45  1256966
lnk.png (4Кб, 222x128)
>>1256962
> Так как у меня меня всего 5 битов, а один занят под KeepLocalIDListForUNCTarget.
Либо я разучился считать, либо ты.

>>1256965
> И как мне тогда парсить подобные структуры?
По-хорошему: читать побайтово, собирать инты размером больше байтов побитовыми операциями, разбирать поля меньше байтов побитовыми операциями. Естественно, не вручную, а делать себе няшный binary stream reader. Но если тебя переносимость не интересует, тогда можно и битфилды из файла напрямую читать, тем более, что студия типа "родной" компилятор.
Аноним 02/09/18 Вск 09:55:23  1256968
>>1256966
>Либо я разучился считать, либо ты.
Это я, пересчитал биты и оказалось, что я обосрался.

Но все-таки странно, почему не стоит использовать битовые поля? Они же как раз для таких задач вроде и создавались.
Аноним 02/09/18 Вск 11:06:13  1256991
Почему не работает?
char i[1000];
int c;
for (int k=0;(c=getchar())!= '\n'; ++k,i[k]=c);
printf("%s",i);
Аноним 02/09/18 Вск 11:07:48  1256992
>>1256991
>++k,i[k]=c
Переделай это.
Аноним 02/09/18 Вск 11:10:27  1256994
>>1256992
После того как поменял местами заработало, но в чем была проблема? Понятно конечно, что i[0] не присваивалось значение, но разве это проблема?
Аноним 02/09/18 Вск 11:13:42  1256995
>>1256994
Сделай вот так i[k++] = c - это короче и читабельнее.
А не работало, так как у тебя сначала увеличивалось, а затем уже присваивалось значение, то есть пропускались элементы массива i.
Аноним 02/09/18 Вск 12:10:01  1257027
Чтобы покодить на сишке? Подскажите, хочу отвлечься от суровой действительностью в мир байтов.
Аноним 02/09/18 Вск 12:25:57  1257030
Посоветуйте как разобраться в ебучих , . Я понял из теории, что указывает на адрес, а две на адрес адреса. Но почему в том или ином коде их применяют я понять не могу, не понимаю, когда мне они нужны. В общих чертах пишут про массивы, строки еще что-то. Но я бы хотел большей ясности. Где я могу узнать об этом? Спасибо.
Аноним 02/09/18 Вск 12:29:07  1257031
Есть ли какое-то преимущество книг перед гуглом и различными обучающими программами на курсере итд? Стоит ли их читать новичку в 2к18?
Аноним 02/09/18 Вск 12:53:44  1257038
>>1257031
ЗАВИСИТ ОТ ТВОИХ ИНДИВИДУАЛЬНЫХ ОСОБЕННОСТЕЙ И СКЛОННОСТЕЙ К ОПРЕДЕЛЕННОМУ СПОСОБУ ОБУЧЕНИЯ, ВЫБИРАЙ ИСХОДЯ ИЗ СВОИХ ДАННЫХ
>>1257030
СПРОСИ ЧТО ИМЕННО ТЕБЯ В НИХ НАПРЯГАЕТ
А ВООБЩЕ ПРОЧИТАЙ НА ВИКИПЕДИИ, МНЕ ТАМОШНЯЯ СТАТЬЯ ПОКАЗАЛАСЬ ЛОГИЧНОЙ И СТРУКТУРИРОВАННОЙ (ЕСЛИ ЧТО Я ПРО РУССКУЮ)
Аноним 02/09/18 Вск 13:32:18  1257049
>>1257038
Не понимаю, когда их использовать
Аноним 02/09/18 Вск 13:34:19  1257053
>>1257049
Когда хочешь, чтобы функции была передана сама переменная, когда инициализируешь динамические массивы, когда создаешь связанные списки, когда итерируешь по массиву, когда выделяешь память в куче, когда небеса.
Аноним 02/09/18 Вск 13:35:08  1257056
>>1257027
codewars
Аноним 02/09/18 Вск 13:36:28  1257057
>>1257056
Спасибо.
Аноним 02/09/18 Вск 15:31:23  1257120
printf(" "*i);
Почему так нельзя?
Аноним 02/09/18 Вск 15:35:38  1257125
>>1257120
Во-первых, что ты собрался с чем объединить.
Если бы строковый литерал с указателем на строку, то зачем разыменовывать?
Во-вторых, конкатенация литералов происходит на раннем этапе компиляции, на твой i всем насрать там.
Аноним 02/09/18 Вск 15:53:48  1257151
>>1257125
Я хотел, чтобы пробел был напечатан i раз
Аноним 02/09/18 Вск 15:57:09  1257161
>>1257151
функцию пиши падла
Аноним 02/09/18 Вск 19:33:35  1257312
>>1257161
>>1257151
можно ограничиться макросом вроде
#define PRINT_ICHR(CHR,I) (for(;I>0;I--)printf("%c",CHR))
Но I после исполнения обнулится
Аноним 02/09/18 Вск 19:36:18  1257313
Подскажите название наиболее широко используемой функции для сортировки односвязных списков.
Аноним 02/09/18 Вск 20:06:39  1257334
>>1257312
Ну вот в таких-то случаях можно было inline-функцию вметсо макроса сделать.
В чём фишка макросодрочерства? Ты демонстрируешь, что ты олд?
Аноним 02/09/18 Вск 20:07:17  1257336
>>1257313
скопировать всё в массив -> qsort -> обратно в список
Аноним 02/09/18 Вск 21:26:07  1257426
>>1257312
>printf(“%c",CHR)
И нахуй ты printf используешь для одной буквы?
static inline void printch(unsigned i, char c) (while(i--) { putchar(c); })
Аноним 02/09/18 Вск 21:31:56  1257435
>>1257426
Лол, никто не будет так делать.
Аноним 03/09/18 Пнд 00:58:56  1257643
>>1256968
> почему не стоит использовать битовые поля
Из прошлого треда:
> компилятор может выделить под элемент char, а может и int, может начать заполнение со старшего бита, а может с младшего
Использовать битовые поля стоит, но не стоит напрямую читать-писать их из файлов или сокетов, если предполагается какая-никакая переносимость программы.

>>1257151
> Я хотел, чтобы пробел был напечатан i раз
Следи за руками: printf("%*s", i, ""); но это работает только с пробелами. Умножения для строк, как в питоне, в Си нет.
Аноним 03/09/18 Пнд 01:25:12  1257654
>>1257643
Как заебали эти "адепты стандарта", у которых в байт может быть не 8 бит, просто иди нахуй.
Аноним 03/09/18 Пнд 01:32:36  1257657
>>1257654
Сам иди. Я писал под DSP с 16-битными байтами, сосалписал под big-endian, периодически отсасываю у alignment requirements на разных процах, а в прошлом треде был кун, у которого битовые поля из Праты распидорасило. А ты продолжай думать, что переносимость - это когда линукс под пеку и малинку.
Аноним 03/09/18 Пнд 01:47:35  1257661
>>1257657
>периодически отсасываю у alignment requirements на разных процах
Я тоже, но большинство программистов не столкнутся с нее восьмибитными байтами, так что тыкать и носом в стандарт необязательно.
Аноним 03/09/18 Пнд 18:13:17  1258082
>>1257334
В пизду иди сука ебливая, в рот тебя ебал макросами.
Аноним 03/09/18 Пнд 22:57:43  1258385
>>1253747 (OP)
Поясните наконец анону про goto
Чем чуханью оно так не приглянулось? Это ж жесть как удобно и не затратно по ресурсам. "Плохой тон" программирования? Лол што блять? В asm есть целая директива jump через которую работают циклы и переходы, с хуя ли ее аналог в Си есть зло?..
Аноним 03/09/18 Пнд 22:59:36  1258389
>>1258385
>Это ж жесть как удобно и не затратно по ресурсам
Да. Только смузихлебам не говори.
Аноним 03/09/18 Пнд 23:42:13  1258420
>>1257053
сложна, в питоне нет такой херни
Аноним 03/09/18 Пнд 23:43:47  1258423
>>1258385
> Чем чуханью оно так не приглянулось?
Давным-давно был язык BASIC, в котором тогда не везде был даже GOSUB (вызов подпрограммы). Код на бейсике представлял из себя мешанину из 100 IF COND GOTO 210, был абсолютно нечитаем - фактически для его модификации приходилось реверсить все эти хитросплетения потока выполнения. Поэтому, с появлением структурного программирования (в том числе и в бейсике) нужно было как-то запугать существующих программистов, чтобы больше не видеть этой лапши. Тогда Дейкстра написал свою знаменитую статью, а потомки, не сильно вспоминая, в какое время она была написана, проклинают GOTO до сих пор. С тех пор появилось много последователей с %фичанейм% considered harmful - например, if considered harmful и даже considering harmful considered harmful. Не превращай классические статьи в религию, и все будет норм.

> Это ж жесть как удобно и не затратно по ресурсам.
Если тебе удобно, чаще всего это означает, что ты не осилил структурное программирование. Есть простой детектор: если ты хочешь сделать goto вверх или внутрь { блока } - ты что-то делаешь не так. В Си goto не зло, а вполне себе используемая фича с минимум двумя основными юзкейсами:
1) goto error_handler/release_resources/итд в конец функции, чтобы не писать глубоко вложенную лесенку из if (если if-ов всего пара, и новых не предвидится, тогда goto - говнокод).
2) goto outside_loop для выхода из вложенных циклов (обычно можно выделить циклы в отдельную функцию и заменить goto на return, но если почему-то нельзя - пользуются goto).

> В asm есть целая директива jump
Но ты-то не на асме пишешь, тебе дали язык для людей. Алсо, не директива, а инструкция/мнемоника. Директивы управляют поведением транслятора и в объектный код не попадают.
Аноним 04/09/18 Втр 00:02:23  1258440
А где можно скачать Learn C the Hard Way, а то 30 бачей чёто нету:(.
Аноним 04/09/18 Втр 00:24:08  1258451
>>1258420
> в питоне нет такой херни
Ты лишь наполовину прав. С одной стороны, в питоне абсолютно все сущности, до которых ты можешь дотянуться - ссылки (т.е., точно такие же указатели на объекты, как и в Си, только всегда валидные). С другой стороны, в питоне и правда нет двойных указателей, т.е., не получится сделать foo = 123; def func(arg): arg = 456 так, чтобы при вызове func(foo) оно меняло foo, но можно сделать костыль, обернув это в какой-нибудь композитный тип, сымитировав таким образом указатель на указатель с помощью ссылки и индекса:
def func(arg):
# Тут (неявно, при обращении к любой переменной) по ссылке на arg
# сначала берется объект массива, а потом по индексу 0
# пишется (ссылка на) значение.
arg[0] = 456

foo = [123]
func(foo)
print(foo[0])

>>1258440
Было на сайте, было на вебархиве, но выпилено отовсюду (и слава богу). Есть на торрент-трекерах ("Learn C the Hard Way[ 2015[X7]" в гугле с кавычками). Но лучше возьми Прату.
Аноним 04/09/18 Втр 01:30:44  1258481
>>1258451
Спасибо, нашёл.
А как найти Прату?
Аноним 04/09/18 Втр 01:34:49  1258485
>>1258481
А всё, нашёл, сорян.
Аноним 04/09/18 Втр 03:41:14  1258501
>>1253425
> Может ктонибуть набросать простой пример как юзать pcre2_substitute?
>>1254519
> так и некто и не помог мне с pcre2_substitute :(

Всего две недели ебли, и я сам себе помог, спасибо анончики, понял как это говно юзать, если кому надо вот накатал пример:
https://pastebin.com/AHm7gkwK




Аноним 04/09/18 Втр 11:42:02  1258685
15356540062890.jpg (46Кб, 720x713)
Всем Привет!
Я всего глазком видел С и не знаю CUDA.

Но мне всего-то нужно сделать простенькую программу для вычисления длинных чисел, что-то вроде (или чуть сложнее):

While True:
x=+1
y=cos(x)
If y целый или количесто нулей после запятой огромно до других чисел, тогда:
записать значение в лог


Только числа должны быть очень длинные, желательно без ограничений вообще или много много знаков. Поэтому проблема с float итп.
Поэтому ещё мне и понадобился C/CUDA - для ускорения расчётов.

Искать нужно бы в диапазоне, а то компьютер у меня всего один и одна видеокарта. Т.е. x должен задаваться диапазоном (просто от и до).
Все найденные числа должны записываться в лог, при этом это действие НЕ должно приостаноавливать поиск чисел.
И подозреваю, что искать я буду, как минимум неделями, вероятно, буду перезапускать не раз, поэтому не плохо бы, чтобы программа хотя бы иногда записывала во второй лог одно число, какое сейчас число перебирается, чтобы я потом просто передал это число программе и она начала с него.
+ Ещё неплохо сделать опцию - процент нагрузки на железо, ну чтобы графика не лагала, чтобы не горел проц и видяшка итд. Тоже передавать параметром при запуске программе.
Аноним 04/09/18 Втр 11:43:35  1258686
>>1258685
libgmp
Аноним 04/09/18 Втр 13:38:19  1258772
>>1258686
помоги прогу написать, плизки
Аноним 04/09/18 Втр 19:57:30  1259117
991CC475-AE89-4[...].png (339Кб, 1136x640)
35B19592-1992-4[...].jpeg (98Кб, 1136x137)
Абиснити, молю.я нуфаг
Аноним 04/09/18 Втр 20:23:33  1259126
>>1259117
а погуглить - нахуй надо
пиздуй из профессии
Аноним 04/09/18 Втр 20:43:46  1259131
>>1259117
А что там не понятно?
Аноним 05/09/18 Срд 04:40:05  1259278
Добрый вечер.
Подскажите, как написать кастомный printf и зачем это может понадобиться?

Знаю, что используется write(), но пока недостаточно разбираюсь, чтобы толком поисковый запрос сделать.
Аноним 05/09/18 Срд 09:31:24  1259343
Поясните за "Си с классими" (не цпп, а именно си), что имеется ввиду? Может есть какие либы реализующии ооп в си?
Аноним 05/09/18 Срд 09:35:12  1259351
>>1259343
>Может есть какие либы реализующии ооп в си?
Да, через структуры
Аноним 05/09/18 Срд 09:38:49  1259355
>>1259351
А либы есть готовые, чтоб было всякое наследование (не множественное), полиморфизм, и прочее ооп?
Аноним 05/09/18 Срд 09:39:38  1259357
>>1259355
Книга есть, гугли
Аноним 05/09/18 Срд 09:40:06  1259358
>>1259357
эта? https://www.cs.rit.edu/~ats/books/ooc.pdf
Аноним 05/09/18 Срд 09:43:16  1259362
>>1259358
Дя
Аноним 05/09/18 Срд 09:43:50  1259363
>>1259362
А на русском нет?
Аноним 05/09/18 Срд 12:23:23  1259453
>>1259343
Зачем это в 2018? Почему не писать на плюсах, используя только си и классы?
Аноним 05/09/18 Срд 12:51:04  1259470
>>1259453
Плюсы мне не нравятся, там слишком много лишнего говна, да и все сторонние библиотеки, которые я юзаю для разработки, написанны на чистом Си, инклюдить их к Цпп не вижу смысла, плюс разрабатываю в основном под разный эмбеддед, и Си туда проще компилить чем цпп, мень ше гемора
Аноним 05/09/18 Срд 14:25:10  1259526
>>1259278
> Подскажите, как написать кастомный printf
https://ideone.com/9r6T6x - обрабатывать форматную строку, получать аргументы с помощью va_arg, преобразовывать их в строку и выводить. Или вот я когда-то видел формировалку сетевых пакетов, формат ей так же printf-like синтаксисом задавался, а она вместо текстового представления делала из всяких интов и флоатов big-endian слова, а перед строками втыкала длину.

> и зачем это может понадобиться?
Например, сделать поддержку [color=red]text[/color] и преобразовывать такие вещи в ANSI-последовательности в линуксах или вызовы SetConsoleTextAttribute в винде.

>>1259363
Оно и на английском-то не нужно. Обычно достаточно одного уровня наследования (common object->specific object, а чаще всего это даже просто linked_list_header->payload) и изредка какая-нибудь наколеночная табличка с методами. И никаких макросов.
Аноним 05/09/18 Срд 14:37:43  1259533
>>1259526
>Например, сделать поддержку [color=red]text[/color] и преобразовывать такие вещи в ANSI-последовательности в линуксах или вызовы SetConsoleTextAttribute в винде.
Not bad.
Аноним 05/09/18 Срд 14:38:16  1259534
>>1259526
>Оно и на английском-то не нужно. Обычно достаточно одного уровня наследования (common object->specific object, а чаще всего это даже просто linked_list_header->payload) и изредка какая-нибудь наколеночная табличка с методами. И никаких макросов.
Этот шарит.
Аноним 06/09/18 Чтв 08:24:01  1259966
Безымянный.png (15Кб, 1056x408)
1. Почему это работает?
2. Для чего нужен си кроме академических целей и низкоуровневой боли?
Аноним 06/09/18 Чтв 08:28:44  1259967
>>1259966
>Почему это работает?

Потому что тебе повезло и мусор в указателе не указывал на несуществующую страницу.

> низкоуровневой боли?

Именно. Драйвера/OS/микроконтроллеры.
Аноним 06/09/18 Чтв 11:12:24  1260031
А скажите, выходит, указатели могут иметь произвольную глубину вложенности. Не уверен, что правильно сказал, ну вот есть указатель на указатель и разыменовывается он двойной звездочкой. Можем мы таким же макаром устроить трёхзвёздочный коньяк или пятизвёздочный и до скольки уровней предел?
Аноним 06/09/18 Чтв 11:30:08  1260039
>>1260031
можна, токо паламается моцк
Аноним 06/09/18 Чтв 12:14:41  1260051
>>1259967
И криптография ещё.
Аноним 06/09/18 Чтв 12:15:43  1260052
>>1260031
Да, есть даже юморески про пятизвездных программистов.
Аноним 06/09/18 Чтв 20:04:22  1260234
>>1259966
Ты попробуй так со структурой или массивом сделать. Сегфолт обеспечен на 100%.
Аноним 07/09/18 Птн 01:13:08  1260370
Глупый вопрос, но буду благодарен, если кто-то пояснит.
Есть типы данных int,float,char и т.д.
Временные переменные обязательно объявляются вместе с типом. Когда до мэйны мы объявляем константу типа #define NUMBER 10 - то компилятор автоматически понимает, какой тип данных соответствует 10. Вопрос - нахуя тогда еботня с временными переменными?
Аноним 07/09/18 Птн 01:48:57  1260376
>>1260370
Дефайн это не константа, и не тип данных, даже не переменная, дефайн это макрос.
Допустим у тебя есть #define ten 10
Препроцессор буквально идёт по всему коду и везде где у тебя написано ten заменяет ten на 10.
Аноним 07/09/18 Птн 02:02:58  1260377
>>1260376
Ааааа, хмм, но всё равно непонятно, зачем нужна тогда еботня с типами данных, если можно так.
Аноним 07/09/18 Птн 07:53:18  1260420
>>1260377
Так ты же про переменную спросил, переменную можно переменить, а дефайн нельзя.
Аноним 07/09/18 Птн 13:38:42  1260540
>>1260420
> переменную можно переменить, а дефайн нельзя
#define FOO 1
#undef FOO
#define FOO 2
Но переменной дефайн от этого действительно не становится.

>>1260377
> зачем нужна тогда еботня с типами данных
Чтобы делать что-то сложнее обычной арифметики.
Аноним 07/09/18 Птн 14:24:24  1260552
>>1260540
Ебать удобно будет такой код читать конечно.
Аноним 07/09/18 Птн 18:36:49  1260639
>>1260370
>Вопрос - нахуя тогда еботня с временными переменными?

юзай auto
Аноним 07/09/18 Птн 19:36:28  1260657
>>1260639
Ты тредом ошибся.
Аноним 07/09/18 Птн 21:26:29  1260708
Можно ли как то писать на си под андроид? Теоретически это же линух, так что наверное есть варики?
Аноним 07/09/18 Птн 21:42:17  1260712
>>1260708
Да
Аноним 07/09/18 Птн 21:43:38  1260713
>>1260712
Через ANDROID NDK?
Аноним 07/09/18 Птн 21:47:21  1260715
>>1260713
Я гуидятину на Qt писал
Аноним 07/09/18 Птн 23:09:10  1260741
>>1258423
Вообще, иногда просто удобно.
Мне вот недавно надо было скрипт на баше выполнить, но скипнуть всю серединку. Комментить всю эту кучу не хотеелось, обрамлять как тело другого оператора - тоже. Было бы классно выполнить начало, а потом сделать goto в конец, но не завезли. Пришлось переделывать в другой скрипт.
Аноним 07/09/18 Птн 23:10:08  1260742
>>1258772
Плоти
Аноним 07/09/18 Птн 23:19:07  1260744
>>1260742
Деньхами плотить или писечкой?
Аноним 08/09/18 Суб 00:48:56  1260774
>>1260741
На Си ты можешь #if 0 ... #endif
Аноним 08/09/18 Суб 02:41:11  1260800
>>1260657
>Ты тредом ошибся.
почему?
Аноним 08/09/18 Суб 02:43:56  1260801
>>1260744
За деньги можно поиметь любую лучшую писечку, и купить покушать заодно
Аноним 08/09/18 Суб 13:10:10  1260900
>>1260800
Потому что auto в Си - это storage class для автоматических переменных, т.е., таких, которые удаляются при выходе из области видимости. int main(void) { auto int foo = 1; printf("%d\n", foo); } Обычно никто не пишет auto явно, потому что переменные, определенные внутри функций, уже по умолчанию автоматические. А вот крестах, куда auto пришло из Си, реюзнули ключевое слово для автоматического вывода типов, там можно auto foo = 1.
Аноним 09/09/18 Вск 00:41:14  1261126
Ребята, можно в сишечке не объявлять переменную-массив, но использовать ее? Типа:

int func(int *a, int size)
{...}

int main()
{ func({1,2,3,4}, 4); }

Так как я написал нельзя. Но может существует другой синтаксис?
Аноним 09/09/18 Вск 02:20:22  1261155
>>1261126
Можно, называется compound literal, появилось в C99: func((int[]){1,2,3,4}, 4). К сожалению, В этом случае тебе придется считать количество элементов вручную или дублировать литерал, что еще хуже: func((int[]){1,2,3,4}, sizeof((int[]){1,2,3,4}) / sizeof(int)); но для простых случаев очень удобно.
Аноним 09/09/18 Вск 02:42:03  1261161
>>1261155
Благодарю.
Аноним 09/09/18 Вск 18:59:55  1261442
>>1253747 (OP)
посоветуйте как научиться работать с графикой в си , то есть прям понять что и как
а не qt юзать
Аноним 09/09/18 Вск 19:19:53  1261458
>>1261442
Зачем?
Только подробно отвечай.
Аноним 09/09/18 Вск 19:28:44  1261465
>>1261458
ну вот как си рисует графику ? окна и тд
Аноним 09/09/18 Вск 19:45:25  1261478
>>1261465
Ну так window manager глянь исходники. Линуксовых с открытым кодом точно есть.
Аноним 09/09/18 Вск 19:46:58  1261480
>>1261465
Си - никак не рисует. В его стандартной библиотеке GUI нет. В ней вообще мало что есть. А рисует или графическая либа, или GUI либа, или иногда ОС через API. Qt, например, берет у ОС только окно, а кнопочки внутри него рисует самостоятельно. На Windows API ты можешь попросить винду рисовать в том числе и кнопочки. В линуксах ты можешь попросить Gtk+ рисовать кнопочки. А можешь взять какую-нибудь левую либу типа Nuklear, взять OpenGL и рисовать кривые кастомные кнопочки. Еще ты можешь взять только графический апи и самостоятельно рисовать свои кнопочки, графику и самостоятельно же реагировать на события, изобретая свою GUI-библиотеку, попутно охуевая от объема требуемого для этого кода.
Аноним 09/09/18 Вск 21:34:43  1261573
>>1261480
можно подробней где достать графический апи ?
Аноним 09/09/18 Вск 21:40:55  1261579
>>1261573
define графический апи
У каждой ОС свои API
Аноним 09/09/18 Вск 22:32:06  1261607
>>1261573
Капай опенГЛ. Там верхнее апи это сишное апи для макак. Заодно начнешь в графическом конвеере разбираться, битковлены майнить
Аноним 09/09/18 Вск 22:48:53  1261616
>>1261607
пасиба , огромное
Аноним 09/09/18 Вск 22:53:36  1261625
>>1261616
пожалуйста милипиздрическое
Аноним 10/09/18 Пнд 00:35:19  1261667
Кто-нибудь использует gsl, Lapack, Blas?
Там часть функций выводит симметричную матрицу как верхнедиагональную (а значения под главной диагональю не трогает). Как потом с этим работать? Написать функцию, которая прописывает элементы под диагональю?

Например, пусть есть 2 матрицы:
A = {{1,2}, {2,3}}
B = {{2,3},{3,4}}.
Хотим посчитать (AT×A)×(BT×B).

Кусок кода:
gsl_blas_dsyrk(CblasUpper, CblasTrans, 1.0, A, 0.0, ATA);
gsl_blas_dsyrk(CblasUpper, CblasTrans, 1.0, B, 0.0, BTB);
gsl_blas_dsymm(CblasLeft, CblasUpper, 1.0, ATA, BTB, 0.0, ATABTB); // Это не работает.

(Aᵀ·A) = ATA = {{5, 8}, {0, 13}} -- ок, gsl_blas_dsyrk вернул симметричную матрицу как верхнедиагональную.
(Bᵀ·B) = BTB = {{13, 8}, {0, 25}} -- Ок.
(Aᵀ·A)·(Bᵀ·B) = ATABTB = {{65, 290}, {104, 469}} -- А это неправильно.
Аноним 10/09/18 Пнд 11:46:21  1261827
>>1253747 (OP)
1. Есть переменная:
char delimiter[4] = "\n";
2. Есть её вывод
printf("%s", delimiter); //выдаёт CRLF
3. Есть аргумент -d \t
4. Далее, в цикле - следует это:
sprintf(delimiter, "%s", argv); //где argv - это "\t" c аргумента "-d"
5. Дальнейший вывод printf("%s", delimiter);
выдаёт два символа "\t", а не символ табуляции.

Полагаю "\\t" в argv. Как сделать Unescape?

http://rextester.com/KFH11573
Аноним 10/09/18 Пнд 11:50:31  1261832
>>1261827
Короче, как заменить '\\t' на "\t" чтоб оно в delimiter зашло как tab?
Аноним 10/09/18 Пнд 12:16:12  1261857
>>1261827>>1261832
Сделал так, для однобайтного разделителя: http://rextester.com/PZTCBT99810

А вообще вопрос о том, как передать escaped string в переменную,
сделав при этом unescape, и этот вопрос - остаётся открытым...
Аноним 10/09/18 Пнд 14:02:12  1261949
>>1261857
Манька, твои эскэпе символы во время конпеляции заменяюися аски немечатными эквивалентами, а в аргументы ты передаешь аски строки, пиздец...
Аноним 10/09/18 Пнд 15:42:16  1261992
>>1261949
Ну и как эту ASCII унескапнуть попроще? Функцию пездатую писать что-ли?
Аноним 10/09/18 Пнд 15:57:55  1262005
>>1261992
Пиздатую распиздатую
Аноним 10/09/18 Пнд 18:00:53  1262082
Как использовать semaphore sem_init()?

Есть регион shared memory, несколько процессов имеют к нему доступ. Как им обращаться к семафору?

https://www.systutorials.com/docs/linux/man/3-sem_init/
Тут написано следующее:
>Initializing a semaphore that has already been initialized results in undefined behavior.

Каким образом тогда синхронизировать их инициализацию? Я не моуг сказать одному процессу, чтоб он создавал семафор, а все остальные чтоб читали.

Про sem_open() знаю, но интересует именно описанный подход.
Аноним 10/09/18 Пнд 20:59:57  1262139
>>1261992
Там охуеть какая сложная функция: если встретил \, то делаешь свитч по известным символам. Если ни с чем не сматчилось, в default свитча выводишь как есть.
Аноним 10/09/18 Пнд 21:04:12  1262141
>>1262082
> Про sem_open() знаю, но интересует именно описанный подход.
А почему тебя интересует именно он, если он тебе не подходит? Это для форкающихся процессов, когда процесс может сделать инит и нафоркать себе потомков.
Аноним 10/09/18 Пнд 22:49:22  1262183
>>1262141
Потому что он использует shared memory, а он мне как раз и нужен для синхронизации вокруг shared memory. Спасибо за пояснение, всё понял.
Аноним 10/09/18 Пнд 22:51:09  1262184
>>1253747 (OP)
Привет, пишу на жс, хотел бы для общего развития обмазатся сишкой, порикоминдуйте книжку.
Аноним 10/09/18 Пнд 23:24:45  1262194
>>1262184
>порикоминдуйте книжку
Приключение Буратино
Аноним 10/09/18 Пнд 23:25:16  1262196
>>1262184
Прата, в шапке. Или K&R. Или обе.
Аноним 11/09/18 Втр 05:13:27  1262261
Доброй ночи. Хочу спросить о том, что профи привыкли делать на рефлексе, наверное.

Смотрите, есть у нас char. Это численный тип для хранения кода символа. Но мы же можем запихнуть и просто число и использовать его как тот же int в арифметических выражениях, правильно?
Так вот, как быть со знаком? Принято считать, что он по-умолчанию знаковый как с интом и беззнаковость указывать явно? Допустим, есть функция, которая принимает две строки.
Я хочу их посимвольно сравнить и пишу что-то типа while(✯a++ == ✯b++)
ну и вывести разницу, если не равны.
Нашел, что в реализации strncmp делают приведение к типу (unsigned char) и разименовывают с приведением. Но зачем?
В каких случаях мое сравнение без приведений даст сбой?
Аноним 11/09/18 Втр 05:42:57  1262270
И еще один вопрос. Слышал, в целях портабельности нельзя так делать:
void alltolower(char♥ src) {
while(♥src) {
if (src[0] >= 'A' && src[0] <= 'Z') src[0] += 32;
src++;
}
}

Сталкивался с мнением, что наборы строчных и прописных буков могут отличаться не на 32 или еще какие-то последствия могут быть, короче, не советуют. Рассудите, кали ласка.
Аноним 11/09/18 Втр 06:39:55  1262286
>>1262270
И в этот же вопрос. Я нашел такую табличечку: https://en.cppreference.com/w/c/string/byte/isprint

Там в колонке isprint, например, видно, что все значения от кода 32 до кода 126 включительно true (даже пробел с какого-то перепугу), можно ли теперь делать свою проверку как (c >= 32 && c <= 126)?

Извините, если задолбал нубовопросами, тогда просто ткните носом, где именно это читать (всего Прата прочту обязательно, но потом, а тут сдавать срочно).
Аноним 11/09/18 Втр 10:19:05  1262351
>>1262270
src[0] += 'a' - 'A'
бтв разве это не ascii? Там же должно быть всегда одно расстояние
Аноним 11/09/18 Втр 10:45:53  1262372
>>1262351
Ты че-то не то написал. Это делается src[0] |= 32
Аноним 11/09/18 Втр 10:47:09  1262373
>>1262372
А, пардон, ты про это.
Аноним 11/09/18 Втр 13:58:58  1262526
4Zluu[1].jpg (13Кб, 297x320)
>>1262261
>while(✯a++ == ✯b++)
Ты можешь только один символ инкрементировать. Пикрелейтед.
На, вот с этим поиграйся: http://rextester.com/BBL45561
Аноним 11/09/18 Втр 15:04:00  1262551
>>1262261
> Принято считать, что он по-умолчанию знаковый
В отличие от инта, по умолчанию он хз какой, и если тебя волнует знаковость или беззнаковость - надо указывать. Фактически в известных реализациях он signed.

> Нашел, что в реализации strncmp делают приведение к типу (unsigned char)
> Но зачем?
Это делается, чтобы результаты strcmp не противоречили результатам memcmp (за исключением особой обработки \0). memcmp сравнивает unsigned байты, и если strcmp решит, что (char) -1 < (char) 1, то возникнет противоречие, потому что (unsigned char) 0xff > (unsigned char) 1.

> В каких случаях мое сравнение без приведений даст сбой?
-1 - 1 = (int) -2 vs. (unsigned char) -1 - (unsigned char) 1 = (int) 255 - (int) 1 = (int)


>>1262270
> Сталкивался с мнением, что наборы строчных и прописных буков могут отличаться не на 32
254
Компьютеры, где так было, давно вымерли. Но x += 'a' - 'A' банально читаемее.

> можно ли теперь делать свою проверку как (c >= 32 && c <= 126)
Можно, но isprint() читаемее. Плюс он зависит от локали, если она не "C". iswspace() тоже руками писать собрался?

> даже пробел с какого-то перепугу
Для непечатаемых символов у терминала может быть специальное поведение. Печатаемые выводятся как есть. У терминала есть специальное поведение для пробела?
Аноним 11/09/18 Втр 18:19:56  1262626
>>1256945
%s : Scan a character string. The scan terminates at whitespace. A null character is stored at the end of the string, which means that the buffer supplied must be at least one character longer than the specified input length.
https://www.tutorialspoint.com/c_standard_library/string_h.htm
еще есть strtok для других разделителей
Аноним 11/09/18 Втр 19:07:08  1262675
С помощью fread() считал бинарный файл в массив типа char. ACSII-символы из этого массива успешно распечатал в stdout, а как из него распечатать юникодные символы(кириллица в utf-8) ?
Аноним 11/09/18 Втр 19:52:53  1262703
>>1262675
Кириллицу получилось распечатать, но помимо неё там ещё такое попадается: ���
Есть какой-нибудь диапазон значений для условия, чтобы эту хрень не выводило?
Аноним 11/09/18 Втр 20:07:30  1262706
>>1262703
Нихуя не понял, но сходи в вики посмотри, как UTF-8 устроен. Вкратце, ты можешь в поисках начала UTF-8 символа пропускать все байты, у которых (x & 0xc0) == 0x80.
Аноним 12/09/18 Срд 01:26:35  1262833
>>1257661
__нет,_столкнуться __прошу_привести_пример из Ядра.
Аноним 12/09/18 Срд 06:56:06  1262879
>>1257151
>Я хотел, чтобы пробел был напечатан i раз
держи 12 пробелов
printf("%12s", " ");
Аноним 12/09/18 Срд 07:02:13  1262884
>>1257151
>Я хотел, чтобы пробел был напечатан i раз
еще можно так:
int i = 12;
printf("%.*s", i, " ");
Аноним 12/09/18 Срд 07:03:10  1262885
>>1262884
парсер сожрал пробелы в " ", их там было много, а выводится будут столько сколько указанно в i
Аноним 12/09/18 Срд 13:30:07  1263096
Поясните за malloc. Он же возвращает указанное кол-во байт?
Я хочу сделать strdup и strcat джва в одном. Принимаю две строки и возвращаю новую, содержащую обе подряд.
Памяти мне нужно strlen первой плюс strlen второй плюс 1 байт на нолик в конце. Всё верно?
И может ли на какой-то архитектуре char быть не 1 байт?
Аноним 12/09/18 Срд 13:56:14  1263109
>>1263096
> Я хочу сделать strdup и strcat джва в одном
asprintf(), оно нестандартное, но много где есть.

> Памяти мне нужно strlen первой плюс strlen второй плюс 1 байт на нолик в конце. Всё верно?
Да.

> И может ли на какой-то архитектуре char быть не 1 байт?
Нет.
Аноним 12/09/18 Срд 14:30:24  1263122
>>1263109
Спасибо. А что значит много где есть?
Я привык в плюсах, что могу писать sizeof(int) и получать размер инта. А как в чистом си, нужно включать какой-то заголовочный файл или тоже можно везде писать и рисков с портабельностью нет?
Аноним 12/09/18 Срд 14:46:00  1263138
>>1263122
Ты тупой.
Аноним 12/09/18 Срд 14:57:06  1263141
>>1263122
> А что значит много где есть?
Это значит, что оно вроде как во фре появилось, но всем очень понравилось, и другие разработчики тоже завезли в свои либц. Даже если asprintf нет, его легко реализовать самостоятельно, пользоваться им удобнее, чем strcpy/strdup/strcat, а оверхед на парсинг форматной строки редко критичен.

> могу писать sizeof(int) и получать размер инта
Ну так и пиши, и получишь, в чем проблема-то?

> нужно включать какой-то заголовочный файл
limits.h, если тебе нужно знать не размер, а максимальные-минимальные значения.
Аноним 12/09/18 Срд 15:56:13  1263175
Cкачал вроде linux headers, но gcc все равно ругается на <linux/init.h>. Как решить эту проблему?
Аноним 12/09/18 Срд 16:41:43  1263208
>>1263175
Под linux/* разве не хедеры для модулей ядра лежат?
У компилятора по дефолту может не быть этого пути в include_path.
Аноним 12/09/18 Срд 18:41:46  1263265
x64onx32.JPG (45Кб, 984x391)
>>1253747 (OP)
Анон, смотри: на картинке, обрабатываются 64-битные числа - в 32-битной Windows XP!!!
Аноним 12/09/18 Срд 18:44:11  1263268
>>1263265
Сява, ну ты мастер-фокусник!
Аноним 12/09/18 Срд 19:06:23  1263277
>>1263268
Ахххах, бля! :3
Модератор, затери путь!
Я тебе даже portable MSPaint.exe могу скинуть - вот тут он лежит:
http://www.oldversion.com.ru/windows/microsoft-paint-xp

Кстати, в исходном коде используется
#include <inttypes.h>
а также uint64_t
Вот исходник: http://rextester.com/FMRL5648
Всё работает в XP, наверное потому, что процессор поддерживает x64.
А компелировал обычным gcc, но для 32-битных систем нужно указать ключ -m32
>gcc -m32 -o count_strings.exe count_strings.c
Аноним 12/09/18 Срд 19:13:19  1263280
>>1263277
Сява, мы и без тебя это знаем.
Аноним 12/09/18 Срд 22:52:01  1263354
>>1263277
> Всё работает в XP, наверное потому, что процессор поддерживает x64.
Проиграл. Нет, работает в XP потому, что 64-битные числа можно обрабатывать как пару edx:eax, что, собственно, гцц и делает. А можно вообще точно таким же макаром запилить арифметику произвольной точности.
Аноним 12/09/18 Срд 23:59:28  1263367
>>1263354
Я вот, например, запилил для 256-512-1024-2048, использую в криптографии.
Аноним 13/09/18 Чтв 04:32:24  1263414
Сап, анон. Я, блять, извращенец. Так получилось, что мне нужно ткнуть в код безусловный переход. Ну, я по всякому думал как переписать, но в голову ничего так и не пришло. У меня функция вызывается из другой, отдельно компилируемой функции и я туда тыкаю goto с меткой. Но мне закралось подозрение, что там нужно использовать setjump.h. Дак вот. Поясни в чём у них разница и какой лучше засунуть для дальнего перехода?
Аноним 13/09/18 Чтв 05:38:20  1263419
>>1263414
setjmp()/longjmp() позволяют выпрыгнуть наружу, а не впрыгнуть внутрь. Покажи лучше код, наверняка там ни гото, ни longjmp не нужны.
Аноним 13/09/18 Чтв 06:04:09  1263422
>>1263419
Спасибо. Всё так и получается. Сорь, не могу сурц показать. Закрытый проект. Просто в нём break завершит лишь выполнение функции и вернётся, если условие наступит на уровень выше и всё закончится. У меня это для критического участка, что если что-то утекать начнёт, то это максимально быстро всё остановит и прыгнет в другую функцию. Я знаю, что там можно через несколько уровней вложенности функций разрешить эту проблему, но очень сильно читаемость ухудшит, а мне же этот проект потом ещё долго пилить и через полгода возвращаться обратно. Хотя может тогда поумнею и пойму как разрешить этот кривой прыжок.
Аноним 13/09/18 Чтв 06:28:16  1263423
>>1263354
>64-битные числа можно обрабатывать как пару edx:eax
Так, насколько помню - BigInteger'ы считают, там длинная арифметика тоже к простым действиям сводится.
Но x64 тем и лучше, что позволяет одной инструкцией ассембера 64-х битные числа считать, а не двумя как эта пара 32-х битных.
Я слышал давненько, что в процессора даже специально заводят отдельные логические схемы для AES256,
и замыкают их на одну инструкцию, чтобы быстро потоковое шифрование-дешифрование делать.
Если так смотреть на это, то процессора эти - вообще 256-битные. Но конечно же эти схемы не универсальны, а специфичны...
Аноним 13/09/18 Чтв 06:35:46  1263425
>>1263423
> то процессора эти - вообще 256-битные
AES считает в GF(28), а 256 - это про ключ и раунды.
Аноним 13/09/18 Чтв 06:39:07  1263426
>>1263367
8096 запили с пруфами, а то я видел RSA-ключи для PGP и SSH такой длины.
Наверное же не без причины так длину ключа загнули...
Можно и через BigInteger считать, но лучше и быстрее - организованной и оптимальной
последовательностью стандартных инструкций.
Аноним 13/09/18 Чтв 06:41:47  1263427
>>1263425
А 28 = 256 же. И да, там по всей группе значения перемешиваются.
Аноним 13/09/18 Чтв 09:18:57  1263445
Посоветуйте статью по ссылки и указатели для тупых.
Спасибо
Аноним 13/09/18 Чтв 09:27:01  1263448
>>1263445
В си нет ссылок.
Аноним 13/09/18 Чтв 10:37:36  1263473
>>1263141
Спасибо за дельный ответ.
Аноним 13/09/18 Чтв 12:27:36  1263523
>>1263426
Ты, наверное, имел ввиду 8192. Но зачем?
Для RSA-то понятно, но свою математику я использовал для эллиптической криптографии, а там в основном ключи 256 / 512.
Аноним 13/09/18 Чтв 12:28:59  1263524
>>1263426
>>1263523
Собственно, надо скопировать две таблички и два блока ассемблерных, чтоб сделать 4096 и 8192, но в рамках текущего проекта мне это не нужно.

Да и там уже как минимум каратсуба будет нужен, иначе слишком медленно. В эллиптике свои нюансы.
Аноним 13/09/18 Чтв 12:30:32  1263525
>>1263423
НАМНОГО лучше. В своей либе мы отказались от поддержки 32-бит в принципе. Вернее, старая реализация осталась, но новая пилилась только под 64. Просто потому что намного быстрее и намного удобнее.
Аноним 13/09/18 Чтв 14:00:46  1263564
Антоны, решился писать дрова под винду. Кто-нибудь имел опыт с этим? Что качать и где?
Аноним 13/09/18 Чтв 14:09:34  1263568
>>1263564
> Антоны, решился писать дрова под винду. Кто-нибудь имел опыт с этим? Что качать и где?

https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk



Аноним 13/09/18 Чтв 14:12:39  1263573
>>1263568
Здесь написано что WDK входит Studio 2017, но почему-то его нет!
Аноним 13/09/18 Чтв 14:38:48  1263583
>>1263524
Карацуба и монтгомери. Слижи исходники у OpenSSL. Они на этом собаку съели (пару CVE поймали для случая с AVX-512)
Аноним 13/09/18 Чтв 14:39:56  1263584
>>1263583
Уже давно прикручено и производительность я получил феноменальную. Каратсуба для 512 бит не нужен.
Аноним 13/09/18 Чтв 14:40:57  1263586
>>1263584
Прикручено - это я про монтгомери.

AVX-512 классная штука, но мало где есть, мне разрешили только avx и avx2 использовать.
Аноним 13/09/18 Чтв 14:49:01  1263593
>>1263586

Отлично, молодец. Действуй именно через эти алгоритмы когда есть операции умножения огромных по битности чисел, возведения таких чисел в степень с взятием остатка. На данный момент это самый эффективный способ реализовать RSA. AVX регистры операции, то ладно, а вот что делать для ускорения того же кода на ARMv8 - писать под NEON(!). Вот почему я и топил за раст как за язык с явной векторизацией, так как никакой компилятор тебе гарантировать не может что он без явного интринсика или asm-вставки будет использовать SIMD, а все эти интринсики стоят переносимости до момента пока их в стандарт не запихнули.

Второй момент - реализовывать для прикладных проектов сегодня кривули - стоит. Причина проста - они меньше по размерам операндов, и немного так быстрее, вот только - нужно с особой осторожностью это делать: Juniper также съели на этом говна.
Аноним 13/09/18 Чтв 15:02:32  1263603
>>1263593
>так как никакой компилятор тебе гарантировать не может что он без явного интринсика или asm-вставки
Собственно, большую часть арифметики я на асме и писал, потом линковался.
Аноним 13/09/18 Чтв 15:05:05  1263604
>>1263426

Но зачем ебать RSA (с ключами, стремящимися к одноразовому шифроблокноту) если есть эллиптическая криптография с ключами в 10 раз короче при той же надежности?
Аноним 13/09/18 Чтв 15:06:29  1263605
>>1263604
Собственно, изначальный автор как раз эллиптическую и реализовал, но отвечающие почему-то начали упоминать rsa.
Аноним 13/09/18 Чтв 17:01:44  1263659
void* array[] ахуенное решение всех проблем
Аноним 13/09/18 Чтв 17:02:43  1263661
>>1263659
Достаточно void *ptr, а потом кастуешь как хочешь.
Аноним 13/09/18 Чтв 17:09:14  1263663
>>1263661
Вот преимущества слабой типизации!
Аноним 13/09/18 Чтв 18:24:26  1263690
>>1263427
> 256 же
Блядь, вот когда написал, так и подумал, что кто-нибудь обязательно возведет и решит, что это про биты. Да, оно GF(256), но в форме GF(28) нагляднее: 8 - это степень полинома, у коэффициентов которого арифметика по модулю 2. Т.е., это 8-битный байт с XOR в качестве сложения-вычитания и хитровыебанными умножением и делением (тоже по модулю).

> И да, там по всей группе значения перемешиваются.
Это ближе к SIMD.
Аноним 13/09/18 Чтв 18:44:41  1263709
Привет, объясните довену про то что такое стек. И принцип работы функции printf со стеком. А также почему так: вот допустим: double a=10; //допустим дабл 8 байтов
Long c=5,d=100; //допустим лонг 4 байта
И если вызову printf(“%ld %ld %ld”,a,c,d); то первые двачисла будут выведены рандомные а третье выведенное число будет выведено правильно. Разве не должно быть типа первый %ld читает последние 32 бита из стека, и вторые два %ld читают еще по 32 бита из стека и по идее вроде как должно выводить первое число рандомно но два последних правильно хотя на деле так как я выше написал. В общем подозреваю во всем то что не понимаю что такое стек и как работает, выручай анон
Аноним 13/09/18 Чтв 22:11:27  1263796
>>1263709
Ты понимаешь, что такое стек. Но забываешь, что у тебя там наверняка 64-битный код, а 64-битные конвенции вызова передают часть аргументов через регистры. Подробнее https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions или просто на годболте смотри дизасм.
Аноним 14/09/18 Птн 00:34:50  1263875
>>1263523
>Ты, наверное, имел ввиду 8192.
Да.
>Но зачем?
Как тут:
https://www.thechiefmeat.com/pgp/

>Для RSA-то понятно, но свою математику я использовал для эллиптической криптографии, а там в основном ключи 256 / 512.
Если это действительно арифметика произвольной точности (точность которой задана),
то она подойдёт для чего угодно ввиду своей универсальности.
Главное чтобы с числами такой длины можно было оперировать быстро, производя при этом с ними - все основные арифметические операции,
из которых потом как из инструкций могут комбинироваться n-битные программы.
>>1263524
>каратсуба
>>1263583
>Карацуба и монтгомери. Слижи исходники у OpenSSL. Они на этом собаку съели (пару CVE поймали для случая с AVX-512)
Там где можно ускорить операции, чё бы и не ускорить их.
Но ИМХО, качественно написанная n-битная арифметика - уже должна быть оптмальна по коду и скорости, сама по себе.
>>1263584
>Каратсуба для 512 бит не нужен.
И вот здесь где-то, у этого, должен быть пример 512-битного умножения не хуже карацубы.
>>1263583
>Прикручено - это я про монтгомери.
А у тебя алгоритмы Монтгомери быстрее работают, чем на арифметике?

>>1263604
>Но зачем ебать RSA (с ключами, стремящимися к одноразовому шифроблокноту)
>если есть эллиптическая криптография с ключами в 10 раз короче при той же надежности?
>>1263605
Потому что ключей длиной 8192 бит в эллиптической криптографии - я ещё не видел, только в RSA.
И да, кстати, а разве на эллиптической кривой можно шифровать?
Насклько я знаю есть только ECDSA так это дело - для цифровой подписи лишь годится,
а дальше уже идёт потоком - симметричный AES от SHA256-хэша например...
Симметричная криптография, типа AES расшифровывает тем же ключём, что и шифрует,
а значит перехват ключа вскрывает шифр.
В то время на RSA реализуется асимметричная криптография!
То есть - одним ключём (публичным) шифруешь, другим же (приватным) расшифровываешь.
На сайте выше есть яркий пример асимметричной криптографии.

>>1263690
>Т.е., это 8-битный байт с XOR в качестве сложения-вычитания и хитровыебанными умножением и делением (тоже по модулю).
Хочешь сказать, что GF(28) = GF(256) как и байт имеет лишь 256 состояний?
Посмотри лучше на Число возможных различных состояний кубика Рубика
(8! 38-1) (12! 212-1) 2 = 43 252 003 274 489 856 000, то есть более 43 квинтиллионов комбинаций.
Аноним 14/09/18 Птн 01:48:22  1263894
>>1263875
>А у тебя алгоритмы Монтгомери быстрее работают, чем на арифметике?
Да, намного.
Аноним 14/09/18 Птн 03:18:02  1263900
1533005569229.png (418Кб, 492x493)
Кто-нибудь в этом ИТТ треде занимается разработкой прикладных программ с нуля на Си? Не для микроконтроллеров и т.п., а просто запускать на компьютере? Если да, то можете обосновать за щёку свой выбор?
Я начал писать нужную себе программу и слегка подохуел от нужного, но, в целом, лишнего кода, если бы я писал в любом другом достаточно популярном сегодня языке программирования.
Я пишу достаточно плохо, поэтому два дня я провёл разворачивая сегфолты. При этом Си для меня единственный на данный момент язык, в котором я чувствую себя уверенно.
Аноним 14/09/18 Птн 03:35:44  1263902
Доброй ночи. Посоветуйте материалов (если можно, лекций, видосов, интерактива) на тему работы с памятью. Маллок, каллок, реаллок, фри — что там под капотом, как это всё работает, как его можно улучшить и почему не нужно.
Ну или скажите, как вы эту тему осваивали?
Аноним 14/09/18 Птн 03:43:48  1263905
>>1263900
Пишу прототипы на питоне, рано или поздно перекатываюсь на сишечку, мне норм. Кресты не нравятся, больше выбирать не из чего.

>>1263902
> что там под капотом, как это всё работает
В K&R реализовывали кастомный аллокатор, посмотри. Для начала сойдет, потом подумаешь про эффективную реаллокацию, фрагментацию кучи и всю хуйню.

> как его можно улучшить
Тема на очень толстую книгу.
Аноним 14/09/18 Птн 05:04:32  1263920
>>1263905
Руст
Аноним 14/09/18 Птн 07:07:58  1263938
>>1253747 (OP)
Можно ли как-то сделать, чтобы файл записался после
>system("pause");
?

Сунул её чтобы окно не закрывалось, когда двойным кликом по exe запускаешь,
но только после нажатия кнопки или после закрытия окна файл записывается и видно контент...

Надо сделать так, чтобы до pause - он уже записался.
Аноним 14/09/18 Птн 07:40:58  1263942
>>1263902
>что там под капотом

Для линуха это системные вызовы brk (передвигает границу разрешённой кучи для малых аллокаций) и mmap (мапит дохуя памяти страницами, для большой ёбы)

Поверх этой выделяемой памяти программно реализована хуйня на каких либо структурах данных, которая сохраняет инфу об освобожденной памяти и позволяет переиспользовать куски подходящего размера не прося OS выделить больше. Реализация этой хуйни зависит от кода конкретной реализации стандартной библиотеки. Современные достаточно сложные, как можешь убедиться:

https://github.com/lattera/glibc/tree/master/malloc

Аноним 14/09/18 Птн 07:47:55  1263944
>>1263938
fflush(fp) или fclose(fp). Внезапно.
Аноним 14/09/18 Птн 10:53:32  1264008
>>1263944
Не-а, всё равно надо клавишу нажимать или окно закрывать. Иначе - в файле пусто...
Аноним 14/09/18 Птн 12:07:58  1264058
>>1264008
Хэххэх.
Сначала подумалось что он фитиль какой-то зажёг, показывая на понтах как стартует Falcon9,
затем чё-то показалось что это кальян - оказалась сигара "с травкой" по словам Джо Рейгана...
Там, внутри травы, насколько я знаю есть тетрагидроканнабинол, принадлежащий более широкому классу вещество - терпеноиды.
Многие из них проявляют свойства антиоксидантов, и противоопухолевых препаратов.
Их даже рассматривают как потенциальные геропротекторы.
Аноним 14/09/18 Птн 13:05:11  1264096
>>1261857
Пришёл к этому - вот так: http://rextester.com/TBY4587
Аноним 14/09/18 Птн 14:01:57  1264124
Сразу не пинайте. В С вообще возможно сделать хотя бы примитивный платформер с графикой и какие средства для этого нужны? Помню даже в паскале я рисовал круги анимировал их. А тут только одна консолька.
Аноним 14/09/18 Птн 14:13:30  1264130
>>1264124
http://lazyfoo.net/tutorials/SDL/index.php
Аноним 14/09/18 Птн 14:15:15  1264132
>>1264124
>>1264130
https://www.libsdl.org/download-2.0.php

Для сишки лучше варианта нет, поддерживается везде, есть в репах, в стике куча игр написанных таким образом, даже под steamos вальвы обновляют.
Аноним 14/09/18 Птн 14:16:08  1264133
>>1264130
> These tutorials were designed for C++ programmers
У нас же тут тред не про с++ же?
Аноним 14/09/18 Птн 14:18:20  1264134
>>1264133
Я лично проходил эти туториалы и билдился с gcc, несмотря на то, что автор использует g++. Код весь сишные, либа написана на си и в первую очередь для использования с си (хоть и не только).
Брат жив.
Аноним 14/09/18 Птн 14:19:46  1264138
>>1264133
>>1264134
Хотя да, я не прав. Посмотрел некоторые - там он использует классы, но не суть. Всё равно всё понятно и на си прекрасно либой можно пользоваться.
Аноним 14/09/18 Птн 18:14:54  1264224
>>1264138
мне вот интересно - а как писались игры на С во времена доса без всяких этих API?
Аноним 14/09/18 Птн 18:40:38  1264231
>>1264224
Всегда было какое-то апи.
А до него рисовали командами "покрась точку 32:16 в цвет 114.

Вон, в играх на пс1 (писались на си) через контроллер, замаппленный на участок оперативки, передаются группы байт, являющиеся командами "нарисовать примитив такой-то с координатами такими-то". Но и это упаковывалось в некоторое апи в виде стандартной библиотеки пс1.
Аноним 14/09/18 Птн 18:47:35  1264234
>>1264231
А какое апи использовал тот же дум 1-2?
Аноним 14/09/18 Птн 19:28:32  1264251
>>1264008
Быть такого не может. Тащи код.

>>1264132
> Для сишки лучше варианта нет
Есть. Выкинуть SDL и накидать создание окна вручную.

>>1264234
> А какое апи использовал тот же дум 1-2?
Никакого. Ну если не считать вызовы BIOS для установки видеорежима. А так он рисовал прямо в видеопамять попиксельно.
Аноним 14/09/18 Птн 20:30:50  1264315
>>1264251
Создать окно вручную? Как?
Аноним 14/09/18 Птн 21:24:09  1264350
>>1264315
CreateWindowEx/XCreateSimpleWindow
Аноним 14/09/18 Птн 23:21:38  1264398
allahuakbar(1).png (340Кб, 521x938)
привет, я правильно все делаю?
Аноним 15/09/18 Суб 01:55:39  1264427
>>1264398
>я правильно все делаю?
Фотографируешь книги? Нетъ
Аноним 15/09/18 Суб 02:00:00  1264428
>>1264398
Осталось начать дебажить и писать код на листке.
Аноним 15/09/18 Суб 03:03:51  1264439
>>1264251
>Выкинуть SDL и накидать создание окна вручную.
Это ж ебануться можно - писать таким образом кроссплатформу.
Хотя это никакая не кроссплатформа уже.
Аноним 15/09/18 Суб 04:58:00  1264452
>>1264439
> Хотя это никакая не кроссплатформа уже.
Из коробки кроссплатформенными бывают только хелловорлды. Для чего-то более сложного всегда нужны куски кода под конкретные платформы.
Аноним 15/09/18 Суб 07:49:01  1264471
Под какую музыку вы кодите на Си?
Понимаю что кодить лучше в тишине, но у меня нет такой возможности
Аноним 15/09/18 Суб 07:53:31  1264473
>>1264471
Драм энд бэйс.
Аноним 15/09/18 Суб 08:17:59  1264477
image.jpeg (76Кб, 400x286)
Аноним 15/09/18 Суб 16:19:03  1264651
>>1264477
Пишу на си и плюсах.
Замазал языки и скинул своей тян, спросив кто я. Вышло, что я перл.
Аноним 15/09/18 Суб 16:22:16  1264653
Спросил ещё пару человек, замазав языки, — тоже перл.
Пиздец.
Аноним 15/09/18 Суб 16:30:40  1264658
>>1264653
>>1264651
Просто они знают, что ты хуесос, а сигарета символизирует хуй.

Но это лично моё мнение. Обижаться или принять как данность твоё дело.
Аноним 15/09/18 Суб 16:40:32  1264665
>>1264658
А ведь я даже не курю, кхе-хе.
Аноним 15/09/18 Суб 16:50:12  1264670
>>1264665
А я курю!
мимо-кернел-девелопер
Аноним 15/09/18 Суб 16:53:02  1264673
>>1264651
> своей тян
Кому ты пиздишь, анимедаун?
Аноним 15/09/18 Суб 17:58:52  1264707
>>1264665
А я где-то писал, что ты куришь?
> Просто они знают, что ты хуесос
Аноним 15/09/18 Суб 21:49:24  1264771
>>1264670
Сосешь
мимо-тесла-девелопер
Аноним 15/09/18 Суб 21:55:48  1264774
>>1264651
>Пишу на си и плюсах
Пруф или не было.
>Замазал языки и скинул своей тян
А она тебя добавила в чс, потому что такую хуйню только конченый олигофрен скинет. Хотя какая тян, кому ты пиздишь?
>Вышло, что я перл
Вышло, что ты пёрнул в тред, пидор гнойный.
Аноним 15/09/18 Суб 23:17:16  1264791
>>1264774
Что с тобой не так?
Аноним 16/09/18 Вск 00:16:56  1264813
Чем с++ принципиально отличается от С кроме ооп? Можно ли на С сделать все то же самое что и на С++ и почему С не умер с приходом последнего?
Аноним 16/09/18 Вск 01:42:45  1264829
>>1264813
Да
Аноним 16/09/18 Вск 02:47:28  1264838
Вечер в хату пацаны. Какие перспективы овладения чистым си? Легаси? Эмбедед? Светит ли какая работа без знаних линейной алгебры и диффуров или лучше в джаву переучиваться пока не поздно?
Аноним 16/09/18 Вск 03:35:28  1264844
>>1264838
>Какие перспективы овладения чистым си?
60тр в НИИ им. Сраниченко
Аноним 16/09/18 Вск 06:19:10  1264853
>>1264844
Без знания высшей математики? В НИИ? Точно?
Аноним 16/09/18 Вск 09:19:58  1264873
>>1264829
Охуенный ответ блядь. А можно более подробно?
Аноним 16/09/18 Вск 09:32:33  1264880
>>1264873
Ну ты дурак или родом так? Чтобы ответить на твой вопрос проще книгу написать.
Аноним 16/09/18 Вск 09:39:50  1264882
>>1264813
Бля, ну давай моё мнение с моей скромной колокольни. Есть фразочка на хабре вроде гуляет: "на с++ я могу написать всё что угодно... На Си я могу написать с++" На си писали отцы. Линукс написан на сях чистых. Так что щитай, что большая часть интерената функционирует за счёт чистых сей. Я вот лично думал как организовать полиморфизм в сях. И ничего кроме вызовов функций по объединениям в качестве агрументов не придумал. Хотя это костыльное, как мне кажется, решение. Наследование делается через вложенные сруктуры и функции в них. Инкапсуляция это хуйня какая-то о которой не помню. Но если ты не еблан и пишешь собственный с++ на сях, то в ногу не выстрелишь, память не расплескаешь и методы структур не будут изменяться. А вот Страуструп в своей книжке, кстати вообще за памятью не следит и некоторые сурцы у него текут, ага. Пруфы сам нароешь.
Аноним 16/09/18 Вск 09:44:22  1264883
>>1253747 (OP)
Как проверить является ли аргумент или строка числом uint64_t?
Есть ли функции наподобие isNumber(str)//true, false
Аноним 16/09/18 Вск 09:52:34  1264884
>>1264251
>Быть такого не может. Тащи код.
Всё, решил, я просто выше пауз ещё понаписывал.
Аноним 16/09/18 Вск 09:52:40  1264885
>>1264883
В смысле строка uint64_t? У тебя вроде как по умолчанию строка содержит char по одному байту (8 бит). И твоя строка содержит 8 ASCII-символов, которые могли бы уместиться в uint64_t. А чтобы узнать состоит ли у тебя строка из циферок, то прогони в цикле каждый символ, чтобы его шестнадцетиричный код лежал в диапозоне от 0x30-0x39. и Правая цифра после 0x3? будет твоей цифрой ASCII.
Аноним 16/09/18 Вск 10:04:26  1264889
>>1264885
Чиво блядь? Ты хоть представляешь сколько цифор на свете? Их бесконечное множество! Как я в цикле могу их прогнать? Сначала кумекай, потом кукарекай! Что мне от 0 до 9 даст цикл, если мне надо проверить что-то за пределами этого диапазона?
Аноним 16/09/18 Вск 10:08:26  1264890
>>1264889
Чо сказать-то хотел?
Аноним 16/09/18 Вск 10:11:06  1264891
>>1264890
Ну ты и тупой! Прежде сем хуйню советовать думай!!!
Аноним 16/09/18 Вск 11:46:00  1264912
>>1264883-кун на связи...
Я не этот >>1264889

Итак... Что тут у нас?..
>>1264885
>В смысле строка uint64_t?
Да.
>У тебя вроде как по умолчанию строка содержит char по одному байту (8 бит).
>И твоя строка содержит 8 ASCII-символов, которые могли бы уместиться в uint64_t.
>А чтобы узнать состоит ли у тебя строка из циферок, то прогони в цикле каждый символ,
>чтобы его шестнадцетиричный код лежал в диапозоне от 0x30-0x39.
Поначалу тоже подумалось мне, но наловил багов...
Всё по причине того, что
fgets(string, 255, stdin);
сохраняет в конце строки '\n', когда вводишь значение.
Пришлось сделать strtok(string, "\n"); после этого.
>и Правая цифра после 0x3? будет твоей цифрой ASCII.
Но я по-другому решил.
У меня есть функция string_to_u64(str),
поэтому сначала я прочитал строку в uint_64,
затем sprintf(temp_string, "%" PRIu64, uint64_t_value);
после чего - if(!strcmp(temp_string, string)). Дальше либо - return либо 1, либо 0.
Всё в отельную функцию пхнул и работает как надо.

>>1264889
>Чиво блядь? Ты хоть представляешь сколько цифор на свете?
Их radix, на самом деле в числе.
>Их бесконечное множество!
Не все считают в бесконечноричной системе счисления, как ты.
>Как я в цикле могу их прогнать?
По цифрам, очевидно же. В идеале - по битам.
>Сначала кумекай, потом кукарекай!
Этот залётный, потроллить решил.
>Что мне от 0 до 9 даст цикл, если мне надо проверить что-то за пределами этого диапазона?
Ну, смотри сюда, что-ли: http://rextester.com/ZYP23810

>>1264890
ЧТО ЗАТРАЛЛЕЛ.

>>1264891
ЛАЛ.

Аноним 16/09/18 Вск 17:51:09  1265060
>>1264883
strtoull, посмотреть результат и проверить, что после вызова указатель указывает на '\0'.
Аноним 16/09/18 Вск 17:56:51  1265066
>>1264882
Покажи свой С++
Аноним 16/09/18 Вск 20:27:43  1265158
>>1253747 (OP)
Смотрите:
char x = '\t'; //символ
printf("x = \%c", x); //print string 'x5 = TAB' <------ хуле тут слэш не котируется? Ожидалось '\\t' -> '\t'
printf("\n");

Шо нема разве функций по эскапу унескапу чарактеров?
Вкиньте я их сразу инклюдить буду, а то по свичу писать в каждое условие ну не очень удобно...
Аноним 16/09/18 Вск 20:59:15  1265181
>>1265158
Вот тут https://stackoverflow.com/questions/29477345/how-to-print-special-characters-explicitly-in-c
лежит функция escape с большим свичем. Называется она str_escape(char str[])
Что она делает? А как раз-таки - эскапает стринги и чарактеры.
И вот так юзается она: http://rextester.com/EQH57181
Аноним 16/09/18 Вск 21:01:16  1265183
>>1265158
а ты не пеши а сделай:
char unecsape[128][] = {"\\0", "\\1",...}
и потом пишеш
printf("%s\n", unecsape[x])
Аноним 16/09/18 Вск 21:37:58  1265202
>>1265183
Это не unescape, а escape. Для unescape нужно парсить строку.
Аноним 16/09/18 Вск 23:47:19  1265268
image.png (15Кб, 518x168)
Установил себе gcc на ubuntu,
но вот команда не работает? Может я что-то сделал не так?
Аноним 16/09/18 Вск 23:55:52  1265273
>>1265268
Красава, заебись установил.
Аноним 16/09/18 Вск 23:58:10  1265274
Стикер (0Кб, 512x512)
>>1265273
Аноним 17/09/18 Пнд 00:01:41  1265277
>>1265274
В прыщах, и в убунте особенно, архивы с исходника и ко-ко-компелировать необходимо прежде чем использовать. Если пакет изначально не был предкококомпелирован.

А так убунта тебе поямо сказала что тебе необходимо сделать, чтобы гцц встал и ко-ко-компелировал твой говнокод.
Аноним 17/09/18 Пнд 00:15:04  1265280
>>1265277
sudo apt install gcc я прописывал..
Он что-то прогрузил там, но один хуй не работает
Аноним 17/09/18 Пнд 00:16:43  1265281
>>1265280
Ну милый мой, ответ я твой не принимаю

> Он что-то прогрузил там,

Я не ванга, что дать ответ на такой расплывчатый вопрос
Аноним 17/09/18 Пнд 00:22:38  1265287
>>1265281
А вот, со второго раза установилась.. ОМГ
Аноним 17/09/18 Пнд 00:54:09  1265305
>>1265268
Ты забыл указать.
>-o compiled.exe
и аргументы, параметры, там ключи всякие.
Введи gcc -help
Аноним 17/09/18 Пнд 01:05:20  1265312
>>1265183
Ой бро, да ты же, внатуре, ескапать пытался. Для эскапа я функцию запостил выше.
А постой. Что это у тебя тут? Хеш-таблица, с ключами и без значений?
И двойной массив какой-то, многомерный что-ли?
Ты туда x засунул в [x] - для чего? Это символ должен быть в виде переменной?
А как тогда тройной ключ в хеш-таблице внутри строки искать?
Там три символа, по три читать что-ли?

>>1265202
>Для unescape нужно парсить строку.
Я знаю только что строка - это массив символов (числовых кодов их),
и массив этот - заканчивается символом '\0'. Уже как-бы пол дела.
Но чё-то не пойму как строку в int засунуть.
Пытался так: int code = (int) string;
по аналогии c int code = (int) char;
но оно чё-то не фурычит...

P.S.: в итоге пришёл, через гугл - к функции atoi()
Аноним 17/09/18 Пнд 01:06:04  1265313
>>1254644
Пока самая главная проблема Rust'а - слишком быстрые изменения. Язык пока ещё не совсем устоялся, бывает, что ломается синтаксис, и либу, которую полгода назад тащил в cargo.toml, сегодняшней версией компилятора уже не собрать, потому что DEPRECATED
Аноним 17/09/18 Пнд 01:09:59  1265315
>>1264912
>http://rextester.com/ZYP23810
Эта функция не работает для чисел с нулями впереди "00049846515". Как исправить не пойму.
Аноним 17/09/18 Пнд 01:16:54  1265318
>>1265315
Чё-т вбрело strtok'ом по нулю в цикле проехаться, а потом компарить.
Может есть лучшее решение вроде неведомого memmove c этими его - амперсандами?
Аноним 17/09/18 Пнд 01:18:32  1265321
>>1265305
Это необязательно, gcc предполагает имя по умолчанию.
Аноним 17/09/18 Пнд 02:32:44  1265327
>>1265287
Может ты sudo забыл в первый раз написать, когда устанавливал? Или пароль неправильно ввёл.
Аноним 17/09/18 Пнд 02:41:06  1265329
>>1265066
Блять, я всего лишь предложил способ извратиться и написать свой с++ на сях. Это же не значит, что я реально буду извращаться и фистить себе анал на с++, как Страуструпы всякие.
Аноним 17/09/18 Пнд 03:40:46  1265332
>>1265181
Там надо memset(buffer, '\0', sizeof(buffer));
вставить, а то хуйня какая-то там, в первых трех символах.
Аноним 17/09/18 Пнд 03:43:51  1265333
>>1265312
>Ты туда x засунул в [x] - для чего? Это символ должен быть в виде переменной?
да
>А как тогда тройной ключ в хеш-таблице внутри строки искать?
а зочем
вот у аноньчика символ x = '\t'
у него будет хранится в x девятка, есле её вызвать как число
потом мы хотим сделать этот таб пичатаемым
мы просто напишим unexcape[x] и под этим адрисом будет у него строчка "\t", илижи "\\t\0", есле быть точным
Аноним 17/09/18 Пнд 06:24:50  1265342
>>1264813
ООП, разрушение объектов при выходе из области видимости, исключения, шаблоны, перегрузка операций

>почему С не умер с приходом последнего
С очень сильно усох с приходом плюсов. У плюсов есть свои минусы (типа отсутствия стандарта на бинарные интерфейсы), которые ограничивают их использование в системном софте.

>>1264882
Многие писали велосипедное ООП с полиморфизмом на С. В геймдеве это было обычным делом в 90е.
Аноним 17/09/18 Пнд 08:05:57  1265378
>>1265333
Я уже ескпал функцией со свичем, но твой пример я тоже не забыл.
Поигрался с ним, и вот что получилось: http://rextester.com/OGRD62658
Не знаю правда насколько правильно оттуда возвращать '\1' '\2' '\81'
но вроде-бы строки совпадают. Однако всё это дело - не унескапает,
и надо как-то циклом парсить...
Аноним 17/09/18 Пнд 08:46:27  1265395
>>1265342
>Многие писали велосипедное ООП с полиморфизмом на С. В геймдеве это было обычным делом в 90е.

В геймдеве 80х-90х обычным делом было выдумывание/взятие готового DSL и написание скриптового движка, после чего байтоёбля заканчивалась и начиналась разработка игры.

Вспомнить тот же лукасовский SCUMM. Или лишп в играх серии Crash Bandicoot.

Даже на денди, блядь, разработчики упрощали себе жизнь:

https://habr.com/post/259761/

А анекдотов про боевых байтопидорасов (вот в наше-то время, ууууххх!!!!, не то что вы скрипто сосунки кхекхекхекококо, вот тогда то только байты ебали, ууу прямо на ассемблере с сишными вставками, кококо) уже потом с подачи кармака и его кодлы позёров и графоманов насочиняли.

Аноним 17/09/18 Пнд 08:49:40  1265396
>>1265395
Так как раз кармак в квейке 1,2 и делал ООП на С. На счет 3 части не уверен на чем они ее писали.
Аноним 17/09/18 Пнд 08:53:26  1265397
>>1265396
>Так как раз кармак в квейке 1,2 и делал ООП на С

Так в квейке два он как раз вроде выкинул виртуальную машину и сказал "ебитесь с нативными DLL и вижуалстудией", а в третьей вернул вместе с конпелятором.
Аноним 17/09/18 Пнд 08:56:25  1265399
>>1265396

Но я вообще к тому, что вот эта вся байтоёбская движуха с ассемблером началась именно с кармаковской компании, миха абраш в своих талмудах ссал всем тогдашним школьникам как ебать байты и быть крутым хакиром-гейдевелопером, А кармак и вовсе типа был богом и ПРИДУМАЛ ТРИДЕ-ГРАФИКУ11111.
Аноним 17/09/18 Пнд 08:57:25  1265400
>>1265397
Разве наличие виртуальной машины обязательно для ООП?
Аноним 17/09/18 Пнд 09:18:07  1265409
>>1265327
Или у него сеть отвалилась при первой скачке и при запросе к репозиторию ему ответили соси хуй.
давно программисты настолько отупели, что не могут даже по описанию понять в чем дело?
Аноним 17/09/18 Пнд 09:29:18  1265411
>>1265395
>Даже на денди, блядь, разработчики упрощали себе жизнь:
Ясен хуй разрабы не стали бы срать семь мегаменов с нуля, или три финалки, или там драгон квесты какие.
Мегамены, впрочем, к отличным от других играм не относятся, в отличие от думов. Хотя, даже когда дум раз появился, мало кто егово второй раз переписывал.
Аноним 17/09/18 Пнд 09:44:48  1265417
>>1265409
Ну, блять. Я себя впервые вспоминаю как вкатывался в пинус и в си соответственно, дак, блять, у меня попоболь не утихала постоянно. Начиная с того, что bash чувствителен к регистру и заканчивая английскими сообщениями компилятора. За год вроде уж привык к такому. Алсо вопрос. Сколько нужно, минимум, надрачивать си, чтобы уверенно себя начать чувствовать и топать на первые собеседования?
Аноним 17/09/18 Пнд 09:51:52  1265418
>>1265417
Читаю книгу, еще первую главу. Чую на указателях вроде & сгорю нахуй. До этого разве что в школе под досом на бейсике писал программы. В 27 лет не поздно начинать учить язык?
Аноним 17/09/18 Пнд 10:03:29  1265419
>>1265417
>Сколько нужно, минимум, надрачивать си, чтобы уверенно себя начать чувствовать и топать на первые собеседования?

До момента понимания сорцов ядра linux, использованных там приемов и уверенного написания helloworld-драйвера под него же.
Аноним 17/09/18 Пнд 10:04:49  1265421
>>1265418
Ну, от тебя по крайней мере польза в том, что я в свои 23 не чувствую себя теперь стариканом, который поздно уселся учить Си. Ну, кстати я представляю как указатели работают в 32-разрядной архитектуре, но я так до сих пор и не понимаю как организована память в x86_64. А так вроде жеж это несложно... Просто представь всю оперативку как массив длинной 4 гига ну или сколько там у вас?. Каждый байт - это ASCII-символ. А указатель - это номер индекса этого огромного массива оперативки. И вот указатель позволяет получить содержимое этого символа(ака, байта, ака ячейки памяти). И строки напримр начинаются с определённого адреса(показываемого оператором &) и идут до бесконечности за границы твоей оперативки, пока не будет встречен нулевой байт. Это вкратце об атаке переполнения буфера, но сейчас, наверное, ей никого уж не пронять. Алсо есть вопрос... Стоит ли размер массива держать в нулевом элементе? Чтобы при работе с массивом исключать его нулевой элемент из обработки а в условии выхода из цикла ссылаться на этот нулевой элемент.
>>1265419
Спасибо, анон. Как раз в декабре собирался за модули ядра усесться. Типо после НГ попробую жопу от дивана оторвать. В итоге я два чистых года учу Си и всего год только эффективно, по книгам и по педивикиям.
Аноним 17/09/18 Пнд 10:24:03  1265430
>>1265421
>как организована память в x86_64

Так же как и в 32 в страничном варианте и двумя сегментами, с той лишь разницей что первые 16 бит пока не используются и адрес на самом деле 48-битный.

Ну и сегменты там в нули все выставлены.
Аноним 17/09/18 Пнд 10:31:50  1265434
>>1265421
>Стоит ли размер массива держать в нулевом элементе?
так в паскале хранились строки. какие накладывает это ограничения, думою, сам понимаеш
в C11 появились безопасные версии функций которые сами прекращают работу при превышении числа элементов
можно ещо сделоть struct massiv {unsigned char rozmer; char bukvy} a; и обращатся через a.rozmer
а можно просто (unsigned char
)(&a) но компелятор может выровнять так что тебе придёться читать символы не с адреса (unsigned char)((&a)+1) а с адреса (unsigned char)((&a)+3)
Аноним 17/09/18 Пнд 10:36:38  1265439
Охуеть. Вообще-то я зашёл просто почитать, что творится нынче итт, а получил ответы на вопросы, которые меня уже две недели мучали.
Аноним 17/09/18 Пнд 10:37:08  1265440
>>1265434
struct massiv {unsigned char rozmer; char⁕ bukvy} a;
a.rozmer
(unsigned char⁕)(&a)
(unsigned char⁕)((&a)+1)
(unsigned char⁕)((&a)+3)
ну ты понел
Аноним 17/09/18 Пнд 10:46:32  1265444
Блядь, задачка из книги легкая по подсчету определенного символа, но у меня нихуя она нихуя не получается.

Какого хуя программа по всей видимости не выходит из цикла while? Внутри же цикла считает нормально.

#include <stdio.h>

main()
{
int c;
int t=0;

while((c=getchar())!=EOF)
if (c == '\t')
{++t;
printf("%1d \n", t);
}

printf("result: %d\n", t);
}
Аноним 17/09/18 Пнд 10:54:12  1265446
>>1265444
>while((c=getchar())!=EOF)
не делой так
ещё ты скобку забыл
Аноним 17/09/18 Пнд 11:04:03  1265450
>>1265446
Как именно не делать? В книге именно так и пишут, говорят так запись короче.

Надо так делать?
c=getchar();

while(c!=EOF
)

Нихуя тоже не работает.

Где это у меня скобки нет? Все на месте же.
Аноним 17/09/18 Пнд 11:09:58  1265453
>>1265444
EOF - это ctrl+d
или ctrl+z, если на форточках.
Аноним 17/09/18 Пнд 11:21:36  1265457
>>1265453
А в андроиде? Если жму текст и потом ctrl+d то ничего не происходит. Приходится вводить текст, жать энтр, потом уже ctrl+d и тогда только работает. Получается я символ eof ввожу отдельно. Выглядит это вот так:

ghjfdyygfeuhtr
1
2
3
4
result: 4
Аноним 17/09/18 Пнд 11:21:49  1265458
>>1265444

Ты, наверное, хочешь

!=0x1B //ESC
Аноним 17/09/18 Пнд 11:49:20  1265465
когда структуру можно оставить на автоматическую аллокацию а когда нужно динамически память выделять? аноны хелп
Аноним 17/09/18 Пнд 12:09:50  1265476
>>1265430
>первые 16 бит пока не используются
Потому что нахуй не нужно, так как и так помещаемся с головой?
Аноним 17/09/18 Пнд 12:10:06  1265477
>>1265430
>Ну и сегменты там в нули все выставлены.
Вообще конечно очень удобно стало.
Аноним 17/09/18 Пнд 12:10:24  1265478
>>1265465
Ситуативно.
Аноним 17/09/18 Пнд 12:38:27  1265485
>>1265465
есле ты просто обьявляеш структуру, то память сама аллоцируеться
ты выделяеш динамически тогда, когда у тебя укозатель
Аноним 17/09/18 Пнд 13:14:14  1265495
>>1265476
>Потому что нахуй не нужно, так как и так помещаемся с головой?

А потом, когда межгалактическая связь и квантово-многомерные штеуды попрут?
Аноним 17/09/18 Пнд 13:20:27  1265497
>>1265446
Так как не надо делать то?
Аноним 17/09/18 Пнд 13:40:42  1265508
unsigned int и unsigned это же одно и то же?
Я могу просто писать unsigned, как пишут в некоторых старых туториалах или есть какие-то подводные камни (окромя нубопонятности)?

И еще одно: обязательно ли в объявлении типа int foo(void){return 666;} писать этот войд в скобках? Знаю, что работает и без него, но как это всё делать с т. з. best practice и coding style, кароч чтобы прям комильфо. Вы как делаете?
Аноним 17/09/18 Пнд 14:07:34  1265520
>>1265508
если void внутри скобок не будет то формально функция принимает любое количество аргументов
Аноним 17/09/18 Пнд 14:50:53  1265530
>>1265508
Ищешь MISRA-C и изучаешь.
Аноним 17/09/18 Пнд 16:17:51  1265549
>>1265508
https://en.wikipedia.org/wiki/C_data_types#Basic_types
Если в одной строчке, то нет разницы, как видишь можно писать просто unsigned и просто signed.
Аноним 17/09/18 Пнд 16:28:43  1265554
>>1265417
Хуй знает, я с си копался один семестр в универе, потом около года с++, с первого же интервью попал в неплохую компанию джуном по разработке кернел драйвера, вот за несколько месяцев вроде втянулся уже.
20-лвл
Аноним 17/09/18 Пнд 16:30:33  1265556
>>1265421
Только указатели работают через пейджинг, и те адреса что ты видишь в дебагере это не адреса реальных ячеек памяти.
>>1265554-кун
Аноним 17/09/18 Пнд 16:33:11  1265557
>>1265476
В 32 битной системе вроде правые 12? бит это смещение по странице, а левый остаток это номер записи в таблице страниц.ну это не учитывая ещё что есть таблица таблиц страниц
Аноним 17/09/18 Пнд 16:36:14  1265560
>>1265508
В кернел-коде обязательно писать и void и unsigned int
Аноним 17/09/18 Пнд 19:04:57  1265649
>>1265327
Вроде нет, при неправильном вводе пароля система предупреждает.
Скорее всего сбой в загрузке был.
Аноним 17/09/18 Пнд 19:08:38  1265653
>>1265421
> Алсо есть вопрос... Стоит ли размер массива держать в нулевом элементе? Чтобы при работе с массивом исключать его нулевой элемент из обработки а в условии выхода из цикла ссылаться на этот нулевой элемент.

По ситуации.. функция Malloc не забивает массив нулями , а его аналог Calloc забивает.
Аноним 17/09/18 Пнд 19:21:16  1265662
>>1265653
Он говорит про содержание размера массива в самом массиве, а не про значения элементов внутри массива.
Аноним 17/09/18 Пнд 19:24:49  1265665
>>1265653
Что мешает зделоть структуру где будет и размер и массив?
Аноним 17/09/18 Пнд 19:27:03  1265667
15371153122640.jpg (66Кб, 630x623)
>>1265665
std::string
Аноним 17/09/18 Пнд 19:30:33  1265670
>>1265667
Это приплюснутое говно, зачем оно здесь?
Аноним 17/09/18 Пнд 19:58:29  1265686
>>1265421
> размер массива держать в нулевом элементе?
Зачем в нулевом, если можно в минус первом:
int ∗alloc_array(size_t length) {
int ∗x = malloc(length + 1); x[0] = (int) length; return x + 1;
}

int ∗array = alloc_array(20);
printf("Size of array: %d\n", array[-1]);
Аноним 17/09/18 Пнд 19:59:09  1265687
>>1265686
(length + 1) * sizeof(int), ну вы поняли.
Аноним 17/09/18 Пнд 20:02:14  1265689
>>1265686
это какой то пиздец, зачем так?
Аноним 17/09/18 Пнд 20:20:44  1265693
>>1265686
Что за пиздец.
Так писать не стоит, никогда.
Аноним 17/09/18 Пнд 20:29:11  1265696
>>1265689
>>1265693
Это же очень часто делается. Например, у тебя есть либа (сишный рантайм, ОС и т.п.), которая хочет читать и писать массив (или, еще чаще, сишную строку), а еще хочет ее хранить, возвращать или передавать обратно тебе в колбек. При этом ты хочешь иметь полноценный динамический массив, т.е., хранить used/allocated как минимум. И ты такой говоришь, окей мол, и хранишь эту информацию в отрицательном элементе (если инты или если char, но длина гарантированно влезает в байт) или чаще в структуре по отрицательному смещению. Т.е.:
typedef struct { size_t avail; size_t used; } strdesc;
static inline strdesc ∗str_get_descriptor(char ∗str) {
void ∗raw_ptr = str - sizeof(strdesc);
return ALIGN_DOWN(ptr, alignof(strdesc));
}
Делая это ты даже почти не нарушаешь сишный стандарт, и нет практически никаких подводных камней (кроме варианта, когда ты попытаешься прочитать дескриптор обычной строки, у которой этого дескриптора никогда не было).
Аноним 17/09/18 Пнд 20:32:54  1265701
>>1265696
Попробуй такой код в ядро заапстримить.не знаю, где ты найдёшь этому место, но постарайся
Аноним 17/09/18 Пнд 20:37:41  1265705
>>1265701
Ты так говоришь, как будто ядро = ядро линукс, а у других ОС и приложений ядер нет.

Практически уверен, что в линуксе такое встречается в десятках вариантов, просто оно там по обыкновению обмазано макросами, поэтому ты и не замечаешь. Нет, искать и доказывать не буду. Тебе нужно - ты и ищи.
Аноним 17/09/18 Пнд 20:41:02  1265708
>>1265705
Я говорю ядро, потому что первое, что приходит в голову при разговоре о си это ядро линукса.
Ну и там есть годный кодстаил.
Аноним 17/09/18 Пнд 20:48:43  1265717
>>1265696
не вижу никаких преимуществ, если ты передаешь массив в либу, ты знаешь его размер и можешь хранить нормально, в структуре например, вместе с массивом
Аноним 18/09/18 Втр 05:01:45  1265904
>>1265667
крестоносец-долбаёб. УХАДИ. На плюсах пишут дауны. Это не я скозал. Это Deus Vult.
Аноним 18/09/18 Втр 08:43:52  1265933
>>1265904
Так пишут только люди, которые не занимались ничем профессионально.
алсо я работаю на си, т.к. пишу драйвер под линупс
Аноним 18/09/18 Втр 09:34:46  1265938
>>1253747 (OP)
У меня число decimal 1234567891011121314
в hexadecimal даёт 112210F4B2D230A2
В файл записывается оно не так:
11 22 10 F4 B2 D2 30 A2
а вот так:
A2 30 D2 B2 F4 10 22 11 (A230D2B2F4102211)

Задача - прочитать его из файла как 1234567891011121314 (64 bit)
или хотя-бы как (unsigned long long) 0x112210f4b2d230a2

Как правильно это сделать?
Аноним 18/09/18 Втр 09:47:02  1265943
>>1265938
Это стандартный little endian. Читаешь сканфом с с флагом %I64u
Аноним 18/09/18 Втр 10:34:03  1265954
>>1265943
Так и не понял где этот флаг ставить -
и решил с помощью fread, вот так:
http://rextester.com/UECYH23057
Аноним 18/09/18 Втр 11:43:55  1265984
Конничива. Есть три варианта. (^ в роли звездочки)

Вариант 1.

int x;
int^ xptr;

x = 10;
xptr = &x;


Вариант 2.

int x = 10;
int^ xptr = &x;

Вариант 3.

int x = 10, ^xptr = &x;


Вопрос: как правильно, учитывая, что между строчками в 1 и 2 ничего дополнительно не происходит (а даже если и происходит?)?
Аноним 18/09/18 Втр 12:16:32  1265991
>>1265984
1 не нужно почти никогда, даже скорее никогда.
2 удобнее всего.
3 имеет риск быть неудачно прочитанным глазами, да и экономить строчки смысла нет.
Аноним 18/09/18 Втр 12:20:34  1265994
>>1265984
правельно никогда не ставить звёздочку после типа, а перед именим переменной
>(а даже если и происходит?)
а есле во втором между строчками что-то происходит, то у тебя в c90 это не заработаит
Аноним 18/09/18 Втр 12:22:01  1265996
>>1265994
>никогда не ставить звёздочку после типа, а перед именим переменной
Я тоже нахожу это логичным и пишу так, но никакого "правильно" в этом нет.
Аноним 18/09/18 Втр 12:22:58  1265997
>>1265994
>то у тебя в c90 это не заработаит
Это та параша, где нельзя переменную объявить в шапке for()? Нинужная версия.
Аноним 18/09/18 Втр 12:31:38  1266001
>>1265996
ну сматри какое дело
вот ты объявляеш
int a, b;
и b у тебя не int
, как можна было бы думать, а int
так что не надо
Аноним 18/09/18 Втр 12:32:32  1266002
>>1265996
ну сматри какое дело
вот ты объявляеш
int^ a, b;
и b у тебя не int^, как можна было бы думать, а int
так что не надо
Аноним 18/09/18 Втр 12:37:26  1266005
>>1266002
Я прекрасно знаю плюсы и минусы всех трёх подходов.
Аноним 18/09/18 Втр 12:40:46  1266006
>>1265158
Ну так шо, посоны?
Как '\\t' в '\t' унескапнтуть?
Аноним 18/09/18 Втр 12:50:52  1266009
>>1266006
Иди нахуй.
Аноним 18/09/18 Втр 14:41:53  1266076
>>1266009
Но там занято, там ты. А ты там не подскажешь как унескапнуть?
Аноним 18/09/18 Втр 15:05:48  1266092
Почаны. Накидайте гайдов по GTK. Это же вроде как графика на си, да? Или как?
Аноним 18/09/18 Втр 15:41:00  1266096
>>1266092
Мне кажется под си, чего-то свежего, кроме офф документации особо не найдешь.
https://developer.gnome.org/gtk3/stable/ch01s03.html
Могу только сказать, используй Glade и билдером подключай, так проще будет. Хотя в глейде могут отсутствовать какие-то свойства виджетов и приходится их руками дописывать.
Аноним 18/09/18 Втр 16:19:56  1266114
>>1265991
> 1 не нужно почти никогда, даже скорее
никогда.
if (...) { x = 10; xptr = &x; } else { z = func(); xptr = &z; }
Аноним 18/09/18 Втр 16:24:08  1266120
>>1266114
Да, чот тупанул.
Аноним 19/09/18 Срд 03:48:21  1266415
>>1253747 (OP)
>Очевидный GCC.
Не забываем ставить флаги оптимизации при компиляции. Как например, флаг -O3, ускряющий софтину.
Подробнее про O3 - тут: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Аноним 19/09/18 Срд 04:32:13  1266417
Да
Да 111222333 19/09/18 Срд 04:32:33  1266418
Да
Аноним 19/09/18 Срд 08:00:54  1266437
Значит, программисту не надо ебаться с байтами, компилятор все сделает за него?
Аноним 19/09/18 Срд 08:02:18  1266438
>>1266437
С байтами можно, вот с машинными кодами точно не надо.
Аноним 19/09/18 Срд 11:02:48  1266491
>>1266114
Меня этот пример сбил с толку. Что это означает?

Вопрос был чисто об идеологии - объявлять и инициализировать сразу или отдельными утверждениями (1 vs. 2) и можно ли в одну строку все запихать (3). Я понял, что объявлять одним выражением тип и указатель на него это совсем некомильфо. А вот с 1 и 2 как быть?

>>1266005
А можешь тогда назвать ситуации, где реально нужны и лучше работают подходы 1 и 3:
int x;
int ^xptr;
x = 10;
xptr = &x;

или

int x = 10, ^xptr = &x;

Всё это время речь идет только об одной переменной и одном указателе. То есть, идее как вообще принято делать и как надо учить делать.

У меня старенький препод требует, чтобы строго как в первом было. Отдельно в самом начале функции все переменные объявили (каждую в свой строке с ; в конце). Потом строчку отступили и дальше инициализируем по мере надобности. Я не понимаю, чем продиктовано такое ограничение. Подозреваю, что из каких-то древних эпох. Но за варианты типа
int x = 10;
int ^xptr = &x;
нещадно бьет по рукам и говорит нельзя, не буду мол, даже и объяснять ничего.
Что с ним не так?
Аноним 19/09/18 Срд 12:05:04  1266526
>>1266415
У меня, почему-то, cmake с релизным флагом собирает более производительное приложение, чем я ручками с -О3. Видимо, в -О3 не всё включено.
Аноним 19/09/18 Срд 12:07:32  1266528
>>1266491
>А можешь тогда назвать ситуации, где реально нужны и лучше работают подходы 1 и 3:
Там речь не об этом, а о том, где звёздочку ставить.

int x;
int ^xptr;
x = 10;
xptr = &x;

В данном случае нет смысла писать на четырёх строчках то, что и на двух читается прекрасно.

int x = 10, ^xptr = &x;
А так не очень хорошо читается, на двух строчках лучше, чем на одной.
Аноним 19/09/18 Срд 13:22:11  1266547
>>1266438
А пробелы и табы можно сколько угодно хуячить? Компилятор же их игнорирует полностью?
Аноним 19/09/18 Срд 14:50:12  1266569
>>1266547
Пробелы для отступа - да.
А в выражениях а---с пробелы надо.
Аноним 19/09/18 Срд 18:35:38  1266735
>>1266415
gcc -Wall -Wextra -Werror filename*
norm
Аноним 19/09/18 Срд 19:40:50  1266770
>>1266491
> объявлять и инициализировать сразу
Не всегда возможно, о том и был пример с if.

> У меня старенький препод требует
Считай это локальным кодстайлом и делай, как просит. А для себя делай так, как считаешь правильным.

> Подозреваю, что из каких-то древних эпох.
Ну в древних эпохах не было C99, нельзя было декларации с кодом мешать, это да. А вот проблем с инициализацией не припомню. Возможно, баги в каких-то компиляторах. В любом случае, препод не прав, но кодстайл важнее чьей-то правоты.

>>1266528
> В данном случае нет смысла писать на четырёх строчках
В данном - нет. Если есть возможность инициализировать при определении переменной - нужно инициализировать.

>>1266735
> -Werror
И куча отключенных, хороших предупреждений, которые могли бы сэкономить тебе время. Или куча анального ублажения компилятора и нечитаемого кода из-за этого. Попробуй с clang -Weverything -Werror собрать что-нибудь более-менее крупное, лол.
Аноним 19/09/18 Срд 19:47:17  1266773
>>1266491
Почитай код ядра линукса, посмотри как там выглядит блок инициализации, тебе не нужно думать, что там происходит, просто посмотри как выглядит объявление.
ядро це канон
Реверс кристмасс три ордер декларейшен навсегда в моём сердце
Аноним 19/09/18 Срд 19:56:40  1266783
>>1266773
>ядро це канон
Какон говнокодинга и непродуманной архитектуры. Еще гит вспомни, хрюн.
Аноним 19/09/18 Срд 19:57:26  1266784
>>1266773
> тебе не нужно думать
Вся суть. А между тем там протухший C89 с расширениями и куча абсолютно ебнутых решений вроде явного использования struct вместо typedef.
Аноним 20/09/18 Чтв 07:37:47  1266947
>>1266783
А с гитом-то что? Он же работает вроде, или нет?
Аноним 20/09/18 Чтв 10:09:35  1266986
>>1266783
Гит - стандарт контроля исходных кодов, какие проблемы?
Аноним 20/09/18 Чтв 13:12:17  1267065
Бля, я вот понять не могу, почему когда я через scanf ввожу в int переменную число, ей передается какое-то ебанутое значение -858993460, хотя вроде везде говорят, что там должен быть 0? Другой момент: почему при реализации этого куска кода (https://pastebin.com/rJxchrEQ) scanf просто игнорируется и программа зацикливается?
Аноним 20/09/18 Чтв 13:19:45  1267070
>>1267065
>(https://pastebin.com/rJxchrEQ) когда я ввожу букву, scanf просто игнорируется и программа зацикливается?
Аноним 20/09/18 Чтв 17:11:50  1267215
>>1266986
>стандарт контроля исходных кодов
только среди смузихлебов с подворотами
Аноним 20/09/18 Чтв 19:30:55  1267284
>>1267065
УМВР.
Ты уверен, что у тебя функция scanf_s существует, а не просто возвращает мусор по счастливой случайности?
Аноним 20/09/18 Чтв 19:40:45  1267290
>>1267065
> -858993460
0xcccccccc, т.е., неинициализированная область стека. Т.е., твоя функция НЕ работает и возвращает тебе 0, а ты ее результат не проверяешь.

>>1267215
Хранишь код в CVS?
Алсо, не используй _s функции. Это дерьмо от Microsoft, и место ему на помойке. Скажи
#define __STDC_WANT_LIB_EXT1__ 0 и/или #define _CRT_SECURE_NO_WARNINGS перед всеми инклудами, чтобы тебе перестали ее продавать.
Аноним 20/09/18 Чтв 19:44:39  1267293
>>1267290
>Хранишь код в CVS?
Что в этом плохого?
Аноним 20/09/18 Чтв 19:46:09  1267294
>>1267290
>Алсо, не используй _s функции. Это дерьмо от Microsoft, и место ему на помойке.
Разве они не определены в C11?
И почему их лучше не использовать?
Аноним 20/09/18 Чтв 20:04:37  1267299
>>1267294
> Разве они не определены в C11?
Оно optional. И весь Annex K признали ошибкой и вроде даже обещали задепрекейтить в C18/20, или когда он там выйдет: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm

> И почему их лучше не использовать?
Вкратце: никому нахуй не вперлось, неудобно, избыточно и ненадежно. Если тебя в каком-то конкретном случае волнует, обрезало ли тебе строку при snprintf - возьми и проверь возвращаемое значение.
Аноним 20/09/18 Чтв 20:12:27  1267304
>>1267299
Я так понял, с этими функциями всё равно вывалишься в сегфолт, только дольше?
Аноним 20/09/18 Чтв 20:16:25  1267309
>>1267304
Нет, ты можешь зарегать функцию, которая скажет юзеру "до свидания" или можешь попросить ничего не вызывать, потому что ты будешь проверять код ошибки. Фактическое отличие от обычных функций в том, что ты дополнительно передаешь еще больше размеров (обычно ненужных) и в том, что они считают, что если что-то куда-то не влезло и обрезалось - то это ошибка, в то время как обычные функции пихают сколько влезло.
Аноним 20/09/18 Чтв 21:36:00  1267348
>>1254645
>лексированием
вот блин, это так нужно называть похоже, если ты пишешь хрень которая разбивает текст на части - лексемы, токены? а я это регекспом называл, но у меня нет никакой замены, никакой манипуляции над текстом.
Аноним 20/09/18 Чтв 21:47:04  1267358
> Lexing can be divided into two stages: the scanning, which segments the input string into syntactic units called lexemes and categorizes these into token classes; and the evaluating, which converts lexemes into processed values.

что-то я совсем запутался. значит есть лексирование-токинизирование - разбивка текста на какой-то минимальный смысл, с высоты которого которые позже будет анализировать парсер. но в принципе, если я не конвертирую сегменты текста, то это просто сканер? - как часть лексера.
Аноним 20/09/18 Чтв 21:50:26  1267360
но конечно, сканер это уже слишком общее, размытое название. получается пишем лексер, предполагаем сканер. какая же проблема, всё нужно как-то и чем-то называть.
Аноним 21/09/18 Птн 11:02:57  1267569
image.png (9Кб, 1033x142)
>>1253747 (OP)
Как же бесят эти предупреждения. Пишу русскими буквами в printf(), на консоль всё выводится нормально, но компилятор всё равно меня предупрпеждает. Почему? Я что, не имею права на русском писать? Можно это как-нибудь отключить? Ещё хочу предупреждение о пропущеном типе функции отключить, я-то знаю, что по-умолчанию там int и поэтому не пишу, но он меня опять-таки предупреждает постоянно. Компилятор LLVM, кстати.
Аноним 21/09/18 Птн 11:11:52  1267576
>>1267569
Там нормальным английским языком написано, проблемы с кодировкой.
Если у тебя русский в Юникоде, тогда ищи, как работать с Юникодом в Си.
Аноним 21/09/18 Птн 11:23:49  1267580
>>1267569
Ну там же написано, -Winvalid-source-encoding убери из опций конпелятора.
Аноним 21/09/18 Птн 11:28:08  1267584
image.png (2Кб, 744x59)
>>1267576
>Unicode
>LLVM
хех.
Аноним 21/09/18 Птн 11:28:35  1267585
>>1267580
Я понял, но я не знаю как это сделать.
Аноним 21/09/18 Птн 11:33:01  1267588
>>1267584
> utf-16
почему не 8?
Аноним 21/09/18 Птн 11:36:20  1267589
image.png (6Кб, 635x199)
>>1267588
Потому что с UTF-8 он выдаёт вот это.
Аноним 21/09/18 Птн 11:39:09  1267591
>>1267589
бедные виндаводы, сколько слёз утекло, а сколько ещё наплачется.
Аноним 21/09/18 Птн 11:44:43  1267594
>>1267591
Gcc таких предупреждений не выводит, так что венда тут не причём.
Аноним 21/09/18 Птн 13:29:32  1267674
Поясните этот пример из книжки:

while ((c = getcharO) != EOF)
if (c >= '0' && c <= '9' )
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;

Что значит выражение ++ndigit[c-'0']? Зачем от с отнимать ноль? Разве если мы хотим в массив записать число 5 пятым в массиве - надо делать [с - 1], т.к. массив начинается с нуля, нет?
Аноним 21/09/18 Птн 13:36:08  1267681
>>1267674
Чего я подумал, так ведь даже -1 не надо делать, если считать тоже от нуля. Тогда какой вообще смысл в с-'0'?
Аноним 21/09/18 Птн 13:51:08  1267697
>>1267674
Отнимают код символа 0 чтобы перевести символ в число.
Аноним 21/09/18 Птн 13:53:24  1267698
>>1267674
Короче в твоем примере подсчитывается количество встреченных символов разных цифр (в массиве ndigit[10]) и пробелов/табуляций (в nwhite).
Аноним 21/09/18 Птн 14:45:04  1267737
>>1266528
>>1266770

Спасибо. Я так примерно и догадывался. Выходит, до C99 строго необходимо как в пасцале сначала всё объявлять, а уже только потом работать?

Кстати, если локальный кодинг-стайл запрещает делать пустые строки, это чему-то хорошему учит? Я просто привык логически отделять, а портянка на 20+ строк кажется даже эстетически… что ли неприятной. Как вы ставите пустые строки?
Аноним 21/09/18 Птн 14:53:44  1267744
>>1267737
Ты можешь делать пустые строки, но они должны быть буквально пустыми, без пробелов/табов на этой строке.
Аноним 21/09/18 Птн 14:54:29  1267745
>>1267744
Но если твой препод требует по-другому - делай по-другому.
Аноним 21/09/18 Птн 14:54:43  1267746
Интересная статья
https://habr.com/post/304034/
Аноним 21/09/18 Птн 14:55:35  1267747
https://www.tiobe.com/tiobe-index/
Аноним 21/09/18 Птн 14:57:20  1267748
Так же очень мотивирующая статья.
https://habr.com/company/nixsolutions/blog/265427/
Аноним 21/09/18 Птн 15:12:02  1267750
Скажите, а где в памяти хранятся аргументы, с которыми мы вызвали программу? ну, например ./a.out "Oh long John" "Oh don Piano"
Где эти строки будут записаны? В стеке/на куче? В сегменте данных? Кто автоматически ставит в них \0 в конце, чтобы можно было с ними работать как со строками через argv?
Аноним 21/09/18 Птн 15:15:17  1267751
>>1267746
>https://habr.com/post/304034/
Ты автор? Статья может и интересная, но не существует настолько интересной темы, чтобы ради нее продираться через настолько деревянный текст. Еще раз промптом с китайского и обратно переведи.
Аноним 21/09/18 Птн 15:18:40  1267754
>>1267751
Нет, автор не я. Кстати я тоже заметил, что с текстом что-то не так,лол.
Правда я почему то подумал, что это я недостаточно хорошо знаю русский, для того что бы понимать сложные научные текста. Я и не подумал, что кто-то это переводил.
Аноним 21/09/18 Птн 16:00:10  1267772
>>1267744
А на что это влияет? Кроме того чтобы мне вдруг захотелось спрятать исходник на Whitespace внутри исходника на C?
Аноним 21/09/18 Птн 18:24:20  1267871
>>1267754
>Я и не подумал, что кто-то это переводил.
>habr
Что ты ожидал на этой помойке? Почитай еще хвалебные комментарии местных говноедов
Аноним 21/09/18 Птн 18:33:31  1267880
>>1267697
А зачем это делать? Разве во всех кодировках '5' не равно "5"?
Аноним 21/09/18 Птн 19:09:20  1267893
>>1267750
>Кто автоматически ставит в них \0 в конце
система.
вероятно, если бы это было не так, это делалось бы в коде до main - забыл название.

>>1267750
>Где эти строки будут записаны?
какая разница, например, не обязательно что вообще, стек будет существовать. просто это данные в которые можно писать.
Аноним 21/09/18 Птн 19:47:03  1267908
>>1267880
Гугли "не явное преоброзование"
Это преобразование из char в int
а если +'0' то наоборот
Аноним 21/09/18 Птн 20:46:10  1267935
>>1267772
Кроме читаемости ни на что.
если ты про пробелы/табы в пустой строке это просто требование для кола в ядре, модель пропустить свои исходники через checkpatch.pl и посмотреть, что он тебе выдаст, но там много требований именно к внешнему виду, что будет противоречить, скорее всего, требованиям твоего препода :^)
Аноним 21/09/18 Птн 20:51:46  1267938
>>1267569
> Я что, не имею права на русском писать?
Имеешь, но делаешь это неправильно. Выставь -finput-charset=UTF-8 (хотя оно и так по умолчанию, поэтому оно и ругается на исходник в 1251) и -fexec-charset=cp1251 (или cp866, или что тебе там нужно), и не забудь пересохранить исходник в UTF-8. Можешь еще попробовать -finput=charset=cp1251 (или cp866), но у шланга вроде с этим какие-то проблемы были, да и хранить код в чем-то кроме UTF-8 - это плохой тон.

> я-то знаю, что по-умолчанию там int
Начиная с C99 уже нет. Добро пожаловать в будущее и хватит писать говнокод.
Аноним 21/09/18 Птн 20:56:49  1267941
>>1267569
>я-то знаю
Все, что делается неявно лучше делать явно, это как минимум защита от возможных изменений в компиляторах.представь что твой говнокод в попенсорсе, ты же и представить не модель на чем его попробуют собрать
А уж неявный инт это мало того, что помогает избавиться от лишнего времени поиска бага, если вдруг что-то подменяют, но ещё и увеличивает читаемость кода.
Аноним 21/09/18 Птн 21:04:55  1267949
>>1267941
> ты же и представить не модель на чем его попробуют собрать
Вот тут ты не прав. Либо компилятор соответствует стандарту, либо это компилятор си-подобного языка, с которым не нужно поддерживать совместимость.
Аноним 21/09/18 Птн 21:19:57  1267957
>>1267949
Тебе уже сверху ответили про C99, я имел в виду, что версия компилятора относится к конкретному стандарту
Аноним 22/09/18 Суб 00:21:42  1268052
>>1267957
>>1267941
>Все, что делается неявно лучше делать явно, это как минимум защита от возможных изменений в компиляторах.

делая что-то в с99 или с11, это что-то в следующих стандартах может оказаться неявным - никогда не знаешь.

пусть пишет на каком хочет стандарте. а то каждая недозревшая, и дозревшая, сперма, советует что делать - программистская культура.
Аноним 22/09/18 Суб 00:27:59  1268054
хотя конечно, оно понятно, не обижайтесь. но в конце концов, неявный тип инта - ну что такого, все типы преобразовываются к нему при арифметике, и ничего, живём.
Аноним 22/09/18 Суб 00:30:16  1268056
в смысле все меньшие. но ты же не всегда знаешь какой будет меньше, оперируя полями структур.
Аноним 22/09/18 Суб 02:02:20  1268075
>>1268056
> но ты же не всегда знаешь какой будет меньше, оперируя полями структур
Ты пишешь на языке, где тебе дали контроль вместо безопасности. Если ты чего-то не знаешь - ты идешь и смотришь объявление.
Аноним 22/09/18 Суб 02:06:52  1268078
Screen Shot 201[...].png (203Кб, 1067x565)
>>1253747 (OP)
Почему работает __uint128_t и __int128_t на 64-бит компе? Это какая-то эмуляция?
Аноним 22/09/18 Суб 02:31:38  1268092
>>1268078
uint128_t может быть реализован как пара 64-битных регистров, сложение/вычитание через adc/sbb, 128-битное делимое x86-64 и так умеет, умножение и делитель - отдельной функцией. Алсо, ты кастишь к long double, который вполне может быть 80-битным. Алсо, все это может работать хоть на 8-битном компе, если разработчики компилятора запилят поддержку.
Аноним 22/09/18 Суб 13:01:12  1268241
>>1267938
А что такое говнокод?Какая разница как он пишет, если код работает нормально?
Аноним 22/09/18 Суб 13:11:05  1268244
>>1268078
При вылезании за границы проблемы вызывает не реализация умножения, а его атомарность.
Аноним 22/09/18 Суб 13:13:43  1268245
Чмаффики всем в этом чяте.
Я тут осваиваюсь с libevent и что-то написал типа сервера.
Теперь прошу у вас подсказку: как можно спровоцировать разные ошибки? Хочу проверить, как у меня идет их перехват, да только пока недостает знаний что это за ситуации и чем их можно вызвать искусственно:
case _EVENT_LOG_DEBUG: s = "debug"; break;
case _EVENT_LOG_MSG: s = "msg"; break;
case _EVENT_LOG_WARN: s = "warn"; break;
case _EVENT_LOG_ERR: s = "error"; break;

Что мне делать, чтобы появились эти заветные ошибки?
(И как они вообще появляются? Я привык к такому языку, где в исключительной ситуации кидаются исключения и их ловят трайкечем, а тут какой-то калбек (казах что-ли) и как мне его, самому надо вызывать, проверяя результат системного вызова или как?)
Аноним 22/09/18 Суб 14:54:38  1268282
>>1268241
Ну типо важны стандарты написания, для переносимости кода.. к тому же ты сам возможно захочешь поправить или апдейтнуть код в будущем и ахуеешь его читать.
Аноним 23/09/18 Вск 00:37:54  1268534
>>1265158
>Шо нема разве функций по эскапу унескапу чарактеров?
>>1261992
>Ну и как эту ASCII унескапнуть попроще?
>>1265378
>всё это дело - не унескапает,
>и надо как-то циклом парсить...
>>1266006
>Как '\\t' в '\t' унескапнтуть?

>>1253747 (OP)
Антуаны, вот так унескапаются стринги: http://rextester.com/JAQV34599
Два дня проебал в эту хуятину - , пользуйтесь на здоровье.
Аноним 23/09/18 Вск 09:03:55  1268613
>>1268534
> Антуаны, вот так унескапаются стринги
Как же ты заебал. И нет, так делать не надо, ты двигаешь всю строку на каждый чих. Надо примерно так: http://rextester.com/HGY79496 (парсинг \x я говнокодил уже, по-хорошему надо вообще лукап сделать). \u сам осилишь, принцип там тот же, но там уже лучше задуматься о strtoul.
Аноним 23/09/18 Вск 13:17:11  1268801
image.png (10Кб, 259x134)
Посоны, что за хуйня? Запускаю пикрл, в итоге цикл выполняется выводится 1234567, но дальше он зацикливается и нижняя строка не выводится, проц нагружен на 100%.
Выше мейна у меня есть две функции с говнокодом, но я их вызываю после того, что я написал в пикрл. В голом файле этот код нормально выполняется.
При этом с gdb при нажатии n все работает.
Аноним 23/09/18 Вск 13:20:43  1268804
>>1268801
Не имеет отношения к сабжу, но main должен возвращать int, чтобы ось поняла, что все ок.
Аноним 23/09/18 Вск 13:26:47  1268811
>>1268804
Лол, как раз таки имеет. Сделал int и ретурн 0 после 56й строки - все заработало. Спасибо за совет.
Кто-то может обьяснить почему?
Аноним 23/09/18 Вск 13:35:14  1268827
>>1268811
Странно, ну ладно, если в кратце, то твой процесс не завершался, т.к. операционная система не получала от него сигнал, что он выполнился.
но почему у тебя принтф не работал после цикла непонятно, на самом деле
Аноним 23/09/18 Вск 13:38:02  1268832
>>1268827
Но это, вероятно, проделки оптимизации компилятора.
Аноним 23/09/18 Вск 13:38:33  1268833
image.png (38Кб, 348x382)
image.png (38Кб, 296x371)
Если поставить ретурн до сорта - все до ретурна выводится в консоль. А если после - то нихуя, кроме 01234567. Что за магия? Это как-то связано с тонкостями gcc?
sort это моя функция, вохможно там костыли. Но какое это имеет значение, если не выводится то, что до сорта?
Аноним 23/09/18 Вск 13:41:34  1268840
>>1268833
> нихуя, кроме 01234567
Нихуя, кроме первой линии рандомных чисел которые выводятся на 57й строке
фикс
Аноним 23/09/18 Вск 13:45:33  1268846
>>1268827
>но почему у тебя принтф не работал после цикла непонятно, на самом деле
Потому что не было fflush();
Аноним 23/09/18 Вск 15:40:21  1268954
>>1253747 (OP)
как подключить sdl к mingw64 на виндовс?
Аноним 23/09/18 Вск 15:52:36  1268959
>>1268954
Ставь линукс.
Аноним 23/09/18 Вск 16:02:14  1268964
>>1268959
Не хочу ёлку в попу.
Аноним 23/09/18 Вск 16:04:24  1268967
>>1268964
Тогда будешь страдать.
Аноним 23/09/18 Вск 16:28:24  1268980
>>1268833
Это что за такой красивый IDE?
Аноним 23/09/18 Вск 16:41:52  1268986
>>1268980
вим
Аноним 23/09/18 Вск 17:11:56  1268995
>>1268986
Не, ну нахуй этот пердольский инструмент, из которого даже по человечески выйти нельзя
Аноним 23/09/18 Вск 17:30:03  1268999
У нас есть strcpy и memcpy.
Если я использую memcpy N байт из строки меньшей N байт, словлю в лучшем случае сегфолт или почитаю говна.
Если я использую strcpy на строке, а строка вдруг больше выделенных N байт, то в лучшем случае словлю сегфолт.
И что использовать тогда?
Аноним 23/09/18 Вск 18:05:30  1269024
>>1268999
strncpy
Аноним 23/09/18 Вск 18:09:04  1269027
.jpg (195Кб, 2732x2048)
>>1269024
Бля, щас бы велосипедил. Сотни нефти!
Аноним 23/09/18 Вск 18:44:50  1269049
>>1260052
Что за юморески?
Аноним 23/09/18 Вск 19:15:43  1269063
>>1269024
>>1269027
1) Часто забывают, что strncpy в Си сломана, для ее использования нужны дополнительные танцы с бубном. Пример: https://ideone.com/FMwQlp
2) Она не только сломана, но еще и неэффективна, потому что забивает остаток целевой строки нулями. Т.е., если делать char dest[4096];strncpy(dest, "x", 4096), оно не только положит два байта строки в dest, но еще и будет долго и бессмысленно втыкать туда 4094 нуля. Это, конечно, быстрее, чем strlen + memcpy, но все равно не ок.

Вообще, белые люди придумали strlcpy, но ее нет в стандарте. Алсо, можно использовать snprintf(dest, sizeof(dest), "%s", x) - на сколько-нибудь больших массивах (не из пары символов) это внезапно будет быстрее, чем strncpy. И надежнее.
Аноним 23/09/18 Вск 21:11:29  1269148
>>1268995
Ты не припух гнать на лучший блокнот всех времен и народов?
Где еще ты сможешь сделать документ как n секунд/минут назад?
Аноним 23/09/18 Вск 22:15:37  1269178
https://pastebin.com/rueVCwsQ
Я уже не знаю, что делать со строкой:
strcpy(((char∗)(∗(fourfold)+j∗COLS)), token);
Я представляю это так: у нас есть массив, состоящий из указателей. В каждый элемент массива мы сохраняем указатель, указывающий на массив строк, а т.к. у нас строк нет и есть массив символов, то мы заставляем выделять указатель на COLS∗MAXLINE символов, который и отправляется храниться в массив указателей.
Как надо писать, чтобы работало?
Аноним 23/09/18 Вск 22:19:57  1269180
>>1269178
Боже, блядь, мой, зачем тебе это?
Аноним 23/09/18 Вск 22:22:55  1269185
>>1268833
Ой а можно твой vimrc? А то у меня какой-то крипотный синтакс
Аноним 23/09/18 Вск 22:24:47  1269187
>>1269180
CSV читать
Аноним 23/09/18 Вск 22:30:57  1269192
>>1269178
Яб тоже не отказался такие строки уметь читать
Аноним 23/09/18 Вск 23:18:41  1269220
>>1269185
Аноним 24/09/18 Пнд 00:19:34  1269255
>>1269178
> https://pastebin.com/rueVCwsQ
Если у тебя COLS и MAXLINE известны на стадии компиляции, зачем такие сложности? Сделай нормальный массив с известными последними измерениями char (*rows)[NUM_COLS][NUM_COL_CHARS], и вычисления адреса сильно упростятся. Ну или массив строк и массив массивов из NUM_COLS указателей на токены. Алсо, у тебя условие неправильное в цикле считывания столбцов - там && должно быть.
Аноним 24/09/18 Пнд 01:15:00  1269276
.jpg (478Кб, 800x470)
>>1269255
Как оказалось, я пересыпал звёздочек, всего-то три надо. И не надо быть умнее компилятора, выделяя двухзвёздному указателю место на х∗у байт, надо сначала выделять указатель на х байт, а потом внутри этого указателя на у байт.
Ну и вообще да,
>char (*rows)[NUM_COLS][NUM_COL_CHARS]
куда проще. Я даже и не вспомню, зачем я захотел динамически задавать память вместо простого как доска решения.
Аноним 24/09/18 Пнд 01:18:54  1269277
>>1269220
?
Аноним 24/09/18 Пнд 01:53:40  1269284
>>1268613
>Как же ты заебал.
Я тебя ещё голым не видел.

>И нет, так делать не надо, ты двигаешь всю строку на каждый чих. Надо примерно так: http://rextester.com/HGY79496
Вот это - сразу понятно стало. Я вижу ты используешь dest, чтоб писать символы туда. Годный совет.

>по-хорошему надо вообще лукап сделать
какой look up? Не пойму...

>\u сам осилишь
Ты имеешь в виду код юникод-символа?
>там уже лучше задуматься о strtoul
А как потом прицепить его к \u?
У меня хуйня какая-то получается тут: http://rextester.com/WPPNV63707
Оно просит hex - сразу после \u и не принимает %d.
Надо просто два слеша заменить на один, если стринга ескапед.
Можно конечно проверить являются ли следующие 4 символа hex-кодом,
но цеплять их можно и вместе с u. Что-то типа конкатенации.
Но один слеш так просто не прицепишь... Их надо два.

Поэтому, смотри что я принёс:
#include <stdio.h>
void printCard(int card) {printf("\xF0\x9F\x82%c\n", 0xA1 + card % 13);}
int main(void){for (int i = 0; i<10; i++){printCard(i);}}
Этот пример - выводит 1 символ из нескольких \x байт.
Как его сюда пришпандорить к \u - хуй знает.
Аноним 24/09/18 Пнд 04:15:36  1269309
>>1269284
Короче, сам вижу, что \u можно просто через слеш указать
в строке вида: char x[] = "xx\\\\xxx\\ty\\r\\n\\\'\\\?\\\"hello\\x22\\x7e\u1ed8";
и оно пойдёт в символ, и останется ним. И не нужно писать никакой отдельный сase для 'u'.
Если же перед '\u' стоит ещё один слеш '\\u', то ебануться можно.
Аноним 24/09/18 Пнд 04:31:37  1269310
>>1269284
> какой look up? Не пойму...
Массивчик, который символу, который возможно является шестандцатеричной цифрой сопоставляет значение 0..15 или -1, если символ такой цифрой не является. Таким образом исчезнет необходимость во всех toupper и isxdigit, которые сами в такие массивчики ползают. Только они еще и от локали зависят, поэтому ползают медленно.

> А как потом прицепить его к \u?
Читаешь 4 (если \u) или 8 (если \U) символов (не забывая о том, что на каждом шагу тебя может подстерегать конец строки), делаешь strtoul(..., ..., 16), проверяешь, что endptr - ptr == 4 (или 8), т.е., это были валидные hex-цифры, которые сконвертировалось целиком, а вот что делать дальше - зависит от задачи. Можно сделать sprintf("%lc"), можно самому кодировать в валидную последовательность UTF-8. А если у юзера текст не в UTF-8, тогда сосать.

Алсо, я сейчас посмотрел на свой код - он тоже говно, там по-хорошему нужно выкинуть все потуги обработки всяческих "\ХУЙ и \x" и встретив любую невалидную последовательнось честно возвращать false, не пытаясь продолжать.

>>1269309
> И не нужно писать никакой отдельный сase для 'u'.
Это компилятор за тебя "\uXXXX" в строках и символах обрабатывает. А ты хочешь сам обрабатывать, поэтому речь идет как раз о "\\uXXXX".
Аноним 24/09/18 Пнд 08:42:58  1269340
>>1269310
>Массивчик, который сопоставляет значение 0..15 или -1, если символ такой цифрой не является.
Аа, так ты имел в виду lookup table, как вон тот твой
static const char xvalue[]. Вот теперь ясно...

Пытался я сделать этот твой массивчик, и додуплил аж потом, что он же не возвращает нихуя за диапазонами.
Вот он - тут, закомментированный: http://rextester.com/QNH73934
В итоге, решил switch использовать, и циклом по строке протоптаться,
прописал оффсеты в свич и засунул это дело - в отдельную функцию.

>Читаешь 4 (если \u) или 8 (если \U) символов (не забывая о том,
>что на каждом шагу тебя может подстерегать конец строки),
>делаешь strtoul(..., ..., 16), проверяешь, что endptr - ptr == 4 (или 8),
>т.е., это были валидные hex-цифры, которые сконвертировалось целиком,
Вот ты там про байты выше пишешь и битовые сдвиги...
Лучше скажи как из двух байт 1e d8 получить эту букву Ộ.

Там какие-то UTF-байты дополнительно добавляются, как в примере, что я вкинул выше.
Я так и не получил эти байты из выходного символа, который выводится там.

>а вот что делать дальше - зависит от задачи.
Всё просто. Пользователь, в коммандной строке, вводит разделитель - в виде аргумента:
>program.exe -delimiter "\\u1ED8" и должен получить символ Ộ.
Надо как-то убрать один слеш из строки,
чтобы в строке содержалось "\u1ed8" и символ этот - после printf("%s", "\u1ed8");
При этом сама escaped string, должна бы содержать в себе два слеша перед u "\\u1ed8"
и выводиться как "\u1ed8" - причём выводиться ASCII-текстом.
В процессе унескапинга этого, "\\u" должно бы заменяться на "\u",
но так нельзя, оно просит hex цифры после \u, и...
>printf("\u%d", 7896). //1ed8 (decimal)
не работает...

Поэтому, можно было бы, каким-то образом, пришпандорить байты к u,
вроде 'u1ed8', а потом к слешу прицепить.
Но я ебу как это делать правильно... Проще наверное на ассемблере ядро переписать.

>Это компилятор за тебя "\uXXXX" в строках и символах обрабатывает.
Ну вот в этом и прикол, значит.
Как обрабатывает, куда байты подавать, как получить ебанный чарактер?..
Всё это надо знать, блядь и расколупывать после на уровне машинных инструкций...
АААААААААААААААААА!!!!

Но я вижу твой пример просто слеш добавляет.
В строке из твоего примера:
char x[] = "xx\\\\xxx\\ty\\r\\n\\\'\\\?\\\"hello\\x22\\x7e\\xf";
я вижу 4 слеша, и если добавить \\\\u1ed8 туда, вот так:
char x[] = "xx\\\\xxx\\ty\\r\\n\\\'\\\?\\\"hello\\x22\\x7e\\xf\\\\u1ed8";
то очевидно, что заменяется двойной слеш, и заменяется он на один,
это просто потому что двойной слеш и эта замена - есть в условии switch.
А надо чтобы "\\u" заменялось на "\u", без багов и лагов.

Сделали бы нечто вроде printf("%"u, unsigned_short_int charcode); //да в стандарт ввели бы...

P.S. И после всего этого - унескапнул два раза свою дрянную "\\u1ed8", и всё стало заебись.
Аноним 24/09/18 Пнд 12:19:21  1269399
>>1267908
Так стоп! Но ведь в программе из книжки с и так имеет тип int. И как раз для указание на конкретный массив и нужно число в int. В чем тогда смысл?

Или после операции с=getchar() с меняет свой тип на char что-ли?
Аноним 24/09/18 Пнд 13:32:36  1269423
char✮ strcpy(char✮ src, char✮ dst)
{
char✮ res = dst;
while(✮dst++ = ✮src++);
return res;
}

Это нормальный strcpy?
Спрашиваю, ибо жалуются, что сложна-нипанятна. Мне всегда казалось, что именно так и общепринято и любой программер на C такую конструкцию распознает не задумываясь. Что скажете?
Аноним 24/09/18 Пнд 13:54:28  1269435
>>1269423
Зачем тебе указатель res тогда вообще?
Аноним 24/09/18 Пнд 14:15:53  1269447
>>1269399
Хз, чет погуглил и не нашел ответа
Аноним 24/09/18 Пнд 17:46:54  1269588
>>1269423
лол это вообще пример с Кернигана и Ритчи
как сишнику может быть такое не понятно
Аноним 24/09/18 Пнд 17:52:51  1269592
>>1267674
если ты ввел число 5 оно в кодировке ANSII там хуй пойми какое , поэтому мы с него отнимаем кодировку нуля ('0') и записываем итерацию в элемент массива под номером '5'-'0' = 5 , и тем самым в массиве останется инфа что ты нажал число 5
Аноним 24/09/18 Пнд 19:19:46  1269657
>>1269435
> ибо жалуются, что сложна-нипанятна
Кто жалуется? Программисты на жс?

Аноним 24/09/18 Пнд 20:16:12  1269680
>>1269423
Стандарты SEI или чего-то ещё надо читать, там должно быть описано. Хотя, в целом, стандарты сводятся к тому, чтобы не заниматься гимнастикой с указателями и прочими подразумеваемыми вещами, а то словишь УБ и бида-бида.
Наверно, в условии цикла должно было бы стоять сравнение с нулём, или к указателям обращались бы с дополнительной переменной, я не знаю.
Аноним 24/09/18 Пнд 20:43:34  1269704
>>1269680
Выражение в while - это идиома. Все нормальные люди такое понимают и сами так пишут. А в ололобезопасных стандартах запрещают делать и многие другие нормальные вещи, но обоснований при этом не приводят - просто какой-то анонимный эксперт сказал им, что так нельзя.

мимо анонимный эксперт
Аноним 25/09/18 Втр 00:46:56  1269775
>>1269284
>смотри что я принёс:

>#include <stdio.h>
>void printCard(int card) {printf("\xF0\x9F\x82%c\n", 0xA1 + card % 13);}
>int main(void){for (int i = 0; i<10; i++){printCard(i);}}

>Этот пример - выводит 1 символ из нескольких \x байт.
>Как его сюда пришпандорить к \u - хуй знает.

>>1269310
>Это компилятор за тебя "\uXXXX" в строках и символах обрабатывает.
>А ты хочешь сам обрабатывать, поэтому речь идет как раз о "\\uXXXX".

Итак, если, в твоём примере
>http://rextester.com/HGY79496
указать "\\u1ed8" в строке, то слеш унескапается и получается '\u1ed8'
Получается оно так - и при выводе escaped string, и после функции.
Если же указать просто "\u1ed8", видно символ 'Ộ'
причём и при выводе escaped string, и при выводе результата функции.

Почему так? Да потому что разные байты в строках "\\u1ed8" и '\u1ed8'
Вот они, здесь: http://rextester.com/NMOR60766

И есть ещё конвертер, вот такой: https://r12a.github.io/app-conversion/
Эти байты можно видеть там где UTF-8 code units.
Как можно видеть, байт этих три, ничего общего между ними и кодом 1ed8 я не вижу,
но они выводятся одним символом, если их записать через \x

Так чё мне, делать lookup table и хеш-таблицу замен для всех юникод-символов что-ли?
Аноним 25/09/18 Втр 01:27:18  1269795
>>1269775
1ed8 -> 0001'1110'1101'1000 (влезает в трехбайтовую последовательность UTF-8, которая хранит от 12 до 16 бит):
Leading UTF-8 byte: 1110 (префикс) 0001 (первые 4 бита).
Continuation byte: 10 (префикс) 111011 (еще 6 бит).
Continuation byte: 10 (префикс) 011000 (еще 6 бит).
Получаем: 11100001, 10111011, 10011000->e1, bb, 98.
Аноним 25/09/18 Втр 07:35:13  1269821
15089404916220.jpg (27Кб, 394x394)
>>1269795
О, ваще красава, годно расписал.

А префиксы эти статичные там, или они меняются?

Если не меняются, то вот что получилось: http://rextester.com/LANI21353

Только, по идее должен был бы печататься символ, а не строка.
Как в этом примере: http://rextester.com/NMOR60766
Но там два слеша перед x, в строке этой, поэтому и так...
Можно байты эти и прямо, цифрами в строку всунуть, как-то вот так:

char string[] = {225, 187, 152}; //e1, bb, 98
printf("%s", x);

Но руки только щас до этого дошли.
В общем, добра тебе, анон.
Коротко и ясно пояснил. Держи няшу.
ПЕРЕКАТ Аноним # OP  25/09/18 Втр 08:04:31  1269825
>>1269824 (OP)
>>1269824 (OP)
>>1269824 (OP)
>>1269824 (OP)
>>1269824 (OP)

Не заметил, что мы в бамплимите, извините.
Аноним 25/09/18 Втр 20:42:41  1270213
>>1269821
> А префиксы эти статичные там, или они меняются?
Ну сходи ты хотя бы в википедию, там есть красивая табличка. У continuation bytes у всех префикс одинаковый: 10, после него 6 бит значения. У leading byte либо нолик в старшем бите, означающий ASCII-совместимый 7-битный символ, либо префикс из последовательности единиц и нолика за ними, количество единиц указывает количество битов в последовательности. Вот >>1269795 тут 11100001 означает, что в последовательности 3 байта, считая и стартовый.
Аноним 25/09/18 Втр 20:43:34  1270215
>>1270213
> количество единиц указывает количество битов в последовательности
Байтов, конечно же.
Аноним 26/09/18 Срд 12:35:11  1270494
>>1267299
>неудобно
Двачую, пиздец как неудобно.


Топ тредов
Избранное