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

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

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

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

Что читать:

- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://web.archive.org/web/20160727235220/http://c.learncodethehardway.org/book/ (автор внезапно захотел денег)
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs

Чем конпелировать:

- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.

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

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 помогает читать сложные сишные декларации.

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

- №20: https://arhivach.org/thread/254158/
- №21: https://arhivach.org/thread/260316/
- №22: https://arhivach.org/thread/262491/
- №23: https://arhivach.org/thread/277223/

Шапка: http://piratepad.net/bJ1SdmkZyu
#2 #1055741
>>1055733 (OP)
первыйнах
#3 #1055754
>>1055733 (OP)

>ООП, например...


А что, в С (не С++) завезли ООП?
#4 #1055758
>>1055733 (OP)
Из-за вас я сначала думал, что вертикальный членец в капче это побитовое "ИЛИ"
#5 #1055766
>>1055733 (OP)

>Что читать:


>- Классика от Отцов: http://www.cypress.com/file/56651/download



Access Denied
You don't have permission to access "http://www.cypress.com/file/56651/download" on this server.
#6 #1055768
>>1055766
УМВР
#7 #1055770
>>1055768
Что?
#8 #1055771
>>1055770
Проблемы на вашей стороне
#9 #1055778
>>1055771
Ну нифигасе. Дают линк, доступный только избранным... так предупреждайте, что не для всех.
Хотя бы как книга называется?
#10 #1055780
>>1055754
Не завезли, но можно напердолить структруами и макросами
#11 #1055783
>>1055778
Керниган, Ритчи - "Язык программирования С"
#12 #1055786
>>1055780
Ну это-то понятно. Не помню, а шаблоны в C есть?
#13 #1055787
>>1055786
Нет. Только в С++
#14 #1055788
>>1055783
А если я поучу по книге 80х годов (там классно написано) - смогу откомпилить?
Или современные компиляторы несовместимы со старыми версиями C?
#15 #1055790
>>1055788
Стандарт?
#16 #1055792
>>1055788
Там рассматривается си в стандарте 89 года надо читать второе издание, в первом рассматривается старый си. С89. С тех пор вышло только 2 стандарта - С99 и С11. В принципе любой компилятор будет поддерживать С89, так что проблем не возникнет.
#17 #1055796
>>1055790
Не знаю, книга 1984 года
Язык Си. М.Уэйт, С.Прата, Д.Мартин
#18 #1055799
>>1055796

>С.Прата


Есть шестое издание, там уже рассматривается самый свежий стандарт С11, на торрентах есть.
Называется Язык программирования Си Лекции и упражнения
#19 #1055803
>>1055796
У тебя могут возникнуть некоторые проблемы. Старый синтаксис поддерживается, но категорически не рекомендуется. Почему именно эта книга? Почему нельзя взять прату или к&р из шапки? Ты любишь сложности?
#20 #1055806
>>1055799
Но таких иллюстраций уже нет, и к тому же она бумажная, издана качественно на хорошей бумаге - читать приятно. Прямо влюбился.
#21 #1055828
>>1055803

>Старый синтаксис поддерживается, но категорически не рекомендуется


Можно пример старого синтаксиса, который категорически не рекомендуется?
Строки?
#22 #1055842
Под Виндой на чём компилировать?
Оболочки/IDE есть для удобства тоже под винду?
#23 #1055858
>>1055842
Дополнение: только не VC++, что-нибудь полегче.
#24 #1055865
>>1055828
Ну например:
#include <stdio.h>

foo(bar, baz)
double baz;
{
printf("%d %f\n", bar, baz);
return 12345;
}

main() { return foo(1, 2.3); }

>>1055842
Code::Blocks+MinGW, Pelles C, любой текстовый редактор (Sublime Text, Atom, Notepad++, Блокнот)+MinGW или clang.
#25 #1055877
>>1055865
Спасибо
#26 #1055885
>>1055865
Неявный инт? Не думаю, что это такая уж огромная неприятность.

> return 12345


А так никто со времен Кернигана и Ритчи не делает. Корректно завершившаяся программа должна вернуть ноль.
#27 #1055888
>>1055842
Clion + mingw-64
Либо visual studio
#28 #1055891
>>1055885
Я скорее про пустые скобки вместо (void), про старый синтаксис аргументов, но и про неявный int тоже помнить нужно.

> Корректно завершившаяся программа должна вернуть ноль


А моя некорректно завершилась с кодом ошибки 12345. Я автор, я так вижу.
#29 #1055915
>>1055888

>Clion


говноед
#30 #1055975
Посаны смотрите шо нашел, ахуительно.
https://www.youtube.com/watch?v=3mgGQR6oGxI
#31 #1055976
>>1055975
что это за говно да еще и на обезьяньем языке?
#32 #1055980
>>1055976
Типо симуляция населения. Меня вдохновило.
#33 #1055987
>>1055980

>Меня вдохновило.


на мгогодетность?
#34 #1055997
>>1055987
Нет, а что?
#35 #1056019
>>1055997

>Нет


Ничего хорошего
#36 #1056020
Сап, есть один тип sigset_t, в котором каждому биту соответствует включенный или отключенный сигнал с номером signo.
На пикрил функции для основными действиями с этим типом: sigaddset - добавить сигнал в набор, sigdelset, sigismember - проверить, является ли сигнал членом сета.
Функция sigdelset непонятна. Почему в add нет лишних скобок в правой части, которые есть в del?
Алсо, почему в sigdelset вообще происходит выключение нужного бита, ведь там побитовое И?
И эти операции не должны затронуть остальные биты, а sigdelset занулит же там всё, не?
#37 #1056030
>>1056020

>Функция sigdelset непонятна. Почему в add нет лишних скобок в правой части, которые есть в del?


Имхо, вкусовщина - просто выделили выражение мкобками, хотя я не эксперт в Си
#38 #1056039
>>1056019
Тебе не нравится бездетность?
#39 #1056040
>>1056020

>Пик


Кончил.
#40 #1056041
>>1055975
Усложнённая игра Life?
#41 #1056042
>>1056041
Что может быть сложнее Life? Вот именно, ничего. Плохое сравнение.
#42 #1056043
>>1056039
Неа - это неправильно
#43 #1056044
>>1056042
Сложнее? Ты не в курсе о чем речь.
#44 #1056050
>>1056043
Согласен.
#46 #1056103
>>1056051
Блин, этож надо столько написать. Поверь, там все проще на практике.
#47 #1056116
>>1056103
Ну кому как.
#48 #1056118
Чёт опять делать нехуй.
Написал алгоритм проверки номеров кредиток и заодно самотест к нему (первые 4 и последние 4 цифры взял от реальной карты). Сам не погромист ни разу.

https://pastebin.com/nAZ5mQkb
#49 #1056119
>>1056118
*первые 6 и последние 4
#50 #1056125
>>1056118
си для этого нинужон
#51 #1056193
Как посмотреть во что развернется макрос?
Написано что нужно использовать -E или -E -dM. Но оно ничего подобного не выводит.
#52 #1056216
>>1056193
Всмысле не выводит?
gcc -E in.c -o out.c
Что в out.c? Дай примеров.
#53 #1056222
>>1056216
Через встроенный документ почему то не работает, а с файлом работает.
#54 #1056264
>>1056222

> встроенный документ


Вообще не понял, разве файлом не удобней?
#55 #1056294
>>1056264
Может и удобней, я когда пробовал мне лень было файл создавать.
#56 #1056318
>>1056020
по идее ошибка. забыли ~.
#57 #1056321
точнее если ~(sigset_t)
10 Кб, 745x76
#58 #1056392
>>1056321
Ну, при приведении к sigset_t реализация автора, как я понял, всё в единицы обращает.
#59 #1056393
>>1056392

> при приведении к sigset_t нуля

#60 #1056395
>>1056321
Да, ты прав, там по-любому перед скобками ~, потому и скобки.
#61 #1056429
>>1056395
или даже единицы в обоих местах нужно привести к sigset_t. просто если sizeof(sigset_t) > sizeof(int) то работать не будет.
#62 #1056448
>>1056429
sizeof(sigset_t) = sizeof(int)
Забыл написать.
Там для 31 различных сигналов
#63 #1056476
Зачем вам Си? Лабы в универе писать? Устроиться червем-байтоебом и получать всю жизнь столько, сколько получает жуниор-пхпшник? Дрочить на линупш и писать опен соурсе?
Или есть какие-то годные варианты, которых я не знаю?
Не ради траллинга спрашиваю. Чем занимаются си-пограммисты?
#64 #1056510
>>1056476
Даже C++ не расширенная версия Си. Они эволюционировали по своему и у них свои стандарты. Есть такие вещи которые не существуют в C++, например как массив переменной длины, а так же сложные числа. Но обратно же, такие вещи как объекты, шаблоны, стандартные библиотеки не поддерживаются Си. Можешь почитать об этом на досуге.
Во встроенных системах и системном программировании, Си все еще главный доминирующий язык, потому что ты, обычно не нуждаешься в объектах нежели в обращений к низкоуровневым вещам типа прямого интерфейса оборудования. Более того, у тебя более точные требования по времени и вместительности доступной памяти. Представь как бы ты вместил кучу информации с высокой подачей с помощью объектов С++ в пяти сот байтов микро-контроллера оперативки? Линуксы написаны на C. Другие же языки, даже включая C++, предназначены для других нужд, и в глаза Линукса он - Ужасен.
Большинство людей кстати после выхода Си остались на Ассемблере, боялись уходить от традиций. Несмотря на то, что у Си был намного лучше код.
С++ стал другим языком для других нужд, пусть даже и похожим на Си, но он потерял низкоуровневые способности, типа доступа к процессорному влиянию. Т.е такие языки как Си или Фортран это системные языки.
Да, есть годные варианты, о которых ты не знаешь. Но я намекну, почему он все еще популярен в наше время: Операционные системы, Языковые компиляторы, Ассемблеры, Интерпретаторы, Дата-Базы, Драйвера, Утилиты, Движки игр и списочек продолжается.
#65 #1056516
>>1056476
Я взялся за него, потому что Страуструп сказал в своей книжке, мол, что я обязан знать Си, чтобы изучить C++ и использовать его полную силу. Да конечно не обязательно знать Си, чтобы пользоваться С++, но я подумал, знание еще одного языка это не помеха, а лишь еще одно преуспевание.
#66 #1056528
Анончики помогите дауну.
Задача: при вводе a,b,c выводить "Right", при вводе q завершать программу, при вводе остальных знаков писать "Wrong".
Вот мой код:

#include <stdio.h>

int main (void){
char c;
while (scanf ("%c",&c), c != 'q')
{
if (c >= 'a' && c <= 'c')
printf ("Right \n");
else
printf ("Wrong \n");
}
return 0;
}

Ввожу a получаю :
Right
Wring


Ввожу e получаю :
Wrong
Wring

Где ошибка? Заранее благодарю.
11 Кб, 752x285
#67 #1056553
>>1056528
На вход поступает символ '\n', тебе нужно от него избавиться, например, так:
#68 #1056561
>>1056528
Ему нужно чтобы при каждом неправильно набранном значений об этом намекалось.
Т.е введет adc
Должно выводиться - right wrong right
Если abc - Right Right Right
Если ggg - Wrong wrong wrong
У тебя условие истинно в любом случае, алсо wrong тоже выведется, потому что значение истинно.
#69 #1056563
#70 #1056573
>>1056553
Спасибо
#71 #1056589
>>1056561
Если ввести bac cab bca cba и т.д выводится right
Если ввести abcabc выводятся лишние значения
Если ввести bbb или aaa или ccc выводится - Right
Будут годные советы? Кто нибудь?
#72 #1056596
>>1056448

>Там для 31 различных


ну, int может быть и 16 битным.

либа для какого-то специфичного устройства?
#73 #1056639
>>1056596
Это Linux 2.4.22.
Книга Advanced Programming in the UNIX environment
#74 #1056658
>>1056639
ну да он вряд ли на 16 бит запускаться будет.
#75 #1056663
хотя если бы и запускался, система же сама определяет типы. хотя я не очень понял как это, есть типа какая-то специальная бумажка, которая советует компиляторам делать так, как там написано?

достаточно вспомнить разность int,long на винде64 и лине64.
#76 #1056664
ну или как-то так. ведь они же ещё сами должны как-то компилироваться. ну и наверно для совместимости с библиотеками, с апи.
16 Кб, 406x108
#77 #1056669
>>1056596

>>Там для 31 различных


>ну, int может быть и 16 битным.


Если signet_t, значит это POSIX. Если POSIX, то int не может быть 16-битным. См. http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html
7 Кб, 299x70
#78 #1056673
>>1056669
Олсо
#79 #1056721
>>1056476
Сравнивать программирование с написанием веб-говна на PHP нельзя. Ты бы еще PHP в математикой сравнил. Это разные вещи.

Вчера вот заглядывал в сырцы Python - так там куча .c и .h файлов. Уверен, что и много другого интересного софта написано на C. А чтобы его например пропатчить, нужно C знать. Да и вообще это другое программирование, нежели на скриптоязыках. Ты программированием ради денег занялся или тебе что-то в нём понравилось?
#80 #1056742
>>1056589
Не совсем понял условие, но наговнокодил вот это: https://pastebin.com/yR5RxYTS

Сам начинающий, прошу кому не влом - максимум критики по коду.
#81 #1056830
>>1056669

>Если signet_t, значит это POSIX


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

сложно это всё.
#83 #1056847
>>1056830

>да вроде ничего это не значит


Не нашёл sigset_t в голом C. Значит POSIX.
#84 #1056853
А чего это у вас K&R на английском и второе издание? Вот вам третье на русском
http://www.programming1189.ru/files/Kern_Ritch.pdf
#85 #1056859
>>1056853
Потому что программист должен знать английский, тем более, если он не на сишечке пишет, а не на каком-нибудь jQuery. А что касается третьего издания, то изданий два, а русское "третье" - багфикс для русского перевода второго.
#86 #1056860
>>1056859

>Потому что программист должен знать английский, тем более, если он не на сишечке пишет, а не на каком-нибудь jQuery


такте то комплексы.
#87 #1056862
>>1056860
Очередной типичный для программистов таракан, что поделать.
#88 #1056888
>>1056860
Какие комплексы? Большинства годных статей на русском нет. Либо ты макака, потому что тебе негде учиться, либо ты осознаешь ситуацию и учишь язык. Это не говоря уже об общении с другими программистами и комментариях в коде.
#89 #1056891
>>1056888
у тебя какая-то каша в голове. с чего ты решил, что всем нужно читать годные, что есть только на английском, твоему мнению, статьи, и читать исходники на английском?

какой-то максимализм выпирает. как кто хочет, так пусть и учится. ты лучше свои навыки реализовывай и не выёбуйся.
#90 #1056892
>>1056742

>Counter


Я тоже об этом подумал, но ты тут очень много кода впихнул. Можно создать набор символов - образцов и потом программа по ним делает сравнение, но и у тебя неплохая идея со счетчиком. Т.е псевдокод -
Принять значение
Сравнить с [Переменная]
Все совпадения Right
Вывести
Несовпадения Wrong
Вывести
#91 #1056893
>>1056891
Он прав вообщет. Я специально занялся английским, потому что русский контент сосет жепу, редко найдешь учебное пособие которое переведено как следует. Везде провалы. Да и ресурсы в основном где пишутся полезные статьи, фичи, алсо конференций, В россии кто нибудь C конференций устраивает? Интервью с Брайаном Керниганом, расширенный набор книг по программированию от разных авторов, спецификации вместе с драфтами, да куча всего на английском. И поэтому нужно обязательно знать английский, особенно если ты хочешь чего то добиться. А так если ты программингом занялся ради смехуечков и пиздхаханек то для этого подойдет какой нибудь, ну... Язык для создания приложений для телефончиков?
#92 #1056894
>>1056853
Там перевод пиздец какой корявый. Например:

>Напишите программу, копирующую символы ввода в выходной поток и заменяющую


стоящие подряд пробелы на один пробел.
Т.е спрашивается, какой нахуй выводящий поток? Напиши как в книжке -
Напишите программу копирующая ввод в вывод, заменяя каждую последовательность нескольких пробелов одним.
Все. Сложно?
И так вся книга.
#93 #1056895
>>1056894

>копируящая


Копирующую

фикс
#94 #1056898
>>1056893
всё ясно. с возрастом пройдёт.
#95 #1056899
>>1056898
Куда мне до тебя, мелкобуквенного.
#96 #1056901
>>1056899
ещё одна неполноценность в окружающих. а как как же хорошо что ты выше этого).
#97 #1056902
>>1056898
джвачую, ребенок еще не понимает, что важные вещи даже на англопидерском никто писать не будет
#98 #1056905
>>1056901
Верно.
#99 #1056924
что вы думаете о wxdev c++
#100 #1056928
>>1056888

> Большинства годных статей на русском нет


Знать английский и читать технические (научные) статейки не одно и то же. В студенчестве я регулярно делал доклады по алгебре с англицких книжек. Однако не мог без субтитров смотреть даже мультики для детей-аутистов, а любая неадаптированная книга уже на первой странице содержала сотню незнакомых мне слов.
Для вопросов на стековерфлоу хватает английского уровня гуглопереводчика.
#101 #1056933
>>1056893

>"конференций" два раза подряд


конференции

Сначала русский подучи.
#102 #1056946
>>1056928
Собственно, в этом и смысл. Человека >>1056888 спросили, почему нет русского перевода в шапке? Самый первый пришедший в голову ответ был не "потому что перевод плохой" могу сказать, что он не плохой, а потому что ТЫ ОБЯЗАН ЗНАТЬ АНГЛИЙСКИЙ, ЕСЛИ ТЫ НЕ МАКАКА. Логика прослеживается, конечно, но связь между вопросом и ответом ОЧЕНЬ опосредованная и явно прошла через цепочку когнитивных искажений. Я, если что, хорошо знаю английский, просто мне бомбит с тех, кто делает из него священную корову по поводу и без.
#103 #1056952
Я уже молчу про то, что, действительно, давайте будем честными: нихуя не надо знать английский для программирования. Если вы называете уровень чтения литературы по программированию (обычно сухой и бедной на сложную лексику или, тем более, грамматику, дабы читатель сосредоточился на предмете) или прослушивания лекций ЗНАНИЕМ АНГЛИЙСКОГО, то у меня для вас плохие новости -- это уровень седьмого-девятого класса. А то слюней напускали, ояебу просто.
#104 #1056956
>>1055733 (OP)
Я все книги по программированию читаю на английском. Я даже не смогу те обороты речи и слова по русскому сказать
#105 #1056958
>>1056933
Хуя пичот.
#106 #1056959
>>1056946
Мань да кому ты пиздишь. И да, русский подучи.
>>1056928
Логика уровня двоща.
#107 #1056962
>>1056952

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


Мы приняли твое мнение во внимание На самом деле нет.

>то у меня для вас плохие новости


Всем похуй на твои новости.

>это уровень седьмого-девятого класса.


Так хули ты не выучил то?
#108 #1056963
>>1056956
Всем так интересно.
#109 #1056968
>>1056959
>>1056962

>макакены кидаются какашками


Спасибо за беседу, было интересно, закроем тему.
#110 #1057040
>>1056958
Тебе? Мазь купи в аптеке. И свечки анальные.
#111 #1057041
>>1056946
Надо только профессионалам. Для обычного программирования на русском информации более чем достаточно.
#112 #1057043
>>1056956
Что говорит о твоей убогости, если ты не знаешь терминологии на своем языке.
#113 #1057060
Помогите с организацией хедеров. Дело такое. Скажем есть хедер файл, в нем есть прототипы функций, одна функция возвращает uint8_t, значит, нам надо stdint. Где логично будет подключать stdint ? Если тянуть его до хедера в файле .с то все нормально. Не будет ли тупо, если я засуну его прямо в хеадер ? Или так и надо ? Спасибо.
#114 #1057061
>>1057060
типа того. если ты тянешь в .c его же .h . иначе там и там.
#115 #1057066
>>1057061
Спасибо!
#116 #1057068
>>1056892
Бамп, есть у кого идеи где можно посмотреть решение?
#117 #1057102
>>1057068
Попробуй на киберфоруме найти / спросить.
#118 #1057123
>>1057102
Хорошая идея, спасибо что напомнил бро!
#119 #1057136
>>1057060
Основное правило такое: хедер должен включать свои зависимости. Если в хедере используется uit8_t - подключаешь stdint в хедере. Ну и очевидно, что в парном .c подключать stdint не нужно.
33 Кб, 1440x860
#120 #1057264
Когда вечером нехуй делать.
#121 #1057267
>>1057264
Если что, вся эта простыня говнокода аллокейтит новый argv через анусай, после чего запихивает туда имя обрабатываемой вебсервером в данный момент страницы.
Частично портабельно (на соплярис).
А вот во фряхе вместо всего этого ебалова есть setproctitle()
#122 #1057297
>>1057264
Хуя бог.
#123 #1057301
>>1057264
хукта какаято
#124 #1057372
Можно как-то передать структуру в функцию, без объявления?
Типа:
func(arg, {1,2,3,4});
Ну или хотя бы объявить сразу здесь же? А то чот очень душно как-то получается. Извиняюсь, если проморгал этот момент.
#125 #1057384
>>1057372

>без объявления


>статическая типизация


>под каждый пук выделяется память


Хм...
#127 #1057401
>>1057392
Спасибо.
#128 #1057512
Аноны, вместо русских бук в консоли иероглифы (Р'С?РчР? РїС?РёР?РчС'), в чем может быть проблема?

Включал вот так :
#include <locale.h>
setlocale(LC_ALL, "Rus");
#129 #1057521
>>1057512
в системе: плохая).
#130 #1057537
>>1057512
Поройся в настройках среды, обычно можно кодировку менять. В кодеблокс это edit -> file encoding
#131 #1057541
>>1057537
Какую кодировку выбрать? Сейчас стоит UTF - 8.
#132 #1057546
>>1057541
виндовс же не может в utf-8. может закодируешь в cp1251?
#133 #1057550
>>1057546
Спасибо.
#134 #1057554
>>1057541
Юникод.
#135 #1057806
Ребят, я видел чувак для камеры наблюдения записал массив [256]
Это для чего так? Т.е значение совпадает с кодеком. Как это работает?
#136 #1057898
Какой-то более-менее общепринятый компиляторо/платформо независимый, пусть и не самый быстрый метод для арифметических операций с целыми, как знаковыми, так и беззнаковыми, стандартных 8, 16, 32, 64 разрядностей, позволяющий избежать переполнения вообще существует? Всё что удалось нагуглить - какие-то хаки и костыли , но я не самый способный.
Не очень хочется выдрачивать велосипеды. Подскажите, если кто знает, пожалуйста.
3 Кб, 288x52
#137 #1057917
На околокачественный код потянуло. Как лучше назвать структуру окна (того, что в ОС), сам тип окна в ней и высоту с шириной? Стремлюсь к кратким наименованиям, полные порой выглядят жутко.

Текущая версия не нравится "pw" и обилием "w".
#138 #1057921
>>1057917

>Стремлюсь к кратким наименованиям, полные порой выглядят жутко


Пиздуй читать "Чистый код", говно.
#139 #1057924
>>1057921
Я так не напишу ничего и останусь нищим. Ответь на вопрос, пожалуйста. Хотя спасибо, пролистаю всё таки.
#140 #1057926
>>1057924
Сам спойлер в конце.
#141 #1057927
>>1057926
%%> сам
там
20 Кб, 458x174
#142 #1057929
>>1057921
Да ты охуел! Не согласен с книжкой. Гораздо проще один раз посмотреть на структуры и комментарии к ним, а потом беззатруднительно читать весь остальной, компактный код. Конечно, есть место длинным наименованиям, но это нужно далеко не везде, я думаю. Потому скажи мне как назвать структурку и её элементы.
#143 #1058053
>>1057898
каким образом это может решить компилятор, вставлять ассерт после каждой инструкции?

есть же специальные инструменты.
#144 #1058069
>>1058053
Ну у компилятора-то возможностей куда больше, он может вставить что-то типа jnc, jc, jo, jno - однобайтовая инструкция, выполняется один такт. Жалко только, что стандарт предпочитает неопределённое поведение, видать на ПДП подобной хуйни не было.

>есть же специальные инструменты.


Ты про какие? Те которые проверяют исходный код или которые позволяют работать динамически? Если про последние, то линкани, пожалуйста. Собственно мне нужна функция навроде __builtin_add_overflow из GCC, только что бы по-переносимей.
#145 #1058185
>>1058069
да фиг знает, чёт сам сижу читаю по поводу.
#146 #1058191
но вообще слабо верится в быструю проверку компилятором. ведь есть же всевозможные правила конвертации типов, неявный инт. даже если представить это без оптимизации вообще.

как минимум это что-то должно знать контекст.
#147 #1058195
>>1055733 (OP)
Ананасы, как вы, погромируя всякие железки, определяете оптимальный размер стека? Я вот пишу хуйню на броадкомовском говно-сдк, в котором обычному printf в uart с какого-то хуя нужно 4096 байт стека, постоянно ловлю всё новые и новые stack overflow. Размеры рассчитываю на глаз и включаю заодно runtime-проверки операционки, конечно и заебался уже так делать.
#148 #1058206
например что-то типа
add eax ebx
mov ax (или как там) %куда-то там

и типа это конвертация из инта в чар, по беззнаковому это стандартно, знаковому - нет. как это, например проверять, знаковый вариант? (char)((int)a + (int)b);

по идее же надо будет проверять диапазоны обоих, а потом и результат?

а например такой контекст = (int)a + (uint)b

будим считать за переполнение, когда a < 0 и скастуется к uint ?

тогда нужно проверить a на 0 =< a <= INT_MAX . хотя это вроде стандартное поведение.

просто размышляю. наверно реально, если компилируется без оптимизаций. может флаги есть в гцц?
#149 #1058219
>>1057929
Два чаю, гораздо лучше читаются программы с переменными i, j, k, tmp, array[].
#150 #1058229
>>1058219
мне кажется, что читаемость больше зависит от твоего умения вовремя отделить код в функцию и организовать структуру.
#151 #1058305
>>1057929

> Потому скажи мне как назвать структурку и её элементы.


typedef struct {
GLFWWindow *physicalWindow;
unsigned int width, height;
} Window;
Если не нравится - иди решай свои проблемы - научись печатать более чем одним пальцем, купи себе монитор с разрешением выше 640x480, найди IDE с автодополнением, если ленивый. А в комментариях пиши не расшифровку своей тарабарщины, а полезные вещи.
#152 #1058309
>>1058305

>я так скозал.


ух какой карась.
#153 #1058317
>>1058309
Это не я так сказал, так пишут все нормальные люди. В том числе и те, кто когда-то был ньюфагом и злоупотреблял короткими именами.
#154 #1058322
>>1058305

> купи себе монитор с разрешением выше 640x480


У меня 1024x768! А иды не нужны, ровно как и твойУёбищноеНазваниеПеременныхБлядь. Мне гораздо приятнее читать код состоящий из кратких переменных. Достаточно понимать принцип выбора названий и область под которую погроммист пограммит.
#155 #1058324
>>1058322

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


и код будет прекрасно читаться.

Так, как делаешь ты, на самом деле делают далеко не везде, и раньше я такого вообще не видел, но тут только с дивана могу говорить.
#156 #1058327
>>1058322

> Мне гораздо приятнее читать


Если проект - твой собственный, и кроме тебя его читать никто не будет - пиши, как тебе нравится. Хоть весь юникод на однобуквенные переменные заюзай. Но помни, что если кому-то вдруг придется это читать, он будет крыть тебя матом каждую ебаную секунду.
#157 #1058340
>>1058327

>Хоть весь юникод


нельзя же.

> что если кому-то вдруг придется это читать


да и пусть нахуй идёт.

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

а то пиздец, пиши для себя как хочешь, но не показывай никому, а то тебя материть будут.
#158 #1058350
>>1058340

> нельзя же.


В C99 запилили extended identifiers. Весь юникод, конечно, нельзя, но символов, которые разрешено использовать в идентификаторах - овердохуя.
#159 #1058360
>>1058350
жёстко. я смотрю можно прям в кодах \u1234()
#160 #1058426
https://ideone.com/mOxynh

Помогите удостовериться.
Массиву character[TNOCHAR] присваивается 128 имен
Им присваивается каждому 0
Далее идет пересчет каждого введенного совпавшего символа
++character[c];

Запускается цикл который выводит 128 символов
Тут самое важное
Запускается еще один цикл который сравнивает значение j со значением Попавшихся совпадений character[Любое совпадение в character[c]] и инкрементируется значение j до кол-ва попавшихся character[c] и выводится кол-во символов '*' и символ новой строки после того как совпадения закончатся.
Все верно?
#161 #1058431
>>1058426
У тебя там в ideone чуть ниже есть standard input. Введи туда свои символы и посмотри, что получится. Но хуй знает, описал ты это, конечно, коряво. 128 имен каких-то, совпадения какие-то. Гистограмму оно строит. Все блять.
#162 #1058495
>>1058206
Ну конвертация-то в более узкий тип - совсем простая операция, только границы проверяй. Тот же х86, вроде бы, имеет одтельную инструкцию проверки диапазона.

Кстати же, придётся проверять ещё и деление для случая SIGNED_MIN / (-1), ну а SIGNED_MIN % (-1) по идее аппаратно вылететь должен.

Для типов меньше 64х бит можно привести данные к более широкому, проверить и отсечь если попадают в диапазон. Вот тут https://blog.regehr.org/archives/1139 мужик пишет, что относительно шутсрый метод. Для максимальных же, один пёс придётся выполнять проверки, а для знакового ещё и пилить умножение руками. Ещё можно учесть, что некоторые компиляторы-таки поддерживают безопасные операции, в ряде случаев можно наассемблерить необходимые проверки, и по итогу получить кромешный пиздец из ифдефов. Какая же ебаная хуита, простите.
#163 #1058511
>>1058426
На будущее, чтобы инициализировать все элементы целочисленного массива нулями, достаточно написать массив[вместимость] = {0}
#164 #1058518
Аноны, нужно распарсить .pcap файл размером в 10 мб, на питоне это занимает около 9 секунд(!!!).
Решил реализовать эту часть алгоритма на Си, а конкретней:
1. парсинг pcap файла
2. запись данных в БД постгрес
Если со вторым пунктом ясно всё и нагулится, то насчёт первого не уверен.
Какие будут советы/варианты вообще и по первому пункту в частности?
p.s. думаю моих знаний в Си хватит для этого, более чем.
#165 #1058529
>>1058518
Любишь писать велосипеды?
Я бы скормил pcap сурикате и импортировал получившийся eve.json.
#166 #1058533
>>1058529
Не люблю писать, но время парсинга огорчает.
Если всё будет плохо - смирюсь с тем что есть.
#167 #1058625
>>1058511
Спасибо, я пока на 1 главе, такие тонкости мне мозг сломают нахуй.
#168 #1058725
>>1058625
Чё, вместо цикла = {0} справа приписать тяжело? Я, правда, не уверен, что это достаточно портабл и вообще работает в си, а не в крестах.
#169 #1058732
>>1058725
Это есть в стандарте. Когда ты инициализируешь один из элементов, остальные заполняются нулями. В данном случае инициализируется первый, и слегка непортабл это только когда нулевые указатели хранятся не в виде последовательности нулевых битов. Но я таких ебнутых машин не знаю.
#170 #1058736
>>1058732

> Это есть в стандарте


Не означает, что это портабл
#171 #1058740
>>1058736

> Это есть в стандарте


> Не означает, что это портабл


Означает.
#172 #1058742
>>1058740
В мире фей, где нет старых компиляторов может означать. Но там это может что угодно означать, что пыльца в соцветиях ноздрей хоботов голубых слонов созрела, например. Мир фей же
#173 #1058745
>>1058725
Ну не тяжело, но должно быть понимание базовое, хотя бы почему и когда это делать. Пока как говориться, велосипед поизучаю, а там уже и буду экспериментировать.
#174 #1058746
>>1058742
да ты что-то гонишь браток. это с самой первой версии фишка.
#175 #1058747
>>1058742
В моем мире поддержка хотя бы C89 есть под каждую необходимую мне железку. Если мне вдруг встретится что-то, не поддерживающее C89, я не стану называть это компилятором Си. Это будет компилятор кастомного языка с C-like синтаксисом.
#176 #1058748
>>1058746>>1058747
Если это реально стандарт C89, то приношу письменные извинения за дегазацию в лужу у благородных донов
#177 #1058753
>>1058748
Да, это есть в C89. А я, в свою очередь, прошу прощения за разговоры о непортабельность инициализации указателей - все там нормально инициализируется, вне зависимости от представления в памяти, а описанные выше проблемы возникают при попытке делать обнулять через memset(..., 0, ...).
#178 #1058766
>>1058431
Чувак, я знаю вывод. Программа написана правильно и видимо ты ее не понял, как и контекст вопроса.
#179 #1058874
>>1058426
Про массив сказал, ещё кое-что:
1) Отделяй операторы пробелами от операндов, а ещё ставь пробел справа от знаков типа , или ; -- когда будешь писать вещи хотя бы немного сложнее читаемые, чем двойной счётчик, отсутствие пробелов глаза ибат жоски будет.
2)Маловажная ремарка: каноничноъ в for-цикле пользоваться пост-инкрементом/декрементом, а не пре-. С массивами (т.к. индексация с нуля) удобнее задавать счётчик как for (i = 0; i < zalypa; i++), но во всех остальных случаях читабельность повысится при отсчёте с единицы: for (i = 1; i <= zalypa; i++).
Я так-то тоже вкатывальщик, просто немного подальше закатился, оэлдэфаги, можете обоссать
#180 #1058876
Котаны, можно ли как-нибудь отличать память на стеке и память в куче?
Например, у меня есть структура, несколько полей которой принимают ссылку на область памяти double(звездочка). Есть функция delete_struct, которая проходится по этим полям free().
Можно сделать так, чтобы программа не ломалась из-за попытки очистить память в куче?

Тут с примером чуть понятнее: https://pastebin.com/exxrwWjh
#181 #1058878
>>1058876
щито?
#182 #1058881
>>1058874

> каноничноъ


Труъ эстеты пишут с преинкрементом, потому что у него нет специального поведения в отличие от постинкремента.

>>1058876
Нет, нельзя. К тому же, есть еще вариант статически выделенных данных. Ты, конечно, можешь нагородить платформенно-зависимый костыль (ну там, регион стека детектить, с секцией данных сверяться), но сделай лучше флажок в структуре, не выебывайся.
#183 #1058884
>>1058876
так никто не делает. пишут функции конструктор и деструктор
в твоем коде непонтяная хуита с ошибками.
#184 #1058888
Господа, нужна помощь. Сразу прошу, анон, не пинай нуба, мне всего ровно 18, и я пытаюсь постичь С/Спп.
В общем, не понимаю я логики работы с включениями исходников - все эти заголовочные файлы и прочее. В книжках нашел только общие положения, на всяких хабрах - то же, либо какие-то рецепты для конкретных случаев. Нипанятна.
А теперь суть проблемы. Допустим, есть у меня некий файл first.h. В нем мы определяем константу coeff типа int:

#ifndef FIRST_H_INCLUDED
#define FIRST_H_INCLUDED

const int coeff = 5;

#endif // FIRST_H_INCLUDED

Далее создаем заголовочный файл second.h. В него пихаем определения функции:

#ifndef SECOND_H_INCLUDED
#define SECOND_H_INCLUDED

#include "first.h"

double func(double x);

#endif // SECOND_H_INCLUDED

Функцию определяем в файле second.cpp. В нем "инклудим" second.h и используем константу coeff (наверное и так понятно как должно выглядеть). В мэйне подцепляем second.h и вызываем функцию func. Типа по моим понятиям должно работать. Однако оно выдает ошибку multiple definition of coeff. Как правильно надо включать файлы, чтобы я мог и константой воспользоваться, и чтоб компилилось?
#185 #1058889
>>1058888
Заранее извиняюсь что без разметки, но кода мало, вроде как можно обойтись.
#186 #1058890
>>1058888
Не делай константы через const. Это плохо работает, не всегда нормально оптимизируется и все такое. Делай через #define как люди. Если все же хочешь, чтобы работал твой вариант, у тебя два выхода: сказать, что константа statiс или писать в хедере, что она extern, а реальное определение пихать в один из .c файлов.
#187 #1058891
>>1058890
на самом деле в реальной программе там строка const char*, мой пример искусственный и чисто модельный. А строку можно дефайном вставлять?
Хм. Щас попробовал перенести строчку #include "first.h" из файла "second.h" в файл "second.cpp" и все заработало. Странно это...
#188 #1058892
>>1058891
не ври. все должно работать
#189 #1058895
>>1058891
Ну а отвечал я про примитивные типы вроде double или int. Со строками все зависит от того, зачем тебе строка (дубликаты строк не все компиляторы схлапывают). В общем и целом, лучше делать extern в .h, строку в .c.
#190 #1058897
>>1058895
Дурацкий вопрос, но все же. А что значит extern? И чем отличается от static?
#191 #1058898
>>1058888
const int coeff = 5; это глобальная переменная
ты инклудишь в second.cpp и там это переменная, и в main.cpp и там тоже эта переменная.
ты перенес инклуд, и в main.cpp больше нет объявления этой переменной
#192 #1058899
>>1058898
короче, иди читай как работает конпеляция и линковка в си. это азы, без которых ты ничего не поймешь
#193 #1058900
>>1058897
static ограничивает видимость модулем (объектным файлом, единицей компиляции). Если extern - это определение (definition), то его видно извне, а если это объявление (declaration), то объявление для него может быть в другом модуле.
sage #194 #1058901
>>1058900

> объявление для него может быть в другом модуле


определение
#195 #1058902
>>1058900

>extern - это определение (definition), то его видно извне


extern значит, что переменная определена в каком-то другом cpp-файле или подключаемой библиотеке. тогда во время линковки заместо этой переменной будет подставлен адрес этой другой определенной где-то переменной с таким названием
#196 #1058906
>>1058902
Ощм немного прояснилось, но буду еще разбираться. Аригато гадзаимас, анон.
#197 #1058907
>>1058874
Проиграл. Чувак, программу не я писал, я написал объяснение её работы и спросил - Верно ли я понял? А писал ее профи.
#198 #1058910
Ебашу тут Дейтелов 2009ого года. И чет у меня во второй программе сумма неправильная выходит, подозреваю что-то случилось за 8 лет. объясните что?

#include <stdio.h>

main(void)
{
int integer1, integer2, sum;

printf("Enter first integer\n");
scanf("%d", &integer1);
printf("Enter second integer\n");
scanf("%d", &integer2);
sum = integer1 + integer2;
printf("Sum is %d\n, sum");

return 0;
}
#199 #1058916
>>1058902
так-же нужно отметить, что модификатор extern дефолтный для всех объявлений функций
#200 #1058919
>>1058910
Кавычка не там в последнем принтфе.
#201 #1058926
>>1058919
#define _CRT_SECURE_NO_WARNINGS

А вот это нахуя меня просят писать, чтобы скомпилировать программу?
#202 #1058928
>>1058884

> конструктор и деструктор


Тредом ошибся?
#203 #1058936
>>1058881
Благодарю.
Переделывать не буду, просто на всякий случай все маллоками зафигачу.

>>1058884
С ошибкой, не ошибками. С программе даже комментарий сделан, где именно эта ошибка.
#204 #1058938
>>1058926
Пытаешься байтоёбствовать в visual studio?
#205 #1058953
>>1058938

Оно не хотело выполнять программу, пока я это не написал. Что не так с этим VS?
#206 #1058970
>>1058953

>Что не так с этим VS?


все
#207 #1058972
>>1058907

>писал профи


Чёт непохоже
#208 #1058985
>>1058970
объясните хоть нахуй эта строчка там нужна?
#209 #1059004
>>1058985
Отключает бугурт компилятора студии по поводу использования "небезопасных" функций. Т.е. большинства, где используются указатели в том или ином виде.
Надо понимать, что Visual Studio - это не среда для разработки на Си. Это среда разработки на Managed C++. Да, в плюсах, даже управляемых, есть возможность использования сишного кода, но приходиться попердеть с директивами препроцессора или unmanaged вставками.
Ты просто определись: либо ты пишешь на си, либо не на си. Майкрософтоподелия к си имеют весьма посредственное отношение. Назначение Managed C/C++ только в том, чтобы делать врапперы для нэйтивных библиотек в комовскую оболочоку, с последующим вызовом их из управляемого кода, написанного на любом языке .net семейства. Программы на нём пишут только дэбики уникумы.
#210 #1059013
>>1058972
Ну ты толстить уже начал. Тема не для тебя, забей.
#211 #1059014
>>1059004
Проблема в том, что все остальные IDE выглядят как куски говна, поэтому делаю задания из книжки в VS. Вот как-бы и все. А почему так вышло, что они небезопасные?
#212 #1059018
>>1059013
Давай спустимся с небес идеального кодинга на землю ради ответа на простой вопрос, который мучает меня: почему некоторые люди не ставят пробелы?
#213 #1059023
>>1059014

>А почему так вышло, что они небезопасные?


Потому что Стив Балмер так решил. А вообще тебе нужно почитать про дотнетовский CLR, управляемый/неуправляемый код, всякую хуиту про ООП и отличия указателя от ссылки. Здесь всё же Си обсуждают.

>что все остальные IDE


Может быть местные гуру меня поправят, но Си - это не "эй поцоны, я ДЭВЭЛОПЮ код на макбуке в няшной ИДЭ с дарк интефейсом". Си - это системное программирование, линукс кернел и ымбыдед. Поэтому либо пользуешься специализированными IDE вроде Keil4 или VisualDSP++, которые облегчают процесс разработки говнокода под конкретные платформы. Либо превозмогаешь себя и пишешь код в блокнотике, параллельно постигая make и gcc.
В качестве блокнотика могу посоветовать VS Code, если уж так любишь майкрософтоподелия
#214 #1059065
В gcc возможно задать размер скомпилированного объектного файла? Чтобы был кратным 4-ем, к примеру?
#215 #1059067
>>1059023

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



>Либо превозмогаешь себя и пишешь код в блокнотике, параллельно постигая make и gcc.



Постой, шеф. Я открыл только первую книгу по программированию.
#216 #1059086
>>1059018
Потому что у каждого свой стиль.
#217 #1059100
>>1059004

>Visual Studio - это не среда для разработки на Си. Это среда разработки на Managed C++


Чо? Можно же писать на unmanaged C++, и на С89С95/АМD1 офк. А если прикрутить clang/c2, то еще и С11 будет
#218 #1059101
>>1059023
Есть clion и mingw, почему бы их не использовать?
#219 #1059123
https://pastebin.com/FgXY3SUy
Строчка 34: объясните подробно, пожалуйста, почему так передавать второй аргумент в функцию нельзя? И правильно ли я использую двумерный массив в таком случае вообще? Это задачка на моделирование "черепашьей графики".
23 Кб, 376x450
#220 #1059131
Анончик, можеш подсказать плз написать круговой динамический массив в Си? Я знаю что простой круговой массив пишется через index % size. Но как мне его сделать динамическим?
24 Кб, 600x300
#221 #1059139
>>1059131
С помощью класса
#222 #1059141
>>1059131
realloc?
#223 #1059144
>>1059141
можешь показать в коде? допустим у меня есть массив а[5]. Как мне его увеличить?
sage #224 #1059191
>>1059014

> А почему так вышло, что они небезопасные?


Такими сделали. Когда дизайнилась стандартная библиотека, об уязвимостях еще не думали. И "небезопасность" таких функций не в использовании указателей, как говорят ньюфаги выше, а в отсутствии контроля границ или недостаточной сигнализации о том, что данные в буфер не влезли: например, печально известная gets() пишет данные в буфер, но не позволяет ни указать его максимальную длину, ни сигнализировать о том, что буфер переполнился. А, например, какая-нибудь snprintf, сделанная позже, и, вроде бы, правильно, позволяющая указать максимальный размер буфера, возвращает не количество записанных в буфер символов, а нахуй не нужное количество символов, которое могло бы быть записано в буфер бесконечного размера. При этом, чтобы узнать, что буфера не хватило, тебе нужна явная проверка, а если ты поленишься (очень многие ленятся), то в твоей программе появляются truncation-уязвимости (приходит тебе такой аттачмент в письме foo(многобуков).exe.jpg, пишет такая программа его на диск, делает snprintf(filename, MAX_PATH, "%s/%s", temp_folder, attachment_name), а оно не влезает, обрезается, и на диск летит уже foo(многобуков).exe). И вот Microsoft для решения этой проблемы придумала подмножество _s (safer) функций, которые фэйлятся, если что-то не влезло, и даже пропихнула их в стандарт (Annex K), но оно никем, кроме Microsoft не поддерживается, и там есть проблемы с runtime constraint handlers, и, в общем, почти никто ими не пользуется, кроме самой Microsoft. И ты не пользуйся, но о проблемах стандартной либы помни.
#225 #1059195
>>1059123
commands - одномерный массив, ты не можешь индексировать его дважды. Алсо, несмотря на то, что ты там при инициализации понаставил фигурных скобок, он остался одномерным, и инициализаторы просто записались в него по порядку ([0] = 2, [1] = 5, [2] = 12, [3] = 3...). Сделай либо нормальный двумерный массив commands[COMMANDS][2], либо массив указателей на массивы int, можно с compound literals (С99) примерно так: (int *array[] = { (int[]){ 1 }, (int[]){ 5, 12 }, итд }).
#226 #1059207
>>1055733 (OP)
Почему говорят, что "функция возвращает void", если на самом деле она ничего не возвращает? Как говорить правильно? Что такое на самом деле void? Как он работает?
#227 #1059212
>>1059207
Формально void это даже тип данных. Если это слово стоит перед функций, то значит функция ничего не возвращает. Т.е так и говорить, "функция ничего не возвращает", или возвращает пустоту
#228 #1059234
>>1059131
бамп вопросу
https://ru.wikipedia.org/wiki/Кольцевой_буфер - вот что мне нужно, только чтобы увеличивался/уменьшался при необходимости
#229 #1059249
>>1059234

>увеличивался/уменьшался при необходимости


realloc
#230 #1059259
>>1059195
Почему в Си такие ебаные массивы?
#231 #1059265
>>1059259
Потому что внутрь процессора менеджер кучи как-то не получилось запихать, а Си - достаточно низкоуровневый язык.
#232 #1059296
>>1059259
У неосиляторов вечно что-то виновато.
#233 #1059297
>>1059259
Кроме них самих, конечно.
#234 #1059359
>>1059191

Спасибо, что пояснил.
#235 #1059365
Кто-нибудь подскажет, как по номеру сигнала получить имя?
У меня в массивe *sys_siglist[] в строках забиты описания сигналов, даже имя не вычленить.
А большая часть функций, которые что-то печатают о сигналах (например, strsignal), обращаются именно к нему.
Придётся делать, как в kill сделали (массив структур sys_signame)?
https://github.com/karelzak/util-linux/blob/master/misc-utils/kill.c
Каждый сигнал с ifdef'ом инициализировать, это же мрак.
#236 #1059400
>>1059296
>>1059297
Керниган, залогинься
#237 #1059513
>>1055733 (OP)
А куда пропал оф. тред плюсов?
#238 #1059520
>>1059513
Он на месте.
Куда пропали твои глаза?
#239 #1059605
Анончики, как грамотно переписать вот этот кусок кода? В книге написано что goto для долбаёбов, а как сделать без него не соображу.
Нужно прочитать символ 'a', 'm', 'e', 's' или 'd'. На остальные вывести сообщение об ошибке.
Заранее спасибо.

goto l1;
while (ch != 'a' && ch != 'm' && ch != 'e' && ch != 's' && ch != 'd' ){
printf ("Введите корректный варинт\n('a', 's', 'm', 'd', 'e')\n");
l1:do {
ch = getchar();
}while(!isalpha(ch));
}
#240 #1059611
>>1059605
goto не для долбоебов, но и не для этого случая.
do { ch = getchar(); } while (ch != EOF && ch != 'a' && ch != 'm' и т. д)
if (ch == EOF) { поток ввода кончился } else { нам дали требуемый char }
#241 #1059615
>>1059611
Спасибо ещё раз.
#242 #1059692
Почему не работает?

#include <stdio.h>

int main(void) {

int r, pi, circ;

printf("Radius: \n");
scanf("%d", &r);

printf("Diameter is %d\n", r 2);
pi = 3.14159;
circ = 2
r * pi;
printf("Circumference is %f\n", circ);
}
#243 #1059695
>>1059692

> int pi


В советской россии пи равняется трем, ага.

int - это integer, целое. Не дробь. Дроби хранят в float или double, это типы с плавающей точкой. Можно еще в фикседпоинте, или даже явно в виде числителя/знаменателя, но тебе это пока рано.

Соответственно, double pi (так как десятичная дробь), double circ (так как после умножения дроби на целое ты чаще всего хочешь дробь), и все у тебя будет.

Алсо, лучше сделать pi не переменной, а константой:
#ifndef MATH_PI
#define MATH_PI 3.14159265358979323846
#endif
(или сделать #define _USE_MATH_DEFINES и подключить math.h, оно тебе определит M_PI в числе прочего, но это слегка нестандартная хуйня).
sage #244 #1059698
>>1059695
Ахда, не работает конкретно потому, что в printf ты передаешь int, а спецификатор %f хочет дабл, такие дела.
12 Кб, 775x197
#245 #1059707
>>1059698
Пасиба, брат. Я когда делал просто вписал Пи ручками и все получилось. А еще такой вопрос, вот такие рисунки можно делать только если в каждый новый принт новую строку рисовать, т.е. рисовать все четыре одновременно или можно сделать по отдельности фигуры и проще?
#246 #1059712
>>1059707
Можешь создать массив достаточных размеров, а потом распечатать его:
#define SCREEN_WIDTH 80
#define SCREEN_HEIGHT 24
char screen[SCREEN_HEIGHT+1][SCREEN_WIDTH+1];
// Очищаеш (плюс сразу переводы строк втыкаешь, чтобы быстрее выводить).
for (size_t y = 0; y < SCREEN_HEIGHT; y++) {
for (size_t x = 0; x < SCREEN_WIDTH; x++) {
screen[y][x] = ' ';
}
screen[y][SCREEN_WIDTH] = '\n';
}
screen[SCREEN_HEIGHT][0] = '\0';

// Рисуеш.
screen[10][10] = '*';

// Выводиш.
puts(&screen[0][0]);

Но вообще у тебя задание скорее всего предполагает именно одновременную отрисовку в едином цикле (т.е., в зависимости от Y координаты ты рисуешь звездочки и нужное количество пробелов в текущей строке для каждой фигуры, потом перевод строки, потом следующую строку так же и т. д.). Можешь тоже буфер сделать шириной с фигуру, тогда не придется ебаться с пробелами.
#247 #1059731
>>1059101

> clion


Ну ты и говноед...
#248 #1059736
>>1059731
Единственная годная IDE с поддержкой С11
Что не так?
sage #249 #1059739
>>1059731
говноед - это тот, кто дрочит на инструментарий

в анус себе свои преференции запихай и пиздуй на пары
#250 #1059743
>>1059736
мэйкфайлы то уже поддерживает это говно?
#251 #1059744
>>1059739

>пиздуй на пары


сам пиздуй, джетбрейндрочер
#252 #1059745
>>1059743
Есть cmake
#253 #1059746
>>1059745
цмэйк нинужен
#254 #1059753
>>1059746
Ну тогда соси хуй в блокноте без автокомплита
#255 #1059755
>>1059753

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


забыл синаксис си?
#256 #1059759
>>1059755
Имена функций и переменных будешь полностью ручками писать?
#257 #1059786
>>1059759
да, я их все помню. а если у тебя вызывается 500 штук этого говна, то ты не тру погромист.
#258 #1059835
Дали тестовое задание-тср сервер которые бы кое что делал. Сделал. Ответ-недостаточно точное. Яебу вообще, работало как надо, тестил как мог. Хз
#259 #1059902
66 Кб, 371x378
#260 #1059956
Когда пять минут как вкатился в си и, не желая разбираться в собственном говнокоде, попёрся отвлекать занятых людей.

мимоэксделфибог
#261 #1060001
>>1059956
А где оно глючит-то? Если ты про /n, то да, у тебя кривые руки - escape-последовательности пишутся с бэкслешем: \n.
sage #262 #1060004
>>1059956
При чем здесь Code::Blocks?
#263 #1060005
>>1060004
Он просто не знает еще, что IDE - не компилятор. Его делфя успешно скрывала от него существование dcc.exe.
sage #264 #1060011
>>1059956
Квадратная закрывающая скобка в строке 7...
sage #265 #1060012
>>1060011
Тогда бы не скомпилировалось
#266 #1060072
Разумно ли писать бекенд на си?
#267 #1060073
>>1060072
Бэкенд чего? Веб? Скорее всего, нет.
#268 #1060076
>>1060073
Спс
#269 #1060244
>>1059786
Не, скорее ты простой дурачёк, который никогда не работал со средними/большими проектами, лол
#270 #1060344
Котоны, помогите. Есть код на C, нужно скомпилировать под ARM архитектуру. Как это сделать? Нашел тулчейн arm-linux-gnueabi-gcc, но objdump по объектному файлу выдает архитектуру elf32-little.
#271 #1060346
>>1060344

> elf32-little


А тебе что нужно? Компилируй и не выделывайся.
#272 #1060377
>>1060346
Когда я это запускаю на целевой машине, она мне пишет not found. Поэтому я думаю что как-то не так скомпилировал. И ещё бинарник запускается на x64 убунте, это нормально вообще?
#273 #1060380
>>1060377
А как компилируешь?
#274 #1060427
>>1060380
Arm-Linux-gcc -mamr -o output.bin source.c
8,4 Мб, webm, 854x480, 0:32
С++ помогите #275 #1060435
>>1055733 (OP)
аноны, помогите с кодом, я нихуя не понимаю, как работают глобальные переменные, очень прошу, я заебался, уже всё перепробовал. Я думаю тут мне помогут, не смотря на то, что это кресты всё-таки..

Unit1.h
блаблабла
extern bool HUI;

Unit1.cpp
#include "Unit1.h"
HUI = true;

Unit2.cpp
#include "Unit1.h"
if(HUI == true) { Label1->Caption = "Работает!"; }
else { Label1->Caption = "Соси хуй"; }

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

Умоляю, анон, помоги, как сделать, чтобы переменную видел весь проект и использовать можно было из любого места, прошу, анон, вот тебе ваванджапан в реверсе и негативе авансом.
#276 #1060437
>>1060427
Хуй знает, должно рабоать. Ты бинарник не перепутал?

>>1060435
Все правильно у тебя. Вот только в крестах тоже есть неявный int, когда ты забыл тип:

> Unit1.cpp


> HUI = true


bool HUI = true;
#277 #1060442
>>1060437
спасибо за ответ, анон, но не помогло.
теперь другая проблема, ебучий builder c++ ругается на Unresolved external и в основном проекте, раньше только в пустом ругался, в котором я пытался разобраться в этой проблеме. решения нет, хз пока у кого спросить про эту ошибку. всё равно спасибо
#278 #1060443
Кто-нибудь может объяснить зачем сейчас писать вот так:
int
sum (int a, int b)
Вот это вот функция. Это же 89, верно ? Зачем и кому сейчас это надо ?
#279 #1060448
>>1060344
Должно быть так:
arm-linux-gnueabi-gcc -<args>
#280 #1060464
>>1060443
Ты про int на отдельной строке? Или про что? Возвращаемый тип на отдельную строку лепят в некоторых проектах, где названия возвращаемых типов длинные, плюс еще атрибуты всякие прописываются типа конвенции вызова. Если писать в одну строку, декларацию все равно придется разбивать.
#281 #1060466
>>1060442
Удали все собранные бинарники, собери начисто, покажи как ругается.
#282 #1060484
>>1060442

>ругается на Unresolved external


Небось на какой-нибудь _init, _start и т.п. ругается?
#283 #1060489
>>1060344

>Есть код на C, нужно скомпилировать под ARM архитектуру.


Подробнее, что за платформа, какая ось.
Планшет на андроиде и плата с стм32 - оба подразумевают ARM, но вот компиляция будет разной.
#284 #1060511
>>1060489
Шо ты несешь. Различия только в выборе архитектуры команд (в STM только thumb) и в доступности всяких флоатов. В остальном, компилятор - он и есть компилятор.
#285 #1060528
>>1060464
Блядь. Я думал это формальное описание старого стандарта. Вот я дебил. Ладно. Спасибо!
#286 #1060592
>>1060489
Устройство на базе процессора AT91SAM9260-QU, ось линукс с ядром 2.6.22. Пока пытаюсь просто скомпилировать простейший код, который бы заработал.
#287 #1060593
>>1060484
на _HUI который и является булевой переменной, я просто так и не понял причину этой ошибки в принципе, почему она возникает ВООБЩЕ интересно, а не только у меня, суть ошибки.

>>1060466
а вот это я не пробовал, как буду дома, сделаю. Удалить exe и obj? или еще какие? сделаю вечером и отправлю сюда скрин
#288 #1060598
>>1060592

>Пока пытаюсь просто скомпилировать простейший код, который бы заработал.


Простейший код - это записать единичку в указатель на регистр, управляющий светодиодом. Скидывай сюда код и вывод компилятора.
>>1060511
Устройства под линупсами поддерживают нэйтивную компиляцию. Бэйрметал - кросс онли.

>This specifies the name of the target ARM processor. GCC uses this name to determine what kind of instructions it can emit when generating assembly code. Permissible names are: `arm2', `arm250', `arm3', `arm6', `arm60', `arm600', `arm610', `arm620', `arm7', `arm7m', `arm7d', `arm7dm', `arm7di', `arm7dmi', `arm70', `arm700', `arm700i', `arm710', `arm710c', `arm7100', `arm720', `arm7500', `arm7500fe', `arm7tdmi', `arm7tdmi-s', `arm710t', `arm720t', `arm740t', `strongarm', `strongarm110', `strongarm1100', `strongarm1110', `arm8', `arm810', `arm9', `arm9e', `arm920', `arm920t', `arm922t', `arm946e-s', `arm966e-s', `arm968e-s', `arm926ej-s', `arm940t', `arm9tdmi', `arm10tdmi', `arm1020t', `arm1026ej-s', `arm10e', `arm1020e', `arm1022e', `arm1136j-s', `arm1136jf-s', `mpcore', `mpcorenovfp', `arm1156t2-s', `arm1156t2f-s', `arm1176jz-s', `arm1176jzf-s', `cortex-a5', `cortex-a8', `cortex-a9', `cortex-a15', `cortex-r4', `cortex-r4f', `cortex-m4', `cortex-m3', `cortex-m1', `cortex-m0', `xscale', `iwmmxt', `iwmmxt2', `ep9312'.


И это только один флажок gcc, для выбора архитектуры ARM.
Про всякие хитровыёбанные платы, которые требуют BSP, я уже и не говорю.
49 Кб, 539x568
#289 #1060599
>>1060593

>Удалить exe


>ось линукс с ядром 2.6.22

#290 #1060604
>>1060598
С какими ключами запускать компилятор чтобы чтобы он вывел информацию?
#291 #1060608
>>1060599
всмысле linux? у меня винда же
#292 #1060613
>>1060604
Ошибки компилятор выводит в любом случае. Для варнингов есть -Wall -Wextra
Кстати -Wall - флажок практически мастхэв в любых случаях
>>1060608
Значит кросскомпилятор, да? Где тулчейн качал?
#293 #1060621
>>1060613
у меня c++ builder 6, он работает только под виндой. Я знаю, что я говноед, но так реально проще
#294 #1060622
>>1060613
Первый скрин - компиляция, второй - запуск.
#295 #1060639
>>1060622
давай вывод file test_arm
#298 #1060653
>>1060645
Да, имелся ввиду вывод file на целевой машине, а не виртуалке.
#299 #1060655
>>1060653
На целевой машине нет утилиты file. Там очень урезанный линукс.
>>1060650
Действительно, этой библиотеки нет. Где я ее могу взять и зависит ли она от версии ядра?
#300 #1060660
>>1060655
Попробуй флажок -static для компилятора. У тебя динамический эльф собирается на новой версии ядра, а запустить пытаешься на старой.
#301 #1060664
>>1060660
Скомпилировал с флагом -static, теперь пишет Illegal instruction.
#302 #1060670
>>1060664

>Illegal instruction


Ну даж хз. Попробуй -mcpu=arm9
#303 #1060672
>>1060670
Тоже самое. Пиздец какой-то, я уже неделю с эти ковыряюсь.
#304 #1060675
>>1060672
Что за плата хоть?
#305 #1060681
>>1060675
Частная разработка завода. Плата модуля ЦП в гибком мультиплексоре.
Слушай, file показывает что была использована библиотека ld-linux.so.3, которой на целевой машине нет. Может ее туда подсунуть и тогда все заведется? Только вот суффикс 3 в имени библиотеки что означает? Версию ядра?
#306 #1060715
Не совсем по теме треда, но: поставил десятку вместо восьмерки, код, который писал ранее на OpenCL, пЕрестал нормально работать. Комп зависает при первом выполнении шейдера, если в дебаге запускать, падает на clFinish. Падает только в том случае, когда в шейдере есть синхронизация с barrier - с любыми аргументами. В чем может быть проблема?
#307 #1060722
>>1060681
Подсунул библиотеку. Теперь Input/Output error.
#308 #1060725
>>1060681

>Может ее туда подсунуть и тогда все заведется? Только вот суффикс 3 в имени библиотеки что означает? Версию ядра?


Если ты хочешь взять ld-linux.so.3 со своей виртуалки, и подсунуть под арм платы - мне кажется это не самая разумная идея. Если ты только не найдёшь эту библиотеку собранную под твой арм.

Ты же где-то исходники для ядра линукса брал? Если ты работаешь на этом же заводе - у тебя должны быть сорцы. Ковыряй мэйкфайл, смотри с какими ключами и какой компилятор запускается. Illegal instruction - насколько я помню, означает, что файл система сожрала, но на уровне исполнения произошла ошибка. Может -msoft-float нужно указать, может уточнить -march или -mcpu.

Собирать программу с нового ядра - под старое можно, но если честно, я никогда подобным не занимался. Вангую, что одними опциями компилятора тут не отделаться.
26 Кб, 808x676
#309 #1060731
>>1060725
Да я сам этим никогда не занимался. Работаю в конторе веб-разработчиком, внезапно шеф вспоминает что у нас есть мультиплексор, собранный на заводе в другом городе. А поскольку единственный программист в штате - это я, то и поручили разобраться с этой штукой мне. А я с железками вообще никогда не работал. Исходники ядра есть, мне это мало о чем говорит. Содержимое мейк-файла на пикрил. Все эти ключи я уже пробовал. В линуксе на самой плате нет практически нихера, так что приходится компилировать на убунте в надежде что заведется на этой железке.
#310 #1060733
>>1060731
И что, скомпилированное с -static и -march=arm9tdmi точно также вызывает illegal instruction?
Можно ещё конечно readelfом сравнить то, что успешно исполняется на плате и то, что получается после компиляции у тебя.
21 Кб, 808x676
#311 #1060752
>>1060733
Да, с этими флагами все так же illegal instruction. Вот, например, сравнение моего бинарника и того, что работает на плате.
#312 #1060769
>>1060752
покажи лучше readelf -a обоих файлов
#313 #1060776
>>1060769
Рабочий бинарник: https://pastebin.com/v8rnaMhW
Тестовый бинарник: https://pastebin.com/KStx0FEa
#314 #1060843
>>1055733 (OP)
В чем преимущества и недостатки этого языка по сравнению с другими языками?
#315 #1060862
Пытаюсь написать пирамидальную сортировку, но выходит так, что сортировка пузырькем выходит быстрее.
В чем косяк того, что я написал?

https://pastebin.com/mpD7p1QL
#316 #1060961
Кто-то в курсе, malloc обязана возвращать чётный адрес и можно ли на это положиться?
#317 #1060977
>>1060961
нет, она нуль возвращает, если не смогла выделить память.
#318 #1060999
>>1060961
malloc возвращает адрес, подходящий для любой переменной, поэтому частично можно на это положиться, если на целевой машине переменные размером более 1 байта требуют выравнивания.
На x86 выравнивание не обязательное, но на 8 байт тебя все равно выровняют. В целом, тебе, конечно, никто ничего не гарантирует, но на любой 32-битной машине malloc вернет тебе адрес, который кратен минимум четырем.

>>1060977
0 четный.
#319 #1061007
>>1060999

>0 четный.


на сколько делится?
#320 #1061011
>>1061007
На сколько хочешь, даже на матрицу
#322 #1061017
>>1061013
матаноблядская магия, если 0 делится на все то угодно, почему он четный?
#323 #1061021
>>1061017
Потому что четное число по определению - это число, у которого остаток от деления на 2 равен нулю. Ну или можешь сказать, что это 2 умноженное на любое целое число.
#324 #1061023
>>1061021
На любое натуральное число и пресловутый ноль, по-твоему
#325 #1061042
>>1061017

>если 0 делится на все то угодно, почему он четный?


Потому что он делится на двойку, дебил.
sage #326 #1061046
>>1061023

Троллинг тупостью пошел?
#327 #1061053
>>1061046
Нет, это перавильное замечание. Если ты не француз и не матлогик, натуральные числа ноль не включают.
#328 #1061060
>>1060999

>В целом, тебе, конечно, никто ничего не гарантирует, но на любой 32-битной машине malloc вернет тебе адрес, который кратен минимум четырем.


Благодарю. А что бы наверняка, нет какой-нибудь опции проверить это, типа #ifdef MALLOC_ALIGN_EVEN ?
#329 #1061064
>>1061060
это стандарт выравнивание будет до самого большого типа, которому необходимо выравнивание. или тебе обязательно нужно знать?
#330 #1061075
>>1061060
В С11 можешь узнать alignof(max_align_t). alignof в stdalign.h, max_align_t в stddef.h. До C11 с гарантией никак, но можно смотреть на выравнивание структур (если до проверки на него никто не повлиял директивами или ключами компилятора). В struct test_alignment { char x; double d; }; дабл скорее всего будет выровнен до его натурального выравнивания, поэтому sizeof(struct test_alignment) - sizeof(double) скорее всего даст тебе выравнивание меньшее или равное выравниванию, гарантированному malloc().
sage #331 #1061083
>>1061053

Тогда поезжай во Францию, может хоть там тебе расскажут о существовании отрицательных чисел, из которых, ходят слухи, некоторые даже бывают четными.
#332 #1061100
>>1061083
Прошу прощения, не удосужился прочесть всю переписку. Ты прав.
#333 #1061127
>>1061075
Спасибо, этого должно хватить.
>>1061064
Я ценный бит хотел использовать указателе.
#334 #1061205
>>1060776
Всё это немного выходит за рамки языка Си и ближе к красноглазикам. Продублируй вопрос в /s/ на всякий случай.
А ещё лучше, переконфигурируй glibc под целевое ядро и будет тебе счастье.
#335 #1061269
>>1061205
Разобрался с этой ерундой. Взял с https://www.uclibc.org/ образ root_fs_arm.ext2, примонтировал его, сменил корневой каталог на root_fs_arm.ext2/bin/su используя эмулятор qemu и там бинарник скомпилировался как надо, на целевой плате все работает. Спасибо за помощь. Сам бы я хер разобрался с этим всем.
#336 #1061326
>>1059191

>И "небезопасность" таких функций не в использовании указателей, как говорят ньюфаги выше


Ну извините. Мой кукарек основан на опыте быдлокодинга на C#. В сярпе "небезопасность" - это именно использование поинтеров. https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/unsafe
#337 #1061923
Добрый вечер, господа. Интересует такой вопрос: может ли кто-нибудь из вас написать программу, которая считывает все данные из очереди сообщений POSIX (mqueue)? Чтобы прям вторым аргументом дать ей имя очереди, а на выходе в каком-нибудь файле получить содержимое очереди. Спасибо.
#338 #1061938
Где найти программиста С/С++ который не прочь заняться разработкой ПИРАТСКОГО СЕРВЕРА?
#339 #1062031
Объясните, почему
char str[150] = "abcd";
нормально присваевается, а

char str[150];
str[150] = "abcd";

выдает ошибку.
#340 #1062074
>>1062031
В первом случае ты объявляешь массив чаров, заполняешь первые 4 элемента, остальные заполнятся автоматически нулями.
Во втором ты говоришь, что элемент 150 равен "abcd". Но одному элементу обязана соответствовать 1 символ.
#341 #1062088
>>1062074
А как тогда правильно присвоить "abcd", если массив уже объявлен в виде char str[150];
Мне нужно, чтоб эффект был как в первом случае.
sage #342 #1062089
strcpy, memcpy и прочие функции, которые работают со строками.
#343 #1062116
>>1062088
memcpy
5 Кб, 364x150
#344 #1062214
У меня проблема, аноны. Компилирую под ARM, использую функции mq_open(), mq_send(), mq_recieve() библиотеки librt. При компиляции в конце ставлю флаг -lrt. Однако все равно получаю ошибку "undefined reference to `mq_open'". Посмотрел по пути /lib, там лежат библиотеки librt-0.9.27.so и librt.so.0. Пробовал даже подключать их так -L/lib/librt-0.9.27.so и -L/lib/librt.so.0, все равно не компилируется. Под убунтой компилятором arm-linux-gnuebi-gcc все работает как надо, но он мне не подходит. А в тулчейне с компилятором arm-linuxuclibc-gcc такая херня. Может кто-нибудь помочь с этим?
#345 #1062238
>>1062214
Еще добавлю что если в убунте проверить библиотеку таким образом: "grep -r mq_close librt-0.9.29.so", то ответ будет "Двоичный файл librt-0.9.29.so совпадает". А если сделать то же самое для библиотеки в тулчейне, то ответом будет пустая строка. Будто бы эти функции не реализованы в версии библиотеки librt-0.9.27.so. Я пробовал подменять библиотку в тулчейне с 27 на 29 версию, но компилятор все равно не видит этих функций.
#346 #1062255
>>1062214
С какими ключами компуклируешь? В какой последовательности?
#347 #1062297
Крестотред проебался, можно у вас спросить?
#348 #1062306
>>1062255
arm-linux-uclibc-gcc -march=armv5te -mtune=arm9tdmi -Wall -static -o slotinfo slotinfo.c -lpthread -lrt
#349 #1062315
>>1062306
Попробуй "-lpthread -lrt" писать до "-o"
#350 #1062357
Есть код

int i;
char mass[252];

i=1; mass[0]='z';
scanf ("%c", &mass);
i = 2;
while ( mass[i-1] != '\n' ) {
scanf ("%c", &mass);
i++;
}

printf ("%d\n", strlen(mass));

Почему после введения ab и нажатия enter выдается результат 20 вместо ожидаемого 2?
Не пойму, откуда там аж 18 лишних взялось.
#351 #1062359
>>1062357
Блин, парсер сожрал i в квадратных скобках, где scanf.
#352 #1062364
>>1062359
И если 'z' и '\n' учесть, то 4 всего ожидается.
sage #353 #1062496
>>1062357
\0 в конец строки за тебя кто писать будет?
#354 #1062540
>>1062496
Ясно, теперь заработало как надо.
А автоматически завершающий \0 по какому принципу ставится, раз strlen все-таки срабатывал?
#355 #1062542
>>1062540
strlen срабатывал, потому что mass у тебя в стеке. И рано или поздно среди мусора в стеке встретится нулевой байт.
#356 #1062544
>>1062540
Автоматически, естественно, за тебя \0 никто не поставит (ну кроме случаев, когда у тебя строковый литерал "foo", тогда да, он, как полноценная строка, включает в себя и \0 тоже).
#357 #1062854
>>1062542
Как распределяется этот мусор? Почему-то \0 каждый раз в одном и том же месте встречается, иначе бы 20 каждый раз после введения ab не выдавалось.
#358 #1062967
>>1062854

> Как распределяется этот мусор?


Да ты охуел с такими вопросами. Все, что тебе нужно знать - это undefined behavior, и его нужно избегать, а не искать закономерности. Возьми gdb и посмотри содержимое стека, если уж так интересно.
#359 #1062975
>>1062967

>undefined


Тут больше похоже на undocumented.
sage #360 #1062979
>>1062975

> J.2 Undefined behavior


> The value of an object with automatic storage duration is used while it is


indeterminate

> 6.7.9


> If an object that has automatic storage duration is not initialized explicitly, its value is


indeterminate.
Ты тут новичок, да?
#361 #1063073
>>1055733 (OP)

> Что читать:


> - Классика от Отцов


А почему не Дейтелы?
#362 #1063096
>>1063073

> А почему не Дейтелы?


Дейтелов паста рекомедует из-за того, что это абсолютно энтри-левел
#363 #1063204
>>1062979

>indeterminate


На деле-то оно оказалось в моем случае достаточно детерменированным. Но методом тыка я уже разобрался, от чего зависит стабильное появление \0 в определенном месте мусорной кучи, когда его явно не задали в коде.
#364 #1063352
>>1055787
И нахуя он такой нужен тогда?
#365 #1063370
>>1062315
Если переместить их до -o, то компилятор еще и заголовочный файл <semaphore.h> теряет в довесок к <queue.h>.
#366 #1063384
>>1063370
Нормальный у тебя порядок опций был, не слушай его. А вот -static скорее всего гадит, так как librt, возможно требует динамической линковки.
40 Кб, 848x512
#367 #1063388
В вузе начали С, написали вот это, не работает. Гуглил, но там все ссылки на С++ ведут. Пробовал все кавычки и скобки, писал с .h и без, ничего не помогло. Что делать?
Компилятор CodeBlocks Mingw
#368 #1063389
>>1063384
Хреново если так. Ибо без статика у меня на ARM-машине бинарник вылетает с ошибкой not found. Думаю оно имеет ввиду что не найдена библиотека.
#369 #1063390
>>1063388
Тебе на каком языке то писать надо?
если С, то про cout, cin забудь, в С есть только printf,
Если C++, то #include <iostream>
#370 #1063393
>>1063390
Препод в вузе дал эти операторы, и в методичке его они есть, охуеть.
Спасибо, сам теперь удивляюсь своей тупости.
#371 #1063395
Собираюсь на нем писать под микроконтроллеры, есть специализированные материалы про это? И какие подводные?
#372 #1063412
>>1063395
Arduino
#373 #1063476
#374 #1063518
>>1063395
Сейчас в России мейнстрим - STM32, у них ко всему прочему очень удобные отладочные платы с встроенным отладчиком. Полно семинаров/вебинаров от производителя, материалы все выложены. Здесь http://www2.hitex.com/download-isg неплохие мурзилки. Также постарайся не подсесть на ломаный софт типа IAR и Keil.
#375 #1063574
>>1063518
Такое дело, я в беларуси, и записался в лабораторию в универе, а там avr, хотелось бы узнать интересно ли это
#376 #1063589
Как в С создать копию массива т.е. скопировать массив array1 в переменную array2 без регистрации и СМС?
#377 #1063590
>>1063589
memcpy
#378 #1063623
>>1063589
int array1[] = {1, 2, 3};
int* array2 = array1;

не благодари
38 Кб, 780x531
#380 #1063645
Всё равно нихуя не заработало, решил переписать на С++, теперь ему не нравится n.
Что здесь не так? В гугле по ошибке всё на английском и тема не та.
sage #381 #1063648
>>1063645
Тебе даже номера строк указали, где ты облажался. Поставь себе линукс и гцц, там сообщения на русском специально для дебилов, не желающих учить английский. Закрывать открытые фигурные скобки за тебя кто будет? А n(<15) - это что за заклинание?
#382 #1063649
>>1063648
Б-же, сам уже ору. Я ведь смотрел в упор на эту строку и всё равно не видел ничего
#383 #1063653
>>1063388

> iostream


Ты тредом ошибся.
#384 #1063658
>>1063653

>iostream.h


Он еще и годом ошибся.
#385 #1063687
>>1063658

>Он еще и годом ошибся.


Скорее веком.
#386 #1063703
>>1063352
С этим то аноном все ясно, похапе фрилансер 300к/сек и ничего, что про стек впервые слышит, но у меня вот реально проблема. Пишу на си, начинаю скучать по шаблонам и всякому ООП, тяне к плюсам. Начинаю писать на плюсах, охуеваю от этих блядских шаблонов и всякого ООП, тянет назад к сям. Пишу на чем-то другом - хочется вернуться к сям. Это как-то лечится?
#387 #1063705
>>1055788
Не надо так делать. Читай Кернигана и Ритчи. Базарю.
sage #388 #1063706
>>1063703
Лечится по мере накопления опыта.
#389 #1063740
>>1063703
Хуя какой я богачь, аж завидно :(
Ладно ООП, С из другого мира, но шаблоны...
даже generic macro добавили, чтобы шаблоны не добавлять
#390 #1063741
>>1063703
Это тебе в Rust
#391 #1063775
Почаны, компуклирую под мипс на гцц. Readelf показывает, что в скомплированном объекте куча разных секций и символов.
Стандартные секции типа bss, rodata, text и data - с ними всё ясно. Но где можно почитать про остальные секции, которые генерируются компилятором/линковщиком? Все эти reginfo, sbss, MIPS.abiflags, pdr и так далее?
#392 #1064116
>>1063741
Да, кстати, подумываю вкатиться. По описанию дюже пиздато, если у них получилось сделать, как обещали, буду им обмазываться, пока не охуею.

>>1063706
Бля, буду ждать.

>>1063740
Нужны шаблоны, пиши на плюсах. Или вкатывайся в магию препроцессора.
#393 #1064117
>>1063775
Думаю, большая часть в дукоментации компилятора/линковщика, как ни странно.
#394 #1064124
Крестовые классы действительно удобны? Я люблю Си и не люблю кресты из-за тотальной усложнённости. Но если классы полезны, то, думаю, можно перейти на кресты беря от них только классы.

Игорю пишу. Оно того стоит?
#395 #1064125
>>1064124

> Игорю пишу. Оно того стоит?


Да, имеет некоторый смысл. Всякие коллекции (особенно с шаблонами) не придется переизобретать по сто раз на дню, перегруженные операторы сделают математику гораздо более читаемой, а виртуальные методы и наследование действительно нужны в играх (да, на сишке тоже можно, но на сишке и прыгать вокруг этого всего нужно больше). А вот переходить только ради того, чтобы использовать ключевое слово class и методы вместо ключевого слова struct и функций с явным this в сишечке - не стоит.
#396 #1064205
>>1064117
Как ни странно, но нихуя.
Всё таки нашёл, что искал. Вся эта хуита описана в SYSTEM V APPLICATION BINARY INTERFACE для семейства MIPS.
Оставлю для потомков ссылку, вдруг кто-нибудь тоже искать будет.
http://math-atlas.sourceforge.net/devel/assembly/mipsabi32.pdf
#397 #1064873
Ребятки, как научится правильно собирать программы вместе с большими библиотеками , например ffmpeg, в каких книжках это подробно объясняется для сопляков???
#398 #1064882
>>1064873
О сборке и установке принято писать в файлах README и INSTALL, которые прилагаются к исходникам конкретного софта.
#399 #1064884
>>1064882
Поподробнее плиз. Ну есть тут например описание, и что дальше то делать , как например собирать со своим проектом, как это дело линковать, как создать .so библиотеку из этого всего с помощью gcc

https://github.com/FFmpeg/FFmpeg/blob/master/INSTALL.md
#400 #1064891
>>1064884
Тогда тебе надо для начала пройти школьный курс информатики.
#401 #1064894
>>1064873
Мне кажется, тебе нужен cmake. В каждой папке проекта ты создаешь конфиг, в котором описываешь действия над локальными файлами и связи с другими частями проекта. Например тебе нужно собрать экзешник, так ты перечисляешь исходники, указываешь расположение хедеров и подпроектов, в которых собираются библиотеки, прописываешь инструкции по установке (что и куда скопировать после сборки). cmake на основании дерева таких конфигов генерит множество более низгоуровневых конфигов, например тех же Makefile, но не обязательно.

autoconf (configure), упомянутый в ffmpeg похож, но ебанутее

Туториалов по cmake полно, но документация написана очень специфически, нужно время чтобы привыкнуть, без примеров очень сложно.
#402 #1064897
>>1064884
Вот есть бесплатная книга http://www.stolyarov.info/books/programming_intro/vol2
Начиная с 441 страницы рассказываются основы сборки программ.
#403 #1064991
Почему такой код:
https://pastebin.com/petDuZbE
Печатает мне пустую строку, а
https://pastebin.com/tumWJ9ZS
этот корректно заменяет все 'c' на 'b'?
#404 #1064995
>>1064991
У тебя здесь s = '\0'; первое же вхождение "с" заменяется на нуль-терминатор. printf выводит всё говно до первого символа '\0', а он у тебя получается на в самом начале.
Замени "ccabc" на "bbabc" и он тебе выведет "bbab".
45 Кб, 300x300
#405 #1065210
itoa
offsetof
int size = snprintf(NULL, 0, format, ...);
char* buffer = malloc(size);
sprintf(buffer, format, ...);

ЖМУ ПИНУС!!!!
ШВАБОДКА, ПЕТУХИ!!!
#406 #1065290
Есть ли здесь сишники, которым платят за разработку софта на этом языке без необходимости обмазываться крестами/жабой/шарпом/питоном?
#407 #1065400
Пишу свой переключатель потоков под x86. Какие регистры принадлежат контексту и требуют сохранения?

switch_threads:
push eax
push ecx
push edx
push ebx
push ebp
#408 #1065407
>>1065400
Ты тредом не ошибся?

> Какие регистры принадлежат контексту и требуют сохранения?


Очевидно, что все, которые доступны для записи. pushad, pushfd, стейт FPU/SSE тоже, отладочные, сегментные регистры тоже имеет смысл сохранять.

>>1065290

> без необходимости обмазываться крестами/жабой/шарпом/питоном


А что, в 2017 существуют такие программисты, которые пишут на каком угодно языке, но только на нем одном?
#409 #1065467
>>1065407

>А что, в 2017 существуют такие программисты, которые пишут на каком угодно языке, но только на нем одном?


Мой вопрос исключил лишь определенные языки, а не вообще все кроме си.
#410 #1066364
Написал тест переполнения стека процессора: https://ideone.com/ok6m10
В ideone код не работает, в Dev-C++ запускается, вызывает сигнал SIGSEGV, т.е. насколько я понимаю, признает стек переполненным и затыкается.
Проблема в том, что по ТЗ тест должен выдать результат - например, число итераций, которое вызывалась рекурсивная функция или подсчитанный объем стека в байтах. То есть, после переполнения программа должна продолжаться. Отсутствие эксепшенов в Си слегка вгоняет меня в ступор. Как продолжить работу программы при переполнении?

Была мысль с помощью malloc оценивать свободное пространство, и если malloc возвращает null, сворачивать рекурсию, но такое не заработало.

Вообще такая задача вызывает у меня массу вопросов, например, есть ли смысл проведения подобного теста. Логика тут вообще такая: функция вызывается рекурсивно и на каждой итерации N создается 3N переменных. Отсюда сразу еще и такой вопрос: надо ли очищать через free память на каждой итерации?

Надеюсь, кто-нибудь поможет.
#411 #1066368
>>1066364

>запускать сишный код в браузерном интерпретаторе идеоне.


наркоман
#412 #1066392
>>1066364

> переполнения стека процессора


В процессоре нет стека.

> тест


Хуевый тест. Это все очень сильно зависит от ОС.

> То есть, после переполнения программа должна продолжаться.


Ты слегка охуел. После подобных ошибок программа должна тихо сдохнуть. Тем более после сегфолта. Но ты можешь попробовать, во-первых, сделать свой counter volatile, во-вторых, установить обработчик SIGSEGV с помощью signal (signal.h) и всю работу делать в обработчике. Но гарантий не будет никаких. В-третьих, можешь подумать о setjmp/longjmp для возврата из обработчика сигнала в main. Это не по стандарту, но в целом работает.

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

> Была мысль с помощью malloc оценивать свободное пространство


В винде, например, есть лимит на размер стека. Т.е., свободной памяти еще гигабайты, а у тебя стек оверфлоу.
#413 #1067485
>>1065407
Многие системщики. Хотя сейчас железо позволяет портировать кресты дохуя куда, потому как правило, пишут только самые низкоуровневые вещи, потом портируют компилятор цэ2плюса и далее пишут на плюсах. Более того, тут Rust завезли, который, по слухам, пиздат до невозможности, умеет почти что в сборщик мусора, но без рантаймов (все полезности делает компилятор) и еще всякие плюшки. Думаю, если все действительно так радужно, скоро начнут писать низкоуровщину на нем. Тащемто, он для этого и проектировался, чтобы писать не на сях там, где можно писать только на сях и ассемблере.
#414 #1067486
>>1067485
Это вот сюда >>1065290
#415 #1068706
https://pastebin.com/tH3jt3p1
Почему после ввода любой буквы начинается бесконечный цикл с default? Ведь буквы же в Си имеют и числовое представление. После ввода любой цифры больше трёх default нормально срабатывает, мне нужно, чтоб и с буквами также было.
#416 #1068719
>>1068706

> Почему после ввода любой буквы начинается бесконечный цикл


Платина.
1) Потому что буквы не подходят под формат %d.
2) Потому что ты не проверяешь возвращаемое значение scanf.
3) Потому что в input при вводе буквы ничего не присваивается, там мусор.
4) Потому что после ввода буквы ты не очищаешь поток ввода, и там по-прежнему остается буква.

> Ведь буквы же в Си имеют и числовое представление


Если %с скажешь, будет у тебя числовое представление буквы, но тогда и конвертировать цифры из строки в число для тебя никто не будет.
#417 #1068744
>>1068719

>3) Потому что в input при вводе буквы ничего не присваивается, там мусор.


>4) Потому что после ввода буквы ты не очищаешь поток ввода, и там по-прежнему остается буква.



Тогда почему вместо мусора в бесконечном цикле отображается последняя введённая цифра, если в коде перед scanf в цикле поставить printf("%d\n",input);, затем после запуска ввести цифру, а потом букву?
#418 #1068762
>>1068744
Потому что цифра подходит и присваивается, а буква не присваивается, и значение input сохраняется. Посмотри, сколько тебе scanf возвращает.
#419 #1069112
>>1068762
Если после ввода буквы scanf ничего не присваивает переменной input, тогда оставшаяся часть цикла должна сработать как при предыдущем значении input. Что мешает-то?
#420 #1071103
Программа должна считать кол-во строк, но не работает (взята из Кернигана и Ритчи). Компилирую gcc. Почему так?
#421 #1071140
>>1071103
Разобрался.
#422 #1071578
>>1071103
>>1071140
Держи в курсе.
#423 #1071641
Анон, где полную документацию изменений в С11 поискать? Из основных тезисов ничего не сказано про константы и присваивания

int a, b, m, n, z;
m = n = 5;
z = a = b = 0;
z--, ( a = b ) = z + ( m != n );
printf ("%d %d %d %d %d\n",
a, b, m, n, z);
MingW последний с c11 стандартом пропускает это, C99 выдает ошибку на =(без скобок считает)

Или еще

int x;
x = 5; ++ x =10;
printf ("%d\n", x);

C11 меняет константу(я еще не проверял в дебагере), ну он точно выдает 10, C99 не пропускает эту ошибку.
#424 #1071760
>>1071641
Оба твоих примера не скомпилируются. Оператору = нужно lvalue слева, поэтому никаких инкрементов, никаких скобок туда втыкать нельзя. И, конечно же, ничего в C11 по этому поводу не менялось, и в дальнейшем тоже не изменится. Подозреваю, что ты, как и многие итт, перепутал Си с крестами. В крестах так можно.
#425 #1071769
>>1071103
Каля или свеженькая убунта?
#426 #1071798
>>1071769
Скорее дефолтный Debian.
78 Кб, 792x1023
#427 #1071874
>>1063703
Слушай я сам вкатился в Сишку после 10 лет опыта в С++, но по шаблонам скучал только первые пару месяцев и недоумевал почему их не добавили в стандарт, а потом понял почему и решил что правильно сделали не дай бог им там появиться.
Ну ты и сам поймешь потом, просто для примера возьми и сравни исходники какого-нибудь крупного С проекта, типа ядра линукс или гцц, и сравни их с каким нибудь проектом на С++, ты охуеешь насколько С++ уебищный и непонятный язык по сравнению с СИ, во многом ( если не в основном ) благодаря шаблонам.
Как сказал один мимохуй где-то в интернетах: Если ты за 2 минуты чтения хедера не понял полностью как это все работает, то можешь смело выбрасывать такой код в помойку. И это правильно сказано, хочу заметить.

Вообще, советую забыть вообще, что такое С++ и что ты когда-то что-то писал на нем, когда будешь вкатываться в СИ. Это абсолютно разные языки, несмотря на то, что типа С++ продолжение СИ, это не так, С++ это издевательство и глумление над СИ, его проектировали больные люди, возьми к примеру хотя бы создателя STL, ну а чтоб полностью убедиться в этом открой исходники Boost.

Я вот уже где-то год, пишу в основном на СИ, после тех бездарно потраченых 10 лет на С++. И до сих пор переодически нахожу вещи введеные в самых первых стандартах, куда более продуманными и логичными по сравнению с последними высерами в стандартах С и С++.
Я даже не использую С11, потому что там нету ничего полезного, ну может кроме stdatomic.h которые спокойно заменяются GNU built-ins в GCC и Clang ( и мб Intel ) ( а другие компилеры и не нужны ).
Даже посмотри на комментарии в стиле С++ даже они уебищны сами по себе, превращая код в кашу их каких-то пометок, будто на туалетном листе и сравни блочные комментарии ANSI C, которые предназначены для подробного описания кода цельными блоками в основном в хедерах над фунциями и структурами данных, а не пометками посреди кода, которые только ухудшают его читаемость.
Еще т.к я бывший плюсовик, то естественно привык объявлять переменные по ходу надобности, прямо по среди кода. Недавно осознал что, отцы K&R все-таки не просто так это сделали и не из-за каких-то там ограничений или чего-то подобного, а потом типа появился спаситель С++ и разрешил хуярить все в перемешку, потом отупевшие от этого люди в стандарте добавили это в ISO С99.
А теперь поясню почему разделение кода и данных это хорошо:
Во-первых, это СУЩЕСТВЕННО повышает читаемость кода.
Во-вторых, это не дает тебе лепить большие толстые функции > ~100 строк, ведь чем больше функция тем больше в ней задействованно переменных, и тем труднее за ними уследить в одной области видимости, в купе с обработкой ошибок через goto.
Как говорится в linux kernel code style guide - Functions should be short and sweet, and do just one thing.
..
if you have a complex function, and you suspect that a less-than-gifted first-year high-school student might not even understand what the function is all about, you should adhere to the maximum limits all the more closely. Use helper functions with descriptive names (you can ask the compiler to in-line them if you think it’s performance-critical, and it will probably do a better job of it than you would have done).

Another measure of the function is the number of local variables. They shouldn’t exceed 5-10, or you’re doing something wrong. Re-think the function, and split it into smaller pieces. A human brain can generally easily keep track of about 7 different things, anything more and it gets confused. You know you’re brilliant, but maybe you’d like to understand what you did 2 weeks from now.
...

Вот эти золотые слова, должны быть основой любого code style любого проекта.
А если этих правил предерживаться, то Mixed declarations and code абсолютно не нужен, и должен быть отключен в компиляторе через -Werror=declaration-after-statement, если используется стандарт поддерживающий это.

В общем, можно еще долго дискутировать на тему, чем СИ лучше С++ и не зря все серьезные проекты пишутся на СИ, а не С++. Со временем ты поймешь все эти истины и вообще больше не захочешь видеть С++ никогда в жизни, если уж что-то надо быстро и просто накалякать что-то на коленке, то лучше взять более приспособленные языки типа явы или C#, а не С++.
78 Кб, 792x1023
#427 #1071874
>>1063703
Слушай я сам вкатился в Сишку после 10 лет опыта в С++, но по шаблонам скучал только первые пару месяцев и недоумевал почему их не добавили в стандарт, а потом понял почему и решил что правильно сделали не дай бог им там появиться.
Ну ты и сам поймешь потом, просто для примера возьми и сравни исходники какого-нибудь крупного С проекта, типа ядра линукс или гцц, и сравни их с каким нибудь проектом на С++, ты охуеешь насколько С++ уебищный и непонятный язык по сравнению с СИ, во многом ( если не в основном ) благодаря шаблонам.
Как сказал один мимохуй где-то в интернетах: Если ты за 2 минуты чтения хедера не понял полностью как это все работает, то можешь смело выбрасывать такой код в помойку. И это правильно сказано, хочу заметить.

Вообще, советую забыть вообще, что такое С++ и что ты когда-то что-то писал на нем, когда будешь вкатываться в СИ. Это абсолютно разные языки, несмотря на то, что типа С++ продолжение СИ, это не так, С++ это издевательство и глумление над СИ, его проектировали больные люди, возьми к примеру хотя бы создателя STL, ну а чтоб полностью убедиться в этом открой исходники Boost.

Я вот уже где-то год, пишу в основном на СИ, после тех бездарно потраченых 10 лет на С++. И до сих пор переодически нахожу вещи введеные в самых первых стандартах, куда более продуманными и логичными по сравнению с последними высерами в стандартах С и С++.
Я даже не использую С11, потому что там нету ничего полезного, ну может кроме stdatomic.h которые спокойно заменяются GNU built-ins в GCC и Clang ( и мб Intel ) ( а другие компилеры и не нужны ).
Даже посмотри на комментарии в стиле С++ даже они уебищны сами по себе, превращая код в кашу их каких-то пометок, будто на туалетном листе и сравни блочные комментарии ANSI C, которые предназначены для подробного описания кода цельными блоками в основном в хедерах над фунциями и структурами данных, а не пометками посреди кода, которые только ухудшают его читаемость.
Еще т.к я бывший плюсовик, то естественно привык объявлять переменные по ходу надобности, прямо по среди кода. Недавно осознал что, отцы K&R все-таки не просто так это сделали и не из-за каких-то там ограничений или чего-то подобного, а потом типа появился спаситель С++ и разрешил хуярить все в перемешку, потом отупевшие от этого люди в стандарте добавили это в ISO С99.
А теперь поясню почему разделение кода и данных это хорошо:
Во-первых, это СУЩЕСТВЕННО повышает читаемость кода.
Во-вторых, это не дает тебе лепить большие толстые функции > ~100 строк, ведь чем больше функция тем больше в ней задействованно переменных, и тем труднее за ними уследить в одной области видимости, в купе с обработкой ошибок через goto.
Как говорится в linux kernel code style guide - Functions should be short and sweet, and do just one thing.
..
if you have a complex function, and you suspect that a less-than-gifted first-year high-school student might not even understand what the function is all about, you should adhere to the maximum limits all the more closely. Use helper functions with descriptive names (you can ask the compiler to in-line them if you think it’s performance-critical, and it will probably do a better job of it than you would have done).

Another measure of the function is the number of local variables. They shouldn’t exceed 5-10, or you’re doing something wrong. Re-think the function, and split it into smaller pieces. A human brain can generally easily keep track of about 7 different things, anything more and it gets confused. You know you’re brilliant, but maybe you’d like to understand what you did 2 weeks from now.
...

Вот эти золотые слова, должны быть основой любого code style любого проекта.
А если этих правил предерживаться, то Mixed declarations and code абсолютно не нужен, и должен быть отключен в компиляторе через -Werror=declaration-after-statement, если используется стандарт поддерживающий это.

В общем, можно еще долго дискутировать на тему, чем СИ лучше С++ и не зря все серьезные проекты пишутся на СИ, а не С++. Со временем ты поймешь все эти истины и вообще больше не захочешь видеть С++ никогда в жизни, если уж что-то надо быстро и просто накалякать что-то на коленке, то лучше взять более приспособленные языки типа явы или C#, а не С++.
sage #428 #1071883
>>1071874

> А теперь поясню почему разделение кода и данных это хорошо:


> Во-первых, это СУЩЕСТВЕННО повышает читаемость кода.


Долго держался, но все же проиграл с поехавшего.
#429 #1071947
>>1071883
Мне тоже показалось, что что-то неладно, но если там и правда

>5-7 автоматическиъ переменных на фукнкцию


то лучше их объявить в начале, и правда
#430 #1071953
>>1071874

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


Как по мне если ты чего то не понимаешь, скорее всего ты тупой.
#431 #1071955
>>1071874
Знатно просрался с этой пидорашки
#432 #1071984
>>1071947
Нет, конечно тебе будет казаться это неудобным после того как везде пихают уже mixed declarations.
Но поверь опыту действительно лучших программистов в мире - разработчиков ядра линукс, в которые входят люди из разных топовых компаний типа гугла, интела, амазона и т.д с топовыми образованиями. Они то просто так не станут придерживаться такому code style, который отточен и проверен годами.
Почитай исходники линукс, все функции там действительно маленькие, и с ходу понятные.
Тем более, в си и с++ разные методики освобождения ресурсов, если в с++ используют RAII, шаред поинтеры и т.п. когда можно не парясь сделать return посреди функции или бросить исключение и ресурсы автоматически очистятся, то в си так сделать нельзя, в си ошибки обрабатываются обычно через goto на секции с освобождением ресурсов и представь как легко ошибиться, если у тебя в коде каша из переменных. А если у тебя код разбит на маленькие функции по несколько переменных, то начиная читать код ты сразу видишь какие ресурсы у тебя в функции есть и легко проверить все ли ресурсы были освобождены по выходу из нее.
Если ты бы когда нибудь писал на ассемблере, то понимал бы как легко ошибиться даже с памятью на стеке.
В общем, си это тебе не хуйня для обезьян типа крестовиков и всех остальных чернорабочих.
С++, как и другие ООП языки не требует особой подготовки, поэтому на них выгодно делать проекты в коммерческих компаниях, где можно как можно с меньшими затратами заменить Васю на Петю, порог вхождения низкий.

>>1071953
Вынужден тебя разочаровать, это далеко не всегда так.
Как я уже цитировал выше, Линуса:

>if you have a complex function, and you suspect that a less-than-gifted first-year high-school student might not even understand what the function is all about



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

Я за 10 лет работы С++ прогером, успел навидаться такого говнокода, что приходилось иногда по нескольку часов разбираться, что там куда и откуда эти шаблоны и классы ведут. Ведь многие прогеры на с++, часто вообще полностью пренебрегают чистотой кода, и хуярят лиш бы работало. А чо? Язык позволяет и похуй.

Я считаю, единственный возможный вариант использования С++ это СИ с классами либо какие-то вариации MISRA С++, Где запрещены STL, шаблоны, исключения, виртуальные функции, и т.п и тем более полностью запрещен С++11.

Но если ты рядовой быдлокодер, не заморачивайся и ебаш как попало с шаред поинтерами и т.п. А лучше вообще возьми пыху или JS там с каким-нибудь electron'ом и вообще все будет в шоколаде.
#432 #1071984
>>1071947
Нет, конечно тебе будет казаться это неудобным после того как везде пихают уже mixed declarations.
Но поверь опыту действительно лучших программистов в мире - разработчиков ядра линукс, в которые входят люди из разных топовых компаний типа гугла, интела, амазона и т.д с топовыми образованиями. Они то просто так не станут придерживаться такому code style, который отточен и проверен годами.
Почитай исходники линукс, все функции там действительно маленькие, и с ходу понятные.
Тем более, в си и с++ разные методики освобождения ресурсов, если в с++ используют RAII, шаред поинтеры и т.п. когда можно не парясь сделать return посреди функции или бросить исключение и ресурсы автоматически очистятся, то в си так сделать нельзя, в си ошибки обрабатываются обычно через goto на секции с освобождением ресурсов и представь как легко ошибиться, если у тебя в коде каша из переменных. А если у тебя код разбит на маленькие функции по несколько переменных, то начиная читать код ты сразу видишь какие ресурсы у тебя в функции есть и легко проверить все ли ресурсы были освобождены по выходу из нее.
Если ты бы когда нибудь писал на ассемблере, то понимал бы как легко ошибиться даже с памятью на стеке.
В общем, си это тебе не хуйня для обезьян типа крестовиков и всех остальных чернорабочих.
С++, как и другие ООП языки не требует особой подготовки, поэтому на них выгодно делать проекты в коммерческих компаниях, где можно как можно с меньшими затратами заменить Васю на Петю, порог вхождения низкий.

>>1071953
Вынужден тебя разочаровать, это далеко не всегда так.
Как я уже цитировал выше, Линуса:

>if you have a complex function, and you suspect that a less-than-gifted first-year high-school student might not even understand what the function is all about



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

Я за 10 лет работы С++ прогером, успел навидаться такого говнокода, что приходилось иногда по нескольку часов разбираться, что там куда и откуда эти шаблоны и классы ведут. Ведь многие прогеры на с++, часто вообще полностью пренебрегают чистотой кода, и хуярят лиш бы работало. А чо? Язык позволяет и похуй.

Я считаю, единственный возможный вариант использования С++ это СИ с классами либо какие-то вариации MISRA С++, Где запрещены STL, шаблоны, исключения, виртуальные функции, и т.п и тем более полностью запрещен С++11.

Но если ты рядовой быдлокодер, не заморачивайся и ебаш как попало с шаред поинтерами и т.п. А лучше вообще возьми пыху или JS там с каким-нибудь electron'ом и вообще все будет в шоколаде.
#433 #1071987
>>1071984
Не не не, я не сомневаюсь что есть случаи когда говнокод - это говнокод. С этим ничего не поделаешь. Но заявление про 2 минуты - это уже как-то попахивает максимализмом. Да и вообще это таоке, мол мне лень разбираться в коде, лучше сам напишу всё заново. В итоге вместо 1 говнокода в конторе теперь 2.
#434 #1072029
>>1071874

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


... - сказал человек, ни разу не открывавший исходники STDlib.

>его проектировали больные люди


Почти все программисты отчасти больные люди. Плюсы проектировали, пытаясь сохранить совместимость с C, и благодаря этому язык получил развитие. Было ли это компромиссом по сравнению с чьим-то идеалом? Да.

>Со временем ты поймешь все эти истины


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

>отцы K&R все-таки не просто так это сделали и не из-за каких-то там ограничений или чего-то подобного, а потом типа появился спаситель С++ и разрешил хуярить все в перемешку, потом отупевшие от этого люди в стандарте добавили это в ISO С99.


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

>А теперь поясню почему разделение кода и данных это хорошо:


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

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


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

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


>А теперь поясню почему разделение кода и данных это хорошо:


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

>пометками посреди кода, которые только ухудшают его читаемость.


>Еще т.к я бывший плюсовик, то естественно привык объявлять переменные по ходу надобности, прямо по среди кода.


Жирными мазками эпатируешь, блядь.
#434 #1072029
>>1071874

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


... - сказал человек, ни разу не открывавший исходники STDlib.

>его проектировали больные люди


Почти все программисты отчасти больные люди. Плюсы проектировали, пытаясь сохранить совместимость с C, и благодаря этому язык получил развитие. Было ли это компромиссом по сравнению с чьим-то идеалом? Да.

>Со временем ты поймешь все эти истины


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

>отцы K&R все-таки не просто так это сделали и не из-за каких-то там ограничений или чего-то подобного, а потом типа появился спаситель С++ и разрешил хуярить все в перемешку, потом отупевшие от этого люди в стандарте добавили это в ISO С99.


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

>А теперь поясню почему разделение кода и данных это хорошо:


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

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


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

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


>А теперь поясню почему разделение кода и данных это хорошо:


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

>пометками посреди кода, которые только ухудшают его читаемость.


>Еще т.к я бывший плюсовик, то естественно привык объявлять переменные по ходу надобности, прямо по среди кода.


Жирными мазками эпатируешь, блядь.
#435 #1072040
>>1071874

>Слушай я сам вкатился в Сишку после 10 лет опыта в С++


Собственно дальше можно было не читать.
#436 #1072042
>>1072029

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


Ебать говноед.
Дальше не читал.
Если ты хочешь определять функции в функции, то тебе точно не в семейство языков СИ.
#437 #1072043
>>1072042
Все функции должны лежать в единицах трансляции кучей и не быть никак связаны, так нам завещали авторы первой версии стандарта. Аминь!
#438 #1072055
>>1072042
Ты не чувствуешь, что ты сопротивляешься природе, объявляя локальные переменные вместо глобальных?
#439 #1072057
>>1071987
Он преувеличил про 2 минуты, но наша задача не допустить "ну если не тупые поймут" принципов. Мы всегда хотим по максимуму упростить код.
#440 #1072060
>>1072043

>лежать в единицах трансляции кучей и не быть никак связаны


Не особо понял, что ты имел ввиду.
У функций есть разный linkage - external и internal.
Что тебе мешает связать функции из разных единиц трансляции?
#441 #1072067
>>1071874
Чот толсто

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


10 лет опыта, и в коде не разбираться, да даже если это говнокод, то это всё прекрасно разбирается.
#442 #1072102
Сап, программач.

Возникла необходимость кроссплатформенно (на уровне исходного кода) создавать окно и получать его идентификатор (пикрелейтед 1). Делать это было решено с помощью GLFW, однако тут я внезапно столкнулся с некой проблемой - линковкой.
Для компиляции пользуюсь gcc из набора MinGW (пикрелейтед 2). Путь к библиотекам прописал, сами библиотеки он тоже видит (если, например, ошибиться в названии, то начинает ругаться на не найденную билиотеку), но при этом выбрасывает "undefined reference" на вызов любой функции из GLFW.
Исходный код - пикрелейтед 3.

Спаси, анон, как эту ебанину фиксить?
#443 #1072134
>>1072060

>Что тебе мешает связать функции из разных единиц трансляции?


Конкретно мне мешает то, что в плюсах есть гораздо более удобный способ классифицирования функций и вложения их. Да, действительно, можно компенсировать отсутствие неймспейсов, классов и лямбд бОльшим количеством файлов с кодом, но ЗАЧЕМ?
#444 #1072196
>>1072134
Че ты там компенсировать собрался я не понял.
Ебани лучше на пхп че нить, там вообще можно ХТМЛ сразу в код вставлять, прикинь охуеть да?
#445 #1072204
>>1072102

>#include "GLFW/glfw3.h"


>#include "stdio.h"


Ты что ебанутый?
#446 #1072210
>>1072196
У тебя все переменные глобальные? Вот прикинь, точно так же не все функции должны быть глобальные.
#447 #1072213
>>1072210
Че за хуйню несет? Пиздец.
Иди учи матчасть. Функции у него не линкуются, перменные глобальные везде, функции глобальные. Ебануться ты про какой вообще язык говоришь?
#448 #1072214
>>1072204
Ну не стукай, я не сишник. Что не так?
#449 #1072230
>>1072213

>Функции у него не линкуются


Сам придумал, сам посмеялся?

>функции глобальные


В C есть "неглобальные" функции?

>перменные глобальные везде


Это вообще-от вопрос был. Судя по тому, как ты отказываешься на него отвечать, переменные у тебя неглобальные. Теперь объясни мне, почему переменные не должны быть глобальными, а функции должны.

И вообще вырази свою точку зрения лучше, чем "дальше не читал".
#450 #1072237
>>1072230

> В C есть "неглобальные" функции?


Я не он, но предположу, что статические в некотором роде неглобальны, так что инкапсулировать можно с помощью статика.
#451 #1072238
>>1072230

>В C есть "неглобальные" функции?


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

В С есть все, что необходимо для построения самых сложнейших систем. Если даже на чистом ассемблере пишут полноценные ОС типа калибри и минует, то о чем вообще речь?

Я не собираюсь тебе тут расписывать все детали построения программ на С, потому что в инете полно материала об этом и это не описать в двух словах. Нужно понимать как вообще работает все на низшем уровне от структуры бинарника, до модификаторов видимости символов в С.
Если ты не хочешь в этом разбираться, тогда С не для тебя. С это довольно низкоуровневый язык, который требует глубокого понимания предметной области, чтобы на нем писать, что-то сложнее хелоу вордов.
#452 #1072246
>>1072238
Ты уже и меня заебал своей тупостью. В си вообще нет ни глобальных функций, ни переменных, иди почитай стандарт. Но при этом мы все тут понимаем, что имеет в виду анон выше. Торчит ли при этом у тебя фунция голым задом из модуля не имеет никакого значения.
#453 #1072251
>>1072238
Ты не туда воюешь. Си я более-менее знаю и пердолить статики, указатели, маллоки, битшифты, препроцессор, рекурсивные макроопределения, хвостовую рекурсию и прочее я умею.

>Ну ты наверняка не слышал даже о линковке символов в С


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

>Понятие не имеешь о модульности


В плюсах то же самое. Испугал ежа голой жопой.

>о заголовочных файлах, о юнитах компиляции, о модификаторе static


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

>о формате ELF, о его секциях, о том что представляет собой бинарный файл и как система его читает.


К языку С не относится касательно, к стандарту языка С - никак. Нужно будет знать что-то о формате ELF или WinPE - открою спецификацию и прочту, это святыня какая-то?

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


Тебе для построения сложнейших систем необходимы только кнопки 0/1 и бумага с ручкой.

>Если даже на чистом ассемблере пишут полноценные ОС типа калибри и минует, то о чем вообще речь?


Это ты мне скажи, о чём ты ведёшь речь. Я задал дискусионный вопрос автору высера, ты из всего моего линного поста выделил именно его.
#454 #1072292
>>1072246

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


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

>>1072251

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


Блять, поясни пожалуйста тогда что ты понимаешь под локальный и глобальной переменной, потмоу что по моему у тебя об этом не правильное представление.
Алсо, ты можешь сделать перменную локальной в пределах юнита компиляции, ты можешь сделать переменную локальной в пределах области видимости функции, цикла, условия и вообще любого блока видимости.
#455 #1072311
>>1072292

>Я вообще не понимаю, что вы тут хотите мне доказать?


Лично я сюда зашёл для того, чтобы привнести рациональность в пост 10летнего крестовика.
>>1072292

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


Локальное - это то, что определено в структе или компаунд стейтменте. В стандарте вообще не используются слова global (только в одном месте: http://port70.net/~nsz/c/c99/n1256.html#F.8.1p1) и local, так что по отношению к стандарту неправильным моё представление быть не может.

>Алсо, ты можешь сделать перменную локальной в пределах юнита компиляции


Здесь наши с тобой опыты расходятся. В моём опыте никто и никогда не говорил о невидимых извне переменных, как о локальных. В качестве пруфа моей нормальности прими ссылку на стаковерфлоу:
https://stackoverflow.com/search?q=[c]+local+variable
#456 #1072358
>>1072311

>Локальное - это то, что определено в структе или компаунд стейтменте. В стандарте вообще не используются слова global (только в одном месте: http://port70.net/~nsz/c/c99/n1256.html#F.8.1p1) и local, так что по отношению к стандарту неправильным моё представление быть не может.


>>1072292

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



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

Я не понимаю, как по твоему должно было быть?

По моему, все очень логично.
extern - глобальная переменная.
static - локальная в пределах компиляции.
auto - локальная на стеке.
__thread - локальная в пределах треда.

Тебе этого мало? Я просто даже не представляю, какие виды локальных переменных еще могут быть По моему опыту в различныъ ЯП кроме С/С++, типа Явы, С#, D, питон, перл, луа, пхп, яваскрипт, хаскель, математика, матлаб. Нигде виды переменных особо не отличаются, ибо это то, что есть в С, это уже более чем достаточно.
#457 #1072400
>>1072358

>Тебе этого мало?


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

>Нигде виды переменных особо не отличаются


Бред сивой кобылы. Ты говоришь о видимости? Видимость переменных может:
1) вообще не зависеть от места их определения, а лишь от того, было выполнено определение или нет - Perl (с версии 5 скоуп управляет только хранением, а не видимостью), Шелл до какой-то версии (в баше можно приписать local. В Посиксе этого нет)
2) зависеть от скопа (функция, глобальный, суперглобальный), от static (значение совсем другое) и от того, было ли выполнено определение - PHP
3) зависеть от того, было ли объявление выше в скопе (без учёта вложенности блоков), при этом у каждой функции свой скоп - Джаваскрипт
4) версия Си - скоп на каждую фигурную скобку
5) чистая функциональщина
И это я ещё про единицы трансляции не говорил: в PHP вообще нет доступа к переменным извне и нет способа определения одной переменной на всех. Что значит "не отличаются"?

>Я не понимаю, как по твоему должно было быть?


По-моему должно быть так, что если есть несколько функций, которые работают с одними и теми же данными, то у меня должен быть инструмент для их обобщения. Такой инструмент у меня есть.

>extern - глобальная переменная.


Допустим, что я понял твою криво выраженную мысль. Дай ссылку на текст, в котором под глобальностью подразумевается именно это.
#458 #1072417
Простой вопрос. Как вывести значение из двумерного массива указателей "int ✬✬arr;". По-простому "arr[num][num]" сигфолтит. Это у меня проблемы или так делать в сишке нельзя?
#459 #1072424
>>1072417

> сигфолтит


Туда ли ты обратился, петушок?
#460 #1072432
>>1072400

>Бред сивой кобылы. Ты говоришь о видимости? Видимость переменных может:


Ладно может с пхп и яваскрип я что-то напутал ибо последний раз писал на этом еще в школе.
Но говоря про С только видимость определяет тип переменной. Т.к в С нету объектов, а есть только базовые типы и структуры состоящие из них, то есть переменные при выходе из их области определения не нужно очищать, вызывать деструкторы и т.п ( кроме переменных на стеке, где память указываемая ими, может быть перезаписана после выхода из области видимости в силу специфики работы стека ).
Но ты понимаешь, что С это низкоуровневый язык где предоставляющий тебе самому управление памятью, а в других языках, инициализация и деинициализация переменных может влечь за собой аллокейты из кучи и другие действия, типа сборки мусора и т.п?
В С как в ассемблере, хочешь глобальную переменную, определяй ее в секции .data, хочешь локальную переменную вычитай сколько нужно из rsp, хочешь динамическую память, дергай ядро ОС.

>По-моему должно быть так, что если есть несколько функций, которые работают с одними и теми же данными, то у меня должен быть инструмент для их обобщения.


Ну так и что, тебе мешает такой инструмент реализовать без глобальных переменных? Используй контекстный метод, передавай структуру в эти функции в качестве аргумента.
Я сейчас работаю над одним достаточно крупным проектом на С, и у меня там нет ни одной переменной определенной за пределами функции.
Вообщ,е использовать глобальные переменные не очень хорошая идея, в любом языке программирования.
Глобальные переменные - это костыли для использования не очень хорошо спроектированных интерфейсов, которые не позволяют передать свой контекст во внутрь.

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


У тебя своей головы нету, чтобы без чужого мнения это самостоятельно понять?
Ты когда объявляешь переменную в глобальном неймспейсе, она по умолчанию extern.
#461 #1072434
>>1072424
А что не так?
#462 #1072440
>>1072417
Проблемы у тебя. Показывай код.
#463 #1072441
>>1072417

>По-простому "arr[num][num]" сигфолтит.


Это вылет за границы массива.
#464 #1072458
>>1072417

>двумерного массива указателей "int ✬✬arr;"


Это называется "двумерный динамический массив", если тебе так хочется.
#465 #1072459
>>1072417
А ты массив-то вообще инициализируешь?
#466 #1072476
>>1072432
Хватит уже про Си рассказывать, я без тебя знаю его и до фига всего другого, и про экстерн я тоже знаю. Даже если ты очень знающий и скиластый, ты должен с собеседником говорить, а не сам с собой и своими мыслями.

>У тебя своей головы нету, чтобы без чужого мнения это самостоятельно понять?


Ты так и не открыл ссылку, по которой находится список вопросов и ответов о языке C, в которых люди употребляют слова "local" и "variable". Попробуй прочитать эти упоминания, держа в уме твоё личное определение глобальности. Пока ты этого не сделаешь, говорить с тобой не о чем.

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


Какие ещё глобальные переменные, блядь? Ты совсем охуел? Прочти ещё раз цитату >>1072042 из моей портянки, которую ты осуждаешь, слова "переменная" там нет. И это, если ты не знал, в С++ (языке семейства С++) с 11 года есть лямбды, подмножество которых совместимо с C-функциями.
#467 #1072480
>>1072476
Я вообще не понимаю, чего вы тут обсуждаете. Вложенные функции есть в гцц в виде расширения. Лямбды, видимо, будут в C2x.
#468 #1072497
>>1072480
Обсуждаем термин "глобальная переменная", который во всём мире означает "определённый вне функций", а именно у этого почтенного индивида означает "external linkage".
Заодно практикуюсь в общении с людьми, которые учат меня, разговаривая сами с собой.
#469 #1072530
>>1072476
>>1072497

>"глобальная переменная" означает "external linkage".


Ну так и есть.
Определи ее вне функции в *.c файле со static она будет локальной на уровне юнита компиляции не будет доступна из вне, что как раз и означает локальность.
Как этого можно не понимать...
#470 #1072546
>>1072530
У тебя котик дома живёт?
#471 #1072562
>>1072546
Собака. Я же не пидор.
#472 #1072612
>>1055733 (OP)
шарю лютейшую годноту от реально гения в плане разъяснениыя. Да, он ебанный индус, да блядь его произношение это пиздос, но блядь, как же он ахуенно разъясняет и объясняет то, что вы будете читать в 1к страничных книгах.

https://www.youtube.com/watch?v=si-KFFOW2gw&list=PLVlQHNRLflP8IGz6OXwlV_lgHgc72aXlh

После этого рекомендую пробежатся уже по King C.C. A modern Approach C (2008), что бы закрепить материал.

Потом советую пройтись по C in Nutshell, для более продвинутого закрепления и понимания сишечки.

Потом советую прочитать: Reese R. - Understanding and Using C Pointers - 2013

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

Потом обязательно Practical C Programming 3rd Edition

И Ben Klemens - 21st Century C, 2nd Edition - 2014

Ну и к этому моменту вы будете свободно плавать в синтаксисе и понимании языка для выражения всего чего можно, вот тут и начинается само программирование, и погружение в программирование и написание годноты и чего только захотите:
Principles of Data Structures Using C

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

Но до этого ОБЯЗАТЕЛЬНО загуглите нормальные туториалы по дебагингу, профайлингу, поиску и нахождению ошибок и так далее.

Ну а дальше уже дело практики - писать нужно дохуя и много.

=======================

Теперь что касается шапки - шапку писал отбитый нахуй долбоеб.

К&R крайне критикуемая книга, которую книгой назвать нельзя, она нахуй вообще ни на что не годится, это некий референс документ, а для референса всегда есть Prinz P., Kirch-Prinz U. - C Pocket Reference - 2002

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

Ну а дальше винапи, и прочий скам, можете на С++ перекатиться, можете продолжить дрочитьСи.

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

Не можете понять что такое Binary Heap - вы нахуй не нужны в программировании.

===============

касательно мотивации - к сожалению с Си без вовлечения в какой-то проект где он используется будет крайне тяжело если сравнивать например с C#

Потому что либ практически нет (вернее они есть, но не для простых инетересных и понятных вещей) плюс будете 90% времени не писать код, и фиксить баги и чужие краши. Поэтому программированию особого не научитесь.

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

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

Это как получившего только что школьника права и категорию Б, посадить за штурвал истребителя, и показать - как взлетать, и сказать "Ну ты там в воздухе разберешься", так не бывает.

Удачи зайчики.
#472 #1072612
>>1055733 (OP)
шарю лютейшую годноту от реально гения в плане разъяснениыя. Да, он ебанный индус, да блядь его произношение это пиздос, но блядь, как же он ахуенно разъясняет и объясняет то, что вы будете читать в 1к страничных книгах.

https://www.youtube.com/watch?v=si-KFFOW2gw&list=PLVlQHNRLflP8IGz6OXwlV_lgHgc72aXlh

После этого рекомендую пробежатся уже по King C.C. A modern Approach C (2008), что бы закрепить материал.

Потом советую пройтись по C in Nutshell, для более продвинутого закрепления и понимания сишечки.

Потом советую прочитать: Reese R. - Understanding and Using C Pointers - 2013

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

Потом обязательно Practical C Programming 3rd Edition

И Ben Klemens - 21st Century C, 2nd Edition - 2014

Ну и к этому моменту вы будете свободно плавать в синтаксисе и понимании языка для выражения всего чего можно, вот тут и начинается само программирование, и погружение в программирование и написание годноты и чего только захотите:
Principles of Data Structures Using C

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

Но до этого ОБЯЗАТЕЛЬНО загуглите нормальные туториалы по дебагингу, профайлингу, поиску и нахождению ошибок и так далее.

Ну а дальше уже дело практики - писать нужно дохуя и много.

=======================

Теперь что касается шапки - шапку писал отбитый нахуй долбоеб.

К&R крайне критикуемая книга, которую книгой назвать нельзя, она нахуй вообще ни на что не годится, это некий референс документ, а для референса всегда есть Prinz P., Kirch-Prinz U. - C Pocket Reference - 2002

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

Ну а дальше винапи, и прочий скам, можете на С++ перекатиться, можете продолжить дрочитьСи.

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

Не можете понять что такое Binary Heap - вы нахуй не нужны в программировании.

===============

касательно мотивации - к сожалению с Си без вовлечения в какой-то проект где он используется будет крайне тяжело если сравнивать например с C#

Потому что либ практически нет (вернее они есть, но не для простых инетересных и понятных вещей) плюс будете 90% времени не писать код, и фиксить баги и чужие краши. Поэтому программированию особого не научитесь.

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

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

Это как получившего только что школьника права и категорию Б, посадить за штурвал истребителя, и показать - как взлетать, и сказать "Ну ты там в воздухе разберешься", так не бывает.

Удачи зайчики.
#473 #1072613
>>1072612
КАМПЬЮТАРР ЛАНГВИСС
#474 #1072619
>>1072613
да я тоже проигрываю постоянно. Но согласись, все по делу, и с дельными примерами, ничего вообще лишнего и нет задач "а давайте посчитаем на нашем первом занятии факториал такого-то числа, либо единицы измерений математической формулой поизменяем.
#475 #1072622
>>1072562
А у меня котик.
#476 #1072623
>>1072102
Бамп вопросу. Использование конкретно GLFW вообще необязательно, сойдёт любая легковесная кроссплатформенная библиотека, которая сможет создать мне окно и дать его идентификатор.
#477 #1072627
>>1072562
Вообще то у меня котик.
Спит щас клубочком, так мило...)
#478 #1072654
>>1072612
Бред неосилятора.
#479 #1072671
>>1072612
Сейчас бы учить что-то с видосиков
#480 #1073287
>>1071874
согласен, хоть и звучит это весьма жирно.

>>1072497
мастерски доебался.

>>1072134

>бОльшим количеством файлов с кодом, но ЗАЧЕМ?



вот это я не понял, плюсовики не делят программы на модули?
#481 #1073294
>>1073287
Ты сам жирный.
#482 #1073775
Бля, помогите пожалста с однородными массивами
https://ideone.com/MNI6wN
Прога должна считать сумму всех отрицательных чисел, произведение между максимальным и минимальным значением и затем сортировать по возрастанию. Сумму и сортировку делает, а произведение делает, но не так - добавляет в вычисление либо максимальное, либо минимальное значение, смотря какое первее стоит. Что не так в коде? И как сделать так, чтоб если между максимальным и минимальным нет чисел, писало что-нибудь типа "произведение = 0"?
#483 #1073779
>>1073775

> *imin=i;


Не делай так. i не инициализирована.

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


Очевидно, что тебе нужно начинать цикл не с frirst, а с first + 1.

> И как сделать так, чтоб если между максимальным и минимальным нет чисел, писало что-нибудь типа "произведение = 0"?


if (first + 1 >= end) { return 0; } (естественно, swap перед этим по необходимости).
#484 #1073797
>>1073779
Братан, закину денежку тебе если ты мне это в код вставишь
53 Кб, 600x450
#485 #1074247
думаю сейчас о такой вещи, как... например, есть приложения и есть их менеджер, всё вместе работает на одном потоке - менеджер переключает выполнение когда приложения или выходят из своего main(), или вызывают специальную функцию - для каждого делаем setjmp() и заранее отделяем стек, типа по 1К, например - ну понятно, после прыжка же стек будет смещён назад. наверно как-то нужно самому хранить верхушку стека - не очень пока вижу всю историю в целом.

в общем, будет работать?
#486 #1074250
так-то резервный вариант использовать треды, но это тупо, только из за стека тянуть всю эту чепуху.

а блин, не понятно ещё как сколько принты стека отжирают. а без них как-то скучно.
#487 #1074256
или ещё вариант, при переключении копировать значения стека в динамичную память. но это как-то жёстко. может как-то подменять его, при первом вызове.

как-то же это всё люди делают.
#488 #1074777
в общем да, нужно знать верхушку стека, иначе всё по пизде пойдёт. но блин, какое же говно.

https://stackoverflow.com/questions/20059673/print-out-value-of-stack-pointer

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

а что если, вызывая новое приложение, прыгать к самому последнему и из его кода делать call....
#489 #1074785
ну это тоже, не используя стек внутри функций (строго память) и не вызывая их. фигня короче.

просто я вот думаю, как сделать удобней возврат после запроса в обработчик. ну вот, допустим он вызывает опять приложение app0(void p) - где *p для значений этого инстанса. и как вот туда ему прыгать, к контексту внутри? switch ? гццшный goto массив? я не знаю.

наверно действительно проще треды. может у этого название есть, типа блокирующиеся треды в одном потоке. хер знает.
#490 #1074803
>>1074785

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


В нормальных ОС это есть искаропки. Называется фиберы, реализуют кооперативную многозадачность. И да, чем тебе не нравится ебля контекста ручками? Это единственный адекватный подход. И вообще, чего ты добиться хочешь и зачем? И ты заебал своим бложеком, иди-ка ты в /dr/. Или пиши нормально.
#491 #1074806
>>1074803

> типичный пассивно-агрессивный пидоран


я не удивлён. в прочем, я ничего расписывать не буду, чисто попукал в мёртвый тред.
#492 #1074809
вообще я смотрю это позиксная ucontext.h мне нужна. но интересно было бы запердолить как-то вручную. и не понятно откуда берётся слово то фибр, если везде пишут про курутинс.

>>1074803
ладно-ладно. не обижайся, это было познавательно.
#493 #1074817
немного в продолжении:

https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html

> #define crBegin static int state=0; switch(state) { case 0:


> #define crReturn(i,x) do { state=i; return x; case i:; } while (0)


> #define crFinish }


> int function(void) {


> static int i;


> crBegin;


> for (i = 0; i < 10; i++)


> crReturn(1, i);


> crFinish;


> }



> #define crReturn(x) do { state=__LINE__; return x; \


> case __LINE__:; } while (0)



прикольный вариант.
#494 #1074818
>>1074809
Можешь еще green threads погуглить. А фиберы из Windows, очевидно же.
#495 #1074900
Если инициализировать поинтеру адрес 0, и инициализировать его значение нулем, и в рамках цикла идти дальше пока не не закончится память, инициализируя все нулем, можно ли так все данные в памяти компьютера переписать?
#496 #1074923
>>1074900
В современных ОС - только память процесса, да и то с оговорками: придется проглатывать исключения при попытке доступа к невыделенной памяти и придется как-то обойти свой собственный код. Чтобы затереть всю память (как делает, например, BIOS при проверке памтяи), нужен нереальный (flat real mode) или правильно настроенный защищенный режим, чтобы процессу была доступна последовательно вся физическая память.
#497 #1074943
>>1074923
Спасибо, то есть даже если под рутом на линуксе делать, никаких глобальных форматирований не стоит ожидать?
#498 #1074949
>>1074900

>Если инициализировать поинтеру адрес 0


Будет null pointer dereference и сегфолт.
#499 #1074956
>>1074943

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


root process != kernel mode process
#500 #1074970
>>1074956
а драйвера прямо в физическую могут?
#501 #1074975
>>1074970
Драйверы тоже разные есть. User mode и kernel mode. Последние с оговорками могут.
#502 #1074977
>>1074949

> Будет null pointer dereference и сегфолт.


NULL pointer - это абстракция из стандарта Си. В любой ОС можно сделать так, чтобы никаких сегфолтов не было. В частности, в XP (и вроде бы даже в 7 SP1 до некоторых пор) можно было выделить память по 0 прямо из юзермода, без особых привелегий.
ПЕРЕКАТ # OP #503 #1074991
ПЕРЕКАТ
>>1074988 (OP)
>>1074988 (OP)
>>1074988 (OP)
ПЕРЕКАТ
#504 #1074993
printf("%f ", t++ = s++);

В таком выражении будет печататься значение для t или для s?
#505 #1075000
>>1074993
Точнее вот https://pastebin.com/jh9Cm7dw
где t и s - массивы.
#506 #1075003
>>1074977
При чем тут абстракции языка? Ты понимаешь, что переменная это всего лишь указатель на адрес памяти?

Если ты напишешь на С:
char mem = 0;
mem = 0;

То на ассемблере это будет выглядеть примерно так:
mov ax,0
mov [ax],0

Что является обращением к памяти по адресу 0, что на системе с виртуальной памятью в user mode вряд ли возможно, т.к процессу назначается не нулевой стартовый адрес.
В общем, такое невозможно в принципе сделать в загруженной ОС.

Вот почитай http://wiki.osdev.org/Memory_Map_(x86)
#507 #1075004
>>1074993
У постфиксного ++ приоритет выше всего, поэтому берется адрес из s, потом s инкрементируется, потом адрес дереференсится звездочкой, потом аналогично вычисляется левый аргумент, и = пишет в него значение из правого. Более понятный аналог:
float temp = (t[0] = s[0]); // Ну или звездочки, но их макака съест.
printf("%f ", temp);
++s;
++t;
На свой вопрос сам ответишь.
#508 #1075010
>>1075003

> При чем тут абстракции языка?


При том, что по соглашению и из-за распространенности Си операционные системы не мапят первые 4 или 64 килобайта. Чтобы говнокод с NULL падал, как и положено. Но:
1) Ты вообще читал, что я написал? Никто не запрещает тебе выделить память самому. Если не из юзермода, то уж из кернелмода 100% возможно.
2) У тебя там 16-битные инструкции, а в том же DOS обращение по нулевому офсету было стандартной практикой, а с обращения к нулевому офсету нулевого сегмента (far null pointer) начиналась печать таблицы обработчиков прерываний. Например, в отладочных целях.
#509 #1075014
>>1075010

> Если не из юзермода, то уж из кернелмода 100% возможно.


Ни чего что кернел мод работает с виртуальной памятью тоже? И обычные kmalloc выделяют тебе виртуальную память?
#510 #1075017
>>1075004
Меня интересует случай, когда присваивание находится внутри printf.
Правильно ли я понимаю, что раз левый аргумент вычисляется последним, то его значение и напечатается, то есть в моем случае для t?
#511 #1075021
>>1075014
Я не понимаю, что ты пытаешься доказать. kmalloc - это тупой маллок, он не позволяет указать виртуальный адрес, по которому нужно выделить память.

>>1075017

> когда присваивание находится внутри printf.


От того, что оно синтаксически там находится, поведение не меняется.

> Правильно ли я понимаю, что раз левый аргумент вычисляется последним, то его значение и напечатается, то есть в моем случае для t?


Последним вычисляется присваивание, у = наименьший приоритет. Но = как и все операторы "возвращает" результат, он равен присваиваемому значению, и вот этот результат становится аргументом printf.
17 Кб, 614x424
#512 #1075025
>>1075003

> Что является обращением к памяти по адресу 0, что на системе с виртуальной памятью в user mode вряд ли возможно


Вот специально для тебя наговнокодил. Требует рута, поэтому не ideone.
#513 #1075029
>>1075025
Что-то я не понял, что за mmap такой, который возращает код а не адрес памяти?
http://man7.org/linux/man-pages/man2/mmap.2.html

Посмотри, какой адресс тебе вернет mmap, то что там происходят я не знаю.
#514 #1075030
>>1075029

> который возращает код а не адрес памяти


А я-то думал, что с тобой не так. А ты просто читать не умеешь. У тебя по ссылке черным по белому написано, что MAP_FAILED = (void *) -1. Ну и, конечно же, mmap() возвращает мне адрес, по которому я замапил страницу, а замапил я ее по 0, поэтому он мне возвращает 0. Если запущу не под рутом, вернет MAP_FAILED.
#515 #1075040
>>1075030
Нет с возвратом я понял, потом.
Но ты же не знаешь точно какой адресс, тебе возвращает mmap т.к просто опускаешь возвращаемое им значение. Сомневаюсь, что там будет 0х0, тем более даже если это так, он все равно мапится на виртуальную память, так что смысла в этом не особо много, т.к. нулевой адрес в виртуальной памяти процесса, впринципе возможен, только он будет укзывать то на другой физический.
#516 #1075047
>>1075040

> Но ты же не знаешь точно какой адресс, тебе возвращает mmap


MAP_FIXED же. Я ему явно указываю, что хочу именно NULL.

> так что смысла в этом не особо много


> он будет укзывать то на другой физический


А вот тут ты прав. Чтобы пройтись по физическим страницам последовательно, нужна другая магия. Называется /dev/mem, ее точно так же можно замапить, но оно не везде доступно, и те регионы, которые через него видно, целиком и полностью зависят от ядра. Но через кернелмод можно и это обойти.
#517 #1075068
>>1075040

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


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

но я читал про это как-то, хотя мне всегда казалось, что NULL может менять своё значение в зависимости от платформы, на деле вроде нет. но опять же, это пространство языка, не будет тебе malloc выделять 0 и ладно.
#518 #1075078
>>1075047

>/dev/mem


Ну во-первых он отключен по умолчанию.
Да и потом, не думаю что из protected mode можно что-то записать в такую низкоуровневую память < 1MB. Думаю, что процессор не даст что-то туда записать и сделает прерывание.
#519 #1075081
>>1075078

> Думаю, что процессор не даст что-то туда записать


Процессору абсолютно похуй, какой адрес выставлять на адресную шину. Защищенный режим защищает один процесс от другого, а не компьютер от программ.
#520 #1075088
>>1075081
Ну попробуй, собери ядро с /dev/mem или напиши свой syscall или модуль ядра, и попробуй че-нить записать туда напрямую.
#521 #1075092
>>1075088
Я бы не говорил, если бы не пробовал. И с линуксом, и напрямую.
# OP #522 #1075139
Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 5 ноября 2017 года.

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

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