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

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
C Programming Language.png78 Кб, 792x1023
C Programming Language #29 # OP 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
image.png2,8 Мб, 1230x1230
2 1156415
Вкатился. Вопросы по эмбеддед-си здесь задавать?
3 1156422
>>56415
нет
sage 4 1156424
Всё байтоёбите?
5 1156517
>>56424
Всё сагоёбишь?
6 1156530
>>56415
конечно, я почитаю, но отвечать не буду, потому что ничего не знаю.
7 1156547
>>56422
>>56530
Ладно, тогда вопрос по прикладному С:

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

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

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

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


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

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



Ну я хочу заменить все эти танцы с бубном и инкрементами указателя на что-то вроде ret_test.wind = pgm_read_word(&Profile[time].wind) и так далее, так можно сделать? Какой правильный синтаксис для таких конструкций?
10 1156629
>>56551
тебе не красиво? сделай юнион с char@.
11 1156727
Где прочитать все сдвиги C99 относительно C89?
Язык не важен, важна ёмкость изложения.
12 1156884
>>56629
Да хуй там, оказывается можно указывать на сами элементы массива. Жалко только что нету ассемблерного кода для считывания вообще всего блока.
13 1156896
>>56727
Вступление к соответствующему стандарту или справка от Pelles C.
14 1157165
Я невнимателен, или и правда нигде не сказано о том как malloc выравнивает левую границу? Мне два бита нужно, есть вообще какие-то гарантии на этот счёт?
15 1157629
>>57165

> правда нигде не сказано о том как malloc выравнивает левую границу


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

> Мне два бита нужно


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

>Чо?


Мне в указателе, в крайних двух разрядах, необходимо сохранить два флага, в самой переменной, а не в выделяемой памяти я имею в виду.
17 1157913
>>57905
Ты всё-таки почитай как адресуется память и как происходит чтение-запись.
18 1157981
>>57905
тут уже один чувак так делал, в в одном заведении учитесь?

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

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

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

>можно как-то сделать обёртку над malloc, но чтобы с тем же именем


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

>но тогда хранить нужно и настоящий адрес


Тут за два бита битва, а ты целиком адрес хранить предлагаешь.
22 1158011
>>57993

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


хорошая, почитал.

>>57993

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


с другой стороны мы уже выяснили, что освобождать память не надо...
23 1158134
>>58011
Во догонку ещё вроде бы BoehmGc умеет подменять обращения к malloc,

А как-то статическую переменную по кратному адресу выровнять можно?
24 1158137
Можно ли как-то реализовать такое?
Или только инклюдить через ifndef

#define LOH 123
#include "../" + LOH + "/file.h"
25 1158374
>>56306 (OP)
родные, покажите реализацию компаратора для типа double, пожалуйста
26 1158402
>>58374
bool AreSame(double a, double b)
{
return fabs(a - b) < EPSILON;
}
27 1158442
>>58402
почему bool а не int?return fabs(a - b) < EPSILON; возвращает + если разность "~0" и - если числа разные, я правильно понял? но ведь компаратор не только говорит разные числа или одинаковые, он еще говорит какое больше
28 1158603
>>58134
#include <stdalign.h> // C11, но есть расширения и для более старых версий стандарта.

>>58137
Можно.
#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)

>>58442
Ну так добей условие-то, в чем проблема-то?
double delta = a - b;
return (fabs(delta) < EPSILON) ? 0 : (delta < 0) ? -1 : +1;
29 1158607
>>58603
>>58137
Чета я подумал, что оно так может что-нибудь еще в пути к файлу случайно развернуть, если оно совпадет с именем макроса. Например, #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)
30 1159398
>>58603

>return (fabs(delta) < EPSILON) ? 0 : (delta < 0) ? -1 : +1;


спасибо большое
31 1159423
Ахахах, у вас что, даже нет встроенного сравнения чисел?
sage 32 1159452
>>59423
Ты про spaceshit? Нету. Как ты в него нужный эпсилон передашь? Ах никак, ах авторы компилятора интерпретатора твоего языка лучше тебя знают, какая погрешность у твоих значений?
33 1159459
можно ли обработать SIGTERM?
34 1159463
35 1160046
День добрый, аноны. Не знаю как более красиво решить задачу:
Я делаю выборку из БД и сколько строк она вернет - неизвестно. Проходясь циклом по результату выборки я каждую строку помещаю в структуру, а структуру в массив. Для этого перед каждой выборкой мне приходится сначала выбирать количество записей и на основании его инициализировать массив. То есть приходится делать два запроса, хотя полезные данные возвращает только один из них. Скажите, как мне затолкать результаты выборки в массив заранее не зная его размера?
36 1160056
>>60046
никак, певый скюл запрос с каунт закеширует результат в бд, второй будет бесплатно. ну или читай фиксированными чанками.
37 1160061
>>60056
Хм, ну если на производительности это не скажется то пусть так и остается. Спасибо.
38 1160466
>>60056

>закеширует


Не кэш, а буфер. Кэш умеет синхронизироваться.
39 1160607
>>60046
Используй односвязный список, например.
sage 40 1160626
>>60607
Почти двачую. Список чанков, хранящих по n записей - это правильный способ решения проблемы, если производительность критична аж пиздец как. Если нет - realloc тоже сойдет.
41 1162041
Репост из крестового треда

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

> но там не сказано, какой разделитель и как использовать для нескольких секций


Сделай несколько мержей: /MERGE:.rdata=text /MERGE:.data=.text /MERGE:.bss=.text
43 1162103
>>60046
Наиболее красиво - это выкинуть массив нахуй, и обрабатывать записи по мере поступления. Попробуй, может, получится. В большинстве случаев получается. Тем более что в С++ вроде бэкпортили range из D, так что должно быть несложно. (Не знаю точно так как давно не юзал). Если не получается и по данным надо что-то считать с рандомным доступом, возможно, ты просто хуево знаешь SQL, потому что когда ты его знаешь хорошо, ты выбираешь уже все готовое к применению.
.c или .h 44 1164019
сап двачеры, срачеры, хуячеры, усачеры и тд. Объясните недоразвитой мошонке, мне, в чем разница нахуй между файлами .c и .h. я ебать пишу такой файл с прототипами имен переменных ну да надо переносимость обеспечить сохраняю с расширением .h подключаю через инклуд и все робит, меняю расширение на .c и опять нахуй все робит, ебать думаю я че за хуйня не должно же робить или должно хуй его знает. В общем как я понял .h сделали тупо чтобы не путать с .c файлами походу так. Поправляйте смело меня если не так. Спасибо за внимание нахуй
45 1164026
>>64019
это все еще я, ну вот даже простой пример: подключаю stdio.h вызываю printf все норм, опять же захожу в сборище заголовочных файлов меняю расширение у файла stdio.h на stdio.c в коде тоже все меняю, повторно компилю и опять все норм робит ну и как так
46 1164030
>>64026
а что тебя не устраивает?
47 1164036
>>64030
ну тип так и должно быть? это нормально? то есть если я хочу то могу спокойно писать заголовочные файлы с расширением .c??
48 1164060
>>64019

> в чем разница нахуй между файлами .c и .h


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

>>64036

> писать заголовочные файлы с расширением .c


Можешь. Некоторые делают кладут static inline функции в отдельные файлы с расширением .inl. В крестах так и вообще разброд и шатания, там есть и .h, и .hpp, и .hxx, и .hh, и даже .h++ раньше было. Ты можешь делать все, что угодно, но старайся быть консистентным и очевидным по мере своих сил.
49 1164064
>>64060
не знаю принято ли тут говорить спасибо, но спасибо.
50 1164073
>>64019
Чисто логическое разделение. Грубо говоря в хэдэрах всё прототипизируется, а в файлах кода реализуется. Можешь проект в лям строк хоть в 1 .c захерачить, но будет ли это удобно? (особенно когда дело коснется препроцессора).
Это ты ещё банальным вопросом задался, ведь может быть всякое:
.c .h .cc .hh .cpp .hpp .cxx *.hxx и т.д.
51 1164140
>>64019
Заголовки отдельно нужны, чтобы ты мог использовать чужие _скомпилированные_ библиотеки. И чтобы кто-то мог использовать твои.

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

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

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

Это основной смысл, остальное - структурирование кода и т.п. - по желанию.
52 1164604
>>56306 (OP)
Возник тупой вопрос. Следующие две команды идентичны или нет?
double (зв)x = (double(зв))malloc(10 x sizeof(double));
double (зв)x = malloc(10 x sizeof(double));
Если да, зачем тогда в таких случаях пишут приведение типов?
Если нет, не является ли вариант с приведением медленнее чем без него?
53 1164658
>>64604
В Си указатель на void автоматически и неявно кастится к указателю на другой тип (и обратно). В крестах такого нет (у них там type safety типа), поэтому нужен явный каст. Разницы по производительности нет. Каст возвращаемого маллоком значения - классический признак человека, который учил не Си, и не кресты, а некий "си с классами".
54 1164725
>>64658
теоретически это может помочь при рефакторинге. но мы же знаем, что функции должны быть такого размера, чтобы всё было в ней понятно и видно сразу.
55 1164941
>>64604

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



Чтобы обеспечить переносимость сишного кода на кресты.
56 1164990
>>64941>>64658
Благодарю.
Хотя во втором случае возникает вопрос, зачем конпелировать сишный код плюсовым конпелятором.
57 1165130
Чпок!
58 1165468
>>65130
Добрый вечер!

Мимо вежливый лось
59 1165581
https://youtu.be/443UNeGrFoM

Бля, посмотрел видео. Смешанные чувства. С одной стороны он прав, хотя блин... Вроде и бредит немного.
60 1165880
>>65581
2 часа смотреть как какой-то петух рассказывает про свой стиль программирования?
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);
}
62 1166508
превед двочь. объясните простым язык про конец файла в си, и про то как обрабатываются потоки символов. чайнику полнейшему но в подробностях если не затруднит
63 1166516
>>66492
Не скомпилируется.
64 1166550
>>66508
Системный вызов возвращает некий признак конца файла.
Ну вооот
65 1166593
>>66492
В теории представление _Bool может хранить хоть 'y'/'n', и разворачиваться в 0/1 только при использовании в выражениях, хотя на практике никто такой хуйней не страдает. Поэтому если исправить ошибки, вернется 2.

>>66508
Задай более развернутый вопрос. Конец файла - это специальное значение, выходящее за пределы диапазона, применяющегося для символов. Его возвращают как индикатор того, что символов больше нет. Физически никакого конца файла уже лет 30 как не существует.
66 1166602
>>56306 (OP)
ребят простите за ламерский вопрос , но интересно куда возвращает значение return доупстим из мейна или та же функция exit куда они выводя значения и где их посмотреть
67 1166607
>>66602
Там до и после мейна ещё код работает.
А где посмотреть... погугли программа код возврата
68 1166616
>>66602

> где их посмотреть


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

> куда возвращает значение return


В main() return EXPR полностью аналогично вызову exit(EXPR);
69 1166681
Господа, переделайте, пожалуйста, Си++ код в Си.
https://ideone.com/wLxTJb
sage 70 1166687
>>66681
Отвратительный код. С тебя $10.
printf("%.2x\n", 0x0f ^ 0x61);
71 1166695
>>66687
Смешно.

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

С помощью маски надо одновременно изменить состояние одного \ нескольких битов в байте, не затрагивая не нужные. Порядок бит (как в самом байте, так и в выбираемых для изменения) - MSB...LSB.
sage 72 1166697
>>66695
Очевидно, что когда маска зависит от числа, тебе не нужна маска, потому что результат - константа. А если тебе нужно менять биты в рандомном числе, тебе нужно ДЖВЕ маски - для and-not и для or. Такие дела.
73 1166700
>>66697
В Си++ коде именно так. Поэтому и прошу переписать.
Пусть даже за вознаграждение. Разумное. 300к нет.
sage 74 1166709
>>66700
Ну бля. Делоешь маску 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 - индекс_бита), если сильно надо.
75 1166732
>>66709
байтоёбы
76 1166787
>>66709
Спасибо попробую собрать. Хотя не уверен, что получится.
Дай фейкомыльце, а?

Может ещё будут предложения.
77 1166873
>>66508
http://www.c-cpp.ru/content/eof

Что такое потоки символов?
78 1166878
>>66787

> Дай фейкомыльце, а?


suck_my_nerd_co8\BckANUSmaijv%lPUNCTUMrXv\u

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


С пошлостями не обращаться.

зы: дятел, за каким хуем ты учишься? Пиздуй сраз в макхряк трудоустраиваться
79 1166882
>>66873
Ну смотри. Можно абстрагироваться над файлом и представить себе трубу из которой выливаются символы один за другим. Тебе похуй, откуда они там в трубе берутся - может быть, они из файла читаются, может их пользователь ввел, может их другая программа на лету генерирует, а может они через сеть прилетели. И вот ты читаешь символы, а потом тебе прилетает вместо символа хуй (EOF). Тут-то ты и понимаешь, что больше у этой трубы ловить нечего. Вот это потоки. Потоки символов, байтов или еще какой-нибудь хуйни (в Си - потоки символов).
sage 80 1166885
>>66787
Это >>66878 если что не я был. Спрашивай тут, если к Си относится, или в прикрепленном, если не относится.
81 1166899
>>66882
В первый раз слышу про потоки, честное слово. Сравнение канализацией попахивает. Тебе может быть пойти на сантехника отучиться?!

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

Посмотри код tail, ключ -f к этой утилите именно то, что тебе надо.
sage 82 1166901
>>66787
Этот >>66885 быдло мимикрирующее из /б просочившееся сюда, не обращай внимания.
83 1166911
Расскажите про стандарты языка. Что это и как это. Что значит поддержка компилятором стандарта.
84 1166914
>>66911
Все тоже самое, что и в скриптовых языках типа пиздона или эрэнэра.
85 1166915
Создать язык программирования это значит создать компилятор для него получается так? То есть создать некую программу которая будет переводить некие слова в машинный код? Почему тогда раз машинный код для каждого процессора разный то программа написанная мною на моем пк успешно запускается на другом пк с другим поколением процессоров к примеру у меня амд а у приятеля интел
86 1166917
>>66915
Зависит от ОС и кучи других факторов.
87 1166918
>>66917
Можно подробнее?
88 1166919
>>66917
начни со стандартов и то как они связаны с компиляторами
sage 89 1166920
>>66911

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


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

>>66915

> Почему тогда раз машинный код для каждого процессора разный


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

> у меня амд а у приятеля интел


Архитектура команд у AMD и Intel по большей части одинакова.
90 1166922
>>66918
Подробно писать не буду, ибо заебусь печатать.

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

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

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

Лень откровенно новоря приводить примеры как Си код вюпревращается в ассемблер, который в виде инструкций поступает на конвеер ЦП и как там память кеш и прочие компоненты задействованы.
91 1166923
>>66919
Берем, например ци89. Есть там абстрактная комнда fuck(), которая в наборе инструкций интел и амд ЦП будет соответствовать последовательсти jmp ax, cmp e6, e4... и т.п. У интела это будет инструкция нащываться А, а у АМД Б.
92 1166924
>>66732
Побитовые операции есть даже в javascript, но куда тебе дегенерату знать про это.
sage 93 1166933
>>66915
В ньюфаг-тред.
Screenshot from 2018-04-02 23-46-09.png21 Кб, 654x228
94 1166984
Аноны, хелпуйте нубу.
Задача - вывести ласт слово задом наперёд.
Вывод: euelueblue
Кто пояснит?
95 1166990
>>66984
У тебя принтф печатает с символа, который ты передал и до \0.
e
ue
lue
blue
96 1166992
>>66984
Попробуй печатать символ, а не строку. printf(%c, s)
Screenshot from 2018-04-03 00-01-15.png21 Кб, 650x230
98 1166997
>>66992
>>66994
Спасибо, так работает.
99 1167203
>>66997
Что за компилятор?
100 1167206
>>67203
Lexicon
101 1167224
>>67206

>Lexicon


Что-то не гуглится. Есть ссыль на установщик?
sage 102 1167295
>>67224
Lexicon? Конечно есть: https://transfer.sh/yplpi/Lexicon-8.92.zip
103 1167386
>>67203
gcc 5.4.0
104 1167423
Ничего не понял, вот это >>66997 говно скомпилируется даже на микроволновке. Какая разница, какой конпелятор?
Или гений выше перепутал компилятор с иде?
105 1167441
>>67423
Насколько я понял - да, перепутал. Увидил интерфейс моего саблайма и спросил что за компилятор.
14092046290540.jpg14 Кб, 316x341
106 1167461
>>67423
Да, перепутал. Всё, придётся выйти покурить в окно. Так дальше жить нельзя.

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

Вроде ничего пиздец архи-сложного не спрашивал, лол.
107 1167609
>>67461
тебя даже никто не трогал, взял ещё и обиделся. тебе лечиться надо.
108 1167682
Пишу простой интерпретатор, и для грамотной очистки памяти походу придется заюзать референс каунтинг, но готовых бибилотек или реализаций я не нашел. Если писать самому, то я даже не знаю с чего начать, какая вообще основная идея использования и реализации этой хуйни? Кто может пояснить, желательно с кодом?
image.png125 Кб, 399x213
109 1167727
>>66984

> длина строки


> sizeof(s)

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

> пишешь методы


Ну функции, в смысле
sage 112 1167741
>>67727
И ты сейчас нам пояснишь, почему нужно считать в рантайме через strlen, а не в компайлтайме через sizeof.

>>67682
Посмотри на COM (одним глазком только, не нужно в дебри лезть, какой-нибудь вводной статьи хватит).
113 1167764
>>67741
Во-первых, этот костыль работает только для массива, выделенного на стеке, во-вторых, попробуй вынести этот код в функцию и посмотри, что будет.
114 1167771
>>67728
Для подобного существует boehm gc
https://en.m.wikipedia.org/wiki/Boehm_garbage_collector
115 1167791
>>67764
Причина "во-первых" и "во-вторых" одна и та же, sizeof(x)/sizeof(*x) для динамически выделенного массива будет использовать только очень особенный пограммист.
sage 116 1167795
>>67791

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


Ты скозал?
Ну и что же используют господа, обучавшиеся в Хуеле?
117 1167803
>>67795
Я не настаиваю, конечно, в следующем коде нет ничего противозаконного

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

Но результат может немного расстроить.
118 1167804
>>67803
int (зв)x = malloc(10 * sizeof(int));
sage 119 1167863
>>67803
А еще можно после твоего printf сделать x[100]=0xdead. По твоей логике [] зло, нужно написать какую-нибудь array_set(), которая проверяет границы, лишь бы какой-нибудь недоучка не обосрался. Тебе в другой язык с таким подходом.
120 1167883
>>67863
Что ты несешь? Я лишь сказал, что придирки в этом >>67764 посте надуманные, и разве лишь дебил неопытный попадется на подобную ошибку (на определение числа элементов в массиве, выделенном маллоком).
Про добро и зло ты сам домыслил.
sage 121 1167944
>>67883
Так и я о том же.
122 1168611
Друзья, мне нужно как-то записать и вывести кириллицу не используя wchar, что делать?
123 1168612
>>68611

> что делать


Бочку. ОС, компилятор, более полное описание задачи?
124 1168616
>>68612
на степика есть задача, где нужно написать программу, принимающую кириллицу, далее дефолтная работа со строкой и вывод. Решил wchar, сказали збс а теперь без wchar, сказали думать в направлении, что кириллица не помещается в char
125 1168619
>>68616
Не знаю, кто такая эта ваша степика, но если у тебя нормальный линукс, ты можешь использовать UTF-8 (на винде тоже можешь, но в винде UTF-8 в консоли можно сделать только в десяточке) - если кириллица не помещается в один char, то может поместиться в несколько char. Про подробности кодирования UTF-8 см. википедию. Но без сборки хотя бы одного символа в wchar_t/char16_t/char32_t ты со строкой нормально не поработаешь (ну, конечно, моооожно, но больно).
sage 127 1168944
>>68644
Но ведь Си действительно мёртв.
Сейчас тащат плюсы.
Все, кто исползует Си - петухи и опущенцы.
123.png31 Кб, 400x625
128 1169001
сап, есть прога. Нифига не понятен принцип работы (да, она не совсем правильна). Хелп! Обясните дурачку!
129 1169005
>>69001
Что тебе не понятно? Обычный односвязный список.
sage 130 1169060
>>69001

>for(; pizda;)


Мам, смотри, я хакер!
sage 131 1169105
>>69060
Правильные ребята пишут так: for (; ∗current; current = &((*current)->next));
132 1169135
>>69105
Бля, ахуенно жеж.
133 1169136
>>69060
>>69105
Но зачем эта сахарная параша когда есть while/
134 1169183
>>67804
А потом ты поменял тип x, или не ты, что только увеличивает вероятность внесения ошибки
135 1169202
>>69183

>А потом


Суп с котом.
136 1170933
>>56306 (OP)
https://pastebin.com/Pdv3jmv9

> Error in `main': malloc(): memory corruption (fast): 0x00000000013470e0


Посоны, почему возникает ошибка? Видимо, из-за функции f2, она как-то распидарасивает мою память void*. А как тогда правильно?
137 1170945
>>70933

>memory corruption


планку памяти смени на новую
138 1170951
>>70945
Где ж я в тюрьме планку памяти достану? Есть ещё варианты?
sage 139 1170954
>>70933
Ты считаешь адреса неправильно. Сделал бы структурку типа 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. Иначе стоит сложить сначала оба массива даблов, потом уже инты. Но вообще, такой подход говно, не делай так, если не уверен.
sage 140 1170955
>>70954

> memory + (2 + 4)n = memory + 6n:


memory + (4 + 8)n = memory + 12n (опечатался).
141 1170963
>>70954

> Но вообще, такой подход говно, не делай так, если не уверен.


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

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

> int f(mystruct structure, unsigned size, бла-бла);


Фикс.
sage 143 1170968
>>70963

> Содержат в себе кучу различных маллоков


Ну так уменьши количество маллоков, посчитай, сколько тебе памяти нужно и выделяй заранее, не внутри цикла, а перед ним. А менеджер памяти у тебя уже есть, ты из него маллок дергаешь, и обогнать его чем-то кастомным может быть сложно.
144 1170985
>>70951
тюрьма психотронная, надеюсь?
145 1171003
>>70968
А я проверил, "итеративный вариант" дал ускорение в полтора раза. Пожалуй, оставлю.
146 1171009
>>71003
Ты точно уверен, что malloc(sizeof(mystruct) * size) медленнее? Я вот не верю в такое.
147 1171017
Народ посмотрите пожалуйста на мой выссер и скажите почему этот кусок говна не хочет запускаться. Битый час сижу над этим дерьмом. P.S. Скорее всего руки у меня кривые.
https://ideone.com/iK76G3
148 1171018
>>71009
https://pastebin.com/qD9yFRMq
Результат:
f1: 28.039000
f2: 19.173000

Завтра проверю в gcc, может другие числа будут.
149 1171020
>>71017
Знак умножения пропущен.
e определена в константах.
Тебе в плюсотред.
150 1171021
>>71017
Добавлю к замечаниям предыдущего анона, что ^ - это оператор побитового исключающего или, а степень - это функция pow().
151 1171024
>>71021
А еще есть exp.
152 1171027
>>71018
Откуда у тебя там вторые + size взялись при вычислении указателей? Зачем? Мы считаем относительно предыдущего указателя. y - это память, следующая за size элементами в x, а res - это память, следующая за size элементами в y.
153 1171031
>>71020
Спасибо что отозвались Аноны, вагон чая и уважения вам. Я поменял но все равно не врубается. https://ideone.com/wgsAbX
154 1171034
>>71031
Английский язык говорить? Сообщение об ошибка читать? Где переменная a объявлять? Нигде не объявлять? Вот и не врубаться.

>>71018
Алсо, тест-кейс у тебя был очень хуевый. Сумма там заменится на i * 2, а учитывая, что у f1() сайдэффектов нет (она ничего не возвращает, и вообще почти не влияет на мир за своими пределами), нормальный компилятор вообще может выкинуть все ее содержимое на ненадобностью.
155 1171078
Пардоньте, а нет ли аналага fopen такого, что б ему не нультерминированную строку требовалось передавать, а буфер и его длинну? Или только напрямую с sysenter возиться?
156 1171088
>>69105
Правильные ребята используют tail-рекурсию.
157 1171105
>>71088

>Правильные ребята


в плане правильно ебутся в жопы.
158 1171234
>>71078
Системный вызов open() сам хочет нультерменированную строку. Напиши себе обертку, которая будет копировать имя в массив и по указанному офсету втыкать \0.
159 1171256
>>71234
Так и придётся делать, спасибо.
160 1171420
>>56306 (OP)
Поясните за realloc, нужно free вызывать для старого указателя? т.е если new_ptr = realloc(old_ptr, new_size);
нужно потом делать free(old_ptr);?
161 1171426
>>71420
Если realloc() сфэйлился, твой указатель остается твоим, и ты должен его освободить. Если realloc() прошел успешно, ты заботишься только о том указателе, который тебе вернули. Старый указатель уже не твой. Кстати, realloc() может вернуть тебе твой же старый указатель, если есть возможность просто добавить памяти в выделенный блок, поэтому было бы странно, если бы тебе нужно было его освобождать.
portaudio 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.

Алсо, если я хочу написать простую говорилку текста или мелодию из марио, то что мне нужно знать? Надо взять библиотеку полегче или же книжку потяжелей?
163 1172032
>>71919
Возьми OpenAL и не еби себе мозг.
164 1172438
В чужом коде наткнулся на объявления функций в таком виде:

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

Зачем так делалось?
165 1172441
>>72438
Видимо код совсем древний, во время K&R (ло принятия ANSI стандарта) так писали.
166 1172453
Пытался написать слияние массивов в том стиле, в котором написана qsort.
С double и int вроде норм работает, а вот структуры обмениваются полями. Где я накосячил?

https://pastebin.com/ZZEzmk0C
167 1172491
>>72441
Это код из проекта, который появился после 2000 года.
168 1172552
>>72453
Да вроде все норм. Смущает только вычисление длины хвоста массива в последних двух memcpy, не понимаю твоей логики. Покажи минимальный компилирующийся пример, который не работает.
169 1172575
>>72552
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-того элемента.

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

> в результирующем массиве осталось


Ну я просто не понял, что именно задает юзер в 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 элементов. И у нас случается ОЙ.
171 1172618
>>72576
В данной функции (она не вещь в себе, а часть некоторой программы для комбинаторной оптимизации) первых два массива в сумме точно больше результирующего.
В первом массиве лежат инициализирующие элементы, во втором -- новые, полученные из инициализирующих. Потом мы выбираем из обоих массивов лучшие элементы и полученный массив делаем новым инициализирующим. Те элементы, что не вошли в новый массив, являются мусором.
172 1172620
>>72618
Хотя можно было бы добавить что-то типа if(size1 + size2 < size_result) {return POSHOL_NAHOOY;}
173 1172927
>>56306 (OP)
Анон, как устроенна работа GPU, у которых есть своя собственная память? Вот я, например, всегда работал с платами с видеокартой, у которой нет встроенной памяти, и здесь всё просто - графика из юзерспейса элементарно копируется в RAM, пинается GPU, который потом по DMA забирает данные, обрабатывает их и пишет результат во фреймбуфер опять же в RAM.
174 1173029
>>72927

> юзерспейса элементарно копируется в RAM


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

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

>существует ли какой-нибудь сайт


https://govnokod.ru/
178 1173240
>>73221
всю жизнь хочешь провести в зависимости от мнения окружающих?
180 1173275
>>73262
Благодарю, то что надо.
181 1173437
Встречается такой стиль объявления функций:

int
function(char *s)
{
}

Объясните, какие преимущества даёт размещение возвращаемого типа в отдельной строке?
При этом в заголовочных файлах эти же в одной строке.
182 1173603
>>73437
Конпелятору похуй. Дело вкуса.
183 1173613
Как в сублайме включить вывод ошибок для Си? Работаю на линухе, если это имеет значение.
184 1173661
Антоны, что использовать для перехвата нажатия клавиши в Си?
185 1173712
>>73437
Если тип возвращаемого значения длинный, или конвенция вызова указывается, то искать глазами имя функции проще:
const struct myyoba_data_store * MYLIB_CALLTYPE
function(void)
{
}

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

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

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


В консоли. ОС - Linux Gentoo.
187 1173749
>>73739
Опиши нормально задачу. У кого ты клавиши перехватывать собрался, зачем? Ты там reptyr какой-нибудь пишешь, или что?
188 1174056
>>73749
Пишу рогалик в терминале.
189 1174146
>>74056
А ты действительно изучил хотя бы основы сишечки?
fgets, gets, scanf...
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"
И тогда в сообщении будет имя программы, как положено.
Что-то в связи с последовательностью работы препроцессора, порядком раскрытия макросов чтоли, но мне непонятно, что именно ему мешает по-человечески со мной...
191 1174189
>>74187
Так, только не надо вот говорить, что это потому, что я #PRORGRAM написал.
Нее
192 1174195
>>74187

>#define PROGRAM program


Попробуй утакуот
#define PROGRAM "program"
193 1174197
>>74195
Пробовал, нихрена.
Да и бессмысленно это.
194 1174201
>>74195
А, всмысле, потом PROGRAM уже без '#' подставлять?
195 1174208
>>74201
До. У тебя же строка
196 1174300
>>74187

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

> #define FOO bar


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

А почему у меня всегда bar?
199 1174555
>>74310
Я упоролся, соре.
Всё там, как и ожидалось.
200 1174621
>>74310
Эт что за магия!? оО
201 1174700
сап аноны, поясните за передачу tar архива по tcp с помощью сокетов.
202 1174727
А 9-битовый тип данных можно организовать?
А то 8 бит мало, а 16 много, чтобы возводить флаги. Контролируемых ситуаций 9.
203 1174728
>>74727
Хотя каковый в этом смысл, там же всё равно выравниваться в итоге будет по крайней мере по 8 битам, да?
204 1174729
>>74728
Да.
205 1174825
>>74700
Открываешь сокет, передаешь. Не забываешь, что send может передать меньше, чем ты ему сказал, поэтому внимательно обрабатываешь код возврата.
Kratkoe-rukovodstvo-Kak-vzlomat-windows-s-Kali-Linux-300x241.jpg12 Кб, 300x241
206 1174901
Хелп
Нужно написать Windows драйвер (мне вроде KMDF подходит), который будет считывать значение TSC: Time stamp counter, счетчик тактов (на самом деле не TSC, а MSR мне нужно) регистра процессора и записывать новое значение в этот регистр.

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

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

В Windows Internals судя по оглавлению не раздела про написание драйверов. А на сайте Microsoft написано мало и не полно как-то, хотя может я и жопой читал
207 1174909
>>74901
Есть книга про драйверопесание под венду, гугли, лентяй
208 1174995
>>74700
man netcat
209 1175003
>>74901
Windows Must Die
771px-Windowses.jpg64 Кб, 771x599
210 1175008
>>75003

>Windows Must Die

sage 211 1175041
>>74901
Качаешь DDK (можно, и даже возможно лучше - несвежий какой-нибудь). Читаешь документацию из комплекта (для такой простой хуйни достаточно введение прочитать). Правишь любой простой пример из комплекта. Компилируешь. Алсо, у MS сейчас все свежие примеры на гитхабе лежат.
212 1175326
друзья, помогите с правильным ответом на вопрос: вот например у нас есть указатель на первый элемент массива a и указатель b на nй элемент массива, (b-a+1) - индекс элемента массива, так вот вопрос, нахера мы единицу прибавляем? нужен именно правильный ответ. Заранее спасибо
213 1175337
>>75326
Ну, смотри: спасибо, что посмотрел.
214 1175343
>>75337
объясни, не понял
215 1175347
>>75343
Потому что

> указатель на первый


а не на нулевой.
216 1175349
>>75326
Правильный ответ: единицу прибавлять не нужно. Если у тебя указатели равны, то их разница 0, и индекс массива тоже 0, ничего прибавлять не нужно. Если у тебя 1-based массивы, то это другой язык, и тебе в другой тред.
217 1175420
>>75347
>>75349
извиняюсь, конечно, указатель на нулевой элемент, я так и ответил, но сказали, что не правильно
218 1175424
>>75420
Шли их нахуй. Смело, решительно. Может ты задание не так понял? Может, тебе количество элементов посчитать с первого по второй указатель? Тогда будет как раз +1). Иначе шли нахуй.
219 1176042
Вроде тот тред. По заданию нужно сделать двустороннюю полудуплексную передачу данных в одном канале между родственными процессами, используя семафоры для синхронизации. Собственно, у меня вопрос - один канал и двусторонняя передача совместимы? Мы же один из дескрипторов обязаны закрыть.
220 1176102
>>76042
хорошее задание, у тебя неплохой препод в вузике
делай его самостаятельно, будет полезно
221 1176106
>>76042
конечно, в этом и суть полудуплекса
режим рации
222 1176136
>>76102
>>76106
Так, падажжите. Нам говорили, что при работе с каналом мы обязаны закрыть для себя вход или выход, смотря читаем или пишем. Обратно открыть мы не можем. Так что я как-то не понимаю, как это сделать.
Screen Shot 2018-04-18 at 8.07.56 PM.png28 Кб, 628x236
223 1176170
>>56306 (OP)
Поясните за hash функции, как их пишут? Методом тыка? Или есть теория?
224 1176172
>>76136
Давай для начала определимся, что такое канал. По-английскиПо-человечески оно как называется?
225 1176174
>>76172
То, которое pipe(fd)
226 1176178
>>76170
Ты хотя бы википедию почитал прежде чем такой глупый вопрос задавать. Хэш рование, криптография и всякое такое. Там де про алгоритмы узнаешь.
227 1176184
>>76178
Хэш на пике не имеет никакого отношения к криптографии. Дизайнят руками, смотрят на распределение.

>>76174
Пайп действительно однонаправленный, но если у тебя parent/child, то тебе нужно просто писать в правильный конец. Закрывать дескрипторы нужно не потому, что иначе не работает, а для того, чтобы read() мог отследить EOF на пайпе (если у тебя открыт write-дескриптор на пайп, read() не вернет 0, даже если на той стороне write-дескриптор закроют).
228 1176192
>>76184
И как тогда мне, спрашивается, "Самостоятельно, используя для синхронизации процессов семафоры, организовать двустороннюю
поочередную (полудуплексную) связь процесса-родителя и процесса-ребенка через канал"? В задании-то канал один. Сделаю через два пайпа, хз.
229 1176193
>>76184
>>76192
Алсо, есть идея послать EOF и тем самым схитрить, но быстрый поиск не помог.
230 1176225
>>76192
У тебя два процесса, один пайп. У каждого процесса есть два хэндла - на чтение и на запись. Родитель такой семафором помахал, записал, а потомок читает. Потом потомок помашет, запишет, а родитель прочитает. Получается полудуплекс, ну. Оба могут писать в канал, но в конкретный момент времени - только один. Рации всмомни: - У нас тут какая-то хуйня, приём. - И у нас тоже, приём. - Да ебись оно все конем, конец связи. - вот это тебе и нужно реализовать.
231 1176232
>>76225
Так вон выше говорят, мол, нельзя, read зависнет. В общем-то о таком и думал, но все упиралось в то, что во всех примерах одна сторона пайпа в родителе/потомке таки закрывалась.
232 1176236
>>76232
Это я писал. read() зависнет, если ты будешь в цикле читать. Не читай в цикле - смотри через ioctl(..., FIONREAD...), сколько есть и читай. Прояви фантазию, в общем - там вариантов дохуя.
233 1176243
>>76236
Мы такой хуйни не проходили. Ладно, буду побайтово читать, ожидая встретить нуль-терминатор. Попробую, по крайней мере.
234 1176675
Двач. Вот прочитал я некоторое количество книг из шапки, с переменным успехом решаю задачки на всяких Codefights, Codewars и тд, но до сих пор не могу понять, куда реально можно приложить Си. Посоветуй какие нибудь книжечки с примерами, где поясняются реальные программы.
235 1176703
>>76675
ОС, компиляторы и прочие движки БД.
236 1176716
>>76675
Advanced Programming in UNIX environment
Programming Applications for Microsoft Windows
Читай документацию по нужной ОС, читай чужие исходники.

> куда реально можно приложить Си


Куда угодно. Если тебе нечего написать, зачем ты вообще учил язык?
237 1176725
>>76675
Железо программировать. Хотя это немного узкая область, не каждому интересно это
238 1176826
>>76675
Модуль для питона напиши.
239 1176888
Анон, решаю тут K&R из шапки и застрял на задании 1-18: https://pastebin.com/A7cJtdG1 (там задание тоже написано). Вроде как код написал, в голове всё сходится, но бля, оутпут просто пиздец. Символы, которые я пропускаю, а именно множественные табы и пробелы, заменяются на какую-то хуйню полную. Типа знаки вопроса или что-то на уровне, хотя по сути, я их просто бля пропускаю и всё, забываю на всегда. Познавшие аналы си, подскажите, что не так?
240 1176926
>>76888
Точно хочешь узнать, что не так в твоей реализации (сейчас не могу), или тебе просто задачу решить. Может, перепишешь? Алгоритм простой: ты читаешь всю строку, сколько ее ни есть, но если прочитанный символ - не таб и не пробел, ты запоминаешь его индекс в переменную. Перед выходом просто пишешь по индекс+1 символ '\0'. Четыре строки на тело getline. Если возвращенная getline строка пустая (по нулевой позиции \0), ты ее пропускаешь.
sage 241 1176932
>>76888
Хотя, если что, одна из твоих проблем в том, что i ты инкрементишь каждую итерацию, а в массив по i пишешь не всегда. Судя по высказыванию "оутпут просто пиздец", у тебя в незаписанных элементах массива куски предыдущих строк и прочий мусор.
242 1176937
>>76932
Лол.
Спасибо. Действительно в этом и было дело
243 1177300
https://pastebin.com/5FCsNe3T
Котаны, почему в файл попадает мусор вместо настоящего содержания конца текста?
изображение.png21 Кб, 812x716
244 1177325
Где я объебался и где мой полудуплекс-то?
https://pastebin.com/ABTiR204
f.png83 Кб, 1051x657
245 1177327
>>77300
не попадает
но это на другой платформе и с учетом правки параметров вызова calloc
246 1177332
>>77327

>с учетом правки параметров вызова calloc


Ошибка появилась из-за смены malloc/calloc.

Спасибо, попробую дома на линупше с гцц запустить.
247 1177362
>>77325
Ты бы для наглядности msg высылал, а не всегда [0].
Вывод ни о чём.
248 1177363
>>77362
Я хотел высылать msg, но у меня происходит segfault. Что странно.
249 1177377
>>77363
Ну, семафор 0 довольно прозрачный. Но вот с первым дела, конечно...
Допустим, родитель первый захватил. Значение семафора 1 равно 1: данных в канале нет, hd=0. Потом сделал семафор 1 нулевым. Освободил нулевой семафор...
Пошёл дочерний. Семафор 1 нулевой => данные есть. hd=1 => Дописали единицу к семафору 1. А это признак отсутствия данных для родителя, да? Родитель ничего не читает, а лишь уменьшает семафор на 1, делает его нулевым для нас, а мы снова ему срём и увеличиваем, а он ничего не читает и для нашего чтения уменьшает
Можно поменять в после родителя и дочку.
Я правильно понял?
250 1177381
>>77377
Да, в семафоре 1 единица - признак отсутствия данных. Родитель смотрит на него, если в семафоре не ноль - не пытается читать, а сам пишет и ставит ноль. Если же данные были, то он пишет и семафор не трогает. Если данные были, но все свое уже выслано - увеличивает семафор давая понять, что ничего не высылал.
251 1177382
>>77363
Я хз, что если инициализировать нулём semval в main(), а потом просто читать с sem_op=-1, а писать с sem_op=1.
Так же прозрачнее будет, ИМО.
Вообще, с этой hd как-то некрасиво.
252 1177386
>>77381
Так у тебя после второго цикла родителя/потомка получается, что выставляется значение семафора "читать нельзя", а при этом пишутся данные.
Зачем?
253 1177387
>>77377
>>77386
Так он не добавляет 1 к семафору же. S < 5 (выслано меньше пяти сообщений), а if(hd) засунуто в else к первому условию.
254 1177450
>>77300
Потому что нужно выделять на байт больше и дописывать \0 в конец. А вот calloc() там в хуй не уперся, все равно fread() все затрет.
255 1177494
>>77387
А может быть так, что родитель ни разу не даёт потомку ресурс, а потом в конце if(hd) и ставит семафор 1 в единицу, а потомок потом получает ресурсы, но уже не читает?
Я понимаю, что ты несколько раз прокрутил, но всё же...
256 1177520
>>77450
Это первое, что я нагуглил и проверил (выделил calloc'ом size+1 элемент), не сработало.

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

> не сработало


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

> что делают нормальные люди, если требуется распарсить


Берут flex или его отродья. Хотя такое и вручную несложно написать.
изображение.png19 Кб, 812x716
258 1177644
>>77494
В общем, я понел. Пока потомок форкается - предок успевает уже все прокрутить, сам с собою поговорить, удалить семафоры и завершиться. Похоже, что способ снхронизации надо переделать.
Screenshot3.png14 Кб, 626x503
259 1177651
>>56306 (OP)
У вас ссылка не рабочая.
изображение.png23 Кб, 812x716
260 1177698
В общем, спасибо всем за помощь, таки синхронизировал. Пришлось сделать три семафора, и жопой чую, что можно было проще. Если кто подскажет, как это упростить - буду благодарен.
https://pastebin.com/grPm2q6A
261 1177769
>>77698
Гораздо проще это с помощью select делать.
262 1177797
>>77698
Вообще, у тебя основная сложность из-за того, что ты долбишься с тем, что у тебя +-1+1-1+-+-1 везде. Абсолютные бы значения, а не смещения.
semctl умеет в SETVAL и GETVAL, ты можешь
помирить родителя и потомка на том, что если один записал, то значение P, если другой записал, то значение C, в противном случае ноль.
А от 0 до SETVMX можно организовать битовые масочки на "родитель может читать",
"родитель может писать", "потомок может читать", "потомок может писать".
Но это всё очень абстрактно, сам так не делал.
263 1177846
>>77698
Еее, многопоточность.
264 1177857
>>77846
Многопроцессность , что в Линухе довольно схоже
# OP 265 1177879
>>77651
Спасибо.
266 1178078
аноны помогите нуфагу разобраться в коде пжалста, (https://pastebin.com/t27m9qKh)

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

> BYTE b = (BYTE)&k;


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

> if(++j==16&&i<398){


Распечатывается хексдамп начиная с переменной выше. Зачем в условии вторая часть, я хуй знаю, а первая часть нужна, чтобы втыкать конец строки и (неправильно) печатать адрес после каждых 16 байтов.
268 1178487
>>77300

>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);
}
269 1178500
Посоветуйте техник парсинга файлов.
На-до-е-ло.

> просрал символ


> просрал разделитель


> EOF появился неожиданно


> недозаполнил и мне норм


> исправил пункты 1-4, но функция парсинга использует 100500 флагов состояния и занимает треть программы

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

>>78500
Уже советовали flex.
272 1178551
>>78500

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


recursive descendant
273 1178568
>>78500

>парсинга файлов


коких файлов? со смайликами или бинарными залупами?
274 1178621
>>78568
Строки ASCII-символов.
275 1178789
>>78621
Разделяй их на пробелах.
276 1178952
>>78524
Кажется вы там замороченой хуйни насоветовали. Можно же вывести printf("%s\0", buf);
277 1179127
>>78952
Строка -- это массив char@, заканчивающийся нулем.
printf("%s\0", buf) говорит: выведи мне строчку buf, потом добавь "\0".
Принтф начинает писать buf. Пишет, пишет, пишет, далее варианты:
1. Залезает в запрещенную область.
2. Упирается в случайно найденном в мусоре 0.
В первом случае шлет нахуй, во втором кроме сроки выводит всякое говно.
278 1179132
>>79127
Уговорил чёрт языкатый.
sprintf(buf1, "/%%ds\0", size);
printf(buf1, buf);
279 1179133
>>79132
фиксить не буду, нутыпонел.
sage 280 1179146
>>78952
>>79132
Лолшто?

На самом деле достаточно fwrite(..., stdout), но мы говорили о строках.
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?
282 1179535
>>79357
Я чот не понял, как ты 9 бит используешь в одном байте?
283 1179539
>>79535

> uint16_t


Действительно
Я та мтроеточие ставил, что 7 оставшихся не писать.
Забейте, чуда не случилось, я обосрался в другом месте.
284 1179540
>>79357
Запусти дебаг и отследи все, можешь промежуточных переменных добавить.
И не еби мозги.
285 1179543
>>79539
Да ты по всем фронтам обосрался. Тебе нужно работать с отдельными байтами по 8 бит, использовать можно тип short. Так то по теме проверки бит на чёткость уже кучи материала, но блядь, это же не строка чтоб сразу сравнивать все 9 из 128 бит.
286 1179544
>>79543
Падажи, uint16_t это 16-битный.
287 1179545
>>79543
И short на наших современных x86_64 чаще всего int16_t, не? А то и больше.
sage 288 1179547
>>79357
Все должно работать. Разве что твоя нумерация битов с единицы сбивает с толку, но она у тебя консистентная, поэтому не приводит к проблемам.
289 1179550
>>79544
Пардон, попутал.
290 1179551
>>79545
Мне кажется что int16_t это нечто другое. Впрочем не вижу смысла использовать именно его. Почему бы не копнуть в сторону bit field?
sage 291 1179552
>>79551

> Впрочем не вижу смысла использовать именно его.


Например, есть ограничения по памяти. А так бы я тоже предложил unsigned int или хотя бы что-то типа uint_fast16_t.

> Почему бы не копнуть в сторону bit field


Внутри одной программы вполне норм, хотя и сводится к асболютно тому же коду, что и проверка побитовыми операциями. Плюс установка двух-трех флагов за раз вручную может оказаться дешевле битфилдов. Но битфилды непереносимы, т.е., если у >>79357 сетевые пакеты, то ему все равно придется доставать флаги из битфилдов и паковать в инты для передачи по сети.
292 1179554
>>79552
Ненужно. Битфилды сформированные из инта будут интом и там и там, разница проявится если разная архитектура и внезапно инт не 32 бита а меньше или больше.
sage 293 1179555
>>79554

> Битфилды сформированные из инта будут интом


Вот только порядок и выравнивание будут отличаться от компилятора к компилятору.
294 1179556
>>79555
Нахуя это учитывать?
sage 295 1179562
>>79556
Ну что ж ты тупишь? Ты написал свой Телеграм, Вася скомпилировал его вижуал студией под x86, а Петя - gcc под Байкал. У Васи первый флаг располагается в младших битах, а у Пети в старших, и вы не можете даже поговорить об этом, потому что из-за этих различий вы по сути пользуетесь разным протоколом.
296 1179563
>>79562
Так это же нормально иметь под байкал отдельную версию ПО или не? Насколько я знаю архитектура почти гарантия совместимости и правильного межпроцессорного взаимподействия.
sage 297 1179564
>>79563

> отдельную версию ПО


Ну да, давай велосипеды по двадцать раз переписывать, вместо того чтобы просто сделать flags & SOME_BIT.
298 1179566
>>79564
Нет, давай лезть на более низкий уровень имея те же операции в более высокоуровневом представлении.
sage 299 1179570
>>79566

> давай лезть на более низкий уровень


Давай. Мы пишем на языке, который именно для этого сделан.
300 1179572
>>79570
Ебать ты пряник. Он сделан чтоб ассемблер упростить, а не наоборот.
301 1179575
Что вы тут срётесь, в C главное переносимость и унификация записи. Весь C пропитан унификацией, как бы вы ни принюхивались, ничего другого здесь нет.
302 1179579
>>79575
Моца цопе!
sage 303 1179586
>>79575

> переносимость


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

> Весь C пропитан унификацией


C пропитан неопределенным поведением, ты перепутал. Тту даже принюхиваться не нужно.
304 1179588
>>79586
тут-туру
305 1179589
Аноны, не по теме конечно, но есть у меня код просто нереально простого чатобота на js, куда бы его разместить? Могу на си портком сделать.
sage 306 1179592
>>79588
Именно. Запускаешь такой свой хелловорлд на DSP с CHAR_BIT=16, и видишь, как твои бананы медленно превращаются в желе.
307 1179593
>>79586

>каком-нибудь Python заработает на новой машинке без модификаций


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

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


Можно ссылку?
311 1179612
>>79596
OpenCV, Qt и прочее
312 1179613
>>79611
Это не на ютубе дебич, а настоящий человек.
sage 313 1179614
>>79596

> Нет ли бибилиотеки реализующей всю это пвсеводнизкоуровневую хуету искаропки


Вообще, сейчас модно брать 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-структуру, и сама она может обращаться к ее полям, а юзер видит только непрозрачный указатель (хэндл).
314 1179615
>>79612
Даже жопнцв пока прикрутишь..
315 1179619
>>79615
ленивая жопа, бери йобареколер, который тебе фреймы будет кидать в папку и считывай от туда своим хелоувердом не забывая удалять
316 1179622
>>79619

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


рекодер
317 1179623
>>79614
>>79619
Ты не понял моего бугурта. Вот есть структура - про неё много чего написали, но упомянуть что она мне нахуй не нужна, забыли.
А я блядь ебусь и 3 дня читаю гугл как эту структуру заполнять, где брать, куда объявить и т.д., чтобы узнать от онона, что эта хуйня может просто висеть где то там и напрягаться по её поводу моветон.
318 1179624
>>79623
Вот надо тебе окно - получай ебалу с гибкими настройками вместо #include vsyaHuinya.h createwindow("заголовок",x,y,w,h);
И у винды это ещё по божески, GTK это вообще пиздец.
319 1179626
>>79624
Чувство такое что проектировалось это умными, но наглухо отбитыми придурками и не для людей.
320 1179629
>>79623
кокая структура? может это она тебе не нужна. но винапи говно, это да. вне контекста задачи, твой бугурт нищитовый.
sage 321 1179630
>>79623

> А я блядь ебусь и 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 и все.
322 1179632
>>79626
проблема гтк в том, что они хуярят в ооп стиле на си. шли бы путем тикла.
323 1179634
>>79630
Не вижу ни слова про то что можно неиспользовать эту ебалу. Читал я msdn, затем метался в гугл из за таких же строк, что мол так и так используй это и это, а где взять - а хуй его знает, начинай с первой страницы msdn, вдруг встретишь.
324 1179636
>>79632
Есть у меня одно тёплое воспоминание о GTK, это cairo. Вот уж API проще не встречал, всем бы на него равняться.
325 1179645
>>79634
есть джва тома книжек про погромирование под вындовс 95 на винапи, читай, они актуальны, там все разжовано. настоящие погромисты на столько круты, что ответов на их вопросы в интернете нет.
sage 326 1179646
>>79596
https://pastebin.com/kp4EaUgc вот тебе минимальный пример. Он говно по многим причинам, но из этого уже можно что-то слепить и/или перейти на нормальный метод когда-нибудь позднее. Компиляция: gcc file.c -luser32 -lavicap32, в студии аналогично (user32.lib, avicap32.lib).
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
328 1179649
>>79647

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


https://msdn.microsoft.com/en-us/library/dd756879(v=vs.85).aspx

наркоман, уходи.
329 1179650
>>79646
Вот пример минимальный, в котором хотяб понятно где 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
329 1179650
>>79646
Вот пример минимальный, в котором хотяб понятно где 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 330 1179651
>>79647

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


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

>https://msdn.microsoft.com/en-us/library/dd743891(v=vs.85).aspx


Спасибо кончено. Но я наверное просто не создан для всей этой залупы. Мой уровень это purebasic, не более, всё что сложнее просто перегружает мозг.
sage 332 1179655
>>79653
Моя ссылка недостаточно правильная. Вот тут >>79649 про макрос, он проще для понимания.
333 1180787
Эх щас бы в 2К19 винапи ковырять...
334 1180827
>>80787
Чому ни? Загугли nirsoft, я когда вижу эти охуенные утилиты весом пару десятков килобайт, но с UI и мощным функционалом, аж трясет от восхищения за того программиста, кто это все дело пилит.
sage 335 1180843
>>80787
Эх, щас бы в 2K19 дотнетоговно напрямую с ядром работало.
336 1181147
А в чем разница между char * = "huj" и char[] = "huj";
337 1181149
>>81147
Второе работает?
340 1181189
>>81147
char*: создает указатель, который указывает на литерал, лежащий в секции данных. Ты можешь изменять сам указатель, но не можешь писать по указателю - строковые литералы ридонли.
char[] создает массив достаточного размера, чтобы скопировать в него литерал (и копирует его туда). Так как это массив, то ты, конечно же, можешь изменять содержащуюся там строку.
341 1181196
Чем си может быть лучше плюсов в 2к17?
342 1181198
>>81196
Си можно выучить на приемлемом уровне менее чем за 10 лет. При этом ты будешь знать, что происходит в коде, а не предполагать.
343 1181200
>>81198
А где его сейчас используют? (Кроме GNOME(Слава XFCE)
344 1181201
>>81200
ОС, либы, embedded, прикладной софт тоже иногда.
345 1181205
>>81196
Жрет меньше ресурсов. Это критично для встраиваемых систем.
346 1181215
>>81205
Плохой аргумент. На крестах все еще можно писать в си-стиле.
347 1181226
>>81215
Ты когда-нибудь программировал микроконтроллеры, где килобайты рам можно по пальцам пересчитать?
348 1181234
>>81226
Конечно. Ты понимаешь, что g++ и gcc выдадут тебе идентичный код, если ты не будешь использовать в крестах многие крестовые фичи? При этом ты можешь, продолжать пользоваться теми фичами, которые на код напрямую не влияют, а жизнь проще делают.
349 1181238
>>81234
Ну хз, у нас все на си ваяют. Возможно потому, что проще потом лицензировать (авионика), а не из-за возможностей языка.
350 1181239
>>81238
Так я об этом как раз и сказал выше - стандарт в разы меньше, вариантов хитровыебанного поведения меньше, осилить проще и проверить проще.
351 1181363
>>81189
Стоит дополнить, что в первом случае можно изменять сам указатель, а во втором имя массива является константой.
352 1181365
>>81239

>стандарт в разы меньше


Как будто ты его хоть раз открывал
353 1181366
>>81363

>имя массива является константой


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

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


Не нашёл такого в 6.4.5 String literals
Где это написано?
355 1181428
Посоветуйте справочник для winapi.
356 1181429
>>81428
Советуем справочник для winapi.
357 1181430
>>81429
Он мне не нравится.
358 1181431
>>81429
Cпасибо!
359 1181443
Как врубить поддержку кириллицы в спермянской консоле? Использую GCC.
360 1181603
>>81366
Он имел в виду, что можно ptr++, но нельзя array++, т.е., массив можно рассматривать как константный указатель на его первый элемент.

>>81369

> Где это написано?


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

> 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.



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

>>81443
Сохраняй исходник в UTF-8, собирай с -fexec-charset=866, потом когда-нибудь научишься делать правильно (возможно, в CRT и консоли винды к этому времени как раз появится полноценный UTF-8). Можешь собирать без -fexec-charset, но запускать в помершелле, он умеет в UTF-8 после chcp 65001. Можешь поставить себе ConEmu, он тоже в UTF-8 может.
361 1181604
>>81443
В нотепаде++ пишешь исходник в CP866
sage 362 1181605
>>81604
Бу! Сгинь!
363 1181608
[CODE]#include <stdio.h>

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

return 0;
}[/CODE]
Почему распечатывает ffffffd0? Почему бы не 000000d0?
364 1181609
>>81443
chcp 1251 - кодировка Windows
chcp 65001 - кодировка UTF-8
Иногда требуется выбрать для консоли другой шрифт.
365 1181610
>>81608
Потому что 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).

>>81609

> chcp 65001 - кодировка UTF-8


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

>И тут все виндусы кроме свежих билдов десяточки скажут "ой" при попытке вывести кириллицу.


Проверил на 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 выводит "АБВ".
368 1181629
>>81443
Кури про wchar и wprintf, нехуй ебаться с кодировками (методы советуемые на форумах работают от раза к разу) правда setlocale все равно надо использовать зато без ебли с настройкой консоли. Либо, если лень писать L перед каждой строкой, то в венде можно пользоваться нестандартной библиотекой tchar.h ну это уже сам кури.
369 1181637
>>81629

>L перед каждой строкой


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

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


но зачем?
hello.png168x68
371 1181738
>>81626
А у меня выводит:

> АБВ


> В


А вместо "Привет, мир!" выводится, например, пикрелейтед. И это тоже 7 со шрифтом Lucida Console. А стабильно оно только с десяточки работает.
372 1181766
>>81605
Зато работает
373 1181799
>>81766
-fexec-charset работает совершенно таким же образом, только не вынуждает хранить исходники в древней кодировке, создавая проблемы с IDE и системами контроля версий.
374 1181812
>>81738
Первый раз такое вижу. Обычно либо выводит русские буквы, либо квадратики.
И с chcp 1251 такое же?
У тебя какая-то сборка от васяна.
375 1181818
>>81812
C chcp 1251 ок или крякозябры, в зависимости от кодировки выводимых байтиков. Винда - чистая тестовая виртуалка. Более того, с chcp 65001 и WriteFile, к которому сводится твой printf, и WriteConsoleA иногда (а на XP - всегда) фэйлятся и не выводят вообще ничего, поэтому приходится идти длинным (зато надежным) путем. Делается кастомный yoba_printf, который с помощью MultiByteToWideChar преобразует UTF-8 в UTF-16, который уже выводит с помощью WriteConsoleW, и вот с UTF-16 проблем никаких нет, вне зависимости от кодировки, выставленной chcp.
376 1181824
>>81818

>Винда - чистая тестовая виртуалка.


А, тогда ясно. Нужно ставить Microsoft Visual C++ redistributable package.
На древней msvcrt.dll могут быть любые аномалии. Она родом с XP, где UTF-8 нормально не поддерживался.
В десятке видимо обновили.
377 1181831
>>81824
А CRT-то каким местом? Тут же нет разбора строки - %s просто копирует символы в stdout пока не встретит \0, а stdout сводится к _write, а _write к WriteFile. Вот если бы я toupper делал или strtok какой-нибудь, или хотя бы %.2s, тогда да, CRT могла бы что-нибудь испортить.

Но ты меня заинтересовал, попробую отладить когда-нибудь и посмотреть, почему такое поведение. Ты чем собирал? Студией?
sage 378 1181834
>>81824
И да, msvcrt - дефолтный рантайм Visual C++ 98, оно же VS6.0. Ее, конечно, обновляли, но родом она еще из маздая.
379 1181874
>>81603

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



:facepalm:

>> Где это написано?


>Именно там и написано.


Да, чёт проглядел.
380 1182052
>>74146
Почти.
381 1182057
Дайте идею для проекта небольшого на си.
382 1182058
>>82057
Рыбья головёха?
383 1182059
>>56306 (OP)
Есть кто с мгу? Слейте лабы по с/с++ с меня как обычно
384 1182067
>>82059
Рыбья голова)
385 1182079
Посоны, а что, шланг до сих пор не обзавёлся своим crt? Почто он гццшные crtbegin.o и libgcc требует?
386 1182173
Антоны. Я сделал прогу на winapi, которая должна была менять курсор на рожу моего бати, чтобы его выбесить. Но курсор вовсе пропал и не появляется даже после перезагрузки. Что не так, пиздец.
387 1182174
>>82173
Ты приёмный.
sage 388 1182175
>>82079
Не обзавелся, не вижу в этом ничего плохого.

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

>управления


Не работает даже так.
390 1182271
>>82174
Поржал всем офисом)
391 1182291
Есть еще те кто использует #pragma pack?
392 1182305
Антоны, если я объявлю в структуре подряд несколько переменных, то они будут распологаться подряд, а если я объявлю их просто внутри функции main(), то их может раскидать по памяти?
393 1182323
>>82291
Да. Упакованные структуры иначе не опишешь.

>>82305
Да, переменные компилятор может раскидать (в пределах кадра стека, ествественно, если они автоматические), сдублировать, положить в регистры или вовсе удалить.
394 1182329
Зачем нужны битовые поля?
395 1182332
>>82329
Некоторые люди не могут в побитовые операции, битовые поля проще, удобнее и иногда даже быстрее.
396 1182347
Мне нравится Windows API.
397 1182348
Мне нравится JavaScript.
398 1182349
Я ем говно.
399 1182768
Сап, двач.

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

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

Есть такая функция в стандартной библиотеке и как называется? А то может я и ищу то, чего нет.
400 1182779
>>82768
вроде нет, поскольку я велосипедил подобное сам, но там легко и реализаций миллиард
https://github.com/JeffBezanson/cutef8/blob/master/utf8.c
401 1182785
>>82779
Знаю, что легко, но хотел найти какой-то общий стандарт, чтобы не пилить велосипеды. Если нет, то напишу сам.
402 1182792
>>82768
А чем переводишь? wctomb говорит, сколько символов нужно - просто просуммируй результаты. Но велосипед будет быстрее.
sage 403 1182795
>>82768
Алсо, я бы на твоем месте не выделывался. Длиннее 4 байтов один code-point не занимает. Если у тебя суррогатные пары уже лежат в одном 32-битном wchar_t, тогда два раза по 4 байта на символ максимум. Выделяй сразу столько, точно влезет, и не нужно будет заниматься бесполезными подсчетами.
404 1182803
>>82792
wctomb, вроде бы, каждый символ отдельно передавать нужно. Я пробовал wcstombs, но он мне постоянно -1 на выход даёт, если в строке есть кириллический символ. Почему так, я разобраться не смог.

>>82795
Тоже вариант. Если нет стандартной функции, то либо так сделаю, либо велосипед накидаю.
405 1182840
>>82768
>>82803
Решил проблему.

Работу wcstombs я проверял в отдельном файле и забыл вызвать setlocale, поэтому он выкидывал -1 мне. При setlocale (LC_ALL, "") вызов функции wcstombs (NULL, str, 0) возвращает нужное количество байтов для строки в utf-8.
406 1183093
выручай ссач, пишу я такой прогу на си, ну и вызываю функцию sqrt() с аргументом. Начинаю конпелить, а конпелер ругается мол undefined reference to `sqrt'. Дело в том что при передаче в качестве аргумента обычного числа все нормально конпелится и возвращает квадратный корень, то что нужно. однако если в кчестве аргумента передается имя переменной или элемент массива конпелер выводит undefined reference to `sqrt'. выручайте я дно. Кстати ос ubuntu
407 1183095
>>83093
Наркомания
Проверь наличие <math.h>
408 1183096
>>83093
Алсо, тебе эту ошибку, случаем, не линкёр выводит?
Сделай -lmath
409 1183101
>>83095
math.h имеется
410 1183105
>>83093
-lm
довун
Screenshot from 2018-05-02 13-34-53.png101 Кб, 1280x1024
411 1183106
#include<stdio.h>
#include<math.h>
main(){
float b=4;
float a=sqrt(b);
printf("%.1f",a);
}
412 1183107
>>83106
gcc -lm
довун
413 1183108
>>83096

> -lmath


-lm
довун
415 1183111
>>83110
Обосрался
416 1183112
>>83110
Ди в ньюфаг-тред
довун
417 1183113
>>83110
gcc -lm c.c
418 1183114
>>83112
заебал скажи че сделать чтоб робило
333333.png102 Кб, 1280x1024
419 1183116
все равно
420 1183117
>>83116
gcc c.c -lm
421 1183118
>>83117
бля отдуши чувак. объясни плиз нахуя это нужно было прост в винде такого я не добавлял
sage 422 1183152
>>83118
В винде вся математика в CRT, в той же либе, что и printf и т. д., и она прилинковывается автоматически, по умолчанию. В линуксах отдельно, у них принято делать жизнь максимально неудобной.
423 1183156
>>83152

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



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

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



Линкуешь только то что нужно. Принцип разделяй и властвуй на шицо, но спермачи кукарекают что-то про неудобство.
424 1183159
>>83156
50мб хэлоуворд, кек.
sage 425 1183161
>>83156>>83159
У тебя по умолчанию динамическая линковка. Можешь все библиотеки мира подключить, это мало повлияет на размер получившегося файла.
426 1183164
>>83159
В сперме хелловорлд 50 метров? Лол. Ибо у меня в дебиане меньше 4Кб. Целый кластер потратил для теста, ёк макарёк.
427 1183172
>>83161

>все библиотеки мира подключить


И соснуть с переносимостью. Статическая линковка рулит.
428 1183174
>>83172
Ну и вали в свою эпоху a.out
429 1183175
>>83174
Валю, я даже Qt статически линкую
sage 430 1183219
>>83159
Хелловорлд в винде 8к, если динамическая линковка. Или меньше 200к, если статическая.

>>83156

> Принцип разделяй и властвуй


Зачем разделять, если это стандартная библиотека Си? Давай вообще от либ откажемся, будем линковать printf.o и malloc.o каждый отдельно.

> Линукешь только то что нужно.


На самом деле для выбора "что нужно" придуманы линкеры.
431 1183235
>>83219

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



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

>Или меньше 200к, если статическая.


Рантайм не забудь скачать и установить
433 1183299
>>83118

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


"так сложилось исторически"
434 1183344
Может ли Rust заменить Сишку? Избавляет от кучи проблем с памятью, соответственно багов и дыр в безопасности меньше
435 1183346
>>81147
Разница чисто визуальная.
436 1183380
>>83235
Нашёл чем гордиться. Шо то хуйня, шо это хуйня. Надо иметь статические бибилиотеки на каждую функцию и линковать автоматически, ато развели ебалу.
"кококо хочу подключаю хочу неподключаю" - Ты же и так знаешь что подключить придётся, по тому что ты функцию используешь в коде, а не по тому что у тебя гибкая система настроек и свобода действий.
437 1183530
>>83346
В ньюфаг-тред шагом марш!
438 1183531
можно вместо
gcc c.c -lm
пейсать
gcc -O2 c.c
Тогда sqrt вместо вызова функции будет реализован инструкциями копро-цессора, на месте.
-O1, -Os и -O3 тоже подойдут.
439 1183532
>>83531
Но это не гарантировано. Так что лучше -lm
440 1183603
Почему вы до сих пор не перекатились в энтерпрайз на какой-нибудь джаве? Неужели вам так нравится железо, что готовы получать в 2 раза меньше, при чём прикладывая больше усилий? Я бы так не смог
sage 441 1183738
>>83265
Да я лучше в дворники пойду, чем в интерпрайзы на джавах.
442 1184167
>>83110
Убунтодебил, уходи.
443 1184172
>>83603
Я стал php-developer.
444 1184720
Анончи, напомните как называется версия майкрософтовского конпелятора без ИДЕ?
445 1184727
>>84720
Visual Studio Build Tools, ставится через инсталлер обычной Visual Studio.
446 1184755
>>84727
Вангую, студия мне говна всякого наставит, а я чистое хочу, как 2015 тулс.
910365.jpg1,1 Мб, 1920x1080
447 1184778
Господи я отпишусь в этом треде. Си - Бог всех языков. Лично я учил Си по Великой книге K&R. Задает вам навык программирования на всю вашу жизнь. Воистину, язык Богов.
448 1184793
>>84778
Си — ненужное говно без задач.
449 1184796
>>84793
Борщеязычки говно без задач, а на сишке весь мир держится.
450 1184797
>>84778
Двачую этого дZенствующего.
451 1184857
>>84755
Окей, ставишь билдтулзы с говном на виртуалку, забираешь оттуда PSDK и компиляторы. Профит.
array.png47 Кб, 1502x831
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. Почему? Мб, я как-то неправильно понимаю?
453 1185053
>>84987
Давай разберемся, что такое errors.
Errors - это массив указателей на char.
Принтф получает на вход УКАЗАТЕЛЬ НА char, и обрабатывает егоименно так (у тебя там %s же, это важно!). Поставь там %i какой-нибудь и получится число.
454 1185071
>>84778
Ну есть в сишке указатели-хуятели и дальше чё? Как ебля с указателями и освобождением памяти прокачает мой скилл в программировании в общем?
Ну вот я джавист, прочитал недавно K&R и Прату чисто в академических целях. Никак я свой навык не улучшил. Углубился в старину, посмотрел как писали раньше проги и всё.
Ты просто студент без реального опыта работы, который потратил какое-то время на сишку, в отличие от своих друзей, которые дрочили питон какой-нибудь, и возомнил себя ебать гуру.
Решают структуры данных, алгоритмы, архитектура. Твоя сишка нахуй не нужна для навыков. Сишка в современном мире - крайне узкоспециализированный язык. Изучать её нужно либо для конкретной работы, либо полистать пару книжек для экскурса в историю. Всё, больше Си тебе ничего не даёт. Это просто изкоспециализированный инструмент.
sage 455 1185073
>>85071

>я джавист


Дальше не читал. Иди дальше абстрактные фабрики абстрактных билдеров пиши, чмоха.
456 1185077
>>85073
Как же байтослесари триггерятся на джаву)))) Я всё понимаю, потратить на обучение в 3 раза больше времени, и получать в 2-3 раза меньше - конечно это обидно. Остаётся только писать на двачах, что Си - это ебать орудие Богов.
457 1185101
>>84987

> чему? Как я понимаю, чтобы сообщения выдавались, необходимо в 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. Ну и выводит полученные символы, конечно. Поэтому ты видишь текст, а не число.
458 1185121
>>85053
>>85101
А, да, все верно. Перечитал ваши сообщения и понял, какой странный и глупый вопрос я задал, учитывая то, что понимаю, как это работает. Вот к чему недосып приводит. Хотя сам я почему-то минут 40 сидел над рисунком и все никак не мог понять
459 1185132
>>85101

>А %s берет свой аргумент arg, считает его указателем, и разыменовывает его...


Вот, теперь точно понял, что именно меня вводило в заблуждение. Я раньше не знал (или не задумывался), что %s разыменовывает указатель. Теперь все точно ясно. Вопрос закрыт. Чуть головой не поехал
460 1185167
>>56306 (OP)
https://pastebin.com/tMRF7673
ребят посмотрите код плиз , у меня вопрос , можно ли передать в функцию указатели , так что бы по такому выражению она выделила память ,просто если вставить этот кусок (array = (double@@)malloc(sizeof(double@)@ROW);)в функцию, он отработает , но выдаст ошибку сигментации
461 1185174
>>85167
Не совсем понятно, чего ты хочешь. У тебя в текущем виде программа должна более-менее работать. Хочешь переместить выделение памяти в input_date? Тебе придется тогда как-то вернуть массив. Например, передавать double ∗∗∗array_ptr и после маллока делать ∗array_ptr = array. Или просто возвращать из функции double∗∗, делая return array, а аргумент убрать просто.
462 1185197
>>85174
аааа, понял спасибо , а программа и так хорошо работает
463 1185424
У меня есть указатель void ∗ptr на массив из структур smth.
У меня есть sizeof(smth).
Как надёжно попасть на i-ый элемент массива?
Я же не могу просто сделать так:
smth_tmp=∗((char ∗) ptr+sizeof(smth))
верно?
464 1185426
>>85424

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

465 1185428
>>85424

> Я же не могу просто сделать


Можешь, только левая звездочка там лишняя. Ты либо:
smth foo = ∗(smth ∗) ((char ∗) ptr + ...);
либо
smth ∗bar = (smth ∗) ((char ∗) ptr + ...);
Но лучше скастить к указателю на smth и прибавить i:
smth foo = ((smth ∗) ptr);
smth ∗bar = (smth ∗) ptr + i;
466 1185429
>>85428
Я структуре присваивал, а не указателю, я просто типа не написал. Оттого и левая звздочка, спасибо.
467 1185433
>>85428
Алсо, в моём случае функция не будет знать типа, т.е. ей передадут только size_t от sizeof(given_type). Так что способ один для меня применим, в отличие от второго.
468 1185769
Как передать во функцию аргументом, безымянный массив?
void foo(...,float c[3]){...} ==>
foo(...,{1.0f,1.0f,1.0f}); - вроде раньше так делал, а сейчас забыл.
469 1185782
>>85769
Тип забыл. К чему литерал-то кастить? Вот так:
foo(..., (float[3]) { 1.0,f 1.0f, 1.0f });
470 1185788
>>85782
О точно! Благослови тебя Сибог
471 1186348
Можете посоветовать годный компилятор для 16 битного real memory mode?
472 1186365
>>86348
Любой. Они все говно. Я предпочитаю борланд, можно ватком, но ватком - это целый свой мирок со своими закидонами.
473 1186367
>>86365
Ну мне хотя бы чтобы работало. В gcc с флагом на 16 бит будет не то?
gcc-m16.png27 Кб, 527x560
474 1186381
>>86367
Я вообще не знал, что оно умеет в 16-битный код. Будет не совсем то - с 32-битными регистрами, вон даже какой-то MMX проскочил с -O3. Но запуститься - запустится, наверное. А что за задача у тебя? Тебе точно нужен современный компилятор для ее решения?
475 1186384
>>86381

>А что за задача у тебя?


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

>Пиши на асме


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

>На Си ты охуевать будешь гораздо больше


Ну с указателями проще...
480 1186430
>>86398
В ассемблере у тебя больше контроля. А тут ты будешь ебаться с теми же сегментами, отличать 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++; }

Больше там ничего нет, в этом твоем стеке.
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).
А если я хочу передавать функцию с неизвестным заранее числом аргументов?
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).
А если я хочу передавать функцию с неизвестным заранее числом аргументов?
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).
А если я хочу передавать функцию с неизвестным заранее числом аргументов?
483 1186696
Надо переписать одну прогу с использования graphics.h и 16 бит под современные ОС. Пока думаю над использованием WinAPI для рисования, перехвата стрелок/Fn и прочего. Какие подводные? Алсо, еще надо одну программу с Паскаля так же переписать, но там проблем ожидается поменьше.
484 1186893
>>86675

> Этот код, конечно же, не работает, в res записалось чёрт-те что.


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

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


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

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

>>86696

> Какие подводные?


Если собираешься переписать только graphics - поебешься с циклом обработки событий, наверняка придется городить еще дополнительные doevents() в самых неожиданных местах. В целом, это достаточно быстро все портируется. Если собрался переписывать саму прогу, то подводных никаких, но это дольше.
485 1186920
>>56306 (OP)
Работа есть? Смогу прогать мк на военном предприятии? А может быть даже смогу работать дома?
486 1186961
>>86920
Работа есть, крупные города или не эта страна. Про удаленку и не мечтай. К околовоенным не суйся, у них на строчку кода десять страниц пояснений и согласований.
487 1187147
>>86920

Работы вообщем-то дохуя и больше. Все серъёзные фреймворки так или иначе имеют высокопроизводительные части, работающие на C. В эпоху опенсорса все лежит на гитхабе. Увлекайся, разбирайся, форкь, улучшай и тебя рано или поздно позовут работать в буржундию или на удалёночку.
488 1187210
Насколько всирают всякие кодогенераторы для кортексов чисто сишным прогам?
489 1187212
>>87210
Генераторы чего и из чего?
490 1187226
>>56306 (OP)
Друзья, вощем не могу придумать алгоритм решения задачи:
есть дерево с файлами и .txt, на вход функции дается корень, каждый .txt содержит символическую(ие) ссылку(и) на другие файлы того же дерева, или тупик, или приз.
Нужно найти путь к призу.
Сразу понятно, что нужно рекурсивно пройти дерево файлов, а вот как обрабатывать *.txt?
мб кто-нибудь встречался с подобной задачей?
491 1187227
>>87212
CubeMX тип
492 1187230
>>87227
Так оно инициализацию генерит, вот тебе не похуй, какой там код.
493 1187232
>>86675
указатель на функция гугли. Берешь инициализируешь как переменную указатель int (*fun)(int , int);
при этом у тебе описана функция с такими же аргументами
int function(int a, int b){
return a+b;
}
теперь просто передаешь указателю функцию :
fun=function;
теперь можешь как аргумент пихать указатель.

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



если несколько аргументов то <stdarg.h> поможет
494 1187235
>>87232
А мусорные переменные-то зачем создавать? Он вон напрямую передает, как человек, а ты какую-то бесполезную ебанину советуешь.
495 1187236
>>87235
не заметил я просто, саня хуй саси
496 1187386
>>86893
А если указывать указатель на указатель на функцию?
Число аргументов всё так же требуется?
497 1187393
>>87386
Описание аргументов требуется не потому, что нехороший Си запрещает указатели на функции с неизвестными аргументами. Просто при вызове функции эти аргументы нужно как-то передавать, а для этого нужно знать их типы, а каким-то другим путем (через астрал?) узнать в рантайме, что вот эта конкретная вызываемая тобой функция хотела первым параметром char вместо int - невозможно. Поэтому Си в таком случае делает лучшее, что он может: определены default argument promotions (например, вместо char будет положен int, а вместо float - double), передаваемые аргументы неявно кастятся к своему дефолтному типу. То же самое делается для необязательных аргументов variadic-функций типа printf - там информация о типах тоже недоступна. Если вызываемая тобой функция именно этого всего и хотела, то все заработает. Если хотела float, а прилетел double - ну ты видел, чем это заканчивается.

> А если указывать указатель на указатель на функцию?


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

> Просто при вызове функции эти аргументы нужно как-то передавать, а для этого нужно знать их типы, а каким-то другим путем (через астрал?) узнать в рантайме, что вот эта конкретная вызываемая тобой функция хотела первым параметром char вместо int - невозможно


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

>по историческим и архитектурным причинам возможны ситуации,


А можешь рассказать поподробней?
499 1187424
>>87423

> А можешь рассказать поподробней?


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

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


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

>Как-то же они умеют и могут в это.


Там не явно предается информация о количестве параметров. В Си есть VA_ARG, е еще лучше съеби и не еби господам мозг.
501 1187456
>>87393

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



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

>который учил не Си, и не кресты, а некий "си с классами".


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

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

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



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

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

Именно.

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

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

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

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



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

Алсо, тред пора перекатывать.
506 1187520
>>87480
Слишком категорично. Но да, JIT предполагает знание о системе и выход за пределы стандарта Си.
508 1187543
>>87490
А ничего что в этой параше int()() вызывается как int()(int, int)?
509 1187838
>>87543
Ничего. Пустые скобки в Си (но не в крестах) означают, что информация о типах и количестве недоступна. Мы там выше обсуждали.
510 1187935
>>87838
Ничего себе метапрограммирование в крестах. А если у меня эта функция перегружена числом параметров, компилятор разберется и вызовет то что нужно?
511 1188833
Глупый вопрос, но все же спрошу. Допустим, имеется глобальная переменная p = 6;
Пишу условие if ((p++) == 7) { ... }
В таком случае p будет инкрементировано только в рамках условия if, т.е. p увеличится на 1 и сравнится с цифрой 7, а в глобальном значении останется 6, так? Или же будет инкрементировано на единицу, и уже глобально будет иметь значение 7 во всей программе после проверки условия?
512 1188837
>>88833

> в глобальном значении останется 6, так


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

> p увеличится на 1 и сравнится с цифрой 7


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

Алсо, у нас новый тредик уже >>1187521 (OP).
Тред утонул или удален.
Это копия, сохраненная 13 июля 2018 года.

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

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