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

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

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

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

78 Кб, 792x1023
C Programming Language #26 # OP 21 ноя, 20:01 1095677 В конец треда | Веб

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

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

Что читать:

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

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

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

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

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

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

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

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

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

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

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

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

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

Онлайн-утилиты:

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

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

- №23: https://arhivach.org/thread/277223/
- №24: https://arhivach.org/thread/291766/
- №25: https://arhivach.org/thread/303902/

Шапка: http://piratepad.net/bJ1SdmkZyu

Ответы096108097971098739102553104124107618

21 ноя, 20:10 2 1095682

Почему язык Си такой классный?

Ответы109751110484

22 ноя, 00:16 3 1095842

А как вообще программировать на С и при этом не косячить, если компилятор проглатывает практически любой код, даже такой, который очевидно ошибочен?

Ответы095854095879096094096100097504097968

sage 22 ноя, 00:27 4 1095854

>>1095842
Осторожно.

sage 22 ноя, 01:29 5 1095879

>>1095842
Как программировать на <любой язык нейм>, если компилятор проглатывает умножение на -2 там, где нужно было прибавить 3? Это же очевидная ошибка!

22 ноя, 02:34 6 1095898

4 Кб, 283x936 Кб, 584x62

помогите, почему не выделяет память?

Ответы095913

sage 22 ноя, 04:59 7 1095913

>>1095898
> .cpp
Во-первых, ты ошибся тредом. Во-вторых, тебе чистейшим английским языком написали, что в этих ваших крестах указатель на воид не кастуется в другие указатели автоматом (а в Си кастуется). Поэтому:
1) Не юзай маллок, у вас там завезли всякие векторы или new на худой конец.
2) Если уж юзаешь маллок, влепи каст к (char *).

Ответы096014

22 ноя, 08:42 8 1095941

Сичиач, разьясни мне зачем кармак запилил два отдельных аллокатора и чем hunk лучше чем zone?

https://github.com/id-Software/Quake-III-Arena/blob/master/code/qcommon/common.c#L1193

Ответы096077

22 ноя, 12:39 9 1096014

>>1095913
>2) Если уж юзаешь маллок, влепи каст к (char *).
что енто значит? ет не плюсы, просто на сайте почему-то cpp не обращай внимание

Ответы096025096165

22 ноя, 13:00 10 1096025

>>1096014
значит переменная не в начале блока объявлена и это < c99

22 ноя, 13:44 11 1096031

А почему sprintf сводит в ноль значение в переменной?

char a[2];
int b = 10;
sprintf(a, "%d", b);
printf("%d\n", b); // 0

Нахуй так делать? Может я где-то ошибаюсь?
Если заслать ему const, то всё нормально кстати. Но для меня это не решение.

Ответы096033096056096081

22 ноя, 13:49 12 1096033

>>1096031
прост)
как же ты заебал, даун.

Ответы096058

22 ноя, 14:30 13 1096056

>>1096031
>почему sprintf сводит в ноль значение в переменной?
Схуяль? https://ideone.com/MQcxI6

Ответы096058096059

22 ноя, 14:38 14 1096058

>>1096033
> прост)
Ещё и даунами кого-то называет.

>>1096056
Разобрался. Если объявить "b" перед "a", то будет ноль. Причём на ideone и в таком случае всё нормально, а вот у меня на комплюхтере не нормально.
clang 3.8.1-24

22 ноя, 14:39 15 1096059

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

22 ноя, 14:53 16 1096068

хотя, это наверно от системы зависит... но я помню читал, на винде что-то же было подобное, может в vc.

Ответы096072

22 ноя, 14:58 17 1096071

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

Ответы096074

22 ноя, 15:05 18 1096072

>>1096068
> хотя, это наверно от системы зависит... но я помню читал, на винде что-то же было подобное, может в vc.

Довен, у тебя массив утек, sprintf записал в a[2] терминирующий ноль следом за двумя цифрами, компилятор в стеке разместил b следом за массивом. И терминирующий ноль у тебя записался в b.

>>1096068
>хотя, это наверно от системы зависит

Да, довен, зависит. От endiannes процессора. На штеудах байты идут в памяти от младшего к старшему, на коком-нибудь PowerPC ты бы долго думал что у тебя все в порядке.

Ответы096080096081

22 ноя, 15:09 19 1096074

>>1096071
>Для вас даже создание строки на хипе - это уже проблема

Для тебя, довен, это действительно проблема.

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

Ога, core i7 с 64гб памяти будет достаточно каждому для запуска калькулятора, как же, слышали-слышали.

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

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

22 ноя, 15:13 20 1096077

>>1095941

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

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

22 ноя, 15:17 21 1096080

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

22 ноя, 15:20 22 1096081

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

>>1096031-кун

> прост
> даун
> довен
Но это конечно совсем пиздец. Мочан во всей красе.

22 ноя, 15:52 23 1096094

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

22 ноя, 15:58 24 1096100

>>1095842
> А как вообще программировать на С и при этом не косячить, если компилятор проглатывает практически любой код, даже такой, который очевидно ошибочен?

Сорцы линух кернела почитай, ну или там кваки iii кою тут вывесили.

22 ноя, 16:13 25 1096108

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

Ответы096116

22 ноя, 16:24 26 1096116

>>1096108
арифметику безграничной длины. сложение, вычитание, деление, умножение - соответственно и сдвиги.

sage 22 ноя, 17:56 27 1096165

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

55 Кб, 1079x768
22 ноя, 21:15 28 1096274

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

Ответы096285096291

22 ноя, 21:33 29 1096285

>>1096274
> Каким образом можно решить данную проблему?
Округлять, менять методы вычисления, использовать типы с большей мантиссой (double, long double).
https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ - скроллим чуть-чуть вниз, там список статей, которые категорически рекомендуются при попытках писать что-либо с использованием арифметики с плавающей точкой.

22 ноя, 21:49 30 1096291

>>1096274
> Я только начинающий и столкнулся с проблемой, суть её представлена на скриншоте. Как видно, в результате нескольких арифметических операций число теряет своё значение. Я ожидал что уже после первого умножения число станет равным 122.000060. Та же проблема наблюдаются и при преобразовании типов.

Добро пожаловать в мир байтов.

В мире байтов разряды у чисел не 1,10,100,100 и 0.1, 0.01, 0.001

а 2 4 8 16 32 и 1/2, 1/4, 1/8, 1/16 соответсвенно. И с числами, не кратными 1/степень двойки будут всегда проблемы.

https://www.youtube.com/watch?v=PZRI1IfStY0

Ответы096314

22 ноя, 22:43 31 1096314

>>1096291
> В мире байтов разряды у чисел не 1,10,100,100 и 0.1, 0.01, 0.001
На самом деле, в IEEE 754 (и, сооответственно, в Си) допускается существование чисел с плавающей точкой с FLT_RADIX=10 - реализуй такое в железе или софтфлоат в компиляторе, и будут тебе 0.1. Но на практике, да, в большинстве случаев везде FLT_RADIX=2.

22 ноя, 23:09 32 1096320

Хочу реализовать уже наконец длинную арифметику на C.
В интернете встречал два подхода:
1. Лезть в байты, арифметические функции с нуля, так сказать, даже "+" нинужны.
2. Реализация, которая базируется на стандартных "+", "*".
Имеет ли смысл лезть в (1)? Или на (2) готовые функции на ассемблере всё равно опередят?
Если захочу в (1), то "Алгоритмические трюки для программистов" - то, что надо?

Ответы096346096616

23 ноя, 00:00 33 1096346

>>1096320
> арифметические функции с нуля
Лолшто? Ты хочешь реализовывать побитовую арифметику софтом на ксорах и вручную перенос в каждый бит добавлять? Какой в этом практический смысл?

> Реализация, которая базируется на стандартных "+", "*".
Есть стандартный стул: берешь stdint.h, берешь какой-нибудь uint, работаешь, соответственно, со словами. Слова хранишь в массивах, little endian (слова, а не байты одного слова!), бегаешь по этим массивам быстро и комфортно.

Ответы096406096527

23 ноя, 08:48 34 1096406

>>1096346
А как я могу, допустим, поксорить элемент произвольной длины, если у меня есть указатель на него и его размер?

Ответы096748

23 ноя, 08:54 35 1096409

Алсо, есть что противопоставить NumPy в плане визуализации результатов экспериментов (графики, диаграммы)? Такая же удобность, конечно, не нужна, но чтобы хотя бы была возможность на экран вывести.

23 ноя, 13:43 36 1096527

>>1096346
Он спрашивал длинную арифметику, это где флаг переполнения проверяют. Carry Flag то есть.

Ответы096697096748

23 ноя, 16:34 37 1096616

>>1096320

3. Запилить арифметику на BCD.

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

Ответы096688

23 ноя, 18:36 38 1096688

>>1096616
>П.2 ты не сделаешь по причине отсутсвия доступа к флагам переполнения на чистых сях.
Это не так. Как минимум можно просто считать старший разряд битом переноса.

23 ноя, 18:57 39 1096697

>>1096527
>это где флаг переполнения проверяют
Нет, так поступают только говномесы. Использование флага C и инструкций adc не позволяет использовать векторные операции над массивом данных, которые выполняются мгновенно. Поэтому в одном разряде числа хранятся числа в таком диапазоне, чтобы переполнение не возникало. При этом флаг C не используется вообще, и число дробится на увеличенное число Chunk'ов (увеличено за счет уменьшения диапазона значений разрядов).

Ответы096699

23 ноя, 19:07 40 1096699

>>1096697
Иначе говоря, если число дробится на chunk'и по одному байту, то в этом байте используется не весь диапазон, а только 5 битов. При таком подходе переполнение не возникает вообще, и операция adc не нужна. Проблема здесь в том, что векторные операции отбрасывают флаг C.

72 Кб, 1000x563
23 ноя, 19:39 41 1096712

А ещё я сосу хуи.

Ответы096716

23 ноя, 19:41 42 1096716

>>1096712
Ты, может, и сосешь, а я предпочитаю тянок.

23 ноя, 20:04 43 1096732

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

Ответы096888

23 ноя, 20:21 44 1096748

>>1096406
> как я могу, допустим, поксорить
С чем поксорить? С другим подобным? Просто ксоришь побайтово или пословно, пока один из массивов не кончится.

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

23 ноя, 22:40 45 1096888

>>1096732
А что в этом приятного?

24 ноя, 19:37 46 1097325

напомните как инициализировать переменную как int и одновременно как char

Ответы097344

24 ноя, 20:42 47 1097344

>>1097325
union foo
{
int foo_int;
char foo_char;
}
И это твой тип новый.

Ответы097346

24 ноя, 20:56 48 1097346

>>1097344
спасибо

25 ноя, 04:31 49 1097504

>>1095842
Мимо напомнило. Пилил руками транслятор, над каждой функцией в комментариях ставил соответсвующее правило на манер Exp = Term {('+' | '-') Term. В одном месте забыл про //, и нихуя сожрал всё, только много странных предупреждений выдал.

26 ноя, 11:20 50 1097966

бамп

26 ноя, 11:43 51 1097968

>>1095842
Очевидно, обмазываться разными инструментами, которые призваны облегчить жизнь C/C++ разработчика.
valgrind, clang-analyzer, pvs studio - вот это все

26 ноя, 11:51 52 1097971

>>1095677 (OP)
Есть ли разница между static и static inline функциями?

Ответы097977

26 ноя, 12:10 53 1097977

>>1097971
есть, первая ссылка в гугле: https://www.greenend.org.uk/rjk/tech/inline.html

112 Кб, 788x1080
27 ноя, 05:02 54 1098556

Недавно наткнулся на волшебную тулзу - Process Hacker. Трейсит практически все что можно на венде, поэтому я узнал про такую штуку как сервисы типа драйверов.

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

У рихтера почти ничего нет про это, мс предлагает качать последнюю WDK и идти по туториалам.
Может тут сможет кто подсказать где искать материал?
писал только обычный сервис на крестах

Ответы098561

27 ноя, 05:38 55 1098561

>>1098556
>Недавно наткнулся на волшебную тулзу - Process Hacker. Трейсит практически все что можно на венде, поэтому я узнал про такую штуку как сервисы типа драйверов.
в сервисах не показывается?

Ответы098565

36 Кб, 1023x826
27 ноя, 05:48 56 1098565

>>1098561
Нет, в services.msc показывает только выделенное.

Ответы109835

27 ноя, 10:14 57 1098596

есть какая-нибудь вики/референс мануал с поиском, чтобы удобно было листать прямо во время кодинга?

Ответы098695098844

27 ноя, 13:15 58 1098633

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

Ответы099815

27 ноя, 15:16 59 1098695

>>1098596

очевидный cppreference.com

27 ноя, 16:20 60 1098739

>>1095677 (OP)
Где можно достать тулчейн с компилятором gcc version 4.2.0 20070413 (prerelease) (CodeSourcery 2007q1-21. Marvell GCC-4.2.0 201111.12345)) для сборки ядра линукс 3.0.0 под ARM?

Ответы098783

27 ноя, 16:48 61 1098778

const int a = 1;
const int b = a * 2;

clang на маке компилирует, а msvc на вниде или gcc (4.8.4) на убунте ругаются на
>initializer element is not constant

Собственно, с какого перепугу он не константа-то? Как починить? static дела не меняет.

И ещё относительно связанный вопрос: как можно во время компиляции записать в константу результат (чистой) функции? Квадратный корень числа получить надо, поэтому вручную все действия расписай (через макро, например) не особо получится.

Ответы098789098791098844

27 ноя, 16:55 62 1098783

>>1098739
Какой-то ебанутый вопрос.
Почитай лучше это: http://xyproblem.info/

Ответы098808

27 ноя, 16:59 63 1098789

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

Ответы098802

27 ноя, 17:00 64 1098791

>>1098778
>с какого перепугу он не константа-то
Это лишнее, погуглил уже.

Короче говоря, могу я как-то произвести вычисления некоторые во время компиляции для статичных констант?

Ответы098796

27 ноя, 17:02 65 1098796

>>1098791
Попробуй constexpr.

Ответы098802

27 ноя, 17:07 66 1098802

>>1098789
Да я уже нашёл, что я не так понимал слово "constant" в ошибке, там именно constant expression нужен, стандарты/расширения не помогут, это clang "особенный".

>>1098796
А мы же, вроде, в си-треде, а не плюсах?

Ответы098806

27 ноя, 17:16 67 1098806

>>1098802
Точняк лол. Тогда макросы.

557 Кб, 1134x1392
27 ноя, 17:19 68 1098808

>>1098783
>Какой-то ебанутый вопрос.
Мы занимаемся реверсом прошивки. Модули ядра написаны под kernel 3.0.0, собранного под ARM.

Ответы098810098885

13 Кб, 273x184
27 ноя, 17:22 69 1098810

>>1098808
И нам нужно собрать ядро версии 3.0.0 под ARM, чтобы запихать его и модули ядра в отлачик и по стеку вызовов определить, откуда вызывается очень интересная для нас функция и что в нее передается.

Ответы098814098844098885

27 ноя, 17:29 70 1098814

>>1098810
Ясно, т.е. вам нужно чтобы ABI той же версии было. Хуй знает, а эти CodeSourcery не дают доступ к исходникам своей бадяги? Можно было бы нужную версию скомпилировать.

27 ноя, 17:55 71 1098844

>>1098596
> Может тут сможет кто подсказать где искать материал?
Zeal

>>1098778
Констант в Си почти нет. const задает тип доступа в рантайме, а не то, что принято считать константой в других языках (собственно, тебе и ругается, что ты инициализируешь одну переменную значением другой переменной, а инициализировать можно только константным выражением). Если не можешь что-то вычислить простой арифметикой в макросе - используй кодогенерацию или C++. На самом деле, любой уважающий себя компилятор и сам отлично свернет sqrt(константа) в вычисленное значение на этапе компиляции, но полагаться на это без проверки не стоит.

>>1098810
Да возьмите обычный ARM-ассемблер какой-нибудь fasm, точнее fasmarm умеет ассемблировать "поверх" файла, хукните свою интересную функцию прямо в бинарнике, сдампите обычным printk параметры и LR. Дел - на 20 минут, и никакой возни со сборкой.

Ответы098879

27 ноя, 17:59 72 1098851

Почему ебучий кланг прпоускает этот код тогда? (который const int b = a * 2;)

Ответы098866

27 ноя, 18:03 73 1098866

>>1098851
Потому что расширения. Можешь считать, что это баг.

Ответы098871

27 ноя, 18:05 74 1098871

>>1098866
Но даже с -std=c89/c11 -pedantic пропускает, как это расширение отключить то?

27 ноя, 18:09 75 1098879

>>1098844
>Да возьмите обычный ARM-ассемблер какой-нибудь fasm, точнее fasmarm умеет ассемблировать "поверх" файла, хукните свою интересную функцию прямо в бинарнике, сдампите обычным printk параметры и LR. Дел - на 20 минут, и никакой возни со сборкой.
Можешь описать подробнее?

Ответы098909

24 Кб, 400x321
27 ноя, 18:12 76 1098884

Из документации:

However, Clang is more strict than other popular compilers, and may reject incorrect code that other compilers allow.

Они там что, охуели?

525 Кб, 702x336
27 ноя, 18:13 77 1098885

>>1098808
>>1098810
А именно, у нас есть модуль supplies.ko с очень интересной функцией, которая получает данные, в формате которых нужно разобраться. Сейчас известно немногое: например, поля в дампе, где содержится чек-сумма. Мы хотим раскрутить эту функцию, чтобы узнать назначение всех полей в данных. Пока мы договорились до возможности все это дело проэмулировать, но для этого надо собрать ядро.

Ответы098915

16 Кб, 688x300
27 ноя, 18:30 78 1098909

>>1098879
> Можешь описать подробнее?
Ну, если у тебя есть рабочая прошивка и железка:
Читаешь любую статью по хукам в Windows (их овердохуя). Делаешь то же самое в прошивке: ищешь пустое место (длинный ненужный текст, неиспользуемую функцию, можно даже "ненужную" функцию, их дохуя в ядре - втыкаешь возврат в начало, остальные байты твои) - будешь там хранить свой код. Воруешь из интересующей тебя функции несколько инструкций, на их место втыкаешь безусловный переход на свой код, твой код дампит все, что тебя интересует, под конец выполняет украденные инструкции и возвращается на следующую после украденной. Возможны варианты.
Пикрелейтед - подобный хук, дампивший RSA-ключи из одной софтины под WinCE прямо во время инициализации библиотеки, работающей с длинными числами. Вместо того, чтобы долго и мучительно искать два десятка ключей в каждой новой версии покриптованного бинарника, мы патчили программу по сигнатурам, и ключи самостоятельно укладывались штабелями в txt-файл рядом с ней.

Ответы098997

27 ноя, 18:33 79 1098915

>>1098885
Блин, не увидел сообщения. Ну у вас немного не тот случай, да. Можно заняться инструментированием по-крупному (не вручную). Правда, тут уже может оказаться быстрее собрать ядро.

27 ноя, 19:58 80 1098997

>>1098909
>2017
>не использовать дефайны для регистров

Ответы099017

sage 27 ноя, 20:12 81 1099017

>>1098997
Какие именно дефайны и зачем они в коде, написанном на скорую руку? Там даже GetProcAddress на каждый вызов заново делается, потому что возиться было лень. Алсо, это совсем не 2017, а скорее где-то 2009.

Ответы099023

20 Кб, 300x245
27 ноя, 20:15 82 1099023

>>1099017
Открываешь такой через неделю код
@
Не понимаешь что там происходит
@
Удаляешь все нахуй
@
Делаешь заного

>True story

27 ноя, 20:16 83 1099026

Аноны, при создании char-массива, т.е.
char array[5];
нуль-терминатор (\0) автоматически добавляется в последний элемент массива? Т.е. в a[4] уже записывается \0, как только я пишу char array[5]?

Ответы099030099051

27 ноя, 20:18 84 1099030

>>1099026
Нет.

sage 27 ноя, 20:26 85 1099051

>>1099026
Терминатор "автоматически" добавляется только в строковый литерал (например, "test" - это { 't', 'e', 's', 't', '\0' }). В том числе, когда ты инициализируешь им свой массив char[5].

Ответы099066

27 ноя, 20:36 86 1099066

>>1099051
Хорошо. Тогда, например, создаю char array[5];
затем заполняю его символами с помощью scanf
Во-первых, какой формат ввода нужно использовать в scanf? %c или %s? И как вообще заполнять массив через scanf? Можно увидеть коротенький пример?

Ответы099087

27 ноя, 20:50 87 1099087

>>1099066
%c читает и присваивает один символ. %s присваивает последовательность символов до первого пробельного символа или пока не превышен лимит (например, %4s). При этом %s допишет \0 автоматически (т.е., для %4s массив должен вмещать минимум 5 элементов). Алсо, если тебе нужно ввести кусок строки с пробелами, можно задавать наборы символов - какое-нибудь %4[^\n] то же, что %s, но читает до конца строки, а не до первого пробела. И вообще, http://en.cppreference.com/w/cpp/io/c/fscanf

Ответы099093

27 ноя, 21:02 88 1099093

>>1099087
Спасибо за пояснение. Теперь стало понятнее.
"%s присваивает последовательность символов до первого пробельного символа или пока не превышен лимит (например, %4s)"
А Enter прерывает ввод аналогично пробелу?

Ответы099101

27 ноя, 21:16 89 1099101

>>1099093
Да, Enter, Tab - вообще всё, что isspace().

Ответы099120

27 ноя, 21:31 90 1099120

>>1099101
Хм, тогда почему в таком коде программа падает при после ввода строки? Ввожу однозначное или двузначное число, например, 5 или 14, нажимаю Enter, получаю виндовое сообщение об ошибке, типа, "Прекращена работа программы...".
int main () {
char b[3];
scanf_s ("%s", b);
printf ("%s\n", b);
return 0;
}

Ответы099144099145

27 ноя, 21:41 91 1099129

for(i = 0; i > var1 + var2; i++)

Компилятор вычислит значение "var1 + var2" один раз, или будет это делать в каждой итерации?
Будет ли правильным создать ещё одну переменную перед циклом, "var3 = var1 + var2;", и использовать её в условии?

Ответы099136099144

27 ноя, 21:43 92 1099136

>>1099129
var1+var2 вычислит один раз.
Можно создать var 3 перед циклом и использовать ее в условии - разницы никакой

27 ноя, 21:48 93 1099144

>>1099120
> scanf_s
Потому что:
1) #define _CRT_SECURE_NO_WARNINGS.
2) Не используй никогда scanf_s и все прочие _s. Их обещали выпилить из C2x.
3) Если уж используешь, читай справку. У scanf_s на каждый спецификатор нужно ДВА аргумента. Первый - указатель на переменную, как в scanf. Второй - максимальный размер.

>>1099129
Стандарту определяет "наблюдаемое поведение": выражение вычисляется каждый раз. Если ты не можешь никак увидеть, что реальное поведение как-то отличается (например, в твоем случае никаких побочных эффектов от вычисления выражения до цикла не будет), тогда компилятор может оптимизировать, а может и не оптимизировать. Можешь надеяться, что такое простое выражение он проглотит, но вот если у тебя там есть что-либо сложнее strlen, лучше создавать переменную. Например, так: for (int i = 0, n = var1 + var2; i < n; i++). Или использовать цикл с декрементом, если тебе похуй на порядок for (int n = var1 + var2 - 1; n >= 0; n--) (хотя тут нужно думать уже - можешь только еще сильнее отсосать по скорости из-за кэша).

Ответы099145099146

27 ноя, 21:52 94 1099145

>>1099120
Алсо, я тебя наебал про %с в scanf. Я тут полез в справку и внезапно узнал, что оно тоже умеет читать несколько символов, но только указанное количество (%c - 1 символ, %3с - 3 символа), и НЕ дописывает \0 в конец.
Алсо, >>1099144 тут я тебя тоже наебал. Второй аргумент с размером нужен только для спецификаторов %s %[] и %c. Никогда этим говном не пользовался.

Ответы099152

27 ноя, 21:54 95 1099146

>>1099144
>Их обещали выпилить из C2x
Кто обещал?
И когда этот стандарт выйдет?

Ответы099147

sage 27 ноя, 21:56 96 1099147

>>1099146
> Кто обещал?
Комитет по стандартизации. Потому что это хуйня, интересная только Microsoft и попавшая в стандарт под ее давлением.

> И когда этот стандарт выйдет
С99 вышел в 1999. C11 вышел в 2011. Используй логику, чтобы понять, когда выйдет C2x.

Ответы099162

27 ноя, 22:01 97 1099152

>>1099145
аа, так вот почему у меня программа падала. Спасибо, тогда буду онли использовать scanf, вместо scanf_s. А можно еще за \0 пояснить? Что будет, если его не дописывать в конец массива? Ну, допустим буду заполнять через %c. Или это уже совсем другая тема и лучше сейчас этим не заморачиваться?

27 ноя, 22:03 98 1099155

Котаны, у меня есть ~200 разных файлов следующего содержания:

#define FILE_(номер файла) (размерность массива)

int myfunc(double (звездочка)x, бла-бла)
{ бла-бла}

Также есть один на всех main-файл. Хотелось бы переписать его так, чтобы он по очереди запускал каждый из двухсот файлов, получал некоторый результат и записывал его в выходной файл (выходной файл тоже один на всех).
Как это можно сделать?

Ответы099173

27 ноя, 22:07 99 1099162

>>1099147
>Комитет по стандартизации.
Где можно ознакомиться с обещаниями?
>С99 вышел в 1999. C11 вышел в 2011. Используй логику, чтобы понять, когда выйдет C2x.
C++0x тоже обещали в нулевых, а вышел он аж в 2001 году. Стандарт не принимают каждое десятилетие, а по мере необходимости. Си не особо живой язык, новый стандарт никому не нужен, учитывая, что C11 спустя 6 лет после выхода полностью реализован только в одном компиляторе - Clang/LLVM

Ответы099163099173

27 ноя, 22:07 100 1099163

>>1099162
>а вышел он аж в 2001 году
В 2011, конечно.

sage 27 ноя, 22:13 101 1099173

>>1099162
> Где можно ознакомиться с обещаниями?
Знакомство осуществляется копанием тут: http://www.open-std.org/jtc1/sc22/wg14/

> новый стандарт никому не нужен
Многие считают по-другому. Я, например, атрибутов жду. И где-то в 21-22 году стандарт должен выйти, а к 25-26 можно будет даже начинать ими пользоваться, лол.

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

Ответы099182

27 ноя, 22:27 102 1099182

>>1099173
Это вариант, но я не хотел так делать из-за "раздутия"исходного кода.
Каждый файл -- некоторый ОГРОМНЫЙ функционал. В нынешней тестовой версии самый большой из них занимает 270 страниц двенадцатого вордовского текста и нихуя не работает работает, но в ожидании ответа я успею умереть, самый маленький -- страниц 20.
Скорее всего для ускорения придется дописывать некоторую вспомогательную ерунду, из-за которой каждый файл еще вдвое увеличится в объеме.
Получится даже не "Война и мир", а какая-то ебучая Британника.

Ответы099183

sage 27 ноя, 22:32 103 1099183

>>1099182
Попробуй русским языком более полно описать то, чего ты хочешь. Никакого раздутия исходного кода быть не может. Либо у тебя массив с параметрами, либо массив указателей на параметры или колбеки (а параметры и вспомогательные функции в отдельных файлах). Никакие дефайны там не нужны. Ну разве что для создания похожих элементов массива.

Ответы099185

27 ноя, 22:43 104 1099185

>>1099183
Я тебя кажется понял. Извини за предыдущий дурацкий комментарий.

27 ноя, 23:40 105 1099214

dot = 1;
for (unsigned int i = 0; i < strlen(valinstr); i++) {
if ((i == dot) && (i>0)) {
continue;
}
else {
printf("i = %d\n", i);
dig = TO_DIGIT(valinstr);
val += TO_DEC(dig, powerint);
powerint--;
}
}
В данном фрагменте кода видно, что dot = 1;
В цикле, в условии if сказано:
if ((i == dot) && (i>0)) {
continue;
}
То есть, когда i == 1, то должна быть следующая итерация цикла, т.е. i == 2. В дальнейшем уже постоянно должно выполняться условие else.
В консоли должно выводиться:
i = 0
i = 2
i = 3
И так далее...
Однако, в действительности, я вижу
i = 0
i = 1
i = 2
i = 3
Т.е. i = 1 не должно выводиться, так как итерация цикла c i == 1 пропускается с помощью continue.
Подскажите, в чем проблема

27 ноя, 23:40 105 1099214

dot = 1;
for (unsigned int i = 0; i < strlen(valinstr); i++) {
if ((i == dot) && (i>0)) {
continue;
}
else {
printf("i = %d\n", i);
dig = TO_DIGIT(valinstr);
val += TO_DEC(dig, powerint);
powerint--;
}
}
В данном фрагменте кода видно, что dot = 1;
В цикле, в условии if сказано:
if ((i == dot) && (i>0)) {
continue;
}
То есть, когда i == 1, то должна быть следующая итерация цикла, т.е. i == 2. В дальнейшем уже постоянно должно выполняться условие else.
В консоли должно выводиться:
i = 0
i = 2
i = 3
И так далее...
Однако, в действительности, я вижу
i = 0
i = 1
i = 2
i = 3
Т.е. i = 1 не должно выводиться, так как итерация цикла c i == 1 пропускается с помощью continue.
Подскажите, в чем проблема

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

27 ноя, 23:40 106 1099215

>>1099214
бля, извиняюсь, сейчас фиксану

Ответы099216

27 ноя, 23:42 107 1099216

>>1099215
dot = 1;
for (unsigned int i = 0; i < strlen(valinstr); i++) {
if ((i == dot) && (i>0)) {
continue;
}
else {
printf("i = %d\n", i);
dig = TO_DIGIT(valinstr);
val += TO_DEC(dig, powerint);
powerint--;
}
}
В данном фрагменте кода видно, что dot = 1;
В цикле, в условии if сказано:
if ((i == dot) && (i>0)) {
continue;
}
То есть, когда i == 1, то должна быть следующая итерация цикла, т.е. i == 2. В дальнейшем уже постоянно должно выполняться условие else.
В консоли должно выводиться:
i = 0
i = 2
i = 3
И так далее...
Однако, в действительности, я вижу
i = 0
i = 1
i = 2
i = 3
Т.е. i = 1 не должно выводиться, так как итерация цикла c i == 1 пропускается с помощью continue.
Подскажите, в чем проблема

27 ноя, 23:42 107 1099216

>>1099215
dot = 1;
for (unsigned int i = 0; i < strlen(valinstr); i++) {
if ((i == dot) && (i>0)) {
continue;
}
else {
printf("i = %d\n", i);
dig = TO_DIGIT(valinstr);
val += TO_DEC(dig, powerint);
powerint--;
}
}
В данном фрагменте кода видно, что dot = 1;
В цикле, в условии if сказано:
if ((i == dot) && (i>0)) {
continue;
}
То есть, когда i == 1, то должна быть следующая итерация цикла, т.е. i == 2. В дальнейшем уже постоянно должно выполняться условие else.
В консоли должно выводиться:
i = 0
i = 2
i = 3
И так далее...
Однако, в действительности, я вижу
i = 0
i = 1
i = 2
i = 3
Т.е. i = 1 не должно выводиться, так как итерация цикла c i == 1 пропускается с помощью continue.
Подскажите, в чем проблема

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

27 ноя, 23:48 108 1099219

Я тут спросить хотел, может кто-нибудь сможет просто объяснить.
Хочу написать диспетчер задач для своего проекта в МКК. Просто микрик, я там сделал простецкое меню на указателях, и большая часть всего на костылях.

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

Ответы099355

28 ноя, 01:25 109 1099271

>>1099216
В коде вроде бы все норм. Добавить в printf по else вывод dot. Может быть, ты его где-то повреждаешь, хуй знает.

Ответы099352

28 ноя, 07:53 110 1099352

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

28 ноя, 08:02 111 1099355

>>1099219
Начни с создания очереди сообщений в первом потоке (и единственном).

28 ноя, 11:50 112 1099421

Почему игровые движки пишут на С++, но не на Сишечке больше?
Про кваку и дум не надо, тогда ещё динозавры по земле ходили.

Ответы099461101112

28 ноя, 13:12 113 1099461

>>1099421
Сам уже давно не увлекаюсь этим, но в студенческие годы пилил свой 3Д двиган.
Во-первых, выблядки из негрософта сделали D3D API на С++.
Во-вторых, некоторые и до сих пор видел пилят на С.
В-третьих, так принято в геймдеве.
В-четвертых, у многих и не только гейдевелов промыты мозги о всесильности и охуенности ОО подхода.
В-пятых, ОО подход действительно в геймдеве может успешно применяться.
В-шестых, никто не запрещает писать в Си стайле на С++ и пользоваться только самым необходимым из С++.
В-седьмых, просто куча либ и двиганов уже написана на С++ и он тащится как ебаное легаси.

Ответы099691

28 ноя, 15:24 114 1099542

Аноны, какой диапазон для целой и дробной части у типов float и double?
Вот, например, все мы знаем, что тип int занимает 4 байта = 32 бита. Следовательно, для unsigned int диапазон будет [0, +4 294 967 295], так как (2^32)-1 = 4 294 967 295. А для signed int диапазон значений равен [-2 147 483 648, +2 147 483 647].
Так вот, float занимает 4 байта, а double - 8. Но опять же, повторю свой вопрос: какой диапазон значений в целой и дробной части будет для каждого из них?

Ответы099709

sage 28 ноя, 19:48 115 1099691

>>1099461
> выблядки из негрософта сделали D3D API на С++
Лож-пиздеж. DirectX использует COM, а COM в Си отлично работает. Во-первых, тебе никто не мешает делать pDirect3DDevice->lpVtbl->DoSomething(pDirect3DDevice, ...), во-вторых, специально для тебя в DirectX до сих пор включают макросы типа IDirect3DDevice_DoSomething.

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

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

Ответы099693099702

sage 28 ноя, 19:52 116 1099693

>>1099691
Все твои выпады - полная хуйня.

28 ноя, 19:58 117 1099702

>>1099691
Ладно, давай разберем тобою написанное.

1. Использовать уебищные костыли, когда можно нативно писать более менее нормально на С++ - бессмысленно и тупо.

2. Без пруфоф ты сам знаешь кто. Более того, это вообще ничего не значит. В геймдеве принято писать на С++ - это факт. Для пруфоф можешь зайти на любой геймдев форум.

3. Можешь. Я и не спорю. Только учитывая все то, вышеперечисленное, пишут те же объекты на С++.

Ответы099703099709

28 ноя, 20:00 118 1099703

>>1099702
>В геймдеве принято писать на С++ - это факт
они там впще ебанулись. нпхуй на конпелируемых языках писать что то кроме движка?

Ответы099706

28 ноя, 20:03 119 1099706

>>1099703
Так никто и не пишет.
Вся игровая механика и логика пишется на скриптовых языках типа луа или яваскрипта.

28 ноя, 20:07 120 1099709

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

В 32-битных числах (float) на мантиссу выделено 23 бита (плюс один неявный), т.е., ты можешь без потерь представить все целые в диапазоне от 20 до 224 (дальше уже ты сможешь представить только некоторые целые), знак отдельно, на экспоненту, соответственно, остается 8 бит, но два значения забиты под специальные состояния, поэтому экспонента может быть от -126 до +127. В 64-битных (double) размер мантиссы и экспоненты 52+1 и 11 соответственно. Максимальные и минимальные значения можешь посчитать примерно как 2минимальная или максимальная экспонента, плюс существуют еще денормализованные значения с плавающей точкой для представления очень маленьких чисел.

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

> Для пруфоф можешь зайти на любой геймдев форум
Зашел, там юнити с додиезами и JS. Составил впечатление, что геймдев - это додиез. Правильно?

Ответы099715

28 ноя, 20:10 121 1099715

>>1099709
> Не вижу никаких костылей
Твои проблемы.

>Правильно?
Нет.

28 ноя, 23:20 122 1099813

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

Ответы099817

28 ноя, 23:20 123 1099815

>>1098633
хм, интересно, в сбертехе все на явке новое же пишется..

28 ноя, 23:21 124 1099817

>>1099813
>и виснуть в этих циклах
и виснут
>Как они вообще из них выходя
по условию

Ответы099829

28 ноя, 23:35 125 1099829

>>1099817
А есть какой-нибудь простой пример реального использования?

Ответы099833

28 ноя, 23:41 126 1099833

>>1099829
Ну, например, обход директорий в файловой системе): функция обработает файлы в указанной директории, и, если в директории есть дочерние директории, вызовет себя же для их обработки, иначе НЕ вызовет, и эта ветка рекурсии закончится. Очевидно, что момент, когда вложенных директорий не будет, когда-нибудь обязательно настанет на самом деле, не совсем правда: есть всякие символические ссылки, которые могут ссылаться куда-нибудь выше текущей папки, и программа зависнет, если не знает об их существовании.

Ответы099838099839

28 ноя, 23:48 127 1099838

>>1099833
Теперь стало немного понятнее.

А промежуточные результаты оно в оперативку пинает?

Ответы099840

28 ноя, 23:48 128 1099839

>>1099833
> когда вложенных директорий не будет
if (child == NULL) return

а по ссылкам в линупсе не ходютъ

Ответы099840

28 ноя, 23:49 129 1099840

>>1099839
этому вот >>1099838

29 ноя, 14:09 130 1100052

float var = 5.0;

void func(int i) { ... }
...
func((int)var);
------------------------
float var = 5.0;

void func() { int i = (int)var; ... }
...
func();

Будет ли разница в скорости выполнения?

Ответы100122

255 Кб, 1920x1457
29 ноя, 15:15 131 1100078

О мудрецы, наставьте на путь истинный ИТТ.

Что общего и в чём различие языков C++, Visual C++ и C#, кроме названий?

Ответы100081100768

29 ноя, 15:30 132 1100081

>>1100078
>Что общего и в чём различие языков C++, Visual C++ и C#, кроме названий?
>пидарасы
>пидарасы
>пидарасы

Ответы100424

29 ноя, 16:50 133 1100112

Как разделить число на два целочисленных значения?
С двойкой все понятно: 2 / 2 = 1, то есть 1 и 1 будет.
Тройка: 3 / 2 = 1.5, а после каста к инту 1, то есть будет 1 и 1, а должно быть 2 и 1, или 1 и 2.

Думаю задача ясна. Необходимо самое быстродейственное решение.

Ответы100122

29 ноя, 17:01 134 1100122

>>1100052
Нет.

>>1100112
int n1 = (foo / 2);
int n2 = foo - n1;
Охуеть, правда?

Ответы100133100385

29 ноя, 17:17 135 1100133

>>1100122
> Охуеть, правда?
А то! Я бы условия хуячил. Спасибки.

30 ноя, 06:15 136 1100385

>>1100122
>Охуеть, правда
ебать ты маг

30 ноя, 11:57 137 1100424

>>1100081
Это понятно, а ещё?

30 ноя, 14:48 138 1100494

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

Ответы100571100691

30 ноя, 17:32 139 1100571

>>1100494
Тебе куда-нибудь в менеджед языки. В Си ты решаешь вопросы памяти, язык за тебя ничего делать не будет. И тем более он никак не может узнать, что у тебя "память заканчивается". А вот сам ты можешь сделать функцию типа array_put, которая и будет заниматься мемори-менеджментом, если очередной элемент/элементы ей положить будет некуда.
Есть частные/частичные решения: например, в винде ты можешь зарезервировать большой кусок адресного пространства (память не тратится почти), в конец своего массива ставить страницу с PAGE_GUARD, отлавливать исключения и выделять еще памяти. Но это извращение с очень узкими юзкейсами.

30 ноя, 21:20 140 1100691

>>1100494
Это можно сделать, например, через связный список, выделяя память для узлов по мере надобности. При malloc еще нужно делать проверку на NULL, чтобы программа нормально завершилась при исчерпании памяти компа.

Ответы100980

30 ноя, 23:15 141 1100763

Сап /pr. Помоги сделать задачку (на чистом C).
Данные о работниках хранятся в некоторой структуре. Одно из полей структуры имеет тип enum { ENGINEER, MANAGER, CEO} , размер структуры - size, а смещение поля enum относительно начала структуры равно off. Напишите функцию void apply_manager (void employees, int n, size_t size, size_t off, void (apply)(void*)) , которая по массиву сотрудников employees с кол-вом элементов n вызывает переданную в качестве параметра функцию apply , для каждого эл-та массива, описывающего сотрудника-менеджера. Элемент массива имеет тип описанной структуры, параметром функции apply является указатель на структуру.

Ответы100981

30 ноя, 23:33 142 1100768

>>1100078
> C++
Гавно
> Visual C++
Блевотина
> C#
НИНУЖЕН

1 дек, 14:39 143 1100980

>>1100691
- пишешь функцию, в ней цикл
- гугли, как передать функции указатель на другую функцию
- в цикле вызываешь другую функцию по указателю на неё

Ответы100981

1 дек, 14:39 144 1100981

Вот это:
>>1100980
Ответ на это:
>>1100763

1 дек, 17:34 145 1101089

Имеет ли смысл делать free непосредственно перед выходом из программы? Или пусть ОС сама разбирается?

Ответы101109101119101167

1 дек, 18:25 146 1101109

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

Ответы101140101167

1 дек, 18:30 147 1101112

>>1099421
Скорость и управляемость С и кое-какие инструменты для построения абстракций (классы, темплейты/стл) для ускорения разработки и структурирования больших объёмов кода. Типа на двух стульях усидеть пытаются.

1 дек, 18:35 148 1101119

>>1101089
Открой для себя https://phoxis.org/2011/04/27/c-language-constructors-and-destructors-with-gcc/

Ответы101140

1 дек, 19:06 149 1101136

Аноны, пожалуйста, помогите. Вот пример кода:
int main () {
double value = 57.250000;
char val_str [100];
sprintf (val_str, "%f", value);
printf ("dlina stroki = %d\n", strlen (val_str));
return 0;
}
То есть, имеется число типа double. Перевожу его в строку с помощью функции sprintf. У меня, соответственно, переводится все это число, поэтому, когда я вывожу длину строки, то получаю dlina stroki = 9. Однако мне нужно сделать так, чтобы функция sprintf переводила в строку не 57.250000, а 57.25. Тогда будет dlina stroki = 5. Т.е. мне нужно сделать так, чтобы в строку переводились только значащие цифры, без лишних нулей в дробной части. Как это можно сделать? Писать отдельную функцию для удаления лишних нулей из строки не хочется.

Ответы101167101172

1 дек, 19:17 150 1101140

>>1101109
Окей, спасибо.

>>1101119
У меня и не gcc, и я для питона расширение пишу, так что сомневаюсь, что это корректно работало бы.

1 дек, 20:20 151 1101167

>>1101089
>>1101109
Делать free() при выходе - это распространенная плохая практика: при free() куче приходится вытаскивать из свопа всякие давно забытые служебные данные, обрабатывать их, реорганизовывать кучу и делать множество других ненужных вещей, поэтому программа, выделяющая много небольших блоков памяти, будет тормозить при выходе, если делать "правильную" очистку. В то же время, если free() при выходе не делать, ОС может просто пометить соответствующие страницы памяти как пустые и завершить программу мгновенно.

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

>>1101136
Простой способ: используй %g, укажи точность побольше (%.20g). Сложный способ: используй %g, вытащи из double экспоненту и посчитай, какая нужна точность, чтобы оно не переключилось на %e. Ну или нули обрезай, да.

Ответы101175101238101707

1 дек, 20:24 152 1101172

>>1101136
> g — форматирует число с плавающей запятой в десятичной или десятичной экспоненциальной форме в зависимости от значения и точности
http://ru.cppreference.com/w/cpp/io/c/fprintf

1 дек, 20:29 153 1101175

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

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

Ответы101177

1 дек, 20:32 154 1101177

>>1101175
Да-да, всегда очень сложно заставить себя переосмыслить что-то, вдолбленное на этапе обучения как best-practice.

Ответы101182

1 дек, 20:47 155 1101182

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

1 дек, 21:57 156 1101238

>>1101167
>при free() куче приходится вытаскивать из свопа
Где-то в 2k18 остался своп?

Ответы101251

1 дек, 22:11 157 1101251

>>1101238
А куда он денется?

12 Кб, 511x221
1 дек, 23:13 158 1101291

Хули оно в терминал срёт?

"&> /dev/null" же.

Ответы101297

1 дек, 23:20 159 1101297

>>1101291
"2> /dev/null"

Вопрос снят.

2 дек, 00:27 160 1101342

Анончики, написал прогу по переводу из одной системы счисления в другую. Поддерживается диапазон систем счисления от 2 до 16. Максимально на ввод можно подавать строку из 13 символов. Вот исходник: https://github.com/Digitalvalues/num-sys/blob/master/source0
Если у кого-то есть время, пожалуйста, гляньте, скажите, что можно улучшить в плане памяти. То есть, в каких местах можно поработать с динамическим выделением памяти. А то я просто написал массивы, типа, char array[100]. Чтобы строка уж точно влезла. Так ведь неправильно делать? Нужно как-то через malloc? Я просто с этим еще толком не разбирался. Поэтому буду благодарен, если кто-то приведет хотя бы 1-2 примера переписанных строк моего исходника.
P.S. Если в коде почти ничего не понятно - могу закомментить его. Только попросите.

Ответы101368101377101715

2 дек, 01:41 161 1101368

>>1101342
глядя на твой код, память это последнее, о чём тебе надо беспокоиться

2 дек, 01:54 162 1101377

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

Ответы101520

2 дек, 14:18 163 1101520

>>1101377
Можно поконкретнее? В основной части программы идет только проверка наличия точки в записи числа, а затем уже вызов нужных функций для перевода. Что подразумевается под словом "простыни"?

Ответы101585

2 дек, 16:42 164 1101585

>>1101520
вроде не плохо , я сам тоже учу си , а про malloc
int a // указатель на будущий массив
n = 10// кол-во эл в массиве
a =(int )malloc(nsizeof(int)); //выдляем памяти на 10 элементов по 4байта для каждой переменной типа int
for(size_t i=0; i<10;i++)
(a+i) =rand();

Ответы101587

2 дек, 16:44 165 1101587

>>1101585
>>1101585
https://pastebin.com/pa5PPrgj
c непохереными указателями

Ответы101651

2 дек, 18:30 166 1101651

>>1101587
Не понял смысл 3-ей строки. Там nsizeof? Нельзя же просто так переменную n перед функцией sizeof написать

Ответы101655

2 дек, 18:34 167 1101655

>>1101651
Он умножение забыл, очевидно же. Но лучше приучиться делать malloc(n ∗ sizeof(∗a)), тогда, если вдруг захочется какой-нибудь long long в массиве хранить, не придется мучительно искать, где ты забыл поправить sizeof.

Ответы101666

2 дек, 18:54 168 1101666

>>1101655
Хорошо. А как мы в этой строке a =(int )malloc(nsizeof(int)); преобразуем память в указатель? Вот, выделили мы 40 байт памяти. Как в указатель на int она конвертируется?

Ответы101674

2 дек, 18:58 169 1101667

И еще вопрос: допустим, возьмем мою программу по переводу из одной системы счисления в другую. И попробуем перевести из 16 системы в 10 число 0.FF. Когда программа выполняется, я получаю ответ 0.996094. Хотя на самом деле должно быть 0.99609375. То есть в double типе после точки может быть только 6 цифр. Поэтому компилятор автоматически округляет 0.99609375 до 0.996094. Что делать? Как в дробной части можно получать больше, чем 6 цифр?

Ответы101684

2 дек, 19:01 170 1101674

>>1101666
Там звездочки проебались. Хотя вроде итак понятно

2 дек, 19:13 171 1101684

>>1101667
Точность для %g указывай. Это ведь ты спрашивал? Или руками преобразовывай.

Ответы101691

2 дек, 19:26 172 1101691

>>1101684
Я не понял. Причем тут %g? И как преобразовывать руками?
Повторюсь: допустим есть переменная double value.
И у меня написано
value = 15(1/16)+15(1/256);
printf ("value = %f\n", value);
Вывод будет 0.996094
Как получить 0.99609375?

Ответы101692

2 дек, 19:31 173 1101692

>>1101691
Повторюсь: укажи блять точность! А %g у тебя или %f - не имеет значения.
printf ("value = %.72f\n", value);

Ответы101694101701

2 дек, 19:36 174 1101694

>>1101692
А, понял, спасибо. Хотя странно, что это не делается автоматически. А сколько максимально может быть цифр в дробной части?

2 дек, 19:44 175 1101701

>>1101692
И еще, вот указал я точность %.72f. Он мне вывел 72 цифры после точки. Т.е. 0.9960937500000000000... Как сделать так, чтобы выводило только то количество цифр в дробной части, которые будут значащими. То есть если value = 0.1, то будет выводить 0.1, а если value = 0.11111111111, то будет выводить 0.11111111111

Ответы101702101707

2 дек, 19:49 176 1101702

>>1101701
Находи остатки от деления на 10^x, где x-порядок интересующего разряда (целое).
И пока они не ноль, выводи остаток, умноженный на 10^-x, приведённый к целому типу)0000)))00000

Ответы101709

sage 2 дек, 20:00 177 1101707

>>1101701
Вот буквально вчера говорилось: >>1101167 Это ведь ты и спрашивал?

Ответы101708

2 дек, 20:10 178 1101708

>>1101707
Аааа, спасибо. Да это я и спрашивал. Но там был вопрос немного в другом - как от ненужных нулей избавиться. Поэтому просто написал %g вместо %f. Однако сегодня столкнулся с проблемой того, что если в дробной части больше 6 цифр, то %g так же, как и %f, округляет до 6 цифр после запятой. Сейчас еще раз перечитал тот пост и сделал по первому способу. (Т.е., например %.100g). Тогда у меня все работает, как надо. Спасибо еще раз, и сорян, если помучал вас тут вопросами

Ответы101749

2 дек, 20:12 179 1101709

>>1101702
Спасибо, но подсказали еще получше альтернативный способ. %.100g

2 дек, 20:25 180 1101715

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

Ответы101732

2 дек, 20:43 181 1101732

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

Ответы101754

sage 2 дек, 21:01 182 1101749

>>1101708
Ну это на самом деле костыльный способ, потому что текстовое представление double может быть очень длинным (denormals, да и просто большие числа). Наслаждайся: https://ideone.com/JyE5Qp

Ответы101855101866

2 дек, 21:09 183 1101754

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

2 дек, 23:28 184 1101855

>>1101749
да, я понимаю, что способ костыльный. Но ведь если double будет очень длинным. (очень маленькое число, как в твоем примере), то можно просто написать %.10000000000g. Мы ведь от этого ничего не потеряем? Ну, если число будет маленьким, то лишние нули он уберет, а если число будет очень маленьким (много цифр в дробной части), то оно все равно влезет в такой диапазон.

Ответы101866

sage 2 дек, 23:54 185 1101866

>>1101855
> %.10000000000g
4000 с хуем символов - это минимум, который по стандарту должен поддерживаться всеми. Для double хватит (длиннее, чем в >>1101749 не сделать), а вот для long double уже нет.

3 дек, 20:38 186 1102388

Подскажите, почему double x = 14.000000000000 конвертируется в 13, а не в 14, при записи int(x)?

Ответы102400

3 дек, 20:47 187 1102400

>>1102388
вопрос снят

4 дек, 01:36 188 1102553

>>1095677 (OP)
почему sizeof(char) =1 byte, а sizeof(указатель на char) =4 byte& И вопрос как система понимает язык программирования что мы определяем переменную типа int и называем ее i ,так вот как это i связано с реальной памятью и что можно почитать на этот счет

Ответы102560102561102568

sage 4 дек, 01:46 189 1102560

>>1102553
> почему sizeof(char) =1 byte, а sizeof(указатель на char) =4 byte
Потому что один байт может принимать всего 256 значений, поэтому если указатель занимает один байт - он может адресовать лишь 256 байтов памяти. Если тебе нужно 4 гига, тебе понадобится больше байтов в указателе, чтобы хранить больше знеачений.

> система понимает язык программирования что мы определяем переменную типа int и называем ее i
Никак. Информация о типах по большей части теряется на этапе компиляции (остаются размеры), имена тоже теряются, вместо них компилятор выбирает позицию в памяти (или позицию относительно начала кадра стека), чтобы хранить переменную.
> что можно почитать на этот счет
"Код" Петцольда, потом Танненбаум, если осилишь.

4 дек, 01:50 190 1102561

>>1102553
>почему sizeof(char) =1 byte
По стандарту. Вообще sizeof возвращает не в байтах, а в char-х, потому sizeof(char) всегда 1. Размер указателя диктуется архитектурой процессора.
char, по сути, это минимальный адресуемый кусок памяти. Название не очень удачное, но что поделать.

> И вопрос как система понимает язык программирования что мы определяем переменную типа int и называем ее i ,так вот как это i связано с реальной памятью и что можно почитать на этот счет

Компилятор компилирует машинный код, который содержит понятные для компьютера "инструкции". Если интересно что дальше читай Таненбаум "Архитектура компьютера".

Ответы102562

4 дек, 01:51 191 1102562

>>1102561
>Компилятор компилирует код программы в машинный код
быстрофикс

4 дек, 02:12 192 1102568

>>1102553
>почему sizeof(char) =1 byte, а sizeof(указатель на char) =4 byte&
Тебя наверное смущает, что нет смысле передавать в функцию указатель на char, если тебя интересует только значение этого char'a? Ну да, не имеет, но указатели используются не только для экономии на копировании при передаче в функцию. Иногда, например, в функции нужно поменять в памяти значение char'a, не возвращая его из функции, тогда передают указатель на него. Но чаще указатель на char это указатель на начало большого куска памяти, т.е. на целую кучу этих char'ов, которые идут непрерывно в памяти, начиная с переданного указателя. Например, так указатели на строки передают.

4 дек, 23:37 193 1103197

Как реализован макрос NULL в stdlib.h? Чекнул вики, но не совсем все понял. В вики сказано, что NULL - это целочисленное нулевое значение. Т.е. я спокойно могу написать свой собственный NULL? #define MYNULL 0 Будет ли это аналогично дефайну стандартного NULL?

Ответы103198

4 дек, 23:39 194 1103198

>>1103197

да

Ответы103201

4 дек, 23:42 195 1103201

>>1103198
Тогда почему инициализация указателей NULL'ом считается нормальным действием? Ведь в адресе 0 могут хранится какие-то данные. Например, часть переменной. С тем же успехом можно инициализировать указатели значением 3211351, вместо NULL

Ответы103204103243103315

sage 4 дек, 23:46 196 1103204

>>1103201
> Ведь в адресе 0 могут хранится какие-то данные
Не могут (запрещено стандартом). В винде, например, специально из-за этой особенности сишечки запрещает выделять первые 4к виртуальной памяти.

> С тем же успехом можно инициализировать указатели значением 3211351, вместо NULL
Можно. Но проверять на ноль дешевле, чем на 3211351.

Ответы103206

4 дек, 23:52 197 1103206

>>1103204
> запрещает выделять первые 4к виртуальной памяти
А что значит "4к". 4Кб? Сорян за возможно глупый вопрос.
>Можно
Тогда уж нельзя. Ведь если в 0 точно не может быть никаких данных, то по адресу 3211351 они могут быть

Ответы103212

5 дек, 00:02 198 1103212

>>1103206
Хотя было бы странно запрещать выделять целые 4Кб памяти - слишком много. Но я все равно не понял, что подразумевается под "4к"

Ответы103256

sage 5 дек, 01:31 199 1103243

>>1103201
NULL это не "нулевой адрес".

Ответы103256

sage 5 дек, 03:02 200 1103256

>>1103243
Да, стандарт разрешает и другие представления нулевого указателя, но в реальности оно практически везде ноль.

>>1103212
> слишком много
Лол, у тебя гигабайты на компе. 4 килобайта - это ровно страница. Управлять доступом к объектам размером меньше страницы нельзя.

5 дек, 08:12 201 1103302

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

sage 5 дек, 09:12 202 1103315

>>1103201
>Тогда почему инициализация указателей NULL'ом считается нормальным действием?

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

5 дек, 15:53 203 1103474

Указатель содержит адрес только на первый байт блока памяти или на весь блок? Или же вообще на начало и конец блока?
int *p;
int main () {
p = malloc(40);
return 0;
}
В этом коде видно, что мы выделили блок памяти в куче размером 40 байт, и (как написано в интернете) функция malloc возвращает адрес на начало этого блока указателю p. То есть, если так можно выразиться, указатель лишь знает адрес первого байта (или бита?) всего этого блока, верно? Но в указателе, вернее, в адресе, который в нем хранится, нет никакой инфы о том, когда этот блок заканчивается, так?

Ответы103483

5 дек, 16:05 204 1103483

>>1103474
Только на первый байт. (Языком стандарта будет точнее сказать, что на первый char.)

> То есть, если так можно выразиться, указатель лишь знает адрес первого байта (или бита?) всего этого блока, верно?
Верно. Не бита, на минимальный адресуемый кусок памяти на твоей машине, которым по стандарту является char. Обычно это 1 байт.
> Но в указателе, вернее, в адресе, который в нем хранится, нет никакой инфы о том, когда этот блок заканчивается, так?
Да, так. Так что размер блока нужно либо хранить отдельно, либо помечать в конце блока памяти его конец (так делается со строками, например, в конце ставится '\0', он же 0).

Ответы103494

5 дек, 16:38 205 1103494

>>1103483
Если указатель хранит адрес только на первый байт всего блока, то как тогда функция free() высвобождает всю выделенную память блока? Возьмем опять же такой код и добавим free
int *p;
int main () {
p = malloc(40);
free(p);
p = NULL;
return 0;
}
Как ф-ия free понимает, что ей нужно освободить 40 байт памяти, а не 1? Ведь p содержит адрес только на начало первого байта всего блока.

Ответы103511103604103609103806104882

5 дек, 17:04 206 1103511

>>1103494
Это проблемы ОС, она хранит инфу о том что кому выделено, из кода эту инфу в большинстве случаев получить нельзя (потому что управление памятью нетривиальная задача, разные ОС решают её по разаному).

Ответы103521103546

5 дек, 17:26 207 1103521

>>1103511
Хорошо, спасибо

5 дек, 18:13 208 1103546

>>1103511
> Это проблемы ОС, она хранит инфу о том что кому выделено
В данном случае, это проблемы стандартный либы, в которой malloc и free реализованы, ОС тут ни при чём.

Ответы103549103550

5 дек, 18:25 209 1103549

>>1103546
https://en.wikibooks.org/wiki/The_Linux_Kernel/Memory
Для примера.

5 дек, 18:31 210 1103550

>>1103546
Ну строго говоря да, ты прав, наверное. Конкретно тут libc рулит, не зазглядывал в сорс. libc сорт оф ассоциирую с самой ОС.

5 дек, 20:49 211 1103604

>>1103494
Тебе это знать не положено.

5 дек, 20:55 212 1103609

>>1103494
В K&R есть одна из реализаций malloc.
У неё есть размеры выделенных кусков кучи, указатели на начала, она ещё пытается интеллектуально выделять

6 дек, 10:10 213 1103806

>>1103494
Куча (heap) устроена как двусвязный список.

Если вычесть из твоего указателя 8 или 16 байт, нетрудно найти заголовок области в куче. А оттуда получить указатели на предыдущую/следующую области.

Алсо, там ещё и флажки есть.

Ответы103810

6 дек, 10:23 214 1103810

>>1103806
>Куча (heap) устроена как двусвязный список.
Ты нам из 70-х пишешь?

Ответы103840104331

sage 6 дек, 11:09 215 1103840

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

6 дек, 14:56 216 1103953

http://www.agner.org/optimize/calling_conventions.pdf

6 дек, 16:13 217 1103990

void func(int @p) { int i = 5; p = &i; }
...
int @p;
func(p);
printf("%d\n", @p) // -421423441 (мусор)

В данном случае функция "func" работает с локальной копией указателя, правильно? А передать в функцию сам указатель нельзя?

Ответы103992103993104244

6 дек, 16:17 218 1103992

>>1103990
Можно, передай указатель на указатель. void func(int p) ...

Ответы103993

6 дек, 16:19 219 1103993

>>1103990
void func(int✡✡ p)
быстрофикс
>>1103992-няша

Ответы103998104027

6 дек, 16:25 220 1103998

>>1103993
О как круто! Спасибо.

6 дек, 17:19 221 1104027

>>1103993
Я хотел еще один вопрос задать, на счет закомментированного кода по ссылке, но в ideone даже так не работает, нолик выдает. Почему?
https://ideone.com/esDAHP

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

Ответы104045104053

6 дек, 17:42 222 1104045

>>1104027
А хотя я все понял. Ты же мне и так дал ответ - указатель на указатель.

https://ideone.com/0kJObR Нормально? На хосте функционирует прекрасно, хотя тут почему-то все равно не работает.

6 дек, 17:46 223 1104053

>>1104027
int i = 5;
✡p = &i;

в ✡p теперь указатель на кусок памяти, аллоцированный на стеке в функции. После того как функция выполнилась её память уже может содержать что угодно. В общем это ошибка так писать код. На ideone стек зануляется видимо, потому и выводит 0.

Самое близкое по смыслу это было бы выделить память в функции:

void func(int ✡✡pp) // переименовал, чтобы было понятно, что это указатель на указатель, меньше путаться будешь
{
int ✡i = malloc(sizeof(int)); // выделяем память
✡pp = &i;
}

int main(void)
{
int ✡p;
func(&p);

printf("p: %d\n", ✡p);

free(p); // освобождаем

return 0;
}

Закомментированный код сегфолит, потому что ты передаешь ✡gp в функцию (printf("gp:%d\n", ✡gp);), что означает "взять значение по указателю gp и передать это значение в функцию", дальше компилятор без спроса приводит типы и интепретирует это значение как указатель на указатель. Тут может упасть аж в двух местах, если gp действительно куда-то указывает (gp != 0), то упадёт при попытке доступа на запись в этот кусок памяти (если, конечно, не случилось чудо и твой передайнный в функу int не нумерует какой-то твой кусок памяти, в этом случае прочитаются какие-то левые данные). Если gp = 0 (что вполне возможно для глобальных переменных, не помню точно зануляются ли глобальные переменные по стандарту), то упадёт прямо при вызове функции, т.к. ты пытаешься нулевой указатель разыменовать (это термин такой, "разыменовать указатель — получить значение из памяти, куда указывает указатель").

6 дек, 17:46 223 1104053

>>1104027
int i = 5;
✡p = &i;

в ✡p теперь указатель на кусок памяти, аллоцированный на стеке в функции. После того как функция выполнилась её память уже может содержать что угодно. В общем это ошибка так писать код. На ideone стек зануляется видимо, потому и выводит 0.

Самое близкое по смыслу это было бы выделить память в функции:

void func(int ✡✡pp) // переименовал, чтобы было понятно, что это указатель на указатель, меньше путаться будешь
{
int ✡i = malloc(sizeof(int)); // выделяем память
✡pp = &i;
}

int main(void)
{
int ✡p;
func(&p);

printf("p: %d\n", ✡p);

free(p); // освобождаем

return 0;
}

Закомментированный код сегфолит, потому что ты передаешь ✡gp в функцию (printf("gp:%d\n", ✡gp);), что означает "взять значение по указателю gp и передать это значение в функцию", дальше компилятор без спроса приводит типы и интепретирует это значение как указатель на указатель. Тут может упасть аж в двух местах, если gp действительно куда-то указывает (gp != 0), то упадёт при попытке доступа на запись в этот кусок памяти (если, конечно, не случилось чудо и твой передайнный в функу int не нумерует какой-то твой кусок памяти, в этом случае прочитаются какие-то левые данные). Если gp = 0 (что вполне возможно для глобальных переменных, не помню точно зануляются ли глобальные переменные по стандарту), то упадёт прямо при вызове функции, т.к. ты пытаешься нулевой указатель разыменовать (это термин такой, "разыменовать указатель — получить значение из памяти, куда указывает указатель").

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

6 дек, 17:47 224 1104054

>>1104053
>✡pp = &i;
Надо только ✡pp = i; вот так, раз i теперь не int, а указатель на int.

оередной быстрофикс

Ответы104057

6 дек, 17:50 225 1104057

>>1104054
void func(int ✡✡pp) // переименовал, чтобы было понятно, что это указатель на указатель, меньше путаться будешь
{
int ✡i = malloc(sizeof(int)); // выделяем память
✡i = 5;
✡pp = &i;
}

Точнее вот так, извините за спам. :(

Ответы104059

6 дек, 17:54 226 1104059

>>1104057
void func(int ✡✡pp) // переименовал, чтобы было понятно, что это указатель на указатель, меньше путаться будешь
{
int ✡i = malloc(sizeof(int)); // выделяем память
✡i = 5;
✡pp = i;
}

последний фикс, обещаю

Ответы104063

6 дек, 17:56 227 1104063

>>1104059
Спасибо, стало понятнее.

Теперь тут все правильно, верно? https://ideone.com/lJGQsm

Ответы104071

6 дек, 18:05 228 1104071

>>1104063
Ну в целом да, только free забыл, не забывай про free, а то память терять будешь.

Ну и лишний код (я так понимаю ты просто играешься для понимания):

int ✡✡p;
p = &gp;
func(&*p);

можно поменять на

int ✡p;
func(&p);

и обойтись без gp.

Ответы104072

6 дек, 18:08 229 1104072

>>1104071
Нет, мне именно с gp нужно. Пытаюсь на простом примере понять, как сделать нечто похожее в основном программе. В принципе понял.

Ответы104074

6 дек, 18:10 230 1104074

>>1104072
Тогда так:
func(&gp);

Ответы104083

6 дек, 18:29 231 1104083

>>1104074
У меня там именно гора указателей на указатели, указывающие на указатели на указатели, указывающие на указатели.

Вот как раз еще один вопрос в связи с этим. Я в таких дебрях не понимаю ничего.
Есть указатель на указатель - var1, который указывает на var2 - тоже указатель на указатель, который указывает на var3 - обычный указатель на int.
Как мне обращаясь к var1 проверить NULL ли var3 или не NULL?

Просто if(var1 == NULL), как я понимаю, не то выдает.

Ответы104094

23 Кб, 787x472
6 дек, 18:54 232 1104094

>>1104083

Ответы104097

28 Кб, 787x472
6 дек, 18:56 233 1104097

>>1104094
ДА БЛЯТЬ пофиксил картинку

Ответы104118

6 дек, 19:14 234 1104118

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

6 дек, 19:24 235 1104124

>>1095677 (OP)
А Си уже скоро ВСЁ? Всё-таки есть Rust, GO или хотя бы C++.. Может не стоит его даже учить?

Ответы104130104334

6 дек, 19:30 236 1104130

>>1104124
Не скоро.

Плюс стоит учить, даже если не будешь активно писать на нём, чтобы понять как современные компьютеры и ОС работают (указатели, стек, куча, cache & locality).

8 Кб, 167x285
6 дек, 20:25 237 1104179

Еще вопрос на счет указателей, не могу гуглу его сформулировать нормально.

Как обратиться к переменной "i" через "var"? Которая в функции. Компилятор говорит, что тип "type_ *" не структура, нельзя к нему мол через "->".

Ответы104196

6 дек, 20:48 238 1104196

>>1104179

-> автоматический разыменовывает указатель, а . нет

typedef struct {
int i;
} type_;

int main(int argc, char const *argv[])
{
type_ t;
type_✡ pt = &t;

// это всё одно и то же
t.i = 6;
pt->i = 3;
(&t)->i = 1;

return 0;
}

И у тебя код упадёт как пофиксишь ->. Потому что ты определил указатель на структуру, но этот указатель никуда не указывает. Надо или определять структуру на стеке (как я сделал выше) или выделить самому память через malloc (+free не забудь): type_ ✡var = malloc(sizeof(type_))

Ваще почитай книжки из шапки или ты чёто хочешь руками починить просто?

Ответы104217

4 Кб, 542x53
6 дек, 21:06 239 1104217

>>1104196
Погоди, ты же на вопрос не ответил. К var->i в мейне я обратиться могу, а к вот к var->i в "func" - нет, потому что в "func" var это указатель на указатель, в мейне же var - просто указатель. Или я что-то недопонял?

> Потому что ты определил указатель на структуру, но этот указатель никуда не указывает.
Это понятно, по-быстрому примерчик написал, не учёл. У меня код не компилируется, в этом проблема.

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

Ответы104220

sage 6 дек, 21:10 240 1104220

>>1104217
>К var->i в мейне я обратиться могу, а к вот к var->i в "func" - нет, потому что в "func" var это указатель на указатель, в мейне же var - просто указатель.
Зделай в func из указателя на указатель просто указатель и сможешь обратиться.

Ответы104226

6 дек, 21:18 241 1104226

>>1104220
Но в таком случае в func отправится локальная копия указателя, а не сам указатель. Разве нет?
Путаюсь очень, извини.

Ответы104228

6 дек, 21:21 242 1104228

>>1104226
Из-за очерёдности применения операторов. (✡var)-> сделай

Ответы104244

6 дек, 21:36 243 1104244

>>1104228
Именно это я и хотел услышать, спасибо.

Но мне все равно не понятно как именно нужно указатели в функции передавать.
Как я понимаю этот >>1103990 код не работал из-за того, что я манипулировал с памятью непосредственно во вторичной функции "func". Если бы в мейне, сразу после объявления "int @p" я сделал "= malloc(sizeof(int));" и отправил в func уже инициализированный указатель, то все бы успешно ему присвоилось, потому что память эта выделена в мейне, в основной программе.

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

Ответы104251104271

6 дек, 21:50 244 1104251

>>1104244
Указатели на указатели используются если в функции нужно выделить память. Такой стиль некоторые ругают и говорят, что пары malloc+free лучше держать на одном уровне в коде. Ну некоторым функции выделять память норм и много есть таких API. Я лично сильного мнения по этому вопросу не имею, не пишу на С особо. Почитай книжки по Сишечке, вполне возможно в каких-то этот вопрос обсуждается.

Ну и вот линк глянь: https://stackoverflow.com/questions/13442375/best-practice-for-allocating-memory-for-use-by-a-function-malloc-inside-or-out

Есть свои плюсы и минусы в обоих подходах. Например если функция выделяет память, то в main не надо знать размер данных заранее и т.п.

Ответы104278

6 дек, 22:38 245 1104271

>>1104244
> То есть, в принципе, можно обойтись без указателей на указатели - обычные указатели использовать. Но считается ли это хорошим стилем?
При чём тут стиль? Это зависит от того, что тебе нужно. Если тебе надо, чтобы функция вернула указатель, то какие проблемы. Алсо, она может вернуть его через return, а не через аргументы, и тебе не надо передавать указатель на указатель.

6 дек, 22:47 246 1104278

>>1104251
Можно использовать оба подхода в одной функции. Если переданный указатель указывает на NULL, то память аллоцируется. Если не NULL, то не алллоцируется. Так getline() работает, например. https://linux.die.net/man/3/getline

7 дек, 01:14 247 1104331

>>1103810
Я знаю как она здесь устроена, видел исходные тексты.

7 дек, 01:17 248 1104334

>>1104124
Только что с собеседования, типа им нужен спецiалист со знанием C++11.

Ага, счас... начали с устройства энторнетов и эthернетов, дошли до вычислений на списках, и тут я им видимо понравился и они объявили, что «C++11» это типа замануха была. ЧИСТЫЙ СИ И ТОЛЬКО ОН и какие-то свои стандарты кодирования.

Ну, я с готовностью согласился.

Ответы104524

7 дек, 14:40 249 1104524

>>1104334
устройства интернетов это сети и дальше? Кст поздравляю надеюсь работа понравится

Ответы104752

7 дек, 21:26 250 1104752

>>1104524
Да, первый том Ричарда Стивенса и всё то, что уровнем выше.

7 дек, 22:36 251 1104779

Как можно вычислить максимальное значение типа int, если sizeof(int) = 4?
Написал я
int max;
max = int(pow (2, sizeof(int)8)-1);
printf("max = %d\n", max);
Но при возведении двойки в восьмую степень идет переполнение типа на единицу. Соответственно, если даже потом делаю -1, все равно вижу мусор в результате. Возможно ли высчитать максимальное значение int, используя переменную signed int?
И еще, попробовал сделать через unsigned int, а именно:
unsigned int max;
max = unsigned int(pow (2, sizeof(int)8)-1);
printf("max = %d\n", max);
Казалось бы, простая задача в 3 строки, но при практическом выполнении возникают трудности

Ответы104780

7 дек, 22:37 252 1104780

>>1104779
Фикс

Там, где нужно умножение (символ "звездочка") оно есть, просто двач не отображает

Ответы104786

7 дек, 22:46 253 1104786

>>1104780
не знаю что ты там написал. пользуйся сдвигами да и всё. 1L<<31 | (1L<<31)-1L

Ответы104787104791

7 дек, 22:58 254 1104787

>>1104786
Даже сдвиги не нужны.

https://pastebin.com/Sf7vgcVi

Ответы104789104792

7 дек, 23:03 255 1104789

>>1104787
я думал ему нужен знаковый - хуй поймёшь.

Ответы104790

7 дек, 23:05 256 1104790

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

7 дек, 23:05 257 1104791

>>1104786
Я ошибся с первой частью. Так норм работает, переполнения нет.
int max;
max = int((pow(2, sizeof(int)8-1) - 1));
Однако, все же остался вопрос. Почему в таком коде получаю просто 0 в консоли?
unsigned int max;
max = unsigned int(pow(2, sizeof(int) 8));
С побитовыми сдвигами еще не разбирался. Понимаю, что принцип несложный, но даже сам оператор << вижу впервые.

Ответы104795

7 дек, 23:09 258 1104792

>>1104787
Лол, спасибо. Так тоже прикольно. Не знал, что можно printf'ить тип.

7 дек, 23:12 259 1104794

Все, разобрался со всей своей фигней. Сорян, что тупил, у меня уже поздно, да и ел мало сегодня. Через pow все-таки все удалось сделать. И signed и unsigned. Однако еще узнал, что можно сделать это через битовые сдвиги (почитаю про них) и просто printf нужного типа. Так что еще раз спасибо

7 дек, 23:14 260 1104795

>>1104791
>int((pow
Чё за int блядь? Это функция? У меня твоё говно не компилируется.

Ответы104797

7 дек, 23:22 261 1104797

>>1104795
Не компилится, потому что двач не отображает символ звездочки (умножение) в постах. Вот фул тогда https://pastebin.com/8Xht7fU4

Ответы104798

7 дек, 23:30 262 1104798

>>1104797
> Не компилится, потому что двач не отображает символ звездочки (умножение) в постах.
Nope. Я спалил звёздочку. Не в ней была проблема.

https://pastebin.com/LUT7fzhw

Ответы104803104808

7 дек, 23:40 263 1104803

>>1104798
Не компилится, потому что это крестопарашный синтаксис, а не сишный.

Ответы104808

7 дек, 23:53 264 1104808

>>1104798
Действительно, проверил в другом компиляторе (онли Си) там выдает ошибку.
>>1104803
Как тогда в Си писать преобразование в тип?

Ответы104809

8 дек, 00:10 265 1104809

>>1104808
Методом тыка обнаружил, что правильно преобразовать типы в Си надо так: (int)(a), а не int(a). Потому что в таком случае int(a) компилятор ожидает декларирования новой переменной, отсюда и ошибки.

8 дек, 05:48 266 1104860

Есть задание: напишите двоичное представление числа -117 типа signed char в дополнительном коде. Что это значит и какое будет представление?

Ответы104866

8 дек, 06:41 267 1104866

>>1104860
Ухади

Ответы104869

8 дек, 07:06 268 1104869

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

Ответы104870

8 дек, 07:09 269 1104870

>>1104869
При записи числа в дополнительном коде старший разряд является знаковым.

сказать где я это нашел?

Ответы104872

8 дек, 07:13 270 1104872

>>1104870
Ты не совсем прав.
Чтобы число записать в дополнительном коде надо все его биты инвертировать и прибавить единицу. Учите основы аноны, это важно.

Ответы104873

8 дек, 07:18 271 1104873

>>1104872
>инвертировать и прибавить единицу.
зачем? хуйня какая то
00000001 - 11111110 -> 00000001

Ответы104875

8 дек, 07:37 272 1104875

>>1104873
вобщем почитал, вопрос снимается.

8 дек, 08:00 273 1104882

>>1103494
>Если указатель хранит адрес только на первый байт всего блока, то как тогда функция free() высвобождает всю выделенную память блока? Возьмем опять же такой код и добавим free
>int *p;
>int main () {
>p = malloc(40);
>free(p);
>p = NULL;
>return 0;
>}
>Как ф-ия free понимает, что ей нужно освободить 40 байт памяти, а не 1? Ведь p содержит адрес только на начало первого байта всего блока.

https://github.com/lattera/glibc/blob/master/malloc/malloc.c

Ответы104984105003

8 дек, 14:10 274 1104984

>>1104882
слишком многа букаф, ниасилил

8 дек, 14:42 275 1105003

>>1104882
os знает сколько байт по начальному адресу чанк занимает

Ответы105152

8 дек, 20:39 276 1105152

>>1105003
>os знает
Да нихуя она не знает.

Ответы105303

9 дек, 08:24 277 1105303

>>1105152
>Да нихуя она не знает
а кто память выделяет, а, мамка твоя?

9 дек, 14:07 278 1105349

http://www.opennet.ru/docs/RUS/zlp/002.html

Тут чуваки поясняют за мультифайловое программирование (в главе 2.2). Их код у меня не компилится ибо файл с main'ом не видит функции, которые он вызывает. Я конечно мог бы объявить функции в том же файле с main'ом, а реализацию уже в другой, но почему у меня их код не работает? или он и не должен?

Ответы105362

9 дек, 14:20 279 1105355

Пытаюсь распарсить json по этому гайду
https://kt48.wordpress.com/2015/03/03/basic-tutorial-on-json-glib-for-tizen/
С файлом из гайда все парсится, а с моим не работает. Выдает
Json-CRITICAL : json_object_get_object_member: assertion 'JSON_NODE_HOLDS_OBJECT (node) || JSON_NODE_HOLDS_NULL (node)' failed
Что не так то?

Ответы105592

9 дек, 14:49 280 1105362

>>1105349
C99 требует прототип функций. Гайд старый, писался под C90

Олсо, мейк-файл там идиотский.

sage 9 дек, 20:00 281 1105592

>>1105355
Ну тебе же написали: ты вызываешь json_object_get_object_member() на том, что не является JSON-объектом (на массиве, например) или вообще пихаешь туда NULL.

Ответы105621

9 дек, 21:23 282 1105621

>>1105592
Действительно там массив, только не пойму чо делать если внутрь массива напиханы объекты.

Ответы105624

9 дек, 21:28 283 1105624

>>1105621
json_node_get_array()
json_array_get_length()
json_array_get_element()

Ответы105656

9 дек, 22:59 284 1105656

>>1105624
Разобрался.

9 дек, 23:37 285 1105669

Не туда пишу, наверное, но пох
Писал в школе проги на паскале, решил вкатиться в си, поставил code::blocks и mingw. Охуел с того, что нельзя запускать отладчик для файлов, только для проекта. Насколько понял, в проекте есть только один сурс(в котором, собсна, и находится единственная main), в который подключаются функции, описанные в куче хедеров.
Я правильно понял, или как? Мне что, каждое упражнение из K&R в отдельный хедер ну или в один писать функцией, а его в main.c подключать, а там инициализировать свои проги в виде функций? Или а каждую прогу уровня "подсчитайте строки" новый проект создавать? Что за бред?
Короче, разъясните дауну, шо це проект, и как с ним работать.

Ответы105680

10 дек, 00:28 286 1105680

>>1105669
> Насколько понял, в проекте есть только один сурс
Ты неправильно понял. В проекте может быть сколько угодно исходников и сколько угодно хедеров. Но одна main(), да. В любом из этих исходников. Еще у проекта есть куча настроек (директории, ключи компилятору, подключаемые либы), поэтому многие IDE и хотят проект для компиляции.

> Мне что, каждое упражнение из K&R в отдельный хедер
В K&R большинство упражнений не требует нескольких файлов, поэтому и декларации можешь делать не в хедере, а вверху файла. Если тебе лениво создавать один проект на программу, можешь создавать каждый раз новый .c-файл, класть его в проект, а старый удалять из проекта (можешь придумать кучу вариций: ничего не удалять, а делать #if (EXERCISE==1) ... #endif вокруг функций упражнения, и, соответствено, где нибудь выше делать #define EXERCISE 1; можешь даже диспетчер упражнений наговнокодить, который будет вызывать exerciseN_main, можешь просто такие мелкие вещи компилять из командной строки).

Ответы105751105794

10 дек, 10:53 287 1105751

>>1105680
Добра тебе
ушёл курить структуру программы на си

10 дек, 12:50 288 1105794

>>1105680
а ещё он может не пользоваться IDE и его проблема исчезнет

Ответы105885

10 дек, 13:14 289 1105799

Что делать, если вылетает на строчке
char prefix = malloc(512);
пишет:
malloc(): memory corruption: 0x0000561162c24df0
Aborted

Ответы105828105950

10 дек, 15:14 290 1105828

>>1105799
добавить звездочку

Ответы105839

10 дек, 15:49 291 1105839

>>1105828
Да есть звездочка, это макаба сожрала.

10 дек, 17:41 292 1105885

>>1105794
на самом деле бесит это, все эти проекты, лишние файлы - сам когда-то ебался с кодблоксом. и естественно переход на емакс всё решил по итогу.

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

Ответы105949

10 дек, 19:44 293 1105949

>>1105885
> просто набрасываю в одной опции строки с командами да и всё
Ну вот когда тебе заебется безусловно перекомпилировать все файлы в большом проекте при изменении какой-нибудь ни на что не влияющей константы, ты осилишь makefiles или cmake, гарантирую. А насчет мелочи соглашусь, проще сделать cc *.c и не думать.

Ответы106027

10 дек, 19:45 294 1105950

>>1105799
> вылетает на строчке
> malloc
Смотреть, кто повредил кучу ДО этого вызова. Очень помогает gcc или clang с ключиком -fsanitize=address.

10 дек, 21:10 295 1106027

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

может это и через мекфайл можно - не знаю, не вижу смысла, возможно пока.

13 дек, 15:57 296 1107006

Анонче, почему в студии сборка Debug-версии .exe и Release-версии .exe различаются по размеру самого .exe файла и по скорости выполнения программы? Вот абсолютно одинаковая программа при сборке в Debug весит 37КБ, а при сборке в Release - 10Кб. Помимо этого, Debug версия программы не проходит тест на время, а Release проходит, т.е. релиз работает быстрее. Компилятор оптимизирует релиз лучше, чем дебаг? Тогда почему бы сразу не оптимизировать дебажную версию так же, как релизную?

Ответы107009

13 дек, 16:02 297 1107009

>>1107006
В дебаг версии отладочная информация. Релиз версия с флагами оптимизации.

Ответы107015

13 дек, 16:12 298 1107015

>>1107009
Какая именно отладочная информация? Можно поточнее? И что подразумевается под флагами оптимизации?

Ответы107035

13 дек, 17:02 299 1107035

>>1107015
>Какая именно отладочная информация?
куки браузера и пароли из реестра

Ответы107085

13 дек, 17:26 300 1107050

Что пишут на си? Я имею ввиду оплачиваемый кодинг или швободный софт.

Ответы107161107175

13 дек, 18:38 301 1107085

>>1107035
А если серьезно?

13 дек, 21:43 302 1107161

>>1107050
давно я такой платины не видел

13 дек, 22:22 303 1107175

>>1107050
>Что пишут на си?
В СНГ почти ничего. Забудь о Си, как о языке, на котором ты будешь зарабатывать деньги.

14 дек, 18:16 304 1107533

Посоны, решил вкатиться в клэнг, но обосрался.
Подскажите, как на шиндовсе компилировать программы, написанные с посторонними библиотеками?
В вижуал студии все тривиально было: добавляем .lib и .h в проект, .dll в папку проекта, профит.

Погуглил, написано с флагом -I/-L можно указывать путь к библиотеке, но ничего не работает:
- если не изменять библиотечные хедеры, ругается на <уголки> и просит "кавычки"
- Если поставить в библиотечных хедерах кавычки, то появляются "unresolved external symbol"-ы.

Как сделать правильно?

Ответы107606

14 Кб, 668x261
14 дек, 20:30 305 1107606

>>1107533
> Как сделать правильно?
Именно так, как ты описал. Должно работать. На пике пример: в C:\library лежат хедеры и сама либа libfoo. Если задать пути через -I и -L, то все компилируется, ни на какие кавычки не ругается. Если у тебя проблемы, добавь шлангу ключ -v и смотри, что конкретно идет не так.

Ответы107607107939

14 дек, 20:32 306 1107607

>>1107606
Бля, наебался, в общем если #include с <угловыми скобками> все тоже норм, никаких предупреждений (да и откуда им взяться?).

14 дек, 21:32 307 1107618

34 Кб, 827x33034 Кб, 838x333

>>1095677 (OP)
объясните, пожалуйста, что произошло

Ответы107622

14 дек, 21:46 308 1107622

>>1107618
Где произошло? Почему у тебя появилось желание написать тут свой вопрос?

Ответы107625

14 дек, 21:48 309 1107625

>>1107622
стрелочки, зеленая где щас, красная некст степ, как за 1 сажек исчезло стока буковок, там же тока условие цикла

Ответы107629107632

14 дек, 21:56 310 1107629

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

Ответы107636107640

14 дек, 21:58 311 1107632

>>1107625
Там полноценный цикл с пустым телом (точку с запятой в конце видишь? - это тело).

Ответы107639107640

14 дек, 22:01 312 1107636

>>1107629
ок, указатель по шагает вперед, пока не натыкается на массив1, какая строка после етого из массива2 вычетает массив1

Ответы107639

14 дек, 22:03 313 1107639

>>1107636
>>1107632

14 дек, 22:03 314 1107640

>>1107632
>>1107629
сори гайз, в глаза ебусь, спасибо за потраченное время

15 дек, 14:52 315 1107939

>>1107606
Дословно повторил написанное тобою, получил:
C:\gsl>clang -Igsl -Lgsl gsl_sf_bessel.h
clang.exe: warning: argument unused during compilation: '-Lgsl' [-Wunused-command-line-argument]
gsl_sf_bessel.h:36:10: fatal error: 'gsl/gsl_mode.h' file not found
#include <gsl/gsl_mode.h>

Зато совет добавить ключик -v помог. Я догадался засунуть хедеры в одну из папок списка "#include <...> search starts here:" (думаю, решение оправдано, потенциально это очень важные хедеры и они будут использоваться в различных проектах не реже stdio).
Теперь возникает лишь ошибка линковщика, который не может найти .либ и .длл.
Я читал, что у переходящих с вижуал студии на консольные программы людей могут случаться ожоги ануса. Но даже не догадывался, что они будут столь болезненны.

Ответы108072

15 дек, 19:39 316 1108072

>>1107939
> C:\gsl>clang -Igsl -Lgsl gsl_sf_bessel.h
Т.е., ты пытался в пути к инклудам добавить текущую папку? Тогда надо было -I. или -IC:/gsl (да, винда умеет в прямые слеши).

Ответы108074

15 дек, 19:41 317 1108074

>>1108072
А я опять в глаза ебусь. В общем, смотри, у тебя либа хотела, чтобы ее инклудили как #include <gsl/whatever.h>, т.е., в пути к инклудам тебе нужно было добавить не текущую, а родительскую папку (допустим, C:/), тогда оно бы отлично открыло C:/gsl/gsl_mode.h.

Ответы108121

15 дек, 21:55 318 1108121

>>1108074
Я так и сделал. Проблемы с хедерами решены, нужно линковщику рассказать про либ и длл.

А вообще, мне сказали, чтобы я не занимался этой ерундой, использовал интеловский компилятор и из дополнительных библиотек MKL и опенмп. Якобы лучше этого уже нет. Возможно, MKL в самом деле прекрасно оптимизирована, но библиотеки гну имеют гораздо более качественные мануалы и проще в использовании (сравниваю нелинейную оптимизацию в мкл и в пакете gnu nlopt).

Спасибо за помощь.

16 дек, 00:50 319 1108187

Может быть такое, что gcc не съедает объявление струтуры типа
struct opa
{
int n;
};
а что-то типа
define struct
{
int n;
} opa;
ест без проблем. Сразу извиняюсь за разметку.

Ответы108192108222108369

16 дек, 00:59 320 1108192

>>1108187
>define
typedef
ошибся

16 дек, 01:43 321 1108222

>>1108187
Это нормально. В Си, в отличие от крестов, имена (теги) структур и enum-ов не являются именами типов. Т.е.: struct opa { int foo; }; typedef double opa; вполне валидный код, после этого struct opa var1; создаст структуру, а opa var2; - переменную с плавающей точкой. А вот когда ты делаешь typedef (в том числе и typedef struct), ты создаешь именно имя для типа. Можешь совместить typedef и определение структуры (typedef struct opa { ... } opa ), тогда сможешь создавать переменные и через struct opa v1, и просто через opa v2;.

Ответы108334

16 дек, 14:23 322 1108334

>>1108222
Понял, спасибо.

16 дек, 16:07 323 1108369

>>1108187
я не понял, почему у тебя gcc не съедает твоё определение структуры. Что ты вообще имеешь в виду под "не съедает"? Не компилится? Вроде всё валидно.

17 дек, 19:44 324 1108898

Суп. Аноны, в шараге мне очень нравилось прогать AVR-ки и другие атмеги на ассемблере. Щас понял что хочу этим заниматься серьезно. Но если объективно посмотреть на вещи, то работы для меня не будет, верно? У меня даже вышки нет, значит и на производство не возьмут скорее всего.

17 дек, 22:21 325 1108978

Сука поцоны я затрахался. Указатели на указатели на указатели в массиве. Блять.

17 дек, 22:41 326 1108987

Как инициализировать указатель на массив указателей на строки? Если так:
char s[] = { "str1", "str2"}; - то нужно обращаться через индекс, как к массиву.
Так вообще не собирается:
char s = { "test", "t"};

И почему тогда argv можно обявлять как argv и argv[]?

Ответы108988108993

17 дек, 22:43 327 1108988

>>1108987
Да ебучая макаба
char s[] = { "test", "t"};
char s = { "test", "t"};

argv и argv[]

14 Кб, 425x152
17 дек, 22:46 328 1108989

17 дек, 23:03 329 1108993

>>1108987
> И почему тогда argv можно обявлять как
Потому что массив в аргументах функции неявно преобразуется к указателю на первый элемент. У тебя не аргументы, поэтому разница есть. Можешь сделать так (C11): char ∗∗s = (char ∗[]) { "foo", "bar", "baz" }; или просто отдельно сделать массив и присвоить его отдельному указателю.

18 дек, 07:31 330 1109093

std::vector<type> items(count);
Это что-то вроде:
type items[count]; ?

Или иначе?

354 Кб, 640x480
18 дек, 11:55 331 1109149

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

https://godbolt.org/g/ZVSUsh

Ответы109175109183109197

18 дек, 13:54 332 1109175

>>1109149
>Байты ебать не нужно
байты нужно ебать всегда самому

18 дек, 14:16 333 1109183

>>1109149

У тебя код кстати не правильный - в ахптимизированной функции у тебя матрица умножается как column major, а во второй функции - как row major.

Ответы109217

18 дек, 15:11 334 1109197

>>1109149
https://godbolt.org/g/9yAVBL

Ответы109217

18 дек, 15:37 335 1109217

>>1109197

Угу, поправив косяк >>1109183
и заменив Ofast на Os получил в итоге

https://godbolt.org/g/UhR5kD

1к1

Ответы109222

18 дек, 15:44 336 1109222

>>1109217

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

Ответы109223109228

18 дек, 15:50 337 1109223

>>1109222
>какого хера кококмпилятор с кококооптимизационными ключами -O2 и -O3 генерит какую то длинную хуету
Называется loop unrolling

18 дек, 15:57 338 1109228

>>1109222
> какого хера кококмпилятор с кококооптимизационными ключами -O2 и -O3 генерит какую то длинную хуету
Потому что пытается оптимизироваться, избавляясь от циклов и вызовов функций?

18 дек, 17:53 339 1109266

Занялся изучением C и вразу же возникла проблема. При выполнении программы вывод отстаёт ровно на один цикл. Я просто не понимаю в чём проблема. Разхясните для дауна пожалуйста

[code]#include <stdio.h>
#include <stdlib.h>

int main() {
int A = 0, Num = 312, i = 0;
srand(58);
Num = 0 + rand() %1000;
printf("enter num\r\n");
scanf("%d\n",&A);

for (;;) {

if (A > Num) {
printf("Your number is bigger then %d\r\n", Num);
}
if (A < Num){
printf("Your number is lesser then %d\r\n", Num);
}
if (A == Num){
printf("You win!");
return 0;
}
}

}[/code]

18 дек, 17:53 339 1109266

Занялся изучением C и вразу же возникла проблема. При выполнении программы вывод отстаёт ровно на один цикл. Я просто не понимаю в чём проблема. Разхясните для дауна пожалуйста

[code]#include <stdio.h>
#include <stdlib.h>

int main() {
int A = 0, Num = 312, i = 0;
srand(58);
Num = 0 + rand() %1000;
printf("enter num\r\n");
scanf("%d\n",&A);

for (;;) {

if (A > Num) {
printf("Your number is bigger then %d\r\n", Num);
}
if (A < Num){
printf("Your number is lesser then %d\r\n", Num);
}
if (A == Num){
printf("You win!");
return 0;
}
}

}[/code]

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

18 дек, 19:31 340 1109290

>>1109266
Ну чё никто не знает чтоли?

Ответы109292

18 дек, 19:38 341 1109292

>>1109290
У тебя Num равен нулю, похоже на то.

Ответы109293

18 дек, 19:39 342 1109293

>>1109292
Num = (0 + rand() %1000);
Нет не из-за этого

18 дек, 19:51 343 1109299

int d[5] = { 8 };
for (int i = 0; i < 5; i++) {
printf("%d\n", d);
}
На выводе получаю:
8
0
0
0
0
Разве весь массив не должен инициализироваться цифрой 8? Почему только первый элемент массива 8, а остальные нули?

Ответы109317

18 дек, 20:51 344 1109316

Ребятки, помогите, пожалуйста. Использую Debian, gcc пишет, что
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/6/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include

/usr/lib/gcc/x86_64-linux-gnu/6/include - здесь лежат .h файлы, но какие-то не те, которые я использую в своих хеллоуворлдах
/usr/local/include - пустая
/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed - то же самое, что и /usr/lib/gcc/x86_64-linux-gnu/6/include
/usr/include/x86_64-linux-gnu - много заголовочных файлов, в том числе папка sys, файлы которой я использовал, когда изучал сокеты
/usr/include - тоже много заголовочных, судя по названиям, это стандартная библиотека

Везде заголовочные, но где реализация? Вот у меня установлена libc6 (гнушная реализация), с помощью dpkg -L, я нашёл её расположение, но там одни .so файлы, это и есть она? По названиям файлов я бы не сказал, что это она. Скачал сорсы на официальном сайте gnu.org/s/libc , там всё красиво и понятно - куча .c файлов, заходи, изучай, всё понятно.

Читал K&R, Прату. Всё равно плаваю в этих вопросах, для меня всякие библиотеки, которые я использую, - это магия. Знаю, что этим занимается линкер, и всё. Ситуацию усугубляет то, что в gnu/linux я новичок.

1) Где реализация, откуда линкер подтягивает реализацию стандартной библиотеки? Неужели это те .so файлы? Ну не похожие названия и всё!
2) Когда я пилил хеллоуворлд на сокетах, использовал заголовочные файлы из директории sys/. Это ведь не часть стандартной библиотеки. Я правильно нагуглил, что это C POSIX library?

Ответы109325109327

18 дек, 20:54 345 1109317

>>1109299
Нет, не должен. Если ты хоть как-то инициализируешь составной объект (тот же массив или структуру), то те части, которым инициализаторов не хватило, заполняются нулями. Можешь об этом думать наоборот так: при инициализации объект сначала заполняется нулями, а потом в него втыкаются инициализированные значения. Это нормально и удобно. А если хочешь заполнить массив каким-то значением, отличным от нуля - заполняй в цикле.

>>1109266
scanf() твоя проблема. Во-первых, перед началом матчинга числовых спецификаторов scanf() сам пропускает все пробельные (isspace()) символы. Во-вторых, когда scanf() видит ЛЮБОЙ пробельный символ (в том числе и \n) в форматной строке вне спецификатора (как у тебя), это заставляет его пропустить ВСЕ пробельные символы, начиная с текущей позиции ввода (вообще всё, что isspace()!) до тех пор, пока не найдется какой-то не-пробел.

Ты вводишь 10 и нажимаешь Enter: scanf() видит %d, читает 10, видит в форматной строке \n, начинает пропускать пробельные символы: \r (если у тебя винда), \n, дальше ты пока ничего не ввел, а не-пробел так и не найден. И scanf() ждет, пока ты введешь еще что-нибудь. Ты вводишь 20, scanf() видит не-пробел и возвращает прочитанную 10. Такие дела. Выкинь нахуй \n вообще, потому что см. выше "во-первых".

Ответы109318

18 дек, 21:04 346 1109318

>>1109317
Спасибо. Заработало

18 дек, 21:14 347 1109325

>>1109316
Тебе нужны libc.a и/или libc.so. .a - это архивы объектных файлов (потыкай в них командой ar: ar t libc.a), они содержат уже скомпилированный код и используются для статической линковки - линкер ищет символы (имена внешних переменных и функций) в указанных тобой объектниках, а если там они не найдутся, ищет в либах. Если в одной из либ имя найдется, он берет из либы соответствующий .o и помещает его содержимое в программу. .so - это примерно то же самое, но это динамические библиотеки (shared object), они не вставляются в твою программу, а загружаются при ее загрузке. После этого происходит "позднее связывание" - точно так же в сошках ищутся символы, а ссылки из твоей программы на эти символы правятся так, чтобы они указывали на функции или переменные из сошки. Использование .so не почти не влияют на размер программы, зато позволяет авторам какого-нибудь дырявого openssl латать свой говнокод, не заставляя тебя перекомпилировать твою программу. Ну и память экономится за счет того, что программы не таскают в своем теле каждая свою копию либы, а либа просто грузится в память и совместно используется всеми зависящими от нее программами.

> Я правильно нагуглил, что это C POSIX library?
Функции, работающие с сокетами - обертки вокруг системных вызовов, и, насколько я помню, частью POSIX не являются. Но это все сорта одного говна.

Ответы109344

18 дек, 21:21 348 1109327

>>1109316
> 1) Где реализация, откуда линкер подтягивает реализацию стандартной библиотеки? Неужели это те .so файлы? Ну не похожие названия и всё!
Натрави на свой скомпилированный бинарник ldd и он тебе популярно напишет с какими либами он слинкован.
> 2) Когда я пилил хеллоуворлд на сокетах, использовал заголовочные файлы из директории sys/. Это ведь не часть стандартной библиотеки. Я правильно нагуглил, что это C POSIX library?
Если ты говоришь о системных вызовах (секция под номером 2 в man'е), то они реализованы в ядре. Обёртки же системных вызовов всё равно реализованы в стандартной библиотеке.

Ответы109344

18 дек, 22:16 349 1109344

>>1109325
>>1109327
Спасибо вам большое! Стало гораздо понятнее всё. Открыл .so в mc - как раз там видно имена всех функций из стандартной либы.
Ещё один вопрос остался - если моя программа использует .so, то получается клиент тоже должен его иметь. Соответственно, мне к моей программе нужно приложить в том числе и все .so файлы на случай, если клиент скачает, скажем, её с моего сайта? А если её захотят залить в репозиторий, то мейнтейнер скорее всего выкинет этот .so и просто пропишет зависимость к пакету с этим .so (если он уже есть в репозитории, конечно)?

Ответы109395

19 дек, 00:04 350 1109395

>>1109344
Да, на этот случай в линуксах есть пакетный менеджер. Распространять бинарные сборки тоже лучше в форме пакетов. Что же касается мейнтейнера, то он в любом случае будет собирать твою программу из исходников, поэтому пиши в ридми (или сразу в .configure, или в CMakeLists.txt, или чем ты там собираешь), что нужно для компиляции. Вот если будешь писать и под винду тоже, тогда да, придется положить соответствующие DLL в комплект бинарной сборки.

Ответы109668

160 Кб, 876x656
19 дек, 14:00 351 1109562

Срочно нужно решение

Ответы109566111178111187

19 дек, 14:08 352 1109566

>>1109562
Я так понимаю это олимпиадка какая-то, нахуй взялся если не хочешь думать? Сам решай

19 дек, 15:11 353 1109581

Есть ли заказы на фрилансе? И если есть то какой сложности?

Ответы109584

19 дек, 15:27 354 1109584

>>1109581

В основном эмбед+иногда драйвера под линух. Но вообще нужно понимать, что си - это все же не для фриланса, потому что во втором десятилетии 21 века на нем (кроме поддержки легасни) пишут как правило связанное с железками/компоненты ядра/части бэкэндов всяких высоконагруженных хуевин, опять же связанных с прямым взаимодействием с ядром. И все это, как ты сам понимаешь, в основном связано с хлебной узкоспециализированной должностью "Ублажителя машин" и "Казановы байтов" в какой-либо конторе.

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

Ответы109669109676

19 дек, 19:25 355 1109668

>>1109395
Ещё раз спасибо!

19 дек, 19:29 356 1109669

>>1109584
>связанное с железками/компоненты ядра/части бэкэндов всяких высоконагруженных хуевин
А десктопные приложение на Си - исключение? Вот GTK же на Си

Ответы109670

19 дек, 19:30 357 1109670

>>1109669
>приложение
приложения

19 дек, 20:27 358 1109676

>>1109584
Чому тогда в Гейропках си второй по популярности язык после жавы? Кругом ембедед и модули ядра?

Ответы109677

19 дек, 20:35 359 1109677

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

19 дек, 22:19 360 1109706

Аноны, помогите с проблемой. В общем, есть текстовый файл с 1+ строкой. Например:
example
this is me
Мне нужно считывать строки, начиная со второй, до конца файла.
Т.е. я написал цикл
while (!feof(in)) {
...
}
Вопрос: как мне заставить функцию feof игнорировать первую строку? Т.е. начинать проверку на конец файла сразу со второй строки и до конца файла. Я так понимаю, что нужно просто указатель in сдвинуть на начало второй строки. Как это можно сделать? Какие вообще есть решения?
P.S. Пока в голову пришло только то, что я должен считать длину первой строки и изменять указатель in на in+strlen(первая строка), или вроде того.

Ответы109717109734

19 дек, 22:43 361 1109717

>>1109706
feof() так не работает. feof() позволяет лишь отличить ошибку от конца файла, когда какой-нибудь fgetc() и fgets() сфэйлится. После того, как оно сфэйлится, не до. Мжешь сделать так: https://ideone.com/76kW9W

Ответы109722

19 дек, 23:06 362 1109722

>>1109717
Хорошо. Но в твоем куске кода, как я понял, символы перевода строк \n и символ EOF запишутся в buffer. Так ведь?

Ответы109731

19 дек, 23:30 363 1109731

>>1109722
EOF не символ, а переводы строк, да, запишутся.

Ответы109736

19 дек, 23:34 364 1109734

>>1109706
> Вопрос: как мне заставить функцию feof игнорировать первую строку?
Тебе обязательно для этого использовать feof? Что тебе мешает считать первую строку и самому проигнорировать её?

Ответы109737

19 дек, 23:37 365 1109736

>>1109731
EOF - символ '-1'. Он запишется в buffer?

Ответы109789

19 дек, 23:41 366 1109737

>>1109734
если я считываю первую строку через fscanf(in, "%s", str), то указатель in смещается на '\n'? И смещается глобально для всех функций? То есть, если я потом напишу fgets(str2, 100, in), то в str 2 поместится символ '\n'?

Ответы109745109754

19 дек, 23:51 367 1109745

>>1109737
> если я считываю первую строку через fscanf
Что тебе мешает считать её через fgets?

Ответы109749

20 дек, 00:02 368 1109749

>>1109745
Если буду считывать через fgets(str, 100, in), то в str запишется "корова\n". То есть, помимо самого слова, запишется еще и символ перехода на строку. А мне нужно чистое слово. Удалять '\n' потом через str[strlen(str)] = '\0'? Немного костыльно.

Ответы109753109754110041

20 дек, 00:04 369 1109751

>>1095682
Потому, что чистый!

20 дек, 00:07 370 1109753

>>1109749
>>Удалять '\n' потом через str[strlen(str)] = '\0'
Удалять '\n' потом через str[strlen(str)-1] = '\0'
быстрофикс

Ответы109776

20 дек, 00:09 371 1109754

>>1109749
Не считывай строки через scanf(). У scanf() ебнутая логика, и ты обязательно напорешься на какую-нибудь херню. Например, если ты просто >>1109737 делаешь scanf(%s), то ты считаешь не строку, а слово, похеришь последовательности пробелов, пустые строки и тому подобные вещи. Не выделывайся, используй fgets и обрезай с конца пробелы. Например, простой фукнцией вида: ptr = string + strlen(s) - 1; while (ptr > string && (ptr[0] == '\r' || ptr[0] == '\n')) { --ptr; } ptr[0] = '\0';

Ответы109773

20 дек, 00:33 372 1109773

>>1109754
Хорошо, понял. Спасибо всем, кто отписал, я разобрался

20 дек, 00:56 373 1109776

>>1109753

20 дек, 01:36 374 1109789

>>1109736
EOF - не символ, а специальное значение-индикатор, которое специально сделали вне диапазона символов. getchar() может возвращать EOF, но это не char, а (int) -1, т.е., 0xffffffff на 32-битных машинах. fgets() вообще возвращает указатель, а не символ, и уж конечно не пишет никаких EOF в buffer - если в потоке остались символы, она запишет в буфер эти символы, а если не остались - вернет NULL.
Не путай сишный EOF с DOS-овым символом с кодом 26 (0x1a). Под виндой или досом сишную либу приучили считать символ EOF индикатором конца потока, если поток в текстовом режиме, но в строку он не попадает.

20 дек, 09:20 375 1109835

>>1098565
https://technet.microsoft.com/ru-ru/library/bb896653.aspx
https://technet.microsoft.com/ru-ru/library/bb896645.aspx

через эти смотри, а не через mmc.

20 дек, 09:23 376 1109836

Сап, ЗКач!

Подскажите, есть какие-то либы для GNU/Linux, которые бы позволяли мониторить/управлять демонами/сервисами? Может есть какой-то слой, который позволяет управлять демонами/сервисами?

Сейчас колхожу через системные вызовы с последующим парсингом. В гугле забанили. Благодарю заранее.

Ответы110032110166

20 дек, 16:37 377 1110032

>>1109836
libsystemd? Ессно, если systmed юзается. Я, правда, её ни разу не использовал, не знаю, предоставляет ли она возможность мониторинга/контроля сервисов.

20 дек, 16:46 378 1110041

>>1109749
fgets() сама по себе костыльна. Хорошо, что в POSIX есть божественный getline().

20 дек, 20:36 379 1110166

>>1109836
Если твоя система работает на systemd, что очень вероятно, то работаешь с ним по протоколу DBus через systemd-шную же библиотеку sd-bus. Сделать через нее можно абсолютно все. Проблема одна: dbus сам по себе угребищен и требует перестройки мозга, и если вдруг тебе попадется функция с динамическими параметрами (variadic), ты просто рехнешься их рекурсивно парсить километровыми свитчами. Причем в коде systemd все именно так.

У меня был такой опыт, только с плюсовой оберткой поверх sd-bus, так с позиции послезнания я бы сделал работу с systemd через dbus на скриптовом языке типа lua.

Ответы110177110183

20 дек, 20:49 380 1110177

>>1110166
> Причем в коде systemd все именно так.
код шиштемд это вообще какой-то тихий ужас, на первый взгляд, по крайней мере

Ответы110233

20 дек, 20:56 381 1110183

>>1110166
> DBus
Эээ, а он разве не требует десктопной среды?

Ответы110184

20 дек, 20:57 382 1110184

>>1110183
нет, с чего ты взял

21 дек, 01:14 383 1110233

>>1110177
А какой код не тихий ужас?

Ответы110314

21 дек, 10:19 384 1110302

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

Ответы110316

21 дек, 10:51 385 1110314

>>1110233
тот, который пишу я, очевидно же

21 дек, 11:00 386 1110316

>>1110302
Ты говоришь о том, что все объявленные функции надо обязательно вызывать в main? Как ты пришёл к такому выводу? Если ты не знал, то функции можно вызывать из любых других функций, не только из main.

21 дек, 17:40 387 1110484

>>1095682
Потому что VOID!

21 дек, 19:49 388 1110531

Дароу посоны, изучаю си по книжке. В примере по ссылке https://pastebin.com/a1rk5Zut по идее должен приниматься ввод с клавы, потом подсчитываться количество некоторых символов, и все подсчеты в конце должны вывестись в консоль. Но у меня после компиляции не происходит нихуя. Че делать?

Ответы110580110590

21 дек, 21:12 389 1110580

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

21 дек, 21:20 390 1110590

>>1110531
Что значит "не происходит нихуя"? конкретизируй проблему.

21 дек, 21:50 391 1110615

20 Кб, 285x43257 Кб, 918x205

помогите отладить функцию
>1 код
>2 ошибка
горит сдача

Ответы110623110627

21 дек, 21:56 392 1110623

>>1110615
Не используй функции с суффиксом _s. Не используй их, сука или поставь Visual Studio, там они есть.

Ответы110624

21 дек, 21:57 393 1110624

>>1110623
strcpy не робит, как тогда менять местами

Ответы110629

21 дек, 22:00 394 1110627

>>1110615
"#include ..." добавить забыл.

Ответы110630110631

21 дек, 22:00 395 1110629

>>1110624
> strcpy не робит
С чего бы вдруг? Тебе нужно ограничение по размеру? Сделай snprintf(dest, dest_length, "%s", src).

21 дек, 22:01 396 1110630

>>1110627
И давно у нас в glibc реализован C11/Annex K?

21 дек, 22:02 397 1110631

>>1110627
string.h подключено

21 дек, 23:05 398 1110670

Господа, в ваших силах посоветовать хорошую книгу для изучения крестов?

Ответы110675110677

21 дек, 23:11 399 1110675

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

Ответы110678

21 дек, 23:12 400 1110677

>>1110670
> одиннадцатые плюсы
Какой год на дворе, видел? А вообще, вам в крестотред >>1110566 (OP) || >>1099142 (OP)

Ответы110678110681110692

21 дек, 23:13 401 1110678

>>1110675
Мне не для работы. Для учебы.
>>1110677
Я думал тут все, что с си связанно, соррян

21 дек, 23:16 402 1110681

>>1110677
Какой сейчас последний стандарт сей?

Ответы110688

21 дек, 23:23 403 1110688

>>1110681
Сей - 11 (возможно, в следующем году выйдет новый), крестов - 17.

Ответы110692

21 дек, 23:31 404 1110692

>>1110677
> Какой год на дворе, видел?
>>1110688
> Сей - 11

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

Ответы110708

22 дек, 00:12 405 1110708

>>1110692
Ты дебил? Спросили про кресты, а не про Си, кресты 11 учить не имеет смысла.

22 дек, 02:06 406 1110738

Анончики, можете подсказать, какими способами можно выполнить перестановку элементов в массиве? Например, если дано
abc
То перестановки:
abc
acb
bac
bca
cab
cba
То есть, что думаете по поводу реализации перестановок? Может я странный, но я не вижу почти никакой логики в перестановке эелементов. Вернее, я не вижу способа воспроизвести алгоритм перестановки. Программу написать не проблема. Но хотелось бы понять, какой у перестановки алгоритм, чтобо делать это даже на обычном листочке с ручкой

Ответы110739110743110799110803

22 дек, 02:07 407 1110739

>>1110738
Пиздец, я миллион ошибок в тексте сделал, у меня 6 утра, сорян

22 дек, 02:26 408 1110743

>>1110738
символ 'c' двигается влево и затем в хвост.

Ответы110746

22 дек, 02:35 409 1110746

>>1110743
не, хуйня, каждый символ двигается влево

22 дек, 02:38 410 1110748

в какие интересные большие попенсурные сишные проекты можно покоммитить?

Ответы110750111142

22 дек, 02:57 411 1110750

>>1110748
>попенсурные сишные проекты можно покоммитить
linups kernel

Ответы110751

22 дек, 02:58 412 1110751

>>1110750
линукс говно, торвальдс пидор.

Ответы110756111130

22 дек, 03:10 413 1110756

>>1110751
>линукс говно, торвальдс пидор.
джвачую, остальное ты не осилишь

Ответы110757

22 дек, 03:15 414 1110757

>>1110756
>язык си
>не осилить

Ответы110761

22 дек, 03:41 415 1110761

>>1110757
>школочмоня

Ответы110762

22 дек, 03:42 416 1110762

>>1110761
>аргументы уровня /pr/

22 дек, 05:59 417 1110780

Шалом, Антон.
Вот решил вкатиться в сишечку и уже дошёл до указателей на функции. Чё посоветуешь почитать? Желательно такое, что бы много примеров с хорошими комментами. Хочу раскурить эту тему так, что бы аж торкнуло.

Ответы110800

22 дек, 08:21 418 1110799

>>1110738
А почему не в прикрепленный тренд?
Рекурсией:
1. Перестановку из одноэлементного множества как-нибудь придумаешь.
2. Предположим, что мы получили все перестановки множества из (n-1) элемента. Тогда для получения всех перестановок из n элементов мы должны для каждого элемента зафиксировать его на первом месте, а потом дописать к нему все возможные перестановки длинной (n-1)

22 дек, 08:34 419 1110800

>>1110780
Литература в шапке.
Как осилишь, попробуй запилить численное интегрирование либо решатель оду 1 порядка (Рунге-Кутта, например). В обоих случаях придется передавать функцию по ссылке.

Ответы110801

22 дек, 08:47 420 1110801

>>1110800
А что скажешь про это?
learnc.info
Нуб не испортит вкус и стиль после изучения этих материалов?

22 дек, 08:57 421 1110803

>>1110738
x % 3 выбор из 3х
x / 3 % 2 из 2х
x / 9 из 1го

Ответы110804

22 дек, 08:58 422 1110804

>>1110803
> x / 6 из 1го
хотя это не важно. всё равно один.

22 дек, 13:26 423 1110944

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

Ответы110963110979

22 дек, 13:47 424 1110963

>>1110944
А как ты собрался выделять память под указатель? Или ты про массив указателей?

Ответы110988

22 дек, 14:15 425 1110979

>>1110944
>если объявляем указатель на указатель char , то сколько памяти нужно выделить под первый указатель?

char huitka = malloc(sizeof(char)quantity);

Ответы110980

22 дек, 14:16 426 1110980

>>1110979
char ¤¤
char ¤

22 дек, 14:39 427 1110988

>>1110963
массив указателей

22 дек, 18:40 428 1111130

>>1110751
Почему?

22 дек, 18:48 429 1111138

x macros
мощь

22 дек, 18:53 430 1111142

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

Ответы111322

22 дек, 20:53 431 1111178

>>1109562
200$

Ответы111183

22 дек, 21:08 432 1111183

>>1111178
а что такое след?

Ответы111185111186

22 дек, 21:09 433 1111185

>>1111183
Произведение элементов главной диагонали?

Ответы111188

22 дек, 21:10 434 1111186

>>1111183
Загуглил, кроч, а там сумма.
Обосрамс(9(900

22 дек, 21:14 435 1111187

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

22 дек, 21:15 436 1111188

>>1111185
а я понял. но главная это что, лев-верх - низ-прав? а что такое диагональная матрица?

Ответы111190111193

22 дек, 21:17 437 1111190

>>1111188
Я думаю, очепятка. Имелось в виду "квадратная"

22 дек, 21:18 438 1111193

>>1111188
И, да, лив-верх-низ-прав. На главной диагонали индексы у элементов повторяются: a11, a22, ..., ann

Ответы111195

22 дек, 21:26 439 1111195

>>1111193
а ну ясно.

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

может запостить вам сюда парочку.

Ответы111200

22 дек, 21:31 440 1111200

>>1111195
Ты мне скажи, как мне Pi вычислить.
Пилить длинную арифметику я не буду, ибо придётся пилить "высоко" её, я низко ниасилю. Время впустую.
Соответсна, мне нужны алгоритмы, которые находят n-ую цифру числа Pi, не находя предыдущих.
Просто по цифре находить и выписывать.
Так и pthreads легко накрутить.
Сказано найти 10^ цифр - делишь на 4 потока, и каждый поток ищет и в файл с оффсетом записывает.
Из подходящих алгоритмов пока нашёл только формуллу Беллара. Но тут я встал в ступор, ибо она
>позволяет вычислить n-й разряд числа пи в двоичном представлении.
> в двоичном представлении
> двоичном
> 10000101111 00100000 10000110010 00100000 10001000001 10001000010 10001000011 10000111111 10000111110 10001000000 10000110101 00001010

Ответы111206111220

22 дек, 21:45 441 1111206

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

https://pastebin.com/xRpeYXfK

>>1111200
никогда об этом не думал. а арифметику я написал.

Ответы111207

22 дек, 21:46 442 1111207

>>1111206
> а арифметику я написал.
С флагами переполнения etc?

Ответы111209

22 дек, 21:49 443 1111209

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

Ответы111211

22 дек, 21:50 444 1111211

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

22 дек, 22:03 445 1111220

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

Ответы111221

22 дек, 22:05 446 1111221

>>1111220
Годноту нашёл, сасируй
https://bellard.org/pi/pi.c

Ответы111223

22 дек, 22:09 447 1111223

>>1111221
молодец, но нахуй его вычислять?

Ответы111226

22 дек, 22:14 448 1111226

>>1111223
Вот ты знаешь, зачем нужны бетховены?
Нормальная причина?

Ответы111229

22 дек, 22:16 449 1111229

>>1111226
и ты будешь постоянно вычислять пи вместо того, что бы брать из памяти уже вычисленный? оптимизация уровня /po

Ответы111230

22 дек, 22:17 450 1111230

>>1111229
Мне интересно, сколько MHash цифр даст моя машина за секунду, например.

Ответы111234

22 дек, 22:22 451 1111234

>>1111230
так ты еще и на cpu считаешь, а не на cuda? хм.

Ответы111236111241

22 дек, 22:23 452 1111236

>>1111234
А почему сразу CUDAH, если есть OpenCL?

Ответы111240

22 дек, 22:27 453 1111240

>>1111236
без разницы

22 дек, 22:27 454 1111241

>>1111234
Ну так:
> Why didn't you use a GPU (Graphics Processing Unit) ?
> The Pi computation algorithm I used is I/O bound, so the extra processing power of the GPU would not help much. What really matters is the speed of the hard disks. The question would be different if the computation could be done in RAM, but it is currently too expensive, at least for me !

Ответы111243

22 дек, 22:31 455 1111243

>>1111241
падажди, Pi это нормальное Пи которое уже вычислили до 2,7 трлн знаков после запятой, или это какое то пидерскоблокчайновское Пи?

Ответы111244111246

22 дек, 22:33 456 1111244

>>1111243
Нормальное

22 дек, 22:33 457 1111246

>>1111243
Слабо сохранить у себя эти 2.7 трлн?

Ответы111247

22 дек, 22:35 458 1111247

>>1111246
нет

Ответы111249

22 дек, 22:38 459 1111249

>>1111247
Вот мне 5 раз слабо

Ответы111250

22 дек, 22:39 460 1111250

>>1111249
а вычислять 60 дней не слабо?

Ответы111251

22 дек, 22:40 461 1111251

>>1111250
Так мне 6060 дней считать, так что всё нормально

23 дек, 04:05 462 1111322

>>1111142
Щас бы в говно правки делать. Пример хорошего проекта на си это пэхапе.

23 дек, 15:54 463 1111469

Читаю одну книгу, и вижу:
>Write your program from the top down
>Recall that you’re assuming your program will be read by someone. It makes logical sense for themain functions to appear first and support functions to appear later. A programmer can easily get to the core algorithm and read on further if necessary to get the details. The opposite method (and one generally encouraged by the Pascal school) forces the programmer to have to wade through the details firstt.

Дальнейших пояснений не приводится. Поясните, пожалуйста, что тут имеется в виду.

Ответы111473111522111531

23 дек, 16:13 464 1111473

>>1111469
Линк https://www.cs.rutgers.edu/~pxk/416/notes/C_Style.html

23 дек, 18:42 465 1111522

>>1111469
Это классические СОВЕТЫ НОВИЧКУ - любительские, авторские методики улучшения качества кода, как правило хуевые. Игнорируй.

Ответы111654

23 дек, 19:03 466 1111531

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

Ответы111659112167

24 дек, 04:59 467 1111654

>>1111522
Ну, он вроде разумные (в остальном) вещи пишет.

Ответы111656

24 дек, 05:12 468 1111656

>>1111654
Ну вот в остальном и читай. А это потом сам поймешь, в чем неправильно.

24 дек, 05:13 469 1111659

>>1111531
А по рефакторингу что почитать можно?
Не поймите неправильно, просто надоело писать говнокод.

Ответы111731112079

24 дек, 13:20 470 1111731

>>1111659
Почитай хорошо написанные исходники.

25 дек, 07:58 471 1112067

бля пытаюсь вкурить указатели а gcc руггается на звезду (разыменовывание)

Ответы112165

25 дек, 09:01 472 1112079

>>1111659
Тебе по рефакторингу или по написанию качественного кода?

25 дек, 09:56 473 1112089

Есть один сегфолт. Я знаю в какой функции он происходит. Как с помощью gdb найти причину? Голова кипит уже. Объясните.

Ответы112156

25 дек, 14:24 474 1112156

>>1112089
Ну это... компилируешь с -ggdb, говоришь gdb programname, run, оно тебе показывает строчку, на которой вылетело. А уж почему конкретно падает - разбираться тебе (info stack и select frame N, info locals и info args, print arrayname[1] * 2 + 3 и т. д.).

Ответы112157

sage 25 дек, 14:25 475 1112157

>>1112156
> select-frame
быстрофикс

25 дек, 15:13 476 1112165

>>1112067

Разыменовывай указатель. Сссылки и стековые переменные не разыменовываются.

Второй момент - к членам структуры по не разыменованному указателю - через стрелку, но к разыменованному - через точку.

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

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

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

25 дек, 15:19 477 1112167

>>1111531

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

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

Ответы112172

25 дек, 15:30 478 1112172

>>1112167
> Вот чего реально не хватает - так это перегрузки функций и операторов для структур.
На самом деле нет. В Хаскелле тоже нет перегрузок функций - и ничего, живем. А вот динамического полиморфизма в C нет, это да.

25 дек, 21:04 479 1112324

Аноны, написал для теста одного момента вот такой код:
#include <stdio.h>
#include <string.h>

int main() {
FILE "звездочка"in = fopen("input.txt", "r");
FILE "звездочка"out = fopen("output.txt", "w");
char a[100];
fread(a, 1, 100, in);
printf("length = %u\n", strlen(a));
fclose(in);
fclose(out);
return 0;
}
В файле in находится слово:
example
Запускаю программу. Получаю length = 7. (как и должно быть) Но иногда при запуске получаю length = 9. То почти каждый запуск программы дает разный результат: 7 или 9. Почему происходит такое неопределенное поведение? Откуда он берет еще 2 лишних символа?

Ответы112327112332

25 дек, 21:05 480 1112327

>>1112324
>То
то есть*

25 дек, 21:13 481 1112332

>>1112324
тебе fread возвращает кол-во считанных итемов, зачем strlen?
А в массиве у тебя помимо example куча мусора, там вообще может что угодно выдать, ибо strlen работает до \0

Ответы112349

25 дек, 21:28 482 1112349

>>1112332
А, понял, fread значит не добавляет автоматически нуль-терминатор в массив. Отсюда и разные результаты strlen'ом.
А если в файле есть такой текст:
random
example
На самом деле, он выглядит так:
random\n\0
exampleEOF
или вот так:
random\0\n
exampleEOF

Ответы112351

25 дек, 21:31 483 1112351

>>1112349
В файле нет нулей.
random\n

Ответы112355112357

sage 25 дек, 21:34 484 1112355

>>1112351
В файле может быть что угодно. Напишешь нули - будут нули. Собственно, в каких-нибудь объектных файлах таблица имен хранится как foo\0bar\0baz\0\0 для удобства парсинга сями.

Ответы112356

25 дек, 21:35 485 1112356

>>1112355
Ну блин, там анон написал в файл
example
random
Где он нули поставил?

25 дек, 21:39 486 1112357

>>1112351
Хорошо, спасибо.

26 дек, 22:34 487 1112910

Какие есть костыли, чтобы реализовать шаблоны в Сишке?

Ответы112916

26 дек, 22:51 488 1112916

>>1112910
#define TYPE int
#include "implementation.h" // Реализация использует TYPE вместо типа.
#undef TYPE

А также генерация кода макросами:
#define MAKE_FUNC(T) bool read_##T(T *dest) { ... }
MAKE_FUNC(uint32_t)
MAKE_FUNC(char)
MAKE_FUNC(uint32_t)
#undef MAKE_FUNC

А также _Generic в C11 для матчинга типов.

26 дек, 23:51 489 1112927

какое смузи пить по средам?

27 дек, 00:55 490 1112953

Как реализовать что-то аналогичное на Си?
stroka=stroka.Replace("\r\n", "\n");
Написал программу, а мне все испортила ебучая винда, которая, как оказалось, ставит не просто \n при переводе строки, а еще и предварительно \r. Теперь, чтобы не переписывать программу из-за такого замечательного нюанса, думаю просто заменить все \r\n на \n. Как это сделать максимально быстро? И как сделать вообще? Текстовый файл весит 140Мб.

Ответы112961112963

27 дек, 01:15 491 1112961

>>1112953
Ну это же программа уровня хелловорлда.
FILE ∗fpin = fopen("input.txt", "rb"),∗fpout = fopen("output.txt", "wb");
for (int c; (c = fgetc(fpin)) != EOF; ) if (c != '\r') fputc(c, fpout);
fclose(fpin); fclose(fpout);
Обработку ошибок сам. Если будешь читать не посимвольно, а кусками побольше, то будет заметно быстрее. Впрочем, на один раз и так пойдет.

Ответы112963112964

27 дек, 01:19 492 1112963

>>1112953
Неслушай этого >>1112961

Через sed прогони свой файл с удалением символа перевода каретки (\r).

На стак оверфлоу до хуя советов, но все велосипед и говнокод.

Ответы112966112968

27 дек, 01:22 493 1112964

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

Ответы113403

27 дек, 01:23 494 1112966

>>1112963
Я бы рад sed'ом все сделать. Но это нужно реализовать в самой программе. Есть идеи еще? В крестах же есть способ

Ответы112968112971

27 дек, 01:26 495 1112968

>>1112963
> все равно циклом каждый символ проверять
Один fread и один fwrite + цикл vs. много fgetc/fputc + цикл. Первое заметно быстрее хотя бы из-за отсутствия контроля ошибок и накладных расходов на вызов функций (и тех функций, которые fgetc/fputc вызывают внутри себя).

>>1112966
Так если у тебя не готовый файл, а именно программа, которая его генерирует, ты это... добавь "b" в fopen, и на винде не будет специального поведения для \n и \x2a.

Ответы112969112970

sage 27 дек, 01:28 496 1112969

>>1112968
> \x1a
Быстрофикс.

27 дек, 01:33 497 1112970

>>1112968
У меня именно готовый файл. Но в самой программе хотел заменить в этом готовом файле \r\n на \n, чтобы программа работала так, как задумывалось. Вариант с fread'ом fwrite'ом все-таки не подойдет. Для текстовика 140Мб займет лишние несколько секунд.

27 дек, 01:47 498 1112971

>>1112966
pcre библиотека тебе в помощь, либо читай файл построчно и вырезай символ перевода каретки.

Ответы112976

27 дек, 02:12 499 1112976

>>1112971
Ты посоветуй flex ему сразу, чего мелочиться? А может, фреймворк какой есть? Убрать \r - это же так сложно!

ПЕРЕКАТ # OP 27 дек, 03:16 500 1112994

СЛЕГКА ПРЕЖДЕВРЕМЕННЫЙ ПЕРЕКАТ >>1112990 (OP)
>>1112990 (OP)
>>1112990 (OP)
>>1112990 (OP)
>>1112990 (OP)

28 дек, 10:39 501 1113403

>>1112964
Охуеть, байтоебы пошли. БУФФЕРИЗАЦИЯ IO.

Мимо жабагосподин

Ответы113552

28 дек, 20:31 502 1113552

>>1113403
Уважаемый жабоеб, да будет тебе известно, что FILE в Си по умолчанию уже буферизированный. У нас тут разговоры о том, что чтение из буфера посимвольно может быть медленнее, чем чтение поблочно. Тебе про накладные расходы на вызов функций не понять, у тебя весь язык - сплошные накладные расходы на все.

Ответы113561

28 дек, 21:14 503 1113561

>>1113552
>fgetc
>буферизированный
нуну

Ответы113562

28 дек, 21:23 504 1113562

>>1113561
Да. Например, в glibc fgetc сводится к блокировкам и потом к чтению из буфера в _IO_getc_unlocked:
https://github.com/lattera/glibc/blob/a2f34833b1042d5d8eeb263b4cf4caaea138c4ad/libio/libio.h#L413
У Microsoft аналогично. Да, буферизацию можно отключить через setvbuf, но по умолчанию для файлов она есть.

Ответы113577

28 дек, 22:07 505 1113577

>>1113562
Да, был не прав, спутал с read(), лет 10 прошло с тех пор, когда спускался так низко.

Тред утонул или удален.
Это копия, сохраненная 30 января 2018 года.

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

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

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

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