Главная Настройка Mobile Контакты NSFW Каталог Пожертвования Купить пасскод Pics Adult Pics API Архив Реквест доски Каталог стикеров Реклама
Доски


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

Check this out!


<<
Каталог | Трекер | Назад | Вниз | Обновить тред | Автообновление
511 | 27 | 173

C Programming Language #29 Аноним # OP  15/03/18 Чтв 21:09:44  1156306  
C Programming L[...].png (78Кб, 792x1023)
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [​i​] или ∗.

Что читать:

- Классика от Отцов: http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Годное пособие для гуманитариев: http://web.archive.org/web/20160727235220/http://c.learncodethehardway.org/book/ (автор внезапно захотел денег)
- Немного примеров хорошего стиля: 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 помогает читать сложные сишные декларации.

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

- №26: https://arhivach.org/thread/315652/
- №27: https://arhivach.org/thread/325831/
- №28: https://arhivach.org/thread/339326/

Шапка: http://piratepad.net/bJ1SdmkZyu
Аноним 15/03/18 Чтв 23:38:49  1156415
image.png (2901Кб, 1230x1230)
Вкатился. Вопросы по эмбеддед-си здесь задавать?
Аноним 15/03/18 Чтв 23:47:30  1156422
>>1156415
нет
Аноним 15/03/18 Чтв 23:52:30  1156424
Всё байтоёбите?
Аноним 16/03/18 Птн 05:42:45  1156517
>>1156424
Всё сагоёбишь?
Аноним 16/03/18 Птн 07:12:53  1156530
>>1156415
конечно, я почитаю, но отвечать не буду, потому что ничего не знаю.
Аноним 16/03/18 Птн 08:45:31  1156547
image.png (8Кб, 406x108)
image.png (16Кб, 426x182)
>>1156422
>>1156530
Ладно, тогда вопрос по прикладному С:

Сейчас у меня есть массив структур с кастомными функциями под микруху для чтения, которым нужно передавать адреса элементов. Вопрос: можно ли этот код который я наиндусил как-то переписать по-человечески с нормальными указателями структуры?

Ну и всю структуру затягивать через pgm_block_read я тоже не хочу, потому что потом буду писать код в котором нужно будет затягивать/записывать только одну переменную.


Вот описание для функций библиотеки: https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
Аноним 16/03/18 Птн 09:11:27  1156550
>>1156547
> переписать по-человечески с нормальными указателями структуры?
Не совсем понятно, чего ты хочешь. Ты разрешения спрашиваешь? Да, можно. Нет, не особо нужно: под капотом при возврате структуры размером больше, чем влезает в один-два регистра, функции неявно передается указатель на результат, функция его туда пишет, все счастливы. Возможно, для авров компиль более тупой, хуй знает.
Аноним 16/03/18 Птн 09:22:49  1156551
>>1156550
>Не совсем понятно, чего ты хочешь.

Ну я хочу заменить все эти танцы с бубном и инкрементами указателя на что-то вроде ret_test.wind = pgm_read_word(&Profile[time].wind) и так далее, так можно сделать? Какой правильный синтаксис для таких конструкций?
Аноним 16/03/18 Птн 11:48:02  1156629
>>1156551
тебе не красиво? сделай юнион с char@.
Аноним 16/03/18 Птн 15:18:01  1156727
Где прочитать все сдвиги C99 относительно C89?
Язык не важен, важна ёмкость изложения.
Аноним 16/03/18 Птн 20:11:09  1156884
>>1156629
Да хуй там, оказывается можно указывать на сами элементы массива. Жалко только что нету ассемблерного кода для считывания вообще всего блока.
Аноним 16/03/18 Птн 20:34:20  1156896
>>1156727
Вступление к соответствующему стандарту или справка от Pelles C.
Аноним 17/03/18 Суб 11:23:15  1157165
Я невнимателен, или и правда нигде не сказано о том как malloc выравнивает левую границу? Мне два бита нужно, есть вообще какие-то гарантии на этот счёт?
Аноним 17/03/18 Суб 22:11:23  1157629
>>1157165
> правда нигде не сказано о том как malloc выравнивает левую границу
Сказано. malloc делает выравнивание так, чтобы оно было достаточным для любого встроенного типа. Для всего остального есть aligned_alloc из C11.

> Мне два бита нужно
Чо? Тебе бы что-нибудь по архитектуре компов почитать. Минимально адресуемая единица - байт. А на практике, любым маллоком будет выделено не менее sizeof(uintptr_t).
Аноним 18/03/18 Вск 07:47:03  1157905
>>1157629
>Чо?
Мне в указателе, в крайних двух разрядах, необходимо сохранить два флага, в самой переменной, а не в выделяемой памяти я имею в виду.
Аноним 18/03/18 Вск 08:15:27  1157913
>>1157905
Ты всё-таки почитай как адресуется память и как происходит чтение-запись.
Аноним 18/03/18 Вск 10:14:10  1157981
>>1157905
тут уже один чувак так делал, в в одном заведении учитесь?

по идее гарантий никаких нет. вроде нет соотв. дефайнов на этот счёт. выделяй сразу с запасом. (void@)((uint_ptr)malloc(T + 3) & ~(uint_ptr)3)
Аноним 18/03/18 Вск 10:17:24  1157984
>>1157981
ой не так.

(void@)((uint_ptr)malloc(T + 3) + 3 & ~(uint_ptr)3)
Аноним 18/03/18 Вск 10:21:10  1157986
но тогда хранить нужно и настоящий адрес (или смещение). ну понятно - выделяешь ещё sizeof(void@), выравниваешь, вписываешь указатель и смещаешь.

у меня кстати по этой теме вопрос, можно как-то сделать обёртку над malloc, но чтобы с тем же именем? или это должна быть поддержка библиотеки, там, альтернативное имя...
Аноним 18/03/18 Вск 10:32:06  1157993
>>1157986
>можно как-то сделать обёртку над malloc, но чтобы с тем же именем
Вот тут у мужика что-то вышло, я правда хуй его знает насчёт переносимости.
https://habrahabr.ru/company/mailru/blog/281497/

>но тогда хранить нужно и настоящий адрес
Тут за два бита битва, а ты целиком адрес хранить предлагаешь.
Аноним 18/03/18 Вск 10:57:46  1158011
>>1157993
>Вот тут у мужика что-то вышло, я правда хуй его знает насчёт переносимости.
хорошая, почитал.

>>1157993
>Тут за два бита битва, а ты целиком адрес хранить предлагаешь.
с другой стороны мы уже выяснили, что освобождать память не надо...
Аноним 18/03/18 Вск 13:21:24  1158134
>>1158011
Во догонку ещё вроде бы BoehmGc умеет подменять обращения к malloc,

А как-то статическую переменную по кратному адресу выровнять можно?
Аноним 18/03/18 Вск 13:32:16  1158137
Можно ли как-то реализовать такое?
Или только инклюдить через ifndef

#define LOH 123
#include "../" + LOH + "/file.h"
Аноним 18/03/18 Вск 18:06:26  1158374
>>1156306 (OP)
родные, покажите реализацию компаратора для типа double, пожалуйста
Аноним 18/03/18 Вск 18:34:29  1158402
>>1158374
bool AreSame(double a, double b)
{
return fabs(a - b) < EPSILON;
}
Аноним 18/03/18 Вск 19:19:55  1158442
>>1158402
почему bool а не int?return fabs(a - b) < EPSILON; возвращает + если разность "~0" и - если числа разные, я правильно понял? но ведь компаратор не только говорит разные числа или одинаковые, он еще говорит какое больше
Аноним 18/03/18 Вск 22:50:07  1158603
>>1158134
#include <stdalign.h> // C11, но есть расширения и для более старых версий стандарта.

>>1158137
Можно.
#define LOH 123
#define INCLUDE_CAT(...) INCLUDE_CAT_(__VA_ARGS__)
#define INCLUDE_CAT_(...) #__VA_ARGS__
// Мы работаем с токенами, поэтому кавычки не нужны, их ставит
// INCLUDE_CAT_, а если нужны <> вместо кавычек, то делаем так:
// #define INCLUDE_CAT_(...) <__VA_ARGS__>
#include INCLUDE_CAT(../LOH/file.h)

>>1158442
Ну так добей условие-то, в чем проблема-то?
double delta = a - b;
return (fabs(delta) < EPSILON) ? 0 : (delta < 0) ? -1 : +1;
Аноним 18/03/18 Вск 22:56:43  1158607
>>1158603
>>1158137
Чета я подумал, что оно так может что-нибудь еще в пути к файлу случайно развернуть, если оно совпадет с именем макроса. Например, #define file ERROR оно будет инклудить ../123/ERROR.h, что не есть хорошо. Лучше разворачивать только LOH:
#define INCLUDE_BUILD(S) INCLUDE_CAT(../test/S/file.h)
#define INCLUDE_CAT(...) #__VA_ARGS__
#include INCLUDE_BUILD(LOH)
Аноним 20/03/18 Втр 08:11:40  1159398
>>1158603
>return (fabs(delta) < EPSILON) ? 0 : (delta < 0) ? -1 : +1;
спасибо большое
Аноним 20/03/18 Втр 09:30:02  1159423
Ахахах, у вас что, даже нет встроенного сравнения чисел?
Аноним 20/03/18 Втр 10:42:13  1159452
>>1159423
Ты про spaceshit? Нету. Как ты в него нужный эпсилон передашь? Ах никак, ах авторы компилятора интерпретатора твоего языка лучше тебя знают, какая погрешность у твоих значений?
Аноним 20/03/18 Втр 11:03:57  1159459
можно ли обработать SIGTERM?
Аноним 20/03/18 Втр 11:11:12  1159463
>>1159459
да
Аноним 21/03/18 Срд 14:25:46  1160046
День добрый, аноны. Не знаю как более красиво решить задачу:
Я делаю выборку из БД и сколько строк она вернет - неизвестно. Проходясь циклом по результату выборки я каждую строку помещаю в структуру, а структуру в массив. Для этого перед каждой выборкой мне приходится сначала выбирать количество записей и на основании его инициализировать массив. То есть приходится делать два запроса, хотя полезные данные возвращает только один из них. Скажите, как мне затолкать результаты выборки в массив заранее не зная его размера?
Аноним 21/03/18 Срд 14:34:21  1160056
>>1160046
никак, певый скюл запрос с каунт закеширует результат в бд, второй будет бесплатно. ну или читай фиксированными чанками.
Аноним 21/03/18 Срд 14:37:08  1160061
>>1160056
Хм, ну если на производительности это не скажется то пусть так и остается. Спасибо.
Аноним 22/03/18 Чтв 03:06:20  1160466
>>1160056
>закеширует
Не кэш, а буфер. Кэш умеет синхронизироваться.
Аноним 22/03/18 Чтв 11:42:42  1160607
>>1160046
Используй односвязный список, например.
Аноним 22/03/18 Чтв 12:40:57  1160626
>>1160607
Почти двачую. Список чанков, хранящих по n записей - это правильный способ решения проблемы, если производительность критична аж пиздец как. Если нет - realloc тоже сойдет.
Аноним 24/03/18 Суб 21:44:17  1162041
Репост из крестового треда

Как в vs2017 (или вообще какими ключами компиляции) смерджить все секции в одну - .text? Я видел в msdn'е статьюю про /merge .rdata=.text, но там не сказано, какой разделитель и как использовать для нескольких секций
Аноним 24/03/18 Суб 22:08:56  1162063
>>1162041
> но там не сказано, какой разделитель и как использовать для нескольких секций
Сделай несколько мержей: /MERGE:.rdata=text /MERGE:.data=.text /MERGE:.bss=.text
Аноним 24/03/18 Суб 23:21:20  1162103
>>1160046
Наиболее красиво - это выкинуть массив нахуй, и обрабатывать записи по мере поступления. Попробуй, может, получится. В большинстве случаев получается. Тем более что в С++ вроде бэкпортили range из D, так что должно быть несложно. (Не знаю точно так как давно не юзал). Если не получается и по данным надо что-то считать с рандомным доступом, возможно, ты просто хуево знаешь SQL, потому что когда ты его знаешь хорошо, ты выбираешь уже все готовое к применению.
.c или .h Аноним 28/03/18 Срд 15:28:13  1164019
сап двачеры, срачеры, хуячеры, усачеры и тд. Объясните недоразвитой мошонке, мне, в чем разница нахуй между файлами .c и .h. я ебать пишу такой файл с прототипами имен переменных ну да надо переносимость обеспечить сохраняю с расширением .h подключаю через инклуд и все робит, меняю расширение на .c и опять нахуй все робит, ебать думаю я че за хуйня не должно же робить или должно хуй его знает. В общем как я понял .h сделали тупо чтобы не путать с .c файлами походу так. Поправляйте смело меня если не так. Спасибо за внимание нахуй
Аноним 28/03/18 Срд 15:38:03  1164026
>>1164019
это все еще я, ну вот даже простой пример: подключаю stdio.h вызываю printf все норм, опять же захожу в сборище заголовочных файлов меняю расширение у файла stdio.h на stdio.c в коде тоже все меняю, повторно компилю и опять все норм робит ну и как так
Аноним 28/03/18 Срд 15:49:34  1164030
>>1164026
а что тебя не устраивает?
Аноним 28/03/18 Срд 15:58:33  1164036
>>1164030
ну тип так и должно быть? это нормально? то есть если я хочу то могу спокойно писать заголовочные файлы с расширением .c??
Аноним 28/03/18 Срд 16:21:35  1164060
>>1164019
> в чем разница нахуй между файлами .c и .h
Для Си, как языка - ни в чем, можешь хоть .yoba называть все свои файлы. Другие утилиты, например, make, ожидают, что ты назовешь исходник foo.c, чтобы make foo (без Makefile) смог правильно сработать.

>>1164036
> писать заголовочные файлы с расширением .c
Можешь. Некоторые делают кладут static inline функции в отдельные файлы с расширением .inl. В крестах так и вообще разброд и шатания, там есть и .h, и .hpp, и .hxx, и .hh, и даже .h++ раньше было. Ты можешь делать все, что угодно, но старайся быть консистентным и очевидным по мере своих сил.
Аноним 28/03/18 Срд 16:23:38  1164064
>>1164060
не знаю принято ли тут говорить спасибо, но спасибо.
Аноним 28/03/18 Срд 16:33:58  1164073
>>1164019
Чисто логическое разделение. Грубо говоря в хэдэрах всё прототипизируется, а в файлах кода реализуется. Можешь проект в лям строк хоть в 1 .c захерачить, но будет ли это удобно? (особенно когда дело коснется препроцессора).
Это ты ещё банальным вопросом задался, ведь может быть всякое:
.c .h .cc .hh .cpp .hpp .cxx *.hxx и т.д.
Аноним 28/03/18 Срд 19:28:29  1164140
>>1164019
Заголовки отдельно нужны, чтобы ты мог использовать чужие _скомпилированные_ библиотеки. И чтобы кто-то мог использовать твои.

Т.е. в заголовках - "интерфейс", всё, что тебе нужно, чтобы использовать библиотеку. Сами исходники при этом - не нужны.

Это как interface в джаве, примерно.

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

Это основной смысл, остальное - структурирование кода и т.п. - по желанию.
Аноним 29/03/18 Чтв 16:06:13  1164604
>>1156306 (OP)
Возник тупой вопрос. Следующие две команды идентичны или нет?
double (зв)x = (double(зв))malloc(10 x sizeof(double));
double (зв)x = malloc(10 x sizeof(double));
Если да, зачем тогда в таких случаях пишут приведение типов?
Если нет, не является ли вариант с приведением медленнее чем без него?
Аноним 29/03/18 Чтв 17:54:25  1164658
>>1164604
В Си указатель на void автоматически и неявно кастится к указателю на другой тип (и обратно). В крестах такого нет (у них там type safety типа), поэтому нужен явный каст. Разницы по производительности нет. Каст возвращаемого маллоком значения - классический признак человека, который учил не Си, и не кресты, а некий "си с классами".
Аноним 29/03/18 Чтв 19:42:58  1164725
>>1164658
теоретически это может помочь при рефакторинге. но мы же знаем, что функции должны быть такого размера, чтобы всё было в ней понятно и видно сразу.
Аноним 30/03/18 Птн 02:53:27  1164941
>>1164604
>Если да, зачем тогда в таких случаях пишут приведение типов?

Чтобы обеспечить переносимость сишного кода на кресты.
Аноним 30/03/18 Птн 10:48:58  1164990
>>1164941>>1164658
Благодарю.
Хотя во втором случае возникает вопрос, зачем конпелировать сишный код плюсовым конпелятором.
Аноним 30/03/18 Птн 15:34:12  1165130
Чпок!
Аноним 30/03/18 Птн 23:36:19  1165468
>>1165130
Добрый вечер!

Мимо вежливый лось
Аноним 31/03/18 Суб 09:37:05  1165581
https://youtu.be/443UNeGrFoM

Бля, посмотрел видео. Смешанные чувства. С одной стороны он прав, хотя блин... Вроде и бредит немного.
Аноним 31/03/18 Суб 19:32:31  1165880
>>1165581
2 часа смотреть как какой-то петух рассказывает про свой стиль программирования?
Аноним 01/04/18 Вск 20:50:53  1166492
Что мне вернется?


typedef struct govno
{
bool pahnet;
} govno;

govno *today = calloc(sizeof(govno));

if (today->pahnet == true)
{
return(1);
}
else if (today->pahnet == false)
{
return(2);
}
else
{
return(3);
}

Аноним 01/04/18 Вск 21:07:28  1166508
превед двочь. объясните простым язык про конец файла в си, и про то как обрабатываются потоки символов. чайнику полнейшему но в подробностях если не затруднит
Аноним 01/04/18 Вск 21:15:59  1166516
>>1166492
Не скомпилируется.
Аноним 01/04/18 Вск 22:11:09  1166550
>>1166508
Системный вызов возвращает некий признак конца файла.
Ну вооот
Аноним 02/04/18 Пнд 00:41:46  1166593
>>1166492
В теории представление _Bool может хранить хоть 'y'/'n', и разворачиваться в 0/1 только при использовании в выражениях, хотя на практике никто такой хуйней не страдает. Поэтому если исправить ошибки, вернется 2.

>>1166508
Задай более развернутый вопрос. Конец файла - это специальное значение, выходящее за пределы диапазона, применяющегося для символов. Его возвращают как индикатор того, что символов больше нет. Физически никакого конца файла уже лет 30 как не существует.
Аноним 02/04/18 Пнд 01:39:52  1166602
>>1156306 (OP)
ребят простите за ламерский вопрос , но интересно куда возвращает значение return доупстим из мейна или та же функция exit куда они выводя значения и где их посмотреть
Аноним 02/04/18 Пнд 01:48:02  1166607
>>1166602
Там до и после мейна ещё код работает.
А где посмотреть... погугли программа код возврата
Аноним 02/04/18 Пнд 02:25:09  1166616
>>1166602
> где их посмотреть
В винде (в сосноли):
app.exe
echo %ERRORLEVEL%
В линуксе (в сосноли):
./app
echo $?
(или можно приглашение настроить, чтобы код возврата предыдущей команды автоматически выводило). Алсо, можно получать код возврата программно (для этого он и придуман).

> куда возвращает значение return
В main() return EXPR полностью аналогично вызову exit(EXPR);
Аноним 02/04/18 Пнд 11:42:44  1166681
Господа, переделайте, пожалуйста, Си++ код в Си.
https://ideone.com/wLxTJb
Аноним 02/04/18 Пнд 11:56:00  1166687
>>1166681
Отвратительный код. С тебя $10.
printf("%.2x\n", 0x0f ^ 0x61);
Аноним 02/04/18 Пнд 12:06:08  1166695
>>1166687
Смешно.

Следующий. Только не клоун, пожалуйста.

С помощью маски надо одновременно изменить состояние одного \ нескольких битов в байте, не затрагивая не нужные. Порядок бит (как в самом байте, так и в выбираемых для изменения) - MSB...LSB.
Аноним 02/04/18 Пнд 12:08:33  1166697
>>1166695
Очевидно, что когда маска зависит от числа, тебе не нужна маска, потому что результат - константа. А если тебе нужно менять биты в рандомном числе, тебе нужно ДЖВЕ маски - для and-not и для or. Такие дела.
Аноним 02/04/18 Пнд 12:11:47  1166700
>>1166697
В Си++ коде именно так. Поэтому и прошу переписать.
Пусть даже за вознаграждение. Разумное. 300к нет.
Аноним 02/04/18 Пнд 12:23:07  1166709
>>1166700
Ну бля. Делоешь маску mask, в которой в которой нолики стоят там, где будешь менять биты (в Си литералы все еще не умеют в binary, если что). Записываешь биты bits, где в нужных местах стоят биты, которые нужно установить. Применяешь.

// Будем менять биты 6, 5, 3, 1.
uint8_t mask = ~((1 << 6) | (1 << 5) | (1 << 3) | (1 << 1));
// Будем ставить биты 6 и 3 в 1, а 5 и 1 в 0.
uint8_t bits = (1 << 6) | (1 << 3);
// Какой-то байт.
uint8_t value = (uint8_t) (rand() & 0xff);
// Применяем.
value = (value & mask) | bits;

> Порядок бит (как в самом байте, так и в выбираемых для изменения) - MSB...LSB.
А в крестовом коде LSB->MSB, как у нормальных людей. Ну пиши там (8 - 1 - индекс_бита), если сильно надо.
Аноним 02/04/18 Пнд 13:12:09  1166732
>>1166709
байтоёбы
Аноним 02/04/18 Пнд 15:04:21  1166787
>>1166709
Спасибо попробую собрать. Хотя не уверен, что получится.
Дай фейкомыльце, а?

Может ещё будут предложения.
Аноним 02/04/18 Пнд 18:26:44  1166873
>>1166508
http://www.c-cpp.ru/content/eof

Что такое потоки символов?
Аноним 02/04/18 Пнд 18:29:34  1166878
>>1166787
> Дай фейкомыльце, а?
suck_my_nerd_cock@mail.ru
> Может ещё будут предложения.
С пошлостями не обращаться.

зы: дятел, за каким хуем ты учишься? Пиздуй сраз в макхряк трудоустраиваться
Аноним 02/04/18 Пнд 18:34:11  1166882
>>1166873
Ну смотри. Можно абстрагироваться над файлом и представить себе трубу из которой выливаются символы один за другим. Тебе похуй, откуда они там в трубе берутся - может быть, они из файла читаются, может их пользователь ввел, может их другая программа на лету генерирует, а может они через сеть прилетели. И вот ты читаешь символы, а потом тебе прилетает вместо символа хуй (EOF). Тут-то ты и понимаешь, что больше у этой трубы ловить нечего. Вот это потоки. Потоки символов, байтов или еще какой-нибудь хуйни (в Си - потоки символов).
Аноним 02/04/18 Пнд 18:35:26  1166885
>>1166787
Это >>1166878 если что не я был. Спрашивай тут, если к Си относится, или в прикрепленном, если не относится.
Аноним 02/04/18 Пнд 18:47:46  1166899
>>1166882
В первый раз слышу про потоки, честное слово. Сравнение канализацией попахивает. Тебе может быть пойти на сантехника отучиться?!

Если по теме, то тебе необходимо читать файл в бесконечном цикле, опционально добавив задержки на чтение (читай про семафоры) при eof == true, кеш организовать, чтобы не читать файл каждый раз сначала.

Посмотри код tail, ключ -f к этой утилите именно то, что тебе надо.
Аноним 02/04/18 Пнд 18:48:42  1166901
>>1166787
Этот >>1166885 быдло мимикрирующее из /б просочившееся сюда, не обращай внимания.
Аноним 02/04/18 Пнд 19:21:08  1166911
Расскажите про стандарты языка. Что это и как это. Что значит поддержка компилятором стандарта.
Аноним 02/04/18 Пнд 19:24:44  1166914
>>1166911
Все тоже самое, что и в скриптовых языках типа пиздона или эрэнэра.
Аноним 02/04/18 Пнд 19:26:33  1166915
Создать язык программирования это значит создать компилятор для него получается так? То есть создать некую программу которая будет переводить некие слова в машинный код? Почему тогда раз машинный код для каждого процессора разный то программа написанная мною на моем пк успешно запускается на другом пк с другим поколением процессоров к примеру у меня амд а у приятеля интел
Аноним 02/04/18 Пнд 19:32:16  1166917
>>1166915
Зависит от ОС и кучи других факторов.
Аноним 02/04/18 Пнд 19:32:52  1166918
>>1166917
Можно подробнее?
Аноним 02/04/18 Пнд 19:33:35  1166919
>>1166917
начни со стандартов и то как они связаны с компиляторами
Аноним 02/04/18 Пнд 19:35:15  1166920
>>1166911
> Расскажите про стандарты языка. Что это и как это. Что значит поддержка компилятором стандарта.
В Си на текущий момент три стандарта. Это такие документы, очень скучно и подробно описывающие язык. Поддержка стандарта означает, что поддерживаются все нововведения по части синтаксиса (компилятором), а в стандартной библиотеке (если она идет с компилятором) присутствуют все новые функции, наличие которых гарантирует стандарт.

>>1166915
> Почему тогда раз машинный код для каждого процессора разный
Есть архитектура процессоров и архитектура набора команд (instruction set architecture). Вторая меняется очень редко. Например, твой процессор вполне способен выполнять инструкции, которые применялись в середине 80-х. А вот в обратную сторону это, очевидно, не работает. Современные инструкции старый процессор не осилит. И сейчас ты можешь собрать код для процессора с поддержкой AVX и соснуть на каком-нибудь старом ноуте.

> у меня амд а у приятеля интел
Архитектура команд у AMD и Intel по большей части одинакова.
Аноним 02/04/18 Пнд 19:38:34  1166922
>>1166918
Подробно писать не буду, ибо заебусь печатать.

Есть некий код, компилятор переводит его в машинный код, чтобы у тебя что то на экране появилось - это уже функция ОС, ну там окошко, текст, картинка. (Я сейчас не гвоорю про прямой вывод на экран текста из ассемблера).

Короче, программа имеет структуру - заголовок, откомпмлированные инструкции к выполнению на ЦП и т.п.

Запуская приложение ЦП анализирует и поэтапно выполняет код(откомпилированные инструкции).

Лень откровенно новоря приводить примеры как Си код вюпревращается в ассемблер, который в виде инструкций поступает на конвеер ЦП и как там память кеш и прочие компоненты задействованы.
Аноним 02/04/18 Пнд 19:41:21  1166923
>>1166919
Берем, например ци89. Есть там абстрактная комнда fuck(), которая в наборе инструкций интел и амд ЦП будет соответствовать последовательсти jmp ax, cmp e6, e4... и т.п. У интела это будет инструкция нащываться А, а у АМД Б.
Аноним 02/04/18 Пнд 19:44:25  1166924
>>1166732
Побитовые операции есть даже в javascript, но куда тебе дегенерату знать про это.
Аноним 02/04/18 Пнд 20:08:02  1166933
>>1166915
В ньюфаг-тред.
Аноним 02/04/18 Пнд 21:48:21  1166984
Screenshot from[...].png (21Кб, 654x228)
Аноны, хелпуйте нубу.
Задача - вывести ласт слово задом наперёд.
Вывод: euelueblue
Кто пояснит?
Аноним 02/04/18 Пнд 21:55:46  1166990
>>1166984
У тебя принтф печатает с символа, который ты передал и до \0.
e
ue
lue
blue
Аноним 02/04/18 Пнд 21:57:44  1166992
>>1166984
Попробуй печатать символ, а не строку. printf(%c, s)
Аноним 02/04/18 Пнд 21:58:50  1166994
>>1166992
Аноним 02/04/18 Пнд 22:02:56  1166997
Screenshot from[...].png (21Кб, 650x230)
>>1166992
>>1166994
Спасибо, так работает.
Аноним 03/04/18 Втр 03:20:31  1167203
>>1166997
Что за компилятор?
Аноним 03/04/18 Втр 03:53:04  1167206
>>1167203
Lexicon
Аноним 03/04/18 Втр 06:15:24  1167224
>>1167206
>Lexicon
Что-то не гуглится. Есть ссыль на установщик?
Аноним 03/04/18 Втр 12:21:58  1167295
>>1167224
Lexicon? Конечно есть: https://transfer.sh/yplpi/Lexicon-8.92.zip
Аноним 03/04/18 Втр 15:49:56  1167386
>>1167203
gcc 5.4.0
Аноним 03/04/18 Втр 16:52:12  1167423
Ничего не понял, вот это >>1166997 говно скомпилируется даже на микроволновке. Какая разница, какой конпелятор?
Или гений выше перепутал компилятор с иде?
Аноним 03/04/18 Втр 17:20:40  1167441
>>1167423
Насколько я понял - да, перепутал. Увидил интерфейс моего саблайма и спросил что за компилятор.
Аноним 03/04/18 Втр 17:44:04  1167461
14092046290540.jpg (14Кб, 316x341)
>>1167423
Да, перепутал. Всё, придётся выйти покурить в окно. Так дальше жить нельзя.

П.С. Мне вот интересно, тут все обиженки, которые мусолят курьёзные случаи в чатиках \ курилке с такими же чуханами, как и они сами?
Выглядит так, что вам кто-то насрал на голову, а смыть жижу вы можете только типа "язвительными и остроумными" на самом деле - нет ответами в подобных тредах?

Вроде ничего пиздец архи-сложного не спрашивал, лол.
Аноним 03/04/18 Втр 21:53:12  1167609
>>1167461
тебя даже никто не трогал, взял ещё и обиделся. тебе лечиться надо.
Аноним 03/04/18 Втр 23:58:25  1167682
Пишу простой интерпретатор, и для грамотной очистки памяти походу придется заюзать референс каунтинг, но готовых бибилотек или реализаций я не нашел. Если писать самому, то я даже не знаю с чего начать, какая вообще основная идея использования и реализации этой хуйни? Кто может пояснить, желательно с кодом?
Аноним 04/04/18 Срд 02:19:52  1167727
image.png (125Кб, 399x213)
>>1166984
> длина строки
> sizeof(s)
Аноним 04/04/18 Срд 02:22:48  1167728
>>1167682
У структуры прописываешь поле "рефкаунт", пишешь методы "инкреф" и "декреф". Во втором прописываешь логику освобождения памяти.

Аноним 04/04/18 Срд 02:23:10  1167729
>>1167728
> пишешь методы
Ну функции, в смысле
Аноним 04/04/18 Срд 03:31:50  1167741
>>1167727
И ты сейчас нам пояснишь, почему нужно считать в рантайме через strlen, а не в компайлтайме через sizeof.

>>1167682
Посмотри на COM (одним глазком только, не нужно в дебри лезть, какой-нибудь вводной статьи хватит).
Аноним 04/04/18 Срд 05:53:19  1167764
>>1167741
Во-первых, этот костыль работает только для массива, выделенного на стеке, во-вторых, попробуй вынести этот код в функцию и посмотри, что будет.

Аноним 04/04/18 Срд 06:26:02  1167771
>>1167728
Для подобного существует boehm gc
https://en.m.wikipedia.org/wiki/Boehm_garbage_collector
Аноним 04/04/18 Срд 09:20:25  1167791
>>1167764
Причина "во-первых" и "во-вторых" одна и та же, sizeof(x)/sizeof(*x) для динамически выделенного массива будет использовать только очень особенный пограммист.
Аноним 04/04/18 Срд 09:32:45  1167795
>>1167791
>sizeof(x)/sizeof(*x) для динамически выделенного массива будет использовать только очень особенный пограммист.
Ты скозал?
Ну и что же используют господа, обучавшиеся в Хуеле?
Аноним 04/04/18 Срд 09:58:44  1167803
>>1167795
Я не настаиваю, конечно, в следующем коде нет ничего противозаконного

int x = malloc(10sizeof(int));
printf("%d", sizeof(x) / sizeof(*x));

Но результат может немного расстроить.
Аноним 04/04/18 Срд 09:59:44  1167804
>>1167803
int (зв)x = malloc(10 * sizeof(int));
Аноним 04/04/18 Срд 12:56:55  1167863
>>1167803
А еще можно после твоего printf сделать x[100]=0xdead. По твоей логике [] зло, нужно написать какую-нибудь array_set(), которая проверяет границы, лишь бы какой-нибудь недоучка не обосрался. Тебе в другой язык с таким подходом.
Аноним 04/04/18 Срд 14:26:30  1167883
>>1167863
Что ты несешь? Я лишь сказал, что придирки в этом >>1167764 посте надуманные, и разве лишь дебил неопытный попадется на подобную ошибку (на определение числа элементов в массиве, выделенном маллоком).
Про добро и зло ты сам домыслил.
Аноним 04/04/18 Срд 16:21:24  1167944
>>1167883
Так и я о том же.
Аноним 05/04/18 Чтв 19:56:35  1168611
Друзья, мне нужно как-то записать и вывести кириллицу не используя wchar, что делать?
Аноним 05/04/18 Чтв 20:02:56  1168612
>>1168611
> что делать
Бочку. ОС, компилятор, более полное описание задачи?
Аноним 05/04/18 Чтв 20:06:59  1168616
>>1168612
на степика есть задача, где нужно написать программу, принимающую кириллицу, далее дефолтная работа со строкой и вывод. Решил wchar, сказали збс а теперь без wchar, сказали думать в направлении, что кириллица не помещается в char
Аноним 05/04/18 Чтв 20:12:40  1168619
>>1168616
Не знаю, кто такая эта ваша степика, но если у тебя нормальный линукс, ты можешь использовать UTF-8 (на винде тоже можешь, но в винде UTF-8 в консоли можно сделать только в десяточке) - если кириллица не помещается в один char, то может поместиться в несколько char. Про подробности кодирования UTF-8 см. википедию. Но без сборки хотя бы одного символа в wchar_t/char16_t/char32_t ты со строкой нормально не поработаешь (ну, конечно, моооожно, но больно).
Аноним 05/04/18 Чтв 20:54:24  1168644
image.png (372Кб, 1066x600)
Аноним 06/04/18 Птн 06:32:47  1168944
>>1168644
Но ведь Си действительно мёртв.
Сейчас тащат плюсы.
Все, кто исползует Си - петухи и опущенцы.
Аноним 06/04/18 Птн 11:09:47  1169001
123.png (31Кб, 400x625)
сап, есть прога. Нифига не понятен принцип работы (да, она не совсем правильна). Хелп! Обясните дурачку!
Аноним 06/04/18 Птн 11:21:48  1169005
>>1169001
Что тебе не понятно? Обычный односвязный список.
Аноним 06/04/18 Птн 13:46:33  1169060
>>1169001
>for(; pizda;)
Мам, смотри, я хакер!
Аноним 06/04/18 Птн 14:46:14  1169105
>>1169060
Правильные ребята пишут так: for (; ∗current; current = &((*current)->next));
Аноним 06/04/18 Птн 15:24:31  1169135
>>1169105
Бля, ахуенно жеж.
Аноним 06/04/18 Птн 15:26:20  1169136
>>1169060
>>1169105
Но зачем эта сахарная параша когда есть while/
Аноним 06/04/18 Птн 17:15:58  1169183
>>1167804
А потом ты поменял тип x, или не ты, что только увеличивает вероятность внесения ошибки
Аноним 06/04/18 Птн 17:44:49  1169202
>>1169183
>А потом
Суп с котом.
Аноним 09/04/18 Пнд 21:49:50  1170933
>>1156306 (OP)
https://pastebin.com/Pdv3jmv9
> Error in `main': malloc(): memory corruption (fast): 0x00000000013470e0
Посоны, почему возникает ошибка? Видимо, из-за функции f2, она как-то распидарасивает мою память void*. А как тогда правильно?
Аноним 09/04/18 Пнд 22:01:43  1170945
>>1170933
>memory corruption
планку памяти смени на новую
Аноним 09/04/18 Пнд 22:17:46  1170951
>>1170945
Где ж я в тюрьме планку памяти достану? Есть ещё варианты?
Аноним 09/04/18 Пнд 22:29:55  1170954
>>1170933
Ты считаешь адреса неправильно. Сделал бы структурку типа struct { double res, x; int y; } и выделял бы ее. А у тебя вот это ок:
double ∗x = (double∗)memory;
Дальше твой массив y залезает на конец массива x, потому что тебе нужен адрес memory + n ∗ sizeof(double) = memory + 8n, а у тебя сложение (адресная арифметика) для указателя на инт, поэтому ты считаешь memory + n ∗ sizeof(int) = memory + 4n.
int ∗y = (int∗)memory + size;
Дальше ты скипаешь 2n даблов: memory + sizeof(double) ∗ 2 ∗ n = memory + 16n (адресная арифметика для double), что нихуя не равно memory + (sizeof(double) + sizeof(int)) ∗ n = memory + (2 + 4)n = memory + 6n:
double ∗res = (double∗)memory + 2∗size;
Соответственно, в этом последнем блоке ты вылезаешь за пределы массива.

Можешь считать итеративно:
double ∗x = memory;
int ∗y = (int ∗)(x + size); // Адресная арифметика для double∗.
double ∗res = (double∗)(y + size); // Адресная арифметика для int∗.
Это будет работать, если выравнивание, требующееся для дабла равно выравниванию, требующемуся для int. Иначе стоит сложить сначала оба массива даблов, потом уже инты. Но вообще, такой подход говно, не делай так, если не уверен.
Аноним 09/04/18 Пнд 22:32:36  1170955
>>1170954
> memory + (2 + 4)n = memory + 6n:
memory + (4 + 8)n = memory + 12n (опечатался).

Аноним 09/04/18 Пнд 22:49:01  1170963
>>1170954
> Но вообще, такой подход говно, не делай так, если не уверен.
А как тогда делать?
У меня есть некоторая довольно большая структура
typedef struct {бла-бла-бла} mystruct;
несколько функций типа
int f(unsigned size, бла-бла);
которые:
1. Должны вызываться несколько тысяч раз.
2. Содержат в себе кучу различных маллоков
type ∗x = malloc(size ∗ sizeof(тип));

Препод сказал, все говно (и он прав, ибо сишный код работает по скорости так же, как питоновский прототип), ирл в таких случаях делают менеджоры памяти.
Понятия не имею, что такое менеджер памяти. Потому я добавил в структуру поле void∗, куда засовывается память, которая использовалась бы вместо маллоков внутри функции.
А как следовало поступить тогда?
Небольшой пример в выше я написал просто чтобы разобраться, почему у меня все неправильно работает.
За итеративный способ спасибо, пока так и сделаю.
Аноним 09/04/18 Пнд 22:51:15  1170964
>>1170963
> int f(mystruct structure, unsigned size, бла-бла);
Фикс.
Аноним 09/04/18 Пнд 22:55:59  1170968
>>1170963
> Содержат в себе кучу различных маллоков
Ну так уменьши количество маллоков, посчитай, сколько тебе памяти нужно и выделяй заранее, не внутри цикла, а перед ним. А менеджер памяти у тебя уже есть, ты из него маллок дергаешь, и обогнать его чем-то кастомным может быть сложно.
Аноним 09/04/18 Пнд 23:33:07  1170985
>>1170951
тюрьма психотронная, надеюсь?
Аноним 09/04/18 Пнд 23:56:54  1171003
>>1170968
А я проверил, "итеративный вариант" дал ускорение в полтора раза. Пожалуй, оставлю.
Аноним 10/04/18 Втр 00:01:10  1171009
>>1171003
Ты точно уверен, что malloc(sizeof(mystruct) * size) медленнее? Я вот не верю в такое.
Аноним 10/04/18 Втр 00:12:51  1171017
Говнокод.png (9Кб, 500x292)
Безымянный.png (4Кб, 388x28)
Народ посмотрите пожалуйста на мой выссер и скажите почему этот кусок говна не хочет запускаться. Битый час сижу над этим дерьмом. P.S. Скорее всего руки у меня кривые.
https://ideone.com/iK76G3
Аноним 10/04/18 Втр 00:13:09  1171018
>>1171009
https://pastebin.com/qD9yFRMq
Результат:
f1: 28.039000
f2: 19.173000

Завтра проверю в gcc, может другие числа будут.
Аноним 10/04/18 Втр 00:15:13  1171020
>>1171017
Знак умножения пропущен.
e определена в константах.
Тебе в плюсотред.
Аноним 10/04/18 Втр 00:16:34  1171021
>>1171017
Добавлю к замечаниям предыдущего анона, что ^ - это оператор побитового исключающего или, а степень - это функция pow().
Аноним 10/04/18 Втр 00:18:03  1171024
>>1171021
А еще есть exp.
Аноним 10/04/18 Втр 00:20:21  1171027
>>1171018
Откуда у тебя там вторые + size взялись при вычислении указателей? Зачем? Мы считаем относительно предыдущего указателя. y - это память, следующая за size элементами в x, а res - это память, следующая за size элементами в y.
Аноним 10/04/18 Втр 00:28:33  1171031
>>1171020
Спасибо что отозвались Аноны, вагон чая и уважения вам. Я поменял но все равно не врубается. https://ideone.com/wgsAbX
Аноним 10/04/18 Втр 00:34:25  1171034
>>1171031
Английский язык говорить? Сообщение об ошибка читать? Где переменная a объявлять? Нигде не объявлять? Вот и не врубаться.

>>1171018
Алсо, тест-кейс у тебя был очень хуевый. Сумма там заменится на i * 2, а учитывая, что у f1() сайдэффектов нет (она ничего не возвращает, и вообще почти не влияет на мир за своими пределами), нормальный компилятор вообще может выкинуть все ее содержимое на ненадобностью.
Аноним 10/04/18 Втр 08:01:35  1171078
Пардоньте, а нет ли аналага fopen такого, что б ему не нультерминированную строку требовалось передавать, а буфер и его длинну? Или только напрямую с sysenter возиться?
Аноним 10/04/18 Втр 08:54:42  1171088
>>1169105
Правильные ребята используют tail-рекурсию.
Аноним 10/04/18 Втр 09:48:43  1171105
>>1171088
>Правильные ребята
в плане правильно ебутся в жопы.
Аноним 10/04/18 Втр 14:40:44  1171234
>>1171078
Системный вызов open() сам хочет нультерменированную строку. Напиши себе обертку, которая будет копировать имя в массив и по указанному офсету втыкать \0.
Аноним 10/04/18 Втр 15:04:53  1171256
>>1171234
Так и придётся делать, спасибо.
Аноним 10/04/18 Втр 21:53:02  1171420
>>1156306 (OP)
Поясните за realloc, нужно free вызывать для старого указателя? т.е если new_ptr = realloc(old_ptr, new_size);
нужно потом делать free(old_ptr);?
Аноним 10/04/18 Втр 22:00:22  1171426
>>1171420
Если realloc() сфэйлился, твой указатель остается твоим, и ты должен его освободить. Если realloc() прошел успешно, ты заботишься только о том указателе, который тебе вернули. Старый указатель уже не твой. Кстати, realloc() может вернуть тебе твой же старый указатель, если есть возможность просто добавить памяти в выделенный блок, поэтому было бы странно, если бы тебе нужно было его освобождать.
portaudio Аноним 11/04/18 Срд 22:11:18  1171919
Ребят, кто знаком с этой звуковой либой (или понимает, что мне нужно), расскажите, почему в output буфер можно писать любые типы, но советуют float'ы (это из-за модуляции волны?).
PortAudio supports audio input and output in a variety of sample formats: 8, 16, 24 and 32 bit integer formats and 32 bit floating point, irrespective of the formats supported by the native audio API.

Алсо, если я хочу написать простую говорилку текста или мелодию из марио, то что мне нужно знать? Надо взять библиотеку полегче или же книжку потяжелей?
Аноним 12/04/18 Чтв 02:04:04  1172032
>>1171919
Возьми OpenAL и не еби себе мозг.
Аноним 12/04/18 Чтв 18:28:25  1172438
В чужом коде наткнулся на объявления функций в таком виде:

int some_func(a, b) int *a; int b;
{
....
}

Зачем так делалось?
Аноним 12/04/18 Чтв 18:32:22  1172441
>>1172438
Видимо код совсем древний, во время K&R (ло принятия ANSI стандарта) так писали.
Аноним 12/04/18 Чтв 18:42:11  1172453
Пытался написать слияние массивов в том стиле, в котором написана qsort.
С double и int вроде норм работает, а вот структуры обмениваются полями. Где я накосячил?

https://pastebin.com/ZZEzmk0C
Аноним 12/04/18 Чтв 19:08:20  1172491
>>1172441
Это код из проекта, который появился после 2000 года.
Аноним 12/04/18 Чтв 20:58:53  1172552
>>1172453
Да вроде все норм. Смущает только вычисление длины хвоста массива в последних двух memcpy, не понимаю твоей логики. Покажи минимальный компилирующийся пример, который не работает.
Аноним 12/04/18 Чтв 21:33:55  1172575
>>1172552
if(ind1 + ind2 < size_result)
{
....if(ind1 < size1)
........memcpy(curr_pos, (char)(arr1) + ind1sizeof_element, (size_result - size2 - ind1)sizeof_element);
....if(ind2 < size2)
........memcpy(curr_pos, (char
)(arr2) + ind2sizeof_element, (size_result - size1 - ind2)sizeof_element);
}
return EXIT_SUCCESS;

После того, как прошли цикл, может случиться лишь один из 3 вариантов:
1. ind1 + ind2 == size_result. Тогда места в результирующем массиве не осталось, надо выходить.
2. ind1 + ind2 < size_result, но один из массивов (пусть первый) кончился. Тогда ind1 = size1, в результирующем массиве осталось size_result - ind1 - ind2 = size_result - size1 - ind2 ячеек, которые нужно скопировать из второго массива, начиная с ind2-того элемента.

Я и сам проверил на паре примеров, вроде все норм. Видимо, я с указателями проебался.
Аноним 12/04/18 Чтв 21:43:45  1172576
>>1172575
> в результирующем массиве осталось
Ну я просто не понял, что именно задает юзер в size_result. Допустим, у нас массивы int a[5] = { 0, 1, 2, 3, 4 } и int b[1] = { 0 }, а size_result 10 элементов (если size_result всегда равен сумме длин массивов, то зачем он вообще?), тогда мы копируем: size_result(10) - size2(1) - ind1(1) = 8 элементов. И у нас случается ОЙ.
Аноним 12/04/18 Чтв 23:00:25  1172618
>>1172576
В данной функции (она не вещь в себе, а часть некоторой программы для комбинаторной оптимизации) первых два массива в сумме точно больше результирующего.
В первом массиве лежат инициализирующие элементы, во втором -- новые, полученные из инициализирующих. Потом мы выбираем из обоих массивов лучшие элементы и полученный массив делаем новым инициализирующим. Те элементы, что не вошли в новый массив, являются мусором.
Аноним 12/04/18 Чтв 23:01:36  1172620
>>1172618
Хотя можно было бы добавить что-то типа if(size1 + size2 < size_result) {return POSHOL_NAHOOY;}
Аноним 13/04/18 Птн 15:38:09  1172927
>>1156306 (OP)
Анон, как устроенна работа GPU, у которых есть своя собственная память? Вот я, например, всегда работал с платами с видеокартой, у которой нет встроенной памяти, и здесь всё просто - графика из юзерспейса элементарно копируется в RAM, пинается GPU, который потом по DMA забирает данные, обрабатывает их и пишет результат во фреймбуфер опять же в RAM.
Аноним 13/04/18 Птн 17:59:52  1173029
>>1172927
> юзерспейса элементарно копируется в RAM
Вот ето поворот.
А где был юзерспейс?

Аноним 13/04/18 Птн 20:27:06  1173124
>>1173029
В свопе.
Аноним 13/04/18 Птн 22:21:06  1173221
Посоны, существует ли какой-нибудь сайт, куда можно выложить код, чтобы его похуесосили, пояснили за элементарные ошибки не те ошибки, которые делают код нерабочим, их я сам могу найти. Ошибки уровня "так делают только мудаки", стиль и прочее?

Гитхаб не то. Туда я выложу, и он будет висеть джва года без просмотров.
Аноним 13/04/18 Птн 22:31:06  1173226
>>1173221
>существует ли какой-нибудь сайт
https://govnokod.ru/
Аноним 13/04/18 Птн 23:10:56  1173240
>>1173221
всю жизнь хочешь провести в зависимости от мнения окружающих?
Аноним 13/04/18 Птн 23:36:29  1173262
>>1173221
https://codereview.stackexchange.com/
Аноним 13/04/18 Птн 23:44:15  1173275
>>1173262
Благодарю, то что надо.
Аноним 14/04/18 Суб 10:28:27  1173437
Встречается такой стиль объявления функций:

int
function(char *s)
{
}

Объясните, какие преимущества даёт размещение возвращаемого типа в отдельной строке?
При этом в заголовочных файлах эти же в одной строке.
Аноним 14/04/18 Суб 15:54:16  1173603
>>1173437
Конпелятору похуй. Дело вкуса.
Аноним 14/04/18 Суб 16:13:24  1173613
Как в сублайме включить вывод ошибок для Си? Работаю на линухе, если это имеет значение.
Аноним 14/04/18 Суб 17:04:10  1173661
Антоны, что использовать для перехвата нажатия клавиши в Си?
Аноним 14/04/18 Суб 18:53:36  1173712
>>1173437
Если тип возвращаемого значения длинный, или конвенция вызова указывается, то искать глазами имя функции проще:
const struct myyoba_data_store * MYLIB_CALLTYPE
function(void)
{
}

>>1173613
Билд-система для gcc и/или для Makefile уже есть в комплекте, нажми Ctrl+B. При даблклике на сообщение об ошибке оно переходит к нужной строке. Если хочешь ошибки инлайном, скажи "show_errors_inline": true в настройках. Если у тебя кастомный билд, сделай .sublime-build свой, там всего лишь регэксп для сообщений сочинить.

>>1173661
В Си - ничего. Какая ОС? Клавиша в графическом приложении или в консоли?
Аноним 14/04/18 Суб 19:41:51  1173739
>>1173712
>В Си - ничего. Какая ОС? Клавиша в графическом приложении или в консоли?
В консоли. ОС - Linux Gentoo.
Аноним 14/04/18 Суб 19:53:27  1173749
>>1173739
Опиши нормально задачу. У кого ты клавиши перехватывать собрался, зачем? Ты там reptyr какой-нибудь пишешь, или что?
Аноним 15/04/18 Вск 09:57:48  1174056
>>1173749
Пишу рогалик в терминале.
Аноним 15/04/18 Вск 13:35:14  1174146
>>1174056
А ты действительно изучил хотя бы основы сишечки?
fgets, gets, scanf...
Аноним 15/04/18 Вск 14:50:42  1174187
C11, хотя неважно. Есть:
#define PROGRAM program
Почему вместо того, чтобы работать так:
const char msg[]=#PRORGRAM ":Unable to do smth\n"
оно (gcc) выдаёт "stray # in somewhere..."
Оно работает только так:
#define STR(a) #a
const char msg[]=STR(PROGRAM) ":Unable to do smth\n"
И тогда в сообщении будет имя программы, как положено.
Что-то в связи с последовательностью работы препроцессора, порядком раскрытия макросов чтоли, но мне непонятно, что именно ему мешает по-человечески со мной...

Аноним 15/04/18 Вск 14:52:56  1174189
>>1174187
Так, только не надо вот говорить, что это потому, что я #PRORGRAM написал.
Нее
Аноним 15/04/18 Вск 14:55:33  1174195
>>1174187
>#define PROGRAM program
Попробуй утакуот
#define PROGRAM "program"
Аноним 15/04/18 Вск 14:56:41  1174197
>>1174195
Пробовал, нихрена.
Да и бессмысленно это.
Аноним 15/04/18 Вск 14:57:50  1174201
>>1174195
А, всмысле, потом PROGRAM уже без '#' подставлять?
Аноним 15/04/18 Вск 15:03:28  1174208
>>1174201
До. У тебя же строка
Аноним 15/04/18 Вск 17:24:21  1174300
>>1174187
> "stray # in somewhere..."
# - это макрооператор, оно часть препроцессора, а не языка, работает только в макросах.

> #define STR(a) #a
Тоже неправильно, оно всего лишь обернет аргумент в кавычки, не попытавшись его раскрыть:
#define FOO bar
STR(FOO) // Тут получится "FOO", а не "bar".

Для раскрытия макросов нужен еще один уровень:
#define STR_(a) #a // Обернет в кавычки.
#define STR(a) STR_(a) // Выполнит макроподстановку для a.

А про #define PROGRAM "program" уже написали выше, строковые литералы отлично конкатенируются безо всяких операторов.
Аноним 15/04/18 Вск 17:26:18  1174304
>>1174300
> #define FOO bar
STR(FOO) // Тут получится "FOO", а не "bar".

А почему у меня всегда bar?
Аноним 15/04/18 Вск 17:35:46  1174310
>>1174304
https://ideone.com/KLwTN3 (внизу)
Аноним 15/04/18 Вск 22:44:38  1174555
>>1174310
Я упоролся, соре.
Всё там, как и ожидалось.
Аноним 15/04/18 Вск 23:43:28  1174621
>>1174310
Эт что за магия!? оО
Аноним 16/04/18 Пнд 03:56:29  1174700
сап аноны, поясните за передачу tar архива по tcp с помощью сокетов.
Аноним 16/04/18 Пнд 07:36:23  1174727
А 9-битовый тип данных можно организовать?
А то 8 бит мало, а 16 много, чтобы возводить флаги. Контролируемых ситуаций 9.
Аноним 16/04/18 Пнд 07:37:08  1174728
>>1174727
Хотя каковый в этом смысл, там же всё равно выравниваться в итоге будет по крайней мере по 8 битам, да?
Аноним 16/04/18 Пнд 07:37:52  1174729
>>1174728
Да.
Аноним 16/04/18 Пнд 11:48:18  1174825
>>1174700
Открываешь сокет, передаешь. Не забываешь, что send может передать меньше, чем ты ему сказал, поэтому внимательно обрабатываешь код возврата.
Аноним 16/04/18 Пнд 14:22:33  1174901
Kratkoe-rukovod[...].jpg (12Кб, 300x241)
Хелп
Нужно написать Windows драйвер (мне вроде KMDF подходит), который будет считывать значение TSC: Time stamp counter, счетчик тактов (на самом деле не TSC, а MSR мне нужно) регистра процессора и записывать новое значение в этот регистр.

Проблема в том, что я вообще не понимаю как в этом блядском Windows всё работает и не понимаю где взять источник информации.
C Линуксом всё просто и аналогичный драйвер (в линуксе это был модуль ядра) я уже написал, потому что по Линуксу тонна материала в интернете.

Посоветуйте инфы (книги, ссылки, статьи, можно все на англ, но лучше на русском), чтобы разорбаться в том, как писать драйвера (KMDF) для Windows.

В Windows Internals судя по оглавлению не раздела про написание драйверов. А на сайте Microsoft написано мало и не полно как-то, хотя может я и жопой читал
Аноним 16/04/18 Пнд 14:46:24  1174909
>>1174901
Есть книга про драйверопесание под венду, гугли, лентяй
Аноним 16/04/18 Пнд 17:39:11  1174995
>>1174700
man netcat
Аноним 16/04/18 Пнд 17:52:56  1175003
>>1174901
Windows Must Die
Аноним 16/04/18 Пнд 17:55:08  1175008
771px-Windowses.jpg (64Кб, 771x599)
>>1175003
>Windows Must Die
Аноним 16/04/18 Пнд 19:52:31  1175041
>>1174901
Качаешь DDK (можно, и даже возможно лучше - несвежий какой-нибудь). Читаешь документацию из комплекта (для такой простой хуйни достаточно введение прочитать). Правишь любой простой пример из комплекта. Компилируешь. Алсо, у MS сейчас все свежие примеры на гитхабе лежат.
Аноним 17/04/18 Втр 13:44:37  1175326
друзья, помогите с правильным ответом на вопрос: вот например у нас есть указатель на первый элемент массива a и указатель b на nй элемент массива, (b-a+1) - индекс элемента массива, так вот вопрос, нахера мы единицу прибавляем? нужен именно правильный ответ. Заранее спасибо
Аноним 17/04/18 Втр 14:45:44  1175337
>>1175326
Ну, смотри: спасибо, что посмотрел.
Аноним 17/04/18 Втр 14:54:15  1175343
>>1175337
объясни, не понял
Аноним 17/04/18 Втр 15:09:42  1175347
>>1175343
Потому что
> указатель на первый
а не на нулевой.
Аноним 17/04/18 Втр 15:11:49  1175349
>>1175326
Правильный ответ: единицу прибавлять не нужно. Если у тебя указатели равны, то их разница 0, и индекс массива тоже 0, ничего прибавлять не нужно. Если у тебя 1-based массивы, то это другой язык, и тебе в другой тред.

Аноним 17/04/18 Втр 16:33:52  1175420
>>1175347
>>1175349
извиняюсь, конечно, указатель на нулевой элемент, я так и ответил, но сказали, что не правильно
Аноним 17/04/18 Втр 16:35:59  1175424
>>1175420
Шли их нахуй. Смело, решительно. Может ты задание не так понял? Может, тебе количество элементов посчитать с первого по второй указатель? Тогда будет как раз +1). Иначе шли нахуй.
Аноним 18/04/18 Срд 16:34:27  1176042
Вроде тот тред. По заданию нужно сделать двустороннюю полудуплексную передачу данных в одном канале между родственными процессами, используя семафоры для синхронизации. Собственно, у меня вопрос - один канал и двусторонняя передача совместимы? Мы же один из дескрипторов обязаны закрыть.
Аноним 18/04/18 Срд 17:48:56  1176102
>>1176042
хорошее задание, у тебя неплохой препод в вузике
делай его самостаятельно, будет полезно
Аноним 18/04/18 Срд 17:50:53  1176106
>>1176042
конечно, в этом и суть полудуплекса
режим рации

Аноним 18/04/18 Срд 18:23:31  1176136
>>1176102
>>1176106
Так, падажжите. Нам говорили, что при работе с каналом мы обязаны закрыть для себя вход или выход, смотря читаем или пишем. Обратно открыть мы не можем. Так что я как-то не понимаю, как это сделать.
Аноним 18/04/18 Срд 19:13:54  1176170
Screen Shot 201[...].png (28Кб, 628x236)
>>1156306 (OP)
Поясните за hash функции, как их пишут? Методом тыка? Или есть теория?
Аноним 18/04/18 Срд 19:14:49  1176172
>>1176136
Давай для начала определимся, что такое канал. По-английскиПо-человечески оно как называется?
Аноним 18/04/18 Срд 19:20:07  1176174
>>1176172
То, которое pipe(fd)
Аноним 18/04/18 Срд 19:27:36  1176178
>>1176170
Ты хотя бы википедию почитал прежде чем такой глупый вопрос задавать. Хэш рование, криптография и всякое такое. Там де про алгоритмы узнаешь.
Аноним 18/04/18 Срд 19:41:47  1176184
>>1176178
Хэш на пике не имеет никакого отношения к криптографии. Дизайнят руками, смотрят на распределение.

>>1176174
Пайп действительно однонаправленный, но если у тебя parent/child, то тебе нужно просто писать в правильный конец. Закрывать дескрипторы нужно не потому, что иначе не работает, а для того, чтобы read() мог отследить EOF на пайпе (если у тебя открыт write-дескриптор на пайп, read() не вернет 0, даже если на той стороне write-дескриптор закроют).
Аноним 18/04/18 Срд 19:51:11  1176192
>>1176184
И как тогда мне, спрашивается, "Самостоятельно, используя для синхронизации процессов семафоры, организовать двустороннюю
поочередную (полудуплексную) связь процесса-родителя и процесса-ребенка через канал"? В задании-то канал один. Сделаю через два пайпа, хз.
Аноним 18/04/18 Срд 19:52:37  1176193
>>1176184
>>1176192
Алсо, есть идея послать EOF и тем самым схитрить, но быстрый поиск не помог.
Аноним 18/04/18 Срд 20:27:23  1176225
>>1176192
У тебя два процесса, один пайп. У каждого процесса есть два хэндла - на чтение и на запись. Родитель такой семафором помахал, записал, а потомок читает. Потом потомок помашет, запишет, а родитель прочитает. Получается полудуплекс, ну. Оба могут писать в канал, но в конкретный момент времени - только один. Рации всмомни: - У нас тут какая-то хуйня, приём. - И у нас тоже, приём. - Да ебись оно все конем, конец связи. - вот это тебе и нужно реализовать.
Аноним 18/04/18 Срд 20:30:40  1176232
>>1176225
Так вон выше говорят, мол, нельзя, read зависнет. В общем-то о таком и думал, но все упиралось в то, что во всех примерах одна сторона пайпа в родителе/потомке таки закрывалась.
Аноним 18/04/18 Срд 20:37:32  1176236
>>1176232
Это я писал. read() зависнет, если ты будешь в цикле читать. Не читай в цикле - смотри через ioctl(..., FIONREAD...), сколько есть и читай. Прояви фантазию, в общем - там вариантов дохуя.
Аноним 18/04/18 Срд 20:47:03  1176243
>>1176236
Мы такой хуйни не проходили. Ладно, буду побайтово читать, ожидая встретить нуль-терминатор. Попробую, по крайней мере.
Аноним 19/04/18 Чтв 15:03:18  1176675
Двач. Вот прочитал я некоторое количество книг из шапки, с переменным успехом решаю задачки на всяких Codefights, Codewars и тд, но до сих пор не могу понять, куда реально можно приложить Си. Посоветуй какие нибудь книжечки с примерами, где поясняются реальные программы.
Аноним 19/04/18 Чтв 15:30:09  1176703
>>1176675
ОС, компиляторы и прочие движки БД.
Аноним 19/04/18 Чтв 15:47:24  1176716
>>1176675
Advanced Programming in UNIX environment
Programming Applications for Microsoft Windows
Читай документацию по нужной ОС, читай чужие исходники.

> куда реально можно приложить Си
Куда угодно. Если тебе нечего написать, зачем ты вообще учил язык?
Аноним 19/04/18 Чтв 16:02:47  1176725
>>1176675
Железо программировать. Хотя это немного узкая область, не каждому интересно это
Аноним 19/04/18 Чтв 18:38:04  1176826
>>1176675
Модуль для питона напиши.

Аноним 19/04/18 Чтв 20:47:09  1176888
Анон, решаю тут K&R из шапки и застрял на задании 1-18: https://pastebin.com/A7cJtdG1 (там задание тоже написано). Вроде как код написал, в голове всё сходится, но бля, оутпут просто пиздец. Символы, которые я пропускаю, а именно множественные табы и пробелы, заменяются на какую-то хуйню полную. Типа знаки вопроса или что-то на уровне, хотя по сути, я их просто бля пропускаю и всё, забываю на всегда. Познавшие аналы си, подскажите, что не так?
Аноним 19/04/18 Чтв 21:20:01  1176926
>>1176888
Точно хочешь узнать, что не так в твоей реализации (сейчас не могу), или тебе просто задачу решить. Может, перепишешь? Алгоритм простой: ты читаешь всю строку, сколько ее ни есть, но если прочитанный символ - не таб и не пробел, ты запоминаешь его индекс в переменную. Перед выходом просто пишешь по индекс+1 символ '\0'. Четыре строки на тело getline. Если возвращенная getline строка пустая (по нулевой позиции \0), ты ее пропускаешь.
Аноним 19/04/18 Чтв 21:24:04  1176932
>>1176888
Хотя, если что, одна из твоих проблем в том, что i ты инкрементишь каждую итерацию, а в массив по i пишешь не всегда. Судя по высказыванию "оутпут просто пиздец", у тебя в незаписанных элементах массива куски предыдущих строк и прочий мусор.
Аноним 19/04/18 Чтв 21:33:42  1176937
>>1176932
Лол.
Спасибо. Действительно в этом и было дело
Аноним 20/04/18 Птн 17:02:36  1177300
https://pastebin.com/5FCsNe3T
Котаны, почему в файл попадает мусор вместо настоящего содержания конца текста?
Аноним 20/04/18 Птн 17:45:25  1177325
Где я объебался и где мой полудуплекс-то?
https://pastebin.com/ABTiR204
Аноним 20/04/18 Птн 17:53:48  1177327
f.png (83Кб, 1051x657)
>>1177300
не попадает
но это на другой платформе и с учетом правки параметров вызова calloc
Аноним 20/04/18 Птн 18:04:28  1177332
>>1177327
>с учетом правки параметров вызова calloc
Ошибка появилась из-за смены malloc/calloc.

Спасибо, попробую дома на линупше с гцц запустить.
Аноним 20/04/18 Птн 19:25:12  1177362
>>1177325
Ты бы для наглядности msg высылал, а не всегда [0].
Вывод ни о чём.
Аноним 20/04/18 Птн 19:26:21  1177363
>>1177362
Я хотел высылать msg, но у меня происходит segfault. Что странно.
Аноним 20/04/18 Птн 20:04:17  1177377
>>1177363
Ну, семафор 0 довольно прозрачный. Но вот с первым дела, конечно...
Допустим, родитель первый захватил. Значение семафора 1 равно 1: данных в канале нет, hd=0. Потом сделал семафор 1 нулевым. Освободил нулевой семафор...
Пошёл дочерний. Семафор 1 нулевой => данные есть. hd=1 => Дописали единицу к семафору 1. А это признак отсутствия данных для родителя, да? Родитель ничего не читает, а лишь уменьшает семафор на 1, делает его нулевым для нас, а мы снова ему срём и увеличиваем, а он ничего не читает и для нашего чтения уменьшает
Можно поменять в после родителя и дочку.
Я правильно понял?

Аноним 20/04/18 Птн 20:12:25  1177381
>>1177377
Да, в семафоре 1 единица - признак отсутствия данных. Родитель смотрит на него, если в семафоре не ноль - не пытается читать, а сам пишет и ставит ноль. Если же данные были, то он пишет и семафор не трогает. Если данные были, но все свое уже выслано - увеличивает семафор давая понять, что ничего не высылал.
Аноним 20/04/18 Птн 20:13:48  1177382
>>1177363
Я хз, что если инициализировать нулём semval в main(), а потом просто читать с sem_op=-1, а писать с sem_op=1.
Так же прозрачнее будет, ИМО.
Вообще, с этой hd как-то некрасиво.
Аноним 20/04/18 Птн 20:15:53  1177386
>>1177381
Так у тебя после второго цикла родителя/потомка получается, что выставляется значение семафора "читать нельзя", а при этом пишутся данные.
Зачем?
Аноним 20/04/18 Птн 20:18:27  1177387
>>1177377
>>1177386
Так он не добавляет 1 к семафору же. S < 5 (выслано меньше пяти сообщений), а if(hd) засунуто в else к первому условию.
Аноним 20/04/18 Птн 22:23:54  1177450
>>1177300
Потому что нужно выделять на байт больше и дописывать \0 в конец. А вот calloc() там в хуй не уперся, все равно fread() все затрет.
Аноним 20/04/18 Птн 23:37:03  1177494
>>1177387
А может быть так, что родитель ни разу не даёт потомку ресурс, а потом в конце if(hd) и ставит семафор 1 в единицу, а потомок потом получает ресурсы, но уже не читает?
Я понимаю, что ты несколько раз прокрутил, но всё же...
Аноним 21/04/18 Суб 00:28:14  1177520
>>1177450
Это первое, что я нагуглил и проверил (выделил calloc'ом size+1 элемент), не сработало.

Вообще, что делают нормальные люди, если требуется распарсить несколько тысяч файлов на С, имеющих довольно разнообразную структуру (файл содержит список переменных, которые могут идти в любом порядке, и строки-комментарии, начинающиеся с символа "#")? Писать парсер с нуля довольно утомительно.
Аноним 21/04/18 Суб 00:32:10  1177531
>>1177520
> не сработало
-Wall скажи, и тебе компилятор объяснит, кто ты.

> что делают нормальные люди, если требуется распарсить
Берут flex или его отродья. Хотя такое и вручную несложно написать.
Аноним 21/04/18 Суб 11:09:22  1177644
>>1177494
В общем, я понел. Пока потомок форкается - предок успевает уже все прокрутить, сам с собою поговорить, удалить семафоры и завершиться. Похоже, что способ снхронизации надо переделать.
Аноним 21/04/18 Суб 11:40:26  1177651
Screenshot3.png (14Кб, 626x503)
>>1156306 (OP)
У вас ссылка не рабочая.
Аноним 21/04/18 Суб 13:18:38  1177698
В общем, спасибо всем за помощь, таки синхронизировал. Пришлось сделать три семафора, и жопой чую, что можно было проще. Если кто подскажет, как это упростить - буду благодарен.
https://pastebin.com/grPm2q6A
Аноним 21/04/18 Суб 16:21:52  1177769
>>1177698
Гораздо проще это с помощью select делать.

Аноним 21/04/18 Суб 16:46:26  1177797
>>1177698
Вообще, у тебя основная сложность из-за того, что ты долбишься с тем, что у тебя +-1+1-1+-+-1 везде. Абсолютные бы значения, а не смещения.
semctl умеет в SETVAL и GETVAL, ты можешь
помирить родителя и потомка на том, что если один записал, то значение P, если другой записал, то значение C, в противном случае ноль.
А от 0 до SETVMX можно организовать битовые масочки на "родитель может читать",
"родитель может писать", "потомок может читать", "потомок может писать".
Но это всё очень абстрактно, сам так не делал.
Аноним 21/04/18 Суб 18:23:47  1177846
>>1177698
Еее, многопоточность.
Аноним 21/04/18 Суб 19:07:48  1177857
>>1177846
Многопроцессность , что в Линухе довольно схоже
Аноним # OP  21/04/18 Суб 20:16:30  1177879
>>1177651
Спасибо.
Аноним 22/04/18 Вск 01:36:24  1178078
аноны помогите нуфагу разобраться в коде пжалста, (https://pastebin.com/t27m9qKh)

что за конструкция по шагам:
1)BYTE b = (BYTE)&k;
2)if(++j==16&&i<398){
Аноним 22/04/18 Вск 02:32:56  1178102
>>1178078
> BYTE b = (BYTE)&k;
Берется указатель на переменную, которая лежит в области данных.

> if(++j==16&&i<398){
Распечатывается хексдамп начиная с переменной выше. Зачем в условии вторая часть, я хуй знаю, а первая часть нужна, чтобы втыкать конец строки и (неправильно) печатать адрес после каждых 16 байтов.
Аноним 23/04/18 Пнд 23:18:20  1178487
>>1177300
>https://pastebin.com/5FCsNe3T
int main()
{
char filename = "C:/Users/m08kaa3/Desktop/projects/Sheduling/simulation/10/gen_10.spc";
FILE
config = fopen(filename, "r");
fseek(config, 0, SEEK_END);
long size = ftell(config);
fseek(config, 0, SEEK_SET);
char * conf_text = malloc(size);
memset(conf_text, '\0', size);
fread(conf_text, sizeof(char), size, config);
printf("%s\n", conf_text);

//Если это не выведет лишних символов значит в файле в конце есть мусор. Если мусор пропал то удали эту проверку и уповай на memset(), мусор бывает когда память неинициализирована, даже если она статическая.
fseek(config, 0, SEEK_SET);
fgets(conf_text, 1024, config);
puts(conf_text)


fclose(config);
free(conf_text);
}
Аноним 23/04/18 Пнд 23:31:06  1178500
Посоветуйте техник парсинга файлов.
На-до-е-ло.
> просрал символ
> просрал разделитель
> EOF появился неожиданно
> недозаполнил и мне норм
> исправил пункты 1-4, но функция парсинга использует 100500 флагов состояния и занимает треть программы
Аноним 23/04/18 Пнд 23:33:19  1178505
>>1178500
Имею в виду литературу, где это есть, статейки занятные, в которых предлагают перейти на perl
Аноним 24/04/18 Втр 00:07:01  1178524
>>1178487
Обсуждали выше. Размер файла 10, выделили 10 байт памяти, записали 10 байт, но это не сделало эти 10 байт строкой, которую можно вывести через printf, потому что \0 никто не дописал. Выводим это говно, получаем все что угодно - от мусора до сегфолта. На самом деле, можно printf("%.*s\n", size, conf_text);

>>1178500
Уже советовали flex.
Аноним 24/04/18 Втр 00:41:26  1178551
>>1178500
>Посоветуйте техник парсинга файлов.
recursive descendant
Аноним 24/04/18 Втр 01:57:21  1178568
>>1178500
>парсинга файлов
коких файлов? со смайликами или бинарными залупами?
Аноним 24/04/18 Втр 07:29:53  1178621
>>1178568
Строки ASCII-символов.
Аноним 24/04/18 Втр 14:24:36  1178789
>>1178621
Разделяй их на пробелах.
Аноним 24/04/18 Втр 18:51:05  1178952
>>1178524
Кажется вы там замороченой хуйни насоветовали. Можно же вывести printf("%s\0", buf);
Аноним 24/04/18 Втр 23:15:11  1179127
>>1178952
Строка -- это массив char@, заканчивающийся нулем.
printf("%s\0", buf) говорит: выведи мне строчку buf, потом добавь "\0".
Принтф начинает писать buf. Пишет, пишет, пишет, далее варианты:
1. Залезает в запрещенную область.
2. Упирается в случайно найденном в мусоре 0.
В первом случае шлет нахуй, во втором кроме сроки выводит всякое говно.
Аноним 24/04/18 Втр 23:22:06  1179132
>>1179127
Уговорил чёрт языкатый.
sprintf(buf1, "/%%ds\0", size);
printf(buf1, buf);
Аноним 24/04/18 Втр 23:22:41  1179133
>>1179132
фиксить не буду, нутыпонел.
Аноним 24/04/18 Втр 23:50:14  1179146
>>1178952
>>1179132
Лолшто?

На самом деле достаточно fwrite(..., stdout), но мы говорили о строках.
Аноним 25/04/18 Срд 13:46:38  1179357
ЧЯДНТ?
Отслеживается 9 true/false состояний для, соответственно, 9 значений ячейки. Приходится юзать uint16_t.
#define BIT_MASK(val) (1<<(val-1))
...
// Добавить val к маске
ban_vals|=BIT_MASK(curval);
if(!(ban_vals&BIT_MASK(curval))
write(0, "NIPANIMAT", strlen(<-von_to_govno);
Как после OR'а у меня НЕ-И выдаёт тру?
Было ...000000000
Я заполнил 2,3,5:
...000010110
Потом чекаю отсутствие, допустим, 2-го, т.е.
if(!(...000010110 & ...000000010)) - должен дать false, почему даёт true?

Аноним 25/04/18 Срд 18:49:49  1179535
>>1179357
Я чот не понял, как ты 9 бит используешь в одном байте?
Аноним 25/04/18 Срд 18:55:39  1179539
>>1179535
> uint16_t
Действительно
Я та мтроеточие ставил, что 7 оставшихся не писать.
Забейте, чуда не случилось, я обосрался в другом месте.
Аноним 25/04/18 Срд 18:55:44  1179540
>>1179357
Запусти дебаг и отследи все, можешь промежуточных переменных добавить.
И не еби мозги.
Аноним 25/04/18 Срд 18:59:13  1179543
>>1179539
Да ты по всем фронтам обосрался. Тебе нужно работать с отдельными байтами по 8 бит, использовать можно тип short. Так то по теме проверки бит на чёткость уже кучи материала, но блядь, это же не строка чтоб сразу сравнивать все 9 из 128 бит.
Аноним 25/04/18 Срд 19:01:36  1179544
>>1179543
Падажи, uint16_t это 16-битный.
Аноним 25/04/18 Срд 19:02:46  1179545
>>1179543
И short на наших современных x86_64 чаще всего int16_t, не? А то и больше.
Аноним 25/04/18 Срд 19:07:00  1179547
>>1179357
Все должно работать. Разве что твоя нумерация битов с единицы сбивает с толку, но она у тебя консистентная, поэтому не приводит к проблемам.
Аноним 25/04/18 Срд 19:10:01  1179550
>>1179544
Пардон, попутал.
Аноним 25/04/18 Срд 19:11:33  1179551
>>1179545
Мне кажется что int16_t это нечто другое. Впрочем не вижу смысла использовать именно его. Почему бы не копнуть в сторону bit field?
Аноним 25/04/18 Срд 19:16:33  1179552
>>1179551
> Впрочем не вижу смысла использовать именно его.
Например, есть ограничения по памяти. А так бы я тоже предложил unsigned int или хотя бы что-то типа uint_fast16_t.
> Почему бы не копнуть в сторону bit field
Внутри одной программы вполне норм, хотя и сводится к асболютно тому же коду, что и проверка побитовыми операциями. Плюс установка двух-трех флагов за раз вручную может оказаться дешевле битфилдов. Но битфилды непереносимы, т.е., если у >>1179357 сетевые пакеты, то ему все равно придется доставать флаги из битфилдов и паковать в инты для передачи по сети.
Аноним 25/04/18 Срд 19:19:30  1179554
>>1179552
Ненужно. Битфилды сформированные из инта будут интом и там и там, разница проявится если разная архитектура и внезапно инт не 32 бита а меньше или больше.
Аноним 25/04/18 Срд 19:20:21  1179555
>>1179554
> Битфилды сформированные из инта будут интом
Вот только порядок и выравнивание будут отличаться от компилятора к компилятору.
Аноним 25/04/18 Срд 19:22:06  1179556
>>1179555
Нахуя это учитывать?
Аноним 25/04/18 Срд 19:28:18  1179562
>>1179556
Ну что ж ты тупишь? Ты написал свой Телеграм, Вася скомпилировал его вижуал студией под x86, а Петя - gcc под Байкал. У Васи первый флаг располагается в младших битах, а у Пети в старших, и вы не можете даже поговорить об этом, потому что из-за этих различий вы по сути пользуетесь разным протоколом.
Аноним 25/04/18 Срд 19:29:58  1179563
>>1179562
Так это же нормально иметь под байкал отдельную версию ПО или не? Насколько я знаю архитектура почти гарантия совместимости и правильного межпроцессорного взаимподействия.
Аноним 25/04/18 Срд 19:32:13  1179564
>>1179563
> отдельную версию ПО
Ну да, давай велосипеды по двадцать раз переписывать, вместо того чтобы просто сделать flags & SOME_BIT.
Аноним 25/04/18 Срд 19:35:08  1179566
>>1179564
Нет, давай лезть на более низкий уровень имея те же операции в более высокоуровневом представлении.
Аноним 25/04/18 Срд 19:42:14  1179570
>>1179566
> давай лезть на более низкий уровень
Давай. Мы пишем на языке, который именно для этого сделан.
Аноним 25/04/18 Срд 19:45:02  1179572
>>1179570
Ебать ты пряник. Он сделан чтоб ассемблер упростить, а не наоборот.
Аноним 25/04/18 Срд 19:46:24  1179575
Что вы тут срётесь, в C главное переносимость и унификация записи. Весь C пропитан унификацией, как бы вы ни принюхивались, ничего другого здесь нет.
Аноним 25/04/18 Срд 19:47:35  1179579
>>1179575
Моца цопе!
Аноним 25/04/18 Срд 19:53:35  1179586
>>1179575
> переносимость
Лол. Вырастешь большой - поймешь, что Си - один из самых плохо переносимых языков. В то время как код на каком-нибудь Python заработает на новой машинке без модификаций, в Си тебе придется обмазать его толстым слоем ифдефов, и он все равно где-нибудь упадет.

> Весь C пропитан унификацией
C пропитан неопределенным поведением, ты перепутал. Тту даже принюхиваться не нужно.
Аноним 25/04/18 Срд 19:55:06  1179588
>>1179586
тут-туру
Аноним 25/04/18 Срд 19:56:42  1179589
Аноны, не по теме конечно, но есть у меня код просто нереально простого чатобота на js, куда бы его разместить? Могу на си портком сделать.
Аноним 25/04/18 Срд 19:57:55  1179592
>>1179588
Именно. Запускаешь такой свой хелловорлд на DSP с CHAR_BIT=16, и видишь, как твои бананы медленно превращаются в желе.
Аноним 25/04/18 Срд 19:59:15  1179593
>>1179586
>каком-нибудь Python заработает на новой машинке без модификаций
Сляжет от версии Питуна, истину глаголю.
Аноним 25/04/18 Срд 20:01:18  1179595
>>1179593
Есть лишь один истинный питон, и он третий. Поставишь оба.
Аноним 25/04/18 Срд 20:04:38  1179596
>>1179592
А ты я смотрю умный. Скажи, вот я хотел вебкамеру подключить например к своему хловоролду, но не вкурю, что куда прописывать?
Это целый будапешт. Я видел как чувак трёхмерные движки пилит за пол часа, а сам как бы и простейшего не умею, гугл представляет собой лютый пиздец из мешанины hwnd, которые мало того что хуй знает как использовать, так ещё и не найти описания более подробного чем - "это int32, содержит номер окна", это же пиздец. Нет ли бибилиотеки реализующей всю это пвсеводнизкоуровневую хуету искаропки, чтоб вызвал функцию takeFrame(WRBCAM_0, buf, 32, 32); и получаешь заветный кадр в виде массива байт, или это утопия?
Аноним 25/04/18 Срд 20:22:27  1179611
>>1179596
>Я видел как чувак трёхмерные движки пилит за пол часа
Можно ссылку?
Аноним 25/04/18 Срд 20:23:09  1179612
>>1179596
OpenCV, Qt и прочее
Аноним 25/04/18 Срд 20:23:15  1179613
>>1179611
Это не на ютубе дебич, а настоящий человек.
Аноним 25/04/18 Срд 20:23:24  1179614
>>1179596
> Нет ли бибилиотеки реализующей всю это пвсеводнизкоуровневую хуету искаропки
Вообще, сейчас модно брать OpenCV и не думать. А так, в винде с камерами вообще плохо, нужен COM, и дальше есть всякие-разные варианты ебли со всякими DirectShow или WIA. Но есть старый, "неподдерживаемый", но тем не менее рабочий и простой метод: https://msdn.microsoft.com/en-us/library/dd757677%28v=vs.85%29.aspx Там буквально несколько строк:
создаешь окно capCreateCaptureWindow, шлешь ему WM_CAP_DRIVER_CONNECT, WM_CAP_FILE_SAVEDIB, WM_CAP_DRIVER_DISCONNECT и потом ебешь полученную .bmp как тебе угодно. Можно обойтись без .bmp, там можно установить колбеки на фрейм и т. д.

> "это int32, содержит номер окна"
Но это действительно номер окна, и это не обязательно int32, это struct HWND *, и тебя не должно ебать, что там внутри. Это вполне нормальный сишный интерфейс, когда либа работает с указателем на incomplete-структуру, и сама она может обращаться к ее полям, а юзер видит только непрозрачный указатель (хэндл).
Аноним 25/04/18 Срд 20:23:48  1179615
>>1179612
Даже жопнцв пока прикрутишь..
Аноним 25/04/18 Срд 20:26:24  1179619
>>1179615
ленивая жопа, бери йобареколер, который тебе фреймы будет кидать в папку и считывай от туда своим хелоувердом не забывая удалять
Аноним 25/04/18 Срд 20:27:25  1179622
>>1179619
>йобареколер
рекодер
Аноним 25/04/18 Срд 20:29:27  1179623
>>1179614
>>1179619
Ты не понял моего бугурта. Вот есть структура - про неё много чего написали, но упомянуть что она мне нахуй не нужна, забыли.
А я блядь ебусь и 3 дня читаю гугл как эту структуру заполнять, где брать, куда объявить и т.д., чтобы узнать от онона, что эта хуйня может просто висеть где то там и напрягаться по её поводу моветон.
Аноним 25/04/18 Срд 20:31:38  1179624
>>1179623
Вот надо тебе окно - получай ебалу с гибкими настройками вместо #include vsyaHuinya.h createwindow("заголовок",x,y,w,h);
И у винды это ещё по божески, GTK это вообще пиздец.
Аноним 25/04/18 Срд 20:32:56  1179626
>>1179624
Чувство такое что проектировалось это умными, но наглухо отбитыми придурками и не для людей.
Аноним 25/04/18 Срд 20:34:08  1179629
>>1179623
кокая структура? может это она тебе не нужна. но винапи говно, это да. вне контекста задачи, твой бугурт нищитовый.
Аноним 25/04/18 Срд 20:34:28  1179630
>>1179623
> А я блядь ебусь и 3 дня читаю гугл
Зачем читать гугл, когда можно читать документацию? Цитата из MSDN:
> Window Handle
> After creating a window, the creation function returns a window handle that uniquely identifies the window.
> A window handle has the HWND data type; an application must use this type when declaring a variable that
> holds a window handle. An application uses this handle in other functions to direct their actions to the window.
Просто RTFM и все.

Аноним 25/04/18 Срд 20:36:14  1179632
>>1179626
проблема гтк в том, что они хуярят в ооп стиле на си. шли бы путем тикла.
Аноним 25/04/18 Срд 20:36:38  1179634
>>1179630
Не вижу ни слова про то что можно неиспользовать эту ебалу. Читал я msdn, затем метался в гугл из за таких же строк, что мол так и так используй это и это, а где взять - а хуй его знает, начинай с первой страницы msdn, вдруг встретишь.
Аноним 25/04/18 Срд 20:37:48  1179636
>>1179632
Есть у меня одно тёплое воспоминание о GTK, это cairo. Вот уж API проще не встречал, всем бы на него равняться.
Аноним 25/04/18 Срд 20:45:24  1179645
>>1179634
есть джва тома книжек про погромирование под вындовс 95 на винапи, читай, они актуальны, там все разжовано. настоящие погромисты на столько круты, что ответов на их вопросы в интернете нет.
Аноним 25/04/18 Срд 20:45:45  1179646
>>1179596
https://pastebin.com/kp4EaUgc вот тебе минимальный пример. Он говно по многим причинам, но из этого уже можно что-то слепить и/или перейти на нормальный метод когда-нибудь позднее. Компиляция: gcc file.c -luser32 -lavicap32, в студии аналогично (user32.lib, avicap32.lib).
Аноним 25/04/18 Срд 20:47:21  1179647
Вот отличный пример. Берём эту инструкцию
https://msdn.microsoft.com/en-us/library/dd757677%28v=vs.85%29.aspx
Открываем первую страницу
https://msdn.microsoft.com/en-us/library/dd797847(v=vs.85).aspx

И сука таки ни единого слова про подключаемые заголовочные файлы, ни слова в примере вызова функции про то что из себя представляют fOK, hWndC, WM_CAP_DRIVER_CONNECT, где лежат и чего значат.

Теперь второй пример.
cairographics.org/manual/
Открываем документацию
https://www.cairographics.org/documentation/
Первая же страница начинается с лаконичного примера, в котором всё понятно без hWndCdolboёbоv
https://www.cairographics.org/FAQ/#getting_started
Аноним 25/04/18 Срд 20:51:28  1179649
>>1179647
>И сука таки ни единого слова про подключаемые заголовочные файлы
https://msdn.microsoft.com/en-us/library/dd756879(v=vs.85).aspx

наркоман, уходи.
Аноним 25/04/18 Срд 20:52:54  1179650
>>1179646
Вот пример минимальный, в котором хотяб понятно где int.

; Example of making 32-bit PE program as raw code and data

format PE GUI
entry start

section '.text' code readable executable

start:

push 0
push _caption
push _message
push 0
call [MessageBoxA]

push 0
call [ExitProcess]

section '.data' data readable writeable

_caption db 'Win32 assembly program',0
_message db 'Hello World!',0

section '.idata' import data readable writeable

dd 0,0,0,RVA kernel_name,RVA kernel_table
dd 0,0,0,RVA user_name,RVA user_table
dd 0,0,0,0,0

kernel_table:
ExitProcess dd RVA _ExitProcess
dd 0
user_table:
MessageBoxA dd RVA _MessageBoxA
dd 0

kernel_name db 'KERNEL32.DLL',0
user_name db 'USER32.DLL',0

_ExitProcess dw 0
db 'ExitProcess',0
_MessageBoxA dw 0
db 'MessageBoxA',0

section '.reloc' fixups data readable discardable ; needed for Win32s
Аноним 25/04/18 Срд 20:54:49  1179651
>>1179647
> И сука таки ни единого слова про подключаемые заголовочные файлы
В MSDN обычно есть about/using/reference. В about тебе рассказывают, что это такое, как оно работает, нахуй оно нужно, и что вообще существует, в using гайд с примерами, а в reference как раз все описания. Обычно оно все очень сильно перелинковано, но как я уже говорил, технология старая, еще из 95 винды, поэтому ссылок мало. Вот тебе референс про connect:
https://msdn.microsoft.com/en-us/library/dd743891%28v=vs.85%29.aspx
Аноним 25/04/18 Срд 20:58:21  1179653
>>1179651
>https://msdn.microsoft.com/en-us/library/dd743891%28v=vs.85%29.aspx
Спасибо кончено. Но я наверное просто не создан для всей этой залупы. Мой уровень это purebasic, не более, всё что сложнее просто перегружает мозг.
Аноним 25/04/18 Срд 21:01:40  1179655
>>1179653
Моя ссылка недостаточно правильная. Вот тут >>1179649 про макрос, он проще для понимания.
Аноним 27/04/18 Птн 23:04:04  1180787
Эх щас бы в 2К19 винапи ковырять...
Аноним 27/04/18 Птн 23:21:23  1180827
>>1180787
Чому ни? Загугли nirsoft, я когда вижу эти охуенные утилиты весом пару десятков килобайт, но с UI и мощным функционалом, аж трясет от восхищения за того программиста, кто это все дело пилит.
Аноним 27/04/18 Птн 23:36:51  1180843
>>1180787
Эх, щас бы в 2K19 дотнетоговно напрямую с ядром работало.
Аноним 28/04/18 Суб 18:56:35  1181147
А в чем разница между char * = "huj" и char[] = "huj";
Аноним 28/04/18 Суб 18:57:27  1181149
>>1181147
Второе работает?
Аноним 28/04/18 Суб 19:01:27  1181154
image.png (222Кб, 1920x1080)
>>1181149
Аноним 28/04/18 Суб 19:24:43  1181175
>>1181147
https://wandbox.org/permlink/Jsv48iUs3doqZInT
Аноним 28/04/18 Суб 19:38:34  1181189
>>1181147
char*: создает указатель, который указывает на литерал, лежащий в секции данных. Ты можешь изменять сам указатель, но не можешь писать по указателю - строковые литералы ридонли.
char[] создает массив достаточного размера, чтобы скопировать в него литерал (и копирует его туда). Так как это массив, то ты, конечно же, можешь изменять содержащуюся там строку.
Аноним 28/04/18 Суб 19:53:45  1181196
Чем си может быть лучше плюсов в 2к17?
Аноним 28/04/18 Суб 19:54:38  1181198
>>1181196
Си можно выучить на приемлемом уровне менее чем за 10 лет. При этом ты будешь знать, что происходит в коде, а не предполагать.
Аноним 28/04/18 Суб 19:56:31  1181200
>>1181198
А где его сейчас используют? (Кроме GNOME(Слава XFCE)
Аноним 28/04/18 Суб 19:58:07  1181201
>>1181200
ОС, либы, embedded, прикладной софт тоже иногда.
Аноним 28/04/18 Суб 20:07:20  1181205
>>1181196
Жрет меньше ресурсов. Это критично для встраиваемых систем.
Аноним 28/04/18 Суб 20:15:14  1181215
>>1181205
Плохой аргумент. На крестах все еще можно писать в си-стиле.
Аноним 28/04/18 Суб 20:31:34  1181226
>>1181215
Ты когда-нибудь программировал микроконтроллеры, где килобайты рам можно по пальцам пересчитать?
Аноним 28/04/18 Суб 20:50:26  1181234
>>1181226
Конечно. Ты понимаешь, что g++ и gcc выдадут тебе идентичный код, если ты не будешь использовать в крестах многие крестовые фичи? При этом ты можешь, продолжать пользоваться теми фичами, которые на код напрямую не влияют, а жизнь проще делают.
Аноним 28/04/18 Суб 20:59:42  1181238
>>1181234
Ну хз, у нас все на си ваяют. Возможно потому, что проще потом лицензировать (авионика), а не из-за возможностей языка.
Аноним 28/04/18 Суб 21:02:26  1181239
>>1181238
Так я об этом как раз и сказал выше - стандарт в разы меньше, вариантов хитровыебанного поведения меньше, осилить проще и проверить проще.
Аноним 29/04/18 Вск 02:50:44  1181363
>>1181189
Стоит дополнить, что в первом случае можно изменять сам указатель, а во втором имя массива является константой.
Аноним 29/04/18 Вск 03:34:20  1181365
>>1181239
>стандарт в разы меньше
Как будто ты его хоть раз открывал
Аноним 29/04/18 Вск 03:35:55  1181366
>>1181363
>имя массива является константой
Что ты хотел сказать этим набором слов?
Имя целочисленной переменной тоже является константой. Или ты можешь показать код, который переименовывает целочисленную переменную?
Аноним 29/04/18 Вск 03:44:31  1181369
>>1181189
> строковые литералы ридонли
Не нашёл такого в 6.4.5 String literals
Где это написано?
Аноним 29/04/18 Вск 11:41:28  1181428
Посоветуйте справочник для winapi.
Аноним 29/04/18 Вск 11:42:06  1181429
>>1181428
Советуем справочник для winapi.
Аноним 29/04/18 Вск 11:43:09  1181430
>>1181429
Он мне не нравится.
Аноним 29/04/18 Вск 11:44:59  1181431
>>1181429
Cпасибо!
Аноним 29/04/18 Вск 12:31:32  1181443
Как врубить поддержку кириллицы в спермянской консоле? Использую GCC.
Аноним 29/04/18 Вск 16:12:55  1181603
>>1181366
Он имел в виду, что можно ptr++, но нельзя array++, т.е., массив можно рассматривать как константный указатель на его первый элемент.

>>1181369
> Где это написано?
Именно там и написано. Второе предложение логически вытекает из первого, и хотя в большинстве компиляторов в целях совместимости с говнокодом есть возможность "отключить" этот абзац, проще считать строковые литералы константами:
> It is unspecified whether these arrays are distinct provided their elements have the
> appropriate values. If the program attempts to modify such an array, the behavior is
> undefined.

>>1181428
MSDN, можно старенький и оффлайновый мануал из Platform SDK для XP/2003 - им удобнее пользоваться, но там нет некоторых новых фич.

>>1181443
Сохраняй исходник в UTF-8, собирай с -fexec-charset=866, потом когда-нибудь научишься делать правильно (возможно, в CRT и консоли винды к этому времени как раз появится полноценный UTF-8). Можешь собирать без -fexec-charset, но запускать в помершелле, он умеет в UTF-8 после chcp 65001. Можешь поставить себе ConEmu, он тоже в UTF-8 может.
Аноним 29/04/18 Вск 16:13:50  1181604
>>1181443
В нотепаде++ пишешь исходник в CP866
Аноним 29/04/18 Вск 16:15:09  1181605
>>1181604
Бу! Сгинь!
Аноним 29/04/18 Вск 16:19:25  1181608
[CODE]#include <stdio.h>

int main(void) {
char b[] = "БB";
printf("%x\n", b[0]);

return 0;
}[/CODE]
Почему распечатывает ffffffd0? Почему бы не 000000d0?
Аноним 29/04/18 Вск 16:27:02  1181609
>>1181443
chcp 1251 - кодировка Windows
chcp 65001 - кодировка UTF-8
Иногда требуется выбрать для консоли другой шрифт.
Аноним 29/04/18 Вск 16:29:31  1181610
>>1181608
Потому что char у тебя signed, а char в выражениях, а так же в аргументах variadic-функций подвергается integer promotions: (signed char) 'Б' превращается в (signed int) 'Б', старший бит стоит, значит оно отрицательное, происходит sign-extension, т.е., знаковый бит дублируется влево на всю ширину переменной. Хочешь получить d0 - делай (unsigned char) b[0] (promotion никуда не денется, но будет zero-extension, т.к., unsigned char) или или b[0] & 0xff (promotion опять же никуда не денется, но будет сделано еще для оператора &, получится (0xffffffd0 & 0xff), в результатае посчитается красивый (int) (0xd0), который уже промоутить не нужно, он и так int).

>>1181609
> chcp 65001 - кодировка UTF-8
И тут все виндусы кроме свежих билдов десяточки скажут "ой" при попытке вывести кириллицу.
Аноним 29/04/18 Вск 16:37:26  1181612
>>1181608
Потому что char - это знаковый тип, где русские буквы это отрицательные числа.
Используй unsigned char b[] = "БB";
Или так: printf("%x\n", b[0] & 0x00FF);
Аноним 29/04/18 Вск 16:54:43  1181626
>>1181610
>И тут все виндусы кроме свежих билдов десяточки скажут "ой" при попытке вывести кириллицу.
Проверил на Windows 7 с шрифтом Lucida Console:
#include <stdio.h>
char utf8text[] = {0xD0, 0x90, 0xD0, 0x91, 0xD0, 0x92};
int main(void) {
printf("%s\n", utf8text);
return 0;
}
С chcp 65001 выводит "АБВ".
Аноним 29/04/18 Вск 16:55:11  1181629
>>1181443
Кури про wchar и wprintf, нехуй ебаться с кодировками (методы советуемые на форумах работают от раза к разу) правда setlocale все равно надо использовать зато без ебли с настройкой консоли. Либо, если лень писать L перед каждой строкой, то в венде можно пользоваться нестандартной библиотекой tchar.h ну это уже сам кури.
Аноним 29/04/18 Вск 17:02:26  1181637
>>1181629
>L перед каждой строкой
Не советую, в одной проге из-за этого долго пришлось править несовместимость (GCC в Linux использовал 4-байтовые символы Unicode, Visual C++ в винде - 2-байтовые). Нужно применять UTF-8 везде.
Аноним 29/04/18 Вск 17:25:11  1181651
>>1181443
>врубить поддержку кириллицы в спермянской консоле
но зачем?
Аноним 29/04/18 Вск 20:01:16  1181738
hello.png (0Кб, 168x68)
>>1181626
А у меня выводит:
> АБВ
> В
А вместо "Привет, мир!" выводится, например, пикрелейтед. И это тоже 7 со шрифтом Lucida Console. А стабильно оно только с десяточки работает.
Аноним 29/04/18 Вск 20:50:44  1181766
>>1181605
Зато работает
Аноним 29/04/18 Вск 22:19:15  1181799
>>1181766
-fexec-charset работает совершенно таким же образом, только не вынуждает хранить исходники в древней кодировке, создавая проблемы с IDE и системами контроля версий.
Аноним 29/04/18 Вск 22:44:43  1181812
>>1181738
Первый раз такое вижу. Обычно либо выводит русские буквы, либо квадратики.
И с chcp 1251 такое же?
У тебя какая-то сборка от васяна.
Аноним 29/04/18 Вск 22:55:57  1181818
>>1181812
C chcp 1251 ок или крякозябры, в зависимости от кодировки выводимых байтиков. Винда - чистая тестовая виртуалка. Более того, с chcp 65001 и WriteFile, к которому сводится твой printf, и WriteConsoleA иногда (а на XP - всегда) фэйлятся и не выводят вообще ничего, поэтому приходится идти длинным (зато надежным) путем. Делается кастомный yoba_printf, который с помощью MultiByteToWideChar преобразует UTF-8 в UTF-16, который уже выводит с помощью WriteConsoleW, и вот с UTF-16 проблем никаких нет, вне зависимости от кодировки, выставленной chcp.
Аноним 29/04/18 Вск 23:07:57  1181824
>>1181818
>Винда - чистая тестовая виртуалка.
А, тогда ясно. Нужно ставить Microsoft Visual C++ redistributable package.
На древней msvcrt.dll могут быть любые аномалии. Она родом с XP, где UTF-8 нормально не поддерживался.
В десятке видимо обновили.
Аноним 29/04/18 Вск 23:19:48  1181831
>>1181824
А CRT-то каким местом? Тут же нет разбора строки - %s просто копирует символы в stdout пока не встретит \0, а stdout сводится к _write, а _write к WriteFile. Вот если бы я toupper делал или strtok какой-нибудь, или хотя бы %.2s, тогда да, CRT могла бы что-нибудь испортить.

Но ты меня заинтересовал, попробую отладить когда-нибудь и посмотреть, почему такое поведение. Ты чем собирал? Студией?
Аноним 29/04/18 Вск 23:21:09  1181834
>>1181824
И да, msvcrt - дефолтный рантайм Visual C++ 98, оно же VS6.0. Ее, конечно, обновляли, но родом она еще из маздая.
Аноним 30/04/18 Пнд 01:35:28  1181874
>>1181603
> Он имел в виду, что можно ptr++, но нельзя array++, т.е., массив можно рассматривать как константный указатель на его первый элемент.

:facepalm:

>> Где это написано?
>Именно там и написано.
Да, чёт проглядел.
Аноним 30/04/18 Пнд 15:11:37  1182052
>>1174146
Почти.
Аноним 30/04/18 Пнд 15:28:51  1182057
Дайте идею для проекта небольшого на си.
Аноним 30/04/18 Пнд 15:31:05  1182058
>>1182057
Рыбья головёха?
Аноним 30/04/18 Пнд 15:35:20  1182059
>>1156306 (OP)
Есть кто с мгу? Слейте лабы по с/с++ с меня как обычно
Аноним 30/04/18 Пнд 15:47:10  1182067
>>1182059
Рыбья голова)
Аноним 30/04/18 Пнд 16:17:45  1182079
Посоны, а что, шланг до сих пор не обзавёлся своим crt? Почто он гццшные crtbegin.o и libgcc требует?
Аноним 30/04/18 Пнд 19:20:05  1182173
Антоны. Я сделал прогу на winapi, которая должна была менять курсор на рожу моего бати, чтобы его выбесить. Но курсор вовсе пропал и не появляется даже после перезагрузки. Что не так, пиздец.
Аноним 30/04/18 Пнд 19:26:01  1182174
>>1182173
Ты приёмный.
Аноним 30/04/18 Пнд 19:26:52  1182175
>>1182079
Не обзавелся, не вижу в этом ничего плохого.

>>1182173
Так сходи в панель управления и выставь стандартный, чего ты от нас-то хочешь?
Аноним 30/04/18 Пнд 21:16:43  1182268
>>1182175
>управления
Не работает даже так.
Аноним 30/04/18 Пнд 21:19:47  1182271
>>1182174
Поржал всем офисом)
Аноним 30/04/18 Пнд 21:48:39  1182291
Есть еще те кто использует #pragma pack?
Аноним 30/04/18 Пнд 22:00:13  1182305
Антоны, если я объявлю в структуре подряд несколько переменных, то они будут распологаться подряд, а если я объявлю их просто внутри функции main(), то их может раскидать по памяти?
Аноним 30/04/18 Пнд 22:22:53  1182323
>>1182291
Да. Упакованные структуры иначе не опишешь.

>>1182305
Да, переменные компилятор может раскидать (в пределах кадра стека, ествественно, если они автоматические), сдублировать, положить в регистры или вовсе удалить.
Аноним 30/04/18 Пнд 22:31:28  1182329
Зачем нужны битовые поля?
Аноним 30/04/18 Пнд 22:33:43  1182332
>>1182329
Некоторые люди не могут в побитовые операции, битовые поля проще, удобнее и иногда даже быстрее.
Аноним 30/04/18 Пнд 23:21:57  1182347
Мне нравится Windows API.
Аноним 30/04/18 Пнд 23:24:24  1182348
Мне нравится JavaScript.
Аноним 30/04/18 Пнд 23:28:06  1182349
Я ем говно.
Аноним 01/05/18 Втр 21:24:40  1182768
Сап, двач.

Пишу программу занимающуюся посимвольной обработкой строк. ОС Linux, компилятор GCC, кодировка UTF-8.

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

Есть такая функция в стандартной библиотеке и как называется? А то может я и ищу то, чего нет.
Аноним 01/05/18 Втр 21:59:33  1182779
>>1182768
вроде нет, поскольку я велосипедил подобное сам, но там легко и реализаций миллиард
https://github.com/JeffBezanson/cutef8/blob/master/utf8.c
Аноним 01/05/18 Втр 22:05:04  1182785
>>1182779
Знаю, что легко, но хотел найти какой-то общий стандарт, чтобы не пилить велосипеды. Если нет, то напишу сам.
Аноним 01/05/18 Втр 22:23:10  1182792
>>1182768
А чем переводишь? wctomb говорит, сколько символов нужно - просто просуммируй результаты. Но велосипед будет быстрее.
Аноним 01/05/18 Втр 22:28:28  1182795
>>1182768
Алсо, я бы на твоем месте не выделывался. Длиннее 4 байтов один code-point не занимает. Если у тебя суррогатные пары уже лежат в одном 32-битном wchar_t, тогда два раза по 4 байта на символ максимум. Выделяй сразу столько, точно влезет, и не нужно будет заниматься бесполезными подсчетами.
Аноним 01/05/18 Втр 22:45:00  1182803
>>1182792
wctomb, вроде бы, каждый символ отдельно передавать нужно. Я пробовал wcstombs, но он мне постоянно -1 на выход даёт, если в строке есть кириллический символ. Почему так, я разобраться не смог.

>>1182795
Тоже вариант. Если нет стандартной функции, то либо так сделаю, либо велосипед накидаю.
Аноним 01/05/18 Втр 23:33:28  1182840
>>1182768
>>1182803
Решил проблему.

Работу wcstombs я проверял в отдельном файле и забыл вызвать setlocale, поэтому он выкидывал -1 мне. При setlocale (LC_ALL, "") вызов функции wcstombs (NULL, str, 0) возвращает нужное количество байтов для строки в utf-8.
Аноним 02/05/18 Срд 13:23:15  1183093
выручай ссач, пишу я такой прогу на си, ну и вызываю функцию sqrt() с аргументом. Начинаю конпелить, а конпелер ругается мол undefined reference to `sqrt'. Дело в том что при передаче в качестве аргумента обычного числа все нормально конпелится и возвращает квадратный корень, то что нужно. однако если в кчестве аргумента передается имя переменной или элемент массива конпелер выводит undefined reference to `sqrt'. выручайте я дно. Кстати ос ubuntu
Аноним 02/05/18 Срд 13:24:55  1183095
>>1183093
Наркомания
Проверь наличие <math.h>
Аноним 02/05/18 Срд 13:26:09  1183096
>>1183093
Алсо, тебе эту ошибку, случаем, не линкёр выводит?
Сделай -lmath
Аноним 02/05/18 Срд 13:31:28  1183101
>>1183095
math.h имеется
Аноним 02/05/18 Срд 13:36:14  1183105
>>1183093
-lm
довун
Аноним 02/05/18 Срд 13:36:54  1183106
Screenshot from[...].png (101Кб, 1280x1024)
#include<stdio.h>
#include<math.h>
main(){
float b=4;
float a=sqrt(b);
printf("%.1f",a);
}
Аноним 02/05/18 Срд 13:37:24  1183107
>>1183106
gcc -lm
довун
Аноним 02/05/18 Срд 13:38:07  1183108
>>1183096
> -lmath
-lm
довун
Аноним 02/05/18 Срд 13:39:19  1183110
12312.png (96Кб, 1280x1024)
>>1183107
и шо бэлэтб
Аноним 02/05/18 Срд 13:39:44  1183111
>>1183110
Обосрался
Аноним 02/05/18 Срд 13:39:45  1183112
>>1183110
Ди в ньюфаг-тред
довун
Аноним 02/05/18 Срд 13:40:20  1183113
>>1183110
gcc -lm c.c
Аноним 02/05/18 Срд 13:40:21  1183114
>>1183112
заебал скажи че сделать чтоб робило
Аноним 02/05/18 Срд 13:42:01  1183116
333333.png (102Кб, 1280x1024)
все равно
Аноним 02/05/18 Срд 13:42:39  1183117
>>1183116
gcc c.c -lm
Аноним 02/05/18 Срд 13:43:37  1183118
>>1183117
бля отдуши чувак. объясни плиз нахуя это нужно было прост в винде такого я не добавлял
Аноним 02/05/18 Срд 15:45:42  1183152
>>1183118
В винде вся математика в CRT, в той же либе, что и printf и т. д., и она прилинковывается автоматически, по умолчанию. В линуксах отдельно, у них принято делать жизнь максимально неудобной.
Аноним 02/05/18 Срд 15:53:01  1183156
>>1183152
> В винде вся математика в CRT, в той же либе, что и printf и т. д.

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

> В линуксах отдельно, у них принято делать жизнь максимально неудобной.

Линкуешь только то что нужно. Принцип разделяй и властвуй на шицо, но спермачи кукарекают что-то про неудобство.
Аноним 02/05/18 Срд 15:57:04  1183159
>>1183156
50мб хэлоуворд, кек.
Аноним 02/05/18 Срд 15:59:22  1183161
>>1183156>>1183159
У тебя по умолчанию динамическая линковка. Можешь все библиотеки мира подключить, это мало повлияет на размер получившегося файла.
Аноним 02/05/18 Срд 16:01:27  1183164
>>1183159
В сперме хелловорлд 50 метров? Лол. Ибо у меня в дебиане меньше 4Кб. Целый кластер потратил для теста, ёк макарёк.
Аноним 02/05/18 Срд 16:14:19  1183172
>>1183161
>все библиотеки мира подключить
И соснуть с переносимостью. Статическая линковка рулит.
Аноним 02/05/18 Срд 16:15:24  1183174
>>1183172
Ну и вали в свою эпоху a.out
Аноним 02/05/18 Срд 16:16:34  1183175
>>1183174
Валю, я даже Qt статически линкую
Аноним 02/05/18 Срд 18:13:21  1183219
>>1183159
Хелловорлд в винде 8к, если динамическая линковка. Или меньше 200к, если статическая.

>>1183156
> Принцип разделяй и властвуй
Зачем разделять, если это стандартная библиотека Си? Давай вообще от либ откажемся, будем линковать printf.o и malloc.o каждый отдельно.
> Линукешь только то что нужно.
На самом деле для выбора "что нужно" придуманы линкеры.
Аноним 02/05/18 Срд 18:54:58  1183235
>>1183219
> от либ откажемся, будем линковать printf.o и malloc.o каждый отдельно.

Уууууу чо удумал, это ты насаждай в мастдае дистрибьюцию в предкомпилированных файлах. Нам исходники голые подавай, а мы уж как нибудь сами скажем компилятору с чем собрать программу. Усёк, гаврюшенька?
Аноним 02/05/18 Срд 19:55:32  1183265
>>1183219
>Или меньше 200к, если статическая.
Рантайм не забудь скачать и установить
Аноним 02/05/18 Срд 21:04:47  1183299
>>1183118
>объясни плиз нахуя это нужно было прост в винде такого я не добавлял
"так сложилось исторически"
Аноним 02/05/18 Срд 22:33:52  1183344
Может ли Rust заменить Сишку? Избавляет от кучи проблем с памятью, соответственно багов и дыр в безопасности меньше
Аноним 02/05/18 Срд 22:36:57  1183346
>>1181147
Разница чисто визуальная.
Аноним 02/05/18 Срд 23:25:23  1183380
>>1183235
Нашёл чем гордиться. Шо то хуйня, шо это хуйня. Надо иметь статические бибилиотеки на каждую функцию и линковать автоматически, ато развели ебалу.
"кококо хочу подключаю хочу неподключаю" - Ты же и так знаешь что подключить придётся, по тому что ты функцию используешь в коде, а не по тому что у тебя гибкая система настроек и свобода действий.
Аноним 03/05/18 Чтв 08:52:59  1183530
>>1183346
В ньюфаг-тред шагом марш!
Аноним 03/05/18 Чтв 08:56:25  1183531
можно вместо
gcc c.c -lm
пейсать
gcc -O2 c.c
Тогда sqrt вместо вызова функции будет реализован инструкциями копро-цессора, на месте.
-O1, -Os и -O3 тоже подойдут.
Аноним 03/05/18 Чтв 08:57:01  1183532
>>1183531
Но это не гарантировано. Так что лучше -lm
Аноним 03/05/18 Чтв 12:27:49  1183603
Почему вы до сих пор не перекатились в энтерпрайз на какой-нибудь джаве? Неужели вам так нравится железо, что готовы получать в 2 раза меньше, при чём прикладывая больше усилий? Я бы так не смог
Аноним 03/05/18 Чтв 16:36:49  1183738
>>1183265
Да я лучше в дворники пойду, чем в интерпрайзы на джавах.
Аноним 04/05/18 Птн 13:45:09  1184167
>>1183110
Убунтодебил, уходи.
Аноним 04/05/18 Птн 13:57:26  1184172
>>1183603
Я стал php-developer.
Аноним 05/05/18 Суб 20:36:41  1184720
Анончи, напомните как называется версия майкрософтовского конпелятора без ИДЕ?
Аноним 05/05/18 Суб 20:45:34  1184727
>>1184720
Visual Studio Build Tools, ставится через инсталлер обычной Visual Studio.
Аноним 05/05/18 Суб 21:07:43  1184755
>>1184727
Вангую, студия мне говна всякого наставит, а я чистое хочу, как 2015 тулс.
Аноним 05/05/18 Суб 21:25:08  1184778
910365.jpg (1105Кб, 1920x1080)
Господи я отпишусь в этом треде. Си - Бог всех языков. Лично я учил Си по Великой книге K&R. Задает вам навык программирования на всю вашу жизнь. Воистину, язык Богов.
Аноним 05/05/18 Суб 21:49:01  1184793
>>1184778
Си — ненужное говно без задач.
Аноним 05/05/18 Суб 21:52:05  1184796
>>1184793
Борщеязычки говно без задач, а на сишке весь мир держится.
Аноним 05/05/18 Суб 21:52:17  1184797
>>1184778
Двачую этого дZенствующего.
Аноним 05/05/18 Суб 23:54:17  1184857
>>1184755
Окей, ставишь билдтулзы с говном на виртуалку, забираешь оттуда PSDK и компиляторы. Профит.
Аноним 06/05/18 Вск 11:36:19  1184987
array.png (47Кб, 1502x831)
Помогите разобраться с массивом указателей.
Почему данный код работает корректно, выдавая пользователю на экран нужные сообщения?
int num;
scanf("%d", &num);
char* errors[] = {"first", "second", "third"};
printf ("%s", errors[num]);
В приведенном выше куске кода, если я инициализирую num как 0, 1 и 2, то получаю сообщения "first", "second" и "third", соответственно. Почему? Как я понимаю, чтобы сообщения выдавались, необходимо в printf'е делать разыменование errors[num], то есть добавить звездочку.
Сейчас попробую объяснить, как я понимаю массив указателей:
В данном случае мы имеем массив указателей errors. В массиве errors хранятся 3 указателя на тип char, которые указывают на массивы из слов. Ниже представлен простенький рисунок. 14, 15 и 16 в ячейках errrors - это, грубо говоря, сами указатели. Соответственно, в приведенном коде выше, когда мы, допустим, printf'аем errors[0], должно выводится 14 (правда, формат в printf'е стоит "%s", но не так важно), однако, как уже сказал, на экран выводится first. Почему? Мб, я как-то неправильно понимаю?
Аноним 06/05/18 Вск 13:27:55  1185053
>>1184987
Давай разберемся, что такое errors.
Errors - это массив указателей на char.
Принтф получает на вход УКАЗАТЕЛЬ НА char, и обрабатывает егоименно так (у тебя там %s же, это важно!). Поставь там %i какой-нибудь и получится число.
Аноним 06/05/18 Вск 13:51:25  1185071
>>1184778
Ну есть в сишке указатели-хуятели и дальше чё? Как ебля с указателями и освобождением памяти прокачает мой скилл в программировании в общем?
Ну вот я джавист, прочитал недавно K&R и Прату чисто в академических целях. Никак я свой навык не улучшил. Углубился в старину, посмотрел как писали раньше проги и всё.
Ты просто студент без реального опыта работы, который потратил какое-то время на сишку, в отличие от своих друзей, которые дрочили питон какой-нибудь, и возомнил себя ебать гуру.
Решают структуры данных, алгоритмы, архитектура. Твоя сишка нахуй не нужна для навыков. Сишка в современном мире - крайне узкоспециализированный язык. Изучать её нужно либо для конкретной работы, либо полистать пару книжек для экскурса в историю. Всё, больше Си тебе ничего не даёт. Это просто изкоспециализированный инструмент.
Аноним 06/05/18 Вск 14:00:03  1185073
>>1185071
>я джавист
Дальше не читал. Иди дальше абстрактные фабрики абстрактных билдеров пиши, чмоха.
Аноним 06/05/18 Вск 14:04:19  1185077
>>1185073
Как же байтослесари триггерятся на джаву)))) Я всё понимаю, потратить на обучение в 3 раза больше времени, и получать в 2-3 раза меньше - конечно это обидно. Остаётся только писать на двачах, что Си - это ебать орудие Богов.
Аноним 06/05/18 Вск 14:53:09  1185101
>>1184987
> чему? Как я понимаю, чтобы сообщения выдавались, необходимо в printf'е делать разыменование errors[num].
Упускаешь, что [ ] сам делает разыменовывание. Смотри: ∗errors - это адрес (указатель на) массива first, правильно? И далее ∗(∗errors) или ∗∗errors - это разыменованный массив first, т.е., символ 'f', но это к делу не относится. А errors[num] это сахарок, полный аналог которого ∗(errors + num), где арифметика - адресная, т.е., errors + 1 = адрес errors + размер одного указателя, а errors + n = адрес errors + размер указателя ∗ n. И потом ∗(...) этот адрес разыменовывает, и ты получаешь адрес строки.

> cоответственно, в приведенном коде выше, когда мы, допустим, printf'аем errors[0], должно выводится 14
> правда, формат в printf'е стоит "%s", но не так важно
Сделай %p и получишь свои 14, потому что %p просто берет аргумент arg и формирует текстовое представление указателя: можешь считать, что оно аналогично printf("%x", (unsigned long) arg).

А %s берет свой аргумент arg, считает его указателем, и разыменовывает его: делает ∗(arg), ∗(arg + 1), ∗(arg + m), пока не найдет символ \0. Ну и выводит полученные символы, конечно. Поэтому ты видишь текст, а не число.
Аноним 06/05/18 Вск 15:18:07  1185121
>>1185053
>>1185101
А, да, все верно. Перечитал ваши сообщения и понял, какой странный и глупый вопрос я задал, учитывая то, что понимаю, как это работает. Вот к чему недосып приводит. Хотя сам я почему-то минут 40 сидел над рисунком и все никак не мог понять
Аноним 06/05/18 Вск 15:24:31  1185132
>>1185101
>А %s берет свой аргумент arg, считает его указателем, и разыменовывает его...
Вот, теперь точно понял, что именно меня вводило в заблуждение. Я раньше не знал (или не задумывался), что %s разыменовывает указатель. Теперь все точно ясно. Вопрос закрыт. Чуть головой не поехал
Аноним 06/05/18 Вск 15:53:27  1185167
>>1156306 (OP)
https://pastebin.com/tMRF7673
ребят посмотрите код плиз , у меня вопрос , можно ли передать в функцию указатели , так что бы по такому выражению она выделила память ,просто если вставить этот кусок (array = (double@@)malloc(sizeof(double@)@ROW);)в функцию, он отработает , но выдаст ошибку сигментации
Аноним 06/05/18 Вск 16:12:15  1185174
>>1185167
Не совсем понятно, чего ты хочешь. У тебя в текущем виде программа должна более-менее работать. Хочешь переместить выделение памяти в input_date? Тебе придется тогда как-то вернуть массив. Например, передавать double ∗∗∗array_ptr и после маллока делать ∗array_ptr = array. Или просто возвращать из функции double∗∗, делая return array, а аргумент убрать просто.
Аноним 06/05/18 Вск 16:54:24  1185197
>>1185174
аааа, понял спасибо , а программа и так хорошо работает
Аноним 06/05/18 Вск 22:36:10  1185424
У меня есть указатель void ∗ptr на массив из структур smth.
У меня есть sizeof(smth).
Как надёжно попасть на i-ый элемент массива?
Я же не могу просто сделать так:
smth_tmp=∗((char ∗) ptr+sizeof(smth))
верно?
Аноним 06/05/18 Вск 22:37:33  1185426
>>1185424
> smth_tmp=∗((char ∗) ptr+i*sizeof(smth))
Аноним 06/05/18 Вск 22:41:41  1185428
>>1185424
> Я же не могу просто сделать
Можешь, только левая звездочка там лишняя. Ты либо:
smth foo = ∗(smth ∗) ((char ∗) ptr + ...);
либо
smth ∗bar = (smth ∗) ((char ∗) ptr + ...);
Но лучше скастить к указателю на smth и прибавить i:
smth foo = ((smth ∗) ptr);
smth ∗bar = (smth ∗) ptr + i;
Аноним 06/05/18 Вск 22:43:30  1185429
>>1185428
Я структуре присваивал, а не указателю, я просто типа не написал. Оттого и левая звздочка, спасибо.
Аноним 06/05/18 Вск 22:47:42  1185433
>>1185428
Алсо, в моём случае функция не будет знать типа, т.е. ей передадут только size_t от sizeof(given_type). Так что способ один для меня применим, в отличие от второго.
Аноним 07/05/18 Пнд 19:04:05  1185769
Как передать во функцию аргументом, безымянный массив?
void foo(...,float c[3]){...} ==>
foo(...,{1.0f,1.0f,1.0f}); - вроде раньше так делал, а сейчас забыл.
Аноним 07/05/18 Пнд 19:40:00  1185782
>>1185769
Тип забыл. К чему литерал-то кастить? Вот так:
foo(..., (float[3]) { 1.0,f 1.0f, 1.0f });
Аноним 07/05/18 Пнд 19:53:26  1185788
>>1185782
О точно! Благослови тебя Сибог
Аноним 08/05/18 Втр 19:33:47  1186348
Можете посоветовать годный компилятор для 16 битного real memory mode?
Аноним 08/05/18 Втр 20:11:44  1186365
>>1186348
Любой. Они все говно. Я предпочитаю борланд, можно ватком, но ватком - это целый свой мирок со своими закидонами.
Аноним 08/05/18 Втр 20:13:19  1186367
>>1186365
Ну мне хотя бы чтобы работало. В gcc с флагом на 16 бит будет не то?
Аноним 08/05/18 Втр 20:23:00  1186381
gcc-m16.png (27Кб, 527x560)
>>1186367
Я вообще не знал, что оно умеет в 16-битный код. Будет не совсем то - с 32-битными регистрами, вон даже какой-то MMX проскочил с -O3. Но запуститься - запустится, наверное. А что за задача у тебя? Тебе точно нужен современный компилятор для ее решения?
Аноним 08/05/18 Втр 20:24:34  1186384
>>1186381
>А что за задача у тебя?
Пишу загрузчик. Мне любой компилятор, главное, чтобы работало.
Аноним 08/05/18 Втр 20:26:37  1186388
>>1186384
Пиши на асме: читай вторичный загрузчик, переключайся в 32-битный защищенный или нереальный режим и не страдай хуйней. Алсо, прошу прощения за скриншот, там дизасм 32-битный, а код 16-битный.
Аноним 08/05/18 Втр 20:28:22  1186389
>>1186388
>Пиши на асме
Я от него ахуеваю. Не понимаю даже чем сегменты от стэка отличаются.
Аноним 08/05/18 Втр 20:30:42  1186395
>>1186389
На Си ты охуевать будешь гораздо больше. А без знаний о стеке и сегментах как вообще загрузчик писать? Тебе ж этот самый стек настраивать, не говоря уже о дескрипторах сегментов защищенного режима.
Аноним 08/05/18 Втр 20:32:29  1186398
>>1186395
>На Си ты охуевать будешь гораздо больше
Ну с указателями проще...
Аноним 08/05/18 Втр 20:54:06  1186430
>>1186398
В ассемблере у тебя больше контроля. А тут ты будешь ебаться с теми же сегментами, отличать far pointer от near pointer, и заодно ебаться с вызовами BIOS через жопу.

> Не понимаю даже чем сегменты
far pointer - это пара 16-битный сегмент, 16-битный офсет (записывается как сегмент:офсет), в реальном режиме все настроено так, что плоский указатель считается как (сегмент ∗ 16) + офсет. В защищенном чуть по-другому, но для защищенного ты выставишь базу всех сегментов в 0, и будешь вообще игнорировать наличие сегментов.

> стек
uintptr_t stack[4096];
uintptr_t ∗stackptr = stack + 4096; // stackptr - это пара ss:(e)sp.

// Это делает проц.
void push(uintptr_t value) { ∗--stackptr = value; }
uintptr_t pop(void) { return *stackptr++; }

Больше там ничего нет, в этом твоем стеке.
Аноним 09/05/18 Срд 10:02:19  1186674
Вот хочу я передать в функцию функцию.

float
integ(float a, float b, float eps, float (f)()) {
float sum = 0.0;
while (a < b) {
sum += f(a)
eps;
a += eps;
}
return sum;
}

И передаю.


float
square(float a) {
return aa;
}

res = integ(4.0, 7.0, 0.1, square);


Этот код, конечно же, не работает, в res записалось чёрт-те что.
Чтобы он правильно работал, надо указать float (
f)(float).
А если я хочу передавать функцию с неизвестным заранее числом аргументов?
Аноним 09/05/18 Срд 10:03:24  1186675
Вот хочу я передать в функцию функцию.

float
integ(float a, float b, float eps, float (∗f)()) {
float sum = 0.0;
while (a < b) {
sum += f(a) ∗ eps;
a += eps;
}
return sum;
}

И передаю.


float
square(float a) {
return a∗a;
}

res = integ(4.0, 7.0, 0.1, square);


Этот код, конечно же, не работает, в res записалось чёрт-те что.
Чтобы он правильно работал, надо указать float (∗f)(float).
А если я хочу передавать функцию с неизвестным заранее числом аргументов?
Аноним 09/05/18 Срд 11:23:00  1186696
Надо переписать одну прогу с использования graphics.h и 16 бит под современные ОС. Пока думаю над использованием WinAPI для рисования, перехвата стрелок/Fn и прочего. Какие подводные? Алсо, еще надо одну программу с Паскаля так же переписать, но там проблем ожидается поменьше.
Аноним 09/05/18 Срд 15:15:06  1186893
>>1186675
> Этот код, конечно же, не работает, в res записалось чёрт-те что.
Сравни с float square(double a), прочитай про default argument promotions. Алсо, своими пустыми скобками ты отключил контроль типов при вызове функции, готовься к сложно отлавливаемым багам.

> А если я хочу передавать функцию с неизвестным заранее числом аргументов?
Это крайне хуевая идея. Хотя бы потому что integ это количество аргументов знает (иначе не сможет вызвать f), f количество аргументов знает, а значит тебе никто не мешает правильно задекларировать свою f и не выделываться.

Если ты хочешь странного (а вы тут все хотите странного), посмотри в сторону функций с переменным количество аргументов, как printf, например. Сделай механизм детекта количества и типа аргументов в рантайме: stdarg.h, va_list, va_arg - вот это все.

>>1186696
> Какие подводные?
Если собираешься переписать только graphics - поебешься с циклом обработки событий, наверняка придется городить еще дополнительные doevents() в самых неожиданных местах. В целом, это достаточно быстро все портируется. Если собрался переписывать саму прогу, то подводных никаких, но это дольше.
Аноним 09/05/18 Срд 15:59:57  1186920
>>1156306 (OP)
Работа есть? Смогу прогать мк на военном предприятии? А может быть даже смогу работать дома?
Аноним 09/05/18 Срд 16:58:27  1186961
>>1186920
Работа есть, крупные города или не эта страна. Про удаленку и не мечтай. К околовоенным не суйся, у них на строчку кода десять страниц пояснений и согласований.
Аноним 09/05/18 Срд 20:51:30  1187147
>>1186920

Работы вообщем-то дохуя и больше. Все серъёзные фреймворки так или иначе имеют высокопроизводительные части, работающие на C. В эпоху опенсорса все лежит на гитхабе. Увлекайся, разбирайся, форкь, улучшай и тебя рано или поздно позовут работать в буржундию или на удалёночку.
Аноним 09/05/18 Срд 22:06:30  1187210
Насколько всирают всякие кодогенераторы для кортексов чисто сишным прогам?
Аноним 09/05/18 Срд 22:07:30  1187212
>>1187210
Генераторы чего и из чего?
Аноним 09/05/18 Срд 22:15:56  1187226
>>1156306 (OP)
Друзья, вощем не могу придумать алгоритм решения задачи:
есть дерево с файлами и .txt, на вход функции дается корень, каждый .txt содержит символическую(ие) ссылку(и) на другие файлы того же дерева, или тупик, или приз.
Нужно найти путь к призу.
Сразу понятно, что нужно рекурсивно пройти дерево файлов, а вот как обрабатывать *.txt?
мб кто-нибудь встречался с подобной задачей?
Аноним 09/05/18 Срд 22:16:09  1187227
>>1187212
CubeMX тип
Аноним 09/05/18 Срд 22:23:28  1187230
>>1187227
Так оно инициализацию генерит, вот тебе не похуй, какой там код.
Аноним 09/05/18 Срд 22:24:07  1187232
>>1186675
указатель на функция гугли. Берешь инициализируешь как переменную указатель int (*fun)(int , int);
при этом у тебе описана функция с такими же аргументами
int function(int a, int b){
return a+b;
}
теперь просто передаешь указателю функцию :
fun=function;
теперь можешь как аргумент пихать указатель.
> А если я хочу передавать функцию с неизвестным заранее числом аргументов?

если несколько аргументов то <stdarg.h> поможет
Аноним 09/05/18 Срд 22:26:12  1187235
>>1187232
А мусорные переменные-то зачем создавать? Он вон напрямую передает, как человек, а ты какую-то бесполезную ебанину советуешь.
Аноним 09/05/18 Срд 22:27:39  1187236
>>1187235
не заметил я просто, саня хуй саси
Аноним 10/05/18 Чтв 01:45:33  1187386
>>1186893
А если указывать указатель на указатель на функцию?
Число аргументов всё так же требуется?
Аноним 10/05/18 Чтв 02:03:24  1187393
>>1187386
Описание аргументов требуется не потому, что нехороший Си запрещает указатели на функции с неизвестными аргументами. Просто при вызове функции эти аргументы нужно как-то передавать, а для этого нужно знать их типы, а каким-то другим путем (через астрал?) узнать в рантайме, что вот эта конкретная вызываемая тобой функция хотела первым параметром char вместо int - невозможно. Поэтому Си в таком случае делает лучшее, что он может: определены default argument promotions (например, вместо char будет положен int, а вместо float - double), передаваемые аргументы неявно кастятся к своему дефолтному типу. То же самое делается для необязательных аргументов variadic-функций типа printf - там информация о типах тоже недоступна. Если вызываемая тобой функция именно этого всего и хотела, то все заработает. Если хотела float, а прилетел double - ну ты видел, чем это заканчивается.

> А если указывать указатель на указатель на функцию?
А какая разница? Проблема не в адресе, а именно в том, как компилятор будет эту функцию вызывать. А так ты мог бы хоть указатель на void передавать, тебе никто не мешает. На самом деле так нельзя: по историческим и архитектурным причинам возможны ситуации, когда указатель на данные и указатель на функцию могут быть численно равны, но указывать на разные вещи. Поэтому кастить между указателями на функцию и указателями на void - это UB, хотя на практике на всех современных распространенных платформах все ок.
Аноним 10/05/18 Чтв 04:18:58  1187423
>>1187393
Очень подробный ответ, спасибо.
В общем, такими изворотами лучше заниматься в более приспособленных для этого языках.
> Просто при вызове функции эти аргументы нужно как-то передавать, а для этого нужно знать их типы, а каким-то другим путем (через астрал?) узнать в рантайме, что вот эта конкретная вызываемая тобой функция хотела первым параметром char вместо int - невозможно
А как в некоторых других языках дело обстоит, не знаешь? Как-то же они умеют и могут в это. Но засчёт чего?
>по историческим и архитектурным причинам возможны ситуации,
А можешь рассказать поподробней?

Аноним 10/05/18 Чтв 04:42:02  1187424
>>1187423
> А можешь рассказать поподробней?
Ну ты даже на x86 можешь написать ОС, которая выставить ненулевую базу сегменту CS или DS так, чтобы физический адрес CS:some_virtual_addr не был (или наоборот был) равен DS:some_virtual_addr. Или вон там кто-то выше про 16-битную сишечку спрашивал - в small-модели памяти near-адреса кода и данных могут совпадать, но фактически код и данные лежат в разных сегментах. Алсо, в некоторых особо упоротых DSP указатели на код хранятся, читаются и присваиваются как physical_addr >> 2.

> В общем, такими изворотами лучше заниматься в более приспособленных для этого языках.
Я так и не понял, чего ты хочешь добиться. Ты же функцию вызываешь? Значит, ты знаешь, сколько и каких параметров будет. Почему нельзя их в указателе на функцию указать?
Аноним 10/05/18 Чтв 05:42:03  1187429
>>1187423
>Как-то же они умеют и могут в это.
Там не явно предается информация о количестве параметров. В Си есть VA_ARG, е еще лучше съеби и не еби господам мозг.
Аноним 10/05/18 Чтв 07:56:29  1187456
>>1187393
>На самом деле так нельзя: по историческим и архитектурным причинам возможны ситуации, когда указатель на данные и указатель на функцию могут быть численно равны, но указывать на разные вещи. Поэтому кастить между указателями на функцию и указателями на void - это UB, хотя на практике на всех современных распространенных платформах все ок.

Ну то есть вся абстрактопараша, все питушыные платформы с JIT-компиляцией и GC существуют чисто случайно, потому что авторы компиляторов сишки и плюсов добрые? Охуеть же.
Аноним 10/05/18 Чтв 08:51:52  1187472
>>1164658
>который учил не Си, и не кресты, а некий "си с классами".
Сцук, это про меня. Просто практиковаться было интересно на winAPI, литературе часто были примеры с кодом вроде LPTCCONTROLDATA context = LPTCCONTROLDATA)malloc((size_t)sizeof(TCCONTROLDATA)); - что-то вроде, а может и нет, стал уже забывать С с классами - 12 лет не кодил, но зашел в ваш тред понастальгировать после богомерзкого JS-треда с их программированием фреймворков.

А ещё тогда полюбил их __try __except
Аноним 10/05/18 Чтв 09:14:17  1187480
>>1187456
>Ну то есть вся абстрактопараша, все питушыные платформы с JIT-компиляцией и GC существуют чисто случайно, потому что авторы компиляторов сишки и плюсов добрые?

Типа того, всякие эмуляторы с браузерами напару с операционными системами туда же.

По-нормальному запись байтами выполняемого кода в память и последующий вызов оного как функции можно делать онли через вынос этого добра в ассемблер.
Аноним 10/05/18 Чтв 09:56:35  1187490
>>1187456

Именно.

Вот такая параша на самом деле UB в сяшке:

https://gist.github.com/nickdesaulniers/5299272

И на этом UB, считай, построен весь мир. Все мир, карл, может быть в одночасье doomed, и они еще называют сяшку системным языком, хотя ты на сяшке ни одну операционную систему без UB или ассемблера не напишешь.
Аноним 10/05/18 Чтв 10:09:18  1187495
>>1187423
>А как в некоторых других языках дело обстоит, не знаешь? Как-то же они умеют и могут в это. Но засчёт чего?

За счет ненативности и рантайма. Рантайм может хранить код как он хочет, компилировать его на лету, хранить различные метаданные, связанные с типами и прочее. Достигается это за счет того что код ненативный и выполняется либо интерпретатором, либо компилируется JIT-компилятором по необходимости со всеми требуемыми проверками во время выполнения.

Алсо, тред пора перекатывать.
Аноним 10/05/18 Чтв 11:36:14  1187520
>>1187480
Слишком категорично. Но да, JIT предполагает знание о системе и выход за пределы стандарта Си.
ПЕРЕКАТ Аноним # OP  10/05/18 Чтв 11:40:05  1187523
>>1187521 (OP)
>>1187521 (OP)
>>1187521 (OP)
>>1187521 (OP)
>>1187521 (OP)
Аноним 10/05/18 Чтв 12:19:35  1187543
>>1187490
А ничего что в этой параше int()() вызывается как int()(int, int)?
Аноним 10/05/18 Чтв 19:28:42  1187838
>>1187543
Ничего. Пустые скобки в Си (но не в крестах) означают, что информация о типах и количестве недоступна. Мы там выше обсуждали.
Аноним 10/05/18 Чтв 21:15:54  1187935
>>1187838
Ничего себе метапрограммирование в крестах. А если у меня эта функция перегружена числом параметров, компилятор разберется и вызовет то что нужно?
Аноним 12/05/18 Суб 20:26:22  1188833
Глупый вопрос, но все же спрошу. Допустим, имеется глобальная переменная p = 6;
Пишу условие if ((p++) == 7) { ... }
В таком случае p будет инкрементировано только в рамках условия if, т.е. p увеличится на 1 и сравнится с цифрой 7, а в глобальном значении останется 6, так? Или же будет инкрементировано на единицу, и уже глобально будет иметь значение 7 во всей программе после проверки условия?
Аноним 12/05/18 Суб 20:42:10  1188837
>>1188833
> в глобальном значении останется 6, так
Не так. Нет никаких рамок условия, есть выражение, и оно вычисляется. Постинкремент меняет переменную, и ему абсолютно похуй, где он сам в это время находится.

> p увеличится на 1 и сравнится с цифрой 7
Неа. Сначала сравнится, а потом увеличится. Поэтому если p изначально был равен 6, то тело if не выполнится. Но инкремент, разумеется, произойдет в любом случае, поэтому после вычисления выражения в скобках p станет равным 7.

Алсо, у нас новый тредик уже >>1187521 (OP).


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