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

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

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

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

Что читать:

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

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

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

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

Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.

Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).

Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.

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

Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)

Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)

MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard

Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C

Онлайн-утилиты
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.

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

- №19: https://arhivach.org/thread/248880/
- №20: https://arhivach.org/thread/254158/
- №21: https://arhivach.org/thread/260316/

Шапка: http://piratepad.net/bJ1SdmkZyu
Предупреждение #2 #992652
Крестухи, идите в свой тред!

За крестовопросы — бан.
992660
#3 #992660
>>992652
Упырь свой мел. Ты не модератор, чтобы мне указывать
7 Кб, 220x207
#4 #993457
Ребят, попалась очень сложная задача в курсовике
Даже препод не может ничего сказать, в гугле нихуя, поэтому прошу совет по решению тут, мб кто подскажет что нибудь

Сама задача:

В графе н айти максимальное (по количеству ребер) подмножество попарно несмежных ребер
#5 #993458
>>993457

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


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


Сколько заплатишь?
993459
#6 #993459
>>993458
Аххахах, не прошу решить задачу за меня, просто совет по решению
993460
#7 #993460
>>993459

>просто совет


Займись спортом, скоро понадобится.
993465
sage #8 #993465
>>993460
Аахаххаха, вот ты тварь

Понимаю, я бы тут что то тривиальное спрашивал
993480
#9 #993480
>>993465
Найс, так не похуй, что сажу включил. Нахуя, ты ебанутый?
993488
#10 #993488
>>993480
Я не специально, лол
#11 #993819
>>993457
Никакого секрета тут нет, берешь все подмножества ребер, выбираешь из них попарно несмежные, и ищешь максимальное из них.
#12 #993839
>>993457
1. Попробуй сначала для определённого вида графов - отрезок, цепь, дерево.
2. Попробуй вывести алгоритмы сложения подмножеств несмежных ребёр.
3. Переформулируй задачу, скажем таким способом:
Среди всех рёберных раскрасок графа, необходимо найти раскраску, мощность множества ребер какого-то цвета максимально.

Алсо, с раскраской тут что-то сразу нагуглилось - https://ru.wikipedia.org/wiki/Паросочетание
993951
#13 #993951
>>993839
И там сразу ссылки на алгоритмы поиска наибольших паросочетаний.
99 Кб, 685x493
#14 #993957
>>992632 (OP)
Наверное не совсем по теме треда, но попробую.
Читаю книжку "Практика программирования" 2004 года.
В 9 главе наткнулся на пикрелейтед.
Что за "Гриша" имеется ввиду?
"Фишка" перевода?

В исходниках https://9p.io/sources/extra/9hist/power/errno.h

> Egreg, / it's all greg's fault /



О чём речь-то???
993961
#15 #993960
>>993457
minimal vertex cover
Дальше сам
#16 #993961
>>993957
Какая-то очень старая шутка из Plan9 судя по всему, имеется в виду Greg Chesson. Ну а перевод Greg = Гриша, ну петросянство, ну что поделаешь.
993964
#17 #993964
>>993961
Да, я понял, что Greg сокращение от Gregory, по-нашенски Григорий.
Там даже в исходник есть имя ken кен томпсон видимо, но имена пишутся с большой буквы и это смутило%%.
Да и не совсем было ясно из комментарием. До и после идут обычные комментарии с пояснениями, тут раз какой-то greg.
Вот и смутило.
38 Кб, 829x602
#18 #994827
Репост из крестового треда. Думаю, для С вопрос тоже применим.
Как в VS компилировать код с минимальным размером кроме настроек пикрил?
Какие директивы компилятора нужно использовать, чтобы переменная в в PE-файле была в секции кода, а не инициализированных констант?
Можно ли встроить/переписать себе функции из WinAPI, чтобы не было привязки ко всяким Kernel32.dll, user32.dll, чтоб можно было просто вытащить секцию с кодом из исходного PE файла и вставить её целиком в другую и не ебаться с подгоном адресов функций, импортом и т.п.?
994862
#19 #994862
>>994827
Все можно, но зачем?
994865
#20 #994865
>>994862
Так вышло, что мне нужно написать инжектор, но инжектить собираюсь не зловред, а протектор. В большинстве мануалов инжектят чистый ассемблерный код чисто для JMP в Х-код, но там подходы в основном для кода малого размера без особого выебонства, а мне нужно целую, блядь, программу, запихать в произвольный чужой PE - файл. Вот сижу и думаю, чё делать то с переменными, импортом и всем прочим. Наименьшим геморроем мне представляется просто взять и выдрать .text секцию из протектора и захуярить в защищаемый .exe в отдельную секцию хотя Касперски предлагает размазывать код оверлеем по паддингам секций, но чё то это попаболь, учитывая, что дедлайн через 2 недели, а помимо этого еще куча других дел с дальнейшим смещением точки входа на новую секцию (+ еще надо будет в конце внедренной секции добавить JMP на OEP, но это, надеюсь, не сложно).
994869994877
#21 #994869
>>994865

> целую, блядь, программу, запихать в произвольный чужой PE


Родина дала им LoadLibrary(), но нет, надо изъебываться. В крайнем случае посмотри на reflective dll loader из метасплоита, например.

> чтобы переменная в в PE-файле была в секции кода, а не инициализированных констант?


https://msdn.microsoft.com/en-us/library/wxz26dz2.aspx

> Можно ли встроить/переписать себе функции из WinAPI


Hash-based import, только антивирусы тебя за это очень любить будут, и с SxS-либами в современных ОС все очень непросто.
#22 #994877
>>994865

>LoadLibrary()


Я думал об этом, но, во первых, идея хранить весь протектор в dll мне не нравится. Не могу объяснить почему, наверно потому что факт хранения целого подмодуля в отдельном .dll мне не по душе, хотя реальных аргументов особо нет. Во вторых, у executable, насколько я понял, один хрен выполнение начинается с точки входа программы, и потом уже загружаются библиотеки, у которых дёргают DllMain(), а мне нужно, чтобы сначала начинал работу протектор и только потом, если проверка выполнена успешно, начиналось выполнение самой программы. И тут еще нюанс есть (на мсдн в документации), в DllMain не рекомендуют хранить сложные вычисления, типа загрузчик может залупиться. Хотя сейчас я задумался, можно ведь и просто dll подкинуть в таблицу импортов, сдвинуть EP куда нибудь в оверлей секции (при этом расширив virtual size секции, чтобы это был уже не оверлей), там просто вызвать LoadLibrary(%протектор%.dll), GetProcedureAddress (%протектор.main()%), вызвать процедуру по полученному адресу, а потом JMP на OEP. Какие подводные камни помимо того, что в любом дизассемблере/дебагере вызов функции из dll как на ладони, затри участок NOP'ами оставив только JMP - и поехали. И тут еще вопрос появился - если я собираюсь упаковывать/криптовать код целевого приложения, чтобы нельзя было в дизасме/дебаггере нащупать, то загрузчик ведь не подставит адреса импортируемых функций, как быть?

>https://msdn.microsoft.com/en-us/library/wxz26dz2.aspx


Пасеба. Через #pragma comment() такие вещи позволяется делать?

>Hash-based import, только антивирусы тебя за это очень любить будут, и с SxS-либами в современных ОС все очень непросто.


нихуя не понял, у Касперски только про стандартный, bound и delay импорт читал, но после идеи с LoadLibrary(), если конечно я правильно понял твою подсказку, может вообще откажусь от первоначальной затеи.
994878994879
#23 #994878
>>994877
Так, пожжи ебана, для LoadLibrary ведь вообще не надо либу протектора импортировать, так? Главное, шоб .dll был в папке с .exe? Но тогда мне надо, знать адрес LoadLibrary и GetProcAddress() из Kernel32.dll не говоря уж о том, чтобы она вообще была, хотя подкинуть её не проблема, есть чужая либа для работы с PE для этого, или загрузчик сам увидит, что я использую эти функции и любезно укажет внедренному коду загрузки протектора адреса этих функций?
994879
#24 #994879
>>994877

> идея хранить весь протектор в dll мне не нравится


И зря. Минимум проблем в будущем.

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


CreateProcess(CREATE_SUSPENDED), вставляешь JMP на LoadLibrary по EP, но не забываешь о существовании TLS callbacks. А если exe тоже твой, то нахуя тебе внешний протектор вообще?

> DllMain не рекомендуют хранить сложные вычисления


Чушь. В DllMain нельзя вызывать некоторые функции из-за возможных проблем по причине вздернутого loader lock.

>>994878

> Hash-based import


> нихуя не понял


Посмотри любой шелкод для винды. Получаешь список загруженных длл из PEB, ищешь kernel32, парсишь импорты, ищешь LoadLibrary, грузишь нужные либы, парсишь импорты... Для ускорения процесса, обфускации и уменьшения размеров бинарника имена функций часто хэшируются.
994880
#25 #994880
>>994879

>А если exe тоже твой, то нахуя тебе внешний протектор вообще?


exe не мой, писал же - произвольный чужой exe

>Чушь. В DllMain нельзя вызывать некоторые функции из-за возможных проблем по причине вздернутого loader lock.


Ага, вроде нельзя вызывать функции, вешающие основной тред, типа диалоговых окон. Вот только в случае ошибки проверки предполагается выводить окно типа "поцан ты денешку отдал за программу))?", и тут мне как раз хорошо зашёл бы MessageBox. + вроде не рекомендуется убивать хост-процесс из .dll.

>CreateProcess(CREATE_SUSPENDED)


Дк пользователь же будет запускать программу дабл кликом по .exe. Или в заголовках PE можно указать, чтоб процесс запускался повешенный?
994885
#26 #994885
>>994880

> Дк пользователь же будет запускать программу дабл кликом по .exe.


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


Можно сделать ланчер, который инжектит, что нужно. Можно сделать, чтобы при запуске конкретного exe запускался какой-нибудь другой (это отладочный механизм, не нравится антивирусам, но работает - гугли Image File Execution Options). Я хуй знаю, какие у тебя там требования, но очевидно, что если пользователь может запускать что-то даблкликом без протектора, он будет это делать, а протектор потрет.
995124995331
#27 #995124
>>994885
Ананасы, если я буду писать код, в котором буду использовать системный вызов getaddrinfo для получения значения IP-адреса в виде 32-битного integer (если я всё правильно понял, то getaddrinfo записывает нужное мне значение в struct addrinfo строго в big-endian), то мне ведь не нужно ебаться с порядком байтов для портабельности, если единственной функцией, которая прямо использует полученное значение является вот это:

#define IP_TO_STR(ip_str, ipv4_addr) do { \
snprintf(ip_str, IP4_STR_LEN, "%u.%u.%u.%u", \
(unsigned char) ((ipv4_addr >> 0) & 0xff), \
(unsigned char) ((ipv4_addr >> 8) & 0xff), \
(unsigned char) ((ipv4_addr >> 16) & 0xff), \
(unsigned char) ((ipv4_addr >> 24) & 0xff)); \
} while (0)
995125995149995332
#28 #995125
>>995124
Упс, не туда ответил
#29 #995149
>>995124

> IP_TO_STR


Да, порядок всегда будет сетевым (big endian), но зачем ты изобретаешь inet_ntoa?
995151
#30 #995151
>>995149

>inet_ntoa


Пишет в статический буфер, а мне многопоточность нужна.
995154
#31 #995154
>>995151
Не знаю насчет линуксов, но в винде этот буфер - per-thread.
995156
#32 #995156
>>995154
На юниксах - нет (по крайней мере в мане thread-safe нигде не указано. А упоминание о использовании статического буфера есть). Другое дело, что есть inet_ntop, но мне она не подходит, т.к. не на всём нужном железе поддерживается.
995157
#33 #995157
146 Кб, 720x960
#34 #995311
Лабодаун на связи. Есть задание:
1)Создание структурированного типа данных:
-Книга: название, предметная область, год издания
2)Действия над массивом структур:
-подсчет количества книг, относящихся к предметной области "Физика";
-нахождение книги с самым старым годом издания.

1) часть я сделал по крайней мере всё выводится, код: https://pastebin.com/yF0hgZ5T
2) прошу помощи у вас разобраться с этой хуетенью. В теории понимаю что нужно сделать - создать массив в виде отдельной функции которая будет считать эти книжки, но блять, нихуя не получается, нужно до завтра. Верю в тебя, анон!
9953161011837
#35 #995316
>>995311
А что не получается-то? Копипиздишь цикл с 24 строки.

> Посчитать по предметной области


Создаешь счетчик, присваиваешь 0. В цикле идешь по книгам, с помощью strcmp сравниваешь field текущей книги со строкой "Физика", если возвращается 0, увеличиваешь счетчик.

> нахождение книги с самым старым годом издания


Заводишь переменную oldest_index, присваиваешь 0. Идешь в цикле по книгам, если год текущей книги меньше года книги с oldest_index, записываешь в oldest_index индекс текущей книги.
995639
179 Кб, 1280x853
#36 #995329
Уже очень долго не могу решить одну простенькую задачку, поэтому спрошу тут

Задача:
В заданном бинарном дереве посчитать количество вершин на N-ном уровне, считая корень вершиной 0-ого уровня

Саму программу я написал, но работает она не так, как нужно

Скорее всего ошибка в этой функции - https://pastebin.com/XPxGaaD4

Идея в том, что я разделяю уровни NULL'ом И когда мы находимся на нужном уровне выходим из цикла и просто достаем элементы из очереди до последнего NULL'а. res - результат

Put - функция для добавления элемента в очередь
Get - функция для взятия элемента из очереди
Empty - функция для проверки на пустоту очереди

Вот фулл код - https://pastebin.com/gLUVEhf0
995341
#37 #995331
>>994885
многострочные макросы - зло, десу
995332995341995342
#38 #995332
>>995331
>>995124
Не туда.
#39 #995341
>>995331
Зло, когда нечитаемые. А это - вполне читаемый макрос. Хотя можно было бы и inline-функцию сделать.

>>995329
Хуй знает, у тебя все вроде норм, кроме того, что корень получается вершиной 1 уровня, а не 0, ну и т. д.
995344
#40 #995342

>>>995331


Вот-вот

while (!Empty(q))
{
z = Get();
res = res + 1;
}

Единственное в чем сомневаюсь, это этот цикл, правильно ли >while (!Empty(q)) в этом случае
995344995390
#41 #995344
#42 #995390
>>995342
Ну можно слегка поправить логику. Как-то так (на изменения вне ShowTree не смотри): https://pastebin.com/WyJwiuQN ideone только у меня сломался и ничего не постит?
995915
26 Кб, 516x236
#43 #995639
>>995316
Ну во захуярил счетчик с циклом, но консоль крашится, после того как я ввожу последний год 3 книги https://pastebin.com/tHewRGBP
995656
sage #44 #995656
>>995639
1) У тебя там gets_s неправильно вызывается, где второй аргумент? И вообще лучше используй scanf везде, коли начал: scanf("%30s", libry[ i].name). И getchar() тогда из тела цикла убери, scanf сама пробелы и переводы строк пропускает.
2) k не инициализируешь.
3) strcmp() == 0 надо. strcmp как бы "вычитает" одну строку из другой, и когда их "разность" == 0, строки равны.
995706
75 Кб, 1160x509
#45 #995706
>>995656
что неправильно вызывается? вот пик, всё выводится же нормально. k инициализирована, в pastebin чекни, ну или на скрине
995732
sage #46 #995732
>>995706

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


https://msdn.microsoft.com/ru-ru/library/5b5x9wc7.aspx Посчитай аргументы там, а потом у себя. И ворнинги в компиляторе включи, блять.

> всё выводится же нормально


Счастливое совпадение.

> k инициализирована, в pastebin чекни


int k;
k = k + 1 это не инициализация. Ты по сути пишешь int k = мусор; k = мусор + 1.
995749
102 Кб, 1153x691
#47 #995749
>>995732
Спасибо, всё захуярил
#48 #995757
>>992632 (OP)
Ананасы, это вообще нормальный стиль, когда исолняемый файл динамически линкуется с shared либой и использует её функции, а либа в свою очередь использует внешнюю переменную бинарника (т.е. в либе имя переменной объявлено как extern)? Я вот до сегодняшнего дня не знал даже, что так можно делать (дергать переменные исполняемого файла из подключаемой библиотеки) и теперь не уверен - а правильный ли это подход?
995759995762
#49 #995759
>>995757
И вообще - как оно работает? Я вот сделал objdump исполняемого бинарника и не увидел имени переменной, которая используется
995760
#50 #995760
>>995759
А, нет, пизжу, увидел.
#51 #995762
>>995757
В общем-то забейте, я понял, что это - хуевая идея
#52 #995888
Кто-нибудь собирал сишный проект sdl2 с cmake на винде? Блять, у меня пиздец от этой кривой хуйни горит уже. С linux все просто и понятно. Вот тут хидеры, вот тут сошки, линкуй и инклюдь на здоровье.
Неужели ради одной большой хуйни целый цирк придумывать?
995890995981
#53 #995890
>>995888
Кросскомпилируй на линуксе, если тебе так сложно. В чем конкретная проблема-то?
995946
#54 #995915
>>995390
Спасибо огромное, очень помог

Только один вопрос

Что такое

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

>#define _CRT_SECURE_NO_WARNINGS


Это знаю, но чем это отличается от обычного

#define _CRT_SECURE_NO_WARNINGS
995943
#55 #995943
>>995915
Ничем. Просто _MSC_VER определяется компилятором Microsoft Visual C++, и соответственно дефайн делается только для этого компилятора. Это в принципе не обязательно, но как бы намекает читающему, что во всем виноват Microsoft.
#56 #995946
>>995890

>В чем конкретная проблема-то?


Я понятия не имею, что нужно кроме хидеров для сборки под винду и чем после cmake это собирать.
995947
#57 #995947
>>995946
Кроме хидеров нужны либы. Компилируется все абсолютно так же, как в линуксах.
995978
#58 #995973
В си вообще есть какая-либо либа, с помощью которой можно нормально резолвить DNS-имена?
995988
#59 #995978
>>995947

>Компилируется все абсолютно так же, как в линуксах.


Ну тут ты перетолстил.
#60 #995981
>>995888

>Кто-нибудь собирал сишный проект sdl2 с cmake на винде?


В MSYS2 не получится?
996365
#61 #995988
>>995973
В Си нет. В большинстве ОС есть gethostbyname(), что подключать - гугли.
995991
#62 #995991
>>995988

>В Си нет.


Ух придерся. Ну ладно, мне нужно что-нибуть более-менее POSIX-совместимое (ну или хотя бы чтоб на большинстве эмбеддед и не очень линуксов работало).
gethostbyname, getaddrinfo и вся эта библиотечная ебала не подходит, т.к. а) они слишком перегружены всякой хуйней б) не являются по сути DNS-резолверами в) не гибкие (например, нельзя даже установить таймаут запроса). Дефолтный gethostbyname еще и кривой, т.к. не может в многопоточность.
Тут стандартными библиотечными функциями не отделаешься никак и нужно готовое решение, но я пока еще не сильно горю желаниям велосипед писать.
996009
#63 #996009
>>995991

> Дефолтный gethostbyname еще и кривой, т.к. не может в многопоточность.


Опять ты начинаешь. Мы же уже выяснили, что может, если это линукс и glibc. В линуксе есть асинхронный getaddrinfo_a, и без проблем со статическим буфером заодно. Не нравится - спизди из той же glibc или uclibc. Ну и на гитхабе DNS-клиентов до жопы. Может кто и посоветует что-то конкретное, но у меня никогда не возникало необходимости в кастомном ресолвере.
#64 #996365
>>995981

>MSYS2


Сейчас погуглю что это и попробую.
#65 #996405
Поколдовал с библиотеками под VC и cmake, таки теперь нормально собирается и в community vc. Хотя бы так.
#66 #996419
Предлагаю добавить в шапку следующего треда http://c-faq.com/index.html
996429
sage # OP #67 #996429
>>996419
А как насчет внимательно посмотреть на шапку?
996481
#68 #996449
Почему до сих пор не перешли на С++??????
996450996463
#69 #996450
>>996449
1) Слишком много прыжков по оперативной памяти.
2) Синтаксис я/п можно взять и новый, от Ц++
3) Наследование реализации — зло.
#70 #996463
>>996449

> С++


Говно от васяна
Аноним #71 #996481
>>996429
Извиняюсь, обосрался.
#72 #997085
Ананасы, есть ли принципиальное отличие между программированием риалтаймовых задач и нериалтаймовых? Нужны ли для этого какие-то дополнительные знания? Вот я сишкоблядил на линуксе и на некоторых железяках с FreeRTOS/ThreadX многопоточные приложения, вроде бы всю эту хуйню хорошо понимаю. Теперь собираюсь уходить на новую работу, где пилят в юзерспейсе QNX риалтаймовую automotive хуйню. Вроде бы это - тот же POSIX с некоторым дополнительным IPC и гибкой настройкой всяких там планировщиков. Но переживаю, что буду сначала жутко тупить и делать слишком детские ошибки
14 Кб, 261x210
#73 #997226
Сап, есть короче такая структура и затуп там, где стоит ???.
Как обратиться к clr для элемента массива?
997234997243
#74 #997234
>>997226

>Как обратиться к clr для элемента массива?


Я нихуя не понял.
997243
#75 #997243
>>997234
>>997226
Не бейте, лучше обоссыте.
arr[0].clr будет. Я дико тупанул, вопрос снимается.
#76 #997343
Как

delete[] t;

С с++ выглядит на Си?

Просто free(t); ?
997429
sage #77 #997429
#78 #997718
Посоны, я тут говнину учу, вот сижу домашку делаю. Написал говнокод, и не знаю как его улучшить.
скажите, тут совсем ВСЕ ПЛОХО или это просто ПОЛНЙ ПИЗДЕЦ?

http://ideone.com/uUBXQe
997728
#79 #997728
997735
#80 #997735
>>997728
а конкретнее?
997752
#81 #997752
>>997735
Ну поехали:
1) T payload; Смысл есть, но это когда оно в хедере. Этакие шаблоны для бедных: задефайнил T, подключил хедер, получил реализацию для T (но только один раз в одном модуле). В остальных случаях лучше написать прямо или хотя бы делать T не дефайном, а вменяемым тайпдефом (PayloadType?).
2) Node ∗newNode(): где void в скобках? Это точно Си?
3) Касты для malloc() не нужны, он возвращает указатель на void.
4) Сообщения об ошибках посреди реализации библиотечного, по сути, кода. Но для лабы в принципе сойдет.
5) if (q == NULL) { puts("Out of memory!"); return ∗q;}: это типа все равно продолжать бесполезно, давайте умрем прям тут? Или опечатка?
6) qPush: это какой-то бессвязный список. Одним концом втыкаем элемент в очередь, второй конец очереди в воздухе висит. Где tmp->next инициализируется, я вообще не нашел.
7) &q->oldest == &q->recent: если адрес одной ячейки структуры равен адресу другой ячейки структуры, то... это union, блять. Потом там какой-то дабл-фри и опять бессвязный список. Что? Еще один фри? Ох, ебать!
8) Что там творится с рекурсией ниже 100 строчки, я вообще не распарсил.
9) Стека не увидел.
10) Начиная читать, я ожидал увидеть: Queue_AddToHead, Queue_RemoveFromHead и аналогично для Tail. Тогда реализация стека ограничилась бы использованием уже готовой Queue и молчаливым игнором пары функций для работы с одним из концов Queue.
11) В идеале я бы вообще выкинул весь мемори-менеджмент из кода Queue, оставив только лишь управление двусвязными списками, ну и проверку размера, если очень хочется. Тогда я мог бы сам решать, что туда класть и где выделять под это память:
typedef struct ListNode { struct ListNode ∗prev, ∗next; } ListNode;
void Queue_AddToHead(Queue ∗q, ListNode ∗node);
ListNode ∗Queue_RemoveFromHead(Queue ∗q);
typedef struct MyYobaType { ListNode listNode; int my_payload; char another_payload[10]; };
...
MyYobaType ∗item = malloc(sizeof(∗item));
... some init ...
Queue_AddToHead(q, &item->listNode);
MyYobaType ∗item2 = Queue_RemoveFromHead(q);
if (item2) {
...;
free(item2);
}
Так сделано в ядре винды, например.
#81 #997752
>>997735
Ну поехали:
1) T payload; Смысл есть, но это когда оно в хедере. Этакие шаблоны для бедных: задефайнил T, подключил хедер, получил реализацию для T (но только один раз в одном модуле). В остальных случаях лучше написать прямо или хотя бы делать T не дефайном, а вменяемым тайпдефом (PayloadType?).
2) Node ∗newNode(): где void в скобках? Это точно Си?
3) Касты для malloc() не нужны, он возвращает указатель на void.
4) Сообщения об ошибках посреди реализации библиотечного, по сути, кода. Но для лабы в принципе сойдет.
5) if (q == NULL) { puts("Out of memory!"); return ∗q;}: это типа все равно продолжать бесполезно, давайте умрем прям тут? Или опечатка?
6) qPush: это какой-то бессвязный список. Одним концом втыкаем элемент в очередь, второй конец очереди в воздухе висит. Где tmp->next инициализируется, я вообще не нашел.
7) &q->oldest == &q->recent: если адрес одной ячейки структуры равен адресу другой ячейки структуры, то... это union, блять. Потом там какой-то дабл-фри и опять бессвязный список. Что? Еще один фри? Ох, ебать!
8) Что там творится с рекурсией ниже 100 строчки, я вообще не распарсил.
9) Стека не увидел.
10) Начиная читать, я ожидал увидеть: Queue_AddToHead, Queue_RemoveFromHead и аналогично для Tail. Тогда реализация стека ограничилась бы использованием уже готовой Queue и молчаливым игнором пары функций для работы с одним из концов Queue.
11) В идеале я бы вообще выкинул весь мемори-менеджмент из кода Queue, оставив только лишь управление двусвязными списками, ну и проверку размера, если очень хочется. Тогда я мог бы сам решать, что туда класть и где выделять под это память:
typedef struct ListNode { struct ListNode ∗prev, ∗next; } ListNode;
void Queue_AddToHead(Queue ∗q, ListNode ∗node);
ListNode ∗Queue_RemoveFromHead(Queue ∗q);
typedef struct MyYobaType { ListNode listNode; int my_payload; char another_payload[10]; };
...
MyYobaType ∗item = malloc(sizeof(∗item));
... some init ...
Queue_AddToHead(q, &item->listNode);
MyYobaType ∗item2 = Queue_RemoveFromHead(q);
if (item2) {
...;
free(item2);
}
Так сделано в ядре винды, например.
997766
#82 #997766
>>997752
Окей. Спасибо. То есть, тут нужно сразу оговорится, что я не настоящий сварщик, конечно. И это вообще моя первая штука на С, сложнее хеловорлда.

>Смысл есть, но это когда оно в хедере.


особенности домашки, препод просит все сдавать в одном файле.
Я понимаю, что в жизни в жизненном примере это должно быть иначе. Но это чисто попробовать, посмотреть как оно.

>где void в скобках? Это точно Си?


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

>Касты для malloc() не нужны


ок, просто решил перестраховаться. Они остались после рефакторинга, на самом деле. изначально, вместо newNode(); был именно каст. потом я обернул в функцию и добавил инициализацию. а маллок так и остался.>>997752

> это типа все равно продолжать бесполезно, давайте умрем прям тут?


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

>Где tmp->next инициализируется, я вообще не нашел.


Он инициализируется как NULL при создании ноды. Хвост показывает в нулл, да. Когда к хвосту прибавляется еще один элемент, нулл становится поинтром на последний элемент (который теперь показывает на предыдущий и в нулл).

>&q->oldest == &q->recent: если адрес одной ячейки структуры равен адресу другой ячейки структуры, то...


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

>Что? Еще один фри? Ох, ебать!


ЩВАБОДКА ЖИ. На самом деле, когда элемент списка больше не нужен, я его грохаю. Я совершенно не уверен, что я это делаю правильно, но, да, я не настоящий сварщик, я ленивое быдло котрое привыкло полагатся на коллекторы.

>Что там творится с рекурсией ниже 100 строчки, я вообще не распарсил.


Это тупая шутка, слабо имеющая отношение к коду вообще. Можно считать это инструментом дебага. Это говно рекурсивно бежит по n->next пока не уткнется в нулл поинтер и печатает payload в консоль. Почему рекурсивно? Да потому что пошли вы нахуй, вот почему. Этот код не делает ничего полезного и написан через жопу вполне осознано.

>Стека не увидел.


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

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



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

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

Но окей, спасибо, комментарии познавательные. Но, еще раз, это реально первый раз в жизни, когда я пишу что-то отдаленно похожее на реальный код в сях. И я не то, что бы когда-то собирался учить именно Си или реально кодить на нем. Я высокоуровневое быдло. Но кто-то решил что в жизни недостаточно боли, и решил показать некоторые премудрости кодинга на примере Сей. Ну, чтоб знал, сынку, откуда в твоих жавах массивы берутся. Это, конечно, интересно, и дохуя чего понял из того что раньше было просто ебаной магией, но я нет. Спасибо, но нет.
#82 #997766
>>997752
Окей. Спасибо. То есть, тут нужно сразу оговорится, что я не настоящий сварщик, конечно. И это вообще моя первая штука на С, сложнее хеловорлда.

>Смысл есть, но это когда оно в хедере.


особенности домашки, препод просит все сдавать в одном файле.
Я понимаю, что в жизни в жизненном примере это должно быть иначе. Но это чисто попробовать, посмотреть как оно.

>где void в скобках? Это точно Си?


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

>Касты для malloc() не нужны


ок, просто решил перестраховаться. Они остались после рефакторинга, на самом деле. изначально, вместо newNode(); был именно каст. потом я обернул в функцию и добавил инициализацию. а маллок так и остался.>>997752

> это типа все равно продолжать бесполезно, давайте умрем прям тут?


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

>Где tmp->next инициализируется, я вообще не нашел.


Он инициализируется как NULL при создании ноды. Хвост показывает в нулл, да. Когда к хвосту прибавляется еще один элемент, нулл становится поинтром на последний элемент (который теперь показывает на предыдущий и в нулл).

>&q->oldest == &q->recent: если адрес одной ячейки структуры равен адресу другой ячейки структуры, то...


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

>Что? Еще один фри? Ох, ебать!


ЩВАБОДКА ЖИ. На самом деле, когда элемент списка больше не нужен, я его грохаю. Я совершенно не уверен, что я это делаю правильно, но, да, я не настоящий сварщик, я ленивое быдло котрое привыкло полагатся на коллекторы.

>Что там творится с рекурсией ниже 100 строчки, я вообще не распарсил.


Это тупая шутка, слабо имеющая отношение к коду вообще. Можно считать это инструментом дебага. Это говно рекурсивно бежит по n->next пока не уткнется в нулл поинтер и печатает payload в консоль. Почему рекурсивно? Да потому что пошли вы нахуй, вот почему. Этот код не делает ничего полезного и написан через жопу вполне осознано.

>Стека не увидел.


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

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



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

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

Но окей, спасибо, комментарии познавательные. Но, еще раз, это реально первый раз в жизни, когда я пишу что-то отдаленно похожее на реальный код в сях. И я не то, что бы когда-то собирался учить именно Си или реально кодить на нем. Я высокоуровневое быдло. Но кто-то решил что в жизни недостаточно боли, и решил показать некоторые премудрости кодинга на примере Сей. Ну, чтоб знал, сынку, откуда в твоих жавах массивы берутся. Это, конечно, интересно, и дохуя чего понял из того что раньше было просто ебаной магией, но я нет. Спасибо, но нет.
997771
#83 #997771
>>997766

> IDE и коньпилятор ни словом не обмолвись. Ни ворнинга, нихуя.


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

> Он инициализируется как NULL при создании ноды


Читал жопой, каюсь. Но в общем-то, при oldest == NULL стоит присваивать к oldest, и к recent сразу один и тот же элемент.

> &q->oldest == &q->recent


Ты имел в виду запись без &, поверь. Иначе ты сравниваешь адреса памяти, где лежат указатели (а они лежат рядом в структуре, разница в байтах sizeof(struct Node ∗), в элементах = 1). Но смысла условия я не понял, хотя и предполагаю, что вместо первых двух free() ты хотел просто присвоить NULL (задумайся - ты удалил 1 элемент, а память освобождаешь трижды!). Последний free() ок.

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


Ты так говоришь, как будто в жабе связанные списки по-другому делаются.
21 Кб, 514x237
#84 #997883
https://ideone.com/1ibTxC
Куда тут \0 воткнуть чтобы заработало?
997948
#85 #997948
>>997883
Ты просишь повторить четырежды, а сравниваешь с тремя повторами. Другое дело, что sizeof(char) == 1 по определению, памяти выделяешь мало (тебе нужно len ∗ count + 1, где 1 - это место под \0). Ну и без strcat можно было обойтись, не бегая каждый раз от начала строки в поисках ее конца, когда ты по факту знаешь, где начнется очередной кусок, и можно было бы хоть через memcpy копировать.
997983
#86 #997983
>>997948
Скопировал криво. Здесь https://www.codewars.com/kata/string-repeat/train/c
этот код всё равно не работает и с + 1 , может в задании ошибка
997987997988
#87 #997987
>>997983
Не заметил очевидную проблему. Когда ты выделяешь буфер через malloc(), его содержимое не определено. В том числе, там может содержаться какой-нибудь мусор. strncat() добавляет строку в конец этого мусора. Ты был прав, тебе на самом деле нужно было воткнуть ∗result = '\0'; (перед циклом), чтобы изначально буфер был пустой строкой, и strncat() работал правильно.
#88 #997988
37 Кб, 836x345
37 Кб, 950x509
#89 #998117
Репост из крестового треда
Друиды, помогите. Хочу вызвать LoadLibraryA по адресу в виртуальной памяти, при этом адрес я хочу получить сам, основываясь на данных таблицы импорта скомпилированного PE файла и ImageBase, который я получаю через FindImageBase(). Я скомпилировал приложение (код 1.png), вытащил из получившегося PE RVA функции LoadLibraryA. Как я понял, это RVA, в который будет записан VA той самой функции, но тем не менее получаемый адрес отличается от того, что я получаю по auto x = LoadLibraryA. ЧЯДНТ?
998152998914
#90 #998152
>>998117
Это может быть как нибудь связано с relocation'ами? Типа, мне чтоб получить действительный RVA, нужно к значению из PE файла прибавить фактический ImageBase -
номинальный ImageBase?
#91 #998914
>>998117
Я у мамы хакир? GetProcAddress не модно у нынешних хакиров уже?
#92 #998948
Я решил в качестве обучения, состряпать свой язык программирования со СБОРЩИКОМ МУСОРА и кросс компиляции . Стандартную библиотеку думаю запилить на Си компонентах libcurl, libxml2. Если язык применяет подход с автоматической сборкой мусора , то можно ли использовать в ней либы из Си?
999187
#93 #999014
Привет, я ищу человека, который поможет мне в написании кода на си. Основная проблема в том, что мне нужно скорее даже не написать программу, а понять некоторые вещи, которым я не смогла найти объяснения в книге. Понимаю, что мало кому захочется возиться со мной бесплатно, но больших сумм предложить не могу (об этом лучше поговорить лично). Еще могу в ответ научить чему-нибудь другому. Можно будет общаться через скайп (так даже удобнее), но, к сожалению, я живу во Владивостоке и не факт, что мы сможем найти удобное для нас время.
Контакты:
hekkus*@)hunANUSbkp5\PUNCTUMrCaGu
тг - @Hekkushun
999066999127999187
#94 #999066
>>999014
Правила знаешь?
#95 #999127
>>999014

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


сиськами на камеру свети в качестве оплаты
#96 #999187
>>998948

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


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

>>999014
Тут спрашивай.
#97 #999380
Батяни, помогите с книгой. В шапке-то всё написано, но оно для бегиннеров, как бы. Та же K&D кажется, что это больше как мануал для референсов, а не собственно учебник.
Сам имею пхп-бекграунд, хочу вкатиться в С, подскажите нормальный учебник.
999392
#98 #999392
>>999380
Читай для бегиннеров, делай задачки. После K&R или Праты можно уже брать простенькую реальную задачу и по ходу дела разбираться с тем, чего не знаешь. Ну или можно сверху еще Стивенса про юникс-программинг навернуть.
999800
#99 #999393
Пытаюсь переделать свой интерпретатор BF 5-летней давности под ввод/вывод в буферы вместо stdin/stdout.

https://ideone.com/7RspWD - так всё работает
https://ideone.com/LttVQ8 - input_ptr теперь аргумент функции, а не глобальная переменная. Почему сегфолтится может кто объяснить?

(я хочу все глобальные переменные перенести в параметры, чтобы функцию run() можно было вызывать много раз)
999397999430
#100 #999397
>>999393
Не запускал, но очевидное отличие между двумя версиями: когда ты когда ты запускаешь вторую версию, и рекурсивно вызванная run() меняет свой input_ptr, она меняет свой, локальный input_ptr, а внешняя run() этого изменения, конечно же, не видит, у нее тоже свой локальный input_ptr. Передавай указатель на указатель или сразу сообрази себе структуру с контекстом, в числе которого будет лежать и input_ptr тоже.
999402
#101 #999402
>>999397
А мне представлялось, что указатель он на то и указатель, чтобы иметь один адрес в любой точке программы, теперь понятно.
999403
#102 #999403
>>999402
Нет, указатель - это просто адрес адреса, никакими выдающимися свойствами не обладает.
#103 #999430
>>999393
https://ideone.com/SHTWFd
Такая хрень получилась в итоге. Пытался заменить 3 параметра для строки кода на один указатель, но не получилось из-за логики в циклах.
999465
#104 #999465
>>999430

>SHTWFd


SHIT WTF DUDE
#105 #999496
>>992632 (OP)
Итак, господа, написал кусок кода со следующей идеей: беру изображение, загружаю его в память как массив из w*h элементов типа unsigned long. Я хочу посчитать, сколько раз мне встречается каждый из возможных цветов, при этом я хочу несколько упростить задачу и все пикселы округляю, сдвигая их побитово на 4 вправо и потом на 4 влево. Получается охуительный массив с округлёнными пикселями, это я проверил и это хорошо работает.
Дальше я хочу посчитать, сколько раз встречается пиксел каждого цвета. Результаты заношу в табличку, но пока до этого не дошло и я просто вывожу в терминал через printf. Вижу два пути решения: либо я каждый пиксел проверяю на присутствие в таблице, и если он там есть - инкрементирую счётчик для него, а если нет - дописываю со счётчиком 1. Этот способ, я проверил, работает, но долго и хуёво. Второй способ: беру первый попавшийся пиксель, проверяю весь массив, высчитывая, сколько раз он там встречается, если вижу другой - выписываю в другой массив. Потом вызываю мою функцию уже с другим массивом, из которого те пиксели уже как бы вычтены. И так повторяется, пока в массиве не останется элементов. И, как я уже написал, к нему я список свой не прикрутил. Для маленьких изображений работает пиздато. Но если взять сколько-нибудь большое изображение, начинается пиздец, он выводит ошибку сегментации довольно быстро. Уменьшать количество цветов путём сдвига более чем на 4 не помогает, разбивать изображение на куски почему-то тоже: код нормально выполняется для нескольких первых кусков, потом посылает меня нахуй с помощью segmentation fault.
Функция http://ideone.com/Vlt4RU
999501
# OP #106 #999501
>>999496
Есть неебически простое и неебически быстрое решение. С целыми 32-битными пикселами не работает (на 32-битных машинах), но если откинуть альфу, вполне норм. Суть:
1) Выделяешь массив uint32_t count[N]. Размер массива = 256 x 256 x 256 = 0x1000000 элементов. По 4 байта на элемент - это 64 мегабайта. Это много, зато быстро (да и нужно ненадолго). Выделять лучше calloc-ом, чтобы потом не пришлось бегать по нему и обнулять. Создаешь еще счетчик total = 0.
2) Идешь по входному массиву пикселов: берешь i = pixel & 0xffffff (т.е., без альфы) и просто делаешь (count++ || total++). В результате получаешь total равным количеству цветов в массиве, можешь на его основании выделять дальнейшие буферы и т.п.
3) Идешь по получившемуся массиву count (индекс - цвет, count[индекс] - количество). Выписываешь все ненулевые элементы. Можешь сортировать там по ходу дела (или после) по количеству использований, приводить к палитре и т.п. (фиг знает, зачем тебе это понадобилось), дело твое.
4) Очевидно, что если тебе нужны округленные или пикселы, тебе понадобится меньший массив count, но суть не изменится (если использовать старшие 4 бита каждого компонента (i = pixel_b >> 4 | pixel_g >> 4 | pixel_r >> 4), то 24 бита = 16, 163 компонента[/s] = 4096 элемента размером 4 КиБ x sizeof(uint32_t) = 16 килобайт массив).
999503999637999641
#107 #999503
>>999501

> делаешь (count++ || total++).


(count[ i ]++ || total++) блядская макака.
1141 Кб, 1920x1080
#108 #999637
>>999501
Спасибо, охуенно работает. Обработка пикрелейтед: https://pastebin.com/pGuTDKGx
То есть примерно в два раза быстрее вышло. На некоторые другие файлы выходит быстрее, например, вместо 0.111 получается 0.033.
#109 #999641
>>999501
Не подскажешь способ узнать через терминал память, которую жрёт этот процесс? Время я узнаю запуская time ./test, а вот что с памятью - хз, гуглится не очень хорошее что-то.
Сейчас единственный способ узнать реальную память, которую процесс жрёт - это въебать в него сразу файлов 100 и пока он будет охуевать - отследить через pid.
999644
#110 #999644
>>999641

> Не подскажешь способ узнать через терминал память


Ну можешь открыть для себя удивительный мир профилирования: http://valgrind.org/docs/manual/ms-manual.html
Алсо, time -v вроде умеет показывать максимум (только не тот, который в баш встроен, а который отдельной утилитой).
999645
#111 #999645
>>999644
Спасибо, буду разбираться.
#112 #999800
>>992632 (OP)
>>999392

>После K&R


Начал я его читать. Что-то я не пойму, неужели это самая крутая книга по С? Там прямо с первой страницы кормят говном 80-ых в виде main() {}, когда по современному стандарту может быть только int main() { return 1; } . Аноны, помогите, посоветуйте книгу хорошую по современному этапу развития языка, не хочу окунаться в какую-то неразбериху и потом переучиваться. Разве это сложно просто дать нормальную книгу?
999822
# OP #113 #999822
>>999800

> Там прямо с первой страницы кормят говном 80-ых в виде main() {}


Вот не начинай только. В первых тредах уже были срачи, они ничем хорошим не кончились. Да, синтаксис старый, да в C11 implicit int убрали. Но не все пишут на C11, в жизни все равно придется со старым кодом сталкиваться. В качестве введения в язык книга вполне сойдет.

> может быть только int main() { return 1; }


Если говорить о современных стандартах, то ты void в аргументах забыл. Ну и return 1 - это return EXIT_FAILURE.

> Разве это сложно просто дать нормальную книгу?


Прата. Есть в шапке. Я всегда советовал читать обе. И потом еще десяток. И мануал к компилятору. И вообще все что видишь.
999850999851
#114 #999850
>>999822
Да я только вкотился в этот ваш С. Так как должна выглядеть самая простая функция main? Я как ньюфаг совершенно сконфужен. В книге мне говорят одна, на stackoverflow другое, CLION предлагает по умолчанию третье. Ненавижу эту путаницу, когда вкатываешься куда-либо.
999859999880
#115 #999851
>>999822

>Прата


>Stephen Prata "C Primer Plus


и да, эта же по плюсам, не?
999852
#116 #999852
>>999851
нашёл по обычному С, посмотрю её, но всё равно бешусь от путаницы
#117 #999859
>>999850
Ты бы еще в плюсы или фортран покатился. Это говно за свои пятьдесят лет обросло тысячами ревизий, которые меняют то как надо этот язык. А вот информационную сферу от говна атлантов никто не чистил.

Соответственно, запросы в гогель бьешь не через C, а через C11. И книжки ищешь, в которых указано, что автор выучил весь новый стандарт перед тем как начать вываливать буквы.
sage #118 #999880
>>999850

> Так как должна выглядеть самая простая функция main?


int main(void);
int main(int argc, char ∗argv[]); // Или char ∗∗argv, это синонимы в данном случае.

И дополнительно реализация языка может предлагать еще какие-то варианты. Например, int main(int argc, char ∗argv[], char ∗envp[]); очень часто поддерживается. Но стандартных только два.
Минимальное тело main() пустое: {} (начиная с С99 разрешили в main(), и только в ней! не писать return - это равносильно возврату 0).
1000021
#119 #1000021
>>999880
Можно еще void main(), тогда в конце return 0 подставит компилятор. А для выхода с кодом ошибки использовать exit().
1000055
#120 #1000055
>>1000021
void main() - это кресты. Не путай людей.
39 Кб, 616x650
32 Кб, 588x554
51 Кб, 634x789
#121 #1000156
Вопрос про OpenSSL
Я слышал, что все приложения, использующие данные либы стараются использовать .dll для быстрой поддержки секурити обновлений, и не вшивают OpenSSL статически (в том же Qt)
Однако где тогда находятся эти .dll в браузерах или в том же стиме?
1000163
sage #122 #1000163
>>1000156
Во-первых, в Chromium уже года три как свой форк: https://www.chromium.org/Home/chromium-security/boringssl . Во-вторых, собрано статически, ибо постоянные автообновления. В третьих, собрано статически, ибо каждая первая малварь норовит подменить длл на свою и выискивать твои банковские карточки и прочие пароли в трафике - со статическим билдом такое провернуть тоже можно, но уже слегка сложнее.
1000189
#123 #1000171
>>992632 (OP)
Анон, каковы шансы того, что функция ниже будет соптимизована таким способом, что переменная flag будет проверяться перед началом цикла, а не при каждой итерации?
void func(bool flag)
{
for (int i = 0; i < 1000; i++)
{
if (flag)
{
//do something
}
else
{
//do something else
}
}
}
10001721000190
#125 #1000189
>>1000163
И при обновлении они не вставляют куски кода, а просто банально заменяют конечный исполняемый файл? Или есть и другие трюки?
1000190
#126 #1000190
>>1000171
Шансы есть. Наблюдаемое поведение не изменится, значит у компилятора развязаны руки (зависит от того, что будет в do something, очевидно). Расскажи, что ты хочешь сделать, почему тебе оптимизации могут помешать?

>>1000189
Ну да. Какие могут быть трюки, когда установленный браузер весит больше, чем 15 лет назад весила вся ОС с офисом и прочим софтом?
1001848
#127 #1000285
Анон, как вкатиться в сишный энтерпрайз? Занимаюсь непрофессионально и периодически программированием уже 6 лет, не начинающий, но не могу представить себе работу за деньги. Писал драйвера для самосборных устройств и прошивки для них, всякого по мелочи ещё. Совершенный код не читал, но планирую. Что можно почитать, куда попробовать устраиваться, что писать в резюме, где искать вакансии? инбифо фриланс
1000290
#128 #1000290
>>1000285
Фриланса на сях почти нет. Пиши письма счастья в интересующие конторы, работающие с железками, вне зависимости от наличия вакансий. Не забудь няшный гитхабчик, где на сях есть что-нибудь кроме хелловорлда.
#129 #1000689
Господа,
Ебусь с указателями. Именно это почему то довольно сложно идёт.
А есть ли какие то мнемонические правила?
10006901001004
#130 #1000690
>>1000689
Что именно ты хочешь запомнить и зачем?
#131 #1000727
Что вообще можно делать на С? Писать под микроконтроллеры?
А работа не связанная с железом и вот этим вот всем есть? Как вообще выглядит путь программиста на С в 2017? Не лучше ли учить С++? Помогает ли знание С при вкате в С++? Поясните вообще
10007291000730
#132 #1000729
>>1000727
На си можно делать что угодно, но как правило это эмбеддед + системное программирование. Ядра линупса, винды и макоси написаны на сях, например.

Начинать в принципе похуй с чего, но си проще крестов. В крестах вагон ненужной хуйни, которую страуструп зачем-то в них принес. Знание си помогает при вкате в кресты и наоборот.
1000734
#133 #1000730
>>1000727

> Что вообще можно делать на С?


Все.

> Писать под микроконтроллеры?


В том числе.

> А работа не связанная с железом и вот этим вот всем есть?


Пишу сервера под Linux и либы для обработки сигналов. Ну почти.

> Как вообще выглядит путь программиста на С в 2017?


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

> Помогает ли знание С при вкате в С++?


Местами помогает (синтаксис-то частично общий, но он дай бог процентов 10 от того, что нужно знать в крестах). Ну и надо понимать, что это другой язык и не скатываться в "си с классами".
#134 #1000731
>>1000730

> не скатываться в "си с классами"


Да нет, это как раз самый правильный вариант использования крестов.
#135 #1000734
>>1000729
>>1000730
Просто хочу вот слезть с веб-мартыханства во что-то более серьёзное (для души, бабосы на мартыханстве рубить продолжу), но вместе с тем не хочу оказаться у разбитого корыта микроконтроллеров и инжереской фигнёй с драйверами(ну не лежит душа к железу). Хочу для себя что-то выучить, на чём можно игру написать десктопную или просто окунуться в машин лёрнинг. Чтоб была свобода выбора и не поганая гонка фреймворков. Надеюсь, понятно объяснил.
Путь выбрал такой - сначала учу С и шлифую его, потом перехожу на кресты и начинаю писать для себя всякие искусственные интеллекты. всё правильно? не лучше ли сразу выбрать какой-нибудь пистон или swift?
1000748
#136 #1000748
>>1000734

>искусственные интеллекты


lol
#137 #1000779
>>1000730

> или что-то другое скриптовое, что тебе по душе


Команды bash?
#138 #1000818

> view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);


> cameraPos + cameraFront


Как это возможно?
OpenGL, glm. Переменные "cameraPos" и "cameraFront" это "vec3", а "vec3" это, по идеи, массив из трёх элементов типа "float". Сложение двух массивов -- особенность крестов или я чего-то не понимаю?
1000843
#139 #1000843
>>1000818
Если переопределён оператор+ почему бы и нет
1000849
#140 #1000849
>>1000843

> переопределён оператор+


Это как? Объясни пожалуйста.
1000855
#141 #1000855
#142 #1001004
>>1000689

>А есть ли какие то мнемонические правила?


left-to-right rule
#143 #1001848
>>1000190

> Расскажи, что ты хочешь сделать, почему тебе оптимизации могут помешать?


Не помешать, наоборот помогут. Кривой код переписывать лень, поэтому надеюсь, что компилятор сделает всю работу за меня.
#144 #1002075
Анон, где можно почитать о том, как правильно строить сложные конечные автоматы?
1002080
#145 #1002080
>>1002075

>сложные


как они могут быть сложными?
1002086
#146 #1002086
>>1002080
Ну, например, когда есть рабочая машина состояний с определенным состояниями и подсостояниями, а теперь нужно сохранять еще одно состояние, которое будет висеть поверх других. Мне вот из-за скудности мышления сложно представить как это говно переделать так, чтобы код остался читабельным (т.е. без примитивного boolean флага, который будет сохранять это состояние) и без багов. В интернетах пишут о всяких СУПЕР-, паралельнх состояниях и т.п.
1002101
#147 #1002101
>>1002086

> В интернетах пишут о всяких СУПЕР-, паралельнх состояниях и т.п.


меньше этих пидарасов хипстерских читай, если появилась какая то еба значит проеб в архитектуре и алгоритме. если хочешь пиздецпиздецсложна мокнись в парсеры, особенно парсеры регулярок типа https://github.com/laurikari/tre
там тебе и стеки и переходы и прочии ништяки
10021021002108
#148 #1002102
>>1002101
з.ы. или https://github.com/google/gumbo-parser
он весь на состояниях и на w3c спеках
1002108
#149 #1002105
Ребят, уже знаю JS, сейчас нужно учить Си, какую книгу/курс/сайт подскажите, чтоб не слишком для новичков в программировании
1002169
#150 #1002108
>>1002102
>>1002101
Ну я лично столкнулся не с проебом в архитектуре, а с необходимостью делать слишком сложный алгоритм (но поделать с этим ничего не могу) для текущей машины состояний и вижу два решения: перелопачивать архитектуру, на что ни времени, ни компетенции нету, т.к. нужно это всё было сделать вчера, либо же использовать вот эти хипсторские решения, которые позволят более-менее сносно решить задачу.
Поэтому хотелось бы почитать книжечку для ньюфани без нормального опыта, где описаны решения некоторые well-known решения типичных задач.

Ну а регулярки – это уже слишком умно. но ты заинтересовал этой ёбой, надо на досуге почитать.
И вообще скорее всего я сам не знаю, что мне блять надо.
1002110
#151 #1002110
>>1002108

>И вообще скорее всего я сам не знаю, что мне блять надо.


скорее всего тебе надо стек в который ты будешь пихать нех при переходах
#152 #1002165
Пацантрэ, где взять мисру 2к13 в пдф? На либгене только 2004 есть.
Алсо, чего можно почитать по общим каким-то устройствам и принципам работы ртосов?
Алсо, где можно почитать принципы разработки ПО для встраиваемых систем желательно не в виде сферических абстракций, а в виде реальных примеров с пояснениями почему делают так, а не по-другому?
#153 #1002169
>>1002105
Язык C в XXI веке
Advanced Topics C
C Primer Plus
Искусство программирования на C (лучше английский оригинал)
ADvanced Data Structures (Peter Brass)
#154 #1002477
Помогите пожалуйста, если тут есть кто то в такое время

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

Делал с пузырьковой сортировкой, но препод послал и сказал тип дедлай, что бы подпрограмма добавления элемента сразу создавала упорядоченную таблицу.

https://pastebin.com/zZDh98Pz

Вот код, на вход подается что то вроде 12345678 name 100 (code, name, numb), упорядочить нужно по numb
#155 #1002483
>>1002477

>если тут есть кто то в такое время


Слишком рано?

>создает упорядоченную таблицу и все


А в чём проблема создавать сразу же упорядоченную таблицу, что собственно от тебя и требуют. Алгоритм очень простой. Добавляется новый элемент в таблицу, для него с помощью, например, бинарного поиска, ищется позиция. В зависимости от алгоритма поиска, нужно будет добавить элемент или перед текущим, или после него. У тебя есть столбец, по которому нужно будет сортировать. Вот по нему и сортируй. Возможно, для твоего случая может подойти функция qsort из стандартной библиотеки.
1002794
#156 #1002504
>>1002477

>...создаёт упорядоченную...


>...чтобы сразу упорядочивала...


Ну ты уж как-то определись
1002741
#157 #1002509
Стоит ли вкатываться в ембедед и системное программирование, или же все таки надо идти в веб?
1002516
#158 #1002516
>>1002509
Это как минимум интересно
10025171002553
#159 #1002517
>>1002516
Я это понимаю, но сейчас же ничего не развивается, кроме веба?
10025191002522
#160 #1002519
>>1002517
Господи, где вы набираетесь подобного говна?
10025211002553
#162 #1002522
>>1002517
Запили умный дом или какую другую йобу на контроллерах. Сделай систему управления чем-нибудь, выложи на кикстартер, собирай профиты.
1002553
#163 #1002524
>>1002521
Учти, что в эмбедддед порог вхождения выше, желающих работать - меньше, следовательно вакансий меньше, т.к. банально некому работать. В веб же суются голодные бабуины за копеечную зарплату пилить формочки для внутреннего говнорынка. И кто такой СИСТЕМНЫЙ ПРОГРАММИСТ?
#164 #1002534
>>1002524
Системный программист пишет драйверы и колупает ядро.
1002553
#165 #1002538
>>1002524
Вот как раз из свежего:

>Высшее техническое образование, полученное в приличном техническом ВУЗе РФ. Если в названии вашего ВУЗа присутствуют слова "социальный", "гуманитарный", "экономический",


>"финансовый","политический", "строительный" - просьба не беспокоить, так как нам нужны сотрудники ориентированные на телеком!


>https://hh.ru/vacancy/20738888


Просто мякотка, учитвая, что ещё и средняя макака без какого-либо образования может зарабатывать больше.
#166 #1002539
>>1002521
У тебя embedded по-английски. Не во всех российских компаниях кадровички знают английский. Часто ищут просто инженер-программиста, разработчика встраиваемых систем и т.д.
Да даже на иностранных площадках, embedded developer - нифига не канон. Может быть и Firmware/RTOS/DSP/Automotive/C/C++ developer и чего ещё только не выдумывают. И в 99% случаев это будет embedded.
1002553
#167 #1002543
>>1002538

>по созданию ПО серверного и терминального оборудования видеоконференцсвязи, а также облачной видеоконференцсвязи


>Желателен опыт работы с системами жесткого реального времени.


Мне кажется, эти уёбки не понимают сути hard real-time.
1002553
#168 #1002545
>>1002538
Ну вот, как я подозревал. Под вакансией СИСТЕМНОГО программиста (заметь, в описании даже и близко нет намека на то самое системное программирование) сейчас подрозумевается работа рознорабочим в какой-то унылой умирающей конторке из нулевых/90х.
10025491002553
#169 #1002549
>>1002545

>Под вакансией СИСТЕМНОГО программиста (заметь, в описании даже и близко нет намека на то самое системное программирование) сейчас подрозумевается работа рознорабочим в какой-то унылой умирающей конторке из нулевых/90х


Совсем не факт. Сейчас ОС крутится в каждом электрочайнике.
1002553
#170 #1002553
>>1002516
>>1002519
>>1002522
>>1002524
>>1002534
>>1002538
>>1002539
>>1002543
>>1002545
>>1002549
Хорошо, как вкатиться в это ваше системное embedded программирование? Что надо знать и уметь?
1002561
#171 #1002561
>>1002553
От предпочтений зависит. Можно вкатиться в железо и максимально байтоебить (знание матана и электроники обязательно). Можно выучить юниксы, RTOS, многопоточность и уютно писать на сишечке. Лучший вариант: выучить и то, и другое.
1002565
#172 #1002565
>>1002561
OpenMP норм?
Где по юниксам почитать?
10025671002875
#173 #1002567
>>1002565
Advanced programming in the unix environment подойдет. С OpenMP пока повремени, разберись для начала с нативными средствами (posix threads , потоки и их синхронизация во FreeRTOS, например)
#174 #1002741
>>1002504
опечатался
создает неупорядоченную >>1002477
1002971
#175 #1002794
>>1002483

> Возможно, для твоего случая может подойти функция qsort из стандартной библиотеки.



Не подошла
1002818
7 Кб, 220x207
#176 #1002809
>>1002477

Спрошу ещё раз, может кто нибудь ответит
Вот полный код всей программы - https://pastebin.com/kt9BBRzA

С пузырьковой сортировкой все работает идеально, но нужно упорядочивать таблицу именно в этой функции - https://pastebin.com/zZDh98Pz
Вообще не понимаю, как это сделать

qsort и бинарный поиск не подходят
10028411002971
#177 #1002816
>>1002524

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


А я думал, что у нас просто давным давно рынок потребительской электроники по пизде пошел и дальше только хуже, поэтому embedded никому не всрался кроме 3.5 контор, работающих на фсб и армию, и пары что-то пытающихся запилить стартапов.
1002875
#178 #1002818
>>1002794

>Не подошла


НЕ ЗЛИ МЕНЯ. У меня второй день не получается сделать бесполезную работу, а ты пишешь, что у тебя что-то не получается. Что у тебя не получается? Не можешь разобраться с параметрами? Первый параметр - твой массив таблиц, второй - количество элементов, третий - размер одного элемента, а четвёртый - твоя функция сравнения. В начале функции add_table вызываешь qsort, читаешь документацию, в которой написано, до или после этого элемента надо вставить новый элемент или брутфорсишь до правильного, благо там всего 2 варианта, с помощью memmove перемещаешь массив на один элемент, перед этим не забыв увеличить его с помощью realloc, memcpy для элемента на новое место. Всё, элементарно. Что ещё не понятно?
1002835
#179 #1002835
>>1002818

>У меня второй день не получается


Да я тоже не могу дописать это уже несколько дней, поэтому и написал сюда

>Не можешь разобраться с параметрами?


с qsort я разобрался, я понимаю как она работает и какие аргументы ей нужны

>Всё, элементарно


Просто попробуй сам написать дописать эти пару строк и поймешь, что то, что ты написал никогда в жизни не сработает в данном случае
#180 #1002841
>>1002809

> бинарный поиск не подходят


Или ты поясняешь, что не так с бинарным поиском, или идешь нахуй.
1002842
#181 #1002842
>>1002841

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

1002844
#182 #1002844
>>1002842
Да. У тебя есть пустой массив, тебе на вход приходит элемент, ты бинарным поиском вычисляешь нужное место в массиве и втыкаешь его туда, повторяешь. После каждой итерации массив остается отсортированным (пустой массив и массив из одного элемента, очевидно, тоже можно считать отсортированными).
1002854
#183 #1002848
Анон, можно ли написать абстрактный класс, который в своем констукторе создает наследников, либо как-нибудь вынести в него логику создания? В универе сказали написать загрузчик сайтов на чистом C++ и обязательно с полиморфизмом. 2 дня ебался с SSL, теперь пилю полиморфизм, решил для него теги взять. В базовом классе есть только конструктор c текстом тега и функция редактирования, которую наследники меняют. Хотел, чтобы по Tag(string) автоматически все создавалось и логика распределения была в самом классе, но так нельзя. Написал функцию Tag createTag(string), но почему-то не могу ее вызвать вне класса.
#184 #1002854
>>1002844
А, окей
Пойдет такой https://pastebin.com/dh9K1cZp ?
Просто немного не понимаю, как правильно аргументы написать при вызове в данном случае, мне же не просто t[X] надо, а t[X].numb
1002868
#185 #1002868
>>1002854
Ну ты поправь его так, чтобы при отсутствии совпадения (т.е., когда low становится > high) возвращался предполагаемый индекс, а не -1. По этому индексу и будешь втыкать элемент.
#186 #1002875
>>1002816
С промышленной электроникой все в порядке. Всегда нужны кастомные решения, курс рубля на дне, необходимость сертификации, в т.ч. лоббируемая, все это работает на местных. Пациент определенно жив.

Даже потребительский сегмент: освещение, автосигнализациию.

>>1002565
Правильный выбор. В более железной части чистому программеру жизни нет, прислуга за все.
961 Кб, 500x325
#187 #1002877
Анон, помоги пожалуйста.
Как на C узнать текущее время системы (Linux), желательно не используя библиотеку <time.h>? Нужно считать и записать время системы+60 секунд, и затем сравнивать это значение с текущим.
Но какая-то из сторонних библиотек конфликтует с time.h, ругаясь на функцию nanosleep(без time.h всё компилируется и работает) Код содержащий nanosleep не мой, разбираться почему как часть с nanosleep работает и куда этот nanosleep в оригинале ведет - некогда
1002891
#188 #1002891
>>1002877

> Но какая-то из сторонних библиотек конфликтует с time.h, ругаясь на функцию nanosleep


Покажи, как ругается. Конфликт со стандартным хедером - это полный пиздец. Скорее всего, ты просто либу собрал неправильно или на другой машине. Но в принципе, это все быстро решается костылем из дефайна.
1002905
17 Кб, 675x426
#189 #1002905
>>1002891
Держи. Вот кусок кода в котором нанослип вызывается:

while ( bcm2835_gpio_lev(pin) == laststate) {
counter++;
nanosleep(1); // overclocking might change this?
if (counter == 100)
break;
}
1002908
#190 #1002908
>>1002905
Тебе говорят, что nanosleep вызывается неправильно - он хочет два аргумента, а передают только один. Вызови правильно:
nanosleep(&(struct timespec) { .tv_nsec = 1 }, NULL); (ну или сколько тебе там ждать, хуй знает).
1002914
#191 #1002914
>>1002908
Я понимаю что мне говорят. Но без подключения time.h работает именно с одним аргументом. Я хз что он вызывает нанослипам в одном из подключенных заголовков.
10029171002918
#192 #1002917
>>1002914
Ну грепни заголовки, узнаем, откуда оно это берет. Ну и в крайнем случае, тебе никто не мешает сделать так (в качестве очень костыльного костыля, потому что лень/некогда разбираться):
#define nanosleep yoba_nanosleep
#include <time.h>
#undef nanosleep
Но в идеале надо править кривой код, а не городить костыли. Алсо, если погуглить этот твой код, в 99% случаев там nanosleep закомментирован нахуй, в остальном 1% там usleep.
1002927
#193 #1002918
>>1002914
Алсо, ты уверен, что ты с -Wall компилируешь? А то вот такой код тоже "работает", пока не подключишь stdlib.h:
int main(void) { qsort(0); }
1002927
51 Кб, 1920x1040
28 Кб, 675x697
#194 #1002927
>>1002918
Ну я других настроек gcc не подсовывал, но да, вот с -Wall Как-то немало варнингов.
>>1002917
У меня там чей-то код с хабры, для работы с датчиками DHT-11/DHT-22. Указанный на хабре сурс - лежит.
Как твой пример с дефайнами работает?
Алсо, если не сложно, поясни как мне получить при подключении time.h время от начала работы программы или системы в секундах или милисекундах?
1002932
#195 #1002932
>>1002927

> скриншоты


Я не о том говорил. Есть такая штука, как implicit function declaration (запрещена в C99, наконец-то) - наследие древних темных времен. Когда компилятор встречает вызов функции, о которой он не знает (т.е., еще не видел ее объявление или определение), он считает, что фунция возвращает int, а принимает любые аргументы. Т.е., контроль типов и количества аргументов у таких функций не производится (не с чем сравнивать правильность), производятся только стандартные promotions, типа char->int или float->double. И когда ты не подключая time.h вызываешь nanosleep, gcc (видимо) считает, что это неявная декларация и позволяет тебе передать один инт в качестве аргумента, только вот функция от этого не перестает хотеть два указателя. Если скомпилированный код после этого работает - он работает по счастливой случайности. Если же ты подключаешь time.h, gcc "узнает", как должен выглядеть вызов nanosleep, и говорит тебе, что ты не прав.

> Как твой пример с дефайнами работает?


Дефайн заменяет один идентификатор на другой. Когда препроцессор встречает time.h extern int nanosleep(что-то там), он производит макроподстановку, и получается extern int yoba_nanosleep(что-то там). После того, как time.h обработан, undef говорит, чтобы препроцессор перестал заменять идентификатор nanosleep на что-либо.

> поясни как мне получить при подключении time.h время от начала работы программы или системы


Ну стандартные способы получения времени - это time() и timespec_get(), но они возвращают таймстамп от 1 января 1970. Если тебе критично именно с начала работы системы, то clock_gettime(CLOCK_MONOTONIC) или всякие: http://man7.org/linux/man-pages/man2/sysinfo.2.html или http://man7.org/linux/man-pages/man2/clock_gettime.2.html и т. п.
1002941
#196 #1002941
>>1002932
Оке, спс.

>Если тебе критично именно с начала работы системы


Некритично вообще. Сравниваю просто два времени - одно (когда-то_записанное +60) и снятое_только_что.
Тайм что возвращает? long? В секундах или милисекундах?

>пример с дефайнами


Так толком и не понял. Он по сути заменяет в time.h имя nanosleep на yoba_nanosleep?

>implicit function declaration


Оке. Всё что я из этого вынес - надо заранее объявлять переменные.
#197 #1002971
>>1002741
>>1002809

У тебя и в коде какая-то чушь. К указателю на структуру обращаешься как к массиву.
Сделал бы так:
1. Создал массив указателей на структуры.
2. Выделял память под каждый новый указатель и менял бы значения указателей вместо копирования всех структур.
#198 #1003544
Как узнать имя текущего процесса? Именно имя процесса, а не путь к исполняемому файлу.
1003546
#199 #1003546
>>1003544
В какой ос, и чем это отличается от пути к файлу?
1003553
#200 #1003553
>>1003546
В windows. Путь к файлу может быть любой, а имя процесса одно и то же.
1003556
#201 #1003556
>>1003553
А, наебал. Нужно то, что в диспетчере задач называется "Описание".
1003568
#202 #1003568
>>1003556
VerQueryValue и товарищи. Это из ресурсов, из version info берется.
#203 #1003957
Здесь ответ вряд ли найду, но на всякий случай спрошу:
У кого-нибудь удавалось скомпилить ncurses под minix?
#204 #1004334
Студентобыдло заваливается в тред с вопросом:
Если у меня есть указатель в проге, которым я в конце проги уже не пользуюсь, но мне нужен указатель, что лучше сделать:
-создать новый с понятным названием, или
-ссылка вида:

type &newName = oldName

И так будет правильно написать для такого кода:

struct Elem {...}

int main() {
Elem *oldName;
...
Elem &newName = odName;
}
?????

Прост у меня заморочка на тему сейва четырех байтов, но я хз, освобождает ли компилятор место из-под указателя, если далее он юзаться не планирует. А ссылка вродь памяти не занимает совсем.
1004504
#205 #1004504
>>1004334
#define newName oldName
Шютка. Не вздумай так делать. А вообще, судя по коду, тебе в плюсотред.

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

Хочешь надежно застолбить четыре байта? Создай статическую переменную.

А вообще, создать новый указатель не такая уж плохая идея. Компилятор не еблан и он не будет держать на стеке порожняком четыре байта, которые можно пустить в дело.
1004655
#206 #1004655
>>1004504

>А вообще, судя по коду, тебе в плюсотред.


Мне в психушку надо. Ибо пишу типа на си, юзая некоторые плюшки из плюсов, и приправляя WinAPI32. Усё по методичкам нашего универа, по методике преподов.
Да и вообще, делить С и С++ на разные треды - бред, ИМХО.

>Хочешь надежно застолбить четыре байта? Создай статическую переменную.


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

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


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

Алсо, слышал, что если вначале объявить переменную и сразу синициализировать, типо int i = 0; то получим переменную не в куче а в стеке, т.е. статическую. И у меня подозрение, что VS2015 нихуя не освободит.
#207 #1004668
>>1004655

>делить С и С++ на разные треды - бред


не, у крестов слишком много оверхеда
qt, boost, темплейты и прочее, куча говна
1004682
#208 #1004675
>>1004655

>меня интересует именно судьба всяких int SortList


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

>если вначале объявить переменную и сразу синициализировать, типо int i = 0; то получим переменную не в куче а в стеке


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

>т.е. статическую


Переменные, для хранения которых компилятор сам резервирует место на стеке, относятся к автоматической памяти, а не к статической. Статическая память это либо глобальные переменные (т.е. объеявленные вне функций), либо явно объявленные с ключевыми словами static или extern. Инициировать статические переменные нулем не имеет смысла, поскольку они и так обнуляются на этапе загрузки программы.
10046821009013
#209 #1004682
>>1004668
>>1004675
Плюсики вам в карму :3
#210 #1004699
>>1004655

>Да и вообще, делить С и С++ на разные треды - бред, ИМХО.


ООП моча не нужна, template говно тем более. Си простой и ясный язык, как Форт, как Лисп. Не надо сюда тащить всякое говно.
1004700
#211 #1004700
>>1004699
Но в больших проектах, где нужна производительность С++ незаменим
10047031004736
#212 #1004703
>>1004700
Java, C# (с вынесением медленных участков в нативные библиотеки на Си), Free Pascal/Lazarus, Oberon, Rust, Go, Swift, Fortran. Полно вариантов.
10047041005265
#213 #1004704
>>1004703
+ Ada еще
#214 #1004736
>>1004700
Это тебя яндекс в жопу выебал?
#215 #1005176
Есть switch-case на 100 строчек, примерно. Как и чем его заменить? Очень уж мне не нравится этот матрас.
10051791005186
#216 #1005179
>>1005176

>switch-case на 100 строчек


фигасе, а кейсов сколько?
1005206
#217 #1005186
>>1005176
А что внутри? Может быть, можно сделать таблицу?
1005205
#218 #1005205
>>1005186
Про chip8 слыхал? Интерпретатор, внутри обрабатываю опкоды и т.д
1005237
#219 #1005206
>>1005179
Ну я про case и говорю.
#220 #1005237
>>1005205
Если цикл что-то типа
switch (opcode) {
case OP_NOP:
...
case OP_RET:
...
}
То сделать массив функций:
typedef void OpcodeFn(VirtualMachineState state);
OpcodeFn opcodeFuntions[] = {opcodeNop, opcodeRet, ...};
void opcodeNop(VirtualMachineState
state)
{...}
void opcodeRet(VirtualMachineState *state)
{...}
...
И в цикле просто вызывать opcodeFuntioncs[opcode]
Заодно и работать будет быстрее.
10052391005240
#221 #1005239
>>1005237
typedef void OpcodeFn(VirtualMachineState ·state);
OpcodeFn opcodeFuntions[] = {opcodeNop, opcodeRet, ...};
void opcodeNop(VirtualMachineState ·state)
{...}
void opcodeRet(VirtualMachineState ·state)
{...}
#222 #1005240
>>1005237
Попробую, спасибо!
1005245
#223 #1005245
>>1005240
Этот паттерн, кстати, называется "шитый код". Применялся во многих реализациях Форта, в интерпретаторах Бейсика на 8-битных компьютерах (например, ZX Spectrum), в Фокале на БК-0010.
1005252
#224 #1005252
>>1005245

> шитый код


Большое спасибо. Почитаю.
#225 #1005265
>>1004703

>Free Pascal/Lazarus, Oberon


Умерли.

>Rust


Пока еще малопопулярен, нет IDE, дебаггеров и прочих незаменимых инструментов.

>Go


Не годится в больших проектах

>Swift


Нет на винде и на линуксе

>Fortran


Умер

>Java, C#


Единственный годный вариант, но джава умирает, а С# живет в основном в asp.net
10052681005274
#226 #1005268
>>1005265

>Умерли.


Оберон может быть, а Lazarus в российском госсекторе используется.
1005269
#227 #1005269
>>1005268

>в российском госсекторе используется


Я говорю о нормальных проектах, а не о поедании говна за деньги из бюджета.
#228 #1005274
>>1005265
Fortran не умер, просто мало распространен. Есть хороший оптимизирующий компилятор от Intel, неплохой GNU Fortran в составе GCC. Есть ООП, рекурсия, вроде даже лямбды:
https://stackoverflow.com/questions/21471640/fortran-return-an-anonymous-function-from-subroutine
Intel Fotran и GNU Fortran поддерживают параллельность через OpenMP.
1005275
#229 #1005275
>>1005274

>мало распространен


Так можно про любой язык сказать, даже про тот же хаскель. Я же говорю про язык для продакшена, для которого написаны сотни библиотек, есть годные инструменты, а главное - на нем пишется и будет писаться много новых проектов. Для фортрана было написано много библиотек в свое время, и он использовался для научных вычислений. Теперь его заменил питон, и фортран оказался не нужным.
1005276
#230 #1005276
>>1005275

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


ПИТОН
1005277
#231 #1005277
>>1005276
Высокая производительность?
#232 #1008224
А поясните, пожалуйста, кто в стандартах разбирается. Есть две структуры, что поля второй включают порядок и типы первой, например:
typedef struct {VMT ptrdiff_t; short int data;} T;
typedef struct {VMT ptrdiff_t; short int data; long int other_data;} T1;
Собственно вопрос допустимо ли приводить T1 к T? Не перевыравняет ли компилятор что-либо по своим усмотрениям?
Спасибо.
#233 #1008292
>>1008224
Сунь в union. Тогда можно будет обращаться к common initial sequence любой из этих структур.
1008536
#234 #1008395
>>1008224

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


Может да, а может и нет. Используй #pragma pack
10084811008536
#235 #1008436
>>1008224

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


Скорее всего нет. Но если делать все максимально кроссплатформенно и по стандартам, то правильнее всего так:
typedef struct {VMT ptrdiff_t; short int data;} T;
typedef struct {T base; long int other_data;} T1;
1008536
#236 #1008481
>>1008224

> Собственно вопрос допустимо ли приводить T1 к T?


По стандарту нет. Ибо strict aliasing, разные типы, гроб-гроб-кладбище, авторы компиляторов опять ломают язык ради оптимизаций. По факту да, можно так делать (и делают!), но лучше выделить одинаковую часть структур в отдельный тип.

>>1008395

> Используй #pragma pack


Нинужно. Выравнивание всегда одинаковое у конкретного компилятора на конкретной платформе.
1008536
#237 #1008536
>>1008292
>>1008395
>>1008436
>>1008481
Благодарю за пояснения.
#238 #1008557
#239 #1008608
Привет. Сишка не мой первый язык, но он мне безумно нравится. Проблема в том, что мне ООП навязало свою модель проектирования приложения, и с Си она собственно никак не коррелирует. Иногда я просто не знаю как разделить исполняемые файлы, хэдеры и т.д Может есть какая-нибудь статья или книга по проектированию на Си? Очень бы пригодилось.
10087811008787
#240 #1008781
>>1008608

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


ООП ортогонально языку.
#241 #1008787
>>1008608
Так на сишке тоже можно писать ООП.

typedef struct {
int width;
int height;
void data;
} Image;

typedef struct {
Image ×image;
int x;
int y;
BOOL visible;
} Sprite;

Sprite
Sprite_new() {
Spritesprite = (Sprite)malloc(sizeof(Sprite));
if (sprite) {
sprite->image = NULL;
sprite->x = 0;
sprite->y = 0;
sprite->visible = FALSE;
}
return sprite;
}

void Sprite_show(Sprite *sprite) {
if (sprite) sprite->visible = TRUE;
}

void Sprite_move(int x, int y) {
if (sprite) {
sprite->x += x;
sprite->y += y;
}
}
#241 #1008787
>>1008608
Так на сишке тоже можно писать ООП.

typedef struct {
int width;
int height;
void data;
} Image;

typedef struct {
Image ×image;
int x;
int y;
BOOL visible;
} Sprite;

Sprite
Sprite_new() {
Spritesprite = (Sprite)malloc(sizeof(Sprite));
if (sprite) {
sprite->image = NULL;
sprite->x = 0;
sprite->y = 0;
sprite->visible = FALSE;
}
return sprite;
}

void Sprite_show(Sprite *sprite) {
if (sprite) sprite->visible = TRUE;
}

void Sprite_move(int x, int y) {
if (sprite) {
sprite->x += x;
sprite->y += y;
}
}
1008790
#242 #1008790
>>1008787
typedef struct {
int width;
int height;
void data;
} Image;

typedef struct {
Image
image;
int x;
int y;
BOOL visible;
} Sprite;

Sprite Sprite_new() {
Sprite
sprite = (Sprite)malloc(sizeof(Sprite));
if (sprite) {
sprite->image = NULL;
sprite->x = 0;
sprite->y = 0;
sprite->visible = FALSE;
}
return sprite;
}

void Sprite_show(Sprite
sprite) {
if (sprite) sprite->visible = TRUE;
}

void Sprite_move(Sprite *sprite, int x, int y) {
if (sprite) {
sprite->x += x;
sprite->y += y;
}
}
#242 #1008790
>>1008787
typedef struct {
int width;
int height;
void data;
} Image;

typedef struct {
Image
image;
int x;
int y;
BOOL visible;
} Sprite;

Sprite Sprite_new() {
Sprite
sprite = (Sprite)malloc(sizeof(Sprite));
if (sprite) {
sprite->image = NULL;
sprite->x = 0;
sprite->y = 0;
sprite->visible = FALSE;
}
return sprite;
}

void Sprite_show(Sprite
sprite) {
if (sprite) sprite->visible = TRUE;
}

void Sprite_move(Sprite *sprite, int x, int y) {
if (sprite) {
sprite->x += x;
sprite->y += y;
}
}
1008791
#243 #1008791
>>1008790
Странно, почему сбивается разметка, в прикрепленном треде все норм...
#244 #1008792
>>992632 (OP)
Запощу тут чтобы не проебать, ихнорируйте меня
http://web.eecs.utk.edu/~plank/plank/classes/cs360/general.html
1008793
#245 #1008793
>>1008792
Для заметок лучше использовать E-mail, там можно отправлять письма самому себе.
1008798
#246 #1008798
>>1008793
Да я понимаю, просто я на чужой машиенрии сейчас
#247 #1008946
Лёгкий (не Code::Blocks) FOSS кроссплатформенный DE.
#248 #1008947
>>1008946
IDE*
Ну и не советуйте блокнот, пожалуйста.
#249 #1008963
>>1008946
Нет таких. Либо легкий, либо IDE, либо кроссплатформенный, либо FOSS. Я, например, предпочитаю SublimeText для более-менее простых проектов и полноценные "тяжелые" IDE для больших и сложных вещей. Для хелловорлда подходит любой блокнот, да.
10089661009011
#250 #1008966
>>1008963
А что по CodeLight?
1009010
#251 #1009010
>>1008966
Интерфейс тупой, бесполезный и перегруженный.

Anjuta попробуй, ничего лишнего и работает быстро.
#252 #1009011
>>1008963
>>1008963

Pelles C же.
1009025
#253 #1009013
>>1004675
Статические переменные же не в стеке хранятся.
#254 #1009025
>>1009011
Не кроссплатформенный, Pelle опять вымер на два года, никаких фич IDE нет - по сути просто блокнот с редактором ресурсов и кнопочкой "компилировать".
#255 #1009067
сисюны, нужно байтоебить с пиздецки большими файлами > 1tb, стоит ли смотреть на cuda?
1009085
#256 #1009080
>>1008946
Clion
Qt Creator
Visual Studio
Выбирай из этого, все остальное - параша.
1009096
#257 #1009085
>>1009067
С чем файлы-то?
1009089
#258 #1009089
>>1009085

>С чем файлы-то


с байтами =) ну на самом деле дамп пиздецкого массива структур, размер структур всегда одинаков
#259 #1009096
>>1009080
Короче, ладно, notepad++ с NppExec
10090981009171
#260 #1009098
>>1009096

>notepad++ с NppExec


всегда пользуюсь, eclips + cdt в редких случаях. ide для пидоров
#261 #1009150
>>1009098
Два чая, в сишке в отличие от C++/C#/Java автокомплит и рефакторинг не нужны.
10091711009173
#262 #1009171
>>1009096
>>1009098
>>1009150
Ну если кодить только на Си, то ide может и не нужна. Но т.к я крестун, то использую VS с MSVC для С++ и VS с Clang/C2 для Си
#263 #1009173
>>1009150
Автокомплит нужен, если ты не под микроконтроллеры и прочий эмбеддед пишешь. Я вот сейчас хуй сам вспомню, как в каком порядке вызывать аргументы функций usb-core в линуксах, хотя писал под него меньше месяца назад.
1009192
#264 #1009192
>>1009173
и ты такой с автоконплитом хуяк хуяк и накодил? один хуй нужно ман просмотреть или копипастить со своего кода.
1009238
#265 #1009238
>>1009192
Когда накидываешь драйвера для однотипных устройств - да, хуяк-хуяк и накодил с автокомплитом.
#266 #1009335
Ну что, байтобляди, есть желающие поработать?
https://spb.hh.ru/vacancy/21401883
10093581009388
#267 #1009356
>>1009098
Ты не подскажешь, в чём может быть проблема?
Делаю такое:
gcc "$(FULL_CURRENT_PATH)" -o "$(NAME_PART) ".exe
cd "$(CURRENT_DIRECTORY)"
$(NAME_PART).exe
Мой HelloWorld компилится, потом стартует процесс программы, но выхлопа ноль, никакого окна не возникает
1009365
111 Кб, 600x491
#268 #1009358
>>1009335
Ты повёлся на слово «MISRA» как рыба на блесну, штолле? Но ведь это же:
- Люксофт (т.е. анкеты и IQ-тесты)
- Зарплата не указана (и ведь это редкий в наших краях специалист)
- Какие-то уебанские технологии, XBank, eDebug, Turbo-Ohuelli надо знать (а если не знаю — мне самому свою з/п называть, да?)

Короче, хватит. Пошутили и хватит! Нет такого языка программирования.
10093671009445
#269 #1009365
>>1009356
Разобрался с Npp_run
1009441
#270 #1009367
>>1009358
Edebug is a source-level debugger for Emacs Lisp programs, with which you can:

Step through evaluation, stopping before and after each expression.
Set conditional or unconditional breakpoints.
Stop when a specified condition is true (the global break event).
Trace slow or fast, stopping briefly at each stop point, or at each breakpoint.
Display expression results and evaluate expressions as if outside of Edebug.
Automatically re-evaluate a list of expressions and display their results each time Edebug updates the display.
Output trace information on function calls and returns.
Stop when an error occurs.
Display a backtrace, omitting Edebug's own frames.
Specify argument evaluation for macros and defining forms.
Obtain rudimentary coverage testing and frequency counts.
1009508
#271 #1009388
>>1009335
неа,

Вакансия Программист-разработчик C / C++ 250.000 Gross, ПО и драйвера ККТ, МСК

https://www.linux.org.ru/forum/job/13490618?lastmod=1497939633401
10094431009544
#272 #1009441
>>1009365
Но он почему-то не хочет сохранять мои скрипты, после перезапуска ничего нет
#273 #1009443
>>1009388

>МСК


Плюс вычитай 30%, если Gross.
#274 #1009445
>>1009358

>- Зарплата не указана (и ведь это редкий в наших краях специалист)


У нас есть Анкета, в которой каждый кандидат указывает желаемую з/п. Мы стараемся учитывать предпочтения каждого=)
1009544
#275 #1009508
>>1009367

>Emacs


Ой, всё.
#276 #1009544
>>1009445
>>1009388
Падажжи, эйчар рекрутирует на харкаче? Теперь я видел всё.
#277 #1009589
Помогите пожалуйста, нужно находить индекс элемента для вставки в таблицу с помощью бинарного поиска, что бы таблица создавалась сразу упорядоченной, но я не могу нормально реализовать. Как поправить?

Вот код с функциями и пояснением:

https://pastebin.com/0DNkMMK0

Фулл код:

https://pastebin.com/P2LgQASf
1009683
#278 #1009683
>>1009589
Как же ты заебал! http://ideone.com/wp3PL0
2 Кб, 783x28
#279 #1010062
С чем пикрил может быть связан? Возникает ошибка довольно рандомно.
#280 #1010063
>>1010062
И при этом ничего не компилится.
#281 #1010064
>>1010062
Нет права на запись в директорию, куда предполагается поместить бинарник твоей программы.
1010066
#282 #1010066
>>1010064
Проклятая сперма, не может даже регулярно не давать права.
1010068
#283 #1010068
>>1010066
А, есть закономерность.
Если не открою эту папку в explorer, то никогда не даст gcc записать в папку, а если открыт explorer, то можно, вестимо, всем туда писать.
Б Е З О П А С Н О С Т Ь
1010069
#284 #1010069
>>1010068
Может быть, ACL у папки надо подправить?
1010071
#285 #1010071
>>1010069
Всё разерешено, вообще всё и всем, папка вполне обычная
1010072
#286 #1010072
>>1010071
Солипсизм уровня M$.
В системе существует только то, что ты видишь в эксплорере.
1010073
#287 #1010073
>>1010072
Ага, так и нашёл файлик с конфигом для всей этой параши
#288 #1010145
>>1010062
Аналогичная хуйня на Server 2008R2. Собирал, собирал - и ошибки запрещенного доступа., Через некоторое время разрешало. ИЧСХ на семерке на ноуте такого нет.
1010146
#289 #1010146
>>1010145
А это какой-нибудь антивирус или индексация фоновая не могут быть?
1010151
#290 #1010151
>>1010146
Антивируса нет, индексация была нагуглена и отключена, как и теневые копии. Так что точно нет.
1010153
#291 #1010153
>>1010151
Если воспроизводится до сих пор, не можешь взять FileMon/ProcessExplorer и узнать точную причину?
sage #292 #1010154
>>1010153
ProcessExplorer ProcessMonitor
#293 #1010156
>>1010153
Завтра гляну.
#294 #1010354
>>992632 (OP)
есть джва байтовых массива по 10 байт, нужно присвоить один другому. хочу обойтись без пидерских memcpy и циклов, а двумя операторами присваиваний, int64+int16. как это синтаксически будет выглядеть?
10103751010412
#295 #1010375
>>1010354
http://ideone.com/y6DhfC
Обернуть массив структурой, которая копируется по значению. Но это лютый говнокод, за который следует отбивать руки. Кроме того, не стоит забывать, что вся эта ебанина творится на стеке.
1010404
#296 #1010404
>>1010375
внатуре говнокод, надумал вот такую писечку:

((uint32_t)block1)[0] = ((uint32_t)block2)[0];
10104051010426
#297 #1010405
>>1010404
з.ы. звездочки макака захавал
#298 #1010412
>>1010354

>как это синтаксически будет выглядеть?


union Convert {
char c[10];
struct {
uint64_t a;
uint16_t b;
} s } c1, c2;
c1.c = { ... };
c2.s = c1.s;
Будет работать, хотя теоретически компилятор поля структур может разнести на произвольное расстояние. Правильнее через memcpy.
1010426
#299 #1010426
>>1010412

>memcpy


впизду, смотри >>1010404, утакуот работает
((uint64_t•)block1)[0] = ((uint64_t•)block2)[0];
((uint16_t•)block1)[4] = ((uint16_t•)block2)[4];
1010460
#300 #1010460
>>1010426
Type punning - плохой стиль. По стандарту надо через memcpy (лучший вариант) или юнионы (худший).
1010491
#301 #1010491
>>1010460

>плохой стиль


ойойой, это мне подняло скорость выполнения на треть, хотя всеравно этого мало...
1010503
#302 #1010503
>>1010491
Сам посмотри, с mempcy компилятор копирование вообще выкидывает, а через поинтер делает mov через sse:
https://godbolt.org/g/Qn8A4g
1010517
#303 #1010517
>>1010503
ну на самом деле у меня блок по 192байта и фактически я развернул цикл, а memcpy так не сможет. хотя вызовов memcpy не много, много вызовов memcmp, развернутый цикл выигрывает. кстати на 32 битных машинах, наверное 64 приведение обосрется...
#304 #1010728
Кодеров в РФ наёбывают:

https://2ch.hk/po/res/23263797.html (М)

Тлен. Безысходность.
#305 #1010759
>>992632 (OP)
мудрый анон, любой флаг оптимизации конпелятора ломает мою байтоебную прогу, это норма?
10107601010763
#306 #1010760
>>1010759
Таки норма. Оптимизация может покорежить и не-байтоебскую программу. Например, компилятор может выкинуть вызов memset(data, 0, data_size), если он расположен перед выходом из функции.
Есть способы с этим бороться, но для каждой конкретной программы и компилятора они свои.
1010762
#307 #1010762
>>1010760
теперь я спокоен, спасибки
#308 #1010763
>>1010759
Нет, это не норма. Прочитай стандарт, научись в -fno-strict-aliasing. Применяй байтоеблю правильно.
1010768
#309 #1010768
>>1010763

>Прочитай стандарт


вот делать мне больше нечего
1011838
#310 #1011837
>>995311

> system("chcp 1251");


вот откуда говнокодеры
#311 #1011838
>>1010768
надо
#312 #1011977
о великие перед вами.я маленькая криветочка
и у меня вопрос #include <stdio.h>
#include <math.h>
main ()
{
int a;
float b;
scanf("%d\n",a);
b=a(3.156 pow(10,7));
printf("%f\n",b);

}
почему число нужно вводить дважды если scanf 1
1012025
227 Кб, 1280x956
#313 #1012020
Сап, есть кто завтра в 6:00 МСК не будет спать?

Нужна небольшая помощь с задачкой не бесплатно офк
1012021
#314 #1012021
>>1012020
сколько платишь?
1012031
#315 #1012025
>>1011977
Перевод строки убери из строчки форматирования.
#316 #1012031
>>1012021
хз, никогда не заказывал задачки
рублей 200-300, она не сложная
1012032
#317 #1012032
>>1012031

>рублей 200-300


в голосину
10120331012034
#318 #1012033
>>1012032
слишком мало?
#319 #1012034
>>1012032
да не, мб ты не так понял, там просто функцию написать надо и использовать её на чем то использовать я сам смогу
1012038
#320 #1012038
>>1012034
Я не думаю, что там что-то сложное, давай своё задание здесь.
1012050
207 Кб, 1280x960
#321 #1012050
>>1012038
В общем есть 100 билетов, в каждом одно задание, ~70 я прорешал, а некоторые прям вообще хз

бывают такие - https://pastebin.com/zFKSFPVb

А бывает и такое:

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

Как с помощью рекурсии это сделать не понимаю
#322 #1012051
>>1012050

> Как с помощью рекурсии это сделать не понимаю


#define max(x, y) ((x) > (y) ? (x) : (y))

int find_max(list ptr elem) {
if (!elem) return INT_MIN;
int foo = elem->value;
int bar = find_max(elem->next);
return max(foo, bar);
}
Ну или на хвостовую перепиши, чтобы было return find_max(elem->next, current_maximum);
#323 #1012052
>>1012050

Просто типо из этих двух я уверен, что мне выпадет вторая, поэтому и написал сюда тип подстраховаться

1)В текстовом файле дана последовательность чисел. Написать подпрограмму, которая в однонаправленном списке из каждой группы подряд идущих равных элементов оставляет только один. Используя эту подпрограмму, преобразовать заданную последовательность.

2)В текстовом файле дана последовательность чисел. Написать подпрограмму, которая проверяет, упорядочена ли последовательность действительных чисел, хранящаяся в двунаправленном списке. Используя эту подпрограмму преобразовать заданную последовательность следующим образом, если она упорядочена, то, не нарушая упорядоченности, вставить в нее элемент со значением p, иначе удалить элемент с номером k.
1012054
#324 #1012053
>>1012051
сейчас попробую, спасибо
#325 #1012054
>>1012052
1) Втыкаешь внутренний цикл, крутящийся, пока следующий элемент есть и равен стартовому.

> Используя эту подпрограмму


Беги оттуда. У тебя препод - любитель втыкать не относящиеся друг к другу действия в одну функцию[s/] подпрограмму.
2) Крутишь цикл, пока next не NULL, проверяешь, что значение next больше значения текущего элемента. Попутно считаешь порядковые номера, запоминаешь указатели элемент с индексом k и элемент со значением p. Когда выйдешь из цикла, в зависимости от next !=/== NULL, принимаешь решение, какое действие с каким из указателей сотворить. И сотворяешь.
1012057
#326 #1012057
>>1012054
Не, ну первую то я офк легко решил.

>Беги оттуда. У тебя препод - любитель втыкать не относящиеся друг к другу действия в одну функцию[s/] подпрограмму.



Да у меня вообще пиздец, у меня препод дает нам постоянно операторы с крестов new delete etc, а наш курс называется просто "Программирование на языке Си"
И вообще все преподавание это написание синтаксиса какой нибудь функции на доске и выдача лаб. Мб поэтому я так туплю.

>>1012051

>(list ptr elem)


Немного не понимаю, что это?
Быть может (struct list *elem)?
#327 #1012064
>>1012051
Написал, работает. Только как с помощью этой же подпрограммы удалить max?
1012137
#328 #1012066
>>1012050
Сделал: https://pastebin.com/n1QGhYPc

Не проверял на работу, но должно заработать.
#329 #1012137
>>1012064
Тайна сия велика есть. Но можно возвращать не max, а указатель на максимальный элемент. Соответственно по возврату из функции в вызывающей функции этот элемент грохать как-нибудь. Но опять же однонаправленный список... хуй знает.
#330 #1012237
Сап, возможно ли с помощью этой подпрограммы - https://pastebin.com/g8ziudsN

Удалить все элементы из списка (кольцевого двусвязного) с черными номерами, считая, что нумерация начинается с 1 отправлено первого элемента?
1012247
#331 #1012247
>>1012237

> Сап, возможно ли с помощью этой подпрограммы - https://pastebin.com/g8ziudsN



> Удалить все элементы из списка (кольцевого двусвязного) с черными номерами, считая, что нумерация начинается с 1 отправлено первого элемента?


Ты точно по-русски говоришь?
1012299
#332 #1012299
>>1012247
Ананасы, как вы в POSIX запускаете процесс, который должен запуститься, сделать своё дело и завершиться, но при независимых довольно нестандартных обстоятельствах может и повиснуть (либо очень долго выполняться)?
Я вижу два решения:
1. fork и waitpid с таймаутом (не совсем надежно, в худшем случае может остаться зомби), но зато можно получить код завершения процесса при успешном выполнении (что в моем случае было бы полезно)
2. вызвать fork дважды, делать exec с последнего child, первый child убить. Надежно, но сложно получить код завершения (и тут я думаю — а нужен ли он мне...).
10123001012366
#333 #1012300
>>1012299
упс, не туда ответил
1012302
#334 #1012302
>>1012300
А я ананас.
#335 #1012366
>>1012299
Не вижу проблемы.

>в худшем случае может остаться зомби


С чего бы это? Ты SIGCHILD не обрабатываешь?
#336 #1012380
Есть одна прога. Она должна посчитывать CRC16 файлов, ну и сохранять их. Функция по расчету CRC16-CCITT точно правильно работает, т.к скопизжена. Так вот, почему-то контрольную сумму от файлов считает неправильно, но если это обычный текстовик - то все работает нормально. Не понимаю, в чем проблема.
https://pastebin.com/UKg6ydbH
10124161012420
#337 #1012416
>>1012380
Немного поясню - неверно считает хэши от всяких бинарников, от exe до mp3 и прочее.
10124201012509
#338 #1012420
>>1012380
>>1012416
Вопрос снят. Заменил unsigned char на byte, и оно почему-то заработало.
1012448
#339 #1012448
>>1012420

>byte


Это что за зверь в сях?
10124571012497
#340 #1012457
>>1012448
signed char?
#341 #1012497
>>1012448
Глянул объявление - unsigned char. Другой вопрос, почему через этот самый unsigned char оно не работало, а через byte - вполне.
10124981012509
#342 #1012498
>>1012497
Магия
#343 #1012509
>>1012497
Врешь ведь. У тебя там винда и отсутствие флага "b" в fopen. Поэтому в бинарниках >>1012416 проблемы с \r\n. А из-за unsigned char проблем быть не может (с правильно написанным кодом, который знает про integer promotions).
1012523
sage #344 #1012523
>>1012509
Хотя нет, я был не прав, rb есть, но unsigned byte явно vs. typedef все равно влиять не должны. Зато есть другие проблемы типа f.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY (надо через & тестить, могут быть другие атрибуты), странного чтения посимвольно, хотя fread может поблочно, еще более странной конструкции для вычисления размера (у тебя int 32-битный, чего ты вообще пытаешься добиться?), отсутствия проверки, открылся ли файл и отсутствия fclose в принципе (количество открытых файлов ограничено, см. FOPEN_MAX - однажды следующий не откроется, и ты будешь считать чексумму мусора в памяти). Ну и FindNextFile BOOL возвращает.
1012605
313 Кб, 778x760
#345 #1012570
Вот, K&R в пункте про goto пишут два примера программы для нахождения первых попавшихся равных элементов двух массивов.
Для пикрил примера без goto пишется, что приходится вводить ещё одну переменную с дополнительными проверками.
Ну а вообще, какой из двух вариантов на пикрил будет быстрее? Насколько дорого обходится желание "прыгнуть" в определённый участок кода?
1012584
#346 #1012584
>>1012570
goto бесплатный (превращается в jmp). Переменную компилятор скорее всего оптимизирует в тот же jmp (но без гарантий). Код с пика можно переписать без goto и переменной: при совпадении нужные действия и возврат, а при выходе из цикла у нас ничего не нашлось.
1012586
#347 #1012586
>>1012584
А, ну да, можно просто i=n и j=m присвоить, тогда циклы загнутся. Спасибо
1012590
#348 #1012590
>>1012586
Нет, присваивать не нужно, тогда уж лучше перемеменная. Я имел в виду
for (...) {
for (...) {
if (...) {
// found
...
return;
}
}
}
// not found.
return;
#349 #1012605
>>1012523
Спасибо. Энивей, это была лишь заготовка, и всякие проверки прикручены.
#350 #1013282
Повторно вкатываюсь в программирование, в школе учил поцкаль (боже, как давно это было), два года назад ещё помнил как накодить калькулятор на Python, но за прошедшее время нещадно отупел и огуманитарился.
Спросил у бро-программиста (не российского), каким, на его взгляд, должен быть стартовый язык, потому что возврат к Python мне сейчас не кажется очень хорошей идеей, а на двачах в основном советуют JS. Бро процитировал мне Дийкстру про Basic, уточнил, что это более чем относится и к JS'у, поэтому, для общей подтяжки алгоритмики и более глубокого понимания происходящего, он советует стартануть с C, как когда-то делал он.
Собственно, вопрос. Как думаете, стоит ли действительно вкатываться с Pure C, или это не самая лучшая идея при наличии на другие языки огромного количества всяких человеко-ориентированных обучалок для энтри-левела?
(бро, впрочем, расценивает Java как неплохой энтри-язык, с поправкой на то, что именно С быстрее всего сломает мне старые шаблоны и заставит мыслить как программист, а не codemonkey)
#351 #1013283
>>1013282
Всякие речи про ломание шаблонов это хуйня полная, язык программирования это средство, учи что хочешь, что нужно будет на первой работе, что понравилось, пробуй разные языки, а потом если захочешь, то почитаешь про архитектуры и прочую лабуду, без которой 99% кодмакак живут и радуются жизни.
#352 #1013324
>>1013282
Начни с Си, хорошенько поебись с низкоуровневыми фичами и указателями, потом спокойно иди на питон и изучай всё остальное, включая ооп и алгоритмы. Ты слабо представляешь, какая беда у средних программистов с пониманием указателей.

После основ этих двух будешь готов к любому языку, а на Js ты будешь больше ебаться с несовершенствами Js, что тебе совсем не нужно, как новичку. Java тоже неплохо, но Питон меньше всего отвлекает от высокоуровневой сути.
1013352
#353 #1013349
>>1013282
Python - это такой современный Бейсик, с более широкими возможностями (ООП, ФП и т.д.). Он легок для вкатывания, но калечит мышление.
Начинать нужно с языка, который даст тебе представление об устройстве компьютера.
И это - только Си. Раньше еще был Паскаль, но он умер, а дедушка Вирт впал в маразм и несет какую-то ахинею (последним нормальным языком от него был Модула-2, наработки из которого вошли в Turbo Pascal и Delphi).
1013439
#354 #1013352
>>1013324

> Java тоже неплохо


Java и C# ни в коем случае не годятся для первого языка, ибо совмещают сложность C/C++ (статика и т.д.) с высокоуровневостью (тормоза, песочница и т.д.) JS/Python/Ruby/PHP/Perl.
Для многих прикладных задач эти языки удобны, но начинать нужно с других, лучше с Си.
#355 #1013439
>>1013349

>Раньше еще был Паскаль


пускаль всегда был говном, от := ажтриясет
1013440
#356 #1013440
>>1013439
ссы всегда был говном, от = и ++ внутри выражений ажтриясет
1013467
#357 #1013457
Прочитал полностью первую главу K&R, появилось желание по заниматься практикой. Открыл первый же рандомный задачник с простенькими задачками и понял, что ничего кроме getchar() не знаю. Что посоветуете почитать про встроенные и сторонние функции в Си?
10134611013778
#358 #1013461
>>1013457
Герберт Шилдт. Полный справочник по C
#359 #1013467
>>1013440
обоссал дауна
1013478
#360 #1013478
>>1013467
Себя что ли?
1013532
#361 #1013532
>>1013478
кек но даун это ты даун
1013544
#362 #1013544
>>1013532
Зачем ты разговариваешь с зеркалом?
#363 #1013778
>>1013457
Придумай задачу, например калькулятор или интерпретатор brainfuck, и реализуй. Потом читай больше об этом и узнаешь о других способах того же самого действия.
92 Кб, 749x249
#364 #1014036
Можно где-нибудь поподробнее про побитовые операции (с основами) в C?
А то я это пропустил, а сейчас думаю, что зря.
Читаю пикрил и...

> x & ~077


Почему 077? Не зависит от длины слова? Длины слова?

> Запись x & ~077 лучше, чем x & 0177700


>...


Короче, нужны совсем основы побитовых операций
#365 #1014040
>>1014036
Чот хуйня, первый раз вижу ~ в C
#366 #1014043
>>1014036

> Почему 077


Восьмеричная система, 077 = 63 = (1 << 6) - 1, т.е., ставим 6 младших битов в 1.

> Не зависит от длины слова? Длины слова?


sizeof(int). Не зависит потому, что слева от наших 6 единичек может быть сколько угодно нулевых бит, и ~ успешно их все инвертирует.

За булевой логикой в вики. Начни с двоичной системы и обратного дополнительного кода.
25 Кб, 308x499
109 Кб, 341x500
#367 #1014055
>>1014036
Читай Библию.
Есть в русском переводе.
21 Кб, 617x400
#368 #1014065
двач я сглупил 3 месяца стоит gcc(mingw)сегодня аетивирус
написал что G++.exe подозрителен ну я такой ну ладно исправлю думал ничего не будет и теперь cmd видит gcc но не видит команду g++ что делать?

idp generic

не дает переустановить
выдает это
#369 #1014066
>>1014065
В карантине, скорее всего, g++.
Через менеджер карантина антивируса восстанови g++, потом настрой антивирус так, чтобы он вообще не трогал папку с твоими поделиями и папку с mingw.
1014070
#370 #1014068
>>1014065
Я не люблю это писать, но вон из профессии. Если уж ты с антивирусом справиться не можешь, и не знаешь, как решить access denied в системе, зачем ты ползешь ее программировать? Начни с простого - разберись в ОС как юзер.
10140691014085
#371 #1014069
>>1014068
Нафиг оценивать скиллы в сишке по умению совладать с шиндой, если шинда вообще не показатель ни для кого?
#372 #1014070
>>1014066
понятно дело но его там нет он там
был но я его удалил
1018711
#373 #1014085
>>1014068

>разберись в ОС


Ты не отличаешь программиста от тыжпрограммиста?
1014433
sage #374 #1014433
>>1014085
Чтобы писать код для ОС, нужно представлять, как она работает. Если ты представляешь, как она работает, ты знаешь, отчего бывает access denied. Если нет - стоит выбрать какой-нибудь жаваскрипт, в котором взаимодействовать с ОС не нужно.
15 Кб, 720x394
Только спокойствие #375 #1014514
Упр. 4.14 K&R, ужасно непонятное.

> Определите swap(t,x,y) в виде макроса, который


осуществляет обмен значениями указанного типа t между аргументами
х и у. (Примените блочную структуру.)
В интернете либо решения с использованием следующих глав, либо решено только для случая int.
https://pastebin.com/jrTjfqg4
Там вообще бредятина ужасная, скорее всего, но просто со слов K&R о макроподстановках я так и понял.
10145311014832
#376 #1014531
>>1014514
Кое-что исправил, ругается, когда встречает строку

> for (i=0; i<sizeof(x); TEMP=x, x=y, y=TEMP, i++); \


error: subscripted value is neither array nor pointer nor vector
for (i=0; i<sizeof(x); TEMP=x, x=y, y=TEMP, i++);\ ^
https://pastebin.com/KBkDme2T
1014832
sage #377 #1014832
>>1014514
От тебя ожидалось всего лишь что-то типа:
#define yoba_swap(type, foo, bar) do { \
type temp = foo; \
foo = bar; \
bar = temp; \
} while (0)
Естественно, для массивов не сработает, но для всего остального - вполне. Суть макросов в том, что все выполняется на этапе компиляции, поэтому твое решение со сравненим строк в рантайме ничем не оправдано. Нет, ну можно конечно с VLA из C99 замутить обмен чего угодно:
http://ideone.com/kmidbZ хотя это извращение, и код далек от оптимального.


>>1014531
Во-первых, у тебя условие неправильное. Ты пишешь: если t совпадает со строкой "int", и t совпадает со строкой "double" strcmp возвращает 0 при совпадении, не говоря уже о том, что t не может быть двумя разными строками одновременно, и размеры объектов равны а вот нифига, препроцессор тебе развернет SIZEX в sizeof(x), но аргумент туда уже не подставит, т.е., что бы ты не передал в swap, на выходе всегда будет sizeof(x), то...
Во-вторых, объекты, которые обмениваются значениями, могут не быть массивами, и в этом случае твой цикл слегка не в тему, что собственно у тебя и происходит.

> char s[]={'i','n','t'};


Значение знаешь?
1014838
#378 #1014838
>>1014832
Спасибо, довольно подробно.

> Значение знаешь?


Ну, если char s[]="int", то char s[]={'i','n','t','\0'}.
А зачем do {...}while(0) ?
Выглядит просто как причина открыть фигурные скобки, ибо по-любому выполнится один раз.
Но зачем?
1014845
sage #379 #1014845
>>1014838
do {} while (0) - это минимальный statement, после которого можно воткнуть ; без последствий:
#define YOBA(a, b, c) { что-то там }
if (expr)
YOBA(1, 2, 3);
else
YOBA(4, 5, 6);
После препроцессирования получаем:
if (expr)
{ что-то там };
else
{ что-то там };
И компилятор недоумевает, а откуда взялся else, ведь перед ; if с его точки зрения уже кончился. В свою очередь после while точка с запятой к месту, и ничего не ломает.

> Ну, если char s[]="int", то char s[]={'i','n','t','\0'}.


Отлично, но зачем?
1014851
#380 #1014851
>>1014845

> Отлично, но зачем?


Сейчас уже нет смысла об этом говорить, я совсем по-другому себе всё это представлял.
Ну и не проще ли просто не ставить ; при вызове макроподстановок? Так можно заодно и отличать их от вызовов функций
1014859
#381 #1014859
>>1014851
1) Макрос #define SMTH(x) ((x) + 3) и вызов printf("%d\n", SMTH(1) / 2). Если тут точку с запятой поставить в макросе, сломается вызов.
2) Часто макросами заменяют короткие функции, иногда даже в одном проекте одно имя может быть функцией или макросом, в зависимости от настроек проекта и платформы (тот же getchar() в стандартной либе очень часто макрос), т.е., чтобы узнать, ставить ли точку с запятой, тебе нужно понять, вызываешь ли ты функцию или макрос (сам вызов-то выглядит одинаково). Т.е., тебе нужно запоминать это для каждого имени или каждый раз ходить смотреть.
3) Читается хуже, пидорасит подсветку в IDE.
Поэтому проще всего оставить обычные подстановки для #ifdef и констант (типа #define M_PI 4.0), а все остальное делать function-like макросами, и не ставить в них финальную точку с запятой. Этот подход вызывает наименьшее количество путаницы.
#382 #1014911
Мне вот интересно, а вы, случайно, про юникод не слышали?
1014913
#383 #1014913
>>1014911
Слышали. Есть вопросы - задавайте.
1014916
#384 #1014916
>>1014913
Ну, тут такое дело. Хочу написать приложение. С локализацией. В чем бы мне хранить все эти китайские иероглифы вместе с арабской вязью? В char-то не влезают.
10149171014919
#385 #1014917
>>1014916
Влезут в массив.
1014918
#386 #1014918
>>1014917
А как мне потом по этому массиву понять, сколько же там всего символов? Ну или, скажем, как получить n-ый символ?
1014922
#387 #1014919
>>1014916
Мало редактируешь текст - UTF-8, много редактируешь текст хранишь в UTF-8, а обрабатываешь в UTF-32. C wchar_t осторожнее.
1017627
#388 #1014922
>>1014918
Сколько символов в строке "ó"? А в строке "ó"? А третий с нуля символ в строке "​​​​​​​​​xyz" какой?
#389 #1014924
>>1014922
Один. Два байта.
#390 #1014927
>>1014922
Мне там макака свинью подложила. В первом случае была o с акцентом, во втором символы o и акцент. В третьем все еще веселее, он даже у макаки работает.
1014937
#391 #1014934
>>1014922
Это еще фигня, вот корейский Хангыль - это вообще жопа.
괜찮아
1015075
#392 #1014937
>>1014927
Не акцентом, а ударением.
1014938
#393 #1014938
>>1014937
Принципиальной разницы нет. Ты еще к символами прицепись и расскажи про глифы и кодовые позиции.
#394 #1015075
>>1014934

>괜찮아



Бля, хорошо, что я пхп-макакака. Тут же столько БОЛИ.
#395 #1017263
Нуб скромно шагнул в тред.

Почему запись (✻s++ = *t++) сдвигает указатель на 1, а не увеличивает на 1 то, на что он указывает?
1017267
#396 #1017267
>>1017263
Прошу прощения, нашёл ответ в faq, надо почаще туда смотреть, лол.
#397 #1017271
>>1014922

> А третий с нуля символ в строке "​​​​​​​​​xyz" какой?


NULL?
1017570
#398 #1017570
>>1017271
Дважды не угадал. Во-первых, NULL в сишечке - это ((void *) 0), а ты, наверное, имел в виду то, что в ASCII называется NUL, он же '\0'. Во-вторых, разговор был о юникоде, поэтому тебе стоило скопировать ту строчку куда-нибудь и разобрать по байтикам. Там несколько пробелов нулевой ширины перед буквами.
#399 #1017627
>>1014919
OMG, а utf больше 8 где-то используют? И что с ними?
1017684
#400 #1017684
>>1017627
UTF-8 хорош для передачи и хранения. В винде нативный апи - UTF-16. С UTF-16 слегка проще/быстрее работать, меньше проблем с невалидными последовательностями, но все равно остаются суррогатные пары, о которых нужно помнить, ну и порядок байт еще (поэтому лучше UTF-16 оставить для обработки, а передавать UTF-8). А так как памяти сейчас дохуя, то некоторые используют сразу UTF-32, чтобы устранить даже минимальную еблю на этапе обработки, ну и 11 бит еще на всякие флаги остаются, тоже удобно иногда.
1017687
#401 #1017687
>>1017684
Для обработки есть однобайтовые кодировки.
1017688
#402 #1017688
>>1017687
Лолшто? Ты разбиваешь текст на слова и хранишь каждое слово в своей кодировке? Или как?
10176911017736
#403 #1017691
>>1017688
Ты чё ёбнутый? Берёшь и работаешь с буквами в каком-нибудь кои8-р.
#404 #1017736
>>1017688
А почему не придумать какой-то способ переключения кодировок неявный? Там какой-то идентификатор и переключающий символ.
1017756
#405 #1017756
>>1017736
Потому что проблем гораздо больше, чем даже с UTF-8. Простейший пример: ты отрезал 3 первых символа строки, в том числе переключающий символ. В какой кодировке строка? Когда я был молодой и глупый я тоже такое изобретал. При попытке практического использования все проблемы-то и вылезли.
#406 #1018145
struct {
FILE fp;
int eof=0;
char
scur;
int snum=0;
} file[MAXFILES];
Во всём массиве будет file.eof==0 ?И можно будет менять это значение?
1018151
#407 #1018151
>>1018145
В Си такого синтаксиса (= 0 в определении структуры) нет, можешь сделать struct { ... } file[MAXFILES] = { 0 }, и тогда во всем массиве будут нули (компилятор скорее всего memset воткнет явно или инлайном). И да, значение можно будет менять, конечно же.
1018153
#408 #1018153
>>1018151
А , т.е. он сам тип определит, а если {0, 0}, то он воткнёт 0 и snum, и eof.
А если {NULL ,0, NULL, 0}, то и указателям, да?
1018166
#409 #1018166
>>1018153
Нет. { 0 } - это по сути короткая запись для { [0] = { .fp = 0 } } (т.е., первому элементу массива, первому элементу структуры присвоить ноль), но частично структуры инициализировать нельзя, поэтому компилятор забьет все оставшиеся элементы массива и члены структур нулями тоже. { 1, 2 } - присвоит значения первым первым двум членам первого элемента массива, остальное забьет нулями.

> А если {NULL ,0, NULL, 0}, то и указателям, да?


Так ты не сделаешь, нет такой выборочной инициализации элементов массива или структуры, да еще и с пропусками. Можно явно:
{ [0] = { .eof = 0, .snum = 0 }, [1] = {.eof = 0, .snum = 0 }, итд }, но это бессмысленно, потому что компилятор все равно забьет все остальное нулями.

Хочешь инициализировать именно eof и snum, и ничего больше - делай явно:
for (...) { files[ i ].eof = 0; files[ i ].snum = 0; }
но выиграешь только на больших массивах. Если у тебя порядка пары килобайт, инициализация всего массива разом = { 0 } или мемсетом будет быстрее.
#410 #1018311
>>992632 (OP)
Вот в шапке много всяких книг, но в них только в них синтаксис языка объясняют. Как практиковаться, может есть список проектов с возрастающей сложностью. Вот хочу написать что нибудь, а что писать и как не знаю. Не могут изучать язык по книгам. Нужны реальные задачи. Где взять реальные задачи анончики?
10183151018317
#411 #1018315
>>1018311
Тоесть помогать каким-то проектам или пилить свои?
#412 #1018317
>>1018311
Прочитай книгу с синтаксисом. Не зная синтаксиса идти что-то реализовывать глупо.

> как практиковаться


Расскажи, зачем ты учишь язык? Какая область тебе интересна?
1018327
#413 #1018327
>>1018317
Даже уже комом в горле этот синтаксис. Мне интересно программирование начиная от процессора и заканчивая сетью. Изучал разные языки и понял, что мне мешает эта прослойка между ними ОС и процессором. Хочу понять что на низком уровне. Как транслируются программы, в частности те же языки программирования. Как работают компиляторы, как работает параллелизм на уровне ОС, на уровне процессора, на уровне компиляторов-интерпретаторов. Как реализуются сетевые протоколы.

Проблема в том, что без практики у меня не усваивается, а такие глубокие темы в основном описываются теоретически, либо вообще нет информации.
#414 #1018337
>>1018327
Что бы ты хотел написать годного?
1018381
301 Кб, 1920x1080
#415 #1018346
>>1018327

> заканчивая сетью


Ну вот и напиши DHT-клиент для Kademlia. Сложно, заебешься (придется узнать о TCP/IP, придется узнать про сокеты, придется парсер bencode написать, про структуры данных узнать какие-нибудь, архитектура, обработка ошибок, вот это все), хотя сам принцип прост.

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

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


Овердохуя информации, если можешь в английский. Вплоть до видеотуториалов на ютубе.

Алсо, пикрелейтед.
#416 #1018353
>>1018346
А я на 77-ом уровне.
#417 #1018355
>>1018346
ролл
1018358
#418 #1018358
>>1018355
ха, а я думал это уровни.
1018608
#419 #1018375
ролл
#420 #1018381
>>1018337
Компилятор, интерпретатор, свой сетевой стек...
1018383
#421 #1018383
>>1018381
Напиши интерпретатор брейнфака. Сместо стека (для циклов) я использую массив int и int с порядковым номером.
#422 #1018384
>>1018346
Спасибки. Эти челленджи с warosu.org? Нагуглил v2-v3 кроме v1.4 того что на твоей пикче.
#423 #1018540
Программа линкрил
https://pastebin.com/SL2hZhRD
должна в теории сравнивать некоторое кол-во файлов, если находит различие в определённой строке (в т.ч. если один из файлов уже кончился), то выводит сообщение с номером строки и выводит строки с этим номером.
Но если ей подсунуть два одинаковых файла, то функция fstobuf (очередная строка файла в буфер, возвращает указатель на строку в буфере) каким-то образом добавит 13-ый символ (возврат каретки, щито?!) в каждую строку, а функция strcmp, получив (в теории) одинаковые строки, выдаст единицу, хотя выглядит она (strcmp) довольно просто, должна возвращать ноль, если строки одинаковы.
Ужос.
1018549
#424 #1018544
Вопросик такой. Решил упростить свой Сишный код няшными функциями новой гомоС++.

Будет ли auto в данном коде работать как var? Функция вызываемая мной возвращает NTSTATUS, по идее я хочу чтоб _status после вызова стал типом NTSTATUS и мне не пришлось обьявлять для этого дополнительную переменную.

Вот код :

https://pastebin.com/vEqu6beF
#425 #1018549
>>1018540
Дошло.
#426 #1018566
Простите за плюсовой код, но вопрос больше касается именно C-корней.
Часто говорят, что выделение двумерного массива в С/С++ плохое, потому что в памяти всё лежит по столбцам, а не по строкам, а вот в фортране всё хорошо, там всё построчно и поэтому можно быстро бегать по двумерному массиву.

Я набросал этот код и запустил его в DevC++ с MinGW:

#include <iostream>

/ run this program using the console pauser or add your own getch, system("pause") or input loop /

#define MD 4

int main(int argc, char argv) {
int a[MD][MD];
for(int i = 0; i< MD; i++)
{
for (int j = 0; j < MD; j++)
{
a[j] = i100+j;
}
}
void
b = a;
for(int i = 0;i<MDMD; i++)
{
std::cout << (b+=sizeof(int)) << " " <<
((int*)b) << std::endl;

}

return 0;
}

На выходе у меня

0x28fe64 0
0x28fe68 1
0x28fe6c 2
0x28fe70 3
0x28fe74 100
0x28fe78 101
0x28fe7c 102
0x28fe80 103
0x28fe84 200
0x28fe88 201
0x28fe8c 202
0x28fe90 203
0x28fe94 300
0x28fe98 301
0x28fe9c 302
0x28fea0 303

--------------------------------
Process exited after 0.2274 seconds with return value 0
Press any key to continue . . .

Т.е. всё лежит именно построчно.
Что я делаю не так?
#426 #1018566
Простите за плюсовой код, но вопрос больше касается именно C-корней.
Часто говорят, что выделение двумерного массива в С/С++ плохое, потому что в памяти всё лежит по столбцам, а не по строкам, а вот в фортране всё хорошо, там всё построчно и поэтому можно быстро бегать по двумерному массиву.

Я набросал этот код и запустил его в DevC++ с MinGW:

#include <iostream>

/ run this program using the console pauser or add your own getch, system("pause") or input loop /

#define MD 4

int main(int argc, char argv) {
int a[MD][MD];
for(int i = 0; i< MD; i++)
{
for (int j = 0; j < MD; j++)
{
a[j] = i100+j;
}
}
void
b = a;
for(int i = 0;i<MDMD; i++)
{
std::cout << (b+=sizeof(int)) << " " <<
((int*)b) << std::endl;

}

return 0;
}

На выходе у меня

0x28fe64 0
0x28fe68 1
0x28fe6c 2
0x28fe70 3
0x28fe74 100
0x28fe78 101
0x28fe7c 102
0x28fe80 103
0x28fe84 200
0x28fe88 201
0x28fe8c 202
0x28fe90 203
0x28fe94 300
0x28fe98 301
0x28fe9c 302
0x28fea0 303

--------------------------------
Process exited after 0.2274 seconds with return value 0
Press any key to continue . . .

Т.е. всё лежит именно построчно.
Что я делаю не так?
10185681018909
#427 #1018568
>>1018566
Парсер двоща — шлюха, экранировал отступы
#428 #1018608
>>1018358
Ну,список странный тогда выходит. Ведь как сначала написать научный калькулятор не умея писать даже с обратной польской нотацией?
10186521018909
#429 #1018652
>>1018608
А вот телнет сервер мне был бы очень нужен.
#430 #1018682
Здравствуйте. У меня вопрос довольно абстрактного характера. В общем, насколько приемлемо и в каких случаях приемлемо библиотечной функции прерывать выполнение программы? Т.е. выполнять всё, что нужно, ничего не возвращать, а просто вызывать exit(). Я не беру в расчёт всякие ассерты, и вообще обработку исключительных ситуаций. Просто библиотечная функция, в документации которой прямо указывается, что после её вызова, программа прекратит выполнение.
#431 #1018702
1018705
#432 #1018705
>>1018702
большое спасибо за развёрнутый ответ
#433 #1018709
>>1018682
Если не вредит программе и остаётся читабельной код - вполне да. Но лучше заменять exit ретурном.
30 Кб, 971x601
#434 #1018711
двач что за хуйня
в карантине файла нет
>>1014070 и >>1014065 кун
#435 #1018716
Двач, чем процедурное программирование отличается от структурного?
#436 #1018726
>>1018711

>math.h вместо cmath


>это форматирование кода


>эти отступы, которых нет

1018734
#437 #1018734
>>1018726
код сделан а редакторе нотепад

>math.h вместо cmath


разница какая тем более для лабы
1018741
#438 #1018741
>>1018734

> разница какая


завтра потом выростайэт макака. ТЫ ЧО ПИРИМЕННУЮ VAR1 И VAR2 ВСЕ ПОЙМУТ ПРЕДНАЗНАЧЕНИЕ. ЗАСЕМ ОТСТУПЫ КОММЕНТАРИИ ЧИТАБЕЛЬНОСТЬ???ЮЮ НИНУНЖА
1018743
#439 #1018743
>>1018741

>12 строк


>нечитабельный


да ты поехавший
1018885
#440 #1018747
>>1018327
Пили файловый менеджер. Ему фичи допиливать можно будет бесконечно: FTP, вьювер картинок, архиватор, mounter, встроенный терминал, API для плагинов на каком-нибудь скриптовом языке, и т.д. и т.п.
1018799
#441 #1018748
>>1018711
А си тут при чем?
1018790
#442 #1018790
>>1018748
какая разница что .с что .срр
не коипилится
10187931018794
#443 #1018793
>>1018790
Ну смотри, давай я тебе объясню.

С++ — говно сраное, этот язык давно должен был умереть и кануть в Лету.

С — лучший язык современности, он популярен, прост, быстр. Что ещё нужно от языка?
10188181018972
sage #444 #1018794
>>1018790
А ты осмысли своей тупой башкой, что тебе пишут в ошибке.
#445 #1018799
#446 #1018818
>>1018793
я тебя не про язык спрашиваю а про коомпилятор
у меня файл что сишная что С++ не компилится
1018884
#447 #1018884
>>1018818
install gentoo
#448 #1018885
>>1018743
На начальном этапе в любом случае надо вводить в привычку писать хороший код.
#449 #1018909
>>1018566
Двумерных массивов в сишечке нет. Какой-нибудь array[n][m] - это по сути массив размером n, в котором каждый элемент - массив размером m. Соответственно, тебе нужно просто помнить, что "измерения" лежат последовательно, начиная с самого правого. array[y][x] будет лежать построчно, а вот array[x][y] - по столбцам.

>>1018608
От научного калькулятора в первую очередь требуются математические функции. Добавить приоритеты вычислений можно при последовательном вводе, RPN не нужна. Пример - виндовый калькулятор до десятки.

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


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

>>1018711

> что за хуйня


Смотри сюда, собирай информацию: >>1010153 А телепаты в отпуске, лето же.
#450 #1018911
#451 #1018927
>>1018909
Хуй знает, стековый калькулятор запилить как нехуй, а распарсить строку с скобочками, которые меняют приоритеты операций - так и не осилил.
10189291019083
#452 #1018929
>>1018927
Ыыы, сколько я говна в блокнотик излил, пытаясь распарсить скобочки.
https://pastebin.com/Nehizuti
#453 #1018972
>>1018793

>С++ — говно сраное


Понадобятся классы - прибежишь и начнешь жрать это говно, еще спасибо скажешь, что тебя им накормили.
1018976
#454 #1018976
>>1018972
Наааахуй эти ваши классы. Если реально надо, то эта задача требует нормального выскоуровнего языка - жаба, питон, хуйтон или что там щас модно.
1018979
#455 #1018979
>>1018976
А если задача требует высокой производительности, которой не достичь джавой и питоном?
10189931019015
#456 #1018993
>>1018979
JNI, экстеншены для питона. На сишечке.
#457 #1019015
>>1018979
Разрабатывать программы на C с меньшей эффективностью. Поверь, говнокод васи пупкина на ц++ куда медленнее, чем грамотный код специалиста по java на java.
1019026
#458 #1019026
>>1019015

>говнокод васи пупкина на ц++ куда медленнее, чем грамотный код специалиста по java на java.


Но быстрее говнокода на Java. А грамотный код специалиста по C++ на C++ быстрее, чем грамотный код специалиста по java на java.
#459 #1019029
>>1019026
Java предназначен для грамотной разработки. Тем более, найти специалиста по java куда проще чем по c++, если они вообще есть.
#460 #1019040
>>1019026
Джава по скорости почти не уступает крестам, в некоторых случаях даже быстрее. Про скорость разработки и говорить нечего.
1019054
#461 #1019042
>>1019026

> Но быстрее говнокода на Java.


С нулевой обоссу. Наглый пиздец.

Говнокод Васи Пупкина на крестах будет течь памятью и просто медленно работать потому что Пупкин ебоклак. А говнокод Сюткина течь не будет и будет работать быстрее за счет того, что у Пупкина есть только собственный говнокод, а у Сюткина десятилетиями оптимизируемый JVM.

Только, блять, не надо сюда совать бенчмарки уровня "короч вот тут я запускаю числодробилку и измеряю время старта приложения и время остановки приложения".

В общем, подумой почему на крестах пишутся всякие игори и движки на них, плюс реально специализированное говно, а весь кровавый тырпрайз и хуйлоад на JVM-языках.
#462 #1019044
>>1019042

> Наглый пиздеж*

#463 #1019047
>>1019042

> java не течёт!


Раздался пронзительный голос со стороны параши.
#464 #1019052
>>1019042

>десятилетиями оптимизируемый JVM


Там десятилетия говнокода и архитектурной астронавтики. Достаточно сравнить любую программу на Qt и Swing, чтобы убедиться, что свинг - тормозное overengineered говно, как и большинство кода на джаве.
1019242
#465 #1019054
>>1019040

>Джава по скорости почти не уступает крестам


Как она может по скороси не уступать, если у любой коллекции там оверхеды в 5 раз по памяти из-за жирных пойнтеров и в десятки раз по скорости из-за отсутсвия value-типов и убивающего кэш пойнтер-чейза.
1019065
#466 #1019063
>>1018909

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


Я так понимаю, под это подходит только один exit()?
1019066
#467 #1019065
>>1019054
Вася и Петя пилят сервер к месседжелу (мессенджеру).
На второй день, пока Петя в джаве пишет конференции, Вася на крестах велосипедирует парсер json, так как другие реализации слишком кривые. Саше вообще класть, на Ц всё давным давно написано и отлажено.
1019193
#468 #1019066
>>1019063
Возможно не один, но да.
#469 #1019070
>>1019042

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


ентерпрайз пишут на явке (и на шарпе) потому что там есть горячая загрузка кода - ты можешь подгрузить классы
а в крестах этого нет, так как нет стандартизированного abi, приходится поэтому пользоваться старыми сишными соглашениями и городить поверх них компонентные обертки типа com
10190811019242
#470 #1019080
>>1018909

>Двумерных массивов в сишечке нет. Какой-нибудь array[n][m] - это по сути массив размером n, в котором каждый элемент - массив размером m. Соответственно, тебе нужно просто помнить, что "измерения" лежат последовательно, начиная с самого правого. array[y][x] будет лежать построчно, а вот array[x][y] - по столбцам.



В примере у меня получилось, что array[y][x] лежит построчно в виде сплошного массива array[x*y]. При этом всё время слышу о каком-то сверхправильном расположении массивов в фортране, из-за чего он чуть быстрее.
1019082
#471 #1019081
>>1019070
Нет, пишут на джаве и шарпе потому что там нет байтоебства. В ынтерпрайзе важна надежность, в крестах память потечет, время разработки долгое.
1019086
sage #472 #1019082
>>1019080
Это всё демагогия. array[x][y] вполне себе двумерный массив.
#473 #1019083
>>1018927
Когда в дело вступают скобки, проще со стека перейти на дерево. Не прямо сразу вот на AST, но примерно как-то так — тоже строишь дерево операций и потом его обрабатываешь.
#474 #1019086
>>1019081
В джаве память тоже течёт, но поддержка за деньги и интеграция с другими продуктами орлакли решает.
Если нет классических «у нас джава потому, что манагер срубил откат с сейла оракла», «делаем высеры под ведро», «крабую на галере для тырпрайза» — то и жабы нет, проверено.
1019242
sage #475 #1019193
>>1019065

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


Что за сферический JSON в вакууме? Реальные примеры есть?
#476 #1019242
>>1019052

> Там десятилетия говнокода и архитектурной астронавтики.


Доказательств у петушка, конечно, не будет.

> Достаточно сравнить любую программу на Qt и Swing


Проиграл с долбоеба. Свинг имеет такое же отношение к JVM, что и грязь в соседнем лесу к планете Земля. Что свинг, что javafx это действительно говно и любой разработчик на JVM-языках тебе это скажет.

> большинство кода на джаве


Ты не подумол почему. Подумой почему все хуйлоады и инструменты на jvm-языках (сейчас пукнешь, что JVM на крестах написан - никто не отрицает, что кресты ненужны).

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


Разбери это предложение по частям и сделай соответствующие выводы для себя.
>>1019070
В голос. Ты правда думаешь, что в продакшене подгружают на горячую код? Ты ведь не думаешь, что хуйлоад это один большой сервер, который нельзя останавливать? Ты ведь не такой дебил?
>>1019086

> В джаве память тоже течёт


Это уже мантра байтоеба какая-то. Доказательств, конечно, не будет.
1019446
#477 #1019416
Объясните, зачем в Си добавили массивы, если есть указатели?
10194281019674
#478 #1019428
>>1019416
Проиграл.
1019509
#479 #1019446
>>1019242

>все хуйлоады и инструменты на jvm-языках


Я мимокрокодил, мне интересно, о чём конкретно идёт речь? Чего за "хуйлоады" и "инструменты"? Мавен, штоле?
10194771019779
#480 #1019477
>>1019446
Проиграл с ждауна.
#481 #1019509
>>1019428
Если массивы это указатели, то почему в си добавили указатели, если можно было просто массивы.
10195221019524
#482 #1019522
>>1019509
Ты сам понимаешь что несёшь?
1019525
#483 #1019524
>>1019509
Вернее Ритчи мог тайно добавить в язык указатели, чтобы сделать массивы, а в стандарт не добавлять.
#484 #1019525
>>1019522
Что я несу?
1019526
#485 #1019526
>>1019525
У массивов и указатефлей разные задачи.
1019529
#486 #1019529
>>1019526
С помощью указателей можно сделать массив, потому что компилятор разворачивает массив в указатель. Тогда в языке можно было бы оставить что-нибудь одно: либо массивы, либо указатели.
Убрав массивы, мы бы ничего не потеряли, т.к их можно реализовать указателями.
Убрав указатели, мы могли бы заменить их массивами, похуй, что задачи разные, все равно массив развернется в указатель, даже если указателей нет в языке.
1019537
#487 #1019537
>>1019529
Если бы я не понял, что ты нубик, то просрался с тебя по полной.
Напиши интерпретатор brainfuck без массивов.
17 Кб, 627x421
#488 #1019581
Репост из крестового треда
Что за хуйня - почему код в ассемблерной вставке работает, а в цикле while вываливается с исключением - нет прав на чтение (типа лох расчехляй VirtualProtect).
Ах да, inb4 используй (DWORD)GetModuleHandleA(NULL) - нет, мне нужно именно вручную находить image_base, не спрашивайте почему.
1019584
#489 #1019584
>>1019581
(WORD)IMAGE_BASE
не?
1019587
#490 #1019587
>>1019584
Не, у меня же там адрес, а переменная - не указатель. Значит нужно кастануть к указателю, а потом получить значение, находящееся по адресу. А адрес - DWORD.
1019589
#491 #1019589
>>1019587
Ну а значение - WORD.
А так циклиться будет, пока 16..31 биты нулевыми не окажутся по указателю, ведь сравниваешь с 0x00005A4D.
1019592
#492 #1019592
>>1019589
Ето C++, там при компиляции в x86 константы - int. Да и дело даже не в том, что там найтись не может результат, а в том, что при одинаковых командах, написанных по разному, в одном случае всё работает, а в другом - доступ запрещен.
1019598
#493 #1019598
>>1019592
тебе и объясняют, что код не одинаковый: в асме 16-битное сравнение, а в си 32-битное.
открыл бы асм- код на выходе конпелятора да посмотрел бы давно
1019599
#494 #1019599
>>1019598
Погоди, а какая разница? В асме все равно через оператор ptr берется значение, находящееся под адресом, хранящемся в переменной DWORD, а затем кастуется в word. В С - нет каста. Так или иначе, и там и там берется значение по адресу DWORD, и каст к WORD именно в этом моменте ни на что не влияет. Или я не прав?
1019602
#495 #1019602
>>1019599
каст к word обнуляет два старших байта
#496 #1019674
>>1019416
чтобы можно было удобно манипулировать с куском непрерывной памяти, выделенной на стеке или в глобальной памяти посредством индексного доступа
поэтому ритчи и сделал встроенный тип данных "массив"
1019676
#497 #1019676
>>1019674
полезно вообще массивы рассматривать как возможность выделить кусок памяти на стеке или в глобальной области
причем следует также знать что в си нет никаких способов работы с кучей, а malloc/free всего лишь интерфейсы к соответствующим системным вызовам
1019690
#498 #1019690
>>1019676

Скорее всего на windows это врапперы над RtlAllocateHeap/HeapFree. Все это делает CRT.
#499 #1019702
Зачем нужны указатели на указатели и даже о, ужас, указатели на указатели на указатели и дальше по глубине?
1019714
#500 #1019714
>>1019702
Это просто фича языка. Ничего не нужно было делать для поддержки создания указателя на указатель, а вот чтобы запретить - нужно было бы при написании компилятора это запрещать.
#501 #1019779
>>1019446
Ант.
ПЕРЕКАТ # OP #502 #1019936
1019939
#503 #1019939
>>1019936
Еее, два треда.
1019943
# OP #504 #1019943
>>1019939
Да? Ну извиняйте, я просто в раздел не захожу, сижу в полутора тредах.
#505 #1024304
>>992632 (OP)
Вопрос треду, на сколько живой С в современных реалиях , учу этот ЯП и дико доставляет , но сейчас появляется куча "модных" ЯП не вытеснят ли они С?
Тред утонул или удален.
Это копия, сохраненная 20 июля 2017 года.

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

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