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

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

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

Что читать:

- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: 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 2015 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.

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

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

Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.

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

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

Stephen G. Kochan "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://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
- https://arhivach.org/thread/155908/
- https://arhivach.org/thread/173837/
- https://arhivach.org/thread/180461/
- https://arhivach.org/thread/182958/
- https://arhivach.org/thread/188294/
- https://arhivach.org/thread/193780/
- https://arhivach.org/thread/198868/
- https://arhivach.org/thread/206632/
- https://arhivach.org/thread/211714/

Шапка: http://piratepad.net/bJ1SdmkZyu
#2 #869915
Ура, товарищи.
#3 #869924
В чём профит голого C?
>>869927>>870685
#4 #869927
>>869924
Ибо воистину, первый язык. Основа основ.

Все стандарты (OpenGL, OpenMP, OpenCL (API настройки девайсов, не сам язык для их программирования) ) написаны под него.
#5 #869968
int main(int argc, chat argv[][])
{
потом закрыть не забудьте
#6 #869971
>>869968
}

закрыл азазаза
>>870029>>875596
#7 #870029
>>869971
Нещитово
16 Кб, 1200x624
#8 #870044
>>869911 (OP)
Анон, как мне сменить язык с С++ на просто С, я ультраньюфаня
>>870045>>870231
#9 #870045
>>870044
Это невозможно, придется тебе учить плюсы. Извини.
Это была си шутка. Просто создайфайол с расширением .с
>>870048
29 Кб, 1201x621
#10 #870048
>>870045
Сразу еще один вопрос, почему программа не выполняется? Я жму "скомпилировать и выполнить" и выходит эта ошибка? Что не так делаю
#11 #870054
>>870048
А, все, разобрался
#12 #870064
>>870048
Кто так пишет исходный код? Не будь макакой, приучайся писать нормально.
1. Где форматирование? IDE не поддерживает автоформатирование - делай вручную.
2. Название файла кириллицей - из-за этого однажды утром ты можешь не проснуться. Подумой.
3. Нет проверки введённых значений. А вдруг ввели белиберду. Проверь, чтобы scanf возвращал единицу.
4. Если кодишь под Windows - __try, __finally, __except.
>>870113
#13 #870113
>>870064

> Если кодишь под Windows - __try, __finally, __except.


Ты зачем новичков плохому учишь?
>>870128
#14 #870128
>>870113
Что плохого в обработке исключений?
>>870138
#15 #870138
>>870128
антипаттерн
>>870140
#16 #870140
>>870138
Ой да ладно тебе, кто в твой код заглянет? Пиши как умеешь, расшумелся тут.
#17 #870142
Короче, надо заполнить массив случайными элементами целочисленного типа из заданного диапазона, вводимого пользователем.
Заполняю при помощи rand() без всяких примочек - если ввести одинаковые границы диапазона, вывод всегда будет одинаковым.
Если использовать сранд srand() со временем - выводятся одинаковые числа, я так понял, потому что генерируются одновременно.
Есть что простенькое, чтобы помочь мне выводить случайные целые числа, которые будут меняться каждый вывод и не будут совпадать (т.е. не будут закономерно совпадать)?
Простенькое, так как только начал изучать массивы, я грю уж про рандомные числа.
#18 #870143
>>870142
Ты перед каждым вызовом rand делаешь srand? Код показывай, из описания не разберёшь, что у тебя там за проблемы.
>>870145
1 Кб, 188x71
#19 #870145
>>870143
Я не делаю srand(), тамушта везде в тырнетах пишут сранд этот сраный со временем, что мне не подходит
>>870147
#20 #870147
>>870145
Или подходит?
Т.е. мне бы узнать, с какой точностью он время берёт для рандомизации
>>870165
#21 #870155
>>870142
Давай весь код с выхлопом. Используй pcg.
>>870157
20 Кб, 1138x539
#22 #870157
>>870155
Да держи, только расскажи, что за pkg.
И мне способ простой нужен, если ты не читаешь по-русски с первого раза
>>870161>>870163
#23 #870161
>>870157
Делай stand(time(NULL)); в начале программы.
Почему i <= 11? i < 12 должно быть.
>>870162
#24 #870162
>>870161

> Почему i <= 11? i < 12 должно быть.


Ты серьёзно? Это важно? Это действительно важно?!
И ты хотел написать srand(time(NULL)), верно?
Ок, сейчас запилю,
>>870168
#25 #870163
>>870157
Ну и где у тебя srand?

>способ простой нужен


http://www.pcg-random.org/
Скачал, заинклюдил один файл, вызвал две функции - куда уж проще.
>>870167>>870169
#26 #870165
>>870147

>мне бы узнать, с какой точностью он время берёт для рандомизации


srand - это начальное значение для генератора псевдослучайный чисел. Без него у тебя всегда будут одинаковые значения. В некоторых случаях полезно, но не здесь.
#27 #870167
>>870163

> Скачал, заинклюдил один файл, вызвал две функции - куда уж проще


Мне нельзя так делать, давайте в рамках ANSI C и без примочек, мне это ещё сдавать.
#28 #870168
>>870162

>Ты серьёзно? Это важно? Это действительно важно?!


Это очень важно. У тебя 12 элементов, самому проще будет.

>И ты хотел написать srand(time(NULL)), верно?


Именно так и написал, как хотел. Только ';' в конце ты пропустил. Не сконпелируется.
#29 #870169
>>870163
Сделал с srand, внезапно, всё заработало, а в прошлый раз были схожие значения
#30 #870231
>>870044

//Можно еще так:

#ifdef __cplusplus
extern "C" {
#endif

//...

#ifdef __cplusplus
}
#endif
>>870272
#31 #870272
>>870231
Это не влияет на язык, только на метод создания имен экспортируемых символов.
#32 #870316
Какую книгу прочитать, чтобы научиться писать красивый, с хорошей декомпозицией, многократно используемый код?
#33 #870373
>>870048

> conio.h

#34 #870384
Допустимо ли в 2016 году использовать глобальные переменные? Например, у меня есть функции, работающие с сокетами. Хэндл сокета я сделал глобальным, чтобы другие функции могли работать с ним. Или лучше передавать сокет как параметр функции?
>>870385>>870386
sage #35 #870385
>>870384

>Допустимо ли в 2016 году использовать глобальные переменные?


В допустимых пределах всё допустимо.
#36 #870386
>>870384

>лучше передавать сокет как параметр функции


Так ты как минимум сократишь возможность написать лапшу, в которой закроешь сокет раньше чем последний раз будешь в него стучаться.
#37 #870410
С чего лучше начинать, с сишечки или с питончика?
#38 #870435
>>870410

>С чего лучше начинать


с пива и беспорядочного секса
>>870452
#39 #870452
>>870435
Как же ты прав, анончик…
#40 #870486
>>870410

>питончика


Питухон для пидоров, начинай с Перла, он наиболее близок синтаксически к Сифактически интерпретируемый Си с плюшками.
>>870489
#41 #870489
>>870486

>Сифактически


хотел быстрофикснуть, но кекнул
#42 #870492
>>870410
Абсолютно похуй, с какого языка начинать. Гуманитариям питон лучше идет. А вообще, питон и сишечка превосходно друг друга дополняют.
>>870522
#43 #870522
>>870492

>питон и сишечка превосходно друг друга дополняют


Типа обмазанный ООП Путухон дополняет процедурный Си, ну хз.
>>870523
#44 #870523
>>870522
У нас в проекте кодогенерация и всевозможная поддержка билда на питоне, например.
>>870526
#45 #870526
>>870523

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


ну это модно и молодежно, не более.

а я прототипирую на перле, а затем практически перевожу один к одному на си.
>>870528
#46 #870528
>>870526
Питон читаемый, и его знают все. Перл знают только олдфаги, а написать на нем неподдерживаемый код можно даже случайно.
>>870531
#47 #870531
>>870528

>и его знают все


я не знаю

>неподдерживаемый код можно даже случайно


нельзя
#48 #870678
Есть вот такая лапша уровня LABA_XXX:
http://ideone.com/u1q82P
Меня устраивает почти всё, кроме одного.
Нужно, что бы если числа повторяются, то они выводились со степенью. Пробовал завести перменные, типа предыдущий делитель и count и сравнивать новый делитель с предыдущим, и т.п.
Но выходит какая-то хуита.
Как это реализовать?
>>870688>>870936
Dmitry #49 #870685
>>869924
В примитивности и скорости.
Но узконаправленные языки для узконаправленных задач быстрее должны быть, и есть.
Dmitry #50 #870687
>>869968
Поясните зачем это? Я ничего этой функции передавать не хочу, а если хочу то что передавать?
>>870692
Dmitry #51 #870688
>>870678
Каждое число сравнивать с всеми остальными, что уже сравнил исключай.
>>870723
#52 #870690
зигулю всем сисятым. давно мысль вынашиваю, ведь то что компилятор не знает что значение в свитч строго не может быть неправильным, типо ему не позволяет сделать тупо таблицу с указателями да. но можно ли как-нибудь пропихнуть эти знания до компилятора, например через assert(v >= 0 && v <= 10) к примеру, прокатит не? или нужно строга хуярить if'ы по харду? так то я могу и gcc'шным методом проредить но как-то в заёб городить макросы для совместимости (хотя видимо так и сделаю, не могу же я проверить выхлоп компилятора потому что жирный лентяй). я тут просто посчитал количество кейзов при удалении элемента из 2-3 дерева (4 на 1 элементного батю и 12 на 2х) и как-то дико прихуел пишу чисто в академический интерес.

кстати заебатые слайды тут: http://web.eecs.umich.edu/~sugih/courses/eecs281/syllabus.html

например http://web.eecs.umich.edu/~sugih/courses/eecs281/f11/lectures/10-Mway.pdf
>>870800
#53 #870691
>>870142
просто съебись с винды и используй /dev/random как царь. в общем-то, по сути не барское это дело, генерировать случайные числа. или как илатка любит поправятся, вынув изорта болт на время, псевдо.
#54 #870692
>>870687
например ключики передавать, и также путь до программы система передаст. ты совсем деревянный чтоль?
#55 #870723
>>870688
Я уже весь извертелся как мог, в голову уже ничего не идёт.
Тыкни носом пожалйста.
#56 #870782
Аноны, расскажите, сложно ли с вашего языка перекатываться на другие (java, python, ruby)?
Хочу изучать Си, как первый язык, так как он довольно интересный и монументальный.
Изучать хочу по расово правильной книги от отцов, правильно ли я поступаю, или стоит начать с чего то по проще?
>>870786>>870838
#57 #870786
>>870782
Правильно, дерзай.
#58 #870800
>>870690
Компилятор нормально делает таблицу, если вариантов не полторы штуки, а разброс значений не очень велик. Проверка верхней границы диапазона стоит всего две инструкции, это не слишком дорого.
>>870864
6 Кб, 488x158
#59 #870811
Сделал дамп одной криптованной программы, таблица импорта разрушена. С помощью какой-то программы восстановил соответствие адрес-экспортируемая функция:
00416C31: Directly-> 0C570000 : 77F06B7E : RtlEnterCriticalSection
Как и IDA создать таблицу импорта вручную? Или заменить адрес 7DE922B0 на осмысленный RtlEnterCriticalSection?
Самый простой способ, который вижу - создать комментарий с функцией с помощью скрипта. Но хотелось бы знать, вдруг можно по другому.
>>870823
#60 #870823
>>870811
Проще всего запилить новую таблицу импорта в бинарнике (автоматически ImpRec-ом или вручную) и заново загрузить файл в IDA. Если не получится или нельзя по каким-то причинам:
0) Берешь IDAPython, а то заебешься в IDC писать.
1) Ищешь, где была IAT. Или создаешь сегмент новый - похуй.
2) Делаешь в скрипте таблицу маппинга между адресом и именем функции.
3) Заполняешь сегмент импортами (не обязательно в формате PE, просто списка func1 dd ?, func2 dd ? будет достаточно), т.е., делаешь IAT.
4) Проходишь по всей программе, патчишь относительные адреса в call, чтобы указывали на нужную функцию в твоей новой IAT.
Я бы как-то так делал. Алсо, существуют всякие idc.SetManualInsn/idaapi.set_manual_insn или даже просто idc.OpAlt/idaapi.set_forced_operand , но это решение уровня комментариев. Хотя может тебе подойдет. Можно и вручную по Alt+F1 на адресе имена прописывать, лол.
#61 #870838
>>870782

>Изучать хочу по расово правильной книги от отцов, правильно ли я поступаю, или стоит начать с чего то по проще?


Ты медицину начал бы изучать по книгам от отцов?
#62 #870844
Как разрешать такие проблемы с разными типами данных (и как вообще правильно использовать типы - только встроенные или только типы WinAPI)? http://ideone.com/BuXRnd

У меня объявлены:
TCHAR processName[BUFFER_SIZE];
TCHAR dllName[BUFFER_SIZE];

Но при компиляции такого кода strncpy(processName, buffer, BUFFER_SIZE); возникает ошибка из-за того, что функция не принимает тип TCHAR. Однако если заменить тип данных на char, тогда ошибка возникает в GetWindowText(hWnd, buffer, sizeof(buffer)); потому что эта функция требует аргумент типа LPWSTR. Что делать?
>>870846
#63 #870846
>>870844
Ну можешь использовать виндовые апи (типа lstrcpy, или StrCpyN), можешь поинклудить tchar.h (_tcsncpy), а лучше не еби мозг, скажи компилятору -DUNICODE и используй юникод всегда. Нахуй тебе ансишный билд в конце 2016 года?
>>870849
sage #64 #870849
>>870846
В смысле, у тебя и так уже юникодный билд, судя по ругани, поэтому просто всегда пиши WCHAR вместо TCHAR, LPWSTR/LPCWSTR вместо LPTSTR/LPCTSTR и т.д. Ну и #include <wchar.h>, там есть wcspy, вся хуйня.
#65 #870864
>>870800
да и хуй с ним. как называется такая хрень, что я гарантирую, что после добавления, удаления того-же элемента (например, в том же 2-3 дереве), вся структура будет такой же как и в начале? ну то есть, та же память, те же указатели. вроде это важно. хотя и хуй пойми каким боком к ц, просто лень из вкладки выходить.

скажи лучше, а дохуя на call жрётся? например, когда по указателю. так то, с учётом конвертеров, кешей, всех этих ебучих заморочек в современных процах. в тех же деревья, вообще, адекватно использовать со внешней функцией cmp ?
#66 #870880
Анон, ты когда-нибудь писал файл main.h с прототипами функций, используемых в main.c? Мне эот хедер кажется ужасно непривычным.
#67 #870883
>>870880
Но зачем? В основном файле должно быть полторы функции для управления всем остальным, зачем им прототипы? Кто будет их вызывать кроме main()?
#68 #870936
>>870678

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


Дели в цикле, не переходи к следующему делителю, пока не получишь остаток. Количество итераций минус 1 будет как раз степенью. Алсо, в сишечке есть функция lldiv, которая позволяет вычислить сразу и частное, и остаток, с ней будет быстрее. Алсо, не совсем понятно, что ты там меряешь. Если уж мерять, то построение таблицы и факторизацию каждого числа отдельно.
>>871920
#69 #871038
>>870880
Хорошее место для предварительного объявления или включения всех заголовочных файлов.
>>871041
#70 #871041
>>871038
с инклюдом в main.c, модно придумано.
sage #71 #871043
>>869968

>chat argv[][]


Даже не скомпилируется.
>>871046
#72 #871046
>>871043
хуёвый какой-то у тебя компилятор, даже чаты не поддерживает.
#73 #871056
>>870880
Хедеры делают, чтобы не писать в каждом файле (единице трансляции) одни и те же объявления типа:

[CODE]extern char g_yoba;
int allo(void);
int ebal(struct tvoyu_mamku
);[/CODE]

Если твой main.h будет подключать ещё какой-то файл, то это имеет смысл. Если только файл main.c - это бессмысленно.
#74 #871088
Анон, вот этот вот код: http://ideone.com/wV9a26 не хочет компилироваться в гцц при вводе более чем 6 элементов, вылетает ошибка
Error in `./b.out': realloc(): invalid next size: 0x000000000229f010
У другого человека в Dev C++ все нормально работает. ЧЯДНТ?
>>871122>>871216
sage #75 #871090
А давайте все ньюфаги съебут в свой тред и не будут осквернять тред своими смердящими высерами.
>>871092
sage #76 #871092
>>871090
присоединяюсь, реально заебало
>>871103
# OP #77 #871103
>>871092
Что обсуждать будем? Предлагай тему.
>>871111>>871112
#78 #871105
>>869911 (OP)

>С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.


ну ахуеть.
>>872159
#79 #871111
>>871103

>Что обсуждать будем?


давайте философствовать. что выносить в подпрограмму? считаю, повторяющуюся часть кода не возвращающего значение можно задефайнить, если результат работы порождает новую сущность (аки возвращаемое значение) в подпрограмму.
абасыте.
>>871122
sage #80 #871112
>>871103

>Что обсуждать будем?


Хохлов.
# OP #81 #871122
>>871111
Что-то такое было уже. Избегаю писать многострочный код в дефайнах до последнего. Как минимум потому что функции читаемее, а компиляторы неплохо их инлайнят сами. Но если контекста дохуя, а производительность важна, тогда дефайны, что поделать-то.

>>871088
Смотри, что ты выделяешь память под 1 инт, пишешь туда элемент. Всё ок. Потом i становится 1, ты делаешь реаллок, (пере)выделяешь массивчик под 1 инт, и... пишешь инт по индексу 1, то есть за пределы массива. Из этого следуют простые мысли:
1) Однобуквенные переменные зло. Написал бы length, не ошибся бы.
2) У гцц есть охуительная фича. Пишешь -fsanitize=address и он по хардкору разноцветным текстом поясняет, где и как ты портишь память. Другие -fsanitize тоже заслуживают внимания.
3) Реаллок, на каждом шаге, кстати, тоже зло. Выделяй с запасом (вдвое больше, чем раньше, например), запоминай, сколько выделил. Классический динамический массив - это array, length, capacity.
sage #82 #871123
>>871122

>У гцц есть охуительная фича. Пишешь -fsanitize=address


Это не она требует пересборки всех либ с этой опцией?
>>871127
#83 #871124
>>871122

>Что-то такое было уже.


в прошлом треде, но был перекот.

>Как минимум потому что функции читаемее


всмысле код в теле? но ведь теперь функция будет маячить перед глазами как нечто важное, а на самом деле это просто сокращение для копипасты.
>>871125
#84 #871125
>>871124
но если ты код делаешь грамотна раскидывая по юнитам, то такие функции у тебя будут static inline. и например, нигде не будут видны за этим конкретным местом.
#85 #871127
>>871123
Да вроде не требовалось ничего рекомпилить, если, конечно, в либах нет багов, на которые оно ругается. Оно маллок хукает.
>>871130
sage #86 #871130
>>871127
А. Я с сатанайзером, который чтение из неинициазилированной памяти ловит, спутал.
#87 #871132
а вообще, всё время жалею что в ц нет функций в функциях.
>>871133
#88 #871133
>>871132
Ну пиши исключительно под гцц, у них есть такое расширением.
>>871134
#89 #871134
>>871133

>исключительно


ещё что посоветуешь в ц треде? хотя тут и так половина подсосков на вин ап.
sage #90 #871137
>>871122

> Реаллок, на каждом шаге, кстати, тоже зло. Выделяй с запасом


libc не должна сама это разруливать?
>>871140>>871151
#91 #871140
>>871137
ну ты, кстати, почитай как она разруливает.
>>871167
#92 #871151
>>871137

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


Не должна, зависит от реализации. Лучше уж самому выделить, чем гадать, как оно будет работать.
>>871173
sage #93 #871167
>>871140
Ну это явно зависит от конкретной реализации. Но логично предположить, что никто не будет делать реализацию, которая будет выделять всё время один в один запрашиваемый размер. Как минимум, он будет округлён до ближайшего оптимального размера, который подбирается с учётом данной архитектуры (размера страницы, кешлайна и хуй знает чего ещё), чтобы скорость доступа к памяти была наиболее высокая.
#94 #871169
сажа приклеилась
>>871172
sage #95 #871172
>>871169
А я всегда с сажей пишу. И не стесняюсь этого.
>>871230
#96 #871173
>>871151

>Лучше уж самому выделить, чем гадать, как оно будет работать.


Преждевременная оптимизация — корень всех зол. Тем более для лабы1, где уж точно больших проблем из-за реаллоков не возникнет.
>>871174>>871180
sage #97 #871174
>>871173

>Преждевременная оптимизация — корень всех зол.



Использование быстрой сортировки вместо пузырьковой для тебя тоже "преждевременная оптимизация"?
>>871187>>871216
#98 #871180
>>871173

> больших проблем из-за реаллоков не возникнет


Я частично согласен с высказыванием про оптимизацию (бывает, что из-за запоздалой оптимизации нужно нихуево перепидорасить код), но в данном случае дело не в проблемах и не в тормозах, дело в том, чтобы научиться. В том числе и в динамические массивы без реаллока на каждую итерацию. А потом уже думать про профилировщик и особенности аллокации в glibc.
#99 #871187
>>871174
и нахуя использовать сортировки/массивы, когда есть деревья? что бы как прадеды хуячить по харду, перелопачивая память в угар, во славу перуна?
>>871190
sage #100 #871190
>>871187

> и нахуя использовать сортировки/массивы


Слышал что-нибудь про кэши, локальность данных, вот это вот всё?

> то бы как прадеды


Прадеды могли хоть деревья, хоть хуевья использовать — у них не было кэшей.
>>871191
#101 #871191
>>871190

>локальность данных


про м-вей деревья слышал что-нибудь, и вот это всё? или просто по приколу хуй сосать?
>>871193
sage #102 #871193
>>871191
Это какой-то костыль, вместо использования массивов?
>>871201
3 Кб, 215x215
#103 #871201
>>871193
это способ использовать деревья поверх деревьев.
#104 #871216
>>871174
Слушай, я не топлю за подход анона >>871088 вызывать реаллок на ввод каждого нового элемента. Очевидно, что это ебануто. Но выделять "вдвое больше, чем раньше" для лабы1 это лишнее переусложнение. И в твоём подходе тоже можно доебаться до того, что у тебя происходит перерасход памяти без особой на то причины. Т.е. возможна ситуация, что пользователь ввёл N+1 элеметнов, а выделилась область для 2xN, большая часть которой пользователю была не нужна, допустим. При особо больших N это будет крайне ощутимо.

Что касается меня, я бы просто статический массив бы юзал. Нахуя вообще для такой задачи malloc/realloc.
>>871220
sage #105 #871220
>>871216
Перевыделять в два раза — это стандартный подход. Никаких "преждевременных оптимизаций".

А вот делать множитель зависящим от количества уже выделенной памяти, чтобы не перерасходывать — это уже преждевременная оптимизация.
>>871226>>871227
#106 #871226
>>871220
Я вообще предлагал использовать статический массив, какой в жопу множитель.
#107 #871227
>>871220

>Перевыделять в два раза — это стандартный подход.


Где это он стандартный? Можно какой-нибудь пруф?
>>871235>>871240
#108 #871230
>>871172
Это оттого, что у вас много ума но мало совести
#109 #871235
>>871227

> пруф


Ну загугли сам-то. Можешь отсюда начать: https://habrahabr.ru/post/242279/ инбифо ализар
>>871243
sage #110 #871240
>>871227
Потому что если множитель не 2, то надо объяснять, почему.
>>871244>>871288
#111 #871243
>>871235

>Перевыделять в два раза — это стандартный подход


>Почему буфер должен расти экспоненциально


Экспоненциально - это не обязательно в 2 раза.
#112 #871244
>>871240
тебе же говорят: для экономии памяти. или мы про в 2 раза от чего, от минимально необходимого для работы за всё время? или всего используемого?
#113 #871288
>>871240
http://stackoverflow.com/a/1100426
Как тебе такое объяснение, умник.
>>871292>>871299
sage #114 #871292
>>871288
Норм.
#115 #871299
>>871288
Есть еще такое объяснение: всем похуй на своп, поэтому 2x выделять норм. Зато вариант с 2x предельно простой, работает всегда, для него не нужно всяких проверок, условий и прочей хуйни (как, например, для 1.5x: length += length >> 1; выглядит красиво, но только пока length по каким-то причинам не окажется равной 1).
>>871308
#116 #871308
>>871299
assert(length > 1) азазаза
>>871310
#117 #871310
>>871308
-D_NDEBUG азаза, ой, что-то свалилось все у меня на продакшене.
#118 #871316
не понял, а в чём проблема посчитать издержки на переаллок и и предполагаемою необходимость памяти в будущем, понятно намазав на время? ну как-то так. забейте, сусяны, я чисто так, хуй знает о чём вы там, пис блять.
#119 #871500
Анон, посоветуй, с чем бы реальным мне поработать (либа, фреймворк), чтобы немного въехать в Си? Пока придумал написать расширение для Питона на C API, повозиться с GTK. Что ещё можно сделать?
>>871696>>873544
#120 #871696
>>871500
Игру на SDL.
#121 #871797
>>870142
srand (time(NULL));

int rand_int(int min,int max){

double scaled=1.0/((double)RAND_MAX+1.0);

return (int)((max - min + 1)scaledrand()+min);

}
И рекомендую пару раз прогнать в холостую сначала
#122 #871920
>>870936
Всмысле чего меряю? Я сделал решето до мульта и просто беру из него простые числа, дабы не пытаться делить непростыми.
>>871952
sage #123 #871952
>>871920
В смысле я про clock(). Результат будет зависеть не от быстродействия кода, а от того, как быстро ты вбиваешь числа во время scanf.
>>871985
#124 #871985
>>871952
Я их из текстового файла ввожу. У меня там пара тысяч чисел.
Алсо, всё уже решил.
#125 #872017
анон, а где можно почитать про создание собственного представления int-ов, не влезаю в 64 битный, числа большие, на них потом будет пара алгоритмов из теории чисел?
( не заметил новый тред, копирую из 13 )

конретно интересует факторизация целых чисел
>>872023
#126 #872023
>>872017

g:Длинная_арифметика
>>872025
#127 #872025
>>872023
длинную арифметику то я представляю - на другом языке напишу (написал)
но вот с собственными представлениями чисел на си я не сталкивался, собственно у меня числа длинной до сотни знаков
( на си потому что быстро )
>>872041>>872161
#128 #872041
>>872025
Так же, как и на другом языке.
>>872048
#129 #872048
>>872041
да я понимаю как вопрос выглядит но

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

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

=> то есть спрашиваю за языковые тоности/особенности
>>872067
#130 #872067
>>872048
Не занимайся преждевременной оптимизацией, анон. Напиши сначала как-нибудь и попрофилируй.
>>872097
#131 #872097
>>872067
речь не об оптимизации

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

более того сишный код для
64 битных быстрых целых я написал
проблема в том что мне нужны числа куда больше
то есть я просто ищу способ (чтоб как полагается) представлять очень большие целые на си + мне пару операций на таком представлении (сложение, цел. деление)
тогда я перепишу алгоритмы на новое представление -> profit

очевидные способы типо представить это все символами или массивом 64 битных интов мне в голову приходят
но вот как правильно я хз
если ты анон знаешь рецепт поделись плиз

для кристальной чистоты числа в духе:
1851858457003052118736699169041398614849121954728255181191590943881041451112971339223193346124917
(87 символов например)
#132 #872104
>>872097
Анон, ты тупой?
Тебе уже сказали - гугли длинную арифметику (mpi)
Посмотри как она реализована в криптографических библиотеках (лайк openssl, nss, tomcrypt)
Там практически везде указатель на массив лимбов, где оптимальный размер лимба (32 или 64 обычно) высчитывается макроопределениями для каждой конкретной платформы на этапе компиляции
Dmitry #133 #872159
>>871105

>компилировать


Ничего охуенного.
А засунуть в оперативку весь проэкт можно и юзать GCC, make, собирать будет наверно даже быстрее, если не статически линковать.
>>872196>>872488
Dmitry #134 #872161
>>872025

>на си потому что быстро


>математика


Не, для этого математический язык надо, он быстрее, Фортран быстрее, Ада может тоже.
Dmitry #135 #872162
>>872097

>64 битов не хватает


Если чисел с минусом нет то делай uint_fast64_t
читай
man stdint.h
если надо минус то запакуй в структуру число и bool значение которое будет вместо минуса.
>>872196
#136 #872168
Поясните нуфагу: арифметика указателей часто используется?
>>872170>>872196
Dmitry #137 #872170
>>872168
Нет
#138 #872196
>>872097
Ну я же тебе отвечал уже в предыдущем треде.

> представить ... массивом 64 битных интов


Ну вот и представляй. Что не так-то?

> но вот как правильно


Какие тут могут быть правила? Быстро это или медленно - подумай или потести.

Вот этого >>872162 не слушай, он бегает с доски на доску и несет всякий бред. Знак у него отдельно в bool, ну охуеть вообще.

>>872159
TCC даже не пытается ничего оптимизировать, поэтому GCC по скорости компиляции его никогда не догонит. TCC был бы охуенным компилятором для сборки тестовых билдов, если бы он полноценно умел в C11 и если бы при дебаге в очередной раз не оказывалось, что баг был в компиляторе.

>>872168
Постоянно. *p++ и a[j] тому примеры.
>>872213
2481 Кб, 2250x2700
#139 #872205
Привет. Есть говнокод эмулятора на Си: https://github.com/HerculesWS/Hercules/

Как и чем этот говнокод можно покрыть тестами? Есть ли тут те, кто покрывают Си код тестами? Чем пользуетесь, как тестируете, что почитать, что изучить? Короче любой фидбек будет только на пользу.
>>872210
Dmitry #140 #872210
>>872205
А что именно тебе тестировать надо?
Бери и проверяй что сомнительно, gprof gdb для мониторинга, собери с самыми дотошными настройками компилятора с конкретным стандартом языка.
А говнокод можно почти весь стереть, ксорг устарел, перекатывай на Wayland.
Dmitry #141 #872213
>>872196
А в GCC если оптимизации вырубить?
А Clang? у меня шланг медленнее гсс компилировал, а говорили мол некстген компилятор, а джисиси легаси параша.

>если бы мог в 11


А он не швабодный разве?
Можно из других компиляторов код реализации стандарта похитить.
7 Кб, 599x116
#142 #872230
>>869911 (OP)
аноны, я вообще не понимаю, как тут рассчитывать z, чему оно равно? Ответам всем трех уравнений?
>>872245
#143 #872245
>>872230
if (x ... && y ...) { ... } else if (...) { ... } else { ... }?
>>872249>>872253
5 Кб, 331x241
#144 #872249
>>872245
Если честно, я ничего из написанного не понял, вот мой уровень в си на примере первой "программы", можешь подробней написать?
#145 #872253
>>872245
Тобишь от значения переменной выбирается уравнение?
>>872261
#146 #872261
>>872253
Ну да. Можешь это в строчку через ? : записать, но будет хуже читаться.
#147 #872402
Как правильно обращаться с типом void и указателями на void при использовании их для передачи аргументов? Например, есть код:

void TrackChildProcess(void hChild)
{
WaitForSingleObject((HANDLE)*hChild, INFINITE);

}

Функция потока принимает LPVOID. Мне нужно передать потоку хэндл другого потока, но если использовать указатель на void как аргумент, то его нельзя разыменовать по правилам языка.
#148 #872411
>>872402
Пиз
Дец
>>872421
#149 #872421
>>872411
Что не так? У меня небольшой вынос мозга от передачи параметров через LPVOID.

void TrackChildProcess(LPVOID hChild)
{
char szExePath[MAX_PATH];

WaitForSingleObject((HANDLE)hChild, INFINITE);
}
sage #150 #872425
>>872402

> если использовать указатель на void как аргумент, то его нельзя разыменовать по правилам языка.


Скастуй к указателю на HANDLE
>>872558>>872564
#151 #872488
>>872097
ебанутый даун научись излагать мысли.

>>872159
ну ты и тормоз. сейчас ты мне расскажешь что ты не можешь быть тормозам, потому что ты человек?

>>872402
очередной вын апи дурачёк вкатился блин.
>>872490
#152 #872490
>>872488
Таки что ты имеешь против Windows API? Не осилил?
>>872628
#153 #872558
>>872425
Стыдно спрашивать, но почему это возможно?
void * - 32- или 64-битное число
HANDLE - это тоже число
Получается, что я пишу как на ассемблере, забывая про типы и работая только с двордами?
>>872564>>872570
sage #154 #872564
>>872425
>>872558
Точнее, не к указателю на HANDLE. Вопрос в том, как ты хочешь передать. Скастовав HANDLE к void* или передав указатель на переменную, хранящую HANDLE.
И первое, и второе легально обратимо.
>>872567
sage #155 #872567
>>872564

>Скастовав HANDLE к void*


Хотя это implementation-defined, но все знают, что это работает.
>>872570
#156 #872570
>>872558
>>872567
HANDLE - на самом деле указатель. Что-то типа:
typedef struct tag_HANDLE *HANDLE;
И кастить такой указатель на несуществующую структуру к указателю на void и обратно абсолютно легально, и implementation-defined behavior там отсутствует.
>>872571>>872573
sage #157 #872571
>>872570
Ок. Я думал это число.
sage #158 #872573
>>872570

>HANDLE - на самом деле указатель. Что-то типа:


typedef PVOID HANDLE;
>>872581
#159 #872581
>>872573
Ну да, плохо уже помню про винду, извиняюсь. Но остальные типы хэндлов при -DSTRICT как раз "типизируются" неполными структурами в качестве дополнительной защиты от дурака.
#160 #872628
>>872490
как будто есть смысл осиливать жрать говно
>>872630
sage #161 #872630
>>872628
Лучший ответ.
143 Кб, 960x948
#162 #872834
Господа, нужно вытащить все используемые функции из файла, подскажите, как это сделать. Думаю по встречающимся скобочкам их вытаскивать в символьный массив по одной, а оттуда постить в другой файл, я все правильно понимаю? Но вот часть с детектированием этиъ самых функций меня вводит в ступор.
>>873034>>873054
#163 #872883
http://ideone.com/J4CVCA
Подскажите как сложить два массива, пожалуйста.
>>872940
#164 #872898
Почему при выводе массива char выводится его содержимое до нулевого байта, а при выводе всех остальных типов массивов наоборот выводятся их адреса в памяти? В то же время при передаче массива в функцию они оба передают в функцию свои адреса.
>>872904>>872974
#165 #872904
>>872898
Потому, что во всех остальных случаях это массивы указателей ну или так сложились звёзды, наверное
#166 #872940
>>872883
Жава-тред дальше по коридору.
#167 #872974
>>872898
Что ты подразумеваешь под "выводом массива"?
>>872978
#168 #872978
>>873003
#169 #873003
>>872978
Пожалуйста, проследуйте нахуй сюда >>866503 (OP)
>>873009
#170 #873009
>>873003
я уже проследовал к твоей матери в сраку
>>873010
#171 #873010
>>873009
своим хуем
#172 #873034
>>872834
Тред или два назад был кун с подобным заданием. Задание сложное, надо писать почти полноценный парсер или вводить какие-нибудь ограничения синтаксиса. https://arhivach.org/thread/206632/#846642
https://arhivach.org/thread/206632/#846663
#173 #873054
>>872834
Написать парсер для yacc. Так просто ты не сможешь по скобочкам вытащить название. Или попробовать какую-то часть от LLVM, где парсится файл.
#174 #873090
посоветуйте корпоративных, федеральных стандартов NASA, JPL, GOV. на чем там прогают? API всякие
>>873096
#175 #873096
>>873090
Ada, C++11.
>>873097>>873098
#176 #873097
>>873096
Всегда упоминают ADA, но я ни разу не видел вживую никого, кто бы на ней писал на работе.
#177 #873098
>>873096

Оно сложнее Java?
>>873099>>873106
#178 #873099
>>873098
Ну это такой как бы паскаль на стероидах.
>>873106>>873118
#179 #873106
>>873097
>>873098
>>873099
На чистой Аде там тоже не пишут, погуглите SPARK, это диалект Ады.
#180 #873118
>>873099

а схож с objective C? на mac osx10.10 в какой IDE кодить можно? сильно требуется математическое образование, алгоритмы, уровнения, вот это вот все? сисадмину (*NIX) сложно перекатиться?
>>873127>>873149
#181 #873127
>>873118
Сразу видно американца.
>>873129
#182 #873129
>>873127

Да, да. это Трамп.
#183 #873149
>>873097
А я однажды писал на работе на Ada (просто вспомогательное приложение, не было разницы на чем его писать), хотя я работаю не программистом. По-моему нормальный язык, очень даже. Примерно как C++ в своей изначально задуманной форме, но только сделанный нормально. Честно не понимаю, почему в зк практически никогда не обсуждается, годнота же.
>>873118
Не знаю насчет мака, IDE по-умолчанию — Gnat Programming Studio, неплохая. С сишки (и думаю с obj-c тоже) перекатиться легко, там нет функциональщины или каких-то особых выебонов, просто нормально сделанное структурное, generic и object oriented программирование.
>>873152
#184 #873152
>>873149

> сделанный нормально.


Проверка границ массива есть?
>>873156
#185 #873156
>>873152
Есть. Но если вдруг где-то мешает, то можно попросить компилятор выключить.
>>873159
#186 #873158
Пишу порт сканер на асинхронных сокетах. Вопрос, почему в результате определяются все активный хосты, а не хосты с открытым заданным портом?

http://pastie.org/10959217
>>873160
#187 #873159
>>873156

> Есть


Значит Ada не нужна.
>>873162
#188 #873160
>>873158

Тебе надо воспользоваться этими требованиями:

http://www.hq.nasa.gov/office/codeq/doctree/871913.pdf
>>873186
#189 #873162
>>873159
Странный ты. Нужна проверка - вот тебе проверка. Не нужна, или ты уверен, что и так все збс - за пару секунд отключаешь и продолжаешь радоваться жизни. В чем проблема-то?
>>873163
#190 #873163
>>873162
Мне интересно. Вот эти все языки с проверками границ типа Ada или там Java. Ну, допустим, прилетело исключение о нарушении границ. Дальше что? Один хрен валить программу.
#191 #873165
>>873163
Главное чтобы ты учился хорошо и маму слушался.
#192 #873167
>>873163
Дальше heartbleed, когда проверок нету.
#193 #873174
>>873163
Я сам не особый сторонник исключений и вообще люблю сишку больше всех языков, но почему же сразу валить. Теоретически, баг может быть несмертельный и проявляться только в определенных ситуациях, например при получении запросов или входных данных определенного вида / в определенное время / etc. Можно конечно упасть и перезапуститься (и это если повезет, и баг приведет просто к сегфолту, а не к уязвимости), а можно залоггировать это дело, откатиться и попытаться продолжить работу, надеясь, что ситуация единичная, ну или перезапуститься тоже. Ну и еще раз: какбы фича отключаемая, если не видишь в ней смысла — можно и не использовать.
>>873180
#194 #873180
>>873174

а ты можешь на C написать БД, сервер приложений, хранилище документов, и простенький ERP ?
>>873185
#195 #873185
>>873180
Всё можно написать (и на чём угодно), вопрос только во времени. Раскрой свою мысль, а то не совсем понятно, к чему ты это спросил.
>>873191
160 Кб, 940x630
#196 #873186
#197 #873191
>>873185

На языке Тьюринга я ж не прошу написать, или перфокартами набить.

Есть framework(код, dll, binary) на c/c++ который заменит по функциональности weblogic + oracle rdbms + siebel crm( или что-то, хотябы одно)
>>873195>>873213
#198 #873195
>>873191
На сишечке пишут, когда есть требования к быстродействию или иные ограничения. Написать CRM на сишечке можно, но экономически невыгодно.
>>873201
#199 #873201
>>873195
RTOS типа?
>>873207
#200 #873207
>>873201
В основном на сишечке либы и embedded.

> RTOS


И обычные. И у винды, и у линукса, и у OS X ядра на Си.
#201 #873211
>>873097
В вакансиях её маскируют и называют oracle pl/sql
#202 #873213
>>873191
А чем-тебя Оракл не устраивает? Он написан, вероятно, как раз на сишке/крестах по большей части, да и api имеет сишное. Заменить его на 100% тяжело будет, в конце концов его пилят уже сто лет, причем за сотни денег пилят. С остальными двумя приложениями не работал, ничего не могу сказать. В целом crm на сишке — более чем реально, все равно основное это база данных там, а остальное по большому счету без разницы на чем делать (я как-то делал не слишком сложный бэкэнд на сишке и каких-то особых препятствий не заметил).
#203 #873388
Хэй, есть кто?
>>873400
#204 #873400
>>873388
А вам зачем?
>>873402
165 Кб, 3264x370
#205 #873402
>>873400
Не могу понять как решить одну задачу
Под буквой б. Что значит A|2b? Зачем тут "|"?
#206 #873424
бляяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя
#207 #873429
В чём отличие
++slovo от slovo++
?
#208 #873455
>>873429
прединкремент сперва увеличит на единичку, после чего использует слово в выражении, а постинкримент наоборот
#209 #873457
>>873429
разный приоритет, разная ориентация.
#210 #873458
http://pastebin.com/8KZLEfy1
где ошибка?
>>873460>>873477
#211 #873460
>>873458

> conio.h


где вы этой хуйни начитываетесь? и в жопы друг друга ебёте потом
>>873465
#212 #873465
>>873460
ну, _getch же, нет?
#213 #873477
>>873458
В строке 14. Правильно пишется "диапазон".
>>873481>>873483
#214 #873481
>>873477
А еще н вдефайне надо бы капитальными буквицами написать
>>873484
#215 #873483
>>873477
аахаххахахахха

http://pastebin.com/uZAr1QQR - пофиксил
должна считать A[n][n]*b[n]
но как то странно работает
#216 #873484
>>873481
Всмысле?
И да, апнул её до 50
#217 #873544
>>871500

> повозиться с GTK


Нинад, там не столько C, сколько обмазывание макросами.
#218 #873565
Эй, быдло, зачем вы программируете на этой древней херне когда уже лет 40 как изобретён лучший язык программирования C++?
#219 #873584
>>873565
Зачем нужен C++, когда есть Haskell?
#220 #873618
>>873565
А за эти 40 лет изобрели ОС, написанную на крестах?
>>873620
#221 #873620
>>873618
BeOS, но она сдохла.

Олсо, http://www.includeos.org/
>>873624
#222 #873624
>>873620
Гайка жива, юзерспейс-то у них на крестах, а ядро?
>>873625>>873626
sage #223 #873625
>>873624
Вижу, кресты, да.
#224 #873626
>>873624

>Гайка жива


А чо воняет так по-трупному?
>>873624

>юзерспейс-то у них на крестах, а ядро?


http://cgit.haiku-os.org/haiku/tree/src/system/kernel
>>873628
sage #225 #873628
>>873626

> А чо воняет так по-трупному?


Денег мало, длинный шмель. А была бы охуенная десктопная ОС.
#226 #873640
>>873565

> C++


> лучший


Чет толсто
#227 #873766
>>873429
========
a = b++:
-----------
a = b
b = b + 1
========
a = ++b:
-----------
b = b + 1
a = b
========
>>873805
#228 #873805
>>873766
а теперь с указателем, с указателям я сказал.
#229 #873964
Что можно простенькое такое написать на Си?
>>873970>>873991
Какашечка #230 #873970
>>873964
конпелятор
>>873988
#231 #873988
>>873970
Конпеляторы легко пишутся на функциональных языках, на си это боль и унижение.

Зацените кстати ответ майкрософта на раст — https://www.microsoft.com/en-us/research/project/checked-c/
Иии... Это си с проверкой границ! Авесоме! на деле просто скопировали реализованное в стандартной библиотеке плюсов в язык, зато пейпер больше стандарта си
Пусть хуесосы из леночкатреда расскажут ещё что рисёрчиские отделения компаний — не просто удобная основа для распилов.
>>873996>>874003
#232 #873991
>>873964
парсер форта
#233 #873996
>>873988
Хуйня какая-то от индусов и китайцев. Знаем мы, кто у них там в исследовательском отделе сидит.
>>874006
4 Кб, 144x157
Какашечка #234 #874003
>>873988
ога
Какашечка #235 #874006
>>873996
для этого целый гитхаб придумали, чтобы можно было легко и непринужденно копипастить код! получая зарплату и гранты
#236 #874029
Анон, почему функция получения значения ключа реестра работает неправильно? http://ideone.com/GUrzUZ

Стоит Win7 x64, программа 32-битная, поэтому выполняется отображение в ветку Wow6432Node. Ключ там есть. При выполнении программы выводится пустая строка. http://ideone.com/u2oBEY
>>874131>>874145
#237 #874131
>>874029
не заливай код на идеоне если о не компилируется. заливай на пастебин
>>874145
#238 #874145
>>874029
>>874131
Вроде, заработало. Почему-то помогло добавление == ERROR_SUCCESS, пойду курить мануалы.

http://pastebin.com/B0JYpuKk
>>874176
sage #239 #874176
>>874145
Потому что ERROR_SUCCESS = 0.
#240 #874301
Написал макрос для удобной (как мне показалось) инициализации auto и static массивов с присоединением значения длины к указателю, чтобы можно было не передавать в вызываемую функцию длину массива в отдельной переменной. http://ideone.com/0SsuoH
Считается ли такое уже абъюзом препроцессора, или еще норм и вполне можно использовать?
#241 #874302
>>874301
Слегка абьюз, потому что arr() выглядит как вызов функции, а на самом деле создает переменную. Даже если документируешь, будет неочевидно. Я бы сделал что-то типа struct xy *points = DEFINE_ARRAY(struct xy, ...); Несмотря на то, что тип приходится писать дважды, из такого кода очевиднее, что он делает. В len каст к указателю на void лишний. Макроса LENGTH в таком виде общепринято называется countof (по аналогии с sizeof). В остальном норм.
>>874310
#242 #874303
>>874301
в c90 не скомпилится.
>>874304
#243 #874304
>>874303
Нинужен. Можешь назвать платформу, где не поддерживается хотя бы синтаксис С99 (без библиотечной-то поддержки платформ дохуя).

>>874301
Алсо, желательно использование имени ARRAY в макросе len обернуть в скобочки, а то мало ли, все бывает, решишь выражение передать, и произойдет что-нибудь веселое.
>>874306>>874310
#244 #874306
>>874304

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


какие мы дерзкие.
#245 #874310
>>874302
Каст через воид используется, чтобы заткнуть clang, который иначе почему-то жалуется на несовпадение требований к алайменту, хотя вроде бы очевидно, что там все нормально.
По поводу названия / синтаксиса макроса думаю, что ты прав, если сделать как ты написал, то это выглядит уже не так странно, но при этом все равно намного удобнее, чем объявлять эту структуру вручную.
>>874304

>Алсо, желательно использование имени ARRAY в макросе len обернуть в скобочки


Спасибо, учту.
#246 #874315
Объясните как в С найти произведение положительных элементов в одномерном массиве
>>874317>>874322
#247 #874317
>>874315
Сделай переменную, присвой ей 1, пройдись циклом for по массиву, если очередной элемент больше нуля, умножь свою переменную на него.
твой кэп
>>874321
#248 #874321
>>874317
Для меня это сложно, без кода непонятно
sage #250 #874323
>>874322
Борешься с конкуренцией?
>>874326
#251 #874324
>>874322
Спасибо, но я учусь в пту, для меня такие вещи как sizeof и size_t неизвестны
sage #252 #874326
>>874323

>Борешься с конкуренцией?


Эксплуатирую её )
108 Кб, 604x453
#253 #874328
Объясните тупо как быдлу, как дыбилу тупо
#254 #874410
чуваки вот скажите, а как вы тесты хуярите? есть какие-нибудь системы, схемы, хуй знает. просто как-то это странно, у меня просто валяется в специальной папки набор main.с'ов которые инклюдяд заголовки того что они тестят, а это ещё и собрать нужно. на каждый делать по мейку? а если всю кучу прогонять, как-то детектировать какие провалили, как вообще прогресс теста указывать, или хуй с ним, падает значит проебал? вообще не ебу как это делается всё.
#255 #874433
При ближайшем рассмотрении этот >>874301 макрос работает только для статических массивов (т.е. указатель может быть на стеке, но сам массив остается статическим со всеми вытекающими). Можно ли как-нибудь сделать макрос, который бы мог создать такой же массив (с префиксом длины), но на стеке (пусть даже без инициализации)? Я сам что-то никак не додумаюсь.
>>874437
#256 #874437
>>874433
вот например, вообще не ебу, как тут с тобой кто-то ещё разговаривает, хуету какую-то пишешь непонятную. что у тебя там не на стеке?
>>874451>>874460
#257 #874451
>>874437
Все, что в круглых скобках в макросе arr является static.
Чтобы было более понятно, оно раскрывается во что-то типа
int ⁎a = ((struct {size_t n; int u[3];} []){3, {1, 2, 3}}).u
Создается статическая структура, состоящая из двух полей: длины массива и самого массива int этой длины. Затем адрес этого массива в составе структуры копируется в указатель a, который может быть где угодно (в т.ч. на стеке), но сама структура с массивом, тем не менее, остается static.
Такую структуру можно создать и на стеке, но я никак не могу придумать, как сделать это максимально удобно (чтобы не нужно было два раза вручную вводить размер массива, а потом еще и инициализировать это же количество элементов). Также не хотелось бы создавать лишнюю локальную переменную для самой структуры, т.е. чтобы переменная была только у указателя на массив в составе структуры, но сама структура (безымянная) при этом тоже лежала на стеке (но вот это вот скорее всего совсем уже невозможно).
>>874456>>874458
#258 #874456
>>874451
Там должно было быть
int ⁎a = ((struct {size_t n; int u[3];}){3, {1, 2, 3}}).u;
#259 #874458
>>874451
что? там и так будет всё на стеке, где оно по твоему ещё может быть? что ты несёшь? с чего ты взял, что не создаётся экземпляр структуры на стеке, а потом о не заполняется?
>>874460>>874462
#260 #874460
>>874437
>>874458
Ты прав, я просто немного запутался. Похоже, что эта хуйня действительно на стеке. Статиком там является только временный массив, длина которого считается макросом LENGTH. Просто с таким способом автовычисления длины возникла проблема: макрос отказывается работать, если среди инициализаторов того, к чему применяется LENGTH, есть не константы (потому что этот массив считается статиком). Если передавать длину массива в макрос вручную, то такой проблемы нет. Ты открыл мне глаза, спасибо.
#261 #874462
>>874458
Алсо, ты вроде хорошо разбираешься во всем этом, может подскажешь какой-нибудь хитрый способ вычислить в макросе количество переданных в него элементов массива, чтобы все-таки не приходилось вручную длину передавать?
>>874468>>874537
#262 #874468
>>874462
хуй его знает. я на макросах дохуя писал, можно организовать цикл и в нём перебрать все аргументы из __VA_ARG__, например держа счётчик как несколько 16ричных разрядов-аргументов. но это всё полный дроч, ненужно этим заниматься. а так-то можно хоть математику хуярить, правда у компиляторов есть ограничения в раскрытию... и это одна из причин почему это нахуй не нужно.
>>874659
#263 #874509
Для чего здесь переменным типа DWORD присваивается результат вызова функции GetProcAddress, приведенный к LPDWORD? Из-за этого код не компилится. Защита от дурака или какая-то древняя магия? Судя по HMODULE LoadExecutable (IN LPSTR path, IN PVOID base = 0), это C++, в котором с типизацией и кастами все строго. Непонятно, для чего это сделано.
>>874510>>874529
#264 #874510
#265 #874529
>>874509
В коде происходит какая-то хуйня. Динамическая память с PE-имиджем освобождается и затем она используется. Сейчас бы найти журнал ксакеп за октябрь 2012, там на диске должен был быть PE-лоадер.
#266 #874537
>>874462
G_LIST_LEN посмотри в glib
Да и вообще погляди там макросы для коллекций. Там много чего интересного реализовано
#267 #874538
>>869911 (OP)
Вот функция:
int main()
{
int a[N],i,count;
srand(time(NULL));
Init(a,N);
Print(a,N);
for(i=count=0;i<N;i++)
if(a>0&&Sum(a)>10)
count++;
printf("count=%d\n",count);
return 0;
}

Вот ошибка:
error: 'N' undeclared (first use in this function)

Что не так?
Научите массив задавать
>>874542
#268 #874542
>>874538
пошёл нахуй.
>>874543>>874563
#269 #874543
>>874542
Окей
#270 #874547
Зацените PE-лоадер. Какие у него подводные камни? Подойдет ли для написания криптора, который дешифрует PE-файл в памяти и делает run pe?

http://pastebin.com/DRMG7R31
>>874548
#271 #874548
>>874547
Алсо, для правильной работы ширусов в памяти надо патчить PEB. Будут ли проблемы из-за использования такого лоадера?
#272 #874563
>>874542
Двачую
#273 #874659
>>874468
Сейчас все-таки еще немного посидел с этим макросом, теперь работает и так:

int ⁎a = ARRAY(int, 1, 2, 3, 4, 5);

и даже так:

unsigned short x = 99;
struct xy ⁎b = ARRAY(struct xy, (1, 2), (3, 4), (5, x));

В макросе круглые скобки автоматически заменяются на кривые где нужно.
Но ты был прав насчет лютого дрочева, у меня сейчас такое чувство, будто бы я на брейнфаке написал что-то. Оказывается сишный препроцессор – вполне себе эзотерический язык.
>>874708
#274 #874708
>>874659
Покажешь макрос?
>>874716
#275 #874710
Анон, у меня печет. Есть такой код: http://pastebin.com/AGQVz7P4

В следующих строках ошибка:
//CopyMemory(&pStub[text->PointerToRawData + text->Misc.VirtualSize], pImage, dwImageSize);
memcpy(&pStub[text->PointerToRawData], pImage, dwImageSize);

>main.cpp(43): error C2036: 'LPVOID' : unknown size



Что я делаю не так? pStub указывает на PE-имидж загрузчика в памяти. Я хочу дописать в конец секции кода данные. Но с конструкцией &pStub[text->PointerToRawData + text->Misc.VirtualSize] что-то не так.
>>874719
#276 #874716
>>874708
http://pastebin.com/jtdjX88M
Все права на спизженные идеи и куски макросов принадлежат их законным правообладателям.
>>874723
#277 #874719
>>874710
Скажи, а pStub + 1 - это какой адрес, если учитывать, что pStub - указатель на void? Скасти к PBYTE или какому-нибудь другому указателю на char.
>>874722
#278 #874722
>>874719
Понятно. Зря я, наверно, вообще начал использовать LPVOID. Хотя должно быть удобно ксорить сразу по 4 байта.
#279 #874723
>>874716
Я кончил. Алсо, вчера забыл тебе сказать, что ты зря с анонимными структурами возишься в len. Весь len можно сделать просто (((size_t *)(array))[-1]).
>>874726
#280 #874726
>>874723
Я конечно не эксперт, но сделал так из предосторожности: ведь если мы присоединяем размер к массиву через структуру, то значит, что теоретически между переменной размера и массивом могут быть padding-байты, в зависимости от требований к алайменту элемента массива (например на моей системе у size_t алаймент 8, а у max_align_t – 16). Потому в текущей версии даже задействовал alignas из C11, чтобы между началом массива и его размером всегда было одинаковое количество байтов. Или это я зря заморачиваюсь?
>>874732
#281 #874732
>>874726
Да, ты прав, а я снова туплю. Извини.
>>874738
#282 #874738
>>874732
Просто сишка на самом деле довольно задротский язык. Вот я все время думаю, что вот я ее освоил и уже знаю кучу тонкостей и нюсансов, а потом оказывается, что где-то снова проебал что-то неочевидное.
>>876016
#283 #874819
Товарисчи, у кого-нибудь есть деление очень длинного на короткое? Или тыкните хотя-бы в псевдокод или паскаль.
Везде только умножение.
>>874821>>874826
#284 #874821
>>874819
В школе в столбик делил?
#286 #874941
Прошу прощения если надоел, но я продолжаю додумывать улучшенные массивы для сишечки.
Если я сделаю такой макрос len, который (как я надеюсь) будет автоматически определять размер или по методу sizeof(a)/sizeof(a[0]) (в случае массива) или доставанием значения из size_t переменной в префиксе массива (в случае указателя), ждут ли меня какие-либо подводные камни? И если да, то какие?
#define len(ARRAY) (((void ⁎)&ARRAY == (void ⁎)&ARRAY[0]) ? LENGTH(ARRAY) : length(ARRAY))
Какашечка #287 #875497
синьоры макакены, жутко нехочу создавать лишнюю переменную, насколько вставка функции в аргумент второй функции будет по шариату?
типа: a(b(i), j);
>>875503>>875505
#288 #875503
>>875497
Тебя пидорнёт, передавай в a() указатель на функцию b() внутри тела a() вызывай b().
#289 #875504
>>875503
Охуительные истории.
#290 #875505
>>875497
Алсо, по-моему ни в одном ЯП нельзя встроить вызов функции в параметр другой.
>>875506
#291 #875506
>>875503
>>875505
Вот я даун, извиняйте, нигде такой хуйни не видел, чтобы работала.
>>875510
Какашечка #292 #875510
>>875503
наркоман штоле?
>>875506
и ты тоже
41 Кб, 604x401
#293 #875528
Господа, сдаю я курсач преподу дальше можно не читать, вот код. http://pastebin.com/EEE3FJQ2
Так он сказал, что нужно конечными автоматами, помогите со структурной моделью, я в этом вообще не шарю, пожалуйста, пишите свои идеи. Алсо, суть - вытащить из текстового документа названия функций, просто названия, без типа и аргументов, как у меня.
>>875651>>876015
#294 #875596
>>869971
вызовет warning, т.к. НИЧЕГО НЕ ВОЗВРАЩАЕТ
>>875612
sage #295 #875612
>>875596
Для main() есть специальное исключение: если поток выполнения доходит до закрывающей фигурной скобки, main() возвращает 0.
>>875629
sage #296 #875629
>>875612
Начиная с C99 или C11
#297 #875651
>>875528
Какой пиздец.
#298 #875738
В проекте VS2010 включена оптимизация по размеру. Если код, который выделяет четыре байта в куче, пишет туда дворд и освобождает эту память полмиллиона раз, находится в WinMain, компилятор его не выкидывает. Но если я выделяю этот код в функцию, компилятор ее оптимизирует, и она не попадает в бинарник. Как заставить компилятор сохранить ее?
>>875773>>875832
sage #299 #875773
>>875738
Возможно, __declspec(noinline)? Возможно, стоит эту функцию поэкспортировать, чтобы на нее были ссылки?
#300 #875832
>>875738
volatile на указатель.
#301 #875859
Рубрика зодай вопрос анону.
Ув. Анон! Вот есть fgetc(). Так ведь? Если у нас есть цикл, где этот фгетц читает по символму из файла, как он знает что нуно перескочить на следующий символ в файле, это внутри самой функции указатель некий? Или же это древние темные механики скрытые от простых смертных?
>>875863>>875865
#302 #875863
>>875859
воспринимает файл как поток.
#303 #875865
>>875859
Зависит от реализации. Обычно за внутри структуры, на которую указывает FILE, хранится системозависимый дескриптор или хэндл для "родного" для системы API доступа к файлам.
Если это "обычный" файл, т.е. с произвольным доступом, с этим дескриптором в ядре ОС ассоциировано смещение в файле. По этому смещению и происходит чтение. И функции чтения автоматически увеличивают смещение на прочитанное число байт.
Плюс ещё, на стороне программы, может быть буффер. Он тоже связан с FILE. Ну и читается какой-то заметный кусок из файла в буффер. И, соответственно, есть указатель на текущий символ в буффере, который fgetc() увеличивает.

Я тут упрощённо описал как это примерно выглядит на чём-нибудь вроде windows или *nix.
>>876012
#304 #875988
Аноны, начал изучать Си по наставлению нашего товарища и возник с рядом проблем. Изучаю по книге Кёрнигана и вижу для себя море незнакомых формулировок, слов и т.п. Из-за этого думаю, что Кёрнигана лучше оставить на потом, а пока что начать читать что-то более простое. Непосредственно вопрос: может подскажете что-нибудь попроще, или все-таки грызть тот самый материал, который я не понимаю? Не понимаю из-за того, что не могу можно сказать самые первые упражнения сделать сам. К слову, в /pr полный ноль, максимум, что могу сделать из этой среды - прописать shutdown -s -t 180 в командной строке, когда выхожу из дома
памагити
#305 #875989
>>875988
Прату читай, очевидно же
>>875991
#306 #875991
>>875989
т.е. стоит все-таки изучать С++, а не С?
>>875995
#307 #875995
>>875991
Нет, он и по Си писал книги
https://www.ozon.ru/context/detail/id/31649671/
>>875996
#308 #875996
>>875995

>


спасибо огромное анон, еще вопрос:
стоит после поверхностного изучения данного языка зубрить его то состояния белиссимо, или же параллельно знакомиться с чем-то новым?
#309 #875997
>>875988
>>875988
Палю годноту, пройди гарвардский курс cs50
Я тебе гарантирую, не разочаруешься.
>>876004
#310 #876004
>>875997
Дай бог здоровья, буду учиться :з
#311 #876011
>>875988

>начал изучать Си


с какой целью?
есть ресурсы чтобы прожить следующие десять лет до того как сможешь заработать кодом на си?
>>876013>>876057
#312 #876012
>>875865
зачем объяснять уебкам то что они могут погуглить?
>>876110>>876135
#313 #876013
>>876011
с целью начать изучать хоть что-то, ибо сестра к себе хочет взять на стажировку в iba
спросил у анонов тут пару дней назад, что лучше изучать - сказали Си, я потихоньку пытаюсь
#314 #876015
>>875528
самое забавное, что эти хуесосы и в продакшон такой код высирают (если это не исходники уровня chrome где уже кодерам нада от 150к в год платить, а в закрытых кодовых базах помельче именно такой пиздец за частую и есть)
#315 #876016
>>874738
чтобы написать крепкую рабочую прогу знание языка это только 10%
а вы уебки и его не знаете
пфф
в печь всех, как евреев в 42
>>876045
#316 #876045
>>876016

>а вы уебки и его не знаете


Сколько (минимально) чтений по указателям a и b сгенерирует следующий код? Если знаешь язык, то тебе понадобится не больше пары секунд чтобы правильно ответить и объяснить почему.

int ololo(int a, int b)
{
int x = 0;
int y = 10;
x = a + b;
x = 10;
y +=
b;
x += y;
b += x;
y = dosmth(a);
return y +
a + *b;
}
#317 #876048
>>876045
звездочки сьедены?
>>876050
#318 #876049
>>876045
вы обосрались.
>>876050
#319 #876050
>>876048
>>876049
Всем, кто знает язык, не составит никакого труда восстановить съеденные звезочки :3
>>876053
#320 #876053
>>876050
Больше скажу. всем кто знает язык даже и твой код не нужен, они и так знают о чем ты.
>>876056
#321 #876056
>>876053
>>876045
Короче, рядом с a и b звезочки стоят везде, кроме dosmth(a).
Алсо, если кому-то не лень, ответьте, потому что я и сам хочу проверить, правильно ли я думаю.
>>876061
#322 #876057
>>876011
Взял расстроил.
#323 #876061
>>876056
2 и 2
>>876069
#324 #876069
>>876061
Как насчитал? Алсо, вместо x = 10 должно было быть умножение. Но без него получилось бы 1 и 2 по-моему.
http://pastebin.com/XG4jtv4r
>>876071
#325 #876071
>>876069
ну как-бы после вызова функции сложно знать, изменилось ли значение по указателю b, тоже.
>>876078>>876079
#326 #876078
>>876071
Это да. Я правда сперва сам не совсем правильно посчитал, а так там 2+2, все правильно.
Алсо, я когда-то не знал про это все, и тогда мне казалось, что не нужно кешировать значения по указателям в локальных переменных (тип лишние переменные будут занимать место, лол), а потом я почитал про restrict, а потом выяснилось, что если вызывать внутри функции другие функции, то и restrict'а будет мало… Но отчего-то мне кажется, что я еще дохуя всего не знаю.
#327 #876079
>>876071
2
остальные бесполезные действия бдут в кэше проца\регистрах
#328 #876110
>>876012
больше не буду
#329 #876135
>>876012
Ну и действительно, зачем
>>876137
#330 #876137
>>876135
тонко стелишь, так сказать, без скобочек у &.
sage #331 #876143
>>876045
Правильный ответ "сколько угодно", вплоть до выбрасывания всей функции нахуй. Подобные разговоры мало того, что в принципе бессмысленны, так еще и могут идти только о полной, нормально компилирующейся программе.
>>876150
#332 #876150
>>876143
ну как тут без твоих выебонов. поняли все? вы дурачки, не берите в голову, открывайте и берите в рот, как господин у которого компилятор раскрывает функции.
>>876157
sage #333 #876157
>>876150
По делу есть что возразить?
>>876185
#334 #876185
>>876157
Если функция не объявлена статик, с чего бы компилятору ее выкидывать?
>>876190
sage #335 #876190
>>876185
Например, с того, что она не вызывается. Или у нее явно нет сайд-эффектов (и у dosmth тоже), а возвращаемое значение не используется. Или она вызывается один раз, и аргументы известны, поэтому компилятор может решить весь вызов свернуть в одну константу.
>>876197
#336 #876197
>>876190
Но откуда компилятору знать, к чему ты собрался прилинковать результирующий файл, и, соответственно, будет ли кто-то вызывать эту функцию?
>>876199>>876268
#337 #876199
>>876197
не будет он её удалять.
>>876268
#338 #876243
Что лучше первым учить С или С++? Для программирования встраиваемых систем.
#339 #876248
>>876272
8 Кб, 361x411
4 Кб, 800x97
sage #340 #876268
>>876197
Под компилятором я понимаю весь тулсет (препроцессор, транслятор, ассемблер, линкер). Функцию выкинет линкер, если умеет в LTO.

>>876199

> не будет он её удалять.


Пикрелейтед. Функцию спиздили, чтений по указателям ноль.
>>876282>>876824
#341 #876272
>>876248
почему?
>>876281
#342 #876281
>>876272
Так логичнее.
Сначала Си был, потом его допилили до С++. Более логичная последовательность.
Да и просто Си проще и примитивнее, а в С++ больше сложных вещей и абстракций.
#343 #876282
>>876268

> не будет он её удалять.


> показывает раскрытие функции.

>>876287
15 Кб, 672x226
sage #344 #876287
>>876282
Так а функция-то где? Где моя функция?
>>876300
#345 #876294
>>876243

>программирования встраиваемых систем


Там в основном Си. С++ практически не используется.
#346 #876300
>>876287
а я и не спорил. ты какой-то странный.
#347 #876365
>>876243
Си конечно.
Печально что б-во вкатыльщиков не знает что С++ никогда не был популярней и востребованней Си и не будет.
Просто вакансии на помойках всяких в основном ориентированы на всякий скам.
>>876376
#348 #876368
>>869911 (OP)
Какой тип данных имеет результат логических выражений в С?
>>876369
#349 #876369
>>876368
int (0 или 1).
#350 #876376
>>876365
Изучил основы Си, изучаю алгоритмы, решаю олимпиадные задачки. Куда копать дальше, какие перспективы?
#351 #876378
>>876376
На гитхаб, решать реальные задачи. Олимпиадники не нужны.
#352 #876381
>>876376
дальше только отсос для натуралов.
#353 #876420
>>876376

>изучаю алгоритмы, решаю олимпиадные задачки


преподавателем в ПТУ
100 Кб, 1920x1080
#354 #876780
Из академического интереса хочу написать полиморфный код на си. Я слышал, что на фасме можно закриптовать код даже на этапе компиляции, но как сделать это на си, я не знаю.

В общем, критическая часть программы выглядит примерно так:

void CriticalFunc(void)
{}
void EndFunc(){}

В рантайме происходит расшифрование от начала функции до метки EndFunc().

Но как ее сначала зашифровать? Инбифо: ксором в HIEW
Если собирать с оптимизацией по размеру, компилятор может выкинуть метку EndFunc. Проблема решается объявлением указателя на нее volatile? Может ли линкер разместить EndFunc не после критической функции?
>>876824
#355 #876824
>>876780
Самый простой способ - написать кастомный кодогенератор для tcc. Можно экспериментировать с LLVM. Можно просто сваять простейший парсер PE/ELF и криптовать секцию кода целиком. Алсо, можно сделать свой линкер - минимальный линкер под сишечку написать несложно, если есть опыт байтоебли.

> Если собирать с оптимизацией


Если творить такую хуйню, фиксированные параметры компиляции и минимальная оптимизация - это мастхэв.

> Может ли линкер разместить


Классический линкер не может менять порядок функций в объектнике, и выкинуть функции он тоже не может, но есть всякие фичи типа "separate functions for linker" (в терминах MS) и прочие LTO >>876268, поэтому опять же нужно подобрать такие параметры сборки, когда линкер не будет мешать твоим планам.
#356 #877015
Хочу вертеть байтики в линуксе туда-сюда как это делает юниксовая dd. Какой ман читнуть?
>>877018
#357 #877018
>>877015
Даже сишного fopen() вполне хватит для начала.
#358 #877059
Вопрос нубский и вероятно платиновый
пишу калькулятор матричных операций
анон, подскажи пожалуйста как читать с stdin пока не закончаться знаки операций
то есть

matrix
+
matrix
*
matrix

я понимаю что вроде пока op не EOF
но что-то никак
>>877452
#359 #877452
>>877059
Читай fgets() в буфер, если во время чтения строки юзер тыкнет Ctrl+Z (Ctrl+D в Linux), fgets() вернет NULL, и ты закончишь. Дополнительно ты можешь проверять первый символ буфера. Если он \0 или \n - юзер ввел пустую строку, можешь по этому признаку тоже завершать ввод. А дальше ты можешь либо разбирать буфер вручную через strtok(), strtoSMTH() или делать sscanf().
#360 #877552
Как на WinAPI создать текстовое поле без ограничения на длину вводимых данных?
>>877575>>877595
#361 #877575
>>877552
Rich Edit Controls. Форматирование отключается.
>>877595
#362 #877595
>>877552
>>877575
Разобрался, надо было включить автоскролл.

Как можно изменить цвет рамки эдита при получении фокуса?
>>877608
#363 #877608
>>877595
пиздец. всё. нахуй идите со своим тредом.
>>877631
sage #364 #877631
>>877608
Почему ты пригорел?
#365 #877680
Какое же ебаное говно этот Pelles C. Несколько часов пердолил в нем код, а после падения IDE весь исходник оказался забит нулями.
>>877714
#366 #877714
>>877680
Как ты умудрился его уронить? Он и несколько лет назад был вполне стабилен. Ну кроме дебаггера. Антивирусы/малварь в системе есть?
>>877716
#367 #877716
>>877714

>малварь в системе есть?


Обижаешь, конечно есть!
#368 #877723
>>869911 (OP)
Онан, поясни за GUI на pure-C. Какие фреймворки используешь? Сколько весит hello-world на таких? Можно ли static-версию делать?

(цель Windows 2000-10, Ubuntu 14-...)
Пишу для микроконтроллеров, но иногда надо делать управляющие программы. Пока что делал на delphi 7, лол. Пробовал на Qt, но по 70 мегабайт библиотек таскать, это пиздец.
#369 #877735
>>877723

>GUI на pure-C


WinAPI, под линуксом через вайн запускаешь
#370 #877737
>>877723

> Какие фреймворки используешь?


А выбор и небольшой, лол. Либо используешь кресты + wxWidgets либо прикручиваешь Gtk3 и не выёбуешься.
#371 #877767
Переделываю неубиваемое консольное приложение в приложение с гуём. http://pastebin.com/qjCPVNM4

Когда компилирую в Pelles C и запускаю, появляется два процесса, которые спавнят друг друга. Но если компилирую в MSVS 2015, второй процесс не запускается, и приложение закрывается после нажатия на крестик. Почему?
>>877897
#372 #877771
>>877723
Качай ребол/пюревасик или даже блитзмакс и делай на них. Кроссплатфоренно, просто, а в последнем с/крестокод можно прямо к нему линковать не переписывая.
#373 #877897
>>877767
Разные методы запуска. Студия через жопу запускает - отобрази командную строку студии, и увидишь.
>>877898
#374 #877898
>>877897
Запущенный не в среде студии экзешник (из папки) тоже не работает как надо.
>>877904>>877906
#375 #877904
>>877898
Хуй знает, навскидку код вроде норм. Обработку ошибок и диагностику добавь.
>>877906
sage #376 #877906
>>877898
>>877904
Попробуй открывать процесс с SYNCHRONIZE, а не с полным доступом.
>>877911
#377 #877911
>>877906
Не помогло. Попробую посмотреть, что передается в командной строке.
>>877915
#378 #877915
>>877911
Странно, вот здесь вместо пути выводится форматная строка.

http://pastebin.com/taKpQnJr
#379 #877918
Почему-то GetModuleFileName(GetModuleHandle(NULL), szExePath, MAX_PATH); вместо пути записывает в буфер символ С.
>>877932
sage #380 #877932
>>877918
В настройках проекта юникод, а на предупреждения ты не смотришь?
>>877939
#381 #877939
>>877932
Ух спасибо, почти весь день убил на поиск проблемы. Надо мне читать Рихтера про юникод и переходить на него.
#382 #877952
ананасы, подскажите, можно ли как нибудь способом узнать указывает ли указатель void * на какое либо место в памяти
>>877962>>877971
#383 #877962
>>877952
Да, можно.
Погугли функции с названиями вроде check memory page existence и т.п.
>>877968
#384 #877968
>>877962
большое спасибо
#385 #877971
>>877952
Добавлю, что необходимость в таких функциях чаще всего следствие того, что ты делаешь что-то не так либо что-то близкое к системному софту.
>>878850
#386 #877977
>>877723
Можешь попробовать это https://github.com/vurtun/nuklear
101 Кб, 1280x800
#387 #878087
Вечер в хату, мужики и стремящиеся. Хочу сделать полупрозрачный гуй, чтобы главное окно и контролы были полупрозрачные, но рамки были яркие. Примерно как на пикрелейтед. Как это можно сделать? Перекопал сегодня много сайтов, но нашел мало полезного. Вот, например:

https://www.experts-exchange.com/articles/1783/Win32-Semi-Transparent-Window.html
>>878097>>878098
#388 #878097
>>878087

>Вечер в хату, мужики и стремящиеся


нахуй пошел, зек ебаный
>>878100
#389 #878098
>>878087

>Вечер в хату, мужики и стремящиеся


иди на хуй
>>878100
9 Кб, 200x200
#390 #878100
>>878097
>>878098
Да ты же РОЛИДОВЫЙ.
2 Кб, 355x55
14 Кб, 644x160
#391 #878163
Уже перечитал несколько про циклический алгоритм во многих источниках, но так и не могу ничего сделать, может кто нибудь дать совет по конкретному примеру? Хотя бы основу самого цикла, а то я возился около 4ех часов и ничего не получил, а лабу сдавать в понедельник
>>878164
#392 #878164
>>878163
Я понимаю, как задать сам цикл, но не понимаю как заставить считать значение n-ого слагаемого
>>878167
#393 #878167
>>878164
Вроде про цикл в задании ничего. Рекурсивно оно проще для понимания. Погугли "recursive cosine taylor series in c". Ну или можешь циклом считать, да. Минусы и плюсы - это 1 в степени n, степени в числителе - 2n, числа в знаменателе - факториал 2n. Значения, требуемые для вычисления числителя и знаменателя можно запоминать с предыдущего шага.

> не понимаю как заставить считать значение n-ого слагаемого


В смысле, не умеешь возводить число в степень с помощью pow() и делить его потом?
>>878168>>878172
sage #394 #878168
>>878167

> 1 в степени n


-1 конечно же.
#395 #878172
>>878167
Как посчитать то я знаю, я от том, что мы вводим любое n и программа должна посчитать этот n-ый элемент выражения, как это записывать?
>>878173
sage #396 #878173
>>878172
Ну тебе все равно всю сумму считать. У тебя будет цикл от 1 (или 0) по n, в цикле ты вычисляешь очередное слагаемое, заканчиваешь n-ным. В чем проблема вывести его после выхода из цикла?
>>878174
#397 #878174
>>878173
Точно, спасибо анон, погуглил про рекурсию вроде наглядно понял
22 Кб, 389x499
#398 #878465
Хочу вкатиться в си по пикрилу. Какие подводные?
>>878470
#399 #878470
>>878465
Никаких. Читай, делай упражнения, приходи с вопросами, если возникнут. Успехов.
>>878472
#400 #878472
>>878470
Как по пути не обосраться с мотивацией продолжать?
>>878524
#401 #878524
>>878472
Пиши малварь. Поделай что-нибудь в реестр, напиши примитивный троян, который копируется в пользовательские папки, сканирует снапшот процессов и закрывает диспетчер задач. Посмотри, как мейлру параша прописывается в системе и самовосстанавливается. Сделай так же. Подъеби кого-нибудь этим трояном, главное, не попади в чью-нибудь статью о том, как лох пытался впарить троян, но соснул.
>>878532
#402 #878532
>>878524
Во-первых, до малвари нужно язык выучить, чтобы не быть, как тот анон из ньюфаг-треда, который функцию переменной присваивает, да и не только язык - по-хорошему, желательно прочитать хотя бы Рихтера, а потом заполировать Inside Windows. Во-вторых, я очень надеюсь, что тебя поймают и пояснят по хардкору, почему распространять малварь плохо.
#403 #878570
Пойти что ли на рефактор.ио вбросить. Алсо, эх, как плохо без тяночки. Вокруг компьютера они не водятся.

http://ideone.com/wm2fM6
15 Кб, 434x155
#404 #878576
отцы помогите тотал нюфагу вкатитсяможет что-нибудь получится
в поставке clang++ из коробки я так понял нет стандартных библиотек, а в GCC:g++ есть.
можно их как-нить с консолидировать чтоб и clang все появилось
>>878578
#405 #878578
>>878576
В папке со шлангом создай i686-w64-mingw32, туда скопируй include, lib, libexec из гцц. А еще лучше создай симлинки.
>>878584>>878589
#406 #878584
>>878578

> шиндошс


> симлинки

>>878604
#407 #878589
>>878578
чтот ничего(
>>878604>>878605
#408 #878604
>>878584
Да, в NTFS есть симлинки и хардлинки, доброе утро. Но вообще, я имел в виду junction points.

>>878589
Уверен, что правильно скопировал? Что пишет? Покажи скриншот clang -v file.c (кресты я компилить не пробовал, если что).
#409 #878605
>>878589
только щас заметил что не в тот тред написал
>>878608
sage #410 #878608
>>878604
>>878605
Попробовал кресты, хелловорлд компилится.
242 Кб, 977x579
#411 #878609
>>878618
#412 #878618
>>878609
Я не знаю, почему у тебя таргет по умолчанию msvc. Возможно, стоит убрать переменные окружения INCLUDE и LIB. А насчет хедеров - я сейчас поэкспериментировал, та папка не нужна, оно (по крайней мере у меня) находит директорию с MinGW, если она есть в PATH и автоматически использует инклуды оттуда. Но у меня в винде только clang 3.7 и gcc 4.8. Может, с тех пор что-то сломали. Возможно -target mingw32 решит проблему.
>>878622
#413 #878622
>>878618
все директории сеть в переменных средах
всё ставил с сайта, таргетинг не понимает(
>>878624
#414 #878624
>>878622
clang -v -target i686-w64-mingw32 foo.c

Ну пользуйся гцц, пока кто-нибудь умный не придет и не подскажет скорее всего, вместо решения проблемы предложат поставить линупс.
>>878627>>878634
#415 #878626
>>878604

> доброе утро.


> 00:45:55


> NTFS есть симлинки и хардлинки


То-то я смотрю, в Cygwin до сих пор пользуются магическими файлами, а в Msys ln -s равнозначно cp. Наверное, они не знают об этих фичах файловой системы.
>>878629
#416 #878627
>>878624

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


Ну, это как спрашивать у мылачей, почему последняя студия под вайном не работает и как это исправить.
>>878629
#417 #878629
>>878626

> в Cygwin до сих пор пользуются магическими файлами, а в Msys ln -s равнозначно cp


Компатибилити же. Настоящие симлинки (которые поддерживаются для файлов тоже) появились в Висте. Junction points не помню, но вроде в XP. И это не работает на FAT32. И там есть тонкости. Вот и не делают.
https://en.wikipedia.org/wiki/NTFS_symbolic_link
https://en.wikipedia.org/wiki/NTFS_junction_point

>>878627
Ты уж определись, либо компилятор кроссплатформенный, либо только под линупсы. В студии кроссплатформенность никто не обещал. Шланг и гцц нормально работают в винде, но могут возникать мелкие проблемы, в основном из-за LFSтрадиции хардкодить пути.
>>878631>>878643
sage #418 #878631
>>878629

> LFS


Лол, FHS.
слоуфикс
500 Кб, 1366x768
#419 #878634
>>878624
помогло))
компилит с опцией -target x86_64-w64-mingw32
без нее не хочет
>>878635
#420 #878635
>>878634
Теперь, наверное, стоит посмотреть на твой PATH.
>>878638
61 Кб, 529x504
#421 #878638
>>878635
вроде все правильно
>>878639
#422 #878639
>>878638
Да, все правильно. Больше идей нет. Сделай батник clang-mingw с содержимым типа @clang -target x86_64-w64-mingw32 %*
#423 #878643
>>878629
То-то и оно, что тонкостей больше, чем приемлимо для ежедневного использования. Невозможность создавать эти самые симлинки от обычного юзера в дефолтных настройках безопасности, как пример.
А потом говорят, что в линуксе пердолинг.
>>878645
sage #424 #878645
>>878643
Я junctions и хардлинки очень давно использую. Нестандартные права для них не нужны, проблем особых с середины 2000х не припомню кроме мелочей типа антивируса, впадавшего в бесконечный цикл при сканировании или инсталляторов, которые до сих пор! проверяют свободное место на томе, где расположена junction point, а не там, куда она указывает.
#425 #878668
Наткнулся на следующий синтаксис:
return (pointer);

К чему тут скобки?
>>878669
#426 #878669
>>878668
Не влияют ни на что. Кому-то нравится визуально, и они втыкают скобки всегда. Некоторые ставят, когда возвращается выражение.
#427 #878850
>>877971
ебашу интерпретатор джавы на сишке, при алокации структур заношу указатели в буффер, чтобы при любой ошибке сразу вычистить всю память и не было leakов. Проблема лишь в том, что по ходу работы интерпретатора я все равно освобождаю память и в результате при очистке памяти у меня может программа попытаться вычистить уже пустой указатель, поэтому надо как то проверять их. Не покидает ощущение того, что организовываю все это ебано, возможно есть лучший варик как это сделать
>>878894>>878899
3 Кб, 640x70
#428 #878860
Изучаю использование юникода в винапи по книге Рихтера. Как вызвать ошибку компиляции в этом коде? http://ideone.com/jEG29d

Рихтер пишет, что компилятор по умолчанию рассмаривает строки как ANSI, поэтому код компилируется нормально. Но если определить _UNICODE, то возникнет ошибка. Однако ошибка не возникает ни при определении этого макроса с подчеркиванием, ни без подчеркивания. Почему так?

Компилирую из командно строки (пикрелейтед).
>>878903>>879097
#429 #878894
>>878850
Хендлы.
sage #430 #878899
>>878850

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


Да. GC.
sage #431 #878903
>>878860

> WinAPI


> UTF-16 вместо кодировки


Зря ты за это взялся.
>>878909
#432 #878907
Окей, реализовать обычный стек для обычных числел, ноу проблемс.
Допустим stack[n] или вообще (int )malloc(ij*sizeof(int))
Не могу придумать, как в стэк пихать 2D массивы?
Гугл молчит, либо я слепошарый.
>>879097
#433 #878909
>>878903
Какая кодировка сейчас в тренде? Что актуальные пацаны хайпают?
>>878910>>878929
sage #434 #878910
>>878909
utf8 же
>>879097
#435 #878929
#436 #879097
>>878860
Ты представляешь, как препроцессор работает? Ты определяешь UNICODE после включения windows.h, и в результате в windows.h (точнее, в одном из включенных из него хедеров) TCHAR дефайнится как CHAR. Очевидно, чтобы возникла ошибка, надо сделать -DUNICODE в командной строке или дефайн до инклуда.

>>878910

> UTF-8 в Windows


И кодировать туда-сюда на каждый вызов API. Охуенный совет. Не говоря уже о проблемах самой UTF-8, удобной лишь для передачи текста, а не для обработки.

>>878907
Указатели пихай или поясни, зачем ты собрался пихать в стек массивы по значению.
>>879109>>879360
sage #437 #879109
>>879097

>И кодировать туда-сюда на каждый вызов API.


Всю жизнь собрался сидеть в WinAPI и дальше локалхоста не вылазеть?

> Не говоря уже о проблемах самой UTF-8, удобной лишь для передачи текста, а не для обработки.


Ахахаххаахахахахаха! Вангую бред про "доступ к символу по индексу".

utf8 прекрасна для всего!
>>879112
#438 #879112
>>879109

> utf8 прекрасна для всего!


То-то гугл глупый и андроендах использует UTF-32.
>>879113>>879117
sage #439 #879113
>>879112

> андроендах использует UTF-32.


В каком конкретно месте?
>>879118
45 Кб, 721x306
sage #440 #879117
>>879112

>То-то гугл глупый и андроендах использует UTF-32.

#441 #879118
>>879113
sizeof(wchar_t) в NDK, очевидно же. Да, доступ по индексу. Да, необходимость бранчей или таблиц для вычисления длины строки. А еще инвалидный UTF-8, приводящий к уязвимостям. А еще невозможность порезать строку нормально.
>>879123>>879156
sage #442 #879123
>>879118

>sizeof(wchar_t) в NDK


Пхе-хе-хе, при чём тут android, это libc, старающаяся быть совместимой с glic.

> Да, доступ по индексу.


ffl — вот 3 буквы. Получи по индексу доступ ко второй.

> Да, необходимость бранчей или таблиц для вычисления длины строки.


define "длина строки". Для меня и strlen "длина строки".

> А еще инвалидный UTF-8, приводящий к уязвимостям.


Проблема уязвимых библиотек.

> А еще невозможность порезать строку нормально.


Раскрой мысль.
>>879147
sage #443 #879147
>>879123

> вот 3 буквы


Я про буквы не говорил. Про то, как юникод устроен, я знаю, и про combining characters тоже, и про лигатуры. Но я вполне могу юникод нормализовать, хранить его нормализованным в UTF-32 и потом что-то в таком виде с символами сделать (например, проверить класс по табличке). И делать это проще, когда у тебя codepoint - одна сущность, а не когда тебе ее нужно сначала из байтиков собрать, да еще не забыть на валидность проверить.

> Для меня и strlen "длина строки".


> Проблема уязвимых библиотек.


Нет, вопрос сложнее. Например, я закодировал \0 в виде двух байтов. У либц (strlen, в частности), твоего кода и библиотечного кода могут быть совершенно разные взгляды на этот символ (и это правильно, потому что подход зависит от цели обработки, а та же либц про твои цели нихуя не знает). Кто-то это выбросит, кто-то заменит, кто-то ошибку вернет, а кто-то пропустит.

> А еще невозможность порезать строку нормально.


snprintf() и случай, когда строка не влезла в буфер. Возникают веселые спецэффекты.
>>879153
sage #444 #879153
>>879147

> проверить класс по табличке). И делать это проще, когда у тебя codepoint - одна сущность, а не когда тебе ее нужно сначала из байтиков собрать, да еще не забыть на валидность проверить.


Нет, ну если у тебя единственная задача — проверять класс codepoint-а по табличке, то для тебя UTF-32 — лучший выбор.

> я закодировал \0 в виде двух байтов.


Искусственный пример. Если ввод должен прилетать откуда-то извне, он должен проверяться на валидность. К кодировке это отношения не имеет.

> snprintf() и случай, когда строка не влезла в буфер. Возникают веселые спецэффекты.


Чем же нам тут UTF-32 поможет?
>>879163
sage #445 #879156
>>879118

>sizeof(wchar_t)


Не подскажешь аналог fopen, принимающий wchar_t?
>>879163
sage #446 #879163
>>879153

> Чем же нам тут UTF-32 поможет?


> К кодировке это отношения не имеет.


Тем, что строка останется валидной. А вот если ты порежешь UTF-8 посередине codepoint, у тебя из проверенного, валидного юникода возникнет невалидный, но ПРОВЕРЕННЫЙ, со всеми вытекающими.

>>879156

> fopen()


Это вопрос про недостатки сишной либы, и к тому, какие имена файлов и в какой кодировке принимает ОС. Она может принимать исключительно 7-битный ASCII, если это ембеддед, может принимать исключительно CP866, а может вообще указатель на 16-байтовый бинарный GUID последнее - трустори, если что.
>>879169>>879172
sage #447 #879169
>>879163

>Тем, что строка останется валидной.


Ой-ой-ой. Манявалидной, ты хотел сказать.
Никому нафиг не нужна валидная последовательность байт, люди на буквы смотрят =)

Думаешь, обрезание только по четырёхбайтовым границам спасёт тебя от кривых строк? Ха-ха-ха. До первого клиента, которому ты отрежешь accent-ы от буквы. Желаю успехов в объяснении ему что это валидно.

Кстати, сколько букв в следующей строке "ch"?
>>879180
sage #448 #879172
>>879163

>Это вопрос про недостатки сишной либы


Это про преимущество. Хоть куда-то этот блядский wchar_t не пролез. Его вообще не должно существовать!

> какие имена файлов и в какой кодировке принимает ОС


Ну, кхе-кхе, кхе-кхе, тут может быть проблема. Но если ты принимаешь имена через аргументы командной строки, то должно, в идеале, работать везде.
sage #449 #879180
>>879169

> люди на буквы смотрят


Так проблема-то в том, что компьютеры смотрят на байты. Например, если это логин или имя файла.

> отрежешь accent-ы от буквы


Что лучше: оставить висеть акценты, пролететь мимо \0 в буфере или много позже вернуть из какой-то функции ошибку, когда ее никто не ожидает?

> Кстати, сколько букв в следующей строке "ch"?


Букв две.

В общем, я тебя понял, ты меня понял, друг друга мы не переубедим. У тебя идеальный мир, ограничивающийся линупсами и, подозреваю, прочитанный когда-то манифест про утф8 эвривер, а у нас на работе только пару лет назад ANSI-шные билды дропнули. Алсо, в последнем проекте у меня у самого UTF-8 основной кодировкой, кроме встроенного редактора и абстракций над файловой системой. Время покажет, что из этого выйдет.
>>879183
sage #450 #879183
>>879180

> Что лучше: оставить висеть акценты, пролететь мимо \0 в буфере или много позже вернуть из какой-то функции ошибку, когда ее никто не ожидает?


Ничего не лучше. И UTF32 никак не поможет.

>Букв две.


Не всегда =)
#451 #879189
Можно ли и вправду научиться кодить, читая только мануалы?
#452 #879226
>>876376
Реальные задачи попробуй решать.
#453 #879229
>>877723
Какие в жопу фреймворки???
У Си только один вменямый инструмент для окон - GTK.
#454 #879360
>>879097

>зачем


Мне на вход подается ебаная куча матриц, и операторов между ними. Я должен всё это подсчитать, естественно умножение приоритетная операция. Ну я и подумал собирать матрицы и операторы в стек и постфиксной ротацией всё это вычислять.
>>879363
sage #455 #879363
>>879360
Ну и сделай структурки (либо, если у тебя скаляры тоже есть - union сверху еще), и стек этих структурок.
#456 #879659
Анон, что здесь определяется и для чего?

typedef LONG (WINAPI * NtUnmapViewOfSection)(HANDLE ProcessHandle, PVOID BaseAddress);

Ниже по коду такая строчка:

NtUnmapViewOfSection xNtUnmapViewOfSection;
>>879664
#457 #879664
>>879659
Указатель на функцию.
>>879669
#458 #879669
>>879664
Нафиг он нужен, если можно вызвать саму функцию?
#459 #879671
>>879669
А если неизвестно какую?
#460 #879704
>>879669
для шимминга, для реализации ООП (методы структуры), для реализации функторов, или для передачи функции в функцию
#461 #879736
>>879669
Эта функция была недокументированной на момент написания кода, и чтобы не кусать локти, если Microsoft вдруг ее уберет не уберет, к ней не стали линковаться статически.
#462 #879787
Как сделать что бы программа выполнялась пока не нажать определенною кнопку?
>>879790>>879794
#463 #879790
>>879787
while (!knopkah_is_on)
{
...
}
sage #464 #879794
>>879787
ОС какая? И подробнее расскажи, чего тебе надо. Может, ты трояна пишешь, хз.
#465 #880515
Как мне выровнять ассемблерную ставку на дворд? http://ideone.com/kAflFC

Из-за того, что мои нопы не выровнены, поиск этой метки при помощи указателя на дворд пропускает их.
>>880519
#466 #880519
>>880515
Если это Microsoft, то просто align 4.
>>880521
#467 #880521
>>880519
Не понял. Покажи на примере. Такой код работает не так, как задумано.

http://ideone.com/PGOhV4
>>880557
175 Кб, 2282x2087
#468 #880544
Посоны, я вам свеженького баттхерта принес.
https://www.linux.org.ru/forum/development/13019524
>>880551
#469 #880551
>>880544

>2016


>быдло бугуртит от WinAPI



О времена! А раньше каждый школьник с компьютером был исследователем реестра винды.
>>880564
#471 #880557
>>880521
Хуй знает, что у тебя там задумано, но у меня все выравнивается, мессаджбокс выдает адреса, по которым начинаются твои нопы. Зачем ты ксоришь код и потом вызываешь полученный мусор?
>>880566
#472 #880564
>>880551
Раньше и трава была зеленее, и девки чаще давали.

>>880553
Очередной студент младших курсов.
#473 #880566
>>880557
Делаю протектор. В шеллкоде код между этими метками будет заксорен. Потом он расшифровывается, выполняется и снова зашифровывается.
#474 #880946
http://pastebin.com/vERrVKVZ

за что сатана предал меня ?
>>880947>>880956
#475 #880947
>>880946

struct one {
char a;
char b;
};

struct two {
struct one c;
struct one d;
};

void firstfunction(void source, void dest, int size)
{
memcpy(dest,source,size)
}

void secondfunction(struct two onedata)
{
struct two twodata;
firstfunction((void
)onedata->c,(void )&twodata.c,2);
}

void main()
{
struct two onedata;
secondfunction(&onedata);
}

gcc -g -O2 struct.c -o struct
struct.c: In function ‘secondfunction’:
struct.c:19:2: error: cannot convert to a pointer type
firstfunction((void
)onedata->c,(void )&twodata.c,2);
^~~~~~~~~~~~~
<builtin>: recipe for target 'struct' failed
make:
[struct] Error 1
#475 #880947
>>880946

struct one {
char a;
char b;
};

struct two {
struct one c;
struct one d;
};

void firstfunction(void source, void dest, int size)
{
memcpy(dest,source,size)
}

void secondfunction(struct two onedata)
{
struct two twodata;
firstfunction((void
)onedata->c,(void )&twodata.c,2);
}

void main()
{
struct two onedata;
secondfunction(&onedata);
}

gcc -g -O2 struct.c -o struct
struct.c: In function ‘secondfunction’:
struct.c:19:2: error: cannot convert to a pointer type
firstfunction((void
)onedata->c,(void )&twodata.c,2);
^~~~~~~~~~~~~
<builtin>: recipe for target 'struct' failed
make:
[struct] Error 1
>>880956
sage #476 #880956
>>880946
>>880947
Всё верно.
>>880961
#477 #880961
>>880956
нихуя не верно. надо так

firstfunction(&onedata->c, &twodata.c,2);

и без приведений в данном случае если функция сразу укзатели на войды принимает
>>880963
sage #478 #880963
>>880961

>нихуя не верно


Я имел ввиду, что gcc и сотона правы, предав тебя.
#479 #881119
В рекомендациях книжка Кернигана и Ритчи, в первой же главе -
while(getchar() != EOF)
Как передать ЕОF , если я предаю значение из командной строки в винде? В одном месте советуют ctrl+z, но нифига. Не работает.
CodeBlocks, Win7, TCC
>>881126
sage #480 #881126
>>881119
ctrl+z работает если ничего не было введено после нажатия на enter
56 Кб, 712x1252
#481 #881132
>>869911 (OP)
Перепощу из треда ньфагов, тут вроде уместней?

Подскажите, почему запоминается последняя цифра, если цикл до 15, а цифр в числе 16?
Если я сделаю цикл до 16 значений, то а[16] запишется как 0.
Можете объяснить?

#include<stdio.h>

int main(void)
{
long long h;
do
{
printf("Card number:\n");
h = get_long_long();
} while(h<=0 || h>=9999999999999999 || h<1000000000000);
if (h<1000000000000000)
{
while (h<999999999999999)
h=h*10;
}
int a[16];
int b[16];
int i;
for(i=1; i<=15;i++)
{
printf("%i\n",i);
printf("%lli\n",h);
a[ i ] = (int)(h%10);
h = h/10;
printf("%i\n\n",a[ i ]);
}
for(i=1; i<=16;i++)
{
b[ i ] = a[17-i];
printf("%i ", b[ i ]);
}
}

Ну и ещё, подскажите, если знаете, как проще задать это ограничение на получаемое с клавиатуры число: положительное, от 13 до 16 знаков.
56 Кб, 712x1252
#481 #881132
>>869911 (OP)
Перепощу из треда ньфагов, тут вроде уместней?

Подскажите, почему запоминается последняя цифра, если цикл до 15, а цифр в числе 16?
Если я сделаю цикл до 16 значений, то а[16] запишется как 0.
Можете объяснить?

#include<stdio.h>

int main(void)
{
long long h;
do
{
printf("Card number:\n");
h = get_long_long();
} while(h<=0 || h>=9999999999999999 || h<1000000000000);
if (h<1000000000000000)
{
while (h<999999999999999)
h=h*10;
}
int a[16];
int b[16];
int i;
for(i=1; i<=15;i++)
{
printf("%i\n",i);
printf("%lli\n",h);
a[ i ] = (int)(h%10);
h = h/10;
printf("%i\n\n",a[ i ]);
}
for(i=1; i<=16;i++)
{
b[ i ] = a[17-i];
printf("%i ", b[ i ]);
}
}

Ну и ещё, подскажите, если знаете, как проще задать это ограничение на получаемое с клавиатуры число: положительное, от 13 до 16 знаков.
>>881404
#482 #881404
>>881132
Потому что индексы массивов считают от нуля.
#483 #881409
Нужно создать функцию, которая может принимать в себя любую другую функцию это вроде callback называется. Немного погуглил и наткнулся лишь на примеры с заранее определённым типом и аргументами принимаемой, а мне надо чтобы функция могла принимать ваще любую функцию. Как запилить?
>>881432
#484 #881432
>>881409
void set_voobshe_lyuboy_callback(void *pointer_na_voobshe_chto_ugodno);
>>881436>>881488
#485 #881436
>>881432
А если у функции больше одного аргумента?
>>881459
#486 #881459
>>881436

> pointer_na_voobshe_chto_ugodno


> voobshe_chto_ugodno


Алсо, объясни, что ты будешь с этим колбэком делать, тогда тебе, может быть, и посоветуют.
>>881462
#487 #881462
>>881459
Пока у меня только теория. По идеи просто выполнять функцию при определённых условиях. Что с ним ещё можно сделать?
#488 #881488
>>881432
Попробовал на практике, когда я вызываю указатель на вообще что угодно мне говорят что "pointer_na_voobshe_chto_ugodno is not a function or function pointer".
#489 #881524
>>881488
ALLO
Нет, серьёзно, я спатьки хочу.
Анончик-анончик, ответь мне.
69 Кб, 474x700
#490 #881617
>>881488

> 1488


Указатель, чтобы его вызвать, надо сначала скастовать к тому же самому типу, каким была объявлена функция (иначе undefined behavior). Вот тебе пример. Сначала объявляешь типы своих колбэков (решетку везде заменяй на звездочку):
typedef int (#GovnoPtr)(int arg1);
typedef void (#MochaPtr)(int arg1, char #arg2);
Потом делаешь enum с перечислением своих типов:
enum CallbackType {CALLBACK_GOVNO, CALLBACK_MOCHA};
В свою йоба-функцию-обработчик ты скармливаешь не только указатель на колбэк, но и его тип:
void zaloopa(void #callback_ptr, enum CallbackType type) {
if (type == CALLBACK_GOVNO) {
int result = ((GovnoPtr) callback_ptr)(1488);
} else {
((MochaPtr) callback_ptr)(359, "MYTISCHI UNITY HARDCORE");
}
}
Как-то так.
>>881755>>881785
sage #491 #881641
>>881488

> вызываю указатель


PSSSHHHH UKAZATEL ETO TY?
>>881753
#492 #881753
>>881641
FREE 5 FREE 5 ХОРОНИ ПАМЯТЬ, ХОРОНИ ГОВОРЮ
#493 #881755
>>881617
сук пиздез, блеванул от этой хуйни
>>881758
#494 #881758
>>881755
Предложи свой вариант.
#495 #881785
>>881617
Бляяяя, пиздец.

Я либу пишу, в либе есть функция, которая должна принимать функцию из внешней программы, которая пользуется этой либой. Так вот, мне нужно юзерфрендли! Чтобы просто всё было. А тут... Бляяя, пиздец. Бляяя, пиздец!
>>881786
#496 #881786
>>881785

> принимать функцию из внешней программы


Нельзя вызвать функцию, не зная ее тип.

> мне надо чтобы функция могла принимать ваще любую функцию


Поясни, зачем. Скорее всего, ты хочешь void (∗ callback)(void ∗user_data) - это нормальная практика, максимум юзер-френдли. Ну или в крайнем случае проебать типы и void (∗ callback)(int paramspec, ...), но для этого варианта нужны серьезные основания.
>>881787>>881796
#497 #881787
>>881786
Да, уже дошло, сделал так void (*callback)(void).
#498 #881796
>>881786
Анон, ещё один небольшой вопрос. Вот передал я функцию callback в функцию, а как мне в этой функции записать принятый callback в указатель?
#499 #881797
Ты уже принимаешь указатель на фунцию. Хочешь его куда-то записать - объяви другой указатель на функцию и используй = для присваивания. Или покажи код.
>>881801
#500 #881798
Есть тут кто нибудь?
Один вопрос по си
>>881799
#501 #881799
>>881798
Никого нету. Но ты все равно спрашивай.
>>881800
#502 #881800
>>881799
Окей, например

...
char A[5];
char B[] = "hello3"

Из строки B переписать в А только цифры.

Да, вопрос глупый, но я хз
В интернете ничего не нашел
>>881802>>881803
#503 #881801
>>881797
Спасибо.
Я, идиот, делал ptr = callback(); а надо было ptr = callback;
#504 #881802
>>881800
Помогите пожалуйстаа
#505 #881803
>>881800
Ну объявляешь указатели на оба массива. В цикле читаешь символы по указателю на B, если прочитал '\0' - выходишь из цикла, если прочитал что-то, для чего isdigit() вернул ненулевое значение - пишешь символ по указателю на буфер A. После выхода из цикла пишешь '\0' по указателю на буфер A. Про инкременты указателей не забудь. Алсо, можешь сделать то же с индексами, а не с указателями.
>>881809
2203 Кб, 3264x2448
#507 #881809
>>881803
Делаю с индексами, она почему то ругается
>>881812
#508 #881812
>>881809
Ты не можешь присвоить массив, прочитай в правой части от = нужный тебе символ.
2604 Кб, 3264x2448
#509 #881814
>>881812
Только не А катое
6 Кб, 412x90
sage #510 #881815
>>881812
Забыл k инициализировать. Ну да похуй, пикрелейтед.
>>881817
2612 Кб, 3264x2448
#511 #881816
>>881812
Так правильнее?
2847 Кб, 3264x2448
#512 #881817
>>881815
Ахахахах, пиздец
Да мне кажется мой препод тут ничего кроме while не поймет
Бтв, все равно ругается
>>881819
#513 #881819
>>881817
Ну оно же тебе на чистейшем русском языке говорит, что у тебя не так.
>>881825
#514 #881825
>>881819
Да, спасибо
Доделал, все работает правда пришлось новые слова учить, но это даже хорошо
Спасибо большое, анон
Тред утонул или удален.
Это копия, сохраненная 13 декабря 2016 года.

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

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