М.Двач / Программирование

Двач.hk не отвечает.
Вы видите копию треда, сохраненную 13 июля 2018 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

78 Кб, 792x1023
C Programming Language #29 # OP 15 мар, 21:09 1156306 В конец треда | Веб

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

Пожалуйста, пользуйтесь 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

Ответы583746460466602709337142072927761707765182059851678692087226

2,8 Мб, 1230x1230
15 мар, 23:38 2 1156415

Вкатился. Вопросы по эмбеддед-си здесь задавать?

Ответы5642256530

15 мар, 23:47 3 1156422

>>1156415
нет

Ответы56547

sage 15 мар, 23:52 4 1156424

Всё байтоёбите?

Ответы56517

16 мар, 05:42 5 1156517

>>1156424
Всё сагоёбишь?

16 мар, 07:12 6 1156530

>>1156415
конечно, я почитаю, но отвечать не буду, потому что ничего не знаю.

Ответы56547

16 мар, 08:45 7 1156547

8 Кб, 406x10816 Кб, 426x182

>>1156422
>>1156530
Ладно, тогда вопрос по прикладному С:

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

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

Вот описание для функций библиотеки: https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Ответы56550

16 мар, 09:11 8 1156550

>>1156547
> переписать по-человечески с нормальными указателями структуры?
Не совсем понятно, чего ты хочешь. Ты разрешения спрашиваешь? Да, можно. Нет, не особо нужно: под капотом при возврате структуры размером больше, чем влезает в один-два регистра, функции неявно передается указатель на результат, функция его туда пишет, все счастливы. Возможно, для авров компиль более тупой, хуй знает.

Ответы56551

16 мар, 09:22 9 1156551

>>1156550
>Не совсем понятно, чего ты хочешь.

Ну я хочу заменить все эти танцы с бубном и инкрементами указателя на что-то вроде ret_test.wind = pgm_read_word(&Profile[time].wind) и так далее, так можно сделать? Какой правильный синтаксис для таких конструкций?

Ответы56629

16 мар, 11:48 10 1156629

>>1156551
тебе не красиво? сделай юнион с char@.

Ответы56884

16 мар, 15:18 11 1156727

Где прочитать все сдвиги C99 относительно C89?
Язык не важен, важна ёмкость изложения.

Ответы56896

16 мар, 20:11 12 1156884

>>1156629
Да хуй там, оказывается можно указывать на сами элементы массива. Жалко только что нету ассемблерного кода для считывания вообще всего блока.

16 мар, 20:34 13 1156896

>>1156727
Вступление к соответствующему стандарту или справка от Pelles C.

17 мар, 11:23 14 1157165

Я невнимателен, или и правда нигде не сказано о том как malloc выравнивает левую границу? Мне два бита нужно, есть вообще какие-то гарантии на этот счёт?

Ответы57629

17 мар, 22:11 15 1157629

>>1157165
> правда нигде не сказано о том как malloc выравнивает левую границу
Сказано. malloc делает выравнивание так, чтобы оно было достаточным для любого встроенного типа. Для всего остального есть aligned_alloc из C11.

> Мне два бита нужно
Чо? Тебе бы что-нибудь по архитектуре компов почитать. Минимально адресуемая единица - байт. А на практике, любым маллоком будет выделено не менее sizeof(uintptr_t).

Ответы57905

18 мар, 07:47 16 1157905

>>1157629
>Чо?
Мне в указателе, в крайних двух разрядах, необходимо сохранить два флага, в самой переменной, а не в выделяемой памяти я имею в виду.

Ответы5791357981

18 мар, 08:15 17 1157913

>>1157905
Ты всё-таки почитай как адресуется память и как происходит чтение-запись.

18 мар, 10:14 18 1157981

>>1157905
тут уже один чувак так делал, в в одном заведении учитесь?

по идее гарантий никаких нет. вроде нет соотв. дефайнов на этот счёт. выделяй сразу с запасом. (void@)((uint_ptr)malloc(T + 3) & ~(uint_ptr)3)

Ответы57984

18 мар, 10:17 19 1157984

>>1157981
ой не так.

(void@)((uint_ptr)malloc(T + 3) + 3 & ~(uint_ptr)3)

18 мар, 10:21 20 1157986

но тогда хранить нужно и настоящий адрес (или смещение). ну понятно - выделяешь ещё sizeof(void@), выравниваешь, вписываешь указатель и смещаешь.

у меня кстати по этой теме вопрос, можно как-то сделать обёртку над malloc, но чтобы с тем же именем? или это должна быть поддержка библиотеки, там, альтернативное имя...

Ответы57993

18 мар, 10:32 21 1157993

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

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

Ответы58011

18 мар, 10:57 22 1158011

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

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

Ответы58134

18 мар, 13:21 23 1158134

>>1158011
Во догонку ещё вроде бы BoehmGc умеет подменять обращения к malloc,

А как-то статическую переменную по кратному адресу выровнять можно?

Ответы58603

18 мар, 13:32 24 1158137

Можно ли как-то реализовать такое?
Или только инклюдить через ifndef

#define LOH 123
#include "../" + LOH + "/file.h"

Ответы5860358607

18 мар, 18:06 25 1158374

>>1156306 (OP)
родные, покажите реализацию компаратора для типа double, пожалуйста

Ответы58402

18 мар, 18:34 26 1158402

>>1158374
bool AreSame(double a, double b)
{
return fabs(a - b) < EPSILON;
}

Ответы58442

18 мар, 19:19 27 1158442

>>1158402
почему bool а не int?return fabs(a - b) < EPSILON; возвращает + если разность "~0" и - если числа разные, я правильно понял? но ведь компаратор не только говорит разные числа или одинаковые, он еще говорит какое больше

Ответы58603

18 мар, 22:50 28 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;

Ответы5860759398

18 мар, 22:56 29 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 мар, 08:11 30 1159398

>>1158603
>return (fabs(delta) < EPSILON) ? 0 : (delta < 0) ? -1 : +1;
спасибо большое

20 мар, 09:30 31 1159423

Ахахах, у вас что, даже нет встроенного сравнения чисел?

Ответы59452

sage 20 мар, 10:42 32 1159452

>>1159423
Ты про spaceshit? Нету. Как ты в него нужный эпсилон передашь? Ах никак, ах авторы компилятора интерпретатора твоего языка лучше тебя знают, какая погрешность у твоих значений?

20 мар, 11:03 33 1159459

можно ли обработать SIGTERM?

Ответы59463

20 мар, 11:11 34 1159463

>>1159459
да

21 мар, 14:25 35 1160046

День добрый, аноны. Не знаю как более красиво решить задачу:
Я делаю выборку из БД и сколько строк она вернет - неизвестно. Проходясь циклом по результату выборки я каждую строку помещаю в структуру, а структуру в массив. Для этого перед каждой выборкой мне приходится сначала выбирать количество записей и на основании его инициализировать массив. То есть приходится делать два запроса, хотя полезные данные возвращает только один из них. Скажите, как мне затолкать результаты выборки в массив заранее не зная его размера?

Ответы600566060762103

21 мар, 14:34 36 1160056

>>1160046
никак, певый скюл запрос с каунт закеширует результат в бд, второй будет бесплатно. ну или читай фиксированными чанками.

Ответы6006160466

21 мар, 14:37 37 1160061

>>1160056
Хм, ну если на производительности это не скажется то пусть так и остается. Спасибо.

22 мар, 03:06 38 1160466

>>1160056
>закеширует
Не кэш, а буфер. Кэш умеет синхронизироваться.

22 мар, 11:42 39 1160607

>>1160046
Используй односвязный список, например.

Ответы60626

sage 22 мар, 12:40 40 1160626

>>1160607
Почти двачую. Список чанков, хранящих по n записей - это правильный способ решения проблемы, если производительность критична аж пиздец как. Если нет - realloc тоже сойдет.

24 мар, 21:44 41 1162041

Репост из крестового треда

Как в vs2017 (или вообще какими ключами компиляции) смерджить все секции в одну - .text? Я видел в msdn'е статьюю про /merge .rdata=.text, но там не сказано, какой разделитель и как использовать для нескольких секций

Ответы62063

24 мар, 22:08 42 1162063

>>1162041
> но там не сказано, какой разделитель и как использовать для нескольких секций
Сделай несколько мержей: /MERGE:.rdata=text /MERGE:.data=.text /MERGE:.bss=.text

24 мар, 23:21 43 1162103

>>1160046
Наиболее красиво - это выкинуть массив нахуй, и обрабатывать записи по мере поступления. Попробуй, может, получится. В большинстве случаев получается. Тем более что в С++ вроде бэкпортили range из D, так что должно быть несложно. (Не знаю точно так как давно не юзал). Если не получается и по данным надо что-то считать с рандомным доступом, возможно, ты просто хуево знаешь SQL, потому что когда ты его знаешь хорошо, ты выбираешь уже все готовое к применению.

.c или .h 28 мар, 15:28 44 1164019

сап двачеры, срачеры, хуячеры, усачеры и тд. Объясните недоразвитой мошонке, мне, в чем разница нахуй между файлами .c и .h. я ебать пишу такой файл с прототипами имен переменных ну да надо переносимость обеспечить сохраняю с расширением .h подключаю через инклуд и все робит, меняю расширение на .c и опять нахуй все робит, ебать думаю я че за хуйня не должно же робить или должно хуй его знает. В общем как я понял .h сделали тупо чтобы не путать с .c файлами походу так. Поправляйте смело меня если не так. Спасибо за внимание нахуй

Ответы64026640606407364140

28 мар, 15:38 45 1164026

>>1164019
это все еще я, ну вот даже простой пример: подключаю stdio.h вызываю printf все норм, опять же захожу в сборище заголовочных файлов меняю расширение у файла stdio.h на stdio.c в коде тоже все меняю, повторно компилю и опять все норм робит ну и как так

Ответы64030

28 мар, 15:49 46 1164030

>>1164026
а что тебя не устраивает?

Ответы64036

28 мар, 15:58 47 1164036

>>1164030
ну тип так и должно быть? это нормально? то есть если я хочу то могу спокойно писать заголовочные файлы с расширением .c??

Ответы64060

28 мар, 16:21 48 1164060

>>1164019
> в чем разница нахуй между файлами .c и .h
Для Си, как языка - ни в чем, можешь хоть .yoba называть все свои файлы. Другие утилиты, например, make, ожидают, что ты назовешь исходник foo.c, чтобы make foo (без Makefile) смог правильно сработать.

>>1164036
> писать заголовочные файлы с расширением .c
Можешь. Некоторые делают кладут static inline функции в отдельные файлы с расширением .inl. В крестах так и вообще разброд и шатания, там есть и .h, и .hpp, и .hxx, и .hh, и даже .h++ раньше было. Ты можешь делать все, что угодно, но старайся быть консистентным и очевидным по мере своих сил.

Ответы64064

28 мар, 16:23 49 1164064

>>1164060
не знаю принято ли тут говорить спасибо, но спасибо.

28 мар, 16:33 50 1164073

>>1164019
Чисто логическое разделение. Грубо говоря в хэдэрах всё прототипизируется, а в файлах кода реализуется. Можешь проект в лям строк хоть в 1 .c захерачить, но будет ли это удобно? (особенно когда дело коснется препроцессора).
Это ты ещё банальным вопросом задался, ведь может быть всякое: .c .h .cc .hh .cpp .hpp .cxx *.hxx и т.д.

28 мар, 19:28 51 1164140

>>1164019
Заголовки отдельно нужны, чтобы ты мог использовать чужие _скомпилированные_ библиотеки. И чтобы кто-то мог использовать твои.

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

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

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

Это основной смысл, остальное - структурирование кода и т.п. - по желанию.

29 мар, 16:06 52 1164604

>>1156306 (OP)
Возник тупой вопрос. Следующие две команды идентичны или нет?
double (зв)x = (double(зв))malloc(10 x sizeof(double));
double (зв)x = malloc(10 x sizeof(double));
Если да, зачем тогда в таких случаях пишут приведение типов?
Если нет, не является ли вариант с приведением медленнее чем без него?

Ответы6465864941

29 мар, 17:54 53 1164658

>>1164604
В Си указатель на void автоматически и неявно кастится к указателю на другой тип (и обратно). В крестах такого нет (у них там type safety типа), поэтому нужен явный каст. Разницы по производительности нет. Каст возвращаемого маллоком значения - классический признак человека, который учил не Си, и не кресты, а некий "си с классами".

Ответы647256499087472

29 мар, 19:42 54 1164725

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

30 мар, 02:53 55 1164941

>>1164604
>Если да, зачем тогда в таких случаях пишут приведение типов?

Чтобы обеспечить переносимость сишного кода на кресты.

Ответы64990

30 мар, 10:48 56 1164990

>>1164941>>1164658
Благодарю.
Хотя во втором случае возникает вопрос, зачем конпелировать сишный код плюсовым конпелятором.

30 мар, 15:34 57 1165130

Чпок!

Ответы65468

30 мар, 23:36 58 1165468

>>1165130
Добрый вечер!

Мимо вежливый лось

31 мар, 09:37 59 1165581

https://youtu.be/443UNeGrFoM

Бля, посмотрел видео. Смешанные чувства. С одной стороны он прав, хотя блин... Вроде и бредит немного.

Ответы65880

31 мар, 19:32 60 1165880

>>1165581
2 часа смотреть как какой-то петух рассказывает про свой стиль программирования?

1 апр, 20:50 61 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);
}

Ответы6651666593

1 апр, 21:07 62 1166508

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

Ответы665506659366873

1 апр, 21:15 63 1166516

>>1166492
Не скомпилируется.

1 апр, 22:11 64 1166550

>>1166508
Системный вызов возвращает некий признак конца файла.
Ну вооот

2 апр, 00:41 65 1166593

>>1166492
В теории представление _Bool может хранить хоть 'y'/'n', и разворачиваться в 0/1 только при использовании в выражениях, хотя на практике никто такой хуйней не страдает. Поэтому если исправить ошибки, вернется 2.

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

2 апр, 01:39 66 1166602

>>1156306 (OP)
ребят простите за ламерский вопрос , но интересно куда возвращает значение return доупстим из мейна или та же функция exit куда они выводя значения и где их посмотреть

Ответы6660766616

2 апр, 01:48 67 1166607

>>1166602
Там до и после мейна ещё код работает.
А где посмотреть... погугли программа код возврата

2 апр, 02:25 68 1166616

>>1166602
> где их посмотреть
В винде (в сосноли):
app.exe
echo %ERRORLEVEL%
В линуксе (в сосноли):
./app
echo $?
(или можно приглашение настроить, чтобы код возврата предыдущей команды автоматически выводило). Алсо, можно получать код возврата программно (для этого он и придуман).

> куда возвращает значение return
В main() return EXPR полностью аналогично вызову exit(EXPR);

2 апр, 11:42 69 1166681

Господа, переделайте, пожалуйста, Си++ код в Си.
https://ideone.com/wLxTJb

Ответы66687

sage 2 апр, 11:56 70 1166687

>>1166681
Отвратительный код. С тебя $10.
printf("%.2x\n", 0x0f ^ 0x61);

Ответы66695

2 апр, 12:06 71 1166695

>>1166687
Смешно.

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

С помощью маски надо одновременно изменить состояние одного \ нескольких битов в байте, не затрагивая не нужные. Порядок бит (как в самом байте, так и в выбираемых для изменения) - MSB...LSB.

Ответы66697

sage 2 апр, 12:08 72 1166697

>>1166695
Очевидно, что когда маска зависит от числа, тебе не нужна маска, потому что результат - константа. А если тебе нужно менять биты в рандомном числе, тебе нужно ДЖВЕ маски - для and-not и для or. Такие дела.

Ответы66700

2 апр, 12:11 73 1166700

>>1166697
В Си++ коде именно так. Поэтому и прошу переписать.
Пусть даже за вознаграждение. Разумное. 300к нет.

Ответы66709

sage 2 апр, 12:23 74 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 - индекс_бита), если сильно надо.

Ответы6673266787

2 апр, 13:12 75 1166732

>>1166709
байтоёбы

Ответы66924

2 апр, 15:04 76 1166787

>>1166709
Спасибо попробую собрать. Хотя не уверен, что получится.
Дай фейкомыльце, а?

Может ещё будут предложения.

Ответы668786688566901

2 апр, 18:26 77 1166873

>>1166508
http://www.c-cpp.ru/content/eof

Что такое потоки символов?

Ответы66882

2 апр, 18:29 78 1166878

>>1166787
> Дай фейкомыльце, а?
suck_my_nerd_co8\BckANUSmaijv%lPUNCTUMrXv\u
> Может ещё будут предложения.
С пошлостями не обращаться.

зы: дятел, за каким хуем ты учишься? Пиздуй сраз в макхряк трудоустраиваться

Ответы66885

2 апр, 18:34 79 1166882

>>1166873
Ну смотри. Можно абстрагироваться над файлом и представить себе трубу из которой выливаются символы один за другим. Тебе похуй, откуда они там в трубе берутся - может быть, они из файла читаются, может их пользователь ввел, может их другая программа на лету генерирует, а может они через сеть прилетели. И вот ты читаешь символы, а потом тебе прилетает вместо символа хуй (EOF). Тут-то ты и понимаешь, что больше у этой трубы ловить нечего. Вот это потоки. Потоки символов, байтов или еще какой-нибудь хуйни (в Си - потоки символов).

Ответы66899

sage 2 апр, 18:35 80 1166885

>>1166787
Это >>1166878 если что не я был. Спрашивай тут, если к Си относится, или в прикрепленном, если не относится.

Ответы66901

2 апр, 18:47 81 1166899

>>1166882
В первый раз слышу про потоки, честное слово. Сравнение канализацией попахивает. Тебе может быть пойти на сантехника отучиться?!

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

Посмотри код tail, ключ -f к этой утилите именно то, что тебе надо.

sage 2 апр, 18:48 82 1166901

>>1166787
Этот >>1166885 быдло мимикрирующее из /б просочившееся сюда, не обращай внимания.

2 апр, 19:21 83 1166911

Расскажите про стандарты языка. Что это и как это. Что значит поддержка компилятором стандарта.

Ответы6691466920

2 апр, 19:24 84 1166914

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

2 апр, 19:26 85 1166915

Создать язык программирования это значит создать компилятор для него получается так? То есть создать некую программу которая будет переводить некие слова в машинный код? Почему тогда раз машинный код для каждого процессора разный то программа написанная мною на моем пк успешно запускается на другом пк с другим поколением процессоров к примеру у меня амд а у приятеля интел

Ответы669176692066933

2 апр, 19:32 86 1166917

>>1166915
Зависит от ОС и кучи других факторов.

Ответы6691866919

2 апр, 19:32 87 1166918

>>1166917
Можно подробнее?

Ответы66922

2 апр, 19:33 88 1166919

>>1166917
начни со стандартов и то как они связаны с компиляторами

Ответы66923

sage 2 апр, 19:35 89 1166920

>>1166911
> Расскажите про стандарты языка. Что это и как это. Что значит поддержка компилятором стандарта.
В Си на текущий момент три стандарта. Это такие документы, очень скучно и подробно описывающие язык. Поддержка стандарта означает, что поддерживаются все нововведения по части синтаксиса (компилятором), а в стандартной библиотеке (если она идет с компилятором) присутствуют все новые функции, наличие которых гарантирует стандарт.

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

> у меня амд а у приятеля интел
Архитектура команд у AMD и Intel по большей части одинакова.

2 апр, 19:38 90 1166922

>>1166918
Подробно писать не буду, ибо заебусь печатать.

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

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

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

Лень откровенно новоря приводить примеры как Си код вюпревращается в ассемблер, который в виде инструкций поступает на конвеер ЦП и как там память кеш и прочие компоненты задействованы.

2 апр, 19:41 91 1166923

>>1166919
Берем, например ци89. Есть там абстрактная комнда fuck(), которая в наборе инструкций интел и амд ЦП будет соответствовать последовательсти jmp ax, cmp e6, e4... и т.п. У интела это будет инструкция нащываться А, а у АМД Б.

2 апр, 19:44 92 1166924

>>1166732
Побитовые операции есть даже в javascript, но куда тебе дегенерату знать про это.

sage 2 апр, 20:08 93 1166933

>>1166915
В ньюфаг-тред.

21 Кб, 654x228
2 апр, 21:48 94 1166984

Аноны, хелпуйте нубу.
Задача - вывести ласт слово задом наперёд.
Вывод: euelueblue
Кто пояснит?

Ответы669906699267727

2 апр, 21:55 95 1166990

>>1166984
У тебя принтф печатает с символа, который ты передал и до \0.
e
ue
lue
blue

2 апр, 21:57 96 1166992

>>1166984
Попробуй печатать символ, а не строку. printf(%c, s)

Ответы6699466997

5 Кб, 258x88
2 апр, 21:58 97 1166994

>>1166992

Ответы66997

21 Кб, 650x230
2 апр, 22:02 98 1166997

>>1166992
>>1166994
Спасибо, так работает.

Ответы6720367423

3 апр, 03:20 99 1167203

>>1166997
Что за компилятор?

Ответы6720667386

3 апр, 03:53 100 1167206

>>1167203
Lexicon

Ответы67224

3 апр, 06:15 101 1167224

>>1167206
>Lexicon
Что-то не гуглится. Есть ссыль на установщик?

Ответы67295

sage 3 апр, 12:21 102 1167295

>>1167224
Lexicon? Конечно есть: https://transfer.sh/yplpi/Lexicon-8.92.zip

3 апр, 15:49 103 1167386

>>1167203
gcc 5.4.0

3 апр, 16:52 104 1167423

Ничего не понял, вот это >>1166997 говно скомпилируется даже на микроволновке. Какая разница, какой конпелятор?
Или гений выше перепутал компилятор с иде?

Ответы6744167461

3 апр, 17:20 105 1167441

>>1167423
Насколько я понял - да, перепутал. Увидил интерфейс моего саблайма и спросил что за компилятор.

14 Кб, 316x341
3 апр, 17:44 106 1167461

>>1167423
Да, перепутал. Всё, придётся выйти покурить в окно. Так дальше жить нельзя.

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

Вроде ничего пиздец архи-сложного не спрашивал, лол.

Ответы67609

3 апр, 21:53 107 1167609

>>1167461
тебя даже никто не трогал, взял ещё и обиделся. тебе лечиться надо.

3 апр, 23:58 108 1167682

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

Ответы6772867741

125 Кб, 399x213
4 апр, 02:19 109 1167727

>>1166984
> длина строки
> sizeof(s)

Ответы67741

4 апр, 02:22 110 1167728

>>1167682
У структуры прописываешь поле "рефкаунт", пишешь методы "инкреф" и "декреф". Во втором прописываешь логику освобождения памяти.

Ответы6772967771

4 апр, 02:23 111 1167729

>>1167728
> пишешь методы
Ну функции, в смысле

sage 4 апр, 03:31 112 1167741

>>1167727
И ты сейчас нам пояснишь, почему нужно считать в рантайме через strlen, а не в компайлтайме через sizeof.

>>1167682
Посмотри на COM (одним глазком только, не нужно в дебри лезть, какой-нибудь вводной статьи хватит).

Ответы67764

4 апр, 05:53 113 1167764

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

Ответы6779167883

4 апр, 06:26 114 1167771

>>1167728
Для подобного существует boehm gc
https://en.m.wikipedia.org/wiki/Boehm_garbage_collector

4 апр, 09:20 115 1167791

>>1167764
Причина "во-первых" и "во-вторых" одна и та же, sizeof(x)/sizeof(*x) для динамически выделенного массива будет использовать только очень особенный пограммист.

Ответы67795

sage 4 апр, 09:32 116 1167795

>>1167791
>sizeof(x)/sizeof(*x) для динамически выделенного массива будет использовать только очень особенный пограммист.
Ты скозал?
Ну и что же используют господа, обучавшиеся в Хуеле?

Ответы67803

4 апр, 09:58 117 1167803

>>1167795
Я не настаиваю, конечно, в следующем коде нет ничего противозаконного

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

Но результат может немного расстроить.

Ответы6780467863

4 апр, 09:59 118 1167804

>>1167803
int (зв)x = malloc(10 * sizeof(int));

Ответы69183

sage 4 апр, 12:56 119 1167863

>>1167803
А еще можно после твоего printf сделать x[100]=0xdead. По твоей логике [] зло, нужно написать какую-нибудь array_set(), которая проверяет границы, лишь бы какой-нибудь недоучка не обосрался. Тебе в другой язык с таким подходом.

Ответы67883

4 апр, 14:26 120 1167883

>>1167863
Что ты несешь? Я лишь сказал, что придирки в этом >>1167764 посте надуманные, и разве лишь дебил неопытный попадется на подобную ошибку (на определение числа элементов в массиве, выделенном маллоком).
Про добро и зло ты сам домыслил.

Ответы67944

sage 4 апр, 16:21 121 1167944

>>1167883
Так и я о том же.

5 апр, 19:56 122 1168611

Друзья, мне нужно как-то записать и вывести кириллицу не используя wchar, что делать?

Ответы68612

5 апр, 20:02 123 1168612

>>1168611
> что делать
Бочку. ОС, компилятор, более полное описание задачи?

Ответы68616

5 апр, 20:06 124 1168616

>>1168612
на степика есть задача, где нужно написать программу, принимающую кириллицу, далее дефолтная работа со строкой и вывод. Решил wchar, сказали збс а теперь без wchar, сказали думать в направлении, что кириллица не помещается в char

Ответы68619

5 апр, 20:12 125 1168619

>>1168616
Не знаю, кто такая эта ваша степика, но если у тебя нормальный линукс, ты можешь использовать UTF-8 (на винде тоже можешь, но в винде UTF-8 в консоли можно сделать только в десяточке) - если кириллица не помещается в один char, то может поместиться в несколько char. Про подробности кодирования UTF-8 см. википедию. Но без сборки хотя бы одного символа в wchar_t/char16_t/char32_t ты со строкой нормально не поработаешь (ну, конечно, моооожно, но больно).

372 Кб, 1066x600
5 апр, 20:54 126 1168644

Ответы68944

sage 6 апр, 06:32 127 1168944

>>1168644
Но ведь Си действительно мёртв.
Сейчас тащат плюсы.
Все, кто исползует Си - петухи и опущенцы.

31 Кб, 400x625
6 апр, 11:09 128 1169001

сап, есть прога. Нифига не понятен принцип работы (да, она не совсем правильна). Хелп! Обясните дурачку!

Ответы6900569060

6 апр, 11:21 129 1169005

>>1169001
Что тебе не понятно? Обычный односвязный список.

sage 6 апр, 13:46 130 1169060

>>1169001
>for(; pizda;)
Мам, смотри, я хакер!

Ответы6910569136

sage 6 апр, 14:46 131 1169105

>>1169060
Правильные ребята пишут так: for (; ∗current; current = &((*current)->next));

Ответы691356913671088

6 апр, 15:24 132 1169135

>>1169105
Бля, ахуенно жеж.

6 апр, 15:26 133 1169136

>>1169060
>>1169105
Но зачем эта сахарная параша когда есть while/

6 апр, 17:15 134 1169183

>>1167804
А потом ты поменял тип x, или не ты, что только увеличивает вероятность внесения ошибки

Ответы69202

6 апр, 17:44 135 1169202

>>1169183
>А потом
Суп с котом.

9 апр, 21:49 136 1170933

>>1156306 (OP)
https://pastebin.com/Pdv3jmv9
> Error in `main': malloc(): memory corruption (fast): 0x00000000013470e0
Посоны, почему возникает ошибка? Видимо, из-за функции f2, она как-то распидарасивает мою память void*. А как тогда правильно?

Ответы7094570954

9 апр, 22:01 137 1170945

>>1170933
>memory corruption
планку памяти смени на новую

Ответы70951

9 апр, 22:17 138 1170951

>>1170945
Где ж я в тюрьме планку памяти достану? Есть ещё варианты?

Ответы70985

sage 9 апр, 22:29 139 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. Иначе стоит сложить сначала оба массива даблов, потом уже инты. Но вообще, такой подход говно, не делай так, если не уверен.

Ответы7095570963

sage 9 апр, 22:32 140 1170955

>>1170954
> memory + (2 + 4)n = memory + 6n:
memory + (4 + 8)n = memory + 12n (опечатался).

9 апр, 22:49 141 1170963

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

Препод сказал, все говно (и он прав, ибо сишный код работает по скорости так же, как питоновский прототип), ирл в таких случаях делают менеджоры памяти.
Понятия не имею, что такое менеджер памяти. Потому я добавил в структуру поле void∗, куда засовывается память, которая использовалась бы вместо маллоков внутри функции.
А как следовало поступить тогда?
Небольшой пример в выше я написал просто чтобы разобраться, почему у меня все неправильно работает.
За итеративный способ спасибо, пока так и сделаю.

Ответы7096470968

9 апр, 22:51 142 1170964

>>1170963
> int f(mystruct structure, unsigned size, бла-бла);
Фикс.

sage 9 апр, 22:55 143 1170968

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

Ответы71003

9 апр, 23:33 144 1170985

>>1170951
тюрьма психотронная, надеюсь?

9 апр, 23:56 145 1171003

>>1170968
А я проверил, "итеративный вариант" дал ускорение в полтора раза. Пожалуй, оставлю.

Ответы71009

10 апр, 00:01 146 1171009

>>1171003
Ты точно уверен, что malloc(sizeof(mystruct) * size) медленнее? Я вот не верю в такое.

Ответы71018

10 апр, 00:12 147 1171017

9 Кб, 500x2924 Кб, 388x28

Народ посмотрите пожалуйста на мой выссер и скажите почему этот кусок говна не хочет запускаться. Битый час сижу над этим дерьмом. P.S. Скорее всего руки у меня кривые.
https://ideone.com/iK76G3

Ответы7102071021

10 апр, 00:13 148 1171018

>>1171009
https://pastebin.com/qD9yFRMq
Результат:
f1: 28.039000
f2: 19.173000

Завтра проверю в gcc, может другие числа будут.

Ответы7102771034

10 апр, 00:15 149 1171020

>>1171017
Знак умножения пропущен.
e определена в константах.
Тебе в плюсотред.

Ответы71031

10 апр, 00:16 150 1171021

>>1171017
Добавлю к замечаниям предыдущего анона, что ^ - это оператор побитового исключающего или, а степень - это функция pow().

Ответы71024

10 апр, 00:18 151 1171024

>>1171021
А еще есть exp.

10 апр, 00:20 152 1171027

>>1171018
Откуда у тебя там вторые + size взялись при вычислении указателей? Зачем? Мы считаем относительно предыдущего указателя. y - это память, следующая за size элементами в x, а res - это память, следующая за size элементами в y.

10 апр, 00:28 153 1171031

>>1171020
Спасибо что отозвались Аноны, вагон чая и уважения вам. Я поменял но все равно не врубается. https://ideone.com/wgsAbX

Ответы71034

10 апр, 00:34 154 1171034

>>1171031
Английский язык говорить? Сообщение об ошибка читать? Где переменная a объявлять? Нигде не объявлять? Вот и не врубаться.

>>1171018
Алсо, тест-кейс у тебя был очень хуевый. Сумма там заменится на i * 2, а учитывая, что у f1() сайдэффектов нет (она ничего не возвращает, и вообще почти не влияет на мир за своими пределами), нормальный компилятор вообще может выкинуть все ее содержимое на ненадобностью.

10 апр, 08:01 155 1171078

Пардоньте, а нет ли аналага fopen такого, что б ему не нультерминированную строку требовалось передавать, а буфер и его длинну? Или только напрямую с sysenter возиться?

Ответы71234

10 апр, 08:54 156 1171088

>>1169105
Правильные ребята используют tail-рекурсию.

Ответы71105

10 апр, 09:48 157 1171105

>>1171088
>Правильные ребята
в плане правильно ебутся в жопы.

10 апр, 14:40 158 1171234

>>1171078
Системный вызов open() сам хочет нультерменированную строку. Напиши себе обертку, которая будет копировать имя в массив и по указанному офсету втыкать \0.

Ответы71256

10 апр, 15:04 159 1171256

>>1171234
Так и придётся делать, спасибо.

10 апр, 21:53 160 1171420

>>1156306 (OP)
Поясните за realloc, нужно free вызывать для старого указателя? т.е если new_ptr = realloc(old_ptr, new_size);
нужно потом делать free(old_ptr);?

Ответы71426

10 апр, 22:00 161 1171426

>>1171420
Если realloc() сфэйлился, твой указатель остается твоим, и ты должен его освободить. Если realloc() прошел успешно, ты заботишься только о том указателе, который тебе вернули. Старый указатель уже не твой. Кстати, realloc() может вернуть тебе твой же старый указатель, если есть возможность просто добавить памяти в выделенный блок, поэтому было бы странно, если бы тебе нужно было его освобождать.

portaudio 11 апр, 22:11 162 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.

Алсо, если я хочу написать простую говорилку текста или мелодию из марио, то что мне нужно знать? Надо взять библиотеку полегче или же книжку потяжелей?

Ответы72032

12 апр, 02:04 163 1172032

>>1171919
Возьми OpenAL и не еби себе мозг.

12 апр, 18:28 164 1172438

В чужом коде наткнулся на объявления функций в таком виде:

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

Зачем так делалось?

Ответы72441

12 апр, 18:32 165 1172441

>>1172438
Видимо код совсем древний, во время K&R (ло принятия ANSI стандарта) так писали.

Ответы72491

12 апр, 18:42 166 1172453

Пытался написать слияние массивов в том стиле, в котором написана qsort.
С double и int вроде норм работает, а вот структуры обмениваются полями. Где я накосячил?

https://pastebin.com/ZZEzmk0C

Ответы72552

12 апр, 19:08 167 1172491

>>1172441
Это код из проекта, который появился после 2000 года.

12 апр, 20:58 168 1172552

>>1172453
Да вроде все норм. Смущает только вычисление длины хвоста массива в последних двух memcpy, не понимаю твоей логики. Покажи минимальный компилирующийся пример, который не работает.

Ответы72575

12 апр, 21:33 169 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-того элемента.

Я и сам проверил на паре примеров, вроде все норм. Видимо, я с указателями проебался.

Ответы72576

12 апр, 21:43 170 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 элементов. И у нас случается ОЙ.

Ответы72618

12 апр, 23:00 171 1172618

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

Ответы72620

12 апр, 23:01 172 1172620

>>1172618
Хотя можно было бы добавить что-то типа if(size1 + size2 < size_result) {return POSHOL_NAHOOY;}

13 апр, 15:38 173 1172927

>>1156306 (OP)
Анон, как устроенна работа GPU, у которых есть своя собственная память? Вот я, например, всегда работал с платами с видеокартой, у которой нет встроенной памяти, и здесь всё просто - графика из юзерспейса элементарно копируется в RAM, пинается GPU, который потом по DMA забирает данные, обрабатывает их и пишет результат во фреймбуфер опять же в RAM.

Ответы73029

13 апр, 17:59 174 1173029

>>1172927
> юзерспейса элементарно копируется в RAM
Вот ето поворот.
А где был юзерспейс?

Ответы73124

13 апр, 20:27 175 1173124

>>1173029
В свопе.

13 апр, 22:21 176 1173221

Посоны, существует ли какой-нибудь сайт, куда можно выложить код, чтобы его похуесосили, пояснили за элементарные ошибки не те ошибки, которые делают код нерабочим, их я сам могу найти. Ошибки уровня "так делают только мудаки", стиль и прочее?

Гитхаб не то. Туда я выложу, и он будет висеть джва года без просмотров.

Ответы732267324073262

13 апр, 22:31 177 1173226

>>1173221
>существует ли какой-нибудь сайт
https://govnokod.ru/

13 апр, 23:10 178 1173240

>>1173221
всю жизнь хочешь провести в зависимости от мнения окружающих?

13 апр, 23:36 179 1173262

>>1173221
https://codereview.stackexchange.com/

Ответы73275

13 апр, 23:44 180 1173275

>>1173262
Благодарю, то что надо.

14 апр, 10:28 181 1173437

Встречается такой стиль объявления функций:

int
function(char *s)
{
}

Объясните, какие преимущества даёт размещение возвращаемого типа в отдельной строке?
При этом в заголовочных файлах эти же в одной строке.

Ответы7360373712

14 апр, 15:54 182 1173603

>>1173437
Конпелятору похуй. Дело вкуса.

14 апр, 16:13 183 1173613

Как в сублайме включить вывод ошибок для Си? Работаю на линухе, если это имеет значение.

Ответы73712

14 апр, 17:04 184 1173661

Антоны, что использовать для перехвата нажатия клавиши в Си?

Ответы73712

14 апр, 18:53 185 1173712

>>1173437
Если тип возвращаемого значения длинный, или конвенция вызова указывается, то искать глазами имя функции проще:
const struct myyoba_data_store * MYLIB_CALLTYPE
function(void)
{
}

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

>>1173661
В Си - ничего. Какая ОС? Клавиша в графическом приложении или в консоли?

Ответы73739

14 апр, 19:41 186 1173739

>>1173712
>В Си - ничего. Какая ОС? Клавиша в графическом приложении или в консоли?
В консоли. ОС - Linux Gentoo.

Ответы73749

14 апр, 19:53 187 1173749

>>1173739
Опиши нормально задачу. У кого ты клавиши перехватывать собрался, зачем? Ты там reptyr какой-нибудь пишешь, или что?

Ответы74056

15 апр, 09:57 188 1174056

>>1173749
Пишу рогалик в терминале.

Ответы74146

15 апр, 13:35 189 1174146

>>1174056
А ты действительно изучил хотя бы основы сишечки?
fgets, gets, scanf...

Ответы82052

15 апр, 14:50 190 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"
И тогда в сообщении будет имя программы, как положено.
Что-то в связи с последовательностью работы препроцессора, порядком раскрытия макросов чтоли, но мне непонятно, что именно ему мешает по-человечески со мной...

Ответы741897419574300

15 апр, 14:52 191 1174189

>>1174187
Так, только не надо вот говорить, что это потому, что я #PRORGRAM написал.
Нее

15 апр, 14:55 192 1174195

>>1174187
>#define PROGRAM program
Попробуй утакуот
#define PROGRAM "program"

Ответы7419774201

15 апр, 14:56 193 1174197

>>1174195
Пробовал, нихрена.
Да и бессмысленно это.

15 апр, 14:57 194 1174201

>>1174195
А, всмысле, потом PROGRAM уже без '#' подставлять?

Ответы74208

15 апр, 15:03 195 1174208

>>1174201
До. У тебя же строка

15 апр, 17:24 196 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" уже написали выше, строковые литералы отлично конкатенируются безо всяких операторов.

Ответы74304

15 апр, 17:26 197 1174304

>>1174300
> #define FOO bar
STR(FOO) // Тут получится "FOO", а не "bar".

А почему у меня всегда bar?

Ответы74310

15 апр, 17:35 198 1174310

>>1174304
https://ideone.com/KLwTN3 (внизу)

Ответы7455574621

15 апр, 22:44 199 1174555

>>1174310
Я упоролся, соре.
Всё там, как и ожидалось.

15 апр, 23:43 200 1174621

>>1174310
Эт что за магия!? оО

16 апр, 03:56 201 1174700

сап аноны, поясните за передачу tar архива по tcp с помощью сокетов.

Ответы7482574995

16 апр, 07:36 202 1174727

А 9-битовый тип данных можно организовать?
А то 8 бит мало, а 16 много, чтобы возводить флаги. Контролируемых ситуаций 9.

Ответы74728

16 апр, 07:37 203 1174728

>>1174727
Хотя каковый в этом смысл, там же всё равно выравниваться в итоге будет по крайней мере по 8 битам, да?

Ответы74729

16 апр, 07:37 204 1174729

>>1174728
Да.

16 апр, 11:48 205 1174825

>>1174700
Открываешь сокет, передаешь. Не забываешь, что send может передать меньше, чем ты ему сказал, поэтому внимательно обрабатываешь код возврата.

12 Кб, 300x241
16 апр, 14:22 206 1174901

Хелп
Нужно написать Windows драйвер (мне вроде KMDF подходит), который будет считывать значение TSC: Time stamp counter, счетчик тактов (на самом деле не TSC, а MSR мне нужно) регистра процессора и записывать новое значение в этот регистр.

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

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

В Windows Internals судя по оглавлению не раздела про написание драйверов. А на сайте Microsoft написано мало и не полно как-то, хотя может я и жопой читал

Ответы749097500375041

16 апр, 14:46 207 1174909

>>1174901
Есть книга про драйверопесание под венду, гугли, лентяй

16 апр, 17:39 208 1174995

>>1174700
man netcat

16 апр, 17:52 209 1175003

>>1174901
Windows Must Die

Ответы75008

64 Кб, 771x599
16 апр, 17:55 210 1175008

>>1175003
>Windows Must Die

sage 16 апр, 19:52 211 1175041

>>1174901
Качаешь DDK (можно, и даже возможно лучше - несвежий какой-нибудь). Читаешь документацию из комплекта (для такой простой хуйни достаточно введение прочитать). Правишь любой простой пример из комплекта. Компилируешь. Алсо, у MS сейчас все свежие примеры на гитхабе лежат.

17 апр, 13:44 212 1175326

друзья, помогите с правильным ответом на вопрос: вот например у нас есть указатель на первый элемент массива a и указатель b на nй элемент массива, (b-a+1) - индекс элемента массива, так вот вопрос, нахера мы единицу прибавляем? нужен именно правильный ответ. Заранее спасибо

Ответы7533775349

17 апр, 14:45 213 1175337

>>1175326
Ну, смотри: спасибо, что посмотрел.

Ответы75343

17 апр, 14:54 214 1175343

>>1175337
объясни, не понял

Ответы75347

17 апр, 15:09 215 1175347

>>1175343
Потому что
> указатель на первый
а не на нулевой.

Ответы75420

17 апр, 15:11 216 1175349

>>1175326
Правильный ответ: единицу прибавлять не нужно. Если у тебя указатели равны, то их разница 0, и индекс массива тоже 0, ничего прибавлять не нужно. Если у тебя 1-based массивы, то это другой язык, и тебе в другой тред.

Ответы75420

17 апр, 16:33 217 1175420

>>1175347
>>1175349
извиняюсь, конечно, указатель на нулевой элемент, я так и ответил, но сказали, что не правильно

Ответы75424

17 апр, 16:35 218 1175424

>>1175420
Шли их нахуй. Смело, решительно. Может ты задание не так понял? Может, тебе количество элементов посчитать с первого по второй указатель? Тогда будет как раз +1). Иначе шли нахуй.

18 апр, 16:34 219 1176042

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

Ответы7610276106

18 апр, 17:48 220 1176102

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

Ответы76136

18 апр, 17:50 221 1176106

>>1176042
конечно, в этом и суть полудуплекса
режим рации

Ответы76136

18 апр, 18:23 222 1176136

>>1176102
>>1176106
Так, падажжите. Нам говорили, что при работе с каналом мы обязаны закрыть для себя вход или выход, смотря читаем или пишем. Обратно открыть мы не можем. Так что я как-то не понимаю, как это сделать.

Ответы76172

28 Кб, 628x236
18 апр, 19:13 223 1176170

>>1156306 (OP)
Поясните за hash функции, как их пишут? Методом тыка? Или есть теория?

Ответы76178

18 апр, 19:14 224 1176172

>>1176136
Давай для начала определимся, что такое канал. По-английскиПо-человечески оно как называется?

Ответы76174

18 апр, 19:20 225 1176174

>>1176172
То, которое pipe(fd)

Ответы76184

18 апр, 19:27 226 1176178

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

Ответы76184

18 апр, 19:41 227 1176184

>>1176178
Хэш на пике не имеет никакого отношения к криптографии. Дизайнят руками, смотрят на распределение.

>>1176174
Пайп действительно однонаправленный, но если у тебя parent/child, то тебе нужно просто писать в правильный конец. Закрывать дескрипторы нужно не потому, что иначе не работает, а для того, чтобы read() мог отследить EOF на пайпе (если у тебя открыт write-дескриптор на пайп, read() не вернет 0, даже если на той стороне write-дескриптор закроют).

Ответы7619276193

18 апр, 19:51 228 1176192

>>1176184
И как тогда мне, спрашивается, "Самостоятельно, используя для синхронизации процессов семафоры, организовать двустороннюю
поочередную (полудуплексную) связь процесса-родителя и процесса-ребенка через канал"? В задании-то канал один. Сделаю через два пайпа, хз.

Ответы7619376225

18 апр, 19:52 229 1176193

>>1176184
>>1176192
Алсо, есть идея послать EOF и тем самым схитрить, но быстрый поиск не помог.

18 апр, 20:27 230 1176225

>>1176192
У тебя два процесса, один пайп. У каждого процесса есть два хэндла - на чтение и на запись. Родитель такой семафором помахал, записал, а потомок читает. Потом потомок помашет, запишет, а родитель прочитает. Получается полудуплекс, ну. Оба могут писать в канал, но в конкретный момент времени - только один. Рации всмомни: - У нас тут какая-то хуйня, приём. - И у нас тоже, приём. - Да ебись оно все конем, конец связи. - вот это тебе и нужно реализовать.

Ответы76232

18 апр, 20:30 231 1176232

>>1176225
Так вон выше говорят, мол, нельзя, read зависнет. В общем-то о таком и думал, но все упиралось в то, что во всех примерах одна сторона пайпа в родителе/потомке таки закрывалась.

Ответы76236

18 апр, 20:37 232 1176236

>>1176232
Это я писал. read() зависнет, если ты будешь в цикле читать. Не читай в цикле - смотри через ioctl(..., FIONREAD...), сколько есть и читай. Прояви фантазию, в общем - там вариантов дохуя.

Ответы76243

18 апр, 20:47 233 1176243

>>1176236
Мы такой хуйни не проходили. Ладно, буду побайтово читать, ожидая встретить нуль-терминатор. Попробую, по крайней мере.

19 апр, 15:03 234 1176675

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

Ответы76703767167672576826

19 апр, 15:30 235 1176703

>>1176675
ОС, компиляторы и прочие движки БД.

19 апр, 15:47 236 1176716

>>1176675
Advanced Programming in UNIX environment
Programming Applications for Microsoft Windows
Читай документацию по нужной ОС, читай чужие исходники.

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

19 апр, 16:02 237 1176725

>>1176675
Железо программировать. Хотя это немного узкая область, не каждому интересно это

19 апр, 18:38 238 1176826

>>1176675
Модуль для питона напиши.

19 апр, 20:47 239 1176888

Анон, решаю тут K&R из шапки и застрял на задании 1-18: https://pastebin.com/A7cJtdG1 (там задание тоже написано). Вроде как код написал, в голове всё сходится, но бля, оутпут просто пиздец. Символы, которые я пропускаю, а именно множественные табы и пробелы, заменяются на какую-то хуйню полную. Типа знаки вопроса или что-то на уровне, хотя по сути, я их просто бля пропускаю и всё, забываю на всегда. Познавшие аналы си, подскажите, что не так?

Ответы7692676932

19 апр, 21:20 240 1176926

>>1176888
Точно хочешь узнать, что не так в твоей реализации (сейчас не могу), или тебе просто задачу решить. Может, перепишешь? Алгоритм простой: ты читаешь всю строку, сколько ее ни есть, но если прочитанный символ - не таб и не пробел, ты запоминаешь его индекс в переменную. Перед выходом просто пишешь по индекс+1 символ '\0'. Четыре строки на тело getline. Если возвращенная getline строка пустая (по нулевой позиции \0), ты ее пропускаешь.

sage 19 апр, 21:24 241 1176932

>>1176888
Хотя, если что, одна из твоих проблем в том, что i ты инкрементишь каждую итерацию, а в массив по i пишешь не всегда. Судя по высказыванию "оутпут просто пиздец", у тебя в незаписанных элементах массива куски предыдущих строк и прочий мусор.

Ответы76937

19 апр, 21:33 242 1176937

>>1176932
Лол.
Спасибо. Действительно в этом и было дело

20 апр, 17:02 243 1177300

https://pastebin.com/5FCsNe3T
Котаны, почему в файл попадает мусор вместо настоящего содержания конца текста?

Ответы773277745078487

21 Кб, 812x716
20 апр, 17:45 244 1177325

Где я объебался и где мой полудуплекс-то?
https://pastebin.com/ABTiR204

Ответы77362

83 Кб, 1051x657
20 апр, 17:53 245 1177327

>>1177300
не попадает
но это на другой платформе и с учетом правки параметров вызова calloc

Ответы77332

20 апр, 18:04 246 1177332

>>1177327
>с учетом правки параметров вызова calloc
Ошибка появилась из-за смены malloc/calloc.

Спасибо, попробую дома на линупше с гцц запустить.

20 апр, 19:25 247 1177362

>>1177325
Ты бы для наглядности msg высылал, а не всегда [0].
Вывод ни о чём.

Ответы77363

20 апр, 19:26 248 1177363

>>1177362
Я хотел высылать msg, но у меня происходит segfault. Что странно.

Ответы7737777382

20 апр, 20:04 249 1177377

>>1177363
Ну, семафор 0 довольно прозрачный. Но вот с первым дела, конечно...
Допустим, родитель первый захватил. Значение семафора 1 равно 1: данных в канале нет, hd=0. Потом сделал семафор 1 нулевым. Освободил нулевой семафор...
Пошёл дочерний. Семафор 1 нулевой => данные есть. hd=1 => Дописали единицу к семафору 1. А это признак отсутствия данных для родителя, да? Родитель ничего не читает, а лишь уменьшает семафор на 1, делает его нулевым для нас, а мы снова ему срём и увеличиваем, а он ничего не читает и для нашего чтения уменьшает
Можно поменять в после родителя и дочку.
Я правильно понял?

Ответы7738177387

20 апр, 20:12 250 1177381

>>1177377
Да, в семафоре 1 единица - признак отсутствия данных. Родитель смотрит на него, если в семафоре не ноль - не пытается читать, а сам пишет и ставит ноль. Если же данные были, то он пишет и семафор не трогает. Если данные были, но все свое уже выслано - увеличивает семафор давая понять, что ничего не высылал.

Ответы77386

20 апр, 20:13 251 1177382

>>1177363
Я хз, что если инициализировать нулём semval в main(), а потом просто читать с sem_op=-1, а писать с sem_op=1.
Так же прозрачнее будет, ИМО.
Вообще, с этой hd как-то некрасиво.

20 апр, 20:15 252 1177386

>>1177381
Так у тебя после второго цикла родителя/потомка получается, что выставляется значение семафора "читать нельзя", а при этом пишутся данные.
Зачем?

Ответы77387

20 апр, 20:18 253 1177387

>>1177377
>>1177386
Так он не добавляет 1 к семафору же. S < 5 (выслано меньше пяти сообщений), а if(hd) засунуто в else к первому условию.

Ответы77494

20 апр, 22:23 254 1177450

>>1177300
Потому что нужно выделять на байт больше и дописывать \0 в конец. А вот calloc() там в хуй не уперся, все равно fread() все затрет.

Ответы77520

20 апр, 23:37 255 1177494

>>1177387
А может быть так, что родитель ни разу не даёт потомку ресурс, а потом в конце if(hd) и ставит семафор 1 в единицу, а потомок потом получает ресурсы, но уже не читает?
Я понимаю, что ты несколько раз прокрутил, но всё же...

Ответы77644

21 апр, 00:28 256 1177520

>>1177450
Это первое, что я нагуглил и проверил (выделил calloc'ом size+1 элемент), не сработало.

Вообще, что делают нормальные люди, если требуется распарсить несколько тысяч файлов на С, имеющих довольно разнообразную структуру (файл содержит список переменных, которые могут идти в любом порядке, и строки-комментарии, начинающиеся с символа "#")? Писать парсер с нуля довольно утомительно.

Ответы77531

21 апр, 00:32 257 1177531

>>1177520
> не сработало
-Wall скажи, и тебе компилятор объяснит, кто ты.

> что делают нормальные люди, если требуется распарсить
Берут flex или его отродья. Хотя такое и вручную несложно написать.

19 Кб, 812x716
21 апр, 11:09 258 1177644

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

14 Кб, 626x503
21 апр, 11:40 259 1177651

>>1156306 (OP)
У вас ссылка не рабочая.

Ответы77879

23 Кб, 812x716
21 апр, 13:18 260 1177698

В общем, спасибо всем за помощь, таки синхронизировал. Пришлось сделать три семафора, и жопой чую, что можно было проще. Если кто подскажет, как это упростить - буду благодарен.
https://pastebin.com/grPm2q6A

Ответы777697779777846

21 апр, 16:21 261 1177769

>>1177698
Гораздо проще это с помощью select делать.

21 апр, 16:46 262 1177797

>>1177698
Вообще, у тебя основная сложность из-за того, что ты долбишься с тем, что у тебя +-1+1-1+-+-1 везде. Абсолютные бы значения, а не смещения.
semctl умеет в SETVAL и GETVAL, ты можешь
помирить родителя и потомка на том, что если один записал, то значение P, если другой записал, то значение C, в противном случае ноль.
А от 0 до SETVMX можно организовать битовые масочки на "родитель может читать",
"родитель может писать", "потомок может читать", "потомок может писать".
Но это всё очень абстрактно, сам так не делал.

21 апр, 18:23 263 1177846

>>1177698
Еее, многопоточность.

Ответы77857

21 апр, 19:07 264 1177857

>>1177846
Многопроцессность , что в Линухе довольно схоже

# OP 21 апр, 20:16 265 1177879

>>1177651
Спасибо.

22 апр, 01:36 266 1178078

аноны помогите нуфагу разобраться в коде пжалста, (https://pastebin.com/t27m9qKh)

что за конструкция по шагам:
1)BYTE b = (BYTE)&k;
2)if(++j==16&&i<398){

Ответы78102

22 апр, 02:32 267 1178102

>>1178078
> BYTE b = (BYTE)&k;
Берется указатель на переменную, которая лежит в области данных.

> if(++j==16&&i<398){
Распечатывается хексдамп начиная с переменной выше. Зачем в условии вторая часть, я хуй знаю, а первая часть нужна, чтобы втыкать конец строки и (неправильно) печатать адрес после каждых 16 байтов.

23 апр, 23:18 268 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);
}

Ответы78524

23 апр, 23:31 269 1178500

Посоветуйте техник парсинга файлов.
На-до-е-ло.
> просрал символ
> просрал разделитель
> EOF появился неожиданно
> недозаполнил и мне норм
> исправил пункты 1-4, но функция парсинга использует 100500 флагов состояния и занимает треть программы

Ответы78505785247855178568

23 апр, 23:33 270 1178505

>>1178500
Имею в виду литературу, где это есть, статейки занятные, в которых предлагают перейти на perl

sage 24 апр, 00:07 271 1178524

>>1178487
Обсуждали выше. Размер файла 10, выделили 10 байт памяти, записали 10 байт, но это не сделало эти 10 байт строкой, которую можно вывести через printf, потому что \0 никто не дописал. Выводим это говно, получаем все что угодно - от мусора до сегфолта. На самом деле, можно printf("%.*s\n", size, conf_text);

>>1178500
Уже советовали flex.

Ответы78952

24 апр, 00:41 272 1178551

>>1178500
>Посоветуйте техник парсинга файлов.
recursive descendant

24 апр, 01:57 273 1178568

>>1178500
>парсинга файлов
коких файлов? со смайликами или бинарными залупами?

Ответы78621

24 апр, 07:29 274 1178621

>>1178568
Строки ASCII-символов.

Ответы78789

24 апр, 14:24 275 1178789

>>1178621
Разделяй их на пробелах.

24 апр, 18:51 276 1178952

>>1178524
Кажется вы там замороченой хуйни насоветовали. Можно же вывести printf("%s\0", buf);

Ответы7912779146

24 апр, 23:15 277 1179127

>>1178952
Строка -- это массив char@, заканчивающийся нулем.
printf("%s\0", buf) говорит: выведи мне строчку buf, потом добавь "\0".
Принтф начинает писать buf. Пишет, пишет, пишет, далее варианты:
1. Залезает в запрещенную область.
2. Упирается в случайно найденном в мусоре 0.
В первом случае шлет нахуй, во втором кроме сроки выводит всякое говно.

Ответы79132

24 апр, 23:22 278 1179132

>>1179127
Уговорил чёрт языкатый.
sprintf(buf1, "/%%ds\0", size);
printf(buf1, buf);

Ответы7913379146

24 апр, 23:22 279 1179133

>>1179132
фиксить не буду, нутыпонел.

sage 24 апр, 23:50 280 1179146

>>1178952
>>1179132
Лолшто?

На самом деле достаточно fwrite(..., stdout), но мы говорили о строках.

25 апр, 13:46 281 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?

Ответы79535795407954779552

25 апр, 18:49 282 1179535

>>1179357
Я чот не понял, как ты 9 бит используешь в одном байте?

Ответы79539

25 апр, 18:55 283 1179539

>>1179535
> uint16_t
Действительно
Я та мтроеточие ставил, что 7 оставшихся не писать.
Забейте, чуда не случилось, я обосрался в другом месте.

Ответы79543

25 апр, 18:55 284 1179540

>>1179357
Запусти дебаг и отследи все, можешь промежуточных переменных добавить.
И не еби мозги.

25 апр, 18:59 285 1179543

>>1179539
Да ты по всем фронтам обосрался. Тебе нужно работать с отдельными байтами по 8 бит, использовать можно тип short. Так то по теме проверки бит на чёткость уже кучи материала, но блядь, это же не строка чтоб сразу сравнивать все 9 из 128 бит.

Ответы7954479545

25 апр, 19:01 286 1179544

>>1179543
Падажи, uint16_t это 16-битный.

Ответы79550

25 апр, 19:02 287 1179545

>>1179543
И short на наших современных x86_64 чаще всего int16_t, не? А то и больше.

Ответы79551

sage 25 апр, 19:07 288 1179547

>>1179357
Все должно работать. Разве что твоя нумерация битов с единицы сбивает с толку, но она у тебя консистентная, поэтому не приводит к проблемам.

25 апр, 19:10 289 1179550

>>1179544
Пардон, попутал.

25 апр, 19:11 290 1179551

>>1179545
Мне кажется что int16_t это нечто другое. Впрочем не вижу смысла использовать именно его. Почему бы не копнуть в сторону bit field?

Ответы79552

sage 25 апр, 19:16 291 1179552

>>1179551
> Впрочем не вижу смысла использовать именно его.
Например, есть ограничения по памяти. А так бы я тоже предложил unsigned int или хотя бы что-то типа uint_fast16_t.
> Почему бы не копнуть в сторону bit field
Внутри одной программы вполне норм, хотя и сводится к асболютно тому же коду, что и проверка побитовыми операциями. Плюс установка двух-трех флагов за раз вручную может оказаться дешевле битфилдов. Но битфилды непереносимы, т.е., если у >>1179357 сетевые пакеты, то ему все равно придется доставать флаги из битфилдов и паковать в инты для передачи по сети.

Ответы79554

25 апр, 19:19 292 1179554

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

Ответы79555

sage 25 апр, 19:20 293 1179555

>>1179554
> Битфилды сформированные из инта будут интом
Вот только порядок и выравнивание будут отличаться от компилятора к компилятору.

Ответы79556

25 апр, 19:22 294 1179556

>>1179555
Нахуя это учитывать?

Ответы79562

sage 25 апр, 19:28 295 1179562

>>1179556
Ну что ж ты тупишь? Ты написал свой Телеграм, Вася скомпилировал его вижуал студией под x86, а Петя - gcc под Байкал. У Васи первый флаг располагается в младших битах, а у Пети в старших, и вы не можете даже поговорить об этом, потому что из-за этих различий вы по сути пользуетесь разным протоколом.

Ответы79563

25 апр, 19:29 296 1179563

>>1179562
Так это же нормально иметь под байкал отдельную версию ПО или не? Насколько я знаю архитектура почти гарантия совместимости и правильного межпроцессорного взаимподействия.

Ответы79564

sage 25 апр, 19:32 297 1179564

>>1179563
> отдельную версию ПО
Ну да, давай велосипеды по двадцать раз переписывать, вместо того чтобы просто сделать flags & SOME_BIT.

Ответы79566

25 апр, 19:35 298 1179566

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

Ответы79570

sage 25 апр, 19:42 299 1179570

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

Ответы79572

25 апр, 19:45 300 1179572

>>1179570
Ебать ты пряник. Он сделан чтоб ассемблер упростить, а не наоборот.

25 апр, 19:46 301 1179575

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

Ответы7957979586

25 апр, 19:47 302 1179579

>>1179575
Моца цопе!

sage 25 апр, 19:53 303 1179586

>>1179575
> переносимость
Лол. Вырастешь большой - поймешь, что Си - один из самых плохо переносимых языков. В то время как код на каком-нибудь Python заработает на новой машинке без модификаций, в Си тебе придется обмазать его толстым слоем ифдефов, и он все равно где-нибудь упадет.

> Весь C пропитан унификацией
C пропитан неопределенным поведением, ты перепутал. Тту даже принюхиваться не нужно.

Ответы7958879593

25 апр, 19:55 304 1179588

>>1179586
тут-туру

Ответы79592

25 апр, 19:56 305 1179589

Аноны, не по теме конечно, но есть у меня код просто нереально простого чатобота на js, куда бы его разместить? Могу на си портком сделать.

sage 25 апр, 19:57 306 1179592

>>1179588
Именно. Запускаешь такой свой хелловорлд на DSP с CHAR_BIT=16, и видишь, как твои бананы медленно превращаются в желе.

Ответы79596

25 апр, 19:59 307 1179593

>>1179586
>каком-нибудь Python заработает на новой машинке без модификаций
Сляжет от версии Питуна, истину глаголю.

Ответы79595

sage 25 апр, 20:01 308 1179595

>>1179593
Есть лишь один истинный питон, и он третий. Поставишь оба.

25 апр, 20:04 309 1179596

>>1179592
А ты я смотрю умный. Скажи, вот я хотел вебкамеру подключить например к своему хловоролду, но не вкурю, что куда прописывать?
Это целый будапешт. Я видел как чувак трёхмерные движки пилит за пол часа, а сам как бы и простейшего не умею, гугл представляет собой лютый пиздец из мешанины hwnd, которые мало того что хуй знает как использовать, так ещё и не найти описания более подробного чем - "это int32, содержит номер окна", это же пиздец. Нет ли бибилиотеки реализующей всю это пвсеводнизкоуровневую хуету искаропки, чтоб вызвал функцию takeFrame(WRBCAM_0, buf, 32, 32); и получаешь заветный кадр в виде массива байт, или это утопия?

Ответы79611796127961479646

25 апр, 20:22 310 1179611

>>1179596
>Я видел как чувак трёхмерные движки пилит за пол часа
Можно ссылку?

Ответы79613

25 апр, 20:23 311 1179612

>>1179596
OpenCV, Qt и прочее

Ответы79615

25 апр, 20:23 312 1179613

>>1179611
Это не на ютубе дебич, а настоящий человек.

sage 25 апр, 20:23 313 1179614

>>1179596
> Нет ли бибилиотеки реализующей всю это пвсеводнизкоуровневую хуету искаропки
Вообще, сейчас модно брать OpenCV и не думать. А так, в винде с камерами вообще плохо, нужен COM, и дальше есть всякие-разные варианты ебли со всякими DirectShow или WIA. Но есть старый, "неподдерживаемый", но тем не менее рабочий и простой метод: https://msdn.microsoft.com/en-us/library/dd757677(v=vs.85).aspx Там буквально несколько строк:
создаешь окно capCreateCaptureWindow, шлешь ему WM_CAP_DRIVER_CONNECT, WM_CAP_FILE_SAVEDIB, WM_CAP_DRIVER_DISCONNECT и потом ебешь полученную .bmp как тебе угодно. Можно обойтись без .bmp, там можно установить колбеки на фрейм и т. д.

> "это int32, содержит номер окна"
Но это действительно номер окна, и это не обязательно int32, это struct HWND *, и тебя не должно ебать, что там внутри. Это вполне нормальный сишный интерфейс, когда либа работает с указателем на incomplete-структуру, и сама она может обращаться к ее полям, а юзер видит только непрозрачный указатель (хэндл).

Ответы79623

25 апр, 20:23 314 1179615

>>1179612
Даже жопнцв пока прикрутишь..

Ответы79619

25 апр, 20:26 315 1179619

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

Ответы7962279623

25 апр, 20:27 316 1179622

>>1179619
>йобареколер
рекодер

25 апр, 20:29 317 1179623

>>1179614
>>1179619
Ты не понял моего бугурта. Вот есть структура - про неё много чего написали, но упомянуть что она мне нахуй не нужна, забыли.
А я блядь ебусь и 3 дня читаю гугл как эту структуру заполнять, где брать, куда объявить и т.д., чтобы узнать от онона, что эта хуйня может просто висеть где то там и напрягаться по её поводу моветон.

Ответы796247962979630

25 апр, 20:31 318 1179624

>>1179623
Вот надо тебе окно - получай ебалу с гибкими настройками вместо #include vsyaHuinya.h createwindow("заголовок",x,y,w,h);
И у винды это ещё по божески, GTK это вообще пиздец.

Ответы79626

25 апр, 20:32 319 1179626

>>1179624
Чувство такое что проектировалось это умными, но наглухо отбитыми придурками и не для людей.

Ответы79632

25 апр, 20:34 320 1179629

>>1179623
кокая структура? может это она тебе не нужна. но винапи говно, это да. вне контекста задачи, твой бугурт нищитовый.

sage 25 апр, 20:34 321 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 и все.

Ответы79634

25 апр, 20:36 322 1179632

>>1179626
проблема гтк в том, что они хуярят в ооп стиле на си. шли бы путем тикла.

Ответы79636

25 апр, 20:36 323 1179634

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

Ответы79645

25 апр, 20:37 324 1179636

>>1179632
Есть у меня одно тёплое воспоминание о GTK, это cairo. Вот уж API проще не встречал, всем бы на него равняться.

25 апр, 20:45 325 1179645

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

sage 25 апр, 20:45 326 1179646

>>1179596
https://pastebin.com/kp4EaUgc вот тебе минимальный пример. Он говно по многим причинам, но из этого уже можно что-то слепить и/или перейти на нормальный метод когда-нибудь позднее. Компиляция: gcc file.c -luser32 -lavicap32, в студии аналогично (user32.lib, avicap32.lib).

Ответы79650

25 апр, 20:47 327 1179647

Вот отличный пример. Берём эту инструкцию
https://msdn.microsoft.com/en-us/library/dd757677(v=vs.85).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

Ответы7964979651

25 апр, 20:51 328 1179649

>>1179647
>И сука таки ни единого слова про подключаемые заголовочные файлы
https://msdn.microsoft.com/en-us/library/dd756879(v=vs.85).aspx

наркоман, уходи.

Ответы79655

25 апр, 20:52 329 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:

push0
push_caption
push_message
push0
call[MessageBoxA]

push0
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 апр, 20:52 329 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:

push0
push_caption
push_message
push0
call[MessageBoxA]

push0
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

Показать весь текст

sage 25 апр, 20:54 330 1179651

>>1179647
> И сука таки ни единого слова про подключаемые заголовочные файлы
В MSDN обычно есть about/using/reference. В about тебе рассказывают, что это такое, как оно работает, нахуй оно нужно, и что вообще существует, в using гайд с примерами, а в reference как раз все описания. Обычно оно все очень сильно перелинковано, но как я уже говорил, технология старая, еще из 95 винды, поэтому ссылок мало. Вот тебе референс про connect:
https://msdn.microsoft.com/en-us/library/dd743891(v=vs.85).aspx

Ответы79653

25 апр, 20:58 331 1179653

>>1179651
>https://msdn.microsoft.com/en-us/library/dd743891(v=vs.85).aspx
Спасибо кончено. Но я наверное просто не создан для всей этой залупы. Мой уровень это purebasic, не более, всё что сложнее просто перегружает мозг.

Ответы79655

sage 25 апр, 21:01 332 1179655

>>1179653
Моя ссылка недостаточно правильная. Вот тут >>1179649 про макрос, он проще для понимания.

27 апр, 23:04 333 1180787

Эх щас бы в 2К19 винапи ковырять...

Ответы8082780843

27 апр, 23:21 334 1180827

>>1180787
Чому ни? Загугли nirsoft, я когда вижу эти охуенные утилиты весом пару десятков килобайт, но с UI и мощным функционалом, аж трясет от восхищения за того программиста, кто это все дело пилит.

sage 27 апр, 23:36 335 1180843

>>1180787
Эх, щас бы в 2K19 дотнетоговно напрямую с ядром работало.

28 апр, 18:56 336 1181147

А в чем разница между char * = "huj" и char[] = "huj";

Ответы81149811758118983346

28 апр, 18:57 337 1181149

>>1181147
Второе работает?

Ответы81154

222 Кб, 1920x1080
28 апр, 19:01 338 1181154

>>1181149

28 апр, 19:24 339 1181175

>>1181147
https://wandbox.org/permlink/Jsv48iUs3doqZInT

28 апр, 19:38 340 1181189

>>1181147
char*: создает указатель, который указывает на литерал, лежащий в секции данных. Ты можешь изменять сам указатель, но не можешь писать по указателю - строковые литералы ридонли.
char[] создает массив достаточного размера, чтобы скопировать в него литерал (и копирует его туда). Так как это массив, то ты, конечно же, можешь изменять содержащуюся там строку.

Ответы8136381369

28 апр, 19:53 341 1181196

Чем си может быть лучше плюсов в 2к17?

Ответы8119881205

28 апр, 19:54 342 1181198

>>1181196
Си можно выучить на приемлемом уровне менее чем за 10 лет. При этом ты будешь знать, что происходит в коде, а не предполагать.

Ответы81200

28 апр, 19:56 343 1181200

>>1181198
А где его сейчас используют? (Кроме GNOME(Слава XFCE)

Ответы81201

28 апр, 19:58 344 1181201

>>1181200
ОС, либы, embedded, прикладной софт тоже иногда.

28 апр, 20:07 345 1181205

>>1181196
Жрет меньше ресурсов. Это критично для встраиваемых систем.

Ответы81215

28 апр, 20:15 346 1181215

>>1181205
Плохой аргумент. На крестах все еще можно писать в си-стиле.

Ответы81226

28 апр, 20:31 347 1181226

>>1181215
Ты когда-нибудь программировал микроконтроллеры, где килобайты рам можно по пальцам пересчитать?

Ответы81234

28 апр, 20:50 348 1181234

>>1181226
Конечно. Ты понимаешь, что g++ и gcc выдадут тебе идентичный код, если ты не будешь использовать в крестах многие крестовые фичи? При этом ты можешь, продолжать пользоваться теми фичами, которые на код напрямую не влияют, а жизнь проще делают.

Ответы81238

28 апр, 20:59 349 1181238

>>1181234
Ну хз, у нас все на си ваяют. Возможно потому, что проще потом лицензировать (авионика), а не из-за возможностей языка.

Ответы81239

28 апр, 21:02 350 1181239

>>1181238
Так я об этом как раз и сказал выше - стандарт в разы меньше, вариантов хитровыебанного поведения меньше, осилить проще и проверить проще.

Ответы81365

29 апр, 02:50 351 1181363

>>1181189
Стоит дополнить, что в первом случае можно изменять сам указатель, а во втором имя массива является константой.

Ответы81366

29 апр, 03:34 352 1181365

>>1181239
>стандарт в разы меньше
Как будто ты его хоть раз открывал

29 апр, 03:35 353 1181366

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

Ответы81603

29 апр, 03:44 354 1181369

>>1181189
> строковые литералы ридонли
Не нашёл такого в 6.4.5 String literals
Где это написано?

Ответы81603

29 апр, 11:41 355 1181428

Посоветуйте справочник для winapi.

Ответы8142981603

29 апр, 11:42 356 1181429

>>1181428
Советуем справочник для winapi.

Ответы8143081431

29 апр, 11:43 357 1181430

>>1181429
Он мне не нравится.

29 апр, 11:44 358 1181431

>>1181429
Cпасибо!

29 апр, 12:31 359 1181443

Как врубить поддержку кириллицы в спермянской консоле? Использую GCC.

Ответы8160381604816098162981651

29 апр, 16:12 360 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 может.

Ответы81874

29 апр, 16:13 361 1181604

>>1181443
В нотепаде++ пишешь исходник в CP866

Ответы81605

sage 29 апр, 16:15 362 1181605

>>1181604
Бу! Сгинь!

Ответы81766

29 апр, 16:19 363 1181608

[CODE]#include <stdio.h>

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

return 0;
}[/CODE]
Почему распечатывает ffffffd0? Почему бы не 000000d0?

Ответы8161081612

29 апр, 16:27 364 1181609

>>1181443
chcp 1251 - кодировка Windows
chcp 65001 - кодировка UTF-8
Иногда требуется выбрать для консоли другой шрифт.

Ответы81610

29 апр, 16:29 365 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
И тут все виндусы кроме свежих билдов десяточки скажут "ой" при попытке вывести кириллицу.

Ответы81626

29 апр, 16:37 366 1181612

>>1181608
Потому что char - это знаковый тип, где русские буквы это отрицательные числа.
Используй unsigned char b[] = "БB";
Или так: printf("%x\n", b[0] & 0x00FF);

29 апр, 16:54 367 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 выводит "АБВ".

Ответы81738

29 апр, 16:55 368 1181629

>>1181443
Кури про wchar и wprintf, нехуй ебаться с кодировками (методы советуемые на форумах работают от раза к разу) правда setlocale все равно надо использовать зато без ебли с настройкой консоли. Либо, если лень писать L перед каждой строкой, то в венде можно пользоваться нестандартной библиотекой tchar.h ну это уже сам кури.

Ответы81637

29 апр, 17:02 369 1181637

>>1181629
>L перед каждой строкой
Не советую, в одной проге из-за этого долго пришлось править несовместимость (GCC в Linux использовал 4-байтовые символы Unicode, Visual C++ в винде - 2-байтовые). Нужно применять UTF-8 везде.

29 апр, 17:25 370 1181651

>>1181443
>врубить поддержку кириллицы в спермянской консоле
но зачем?

168x68
29 апр, 20:01 371 1181738

>>1181626
А у меня выводит:
> АБВ
> В
А вместо "Привет, мир!" выводится, например, пикрелейтед. И это тоже 7 со шрифтом Lucida Console. А стабильно оно только с десяточки работает.

Ответы81812

29 апр, 20:50 372 1181766

>>1181605
Зато работает

Ответы81799

29 апр, 22:19 373 1181799

>>1181766
-fexec-charset работает совершенно таким же образом, только не вынуждает хранить исходники в древней кодировке, создавая проблемы с IDE и системами контроля версий.

29 апр, 22:44 374 1181812

>>1181738
Первый раз такое вижу. Обычно либо выводит русские буквы, либо квадратики.
И с chcp 1251 такое же?
У тебя какая-то сборка от васяна.

Ответы81818

29 апр, 22:55 375 1181818

>>1181812
C chcp 1251 ок или крякозябры, в зависимости от кодировки выводимых байтиков. Винда - чистая тестовая виртуалка. Более того, с chcp 65001 и WriteFile, к которому сводится твой printf, и WriteConsoleA иногда (а на XP - всегда) фэйлятся и не выводят вообще ничего, поэтому приходится идти длинным (зато надежным) путем. Делается кастомный yoba_printf, который с помощью MultiByteToWideChar преобразует UTF-8 в UTF-16, который уже выводит с помощью WriteConsoleW, и вот с UTF-16 проблем никаких нет, вне зависимости от кодировки, выставленной chcp.

Ответы81824

29 апр, 23:07 376 1181824

>>1181818
>Винда - чистая тестовая виртуалка.
А, тогда ясно. Нужно ставить Microsoft Visual C++ redistributable package.
На древней msvcrt.dll могут быть любые аномалии. Она родом с XP, где UTF-8 нормально не поддерживался.
В десятке видимо обновили.

Ответы8183181834

29 апр, 23:19 377 1181831

>>1181824
А CRT-то каким местом? Тут же нет разбора строки - %s просто копирует символы в stdout пока не встретит \0, а stdout сводится к _write, а _write к WriteFile. Вот если бы я toupper делал или strtok какой-нибудь, или хотя бы %.2s, тогда да, CRT могла бы что-нибудь испортить.

Но ты меня заинтересовал, попробую отладить когда-нибудь и посмотреть, почему такое поведение. Ты чем собирал? Студией?

sage 29 апр, 23:21 378 1181834

>>1181824
И да, msvcrt - дефолтный рантайм Visual C++ 98, оно же VS6.0. Ее, конечно, обновляли, но родом она еще из маздая.

30 апр, 01:35 379 1181874

>>1181603
> Он имел в виду, что можно ptr++, но нельзя array++, т.е., массив можно рассматривать как константный указатель на его первый элемент.

:facepalm:

>> Где это написано?
>Именно там и написано.
Да, чёт проглядел.

30 апр, 15:11 380 1182052

>>1174146
Почти.

30 апр, 15:28 381 1182057

Дайте идею для проекта небольшого на си.

Ответы82058

30 апр, 15:31 382 1182058

>>1182057
Рыбья головёха?

30 апр, 15:35 383 1182059

>>1156306 (OP)
Есть кто с мгу? Слейте лабы по с/с++ с меня как обычно

Ответы82067

30 апр, 15:47 384 1182067

>>1182059
Рыбья голова)

30 апр, 16:17 385 1182079

Посоны, а что, шланг до сих пор не обзавёлся своим crt? Почто он гццшные crtbegin.o и libgcc требует?

Ответы82175

30 апр, 19:20 386 1182173

Антоны. Я сделал прогу на winapi, которая должна была менять курсор на рожу моего бати, чтобы его выбесить. Но курсор вовсе пропал и не появляется даже после перезагрузки. Что не так, пиздец.

Ответы8217482175

30 апр, 19:26 387 1182174

>>1182173
Ты приёмный.

Ответы82271

sage 30 апр, 19:26 388 1182175

>>1182079
Не обзавелся, не вижу в этом ничего плохого.

>>1182173
Так сходи в панель управления и выставь стандартный, чего ты от нас-то хочешь?

Ответы82268

30 апр, 21:16 389 1182268

>>1182175
>управления
Не работает даже так.

30 апр, 21:19 390 1182271

>>1182174
Поржал всем офисом)

30 апр, 21:48 391 1182291

Есть еще те кто использует #pragma pack?

Ответы82323

30 апр, 22:00 392 1182305

Антоны, если я объявлю в структуре подряд несколько переменных, то они будут распологаться подряд, а если я объявлю их просто внутри функции main(), то их может раскидать по памяти?

Ответы82323

30 апр, 22:22 393 1182323

>>1182291
Да. Упакованные структуры иначе не опишешь.

>>1182305
Да, переменные компилятор может раскидать (в пределах кадра стека, ествественно, если они автоматические), сдублировать, положить в регистры или вовсе удалить.

30 апр, 22:31 394 1182329

Зачем нужны битовые поля?

Ответы82332

30 апр, 22:33 395 1182332

>>1182329
Некоторые люди не могут в побитовые операции, битовые поля проще, удобнее и иногда даже быстрее.

30 апр, 23:21 396 1182347

Мне нравится Windows API.

30 апр, 23:24 397 1182348

Мне нравится JavaScript.

30 апр, 23:28 398 1182349

Я ем говно.

1 мая, 21:24 399 1182768

Сап, двач.

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

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

Есть такая функция в стандартной библиотеке и как называется? А то может я и ищу то, чего нет.

Ответы82779827928279582840

1 мая, 21:59 400 1182779

>>1182768
вроде нет, поскольку я велосипедил подобное сам, но там легко и реализаций миллиард
https://github.com/JeffBezanson/cutef8/blob/master/utf8.c

Ответы82785

1 мая, 22:05 401 1182785

>>1182779
Знаю, что легко, но хотел найти какой-то общий стандарт, чтобы не пилить велосипеды. Если нет, то напишу сам.

1 мая, 22:23 402 1182792

>>1182768
А чем переводишь? wctomb говорит, сколько символов нужно - просто просуммируй результаты. Но велосипед будет быстрее.

Ответы82803

sage 1 мая, 22:28 403 1182795

>>1182768
Алсо, я бы на твоем месте не выделывался. Длиннее 4 байтов один code-point не занимает. Если у тебя суррогатные пары уже лежат в одном 32-битном wchar_t, тогда два раза по 4 байта на символ максимум. Выделяй сразу столько, точно влезет, и не нужно будет заниматься бесполезными подсчетами.

Ответы82803

1 мая, 22:45 404 1182803

>>1182792
wctomb, вроде бы, каждый символ отдельно передавать нужно. Я пробовал wcstombs, но он мне постоянно -1 на выход даёт, если в строке есть кириллический символ. Почему так, я разобраться не смог.

>>1182795
Тоже вариант. Если нет стандартной функции, то либо так сделаю, либо велосипед накидаю.

Ответы82840

1 мая, 23:33 405 1182840

>>1182768
>>1182803
Решил проблему.

Работу wcstombs я проверял в отдельном файле и забыл вызвать setlocale, поэтому он выкидывал -1 мне. При setlocale (LC_ALL, "") вызов функции wcstombs (NULL, str, 0) возвращает нужное количество байтов для строки в utf-8.

2 мая, 13:23 406 1183093

выручай ссач, пишу я такой прогу на си, ну и вызываю функцию sqrt() с аргументом. Начинаю конпелить, а конпелер ругается мол undefined reference to `sqrt'. Дело в том что при передаче в качестве аргумента обычного числа все нормально конпелится и возвращает квадратный корень, то что нужно. однако если в кчестве аргумента передается имя переменной или элемент массива конпелер выводит undefined reference to `sqrt'. выручайте я дно. Кстати ос ubuntu

Ответы830958309683105

2 мая, 13:24 407 1183095

>>1183093
Наркомания
Проверь наличие <math.h>

Ответы83101

2 мая, 13:26 408 1183096

>>1183093
Алсо, тебе эту ошибку, случаем, не линкёр выводит?
Сделай -lmath

Ответы83108

2 мая, 13:31 409 1183101

>>1183095
math.h имеется

2 мая, 13:36 410 1183105

>>1183093
-lm
довун

101 Кб, 1280x1024
2 мая, 13:36 411 1183106

#include<stdio.h>
#include<math.h>
main(){
float b=4;
float a=sqrt(b);
printf("%.1f",a);
}

Ответы83107

2 мая, 13:37 412 1183107

>>1183106
gcc -lm
довун

Ответы83110

2 мая, 13:38 413 1183108

>>1183096
> -lmath
-lm
довун

96 Кб, 1280x1024
2 мая, 13:39 414 1183110

>>1183107
и шо бэлэтб

Ответы83111831128311384167

2 мая, 13:39 415 1183111

>>1183110
Обосрался

2 мая, 13:39 416 1183112

>>1183110
Ди в ньюфаг-тред
довун

Ответы83114

2 мая, 13:40 417 1183113

>>1183110
gcc -lm c.c

2 мая, 13:40 418 1183114

>>1183112
заебал скажи че сделать чтоб робило

102 Кб, 1280x1024
2 мая, 13:42 419 1183116

все равно

Ответы83117

2 мая, 13:42 420 1183117

>>1183116
gcc c.c -lm

Ответы83118

2 мая, 13:43 421 1183118

>>1183117
бля отдуши чувак. объясни плиз нахуя это нужно было прост в винде такого я не добавлял

Ответы8315283299

sage 2 мая, 15:45 422 1183152

>>1183118
В винде вся математика в CRT, в той же либе, что и printf и т. д., и она прилинковывается автоматически, по умолчанию. В линуксах отдельно, у них принято делать жизнь максимально неудобной.

Ответы83156

2 мая, 15:53 423 1183156

>>1183152
> В винде вся математика в CRT, в той же либе, что и printf и т. д.

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

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

Линкуешь только то что нужно. Принцип разделяй и властвуй на шицо, но спермачи кукарекают что-то про неудобство.

Ответы831598316183219

2 мая, 15:57 424 1183159

>>1183156
50мб хэлоуворд, кек.

Ответы831618316483219

sage 2 мая, 15:59 425 1183161

>>1183156>>1183159
У тебя по умолчанию динамическая линковка. Можешь все библиотеки мира подключить, это мало повлияет на размер получившегося файла.

Ответы83172

2 мая, 16:01 426 1183164

>>1183159
В сперме хелловорлд 50 метров? Лол. Ибо у меня в дебиане меньше 4Кб. Целый кластер потратил для теста, ёк макарёк.

2 мая, 16:14 427 1183172

>>1183161
>все библиотеки мира подключить
И соснуть с переносимостью. Статическая линковка рулит.

Ответы83174

2 мая, 16:15 428 1183174

>>1183172
Ну и вали в свою эпоху a.out

Ответы83175

2 мая, 16:16 429 1183175

>>1183174
Валю, я даже Qt статически линкую

sage 2 мая, 18:13 430 1183219

>>1183159
Хелловорлд в винде 8к, если динамическая линковка. Или меньше 200к, если статическая.

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

Ответы8323583265

2 мая, 18:54 431 1183235

>>1183219
> от либ откажемся, будем линковать printf.o и malloc.o каждый отдельно.

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

Ответы83380

2 мая, 19:55 432 1183265

>>1183219
>Или меньше 200к, если статическая.
Рантайм не забудь скачать и установить

Ответы83738

2 мая, 21:04 433 1183299

>>1183118
>объясни плиз нахуя это нужно было прост в винде такого я не добавлял
"так сложилось исторически"

2 мая, 22:33 434 1183344

Может ли Rust заменить Сишку? Избавляет от кучи проблем с памятью, соответственно багов и дыр в безопасности меньше

2 мая, 22:36 435 1183346

>>1181147
Разница чисто визуальная.

Ответы83530

2 мая, 23:25 436 1183380

>>1183235
Нашёл чем гордиться. Шо то хуйня, шо это хуйня. Надо иметь статические бибилиотеки на каждую функцию и линковать автоматически, ато развели ебалу.
"кококо хочу подключаю хочу неподключаю" - Ты же и так знаешь что подключить придётся, по тому что ты функцию используешь в коде, а не по тому что у тебя гибкая система настроек и свобода действий.

3 мая, 08:52 437 1183530

>>1183346
В ньюфаг-тред шагом марш!

3 мая, 08:56 438 1183531

можно вместо
gcc c.c -lm
пейсать
gcc -O2 c.c
Тогда sqrt вместо вызова функции будет реализован инструкциями копро-цессора, на месте.
-O1, -Os и -O3 тоже подойдут.

Ответы83532

3 мая, 08:57 439 1183532

>>1183531
Но это не гарантировано. Так что лучше -lm

3 мая, 12:27 440 1183603

Почему вы до сих пор не перекатились в энтерпрайз на какой-нибудь джаве? Неужели вам так нравится железо, что готовы получать в 2 раза меньше, при чём прикладывая больше усилий? Я бы так не смог

Ответы84172

sage 3 мая, 16:36 441 1183738

>>1183265
Да я лучше в дворники пойду, чем в интерпрайзы на джавах.

4 мая, 13:45 442 1184167

>>1183110
Убунтодебил, уходи.

4 мая, 13:57 443 1184172

>>1183603
Я стал php-developer.

5 мая, 20:36 444 1184720

Анончи, напомните как называется версия майкрософтовского конпелятора без ИДЕ?

Ответы84727

5 мая, 20:45 445 1184727

>>1184720
Visual Studio Build Tools, ставится через инсталлер обычной Visual Studio.

Ответы84755

5 мая, 21:07 446 1184755

>>1184727
Вангую, студия мне говна всякого наставит, а я чистое хочу, как 2015 тулс.

Ответы84857

1,1 Мб, 1920x1080
5 мая, 21:25 447 1184778

Господи я отпишусь в этом треде. Си - Бог всех языков. Лично я учил Си по Великой книге K&R. Задает вам навык программирования на всю вашу жизнь. Воистину, язык Богов.

Ответы847938479785071

5 мая, 21:49 448 1184793

>>1184778
Си — ненужное говно без задач.

Ответы84796

5 мая, 21:52 449 1184796

>>1184793
Борщеязычки говно без задач, а на сишке весь мир держится.

5 мая, 21:52 450 1184797

>>1184778
Двачую этого дZенствующего.

5 мая, 23:54 451 1184857

>>1184755
Окей, ставишь билдтулзы с говном на виртуалку, забираешь оттуда PSDK и компиляторы. Профит.

47 Кб, 1502x831
6 мая, 11:36 452 1184987

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

Ответы8505385101

6 мая, 13:27 453 1185053

>>1184987
Давай разберемся, что такое errors.
Errors - это массив указателей на char.
Принтф получает на вход УКАЗАТЕЛЬ НА char, и обрабатывает егоименно так (у тебя там %s же, это важно!). Поставь там %i какой-нибудь и получится число.

Ответы85121

6 мая, 13:51 454 1185071

>>1184778
Ну есть в сишке указатели-хуятели и дальше чё? Как ебля с указателями и освобождением памяти прокачает мой скилл в программировании в общем?
Ну вот я джавист, прочитал недавно K&R и Прату чисто в академических целях. Никак я свой навык не улучшил. Углубился в старину, посмотрел как писали раньше проги и всё.
Ты просто студент без реального опыта работы, который потратил какое-то время на сишку, в отличие от своих друзей, которые дрочили питон какой-нибудь, и возомнил себя ебать гуру.
Решают структуры данных, алгоритмы, архитектура. Твоя сишка нахуй не нужна для навыков. Сишка в современном мире - крайне узкоспециализированный язык. Изучать её нужно либо для конкретной работы, либо полистать пару книжек для экскурса в историю. Всё, больше Си тебе ничего не даёт. Это просто изкоспециализированный инструмент.

Ответы85073

sage 6 мая, 14:00 455 1185073

>>1185071
>я джавист
Дальше не читал. Иди дальше абстрактные фабрики абстрактных билдеров пиши, чмоха.

Ответы85077

6 мая, 14:04 456 1185077

>>1185073
Как же байтослесари триггерятся на джаву)))) Я всё понимаю, потратить на обучение в 3 раза больше времени, и получать в 2-3 раза меньше - конечно это обидно. Остаётся только писать на двачах, что Си - это ебать орудие Богов.

6 мая, 14:53 457 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. Ну и выводит полученные символы, конечно. Поэтому ты видишь текст, а не число.

Ответы8512185132

6 мая, 15:18 458 1185121

>>1185053
>>1185101
А, да, все верно. Перечитал ваши сообщения и понял, какой странный и глупый вопрос я задал, учитывая то, что понимаю, как это работает. Вот к чему недосып приводит. Хотя сам я почему-то минут 40 сидел над рисунком и все никак не мог понять

6 мая, 15:24 459 1185132

>>1185101
>А %s берет свой аргумент arg, считает его указателем, и разыменовывает его...
Вот, теперь точно понял, что именно меня вводило в заблуждение. Я раньше не знал (или не задумывался), что %s разыменовывает указатель. Теперь все точно ясно. Вопрос закрыт. Чуть головой не поехал

6 мая, 15:53 460 1185167

>>1156306 (OP)
https://pastebin.com/tMRF7673
ребят посмотрите код плиз , у меня вопрос , можно ли передать в функцию указатели , так что бы по такому выражению она выделила память ,просто если вставить этот кусок (array = (double@@)malloc(sizeof(double@)@ROW);)в функцию, он отработает , но выдаст ошибку сигментации

Ответы85174

6 мая, 16:12 461 1185174

>>1185167
Не совсем понятно, чего ты хочешь. У тебя в текущем виде программа должна более-менее работать. Хочешь переместить выделение памяти в input_date? Тебе придется тогда как-то вернуть массив. Например, передавать double ∗∗∗array_ptr и после маллока делать ∗array_ptr = array. Или просто возвращать из функции double∗∗, делая return array, а аргумент убрать просто.

Ответы85197

6 мая, 16:54 462 1185197

>>1185174
аааа, понял спасибо , а программа и так хорошо работает

6 мая, 22:36 463 1185424

У меня есть указатель void ∗ptr на массив из структур smth.
У меня есть sizeof(smth).
Как надёжно попасть на i-ый элемент массива?
Я же не могу просто сделать так:
smth_tmp=∗((char ∗) ptr+sizeof(smth))
верно?

Ответы8542685428

6 мая, 22:37 464 1185426

>>1185424
> smth_tmp=∗((char ∗) ptr+i*sizeof(smth))

6 мая, 22:41 465 1185428

>>1185424
> Я же не могу просто сделать
Можешь, только левая звездочка там лишняя. Ты либо:
smth foo = ∗(smth ∗) ((char ∗) ptr + ...);
либо
smth ∗bar = (smth ∗) ((char ∗) ptr + ...);
Но лучше скастить к указателю на smth и прибавить i:
smth foo = ((smth ∗) ptr);
smth ∗bar = (smth ∗) ptr + i;

Ответы8542985433

6 мая, 22:43 466 1185429

>>1185428
Я структуре присваивал, а не указателю, я просто типа не написал. Оттого и левая звздочка, спасибо.

6 мая, 22:47 467 1185433

>>1185428
Алсо, в моём случае функция не будет знать типа, т.е. ей передадут только size_t от sizeof(given_type). Так что способ один для меня применим, в отличие от второго.

7 мая, 19:04 468 1185769

Как передать во функцию аргументом, безымянный массив?
void foo(...,float c[3]){...} ==>
foo(...,{1.0f,1.0f,1.0f}); - вроде раньше так делал, а сейчас забыл.

Ответы85782

7 мая, 19:40 469 1185782

>>1185769
Тип забыл. К чему литерал-то кастить? Вот так:
foo(..., (float[3]) { 1.0,f 1.0f, 1.0f });

Ответы85788

7 мая, 19:53 470 1185788

>>1185782
О точно! Благослови тебя Сибог

8 мая, 19:33 471 1186348

Можете посоветовать годный компилятор для 16 битного real memory mode?

Ответы86365

8 мая, 20:11 472 1186365

>>1186348
Любой. Они все говно. Я предпочитаю борланд, можно ватком, но ватком - это целый свой мирок со своими закидонами.

Ответы86367

8 мая, 20:13 473 1186367

>>1186365
Ну мне хотя бы чтобы работало. В gcc с флагом на 16 бит будет не то?

Ответы86381

27 Кб, 527x560
8 мая, 20:23 474 1186381

>>1186367
Я вообще не знал, что оно умеет в 16-битный код. Будет не совсем то - с 32-битными регистрами, вон даже какой-то MMX проскочил с -O3. Но запуститься - запустится, наверное. А что за задача у тебя? Тебе точно нужен современный компилятор для ее решения?

Ответы86384

8 мая, 20:24 475 1186384

>>1186381
>А что за задача у тебя?
Пишу загрузчик. Мне любой компилятор, главное, чтобы работало.

Ответы86388

8 мая, 20:26 476 1186388

>>1186384
Пиши на асме: читай вторичный загрузчик, переключайся в 32-битный защищенный или нереальный режим и не страдай хуйней. Алсо, прошу прощения за скриншот, там дизасм 32-битный, а код 16-битный.

Ответы86389

8 мая, 20:28 477 1186389

>>1186388
>Пиши на асме
Я от него ахуеваю. Не понимаю даже чем сегменты от стэка отличаются.

Ответы86395

8 мая, 20:30 478 1186395

>>1186389
На Си ты охуевать будешь гораздо больше. А без знаний о стеке и сегментах как вообще загрузчик писать? Тебе ж этот самый стек настраивать, не говоря уже о дескрипторах сегментов защищенного режима.

Ответы86398

8 мая, 20:32 479 1186398

>>1186395
>На Си ты охуевать будешь гораздо больше
Ну с указателями проще...

Ответы86430

8 мая, 20:54 480 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++; }

Больше там ничего нет, в этом твоем стеке.

9 мая, 10:02 481 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).
А если я хочу передавать функцию с неизвестным заранее числом аргументов?

9 мая, 10:03 482 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).
А если я хочу передавать функцию с неизвестным заранее числом аргументов?

9 мая, 10:03 482 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).
А если я хочу передавать функцию с неизвестным заранее числом аргументов?

Показать весь текст
Ответы8689387232

9 мая, 11:23 483 1186696

Надо переписать одну прогу с использования graphics.h и 16 бит под современные ОС. Пока думаю над использованием WinAPI для рисования, перехвата стрелок/Fn и прочего. Какие подводные? Алсо, еще надо одну программу с Паскаля так же переписать, но там проблем ожидается поменьше.

Ответы86893

9 мая, 15:15 484 1186893

>>1186675
> Этот код, конечно же, не работает, в res записалось чёрт-те что.
Сравни с float square(double a), прочитай про default argument promotions. Алсо, своими пустыми скобками ты отключил контроль типов при вызове функции, готовься к сложно отлавливаемым багам.

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

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

>>1186696
> Какие подводные?
Если собираешься переписать только graphics - поебешься с циклом обработки событий, наверняка придется городить еще дополнительные doevents() в самых неожиданных местах. В целом, это достаточно быстро все портируется. Если собрался переписывать саму прогу, то подводных никаких, но это дольше.

Ответы87386

9 мая, 15:59 485 1186920

>>1156306 (OP)
Работа есть? Смогу прогать мк на военном предприятии? А может быть даже смогу работать дома?

Ответы8696187147

9 мая, 16:58 486 1186961

>>1186920
Работа есть, крупные города или не эта страна. Про удаленку и не мечтай. К околовоенным не суйся, у них на строчку кода десять страниц пояснений и согласований.

9 мая, 20:51 487 1187147

>>1186920

Работы вообщем-то дохуя и больше. Все серъёзные фреймворки так или иначе имеют высокопроизводительные части, работающие на C. В эпоху опенсорса все лежит на гитхабе. Увлекайся, разбирайся, форкь, улучшай и тебя рано или поздно позовут работать в буржундию или на удалёночку.

9 мая, 22:06 488 1187210

Насколько всирают всякие кодогенераторы для кортексов чисто сишным прогам?

Ответы87212

9 мая, 22:07 489 1187212

>>1187210
Генераторы чего и из чего?

Ответы87227

9 мая, 22:15 490 1187226

>>1156306 (OP)
Друзья, вощем не могу придумать алгоритм решения задачи:
есть дерево с файлами и .txt, на вход функции дается корень, каждый .txt содержит символическую(ие) ссылку(и) на другие файлы того же дерева, или тупик, или приз.
Нужно найти путь к призу.
Сразу понятно, что нужно рекурсивно пройти дерево файлов, а вот как обрабатывать *.txt?
мб кто-нибудь встречался с подобной задачей?

9 мая, 22:16 491 1187227

>>1187212
CubeMX тип

Ответы87230

9 мая, 22:23 492 1187230

>>1187227
Так оно инициализацию генерит, вот тебе не похуй, какой там код.

9 мая, 22:24 493 1187232

>>1186675
указатель на функция гугли. Берешь инициализируешь как переменную указатель int (*fun)(int , int);
при этом у тебе описана функция с такими же аргументами
int function(int a, int b){
return a+b;
}
теперь просто передаешь указателю функцию :
fun=function;
теперь можешь как аргумент пихать указатель.
> А если я хочу передавать функцию с неизвестным заранее числом аргументов?

если несколько аргументов то <stdarg.h> поможет

Ответы87235

9 мая, 22:26 494 1187235

>>1187232
А мусорные переменные-то зачем создавать? Он вон напрямую передает, как человек, а ты какую-то бесполезную ебанину советуешь.

Ответы87236

9 мая, 22:27 495 1187236

>>1187235
не заметил я просто, саня хуй саси

10 мая, 01:45 496 1187386

>>1186893
А если указывать указатель на указатель на функцию?
Число аргументов всё так же требуется?

Ответы87393

10 мая, 02:03 497 1187393

>>1187386
Описание аргументов требуется не потому, что нехороший Си запрещает указатели на функции с неизвестными аргументами. Просто при вызове функции эти аргументы нужно как-то передавать, а для этого нужно знать их типы, а каким-то другим путем (через астрал?) узнать в рантайме, что вот эта конкретная вызываемая тобой функция хотела первым параметром char вместо int - невозможно. Поэтому Си в таком случае делает лучшее, что он может: определены default argument promotions (например, вместо char будет положен int, а вместо float - double), передаваемые аргументы неявно кастятся к своему дефолтному типу. То же самое делается для необязательных аргументов variadic-функций типа printf - там информация о типах тоже недоступна. Если вызываемая тобой функция именно этого всего и хотела, то все заработает. Если хотела float, а прилетел double - ну ты видел, чем это заканчивается.

> А если указывать указатель на указатель на функцию?
А какая разница? Проблема не в адресе, а именно в том, как компилятор будет эту функцию вызывать. А так ты мог бы хоть указатель на void передавать, тебе никто не мешает. На самом деле так нельзя: по историческим и архитектурным причинам возможны ситуации, когда указатель на данные и указатель на функцию могут быть численно равны, но указывать на разные вещи. Поэтому кастить между указателями на функцию и указателями на void - это UB, хотя на практике на всех современных распространенных платформах все ок.

Ответы8742387456

10 мая, 04:18 498 1187423

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

Ответы874248742987495

10 мая, 04:42 499 1187424

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

> В общем, такими изворотами лучше заниматься в более приспособленных для этого языках.
Я так и не понял, чего ты хочешь добиться. Ты же функцию вызываешь? Значит, ты знаешь, сколько и каких параметров будет. Почему нельзя их в указателе на функцию указать?

10 мая, 05:42 500 1187429

>>1187423
>Как-то же они умеют и могут в это.
Там не явно предается информация о количестве параметров. В Си есть VA_ARG, е еще лучше съеби и не еби господам мозг.

10 мая, 07:56 501 1187456

>>1187393
>На самом деле так нельзя: по историческим и архитектурным причинам возможны ситуации, когда указатель на данные и указатель на функцию могут быть численно равны, но указывать на разные вещи. Поэтому кастить между указателями на функцию и указателями на void - это UB, хотя на практике на всех современных распространенных платформах все ок.

Ну то есть вся абстрактопараша, все питушыные платформы с JIT-компиляцией и GC существуют чисто случайно, потому что авторы компиляторов сишки и плюсов добрые? Охуеть же.

Ответы8748087490

10 мая, 08:51 502 1187472

>>1164658
>который учил не Си, и не кресты, а некий "си с классами".
Сцук, это про меня. Просто практиковаться было интересно на winAPI, литературе часто были примеры с кодом вроде LPTCCONTROLDATA context = LPTCCONTROLDATA)malloc((size_t)sizeof(TCCONTROLDATA)); - что-то вроде, а может и нет, стал уже забывать С с классами - 12 лет не кодил, но зашел в ваш тред понастальгировать после богомерзкого JS-треда с их программированием фреймворков.

А ещё тогда полюбил их __try __except

10 мая, 09:14 503 1187480

>>1187456
>Ну то есть вся абстрактопараша, все питушыные платформы с JIT-компиляцией и GC существуют чисто случайно, потому что авторы компиляторов сишки и плюсов добрые?

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

По-нормальному запись байтами выполняемого кода в память и последующий вызов оного как функции можно делать онли через вынос этого добра в ассемблер.

Ответы87520

10 мая, 09:56 504 1187490

>>1187456

Именно.

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

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

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

Ответы87543

10 мая, 10:09 505 1187495

>>1187423
>А как в некоторых других языках дело обстоит, не знаешь? Как-то же они умеют и могут в это. Но засчёт чего?

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

Алсо, тред пора перекатывать.

10 мая, 11:36 506 1187520

>>1187480
Слишком категорично. Но да, JIT предполагает знание о системе и выход за пределы стандарта Си.

ПЕРЕКАТ # OP 10 мая, 11:40 507 1187523

>>1187521 (OP)
>>1187521 (OP)
>>1187521 (OP)
>>1187521 (OP)
>>1187521 (OP)

10 мая, 12:19 508 1187543

>>1187490
А ничего что в этой параше int()() вызывается как int()(int, int)?

Ответы87838

10 мая, 19:28 509 1187838

>>1187543
Ничего. Пустые скобки в Си (но не в крестах) означают, что информация о типах и количестве недоступна. Мы там выше обсуждали.

Ответы87935

10 мая, 21:15 510 1187935

>>1187838
Ничего себе метапрограммирование в крестах. А если у меня эта функция перегружена числом параметров, компилятор разберется и вызовет то что нужно?

12 мая, 20:26 511 1188833

Глупый вопрос, но все же спрошу. Допустим, имеется глобальная переменная p = 6;
Пишу условие if ((p++) == 7) { ... }
В таком случае p будет инкрементировано только в рамках условия if, т.е. p увеличится на 1 и сравнится с цифрой 7, а в глобальном значении останется 6, так? Или же будет инкрементировано на единицу, и уже глобально будет иметь значение 7 во всей программе после проверки условия?

Ответы88837

12 мая, 20:42 512 1188837

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

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

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

Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 13 июля 2018 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

« /pr/В начало тредаВеб-версияНастройки/a//b//mu//s//vg/Все доски

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion