Этого треда уже нет.
Это копия, сохраненная 1 ноября 2018 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
C Programming Language.png78 Кб, 792x1023
C Programming Language #33 /clang/ # OP 1253747 В конец треда | Веб
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь 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/
2 1253759
Первыйнах
3 1253760
>>53759
съеби
4 1253763
>>53760
Проверяй
5 1254138
В чем преимущество Си перед Растом?
6 1254140
>>54138

> В чем преимущество Си перед Растом?



В имеющихся компиляторах. И библиотеках.
7 1254143
>>54138

Я имел ввиду тхт аспекты, а не наработанные тонны легаси
8 1254144
sage 9 1254176
>>54143
Ты путаешь легаси и инфраструктуру. А еще си до некоторого предела проще.
10 1254208
>>54138
Один сделали больше 45 лет назад и он до сих пор нужен, другой сделали недавно и он уже востребован.
11 1254209
>>54208

>фиксатор


не востребован
12 1254212
>>53759

>номер поста #2


>первонах

13 1254215
>>53747 (OP)
Хелоу гайз, счаз усиленно занимаюсь си и всем сопутствующем, очень нравится , но задумался как потом зарабатывать на чистом си , посмотрел вакансии и всем программисты хай лвл языков, понятно что всегда можно писать что то свое на си , но в интерпрайзе что делать то потом ?
14 1254218
>>54215
Си никому не нужен. Си мёртв, а оп некрофил.
15 1254220
>>54218
странно язык оч крутой , прикольно на нем реализовывать вещи которые есть в других языках , да и вообще удобный
# OP 16 1254468
>>54218
ОП, конечно, некрофил, ты прав. Он пишет на Си фор фуд. Некоторые заказчики ОПа до сих пор не то, что от крестов шарахаются, а даже от C11/C99. Такие дела.

>>54215
В интерпрайзах Си нет, там надо быстро сделать, потом выбросить и снова сделать. В embedded Си востребован, ни про какие расты там не слышали. Но сам по себе, без знания предметной области, Си нигде и никому нахуй не уперся. Впрочем, как и большинство других языков.
17 1254471
>>53747 (OP)
Блядь, перестаньте называть язык C clangом, имбицилы. С каких это пор шланг стал единственным компилятором языка, если он не может собрать Ядро.
18 1254473
>>54218
Ядро, как минимум... Умер твой мозг. C будет еще долго жить, хотя конечно под современные процессоры он не очень явно. Все эти оптимизации компиляторов работают с вероятностью почти нихуя ( 1 / дохуя ).
# OP 19 1254476
>>54471
Никто не называет и не путает с компилятором. Имеется в виду c language, потому что просто "c" - слишком коротко. Тег был добавлен модером для одного из предыдущих тредов, он же прописан в навигаторе в прикрепе. Если есть лучший вариант тега - проси модера исправить.
20 1254478
>>54476
Я понимаю, но это вам не язык Go, который является глаголом в английском языке. Язык этот слишком стар чтобы его так называть.
21 1254496
>>54476

>есть лучший вариант тега


ansic
мимо господин
sage 22 1254497
>>54496
Распарсил с третьего раза, думал что-то про асики и прочие верилоги. Алсо, почему анси, а не исо?
23 1254519
>>1253425
так и некто и не помог мне с pcre2_substitute :(
24 1254520
>>54476

>Если есть лучший вариант тега



plain С
25 1254527
>>54497

>исо


isoc
звучит по пидерски
26 1254528
>>54519
никто в здравом уме регулярками на си не парсит, есть Перл и если очень нужно есть Бизон
мимо парсерогосподин
27 1254564
>>54473

>C будет еще долго жить, хотя конечно под современные процессоры он не очень явно



альтернативы?
28 1254591
>>54564
Раст
29 1254599
>>54215
Вакансии называются «программист Linux».
30 1254624
>>54591

>Раст


Педераст
31 1254625
>>54591

жирно

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

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

https://www.viva64.com/ru/b/0324/
32 1254627
>>54625

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


Чмошники движок мозилы на него потащили, пизда ей... аж триасет...
33 1254642
>>54625
Не жирно. В расте как-раз есть явные векторные типы. А это пиздец как важно на сегодня. Не заставлять asm-говновставками векторизацию делать ебясь с выравниванием, и не надеятся блядь на уличную магию компилятора что он ебать не взбредет и не решит что векторизация невозможна.
34 1254644
>>54625

>


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


Да, ладно эксперт диванный. Язык вполне уже селфхостед.
35 1254645
>>54528
парсеродобоеб.

Если бы знал хоть теорию немного, то знал бы что лексированием занимается lex (flex).
36 1254653
>>54625

>детских проблемах


Каких? Я любопытный.
37 1254736
>>54645
Их в паре юзают, ты чё на него напал, а?
Дерзкий чтоль?
38 1254738
>>54653
Нет, ты ехидный и злой, а не любопытный, тебя это не очень-то и интересует на самом деле, ухади.
39 1254765
>>54473

>Все эти оптимизации компиляторов работают с вероятностью почти нихуя


Ну ты и спец. Т.е разницы между -O0 и -Os у тебя нет?
40 1254823
>>54528

> никто в здравом уме регулярками на си не парсит



Чем здравый ум Сишника отличается от здравого ума Perl`овчанина или тогоже PHP`девелопера, которые для парсинга везде юзают PCRE, а в PHP так и вообще юзают эту самую libpcre2, только API от Сишного отличается в куда более понятную сторону
41 1255013
>>54765
У меня вот криптобиблиотека, собранная с -O2 даёт выигрыш в производительности В ДВА РАЗА по сравнению с -О0.
42 1255017
>>55013
march/mtune юзаешь?
1535384750156697094.jpg183 Кб, 700x933
43 1255106
>>54823

>PCRE — библиотека, реализующая работу регулярных выражений в стиле Perl.


>отличается от здравого ума Perl


>PHP`девелопера, которые для парсинга везде юзают PCRE, а в PHP так и вообще юзают эту самую libpcre2

44 1255233
>>54738
Неправда.
45 1256579
Есть разница между char* andron = "sosi" и char andron[] соси?
46 1256580
>>56579
char andron[] = "sosi"*
sage 47 1256602
>>56579
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]) будет лишний дереференс по сравнению со предыдущим вариантом.
48 1256610
>>56602
Ой, что-то у тебя никуда писать нельзя.
sage 49 1256612
>>56610
В первые два варианта можно. В последний тоже можно, но только в саму переменную foo, без дереференса.
50 1256614
>>56612

> только в саму переменную


Почему?
sage 51 1256621
>>56614

> Почему?


Ну вот же:

> фактически, это аналогично 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");
52 1256622
>>56621

>foo = bar;


После этой строчки на литерал "ххх" больше ничего не указывает?
sage 53 1256630
>>56622

> После этой строчки на литерал "ххх" больше ничего не указывает?


Ну, в идеальном мире да. Но, так как в литералы писать все равно нельзя (или, наоборот: нельзя писать, чтобы можно было так делать), компиляторы могут устранять дублирование строковых литералов в секции данных. Вот этот код может трижды напечатать один и тот же адрес:
const char ∗ptr = "xxx";
printf("%p %p %p\n", "xxx", "xxx", ptr);
Мало того, вот этот код тоже может напечатать один и тот же адрес (т.е., если одна строка является концом другой, они могут схлопнуться):
printf("%p %p\n", "hello, world", "world" -7); // 7 = sizeof("hello, ")
54 1256635
>>56630

>Ну, в идеальном мире да.


Так же можно засрать литералами всю память, а указетелей на них не останется.
55 1256637
>>56602
Спасибо за отличное объяснение!

>т.е., каждый раз при входе в функцию


Когда именно это происходит?
sage 56 1256640
>>56635

> указетелей на них не останется


Ну и хуй с ними. Твоя программа все равно в память целиком грузится, и от того, что на литерал есть указатель, или на него нет указателя, размер секции данных не поменяется.

>>56637

> Когда именно это происходит?


Детали реализации. Когда-то после того, как код функции получил управление (т.е., функция была вызвана) и до того, как переменная будет использована. В целом, примерно так:
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 не только выводить, но и модифицировать, с условиями и т.п., то такое уже не соптимизируешь.
sage 57 1256641
>>56640

> puts("bar");


puts(bar), ну ты понял
58 1256658
>>56640

>Но если bar не только выводить, но и модифицировать, с условиями и т.п., то такое уже не соптимизируешь.


Где ты такими заумностями научился? Годы проведенные с дизассемблером и отладчиком?
59 1256702
Пишу как-то для себя структуры для работы с .lnk форматом. https://msdn.microsoft.com/en-us/library/dd871305.aspx

Здесь есть битовое поле LinkFlags (первый пик), чье последнее значение (второй пик) оставляет 4 пустых бита после себя (третий пик). Надо инициализировать его как unsigned : KeepLocalIDListForUNCTarget : 5 (четвертый пик) или как?
60 1256707
https://ideone.com/8tRloy - насколько эта функция определения размера массива стабильна? Всегда ли будет выполняться условие выхода из цикла ровно, когда кончается массив?
61 1256737
>>56707
Нет надёжного способа определить размер объекта, не прибегая к sizeof().
62 1256738
>>56737
sizeof на массив не работат к сожалению же. Он, вроде, возвращает размер первого элемента массива и все.
63 1256741
>>56738
Не, передай ему указатель на первый элемент aka имя массива.
64 1256791
>>56707
Ты только что изобрел strlen
К размеру массива это никакого отношения не имеет.
65 1256797
>>56791
Ебать я умный!
66 1256820
test
67 1256822
>>56820
На QA учишься?
68 1256823
>>56822
На инженера-физика, правда уже жалею.
Капчу старую вернули, чё ты язвишь тут мне...
69 1256826
>>56741
Работает только для статических массивов.
70 1256830
>>56826
Постарайтесь не всирать переменную, в которой храните размер области памяти из кучи, когда выделяете.
71 1256831
>>56830
Да это я так, для ньюфагов пометку сделал.

У меня всё хорошо.
72 1256858
Мудрецы, напомните, мне нужен массив элементами которого является переменные массив. Как это будет хранится, как массив указателей или как смещение?
73 1256912
>>56858

> элементами которого является переменные массив


Чо? Переменные типа массив? Или динамический массив? Или VLA?

> Как это будет хранится, как массив указателей или как смещение?


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

>>56738

> sizeof на массив не работат к сожалению же


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

>>56707

> Всегда ли будет выполняться условие выхода из цикла ровно, когда кончается массив?


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

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

>>56702

> Надо инициализировать его как unsigned : KeepLocalIDListForUNCTarget : 5 (четвертый пик) или как?


Начнем с того, что не надо пользоваться битфилдами для парсинга бинарных файлов. У нас не далее как в прошлом треде были грабли: где-то около >>1243344. Твой KeepLocalIDListForUNCTarget очевидный однобитовый bool, за которым идут пять неиспользуемых битов. Для KeepLocalIDListForUNCTarget ты делаешь bool KeepLocalIDListForUNCTarget:1 или bit KeepLocalIDListForUNCTarget:1 (хуй знает, как твой bit определен). Затем, если ты целиком и полностью доверяешь компилятору, можешь больше ничего не писать. Если частично доверяешь, можешь сделать безымянный член unsigned:5, явно указав, что 5 бит не используются, или сделать unsigned:0, сказав компилятору, чтобы больше в этот битфилд ничего не пихал.
73 1256912
>>56858

> элементами которого является переменные массив


Чо? Переменные типа массив? Или динамический массив? Или VLA?

> Как это будет хранится, как массив указателей или как смещение?


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

>>56738

> sizeof на массив не работат к сожалению же


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

>>56707

> Всегда ли будет выполняться условие выхода из цикла ровно, когда кончается массив?


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

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

>>56702

> Надо инициализировать его как unsigned : KeepLocalIDListForUNCTarget : 5 (четвертый пик) или как?


Начнем с того, что не надо пользоваться битфилдами для парсинга бинарных файлов. У нас не далее как в прошлом треде были грабли: где-то около >>1243344. Твой KeepLocalIDListForUNCTarget очевидный однобитовый bool, за которым идут пять неиспользуемых битов. Для KeepLocalIDListForUNCTarget ты делаешь bool KeepLocalIDListForUNCTarget:1 или bit KeepLocalIDListForUNCTarget:1 (хуй знает, как твой bit определен). Затем, если ты целиком и полностью доверяешь компилятору, можешь больше ничего не писать. Если частично доверяешь, можешь сделать безымянный член unsigned:5, явно указав, что 5 бит не используются, или сделать unsigned:0, сказав компилятору, чтобы больше в этот битфилд ничего не пихал.
74 1256933
>>56912

>Если тебе нужен массив динамических массивов, т


Мне нужен массив статических массивов переменного размера, но тратить на него 64бита слишком дохуя, придется пилить массив смещений на буфер данных. И подумать о том, чтобы конпелятор не распидарасил его своим выравниванием.
75 1256945
Есть
char buf[512] = "abcd kl jcd wef";
char m1[100], m2[100];

sscanf(buf, format, m1, m2);

Мне нужно, чтобы в m1 оказалось abcd, а в m2 вся оставшаяся часть строки. В реальности оставшаяся часть строки может быть разной, с другим количеством пробелов. Как составить format для такого?
76 1256962
>>56912
Разве не надо сделать unsigned : 4? Так как у меня меня всего 5 битов, а один занят под KeepLocalIDListForUNCTarget.
И прости за тупой вопрос, что означает именно unsigned в битовых полях?
77 1256965
>>56912

>Начнем с того, что не надо пользоваться битфилдами для парсинга бинарных файлов.


И как мне тогда парсить подобные структуры? Сделать кучу чаров и вытаскивать биты побитовыми операциями что ли? Я просто новичок в этом деле, особо сказать за это не могу.
lnk.png4 Кб, 222x128
78 1256966
>>56962

> Так как у меня меня всего 5 битов, а один занят под KeepLocalIDListForUNCTarget.


Либо я разучился считать, либо ты.

>>56965

> И как мне тогда парсить подобные структуры?


По-хорошему: читать побайтово, собирать инты размером больше байтов побитовыми операциями, разбирать поля меньше байтов побитовыми операциями. Естественно, не вручную, а делать себе няшный binary stream reader. Но если тебя переносимость не интересует, тогда можно и битфилды из файла напрямую читать, тем более, что студия типа "родной" компилятор.
79 1256968
>>56966

>Либо я разучился считать, либо ты.


Это я, пересчитал биты и оказалось, что я обосрался.

Но все-таки странно, почему не стоит использовать битовые поля? Они же как раз для таких задач вроде и создавались.
80 1256991
Почему не работает?
char i[1000];
int c;
for (int k=0;(c=getchar())!= '\n'; ++k,i[k]=c);
printf("%s",i);
81 1256992
>>56991

>++k,i[k]=c


Переделай это.
82 1256994
>>56992
После того как поменял местами заработало, но в чем была проблема? Понятно конечно, что i[0] не присваивалось значение, но разве это проблема?
83 1256995
>>56994
Сделай вот так i[k++] = c - это короче и читабельнее.
А не работало, так как у тебя сначала увеличивалось, а затем уже присваивалось значение, то есть пропускались элементы массива i.
84 1257027
Чтобы покодить на сишке? Подскажите, хочу отвлечься от суровой действительностью в мир байтов.
85 1257030
Посоветуйте как разобраться в ебучих , . Я понял из теории, что указывает на адрес, а две на адрес адреса. Но почему в том или ином коде их применяют я понять не могу, не понимаю, когда мне они нужны. В общих чертах пишут про массивы, строки еще что-то. Но я бы хотел большей ясности. Где я могу узнать об этом? Спасибо.
86 1257031
Есть ли какое-то преимущество книг перед гуглом и различными обучающими программами на курсере итд? Стоит ли их читать новичку в 2к18?
87 1257038
>>57031
ЗАВИСИТ ОТ ТВОИХ ИНДИВИДУАЛЬНЫХ ОСОБЕННОСТЕЙ И СКЛОННОСТЕЙ К ОПРЕДЕЛЕННОМУ СПОСОБУ ОБУЧЕНИЯ, ВЫБИРАЙ ИСХОДЯ ИЗ СВОИХ ДАННЫХ
>>57030
СПРОСИ ЧТО ИМЕННО ТЕБЯ В НИХ НАПРЯГАЕТ
А ВООБЩЕ ПРОЧИТАЙ НА ВИКИПЕДИИ, МНЕ ТАМОШНЯЯ СТАТЬЯ ПОКАЗАЛАСЬ ЛОГИЧНОЙ И СТРУКТУРИРОВАННОЙ (ЕСЛИ ЧТО Я ПРО РУССКУЮ)
88 1257049
>>57038
Не понимаю, когда их использовать
89 1257053
>>57049
Когда хочешь, чтобы функции была передана сама переменная, когда инициализируешь динамические массивы, когда создаешь связанные списки, когда итерируешь по массиву, когда выделяешь память в куче, когда небеса.
90 1257056
>>57027
codewars
91 1257057
>>57056
Спасибо.
92 1257120
printf(" "*i);
Почему так нельзя?
93 1257125
>>57120
Во-первых, что ты собрался с чем объединить.
Если бы строковый литерал с указателем на строку, то зачем разыменовывать?
Во-вторых, конкатенация литералов происходит на раннем этапе компиляции, на твой i всем насрать там.
94 1257151
>>57125
Я хотел, чтобы пробел был напечатан i раз
95 1257161
>>57151
функцию пиши падла
96 1257312
>>57161
>>57151
можно ограничиться макросом вроде
#define PRINT_ICHR(CHR,I) (for(;I>0;I--)printf("%c",CHR))
Но I после исполнения обнулится
97 1257313
Подскажите название наиболее широко используемой функции для сортировки односвязных списков.
98 1257334
>>57312
Ну вот в таких-то случаях можно было inline-функцию вметсо макроса сделать.
В чём фишка макросодрочерства? Ты демонстрируешь, что ты олд?
99 1257336
>>57313
скопировать всё в массив -> qsort -> обратно в список
100 1257426
>>57312

>printf(“%c",CHR)


И нахуй ты printf используешь для одной буквы?
static inline void printch(unsigned i, char c) (while(i--) { putchar(c); })
101 1257435
>>57426
Лол, никто не будет так делать.
102 1257643
>>56968

> почему не стоит использовать битовые поля


Из прошлого треда:

> компилятор может выделить под элемент char, а может и int, может начать заполнение со старшего бита, а может с младшего


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

>>57151

> Я хотел, чтобы пробел был напечатан i раз


Следи за руками: printf("%*s", i, ""); но это работает только с пробелами. Умножения для строк, как в питоне, в Си нет.
103 1257654
>>57643
Как заебали эти "адепты стандарта", у которых в байт может быть не 8 бит, просто иди нахуй.
104 1257657
>>57654
Сам иди. Я писал под DSP с 16-битными байтами, сосалписал под big-endian, периодически отсасываю у alignment requirements на разных процах, а в прошлом треде был кун, у которого битовые поля из Праты распидорасило. А ты продолжай думать, что переносимость - это когда линукс под пеку и малинку.
105 1257661
>>57657

>периодически отсасываю у alignment requirements на разных процах


Я тоже, но большинство программистов не столкнутся с нее восьмибитными байтами, так что тыкать и носом в стандарт необязательно.
106 1258082
>>57334
В пизду иди сука ебливая, в рот тебя ебал макросами.
107 1258385
>>53747 (OP)
Поясните наконец анону про goto
Чем чуханью оно так не приглянулось? Это ж жесть как удобно и не затратно по ресурсам. "Плохой тон" программирования? Лол што блять? В asm есть целая директива jump через которую работают циклы и переходы, с хуя ли ее аналог в Си есть зло?..
108 1258389
>>58385

>Это ж жесть как удобно и не затратно по ресурсам


Да. Только смузихлебам не говори.
109 1258420
>>57053
сложна, в питоне нет такой херни
sage 110 1258423
>>58385

> Чем чуханью оно так не приглянулось?


Давным-давно был язык 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


Но ты-то не на асме пишешь, тебе дали язык для людей. Алсо, не директива, а инструкция/мнемоника. Директивы управляют поведением транслятора и в объектный код не попадают.
111 1258440
А где можно скачать Learn C the Hard Way, а то 30 бачей чёто нету:(.
sage 112 1258451
>>58420

> в питоне нет такой херни


Ты лишь наполовину прав. С одной стороны, в питоне абсолютно все сущности, до которых ты можешь дотянуться - ссылки (т.е., точно такие же указатели на объекты, как и в Си, только всегда валидные). С другой стороны, в питоне и правда нет двойных указателей, т.е., не получится сделать 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])

>>58440
Было на сайте, было на вебархиве, но выпилено отовсюду (и слава богу). Есть на торрент-трекерах ("Learn C the Hard Way[ 2015[X7]" в гугле с кавычками). Но лучше возьми Прату.
113 1258481
>>58451
Спасибо, нашёл.
А как найти Прату?
114 1258485
>>58481
А всё, нашёл, сорян.
115 1258501
>>1253425

> Может ктонибуть набросать простой пример как юзать pcre2_substitute?


>>54519

> так и некто и не помог мне с pcre2_substitute :(



Всего две недели ебли, и я сам себе помог, спасибо анончики, понял как это говно юзать, если кому надо вот накатал пример:
https://pastebin.com/AHm7gkwK
15356540062890.jpg46 Кб, 720x713
116 1258685
Всем Привет!
Я всего глазком видел С и не знаю CUDA.

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

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

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

Искать нужно бы в диапазоне, а то компьютер у меня всего один и одна видеокарта. Т.е. x должен задаваться диапазоном (просто от и до).
Все найденные числа должны записываться в лог, при этом это действие НЕ должно приостаноавливать поиск чисел.
И подозреваю, что искать я буду, как минимум неделями, вероятно, буду перезапускать не раз, поэтому не плохо бы, чтобы программа хотя бы иногда записывала во второй лог одно число, какое сейчас число перебирается, чтобы я потом просто передал это число программе и она начала с него.
+ Ещё неплохо сделать опцию - процент нагрузки на железо, ну чтобы графика не лагала, чтобы не горел проц и видяшка итд. Тоже передавать параметром при запуске программе.
117 1258686
>>58685
libgmp
118 1258772
>>58686
помоги прогу написать, плизки
119 1259117
Абиснити, молю.я нуфаг
120 1259126
>>59117
а погуглить - нахуй надо
пиздуй из профессии
121 1259131
>>59117
А что там не понятно?
122 1259278
Добрый вечер.
Подскажите, как написать кастомный printf и зачем это может понадобиться?

Знаю, что используется write(), но пока недостаточно разбираюсь, чтобы толком поисковый запрос сделать.
123 1259343
Поясните за "Си с классими" (не цпп, а именно си), что имеется ввиду? Может есть какие либы реализующии ооп в си?
124 1259351
>>59343

>Может есть какие либы реализующии ооп в си?


Да, через структуры
125 1259355
>>59351
А либы есть готовые, чтоб было всякое наследование (не множественное), полиморфизм, и прочее ооп?
126 1259357
>>59355
Книга есть, гугли
128 1259362
129 1259363
>>59362
А на русском нет?
130 1259453
>>59343
Зачем это в 2018? Почему не писать на плюсах, используя только си и классы?
131 1259470
>>59453
Плюсы мне не нравятся, там слишком много лишнего говна, да и все сторонние библиотеки, которые я юзаю для разработки, написанны на чистом Си, инклюдить их к Цпп не вижу смысла, плюс разрабатываю в основном под разный эмбеддед, и Си туда проще компилить чем цпп, мень ше гемора
132 1259526
>>59278

> Подскажите, как написать кастомный printf


https://ideone.com/9r6T6x - обрабатывать форматную строку, получать аргументы с помощью va_arg, преобразовывать их в строку и выводить. Или вот я когда-то видел формировалку сетевых пакетов, формат ей так же printf-like синтаксисом задавался, а она вместо текстового представления делала из всяких интов и флоатов big-endian слова, а перед строками втыкала длину.

> и зачем это может понадобиться?


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

>>59363
Оно и на английском-то не нужно. Обычно достаточно одного уровня наследования (common object->specific object, а чаще всего это даже просто linked_list_header->payload) и изредка какая-нибудь наколеночная табличка с методами. И никаких макросов.
133 1259533
>>59526

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


Not bad.
134 1259534
>>59526

>Оно и на английском-то не нужно. Обычно достаточно одного уровня наследования (common object->specific object, а чаще всего это даже просто linked_list_header->payload) и изредка какая-нибудь наколеночная табличка с методами. И никаких макросов.


Этот шарит.
Безымянный.png15 Кб, 1056x408
135 1259966
1. Почему это работает?
2. Для чего нужен си кроме академических целей и низкоуровневой боли?
136 1259967
>>59966

>Почему это работает?



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

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



Именно. Драйвера/OS/микроконтроллеры.
137 1260031
А скажите, выходит, указатели могут иметь произвольную глубину вложенности. Не уверен, что правильно сказал, ну вот есть указатель на указатель и разыменовывается он двойной звездочкой. Можем мы таким же макаром устроить трёхзвёздочный коньяк или пятизвёздочный и до скольки уровней предел?
138 1260039
>>60031
можна, токо паламается моцк
139 1260051
>>59967
И криптография ещё.
140 1260052
>>60031
Да, есть даже юморески про пятизвездных программистов.
141 1260234
>>59966
Ты попробуй так со структурой или массивом сделать. Сегфолт обеспечен на 100%.
142 1260370
Глупый вопрос, но буду благодарен, если кто-то пояснит.
Есть типы данных int,float,char и т.д.
Временные переменные обязательно объявляются вместе с типом. Когда до мэйны мы объявляем константу типа #define NUMBER 10 - то компилятор автоматически понимает, какой тип данных соответствует 10. Вопрос - нахуя тогда еботня с временными переменными?
143 1260376
>>60370
Дефайн это не константа, и не тип данных, даже не переменная, дефайн это макрос.
Допустим у тебя есть #define ten 10
Препроцессор буквально идёт по всему коду и везде где у тебя написано ten заменяет ten на 10.
144 1260377
>>60376
Ааааа, хмм, но всё равно непонятно, зачем нужна тогда еботня с типами данных, если можно так.
145 1260420
>>60377
Так ты же про переменную спросил, переменную можно переменить, а дефайн нельзя.
146 1260540
>>60420

> переменную можно переменить, а дефайн нельзя


#define FOO 1
#undef FOO
#define FOO 2
Но переменной дефайн от этого действительно не становится.

>>60377

> зачем нужна тогда еботня с типами данных


Чтобы делать что-то сложнее обычной арифметики.
147 1260552
>>60540
Ебать удобно будет такой код читать конечно.
148 1260639
>>60370

>Вопрос - нахуя тогда еботня с временными переменными?



юзай auto
sage 149 1260657
>>60639
Ты тредом ошибся.
150 1260708
Можно ли как то писать на си под андроид? Теоретически это же линух, так что наверное есть варики?
151 1260712
152 1260713
>>60712
Через ANDROID NDK?
153 1260715
>>60713
Я гуидятину на Qt писал
154 1260741
>>58423
Вообще, иногда просто удобно.
Мне вот недавно надо было скрипт на баше выполнить, но скипнуть всю серединку. Комментить всю эту кучу не хотеелось, обрамлять как тело другого оператора - тоже. Было бы классно выполнить начало, а потом сделать goto в конец, но не завезли. Пришлось переделывать в другой скрипт.
155 1260742
>>58772
Плоти
156 1260744
>>60742
Деньхами плотить или писечкой?
sage 157 1260774
>>60741
На Си ты можешь #if 0 ... #endif
158 1260800
>>60657

>Ты тредом ошибся.


почему?
159 1260801
>>60744
За деньги можно поиметь любую лучшую писечку, и купить покушать заодно
sage 160 1260900
>>60800
Потому что auto в Си - это storage class для автоматических переменных, т.е., таких, которые удаляются при выходе из области видимости. int main(void) { auto int foo = 1; printf("%d\n", foo); } Обычно никто не пишет auto явно, потому что переменные, определенные внутри функций, уже по умолчанию автоматические. А вот крестах, куда auto пришло из Си, реюзнули ключевое слово для автоматического вывода типов, там можно auto foo = 1.
161 1261126
Ребята, можно в сишечке не объявлять переменную-массив, но использовать ее? Типа:

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

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

Так как я написал нельзя. Но может существует другой синтаксис?
162 1261155
>>61126
Можно, называется compound literal, появилось в C99: func((int[]){1,2,3,4}, 4). К сожалению, В этом случае тебе придется считать количество элементов вручную или дублировать литерал, что еще хуже: func((int[]){1,2,3,4}, sizeof((int[]){1,2,3,4}) / sizeof(int)); но для простых случаев очень удобно.
163 1261161
>>61155
Благодарю.
164 1261442
>>53747 (OP)
посоветуйте как научиться работать с графикой в си , то есть прям понять что и как
а не qt юзать
165 1261458
>>61442
Зачем?
Только подробно отвечай.
166 1261465
>>61458
ну вот как си рисует графику ? окна и тд
167 1261478
>>61465
Ну так window manager глянь исходники. Линуксовых с открытым кодом точно есть.
sage 168 1261480
>>61465
Си - никак не рисует. В его стандартной библиотеке GUI нет. В ней вообще мало что есть. А рисует или графическая либа, или GUI либа, или иногда ОС через API. Qt, например, берет у ОС только окно, а кнопочки внутри него рисует самостоятельно. На Windows API ты можешь попросить винду рисовать в том числе и кнопочки. В линуксах ты можешь попросить Gtk+ рисовать кнопочки. А можешь взять какую-нибудь левую либу типа Nuklear, взять OpenGL и рисовать кривые кастомные кнопочки. Еще ты можешь взять только графический апи и самостоятельно рисовать свои кнопочки, графику и самостоятельно же реагировать на события, изобретая свою GUI-библиотеку, попутно охуевая от объема требуемого для этого кода.
169 1261573
>>61480
можно подробней где достать графический апи ?
170 1261579
>>61573
define графический апи
У каждой ОС свои API
171 1261607
>>61573
Капай опенГЛ. Там верхнее апи это сишное апи для макак. Заодно начнешь в графическом конвеере разбираться, битковлены майнить
172 1261616
>>61607
пасиба , огромное
173 1261625
>>61616
пожалуйста милипиздрическое
174 1261667
Кто-нибудь использует gsl, Lapack, Blas?
Там часть функций выводит симметричную матрицу как верхнедиагональную (а значения под главной диагональю не трогает). Как потом с этим работать? Написать функцию, которая прописывает элементы под диагональю?

Например, пусть есть 2 матрицы:
A = {{1,2}, {2,3}}
B = {{2,3},{3,4}}.
Хотим посчитать (AT×A)×(B×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}} -- А это неправильно.
175 1261827
>>53747 (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
176 1261832
>>61827
Короче, как заменить '\\t' на "\t" чтоб оно в delimiter зашло как tab?
177 1261857
>>61827>>61832
Сделал так, для однобайтного разделителя: http://rextester.com/PZTCBT99810

А вообще вопрос о том, как передать escaped string в переменную,
сделав при этом unescape, и этот вопрос - остаётся открытым...
178 1261949
>>61857
Манька, твои эскэпе символы во время конпеляции заменяюися аски немечатными эквивалентами, а в аргументы ты передаешь аски строки, пиздец...
179 1261992
>>61949
Ну и как эту ASCII унескапнуть попроще? Функцию пездатую писать что-ли?
180 1262005
>>61992
Пиздатую распиздатую
181 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() знаю, но интересует именно описанный подход.
182 1262139
>>61992
Там охуеть какая сложная функция: если встретил \, то делаешь свитч по известным символам. Если ни с чем не сматчилось, в default свитча выводишь как есть.
183 1262141
>>62082

> Про sem_open() знаю, но интересует именно описанный подход.


А почему тебя интересует именно он, если он тебе не подходит? Это для форкающихся процессов, когда процесс может сделать инит и нафоркать себе потомков.
184 1262183
>>62141
Потому что он использует shared memory, а он мне как раз и нужен для синхронизации вокруг shared memory. Спасибо за пояснение, всё понял.
sage 185 1262184
>>53747 (OP)
Привет, пишу на жс, хотел бы для общего развития обмазатся сишкой, порикоминдуйте книжку.
186 1262194
>>62184

>порикоминдуйте книжку


Приключение Буратино
187 1262196
>>62184
Прата, в шапке. Или K&R. Или обе.
188 1262261
Доброй ночи. Хочу спросить о том, что профи привыкли делать на рефлексе, наверное.

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

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

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

Извините, если задолбал нубовопросами, тогда просто ткните носом, где именно это читать (всего Прата прочту обязательно, но потом, а тут сдавать срочно).
191 1262351
>>62270
src[0] += 'a' - 'A'
бтв разве это не ascii? Там же должно быть всегда одно расстояние
192 1262372
>>62351
Ты че-то не то написал. Это делается src[0] |= 32
193 1262373
>>62372
А, пардон, ты про это.
4Zluu[1].jpg13 Кб, 297x320
194 1262526
>>62261

>while(✯a++ == ✯b++)


Ты можешь только один символ инкрементировать. Пикрелейтед.
На, вот с этим поиграйся: http://rextester.com/BBL45561
195 1262551
>>62261

> Принято считать, что он по-умолчанию знаковый


В отличие от инта, по умолчанию он хз какой, и если тебя волнует знаковость или беззнаковость - надо указывать. Фактически в известных реализациях он 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)

>>62270

> Сталкивался с мнением, что наборы строчных и прописных буков могут отличаться не на 32


254
Компьютеры, где так было, давно вымерли. Но x += 'a' - 'A' банально читаемее.

> можно ли теперь делать свою проверку как (c >= 32 && c <= 126)


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

> даже пробел с какого-то перепугу


Для непечатаемых символов у терминала может быть специальное поведение. Печатаемые выводятся как есть. У терминала есть специальное поведение для пробела?
196 1262626
>>56945
%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 для других разделителей
197 1262675
С помощью fread() считал бинарный файл в массив типа char. ACSII-символы из этого массива успешно распечатал в stdout, а как из него распечатать юникодные символы(кириллица в utf-8) ?
198 1262703
>>62675
Кириллицу получилось распечатать, но помимо неё там ещё такое попадается: ���
Есть какой-нибудь диапазон значений для условия, чтобы эту хрень не выводило?
199 1262706
>>62703
Нихуя не понял, но сходи в вики посмотри, как UTF-8 устроен. Вкратце, ты можешь в поисках начала UTF-8 символа пропускать все байты, у которых (x & 0xc0) == 0x80.
200 1262833
>>57661
__нет,_столкнуться __прошу_привести_пример из Ядра.
201 1262879
>>57151

>Я хотел, чтобы пробел был напечатан i раз


держи 12 пробелов
printf("%12s", " ");
202 1262884
>>57151

>Я хотел, чтобы пробел был напечатан i раз


еще можно так:
int i = 12;
printf("%.*s", i, " ");
203 1262885
>>62884
парсер сожрал пробелы в " ", их там было много, а выводится будут столько сколько указанно в i
204 1263096
Поясните за malloc. Он же возвращает указанное кол-во байт?
Я хочу сделать strdup и strcat джва в одном. Принимаю две строки и возвращаю новую, содержащую обе подряд.
Памяти мне нужно strlen первой плюс strlen второй плюс 1 байт на нолик в конце. Всё верно?
И может ли на какой-то архитектуре char быть не 1 байт?
205 1263109
>>63096

> Я хочу сделать strdup и strcat джва в одном


asprintf(), оно нестандартное, но много где есть.

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


Да.

> И может ли на какой-то архитектуре char быть не 1 байт?


Нет.
206 1263122
>>63109
Спасибо. А что значит много где есть?
Я привык в плюсах, что могу писать sizeof(int) и получать размер инта. А как в чистом си, нужно включать какой-то заголовочный файл или тоже можно везде писать и рисков с портабельностью нет?
207 1263138
>>63122
Ты тупой.
208 1263141
>>63122

> А что значит много где есть?


Это значит, что оно вроде как во фре появилось, но всем очень понравилось, и другие разработчики тоже завезли в свои либц. Даже если asprintf нет, его легко реализовать самостоятельно, пользоваться им удобнее, чем strcpy/strdup/strcat, а оверхед на парсинг форматной строки редко критичен.

> могу писать sizeof(int) и получать размер инта


Ну так и пиши, и получишь, в чем проблема-то?

> нужно включать какой-то заголовочный файл


limits.h, если тебе нужно знать не размер, а максимальные-минимальные значения.
209 1263175
Cкачал вроде linux headers, но gcc все равно ругается на <linux/init.h>. Как решить эту проблему?
210 1263208
>>63175
Под linux/* разве не хедеры для модулей ядра лежат?
У компилятора по дефолту может не быть этого пути в include_path.
x64onx32.JPG45 Кб, 984x391
211 1263265
>>53747 (OP)
Анон, смотри: на картинке, обрабатываются 64-битные числа - в 32-битной Windows XP!!!
212 1263268
>>63265
Сява, ну ты мастер-фокусник!
213 1263277
>>63268
Ахххах, бля! :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

214 1263280
>>63277
Сява, мы и без тебя это знаем.
215 1263354
>>63277

> Всё работает в XP, наверное потому, что процессор поддерживает x64.


Проиграл. Нет, работает в XP потому, что 64-битные числа можно обрабатывать как пару edx:eax, что, собственно, гцц и делает. А можно вообще точно таким же макаром запилить арифметику произвольной точности.
216 1263367
>>63354
Я вот, например, запилил для 256-512-1024-2048, использую в криптографии.
217 1263414
Сап, анон. Я, блять, извращенец. Так получилось, что мне нужно ткнуть в код безусловный переход. Ну, я по всякому думал как переписать, но в голову ничего так и не пришло. У меня функция вызывается из другой, отдельно компилируемой функции и я туда тыкаю goto с меткой. Но мне закралось подозрение, что там нужно использовать setjump.h. Дак вот. Поясни в чём у них разница и какой лучше засунуть для дальнего перехода?
218 1263419
>>63414
setjmp()/longjmp() позволяют выпрыгнуть наружу, а не впрыгнуть внутрь. Покажи лучше код, наверняка там ни гото, ни longjmp не нужны.
219 1263422
>>63419
Спасибо. Всё так и получается. Сорь, не могу сурц показать. Закрытый проект. Просто в нём break завершит лишь выполнение функции и вернётся, если условие наступит на уровень выше и всё закончится. У меня это для критического участка, что если что-то утекать начнёт, то это максимально быстро всё остановит и прыгнет в другую функцию. Я знаю, что там можно через несколько уровней вложенности функций разрешить эту проблему, но очень сильно читаемость ухудшит, а мне же этот проект потом ещё долго пилить и через полгода возвращаться обратно. Хотя может тогда поумнею и пойму как разрешить этот кривой прыжок.
220 1263423
>>63354

>64-битные числа можно обрабатывать как пару edx:eax


Так, насколько помню - BigInteger'ы считают, там длинная арифметика тоже к простым действиям сводится.
Но x64 тем и лучше, что позволяет одной инструкцией ассембера 64-х битные числа считать, а не двумя как эта пара 32-х битных.
Я слышал давненько, что в процессора даже специально заводят отдельные логические схемы для AES256,
и замыкают их на одну инструкцию, чтобы быстро потоковое шифрование-дешифрование делать.
Если так смотреть на это, то процессора эти - вообще 256-битные. Но конечно же эти схемы не универсальны, а специфичны...
221 1263425
>>63423

> то процессора эти - вообще 256-битные


AES считает в GF(28), а 256 - это про ключ и раунды.
222 1263426
>>63367
8096 запили с пруфами, а то я видел RSA-ключи для PGP и SSH такой длины.
Наверное же не без причины так длину ключа загнули...
Можно и через BigInteger считать, но лучше и быстрее - организованной и оптимальной
последовательностью стандартных инструкций.
223 1263427
>>63425
А 28 = 256 же. И да, там по всей группе значения перемешиваются.
224 1263445
Посоветуйте статью по ссылки и указатели для тупых.
Спасибо
225 1263448
>>63445
В си нет ссылок.
226 1263473
>>63141
Спасибо за дельный ответ.
227 1263523
>>63426
Ты, наверное, имел ввиду 8192. Но зачем?
Для RSA-то понятно, но свою математику я использовал для эллиптической криптографии, а там в основном ключи 256 / 512.
228 1263524
>>63426
>>63523
Собственно, надо скопировать две таблички и два блока ассемблерных, чтоб сделать 4096 и 8192, но в рамках текущего проекта мне это не нужно.

Да и там уже как минимум каратсуба будет нужен, иначе слишком медленно. В эллиптике свои нюансы.
229 1263525
>>63423
НАМНОГО лучше. В своей либе мы отказались от поддержки 32-бит в принципе. Вернее, старая реализация осталась, но новая пилилась только под 64. Просто потому что намного быстрее и намного удобнее.
230 1263564
Антоны, решился писать дрова под винду. Кто-нибудь имел опыт с этим? Что качать и где?
231 1263568
>>63564

> Антоны, решился писать дрова под винду. Кто-нибудь имел опыт с этим? Что качать и где?



https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
232 1263573
>>63568
Здесь написано что WDK входит Studio 2017, но почему-то его нет!
233 1263583
>>63524
Карацуба и монтгомери. Слижи исходники у OpenSSL. Они на этом собаку съели (пару CVE поймали для случая с AVX-512)
234 1263584
>>63583
Уже давно прикручено и производительность я получил феноменальную. Каратсуба для 512 бит не нужен.
235 1263586
>>63584
Прикручено - это я про монтгомери.

AVX-512 классная штука, но мало где есть, мне разрешили только avx и avx2 использовать.
236 1263593
>>63586

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

Второй момент - реализовывать для прикладных проектов сегодня кривули - стоит. Причина проста - они меньше по размерам операндов, и немного так быстрее, вот только - нужно с особой осторожностью это делать: Juniper также съели на этом говна.
237 1263603
>>63593

>так как никакой компилятор тебе гарантировать не может что он без явного интринсика или asm-вставки


Собственно, большую часть арифметики я на асме и писал, потом линковался.
238 1263604
>>63426

Но зачем ебать RSA (с ключами, стремящимися к одноразовому шифроблокноту) если есть эллиптическая криптография с ключами в 10 раз короче при той же надежности?
239 1263605
>>63604
Собственно, изначальный автор как раз эллиптическую и реализовал, но отвечающие почему-то начали упоминать rsa.
240 1263659
void* array[] ахуенное решение всех проблем
241 1263661
>>63659
Достаточно void *ptr, а потом кастуешь как хочешь.
242 1263663
>>63661
Вот преимущества слабой типизации!
243 1263690
>>63427

> 256 же


Блядь, вот когда написал, так и подумал, что кто-нибудь обязательно возведет и решит, что это про биты. Да, оно GF(256), но в форме GF(28) нагляднее: 8 - это степень полинома, у коэффициентов которого арифметика по модулю 2. Т.е., это 8-битный байт с XOR в качестве сложения-вычитания и хитровыебанными умножением и делением (тоже по модулю).

> И да, там по всей группе значения перемешиваются.


Это ближе к SIMD.
244 1263709
Привет, объясните довену про то что такое стек. И принцип работы функции printf со стеком. А также почему так: вот допустим: double a=10; //допустим дабл 8 байтов
Long c=5,d=100; //допустим лонг 4 байта
И если вызову printf(“%ld %ld %ld”,a,c,d); то первые двачисла будут выведены рандомные а третье выведенное число будет выведено правильно. Разве не должно быть типа первый %ld читает последние 32 бита из стека, и вторые два %ld читают еще по 32 бита из стека и по идее вроде как должно выводить первое число рандомно но два последних правильно хотя на деле так как я выше написал. В общем подозреваю во всем то что не понимаю что такое стек и как работает, выручай анон
245 1263796
>>63709
Ты понимаешь, что такое стек. Но забываешь, что у тебя там наверняка 64-битный код, а 64-битные конвенции вызова передают часть аргументов через регистры. Подробнее https://en.wikipedia.org/wiki/X86_calling_conventions#x86-64_calling_conventions или просто на годболте смотри дизасм.
246 1263875
>>63523

>Ты, наверное, имел ввиду 8192.


Да.

>Но зачем?


Как тут:
https://www.thechiefmeat.com/pgp/

>Для RSA-то понятно, но свою математику я использовал для эллиптической криптографии, а там в основном ключи 256 / 512.


Если это действительно арифметика произвольной точности (точность которой задана),
то она подойдёт для чего угодно ввиду своей универсальности.
Главное чтобы с числами такой длины можно было оперировать быстро, производя при этом с ними - все основные арифметические операции,
из которых потом как из инструкций могут комбинироваться n-битные программы.
>>63524

>каратсуба


>>63583

>Карацуба и монтгомери. Слижи исходники у OpenSSL. Они на этом собаку съели (пару CVE поймали для случая с AVX-512)


Там где можно ускорить операции, чё бы и не ускорить их.
Но ИМХО, качественно написанная n-битная арифметика - уже должна быть оптмальна по коду и скорости, сама по себе.
>>63584

>Каратсуба для 512 бит не нужен.


И вот здесь где-то, у этого, должен быть пример 512-битного умножения не хуже карацубы.
>>63583

>Прикручено - это я про монтгомери.


А у тебя алгоритмы Монтгомери быстрее работают, чем на арифметике?

>>63604

>Но зачем ебать RSA (с ключами, стремящимися к одноразовому шифроблокноту)


>если есть эллиптическая криптография с ключами в 10 раз короче при той же надежности?


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

>>63690

>Т.е., это 8-битный байт с XOR в качестве сложения-вычитания и хитровыебанными умножением и делением (тоже по модулю).


Хочешь сказать, что GF(28) = GF(256) как и байт имеет лишь 256 состояний?
Посмотри лучше на Число возможных различных состояний кубика Рубика
(8! 38-1) (12! 212-1) 2 = 43 252 003 274 489 856 000, то есть более 43 квинтиллионов комбинаций.
246 1263875
>>63523

>Ты, наверное, имел ввиду 8192.


Да.

>Но зачем?


Как тут:
https://www.thechiefmeat.com/pgp/

>Для RSA-то понятно, но свою математику я использовал для эллиптической криптографии, а там в основном ключи 256 / 512.


Если это действительно арифметика произвольной точности (точность которой задана),
то она подойдёт для чего угодно ввиду своей универсальности.
Главное чтобы с числами такой длины можно было оперировать быстро, производя при этом с ними - все основные арифметические операции,
из которых потом как из инструкций могут комбинироваться n-битные программы.
>>63524

>каратсуба


>>63583

>Карацуба и монтгомери. Слижи исходники у OpenSSL. Они на этом собаку съели (пару CVE поймали для случая с AVX-512)


Там где можно ускорить операции, чё бы и не ускорить их.
Но ИМХО, качественно написанная n-битная арифметика - уже должна быть оптмальна по коду и скорости, сама по себе.
>>63584

>Каратсуба для 512 бит не нужен.


И вот здесь где-то, у этого, должен быть пример 512-битного умножения не хуже карацубы.
>>63583

>Прикручено - это я про монтгомери.


А у тебя алгоритмы Монтгомери быстрее работают, чем на арифметике?

>>63604

>Но зачем ебать RSA (с ключами, стремящимися к одноразовому шифроблокноту)


>если есть эллиптическая криптография с ключами в 10 раз короче при той же надежности?


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

>>63690

>Т.е., это 8-битный байт с XOR в качестве сложения-вычитания и хитровыебанными умножением и делением (тоже по модулю).


Хочешь сказать, что GF(28) = GF(256) как и байт имеет лишь 256 состояний?
Посмотри лучше на Число возможных различных состояний кубика Рубика
(8! 38-1) (12! 212-1) 2 = 43 252 003 274 489 856 000, то есть более 43 квинтиллионов комбинаций.
247 1263894
>>63875

>А у тебя алгоритмы Монтгомери быстрее работают, чем на арифметике?


Да, намного.
1533005569229.png418 Кб, 492x493
248 1263900
Кто-нибудь в этом ИТТ треде занимается разработкой прикладных программ с нуля на Си? Не для микроконтроллеров и т.п., а просто запускать на компьютере? Если да, то можете обосновать за щёку свой выбор?
Я начал писать нужную себе программу и слегка подохуел от нужного, но, в целом, лишнего кода, если бы я писал в любом другом достаточно популярном сегодня языке программирования.
Я пишу достаточно плохо, поэтому два дня я провёл разворачивая сегфолты. При этом Си для меня единственный на данный момент язык, в котором я чувствую себя уверенно.
249 1263902
Доброй ночи. Посоветуйте материалов (если можно, лекций, видосов, интерактива) на тему работы с памятью. Маллок, каллок, реаллок, фри — что там под капотом, как это всё работает, как его можно улучшить и почему не нужно.
Ну или скажите, как вы эту тему осваивали?
250 1263905
>>63900
Пишу прототипы на питоне, рано или поздно перекатываюсь на сишечку, мне норм. Кресты не нравятся, больше выбирать не из чего.

>>63902

> что там под капотом, как это всё работает


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

> как его можно улучшить


Тема на очень толстую книгу.
251 1263920
>>63905
Руст
252 1263938
>>53747 (OP)
Можно ли как-то сделать, чтобы файл записался после

>system("pause");


?

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

Надо сделать так, чтобы до pause - он уже записался.
253 1263942
>>63902

>что там под капотом



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

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

https://github.com/lattera/glibc/tree/master/malloc
254 1263944
>>63938
fflush(fp) или fclose(fp). Внезапно.
255 1264008
>>63944
Не-а, всё равно надо клавишу нажимать или окно закрывать. Иначе - в файле пусто...
256 1264058
>>64008
Хэххэх.
Сначала подумалось что он фитиль какой-то зажёг, показывая на понтах как стартует Falcon9,
затем чё-то показалось что это кальян - оказалась сигара "с травкой" по словам Джо Рейгана...
Там, внутри травы, насколько я знаю есть тетрагидроканнабинол, принадлежащий более широкому классу вещество - терпеноиды.
Многие из них проявляют свойства антиоксидантов, и противоопухолевых препаратов.
Их даже рассматривают как потенциальные геропротекторы.
257 1264096
>>61857
Пришёл к этому - вот так: http://rextester.com/TBY4587
258 1264124
Сразу не пинайте. В С вообще возможно сделать хотя бы примитивный платформер с графикой и какие средства для этого нужны? Помню даже в паскале я рисовал круги анимировал их. А тут только одна консолька.
260 1264132
>>64124
>>64130
https://www.libsdl.org/download-2.0.php

Для сишки лучше варианта нет, поддерживается везде, есть в репах, в стике куча игр написанных таким образом, даже под steamos вальвы обновляют.
261 1264133
>>64130

> These tutorials were designed for C++ programmers


У нас же тут тред не про с++ же?
262 1264134
>>64133
Я лично проходил эти туториалы и билдился с gcc, несмотря на то, что автор использует g++. Код весь сишные, либа написана на си и в первую очередь для использования с си (хоть и не только).
Брат жив.
263 1264138
>>64133
>>64134
Хотя да, я не прав. Посмотрел некоторые - там он использует классы, но не суть. Всё равно всё понятно и на си прекрасно либой можно пользоваться.
264 1264224
>>64138
мне вот интересно - а как писались игры на С во времена доса без всяких этих API?
265 1264231
>>64224
Всегда было какое-то апи.
А до него рисовали командами "покрась точку 32:16 в цвет 114.

Вон, в играх на пс1 (писались на си) через контроллер, замаппленный на участок оперативки, передаются группы байт, являющиеся командами "нарисовать примитив такой-то с координатами такими-то". Но и это упаковывалось в некоторое апи в виде стандартной библиотеки пс1.
266 1264234
>>64231
А какое апи использовал тот же дум 1-2?
267 1264251
>>64008
Быть такого не может. Тащи код.

>>64132

> Для сишки лучше варианта нет


Есть. Выкинуть SDL и накидать создание окна вручную.

>>64234

> А какое апи использовал тот же дум 1-2?


Никакого. Ну если не считать вызовы BIOS для установки видеорежима. А так он рисовал прямо в видеопамять попиксельно.
268 1264315
>>64251
Создать окно вручную? Как?
269 1264350
>>64315
CreateWindowEx/XCreateSimpleWindow
allahuakbar(1).png340 Кб, 521x938
270 1264398
привет, я правильно все делаю?
271 1264427
>>64398

>я правильно все делаю?


Фотографируешь книги? Нетъ
272 1264428
>>64398
Осталось начать дебажить и писать код на листке.
273 1264439
>>64251

>Выкинуть SDL и накидать создание окна вручную.


Это ж ебануться можно - писать таким образом кроссплатформу.
Хотя это никакая не кроссплатформа уже.
274 1264452
>>64439

> Хотя это никакая не кроссплатформа уже.


Из коробки кроссплатформенными бывают только хелловорлды. Для чего-то более сложного всегда нужны куски кода под конкретные платформы.
275 1264471
Под какую музыку вы кодите на Си?
Понимаю что кодить лучше в тишине, но у меня нет такой возможности
276 1264473
>>64471
Драм энд бэйс.
278 1264651
>>64477
Пишу на си и плюсах.
Замазал языки и скинул своей тян, спросив кто я. Вышло, что я перл.
279 1264653
Спросил ещё пару человек, замазав языки, — тоже перл.
Пиздец.
280 1264658
>>64653
>>64651
Просто они знают, что ты хуесос, а сигарета символизирует хуй.

Но это лично моё мнение. Обижаться или принять как данность твоё дело.
281 1264665
>>64658
А ведь я даже не курю, кхе-хе.
282 1264670
>>64665
А я курю!
мимо-кернел-девелопер
283 1264673
>>64651

> своей тян


Кому ты пиздишь, анимедаун?
284 1264707
>>64665
А я где-то писал, что ты куришь?

> Просто они знают, что ты хуесос

285 1264771
>>64670
Сосешь
мимо-тесла-девелопер
sage 286 1264774
>>64651

>Пишу на си и плюсах


Пруф или не было.

>Замазал языки и скинул своей тян


А она тебя добавила в чс, потому что такую хуйню только конченый олигофрен скинет. Хотя какая тян, кому ты пиздишь?

>Вышло, что я перл


Вышло, что ты пёрнул в тред, пидор гнойный.
287 1264791
>>64774
Что с тобой не так?
288 1264813
Чем с++ принципиально отличается от С кроме ооп? Можно ли на С сделать все то же самое что и на С++ и почему С не умер с приходом последнего?
289 1264829
290 1264838
Вечер в хату пацаны. Какие перспективы овладения чистым си? Легаси? Эмбедед? Светит ли какая работа без знаних линейной алгебры и диффуров или лучше в джаву переучиваться пока не поздно?
sage 291 1264844
>>64838

>Какие перспективы овладения чистым си?


60тр в НИИ им. Сраниченко
292 1264853
>>64844
Без знания высшей математики? В НИИ? Точно?
293 1264873
>>64829
Охуенный ответ блядь. А можно более подробно?
294 1264880
>>64873
Ну ты дурак или родом так? Чтобы ответить на твой вопрос проще книгу написать.
295 1264882
>>64813
Бля, ну давай моё мнение с моей скромной колокольни. Есть фразочка на хабре вроде гуляет: "на с++ я могу написать всё что угодно... На Си я могу написать с++" На си писали отцы. Линукс написан на сях чистых. Так что щитай, что большая часть интерената функционирует за счёт чистых сей. Я вот лично думал как организовать полиморфизм в сях. И ничего кроме вызовов функций по объединениям в качестве агрументов не придумал. Хотя это костыльное, как мне кажется, решение. Наследование делается через вложенные сруктуры и функции в них. Инкапсуляция это хуйня какая-то о которой не помню. Но если ты не еблан и пишешь собственный с++ на сях, то в ногу не выстрелишь, память не расплескаешь и методы структур не будут изменяться. А вот Страуструп в своей книжке, кстати вообще за памятью не следит и некоторые сурцы у него текут, ага. Пруфы сам нароешь.
296 1264883
>>53747 (OP)
Как проверить является ли аргумент или строка числом uint64_t?
Есть ли функции наподобие isNumber(str)//true, false
297 1264884
>>64251

>Быть такого не может. Тащи код.


Всё, решил, я просто выше пауз ещё понаписывал.
298 1264885
>>64883
В смысле строка uint64_t? У тебя вроде как по умолчанию строка содержит char по одному байту (8 бит). И твоя строка содержит 8 ASCII-символов, которые могли бы уместиться в uint64_t. А чтобы узнать состоит ли у тебя строка из циферок, то прогони в цикле каждый символ, чтобы его шестнадцетиричный код лежал в диапозоне от 0x30-0x39. и Правая цифра после 0x3? будет твоей цифрой ASCII.
299 1264889
>>64885
Чиво блядь? Ты хоть представляешь сколько цифор на свете? Их бесконечное множество! Как я в цикле могу их прогнать? Сначала кумекай, потом кукарекай! Что мне от 0 до 9 даст цикл, если мне надо проверить что-то за пределами этого диапазона?
300 1264890
>>64889
Чо сказать-то хотел?
301 1264891
>>64890
Ну ты и тупой! Прежде сем хуйню советовать думай!!!
302 1264912
>>64883-кун на связи...
Я не этот >>64889

Итак... Что тут у нас?..
>>64885

>В смысле строка 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.
Всё в отельную функцию пхнул и работает как надо.

>>64889

>Чиво блядь? Ты хоть представляешь сколько цифор на свете?


Их radix, на самом деле в числе.

>Их бесконечное множество!


Не все считают в бесконечноричной системе счисления, как ты.

>Как я в цикле могу их прогнать?


По цифрам, очевидно же. В идеале - по битам.

>Сначала кумекай, потом кукарекай!


Этот залётный, потроллить решил.

>Что мне от 0 до 9 даст цикл, если мне надо проверить что-то за пределами этого диапазона?


Ну, смотри сюда, что-ли: http://rextester.com/ZYP23810

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

>>64891
ЛАЛ.
302 1264912
>>64883-кун на связи...
Я не этот >>64889

Итак... Что тут у нас?..
>>64885

>В смысле строка 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.
Всё в отельную функцию пхнул и работает как надо.

>>64889

>Чиво блядь? Ты хоть представляешь сколько цифор на свете?


Их radix, на самом деле в числе.

>Их бесконечное множество!


Не все считают в бесконечноричной системе счисления, как ты.

>Как я в цикле могу их прогнать?


По цифрам, очевидно же. В идеале - по битам.

>Сначала кумекай, потом кукарекай!


Этот залётный, потроллить решил.

>Что мне от 0 до 9 даст цикл, если мне надо проверить что-то за пределами этого диапазона?


Ну, смотри сюда, что-ли: http://rextester.com/ZYP23810

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

>>64891
ЛАЛ.
303 1265060
>>64883
strtoull, посмотреть результат и проверить, что после вызова указатель указывает на '\0'.
304 1265066
>>64882
Покажи свой С++
305 1265158
>>53747 (OP)
Смотрите:
char x = '\t'; //символ
printf("x = \%c", x); //print string 'x5 = TAB' <------ хуле тут слэш не котируется? Ожидалось '\\t' -> '\t'
printf("\n");

Шо нема разве функций по эскапу унескапу чарактеров?
Вкиньте я их сразу инклюдить буду, а то по свичу писать в каждое условие ну не очень удобно...
306 1265181
>>65158
Вот тут https://stackoverflow.com/questions/29477345/how-to-print-special-characters-explicitly-in-c
лежит функция escape с большим свичем. Называется она str_escape(char str[])
Что она делает? А как раз-таки - эскапает стринги и чарактеры.
И вот так юзается она: http://rextester.com/EQH57181
307 1265183
>>65158
а ты не пеши а сделай:
char unecsape[128][] = {"\\0", "\\1",...}
и потом пишеш
printf("%s\n", unecsape[x])
308 1265202
>>65183
Это не unescape, а escape. Для unescape нужно парсить строку.
image.png15 Кб, 518x168
309 1265268
Установил себе gcc на ubuntu,
но вот команда не работает? Может я что-то сделал не так?
310 1265273
>>65268
Красава, заебись установил.
312 1265277
>>65274
В прыщах, и в убунте особенно, архивы с исходника и ко-ко-компелировать необходимо прежде чем использовать. Если пакет изначально не был предкококомпелирован.

А так убунта тебе поямо сказала что тебе необходимо сделать, чтобы гцц встал и ко-ко-компелировал твой говнокод.
313 1265280
>>65277
sudo apt install gcc я прописывал..
Он что-то прогрузил там, но один хуй не работает
314 1265281
>>65280
Ну милый мой, ответ я твой не принимаю

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



Я не ванга, что дать ответ на такой расплывчатый вопрос
315 1265287
>>65281
А вот, со второго раза установилась.. ОМГ
316 1265305
>>65268
Ты забыл указать.

>-o compiled.exe


и аргументы, параметры, там ключи всякие.
Введи gcc -help
317 1265312
>>65183
Ой бро, да ты же, внатуре, ескапать пытался. Для эскапа я функцию запостил выше.
А постой. Что это у тебя тут? Хеш-таблица, с ключами и без значений?
И двойной массив какой-то, многомерный что-ли?
Ты туда x засунул в [x] - для чего? Это символ должен быть в виде переменной?
А как тогда тройной ключ в хеш-таблице внутри строки искать?
Там три символа, по три читать что-ли?

>>65202

>Для unescape нужно парсить строку.


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

P.S.: в итоге пришёл, через гугл - к функции atoi()
318 1265313
>>54644
Пока самая главная проблема Rust'а - слишком быстрые изменения. Язык пока ещё не совсем устоялся, бывает, что ломается синтаксис, и либу, которую полгода назад тащил в cargo.toml, сегодняшней версией компилятора уже не собрать, потому что DEPRECATED
319 1265315
>>64912

>http://rextester.com/ZYP23810


Эта функция не работает для чисел с нулями впереди "00049846515". Как исправить не пойму.
320 1265318
>>65315
Чё-т вбрело strtok'ом по нулю в цикле проехаться, а потом компарить.
Может есть лучшее решение вроде неведомого memmove c этими его - амперсандами?
321 1265321
>>65305
Это необязательно, gcc предполагает имя по умолчанию.
322 1265327
>>65287
Может ты sudo забыл в первый раз написать, когда устанавливал? Или пароль неправильно ввёл.
323 1265329
>>65066
Блять, я всего лишь предложил способ извратиться и написать свой с++ на сях. Это же не значит, что я реально буду извращаться и фистить себе анал на с++, как Страуструпы всякие.
324 1265332
>>65181
Там надо memset(buffer, '\0', sizeof(buffer));
вставить, а то хуйня какая-то там, в первых трех символах.
325 1265333
>>65312

>Ты туда x засунул в [x] - для чего? Это символ должен быть в виде переменной?


да

>А как тогда тройной ключ в хеш-таблице внутри строки искать?


а зочем
вот у аноньчика символ x = '\t'
у него будет хранится в x девятка, есле её вызвать как число
потом мы хотим сделать этот таб пичатаемым
мы просто напишим unexcape[x] и под этим адрисом будет у него строчка "\t", илижи "\\t\0", есле быть точным
326 1265342
>>64813
ООП, разрушение объектов при выходе из области видимости, исключения, шаблоны, перегрузка операций

>почему С не умер с приходом последнего


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

>>64882
Многие писали велосипедное ООП с полиморфизмом на С. В геймдеве это было обычным делом в 90е.
327 1265378
>>65333
Я уже ескпал функцией со свичем, но твой пример я тоже не забыл.
Поигрался с ним, и вот что получилось: http://rextester.com/OGRD62658
Не знаю правда насколько правильно оттуда возвращать '\1' '\2' '\81'
но вроде-бы строки совпадают. Однако всё это дело - не унескапает,
и надо как-то циклом парсить...
328 1265395
>>65342

>Многие писали велосипедное ООП с полиморфизмом на С. В геймдеве это было обычным делом в 90е.



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

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

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

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

А анекдотов про боевых байтопидорасов (вот в наше-то время, ууууххх!!!!, не то что вы скрипто сосунки кхекхекхекококо, вот тогда то только байты ебали, ууу прямо на ассемблере с сишными вставками, кококо) уже потом с подачи кармака и его кодлы позёров и графоманов насочиняли.
329 1265396
>>65395
Так как раз кармак в квейке 1,2 и делал ООП на С. На счет 3 части не уверен на чем они ее писали.
330 1265397
>>65396

>Так как раз кармак в квейке 1,2 и делал ООП на С



Так в квейке два он как раз вроде выкинул виртуальную машину и сказал "ебитесь с нативными DLL и вижуалстудией", а в третьей вернул вместе с конпелятором.
331 1265399
>>65396

Но я вообще к тому, что вот эта вся байтоёбская движуха с ассемблером началась именно с кармаковской компании, миха абраш в своих талмудах ссал всем тогдашним школьникам как ебать байты и быть крутым хакиром-гейдевелопером, А кармак и вовсе типа был богом и ПРИДУМАЛ ТРИДЕ-ГРАФИКУ11111.
332 1265400
>>65397
Разве наличие виртуальной машины обязательно для ООП?
333 1265409
>>65327
Или у него сеть отвалилась при первой скачке и при запросе к репозиторию ему ответили соси хуй.
давно программисты настолько отупели, что не могут даже по описанию понять в чем дело?
334 1265411
>>65395

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


Ясен хуй разрабы не стали бы срать семь мегаменов с нуля, или три финалки, или там драгон квесты какие.
Мегамены, впрочем, к отличным от других играм не относятся, в отличие от думов. Хотя, даже когда дум раз появился, мало кто егово второй раз переписывал.
335 1265417
>>65409
Ну, блять. Я себя впервые вспоминаю как вкатывался в пинус и в си соответственно, дак, блять, у меня попоболь не утихала постоянно. Начиная с того, что bash чувствителен к регистру и заканчивая английскими сообщениями компилятора. За год вроде уж привык к такому. Алсо вопрос. Сколько нужно, минимум, надрачивать си, чтобы уверенно себя начать чувствовать и топать на первые собеседования?
336 1265418
>>65417
Читаю книгу, еще первую главу. Чую на указателях вроде & сгорю нахуй. До этого разве что в школе под досом на бейсике писал программы. В 27 лет не поздно начинать учить язык?
337 1265419
>>65417

>Сколько нужно, минимум, надрачивать си, чтобы уверенно себя начать чувствовать и топать на первые собеседования?



До момента понимания сорцов ядра linux, использованных там приемов и уверенного написания helloworld-драйвера под него же.
338 1265421
>>65418
Ну, от тебя по крайней мере польза в том, что я в свои 23 не чувствую себя теперь стариканом, который поздно уселся учить Си. Ну, кстати я представляю как указатели работают в 32-разрядной архитектуре, но я так до сих пор и не понимаю как организована память в x86_64. А так вроде жеж это несложно... Просто представь всю оперативку как массив длинной 4 гига ну или сколько там у вас?. Каждый байт - это ASCII-символ. А указатель - это номер индекса этого огромного массива оперативки. И вот указатель позволяет получить содержимое этого символа(ака, байта, ака ячейки памяти). И строки напримр начинаются с определённого адреса(показываемого оператором &) и идут до бесконечности за границы твоей оперативки, пока не будет встречен нулевой байт. Это вкратце об атаке переполнения буфера, но сейчас, наверное, ей никого уж не пронять. Алсо есть вопрос... Стоит ли размер массива держать в нулевом элементе? Чтобы при работе с массивом исключать его нулевой элемент из обработки а в условии выхода из цикла ссылаться на этот нулевой элемент.
>>65419
Спасибо, анон. Как раз в декабре собирался за модули ядра усесться. Типо после НГ попробую жопу от дивана оторвать. В итоге я два чистых года учу Си и всего год только эффективно, по книгам и по педивикиям.
339 1265430
>>65421

>как организована память в x86_64



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

Ну и сегменты там в нули все выставлены.
340 1265434
>>65421

>Стоит ли размер массива держать в нулевом элементе?


так в паскале хранились строки. какие накладывает это ограничения, думою, сам понимаеш
в C11 появились безопасные версии функций которые сами прекращают работу при превышении числа элементов
можно ещо сделоть struct massiv {unsigned char rozmer; char bukvy} a; и обращатся через a.rozmer
а можно просто (unsigned char
)(&a) но компелятор может выровнять так что тебе придёться читать символы не с адреса (unsigned char)((&a)+1) а с адреса (unsigned char)((&a)+3)
341 1265439
Охуеть. Вообще-то я зашёл просто почитать, что творится нынче итт, а получил ответы на вопросы, которые меня уже две недели мучали.
342 1265440
>>65434
struct massiv {unsigned char rozmer; char⁕ bukvy} a;
a.rozmer
(unsigned char⁕)(&a)
(unsigned char⁕)((&a)+1)
(unsigned char⁕)((&a)+3)
ну ты понел
343 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);
}
344 1265446
>>65444

>while((c=getchar())!=EOF)


не делой так
ещё ты скобку забыл
345 1265450
>>65446
Как именно не делать? В книге именно так и пишут, говорят так запись короче.

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

while(c!=EOF
)

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

Где это у меня скобки нет? Все на месте же.
346 1265453
>>65444
EOF - это ctrl+d
или ctrl+z, если на форточках.
347 1265457
>>65453
А в андроиде? Если жму текст и потом ctrl+d то ничего не происходит. Приходится вводить текст, жать энтр, потом уже ctrl+d и тогда только работает. Получается я символ eof ввожу отдельно. Выглядит это вот так:

ghjfdyygfeuhtr
1
2
3
4
result: 4
348 1265458
>>65444

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

!=0x1B //ESC
349 1265465
когда структуру можно оставить на автоматическую аллокацию а когда нужно динамически память выделять? аноны хелп
350 1265476
>>65430

>первые 16 бит пока не используются


Потому что нахуй не нужно, так как и так помещаемся с головой?
351 1265477
>>65430

>Ну и сегменты там в нули все выставлены.


Вообще конечно очень удобно стало.
352 1265478
>>65465
Ситуативно.
353 1265485
>>65465
есле ты просто обьявляеш структуру, то память сама аллоцируеться
ты выделяеш динамически тогда, когда у тебя укозатель
354 1265495
>>65476

>Потому что нахуй не нужно, так как и так помещаемся с головой?



А потом, когда межгалактическая связь и квантово-многомерные штеуды попрут?
355 1265497
>>65446
Так как не надо делать то?
356 1265508
unsigned int и unsigned это же одно и то же?
Я могу просто писать unsigned, как пишут в некоторых старых туториалах или есть какие-то подводные камни (окромя нубопонятности)?

И еще одно: обязательно ли в объявлении типа int foo(void){return 666;} писать этот войд в скобках? Знаю, что работает и без него, но как это всё делать с т. з. best practice и coding style, кароч чтобы прям комильфо. Вы как делаете?
357 1265520
>>65508
если void внутри скобок не будет то формально функция принимает любое количество аргументов
358 1265530
>>65508
Ищешь MISRA-C и изучаешь.
359 1265549
>>65508
https://en.wikipedia.org/wiki/C_data_types#Basic_types
Если в одной строчке, то нет разницы, как видишь можно писать просто unsigned и просто signed.
360 1265554
>>65417
Хуй знает, я с си копался один семестр в универе, потом около года с++, с первого же интервью попал в неплохую компанию джуном по разработке кернел драйвера, вот за несколько месяцев вроде втянулся уже.
20-лвл
361 1265556
>>65421
Только указатели работают через пейджинг, и те адреса что ты видишь в дебагере это не адреса реальных ячеек памяти.
>>65554-кун
362 1265557
>>65476
В 32 битной системе вроде правые 12? бит это смещение по странице, а левый остаток это номер записи в таблице страниц.ну это не учитывая ещё что есть таблица таблиц страниц
363 1265560
>>65508
В кернел-коде обязательно писать и void и unsigned int
364 1265649
>>65327
Вроде нет, при неправильном вводе пароля система предупреждает.
Скорее всего сбой в загрузке был.
365 1265653
>>65421

> Алсо есть вопрос... Стоит ли размер массива держать в нулевом элементе? Чтобы при работе с массивом исключать его нулевой элемент из обработки а в условии выхода из цикла ссылаться на этот нулевой элемент.



По ситуации.. функция Malloc не забивает массив нулями , а его аналог Calloc забивает.
366 1265662
>>65653
Он говорит про содержание размера массива в самом массиве, а не про значения элементов внутри массива.
367 1265665
>>65653
Что мешает зделоть структуру где будет и размер и массив?
369 1265670
>>65667
Это приплюснутое говно, зачем оно здесь?
370 1265686
>>65421

> размер массива держать в нулевом элементе?


Зачем в нулевом, если можно в минус первом:
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]);
sage 371 1265687
>>65686
(length + 1) * sizeof(int), ну вы поняли.
372 1265689
>>65686
это какой то пиздец, зачем так?
373 1265693
>>65686
Что за пиздец.
Так писать не стоит, никогда.
sage 374 1265696
>>65689
>>65693
Это же очень часто делается. Например, у тебя есть либа (сишный рантайм, ОС и т.п.), которая хочет читать и писать массив (или, еще чаще, сишную строку), а еще хочет ее хранить, возвращать или передавать обратно тебе в колбек. При этом ты хочешь иметь полноценный динамический массив, т.е., хранить 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));
}
Делая это ты даже почти не нарушаешь сишный стандарт, и нет практически никаких подводных камней (кроме варианта, когда ты попытаешься прочитать дескриптор обычной строки, у которой этого дескриптора никогда не было).
375 1265701
>>65696
Попробуй такой код в ядро заапстримить.не знаю, где ты найдёшь этому место, но постарайся
sage 376 1265705
>>65701
Ты так говоришь, как будто ядро = ядро линукс, а у других ОС и приложений ядер нет.

Практически уверен, что в линуксе такое встречается в десятках вариантов, просто оно там по обыкновению обмазано макросами, поэтому ты и не замечаешь. Нет, искать и доказывать не буду. Тебе нужно - ты и ищи.
377 1265708
>>65705
Я говорю ядро, потому что первое, что приходит в голову при разговоре о си это ядро линукса.
Ну и там есть годный кодстаил.
378 1265717
>>65696
не вижу никаких преимуществ, если ты передаешь массив в либу, ты знаешь его размер и можешь хранить нормально, в структуре например, вместе с массивом
379 1265904
>>65667
крестоносец-долбаёб. УХАДИ. На плюсах пишут дауны. Это не я скозал. Это Deus Vult.
380 1265933
>>65904
Так пишут только люди, которые не занимались ничем профессионально.
алсо я работаю на си, т.к. пишу драйвер под линупс
381 1265938
>>53747 (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

Как правильно это сделать?
382 1265943
>>65938
Это стандартный little endian. Читаешь сканфом с с флагом %I64u
383 1265954
>>65943
Так и не понял где этот флаг ставить -
и решил с помощью fread, вот так:
http://rextester.com/UECYH23057
384 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 ничего дополнительно не происходит (а даже если и происходит?)?
385 1265991
>>65984
1 не нужно почти никогда, даже скорее никогда.
2 удобнее всего.
3 имеет риск быть неудачно прочитанным глазами, да и экономить строчки смысла нет.
386 1265994
>>65984
правельно никогда не ставить звёздочку после типа, а перед именим переменной

>(а даже если и происходит?)


а есле во втором между строчками что-то происходит, то у тебя в c90 это не заработаит
387 1265996
>>65994

>никогда не ставить звёздочку после типа, а перед именим переменной


Я тоже нахожу это логичным и пишу так, но никакого "правильно" в этом нет.
388 1265997
>>65994

>то у тебя в c90 это не заработаит


Это та параша, где нельзя переменную объявить в шапке for()? Нинужная версия.
389 1266001
>>65996
ну сматри какое дело
вот ты объявляеш
int a, b;
и b у тебя не int
, как можна было бы думать, а int
так что не надо
390 1266002
>>65996
ну сматри какое дело
вот ты объявляеш
int^ a, b;
и b у тебя не int^, как можна было бы думать, а int
так что не надо
391 1266005
>>66002
Я прекрасно знаю плюсы и минусы всех трёх подходов.
392 1266006
>>65158
Ну так шо, посоны?
Как '\\t' в '\t' унескапнтуть?
393 1266009
>>66006
Иди нахуй.
394 1266076
>>66009
Но там занято, там ты. А ты там не подскажешь как унескапнуть?
395 1266092
Почаны. Накидайте гайдов по GTK. Это же вроде как графика на си, да? Или как?
396 1266096
>>66092
Мне кажется под си, чего-то свежего, кроме офф документации особо не найдешь.
https://developer.gnome.org/gtk3/stable/ch01s03.html
Могу только сказать, используй Glade и билдером подключай, так проще будет. Хотя в глейде могут отсутствовать какие-то свойства виджетов и приходится их руками дописывать.
sage 397 1266114
>>65991

> 1 не нужно почти никогда, даже скорее


никогда.
if (...) { x = 10; xptr = &x; } else { z = func(); xptr = &z; }
398 1266120
>>66114
Да, чот тупанул.
399 1266415
>>53747 (OP)

>Очевидный GCC.


Не забываем ставить флаги оптимизации при компиляции. Как например, флаг -O3, ускряющий софтину.
Подробнее про O3 - тут: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
400 1266417
Да
Да 111222333 401 1266418
Да
402 1266437
Значит, программисту не надо ебаться с байтами, компилятор все сделает за него?
403 1266438
>>66437
С байтами можно, вот с машинными кодами точно не надо.
404 1266491
>>66114
Меня этот пример сбил с толку. Что это означает?

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

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

или

int x = 10, ^xptr = &x;

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

У меня старенький препод требует, чтобы строго как в первом было. Отдельно в самом начале функции все переменные объявили (каждую в свой строке с ; в конце). Потом строчку отступили и дальше инициализируем по мере надобности. Я не понимаю, чем продиктовано такое ограничение. Подозреваю, что из каких-то древних эпох. Но за варианты типа
int x = 10;
int ^xptr = &x;
нещадно бьет по рукам и говорит нельзя, не буду мол, даже и объяснять ничего.
Что с ним не так?
405 1266526
>>66415
У меня, почему-то, cmake с релизным флагом собирает более производительное приложение, чем я ручками с -О3. Видимо, в -О3 не всё включено.
406 1266528
>>66491

>А можешь тогда назвать ситуации, где реально нужны и лучше работают подходы 1 и 3:


Там речь не об этом, а о том, где звёздочку ставить.

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

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

int x = 10, ^xptr = &x;
А так не очень хорошо читается, на двух строчках лучше, чем на одной.
407 1266547
>>66438
А пробелы и табы можно сколько угодно хуячить? Компилятор же их игнорирует полностью?
408 1266569
>>66547
Пробелы для отступа - да.
А в выражениях а---с пробелы надо.
409 1266735
>>66415
gcc -Wall -Wextra -Werror filename*
norm
sage 410 1266770
>>66491

> объявлять и инициализировать сразу


Не всегда возможно, о том и был пример с if.

> У меня старенький препод требует


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

> Подозреваю, что из каких-то древних эпох.


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

>>66528

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


В данном - нет. Если есть возможность инициализировать при определении переменной - нужно инициализировать.

>>66735

> -Werror


И куча отключенных, хороших предупреждений, которые могли бы сэкономить тебе время. Или куча анального ублажения компилятора и нечитаемого кода из-за этого. Попробуй с clang -Weverything -Werror собрать что-нибудь более-менее крупное, лол.
411 1266773
>>66491
Почитай код ядра линукса, посмотри как там выглядит блок инициализации, тебе не нужно думать, что там происходит, просто посмотри как выглядит объявление.
ядро це канон
Реверс кристмасс три ордер декларейшен навсегда в моём сердце
412 1266783
>>66773

>ядро це канон


Какон говнокодинга и непродуманной архитектуры. Еще гит вспомни, хрюн.
sage 413 1266784
>>66773

> тебе не нужно думать


Вся суть. А между тем там протухший C89 с расширениями и куча абсолютно ебнутых решений вроде явного использования struct вместо typedef.
414 1266947
>>66783
А с гитом-то что? Он же работает вроде, или нет?
415 1266986
>>66783
Гит - стандарт контроля исходных кодов, какие проблемы?
416 1267065
Бля, я вот понять не могу, почему когда я через scanf ввожу в int переменную число, ей передается какое-то ебанутое значение -858993460, хотя вроде везде говорят, что там должен быть 0? Другой момент: почему при реализации этого куска кода (https://pastebin.com/rJxchrEQ) scanf просто игнорируется и программа зацикливается?
417 1267070
>>67065

>(https://pastebin.com/rJxchrEQ) когда я ввожу букву, scanf просто игнорируется и программа зацикливается?

418 1267215
>>66986

>стандарт контроля исходных кодов


только среди смузихлебов с подворотами
419 1267284
>>67065
УМВР.
Ты уверен, что у тебя функция scanf_s существует, а не просто возвращает мусор по счастливой случайности?
sage 420 1267290
>>67065

> -858993460


0xcccccccc, т.е., неинициализированная область стека. Т.е., твоя функция НЕ работает и возвращает тебе 0, а ты ее результат не проверяешь.

>>67215
Хранишь код в CVS?
Алсо, не используй _s функции. Это дерьмо от Microsoft, и место ему на помойке. Скажи
#define __STDC_WANT_LIB_EXT1__ 0 и/или #define _CRT_SECURE_NO_WARNINGS перед всеми инклудами, чтобы тебе перестали ее продавать.
421 1267293
>>67290

>Хранишь код в CVS?


Что в этом плохого?
422 1267294
>>67290

>Алсо, не используй _s функции. Это дерьмо от Microsoft, и место ему на помойке.


Разве они не определены в C11?
И почему их лучше не использовать?
sage 423 1267299
>>67294

> Разве они не определены в C11?


Оно optional. И весь Annex K признали ошибкой и вроде даже обещали задепрекейтить в C18/20, или когда он там выйдет: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm

> И почему их лучше не использовать?


Вкратце: никому нахуй не вперлось, неудобно, избыточно и ненадежно. Если тебя в каком-то конкретном случае волнует, обрезало ли тебе строку при snprintf - возьми и проверь возвращаемое значение.
424 1267304
>>67299
Я так понял, с этими функциями всё равно вывалишься в сегфолт, только дольше?
sage 425 1267309
>>67304
Нет, ты можешь зарегать функцию, которая скажет юзеру "до свидания" или можешь попросить ничего не вызывать, потому что ты будешь проверять код ошибки. Фактическое отличие от обычных функций в том, что ты дополнительно передаешь еще больше размеров (обычно ненужных) и в том, что они считают, что если что-то куда-то не влезло и обрезалось - то это ошибка, в то время как обычные функции пихают сколько влезло.
426 1267348
>>54645

>лексированием


вот блин, это так нужно называть похоже, если ты пишешь хрень которая разбивает текст на части - лексемы, токены? а я это регекспом называл, но у меня нет никакой замены, никакой манипуляции над текстом.
427 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.



что-то я совсем запутался. значит есть лексирование-токинизирование - разбивка текста на какой-то минимальный смысл, с высоты которого которые позже будет анализировать парсер. но в принципе, если я не конвертирую сегменты текста, то это просто сканер? - как часть лексера.
428 1267360
но конечно, сканер это уже слишком общее, размытое название. получается пишем лексер, предполагаем сканер. какая же проблема, всё нужно как-то и чем-то называть.
image.png9 Кб, 1033x142
429 1267569
>>53747 (OP)
Как же бесят эти предупреждения. Пишу русскими буквами в printf(), на консоль всё выводится нормально, но компилятор всё равно меня предупрпеждает. Почему? Я что, не имею права на русском писать? Можно это как-нибудь отключить? Ещё хочу предупреждение о пропущеном типе функции отключить, я-то знаю, что по-умолчанию там int и поэтому не пишу, но он меня опять-таки предупреждает постоянно. Компилятор LLVM, кстати.
430 1267576
>>67569
Там нормальным английским языком написано, проблемы с кодировкой.
Если у тебя русский в Юникоде, тогда ищи, как работать с Юникодом в Си.
431 1267580
>>67569
Ну там же написано, -Winvalid-source-encoding убери из опций конпелятора.
image.png2 Кб, 744x59
432 1267584
>>67576

>Unicode


>LLVM


хех.
433 1267585
>>67580
Я понял, но я не знаю как это сделать.
434 1267588
>>67584

> utf-16


почему не 8?
image.png6 Кб, 635x199
435 1267589
>>67588
Потому что с UTF-8 он выдаёт вот это.
436 1267591
>>67589
бедные виндаводы, сколько слёз утекло, а сколько ещё наплачется.
437 1267594
>>67591
Gcc таких предупреждений не выводит, так что венда тут не причём.
438 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], т.к. массив начинается с нуля, нет?
439 1267681
>>67674
Чего я подумал, так ведь даже -1 не надо делать, если считать тоже от нуля. Тогда какой вообще смысл в с-'0'?
440 1267697
>>67674
Отнимают код символа 0 чтобы перевести символ в число.
441 1267698
>>67674
Короче в твоем примере подсчитывается количество встреченных символов разных цифр (в массиве ndigit[10]) и пробелов/табуляций (в nwhite).
442 1267737
>>66528
>>66770

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

Кстати, если локальный кодинг-стайл запрещает делать пустые строки, это чему-то хорошему учит? Я просто привык логически отделять, а портянка на 20+ строк кажется даже эстетически… что ли неприятной. Как вы ставите пустые строки?
443 1267744
>>67737
Ты можешь делать пустые строки, но они должны быть буквально пустыми, без пробелов/табов на этой строке.
444 1267745
>>67744
Но если твой препод требует по-другому - делай по-другому.
445 1267746
Интересная статья
https://habr.com/post/304034/
447 1267748
Так же очень мотивирующая статья.
https://habr.com/company/nixsolutions/blog/265427/
448 1267750
Скажите, а где в памяти хранятся аргументы, с которыми мы вызвали программу? ну, например ./a.out "Oh long John" "Oh don Piano"
Где эти строки будут записаны? В стеке/на куче? В сегменте данных? Кто автоматически ставит в них \0 в конце, чтобы можно было с ними работать как со строками через argv?
449 1267751
>>67746

>https://habr.com/post/304034/


Ты автор? Статья может и интересная, но не существует настолько интересной темы, чтобы ради нее продираться через настолько деревянный текст. Еще раз промптом с китайского и обратно переведи.
450 1267754
>>67751
Нет, автор не я. Кстати я тоже заметил, что с текстом что-то не так,лол.
Правда я почему то подумал, что это я недостаточно хорошо знаю русский, для того что бы понимать сложные научные текста. Я и не подумал, что кто-то это переводил.
451 1267772
>>67744
А на что это влияет? Кроме того чтобы мне вдруг захотелось спрятать исходник на Whitespace внутри исходника на C?
452 1267871
>>67754

>Я и не подумал, что кто-то это переводил.


>habr


Что ты ожидал на этой помойке? Почитай еще хвалебные комментарии местных говноедов
453 1267880
>>67697
А зачем это делать? Разве во всех кодировках '5' не равно "5"?
454 1267893
>>67750

>Кто автоматически ставит в них \0 в конце


система.
вероятно, если бы это было не так, это делалось бы в коде до main - забыл название.

>>67750

>Где эти строки будут записаны?


какая разница, например, не обязательно что вообще, стек будет существовать. просто это данные в которые можно писать.
455 1267908
>>67880
Гугли "не явное преоброзование"
Это преобразование из char в int
а если +'0' то наоборот
456 1267935
>>67772
Кроме читаемости ни на что.
если ты про пробелы/табы в пустой строке это просто требование для кола в ядре, модель пропустить свои исходники через checkpatch.pl и посмотреть, что он тебе выдаст, но там много требований именно к внешнему виду, что будет противоречить, скорее всего, требованиям твоего препода :^)
457 1267938
>>67569

> Я что, не имею права на русском писать?


Имеешь, но делаешь это неправильно. Выставь -finput-charset=UTF-8 (хотя оно и так по умолчанию, поэтому оно и ругается на исходник в 1251) и -fexec-charset=cp1251 (или cp866, или что тебе там нужно), и не забудь пересохранить исходник в UTF-8. Можешь еще попробовать -finput=charset=cp1251 (или cp866), но у шланга вроде с этим какие-то проблемы были, да и хранить код в чем-то кроме UTF-8 - это плохой тон.

> я-то знаю, что по-умолчанию там int


Начиная с C99 уже нет. Добро пожаловать в будущее и хватит писать говнокод.
458 1267941
>>67569

>я-то знаю


Все, что делается неявно лучше делать явно, это как минимум защита от возможных изменений в компиляторах.представь что твой говнокод в попенсорсе, ты же и представить не модель на чем его попробуют собрать
А уж неявный инт это мало того, что помогает избавиться от лишнего времени поиска бага, если вдруг что-то подменяют, но ещё и увеличивает читаемость кода.
459 1267949
>>67941

> ты же и представить не модель на чем его попробуют собрать


Вот тут ты не прав. Либо компилятор соответствует стандарту, либо это компилятор си-подобного языка, с которым не нужно поддерживать совместимость.
460 1267957
>>67949
Тебе уже сверху ответили про C99, я имел в виду, что версия компилятора относится к конкретному стандарту
461 1268052
>>67957
>>67941

>Все, что делается неявно лучше делать явно, это как минимум защита от возможных изменений в компиляторах.



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

пусть пишет на каком хочет стандарте. а то каждая недозревшая, и дозревшая, сперма, советует что делать - программистская культура.
462 1268054
хотя конечно, оно понятно, не обижайтесь. но в конце концов, неявный тип инта - ну что такого, все типы преобразовываются к нему при арифметике, и ничего, живём.
463 1268056
в смысле все меньшие. но ты же не всегда знаешь какой будет меньше, оперируя полями структур.
464 1268075
>>68056

> но ты же не всегда знаешь какой будет меньше, оперируя полями структур


Ты пишешь на языке, где тебе дали контроль вместо безопасности. Если ты чего-то не знаешь - ты идешь и смотришь объявление.
Screen Shot 2018-09-22 at 2.03.29.png203 Кб, 1067x565
465 1268078
>>53747 (OP)
Почему работает __uint128_t и __int128_t на 64-бит компе? Это какая-то эмуляция?
466 1268092
>>68078
uint128_t может быть реализован как пара 64-битных регистров, сложение/вычитание через adc/sbb, 128-битное делимое x86-64 и так умеет, умножение и делитель - отдельной функцией. Алсо, ты кастишь к long double, который вполне может быть 80-битным. Алсо, все это может работать хоть на 8-битном компе, если разработчики компилятора запилят поддержку.
467 1268241
>>67938
А что такое говнокод?Какая разница как он пишет, если код работает нормально?
468 1268244
>>68078
При вылезании за границы проблемы вызывает не реализация умножения, а его атомарность.
469 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;

Что мне делать, чтобы появились эти заветные ошибки?
(И как они вообще появляются? Я привык к такому языку, где в исключительной ситуации кидаются исключения и их ловят трайкечем, а тут какой-то калбек (казах что-ли) и как мне его, самому надо вызывать, проверяя результат системного вызова или как?)
470 1268282
>>68241
Ну типо важны стандарты написания, для переносимости кода.. к тому же ты сам возможно захочешь поправить или апдейтнуть код в будущем и ахуеешь его читать.
471 1268534
>>65158

>Шо нема разве функций по эскапу унескапу чарактеров?


>>61992

>Ну и как эту ASCII унескапнуть попроще?


>>65378

>всё это дело - не унескапает,


>и надо как-то циклом парсить...


>>66006

>Как '\\t' в '\t' унескапнтуть?



>>53747 (OP)
Антуаны, вот так унескапаются стринги: http://rextester.com/JAQV34599
Два дня проебал в эту хуятину - , пользуйтесь на здоровье.
472 1268613
>>68534

> Антуаны, вот так унескапаются стринги


Как же ты заебал. И нет, так делать не надо, ты двигаешь всю строку на каждый чих. Надо примерно так: http://rextester.com/HGY79496 (парсинг \x я говнокодил уже, по-хорошему надо вообще лукап сделать). \u сам осилишь, принцип там тот же, но там уже лучше задуматься о strtoul.
image.png10 Кб, 259x134
473 1268801
Посоны, что за хуйня? Запускаю пикрл, в итоге цикл выполняется выводится 1234567, но дальше он зацикливается и нижняя строка не выводится, проц нагружен на 100%.
Выше мейна у меня есть две функции с говнокодом, но я их вызываю после того, что я написал в пикрл. В голом файле этот код нормально выполняется.
При этом с gdb при нажатии n все работает.
474 1268804
>>68801
Не имеет отношения к сабжу, но main должен возвращать int, чтобы ось поняла, что все ок.
475 1268811
>>68804
Лол, как раз таки имеет. Сделал int и ретурн 0 после 56й строки - все заработало. Спасибо за совет.
Кто-то может обьяснить почему?
476 1268827
>>68811
Странно, ну ладно, если в кратце, то твой процесс не завершался, т.к. операционная система не получала от него сигнал, что он выполнился.
но почему у тебя принтф не работал после цикла непонятно, на самом деле
477 1268832
>>68827
Но это, вероятно, проделки оптимизации компилятора.
478 1268833
Если поставить ретурн до сорта - все до ретурна выводится в консоль. А если после - то нихуя, кроме 01234567. Что за магия? Это как-то связано с тонкостями gcc?
sort это моя функция, вохможно там костыли. Но какое это имеет значение, если не выводится то, что до сорта?
479 1268840
>>68833

> нихуя, кроме 01234567


Нихуя, кроме первой линии рандомных чисел которые выводятся на 57й строке
фикс
480 1268846
>>68827

>но почему у тебя принтф не работал после цикла непонятно, на самом деле


Потому что не было fflush();
481 1268954
>>53747 (OP)
как подключить sdl к mingw64 на виндовс?
482 1268959
>>68954
Ставь линукс.
483 1268964
>>68959
Не хочу ёлку в попу.
484 1268967
>>68964
Тогда будешь страдать.
485 1268980
>>68833
Это что за такой красивый IDE?
486 1268986
>>68980
вим
487 1268995
>>68986
Не, ну нахуй этот пердольский инструмент, из которого даже по человечески выйти нельзя
488 1268999
У нас есть strcpy и memcpy.
Если я использую memcpy N байт из строки меньшей N байт, словлю в лучшем случае сегфолт или почитаю говна.
Если я использую strcpy на строке, а строка вдруг больше выделенных N байт, то в лучшем случае словлю сегфолт.
И что использовать тогда?
489 1269024
>>68999
strncpy
 .jpg195 Кб, 2732x2048
490 1269027
>>69024
Бля, щас бы велосипедил. Сотни нефти!
491 1269049
>>60052
Что за юморески?
492 1269063
>>69024
>>69027
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. И надежнее.
493 1269148
>>68995
Ты не припух гнать на лучший блокнот всех времен и народов?
Где еще ты сможешь сделать документ как n секунд/минут назад?
494 1269178
https://pastebin.com/rueVCwsQ
Я уже не знаю, что делать со строкой:
strcpy(((char∗)(∗(fourfold)+j∗COLS)), token);
Я представляю это так: у нас есть массив, состоящий из указателей. В каждый элемент массива мы сохраняем указатель, указывающий на массив строк, а т.к. у нас строк нет и есть массив символов, то мы заставляем выделять указатель на COLS∗MAXLINE символов, который и отправляется храниться в массив указателей.
Как надо писать, чтобы работало?
495 1269180
>>69178
Боже, блядь, мой, зачем тебе это?
496 1269185
>>68833
Ой а можно твой vimrc? А то у меня какой-то крипотный синтакс
497 1269187
>>69180
CSV читать
498 1269192
>>69178
Яб тоже не отказался такие строки уметь читать
499 1269220
500 1269255
>>69178

> https://pastebin.com/rueVCwsQ


Если у тебя COLS и MAXLINE известны на стадии компиляции, зачем такие сложности? Сделай нормальный массив с известными последними измерениями char (*rows)[NUM_COLS][NUM_COL_CHARS], и вычисления адреса сильно упростятся. Ну или массив строк и массив массивов из NUM_COLS указателей на токены. Алсо, у тебя условие неправильное в цикле считывания столбцов - там && должно быть.
 .jpg478 Кб, 800x470
501 1269276
>>69255
Как оказалось, я пересыпал звёздочек, всего-то три надо. И не надо быть умнее компилятора, выделяя двухзвёздному указателю место на х∗у байт, надо сначала выделять указатель на х байт, а потом внутри этого указателя на у байт.
Ну и вообще да,

>char (*rows)[NUM_COLS][NUM_COL_CHARS]


куда проще. Я даже и не вспомню, зачем я захотел динамически задавать память вместо простого как доска решения.
502 1269277
503 1269284
>>68613

>Как же ты заебал.


Я тебя ещё голым не видел.

>И нет, так делать не надо, ты двигаешь всю строку на каждый чих. Надо примерно так: 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 - хуй знает.
503 1269284
>>68613

>Как же ты заебал.


Я тебя ещё голым не видел.

>И нет, так делать не надо, ты двигаешь всю строку на каждый чих. Надо примерно так: 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 - хуй знает.
504 1269309
>>69284
Короче, сам вижу, что \u можно просто через слеш указать
в строке вида: char x[] = "xx\\\\xxx\\ty\\r\\n\\\'\\\?\\\"hello\\x22\\x7e\u1ed8";
и оно пойдёт в символ, и останется ним. И не нужно писать никакой отдельный сase для 'u'.
Если же перед '\u' стоит ещё один слеш '\\u', то ебануться можно.
505 1269310
>>69284

> какой 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, не пытаясь продолжать.

>>69309

> И не нужно писать никакой отдельный сase для 'u'.


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

>Массивчик, который сопоставляет значение 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", и всё стало заебись.
506 1269340
>>69310

>Массивчик, который сопоставляет значение 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", и всё стало заебись.
507 1269399
>>67908
Так стоп! Но ведь в программе из книжки с и так имеет тип int. И как раз для указание на конкретный массив и нужно число в int. В чем тогда смысл?

Или после операции с=getchar() с меняет свой тип на char что-ли?
508 1269423
char✮ strcpy(char✮ src, char✮ dst)
{
char✮ res = dst;
while(✮dst++ = ✮src++);
return res;
}

Это нормальный strcpy?
Спрашиваю, ибо жалуются, что сложна-нипанятна. Мне всегда казалось, что именно так и общепринято и любой программер на C такую конструкцию распознает не задумываясь. Что скажете?
509 1269435
>>69423
Зачем тебе указатель res тогда вообще?
510 1269447
>>69399
Хз, чет погуглил и не нашел ответа
511 1269588
>>69423
лол это вообще пример с Кернигана и Ритчи
как сишнику может быть такое не понятно
512 1269592
>>67674
если ты ввел число 5 оно в кодировке ANSII там хуй пойми какое , поэтому мы с него отнимаем кодировку нуля ('0') и записываем итерацию в элемент массива под номером '5'-'0' = 5 , и тем самым в массиве останется инфа что ты нажал число 5
sage 513 1269657
>>69435

> ибо жалуются, что сложна-нипанятна


Кто жалуется? Программисты на жс?
514 1269680
>>69423
Стандарты SEI или чего-то ещё надо читать, там должно быть описано. Хотя, в целом, стандарты сводятся к тому, чтобы не заниматься гимнастикой с указателями и прочими подразумеваемыми вещами, а то словишь УБ и бида-бида.
Наверно, в условии цикла должно было бы стоять сравнение с нулём, или к указателям обращались бы с дополнительной переменной, я не знаю.
sage 515 1269704
>>69680
Выражение в while - это идиома. Все нормальные люди такое понимают и сами так пишут. А в ололобезопасных стандартах запрещают делать и многие другие нормальные вещи, но обоснований при этом не приводят - просто какой-то анонимный эксперт сказал им, что так нельзя.

мимо анонимный эксперт
516 1269775
>>69284

>смотри что я принёс:



>#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 - хуй знает.



>>69310

>Это компилятор за тебя "\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 и хеш-таблицу замен для всех юникод-символов что-ли?
516 1269775
>>69284

>смотри что я принёс:



>#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 - хуй знает.



>>69310

>Это компилятор за тебя "\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 и хеш-таблицу замен для всех юникод-символов что-ли?
sage 517 1269795
>>69775
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.
15089404916220.jpg27 Кб, 394x394
518 1269821
>>69795
О, ваще красава, годно расписал.

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

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

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

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

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

Не заметил, что мы в бамплимите, извините.
sage 520 1270213
>>69821

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


Ну сходи ты хотя бы в википедию, там есть красивая табличка. У continuation bytes у всех префикс одинаковый: 10, после него 6 бит значения. У leading byte либо нолик в старшем бите, означающий ASCII-совместимый 7-битный символ, либо префикс из последовательности единиц и нолика за ними, количество единиц указывает количество битов в последовательности. Вот >>69795 тут 11100001 означает, что в последовательности 3 байта, считая и стартовый.
sage 521 1270215
>>70213

> количество единиц указывает количество битов в последовательности


Байтов, конечно же.
522 1270494
>>67299

>неудобно


Двачую, пиздец как неудобно.
Тред утонул или удален.
Это копия, сохраненная 1 ноября 2018 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски