24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Stephen Prata "C Primer Plus, 6th Edition" (2014) Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002) Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) "Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
Закатился и сразу вопрос, пишет кто что-то для себя на Си или это только рабочий момент? Решение реальных задач мне видится более интересным занятием чем перетирание задачников для студентиков.
>>801892 Я смотрю ты у мамы дурачок, если бы я хотел сферических задач в вакууме, то я бы порешал студентчские задачки (чем я и знанимался), а я ищу несложный совместный с аноном проект, где мы вместе могли бы сделать какую-нибудь полезную хуйню. Для самодостаточных опенсорсных проектов у меня маловато знаний.
>>801900 > несложный совместный с аноном проект, где мы вместе могли бы сделать какую-нибудь полезную хуйню Запросы типичного студента-дибила, так что все подтверждается.
>>801900 Так это, тебе все правильно сказали. Выбираешь, какая сфера интересна, идешь на гитхаб, ищешь проект и помогаешь по мере сил. Очень часто в Issues висят простенькие задачи, до которых просто руки не доходят ни у кого. Или тебе вот прямо необходимо именно с кем-нибудь из /pr/ что-то делать?
>>801836 (OP) Ананасы, как вы избегаете лесенок из if-then-else при проверке результата вызова функций? Вот написал функцию https://ideone.com/UPvigL и больше смотреть на неё не хочу, ибо она БЛЯТЬ СЛИШКОМ УЖАСНАЯ. Как можно сделать лучше?
>>801994 Что-то можно в одном условии по && или || проверить. Ну и как бы есть идиома: err = function(); if (err) { printf("pizdariki\n"); return; // Или, О БОЖЕ, goto cleanup; } И есть куча противников такого подхода. Разделяешь их мнение - заводи стейт, разбивай функцию на более мелкие. Хотя твою функцию однозначно стоило бы разбить код не читал.
>>801999 Предлагаешь просто разделить на более мелкие функции? Ну это очевидный, но не самый лучший вариант.
>>802001 Идиома будет еще хуже выглядеть, чем лесенка, если в функции появится куча хуйни, которую нужно будет деинициализировать/удалить/etc. goto конкретно в моем случае тоже будет плохо выглядеть. Наверное и правда надо разбивать функцию.
>>802071 Где там можно найти курс по алгоритмам на графах с показом профессионально реализованных алгоритмов на C++14? Интересует только правильная реализация, про сами алгоритмы можно и у Кормена почитать.
Анон, нужна помощь по задаче: "Задан целочисленный массив arr[30], в котором существует минимум 10 различных значений. Найти 10 по величине элемент массива." Доп. условие: оформлять в виде функций. Вот решение: http://pastebin.com/GJiripGh А на пике результат работы. Откуда там неизвестное значение после сортировки? По видимому это ноль, но что с ним стало? Спасибо.
>>802094 В stdlib.h есть банальный qsort. В задаче не запрещено?
> Откуда там неизвестное значение после сортировки? Выход за границу массива в строках 24-27.
Алсо, можно не сортировать весь массив, а хранить (и по желанию сортировать) только максимальные 10 элементов. Код от этого не усложнится, а вот бегать по массиву в строке 36 и ниже не придется.
>>802146 >и браться за K&R. Ты оттуда возьмешь максимум синтаксис Си хотя прочитать эту книжку надо обязательно. Курсы нормальные надо смотреть, а не говно для дебилов, сделанное такими же дебилами, да еще и на русском языке.
>>802146 Лел, кто будет на полном серьезе учить пузырьковой сортировке, она же интуитивно очевидна ньюфагу, я и то шкальником без всяких знаний алгоритмов как-то сходу нахуярил подобное? У Кормена например первый алгоритм это сортировка вставками. Код короче будет и выполняется она быстрее, но это зависит от входного массива. Алсо у тебя в коде необязательно в параметрах функции указывать массив с размером, всё-равно прилетает лишь указатель на первый элемент. Читай K&R, не разменивайся на говнокурсы.
>>802151 Я боялся браться за ритчи и кормена из-за их специальной направленности. с моим гуманитарным нужно было что-то общей направленности. Вот я и выбрал эти курсы
>>802151 > она же интуитивно очевидна ньюфагу До сих пор не могу нормально понять пузырьковую сортировку хотя и не особо старался, но все остальные могу по памяти реализировать.
>>802177 Ох да ладна. TI может бесплатно отправить контроллеры для обучения, если очень хорошо попросить. В любом случае предыдущий курс у них не так уж плох, особенно для гуманитария итт.
>>802186 И синтаксис, и примеры программ, и стандартная библиотека стандарта ANSI, и упражнения. Там даже быструю сортировочку обсуждают. Но всё-равно ограничиваться K&R не стоит, ведь есть C99/C11, а стандартная библиотека давно вышла за пределы, обсуждаемые в книжке.
>>802186 Книга действительно больше про си, нежели программирование, даже сам Ритчи это писал. >>802230 Можно Прату почитать, там рассказываются очень многие аспекты языка, описываются современные стандарты, да и есть темы, которых нет в k&r
>>802393 Как раз именно поэтому хорошо писать на си несложно, а вот на крестах хорошо пишут единицы. Предложение воткнуть замыкания в следующий стандарт есть, ссылка на черновик валяется в одном из предыдущих тредов, лень искать. Срач там же.
Анон, ты мне проясни, могу ли я целиком положиться на k&r и сидеть его ковырять, посматривая в интернет, в случае чего? Просто я его полистал и мне, в принципе понравилось, достаточно удобоваримо. Или всё-же надо параллельно ещё что-то изучать по алгоритмам? Или же за k&r вообще нубам браться не стоит? вчерашний гуман, с его копрокурсами
>>802621 Можешь. Алгоритмы и структуры данных надо ковырять, когда уже язык знаешь. А если у тебя трудности с пониманием указателей, или ты все еще ошибаешься на 1 в for(), какие уж тогда алгоритмы?
>>802626 Из предисловия ко второму изданию: "Книга не рекомендуется для чтения новичкам; для своего изучения она требует знания основ программирования и вычислительной техники"
Как именно работает приведение типов на низком уровне? Почему допустимо приведение маленького типа данных к типу данных, который занимает большее число байт в памяти? Можно ли как-то вызвать ошибку, приводя численные типы друг к другу?
>>803841 Хотя то, что я запостил, в самом деле может быть допустимым, потому что наверняка перед тем, как пушить число x на стек перед вызовом printf, ему выделяется большее число байт. Тогда в каком случае будет ошибка из-за разного количества байт в типе?
>>803841 > Как именно работает приведение типов на низком уровне? Хуй знает, что ты хочешь услышать. Конструируется значение нужного типа. Иногда несколькими инструкциями. Если что-то не влезло - обрезается. Если исходное значение наоборот слишком маленькое - добивается нулями или знаковым битом.
> Почему допустимо приведение маленького типа данных к типу данных, который занимает большее число байт в памяти? А почему бы и нет? Конкретно на x86 обычно делается movzx/movsx для всяких char->int и fild для int->double.
> Можно ли как-то вызвать ошибку, приводя численные типы друг к другу? Можно проебать значащие биты, проебать точность. Можно наебаться с signed/unsigned.
Сосоны. Такой вопрос. Короче хочу использовать библиотеку OpenCV, а в ней ебаные классы. Каким хуем бля я должен использовать в сишке плюсовые классы, ведь это бля сишная библиотека, ебаный в рот. Или что мне бля делать?
>>804047 >Каким хуем бля я должен использовать в сишке плюсовые классы, ведь это бля сишная библиотека, Сам-то понял что написал? Когда OpenCV стеной стать успела?
>>804284 Тогда это будет передача структуры, содержащей массив. А массив в чистом виде не передать.
>>804285 Это общепринятый перевод терминлогии, когда дело касается передачи аргументов. By reference (по ссылке) и by value (по значению). А уж каким образом достигается эффект - дело конкретного языка.
>>804337 >>804342 Да, теперь понял, о чем ты. 30 там вообще ни на что не влияет (пока это не int array[static 30]). Можно было с таким же успехом int array[0xcafebabe] написать. Это просто последствия копипаста - хоть и некрасиво, но не смертельно.
А int array[] vs. int ∗array vs. int ∗const array в параметрах - это вкусовщина уровня tabs vs. spaces.
>>804466 > что значит - передать по ссылке В более высокоуровневых языках это как раз и значит - передать вместо переменной указатель на нее (или что-то подобное) так, чтобы, когда ты меняешь аргумент, менялась переданная в этот аргумент переменная. При этом работу с указателями язык скрывает.
В сишечке же в этом смысле ничего не скрывается, все явно, никакой магии не делается. Если ты делаешь: int variable = 123; int ∗ptr = &variable; function(ptr); можно считать, что ты передаешь в функцию переменную variable по ссылке. Но также можно заметить, что функция-то принимает указатель, и этот указатель передается по значению, т.е., если ты изменишь указатель внутри функции, ptr не изменится.
>>804482 >При этом работу с указателями язык скрывает. Ну от языка многое зависит. В Perl также есть операции разыменовывания, передача указателей и всего такого. В питоне вообще нельзя ссылку передать на переменную так, чтобы потом она могла быть изменена внутри функции.
>>804513 > в питоне Ну как же нельзя-то? Просто тип int иммутабельный, его невозможно изменить без присваивания, а когда ты присваиваешь к аргументу значение, создается новый объект, а ссылка выкидывается, поэтому переданный по ссылке int в принципе никак изменить нельзя. А вот list мутабельный, и вот тебе классическая передача по ссылке: def foo(a): ....a.append('yoba')
b = [ 'allo' ] foo(b) print(b) Блять, тред про си, до чего мы дожили.
>>804527 ну я плохо выразился. Я имел в виду, что нельзя сделать так, чтобы в случае
b = ['allo']
нельзя передать ссылку на на эту переменную таким образом, чтобы внутри функции ты бы мог поменять значение этой переменной. Ты можешь менять сам объект. Но b во внешнем окружении как указывала на созданный массив ['allo'], так и будет на него указывать. Ты не сможешь сделать так, чтобы она стала указывать на int или на что-то ещё. В perl можно так сделать, например. Мне он видится очень похожим на C в этом плане.
>>802094 Вы чего тут развели? Я же сказал: "Иду по программе говно-курсов. Задача оттуда же. Указатели ещё НЕ проходил". Какая, блин, критика кода, если это моя 19 по счёту программа(считай хэлловорлд)? Сейчас, с лёгкой руки здешних обитателей, курсы послал и неспешно ковыряю K&R. Больше тред тупыми вопросами не засоряю. сорвавшийся ридонли гум
Возможно ли скрыть файл от процедуры получения списка файлов в папке? Эта процедура - readdir из Си(чистого). Пробовал делать файл невидимым (добавлял точку перед названием), но не помогло.
Может имеются программо-ориентированные файловые системы, которые имеют событие, реагирующее на создание файла?
У тебя height не unsigned случайно? Алсо, ты пишешь: Пока height меньше нуля и (в то же самое время) height больше десяти: вводи заново. Какое-то страное условие, не находишь? Тебе нужно || - или.
То есть есть функция "void func()", вне функции есть несколько двумерных массивовconst char massiv1[10][10], ей нужно обрабатывать один из них, конкретно который я укажу, но как указать сраный массив в аргументах функции чтобы работать с ним в самой функции? Вот тут, если кто не понял: void func(massiv1);
Алсо, почему const char massiv[][] не работает? Я хочу чтобы компилятор сам определял размер массива.
>>805215 Расчет адреса элемента array[j][k] для массива N×M сводится к array + j ∗ M + k. Если ты сделаешь аргумент вида int array[][], компилятор не сможет обращаться к массиву, потому что он не знает вот этой самой M, и ему неоткуда взять эту информацию. Поэтому в функцию ты можешь либо передать массив с одной фиксированной размерностью void func(int array[][123], ...) (для трехмерных массивов с двумя и т.д., не указывать можно только первую), либо сделать void func(int ∗array, size_t n, size_t m) и считать индекс "вручную", т.е., обращаться по array[j * m + k] (n в формуле не используется, но полезно, чтобы ограничивать j в циклах по массиву). Ну и немного упростить себе вызов функции, определив: #define COUNTOF(x) (sizeof(x) / sizeof((x)[0])) и сделав int array[2][3]; func(array, COUNTOF(array), COUNTOF(array[0]));
>>805237 Как угодно. В (∗funcptr)() язык преобразует выражение в первых скобках обратно к указателю перед вызовом. Если хочешь акцентировать внимание читающего на том, что это указатель - пиши с дереференсом. Если хочешь просто вызвать функцию - пиши без. Алсо, в funptr = &print_smth оператор & тоже необязательный, функция сама к указателю преобразуется.
>>805245 Не объявлять несколько переменных в одной строке (особенно, если есть еще и присваивания), не стесняться использовать временные переменные.
>>805261 Забыл добавить, что когда последняя размерность массива указана, у компилятора есть возможность заменить умножение чем-нибудь более быстрым, а вот если ты считаешь сам, компилятору придется умножать "честно".
>>805264 В стандарте языка объектами называются сущности в памяти. Например, значения переменных. Или то, что ты создал через malloc().
Помогите с make и clang, При компилировании через make ставится только один ключ -o. Как впилить в него -Wall, -l и т.д. чтобы не прописывать это всё время вручную через clang?
>>805459 Ну смотри: допустим у меня есть программа со сторонней библиотекой, и при компилировании я хочу увидеть все возможные предупреждения и ошибки. Мне надо писать "clang -ggdb -Wall -Werror -llibrary.h -hello.c -o hello" Если написать "make hello" то оно автоматом пропишет "clang hello.c -o hello". Мне нужно все те параметры впихнуть в make, чтобы не прописывать каждый раз заново через clang
>>805467 > автоматом Это магия, которую обеспечивают так называемые "неявные правила", к которым лучше не привыкать. Лучше напиши Makefile нормальный. Но если все же очень хочется, то можно задать соответствующие переменные окружения: CC=clang CPPFLAGS=-Weverything -Werror make hello (ну или не инлайном задавать, а export CPPFLAGS=-Weverything и т. д.).
>>805478 Моих навыков в Линукс еще недостаточно для того, чтобы провернуть такую операцию. Ну да ладно, написать полную строчку clang не составляет большого труда. И на этом спасибо.
чёт прям самому захлотелось подмен нахуярить. проблема в том, а как заменить dlsym? или как вообще, гарантировать что программа сделает call именно на мою функцию... пойду почитаю.
вообще, для начала, хотелось бы начать выполнять свой код раньше main'а другой программы. но что насчёт dlsym, то есть решение использовать "внутреннею" функцию glib, _dl_sym, которую вызывает dlsym.
в общем-то там такая цепь dlsym -> __dlsym -> static dlsym_doit -> _dl_sym -> do_sym (где и начинаются двиги)
не понятно пока, но видимо всю цепочку нужно подменять и блочить в moji_dlsym.
>>807410 Ну вот, это я понимаю, но не понимаю, как именно ЗАДАТЬ n-ое количество этих символов, который должны выводиться в строчке. Не буду же я вручную прописывать все варианты от одного до бесконечности.
>>807414 Это тебе в питон с таким, там как раз умножение для строк определено. В сишечке ты либо выделяешь буфер, заполняешь char-ами циклом (или memset еще подойдет в твоем случае) и делаешь puts/printf("%s", ...). Или ты в том же самом цикле выводишь по одному char putchar/printf("%c", ...) сразу, безо всяких буферов. Ну или можешь так сделать: http://ideone.com/IC0Vst Сама по себе printf умеет только предварять/дополнять выхлоп нулями или пробелами.
digits - первые две (в случае VISA - одна) цифра. Если первая цифра 4 - значит карта от визы, если 34 или 37 - american express ну и так далее. Как правильно это реализовать? С помощью if получается вот такое
GCC ругается > switch (digits || digits / 10) > switch condition has boolean value Digits / 10 для визы, ведь там однозначное число. > 34 || 37 > error: duplicate case value А тут что такое?
>>807420 > case 34 || 37 || - это логический оператор, он преобразует свои операнды в 0 или 1 (false/true). Получается (1) || (1) = 1, т.е., в case 1:. И следующий case у тебя тоже превращается в case 1. Вот оно и ругается. Хочешь несколько значений - делай несколько case без break между ними:
case 34: case 37: // Можешь на отдельных строках, можешь так - похуй. ... break;
> digits || digits / 10 То же самое. digits превращается в 1 (скорее всего), вторая часть выражения даже не пытается вычисляться.
Я бы сделал: if ((digits / 10) == 4) { виза } else { switch (digits) { ... default: инвалид } } Все красиво и понятно.
>>807421 Да, ты можешь прописать формулу вместо десятки. Но это кривой, некрасивый код. printf просто обрезает строчку до num символов. Если num случайно окажется больше длины строчки, недостающие символы ниоткуда не возьмутся, и выведется меньше, чем num. Сделай через for, не выделывайся. А чтобы было красиво, оберни в функцию.
>>807593 Ее я уже заметил и исправил, а число таки не вводится. Пытался printf("%lld\n", num) вставить после вызова функции - ничего не происходит, значит проблема где-то в функции get_num.
Программач, я ведь знаю тут собрана самая мозговитая прослойка двача. Мне нужна помощь в решении следующего алгоритма. Задачка не из легких. Уже два дня потею, вот вот вроде выведу норм алгоритм,но нифига. Я уже и рекурсией, и мат. формулы искал. Ближе к делу.
Необходимо подсчитать число разбиений (N) на слагаемые, для вводимого нами числа (Sum), при том, что у нас есть список доступных слагаемых (Arr).
Пример: мы вводим число 7, и задаем слагаемые - [1,2,5]. Из этих условий следует, что Sum = 7; Arr = [1,2,5], а количество разбиений N нам нужно вычислить: 1) {5,2}; 2) {5,1,1}; 3) {2,2,2,1}; 4) {2,2,1,1,1}; 5) {2,1,1,1,1,1}; 6) {1,1,1,1,1,1,1}; В нашем случае N = 6; Важный момент - слагаемые могут повторяться, но их последовательность не важна, то есть разбиения типа {5,2} и {2,5} тождественны между собой и должны учитываться как одно решение
Ребят, помогите плз. Упарывание всяких там формул Эйлера и т.д. не помогло в силу отсутствия решения для конкретно подобного случая
ОС контролирует процессы, при этом давая им напрямую исполнять инструкции на CPU, так? Как при этом работает виртуальная память, за счет софта или железа? Например, есть инструкция, чтобы сделать mov число в адрес. Как тогда этот адрес переведется в реальный?
>>809056 > Как при этом работает виртуальная память, за счет софта или железа? За счёт железа. Гугли про MMU.
> Как тогда этот адрес переведется в реальный? Тут я точно не скажу, дело немного усложняется наличием кешей. Вроде бы L1 хранит по виртуальным адресам, ради скорости. А вот уже для кэшей следующих уровней происходит трансляция в физические адреса.
>>809064 >Вроде бы L1 хранит по виртуальным адресам, ради скорости. А вот уже для кэшей следующих уровней происходит трансляция в физические адреса. Да, это всё было про некоторые (многие?) модели x86-процессоров. Для других логика может в общем и такой быть, может и отличаться.
>>809064 >>809076 >When a virtual address needs to be translated into a physical address, the TLB is searched first. If a match is found (a TLB hit), the physical address is returned and memory access can continue. However, if there is no match (called a TLB miss), the handler will typically look up the address mapping in the page table to see whether a mapping exists (a page walk). If one exists, it is written back to the TLB (this must be done, as the hardware accesses memory through the TLB in a virtual memory system), and the faulting instruction is restarted (this may happen in parallel as well). This subsequent translation will find a TLB hit, and the memory access will continue.
А откуда процессор имеет доступ к page table? Это же просто структура данных в DRAM, так?
Да, таблица страниц в обычной памяти, у процессора есть ее физический адрес, и (по крайне мере, на x86) страница с таблицей страниц сама находится в таблице страниц. Код, который включает трансляцию адресов, загружает этот адрес в процессор.
>>809113 >на x86) страница с таблицей страниц сама находится в таблице страниц. Это если ядро изволило её туда поместить. А так — никакого такого обязательного требования на x86 нет.
Как определить массив функций? Нужна функция, создающая другие функции, но, так как вложенные определения функций запрещены, остается только memcpy, верно? А что дальше?
>>809289 >так как вложенные определения функций запрещен Нет, не запрещены. Создавай себе массив с сигнатурой функции как типом и байтоёбствуй сколько влезет, какие проблемы? >остается только memcpy, верно Нет, неверно, за такое тебя система нахуй пошлёт, нужно сначала менять права доступа к памяти, а для этого запускать придётся из-под рута. Хотя если запускать кроме как у себя нигде не планируешь – наслаждайся еблей.
Анон, как обрабатывать эксепшены? Везде по-разному написано. Пишут, что глобальную переменную не стоит использовать. Распиши по хардкору.
каждую функцию что ли проверять на возвращаемый эррор? про ассерты знаю, мне надо внутри разных модулей смотреть ошибки и выдавать их нужный код, не завершая программу.
> как обрабатывать эксепшены У нас нет эксепшенов. В некоторых случаях можно воспользоваться setjmp/longjmp для имитации исключений.
> глобальную переменную не стоит использовать Не стоит. Но иногда имеет смысл таскать в модуль некий контекст, в котором будет флажок ошибки. Ну как в stdio ferror/feof.
> каждую функцию что ли проверять на возвращаемый эррор? Да, именно это и нужно делать.
>>809674 Нужно просто привыкнуть. Почитай чужой код (например, исходники ядер винды/линукса/osx), не вникая в смысл, просто, чтобы увидеть и подхватить стиль.
>>809952 Мне сперва это показалось невозможным т.к. нужно копировать стек, IP и регистры, но теперь вспомнил про инлайн ассемблер. Хотя не разобрался пока с Pth, может и не за счет него.
>>809669 В арме экзепшены есть. Но они по сути как прерывания, и характер имеют - чисто железный. Неизвестная команда, недопустимый адрес, всякое такое. Ебался с этим на RM9200.
>>810304 Это не те исключения, про которые шла речь. Мы говорили об исключениях, которые представляют собой некий объект, который можно, прервав нормальное выполнение кода, программно передать в специальный блок на текущем или предыдущих уровнях вложенности. Т.е., goto на стероидах.
А те, исключения, о которых ты говоришь - аппаратные, есть не только в ARM, но и в других архитектурах тоже, конечно же. Но так как они жестко завязаны на платформу, в языке их нет - нет стандартных средств для отлова, обработки, восстановления и т. п. Предполагается, что исключение обработает ОС, и при необходимости проинформирует программу соответствующим signal или каким-то другим способом. Например, в винде это делается с помощью SEH/VEH и построенных на них __try/__catch. В каком-нибудь МК можно их и напрямую отлавливать, устанавливая обработчик прерывания, но язык Си к этому никакого отношения не имеет.
>>810342 На питоне многие вещи уже реализованы, многие проблемы решаются автоматически. Поэтому он проще. C - низкоуровневый язык, это значит, если освоишь его, будешь лучше разбираться как всё работает на уровне железа. Решать тебе.
Котаны, нужно быстро вкатится в C/C++ под виндовз (Visual C++ Build Tools) без ебучей, пидерской Вижуал Студии, реквестирую годную лайтвейт IDE и дебаггер.
>>810822 Если без крестов, то Pelles C 10 МБ инсталлер, около 100 МБ установленная, считая индексы для хидеров - достаточно лайтвейт?. Source-level дебаггер в комплекте, а так x64dbg есть еще, если что.
>>810868 > Cygwin Фуууу. Оно нужно для одной-единственной цели: собирать под Windows непереносимое говно из мира *nix. Если понадобился cygwin, то либо с софтом, либо с тобой что-то не так.
>>810868 vim заебись, но там нужно плагинами обмазываца, тогда уж нотепад++ с vim плагином. >>810966 А Пелс С даст Кодеблоку пасасать? А к Пелс Интеловский или ГЦЦ конпилятор можно прикрутить?
>>811177 > А Пелс С даст Кодеблоку пасасать? Не даст. Извини, неправильно тебя понял. Редактор там примитивный, хотя основные вещи умеет (подсказки, автодополнение и т. п.), компилятор свой, заменить нельзя. Если тебя интересует какой-то конкретный компилятор, а не просто вкатиться, тогда, действительно, лучше кодеблокс какой-нибудь.
Аноны, а вот эти специфичные для си switch , тернарный оператор, гоу ту, они часто используются? Есть ли какие-то плюсы или минусы их пользования, рекомендации?
>>811928 Эти конструкции упрощают код. Ты можешь заменить switch и ?: на if, но читать это станет менее приятно.
> специфичные для си > switch В каждом первом языке, унаследовавшем синтаксис Си. В остальных языках тоже чаще всего есть. Нету в питоне, и это одна из причин, почему его синтаксис говно.
> тернарный оператор Почти в каждом языке, унаследовавшем синтаксис Си. В других языках тоже часто есть, но записывается по-другому. Например, в питоне foo if expr else bar.
> гоу ту В каждом втором языке, унаследовавшем синтаксис Си. Два обоснованных варианта использования: выход из двух и более вложенных циклов (break выходит только из одного) или переход на обработку ошибок. Зависит от стиля и практик, принятых в проекте. Некоторые принципиально не пользуются вообще.
> рекомендации Тернарный оператор и гото по вкусу, switch вместо if (expr == 1) {} else if (expr == 2) {} else if (expr == 100500) {} else {} ну ты понел.
>>811934 > switch > Нету в питоне, и это одна из причин, почему его синтаксис говно. Спасибо Гвидону, что его там нет. Свич - это самая отвратительная отрыжка ранних дней структурного программирования, рудимент эпохи беспорядочных половых goto-связей. Один раз забыл написать break; - сиди лови непонятную бажину.
Pattern matching здорового человека: let neg x = match x with | false -> true | true -> false ;;
Pattern matching курильщика: strcpy(to, from, count) register char to, from; register count; { register n = (count + 7) / 8; if (!count) return; switch (count % 8) { case 0: do { to = from++; case 7: to = from++; case 6: to = from++; case 5: to = from++; case 4: to = from++; case 3: to = from++; case 2: to = from++; case 1: to = from++; } while (--n > 0); } }
>>811994 Ну да, синтаксис у switch в Си не лучший и даже для Си слишком низкоуровневый. Да, вариант без break был бы красивее, но тут уже, к сожалению, ничего не поделаешь.
> Спасибо Гвидону, что его там нет. Могли бы нормальный сделать, не повторяя проблем Си. Но лучше уж сишный, чем никакого.
> Один раз забыл написать break; - сиди лови непонятную бажину. Уже и не помню, когда в последний раз пропускал break. Если есть IDE, оно само втыкает, пока case пишешь. А если и нет - это просто стандартная ньюфажная ошибка уровня ==.
>>812019 Из-за криворуких уебанов которые на это жалуются. >>812018 Ну ты почитай про методики вроде TDD, защищёное программирование и прочую хуиту если у тебя возникают проблемы подобного плана.
>>812010 > Могли бы нормальный сделать, не повторяя проблем Си. Но лучше уж сишный, чем никакого. Тебе дали охуенный язык высокого уровня - пользуйся этим.
>>812028 Да-да. Вот именно после словарей с лямбдами или огорода elif я и считаю отсутствие switch огромным недостатком питона. Понятно, что для маппинга значений switch не нужен. Он и в Си для маппинга не нужен. Он нужен, чтобы выполнять код.
>>812021 > Ну ты почитай про методики вроде TDD, защищёное программирование и прочую хуиту если у тебя возникают проблемы подобного плана. Да-да, еще больше костылей, для того, чтобы как-то мириться с костылями сорокалетней давности. Нахуя нужны удобные языки? Давай уж сразу на ассемблере все писать - а что, тдд и прочие бест практисес не дадут обосраться!
>>812034 Я щетаю, что если у тебя кейсов меньше, чем 4-5, то в принципе похуй, чем их делать, свичами или ифами, и то, и другое примерно одинаково уродливо, а если больше, то это уже повод вынести логику каждого кейса в отдельный объект или функцию. Независимо, на каком языке ты это пишешь.
>>812158 Если тебе нужен перформанс, аналогичный си, то ты пишешь на си, кладешь хуй на все паттерны и парадигмы, и ваяешь вместо кода лапшу, которая отвратительно выглядит, неподдерживаема, но быстро работает.
>>812160 > Зачем читать библию от Отцов Затем, что основы никуда не делись. С тех пор появились новые фишечки, люди поняли, что не так со strcpy, но язык не слишком изменился со времен C89.
>>812166 > кладешь хуй на все паттерны и парадигмы, и ваяешь вместо кода лапшу @ кэши процессора по пизде @ из-за алиасинга куча лишних load/store @ тебя обгоняет даже VB6
>>812840 Теперь понял, True и False Булевы выражения, т.е. 1 и 0. Но почему-то id50 не поддерживает буквенные формы. Интересно почему? Хотя в Визуал Басике все норм.
>>812903 Первым твоим языком должен быть английский. Так, чтобы читал техническую литературу без словаря. А потом уже любой язык программирования по вкусу.
>>812875 Действительно. В начале статьи есть подпись: Введите "update50" - для обновления. Но про <stdbool.h> слова нет. При выполнении двух условий функции работают. Спасибо, за помощь!
Есть теоретический вопрос. Вот такие две декларации функции: void foo(const int ∗); // В параметрах указатель на сколько-то константных int. void foo(const int ∗const); // В параметрах константный указатель на сколько-то константных int.
Эти декларации совместимы или нет? Компиляторы не ругаются, им все ок. А что стандарт говорит?
>>813548 А каким местом они совместимы (где написано, что qualifiers отбрасываются при сравнении)? Вот я вижу в драфте C11 параграф 6.7.3, пункт 10 - сказано, что типы совместимы, если совпадают все type qualifiers, не совпадать может только их порядок. (Ну т.е., int ∗const restrict и int ∗restrict const - точно совместимы).
> Вызывающему похуй на top-level const Ну это все понятно, я же сразу сказал, что вопрос теоретический.
>>814019 If the expression that denotes the called function has a type that does include a prototype, the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters, taking the type of each parameter to be the unqualified version of its declared type.
>>814057 Это не то, это вызов. В разделе про присваивание тоже написано, что qualifiers дропаются, чтобы разрешить const int foo = 1; int bar = foo. И тут то же самое, чтобы разрешить int foo = 1; const int bar = 2; void func(const int a, int b); func(foo, bar); Если бы исходные типы не преобразовывались к типам аргументов, а из типов аргумнтов не дропались бы qualifiers, нельзя было бы вызвать функцию.
>>814467 >щитает што ета средства шинды Хотя нет, ты прав. Считаю средствами винды. И это правильно, т.к. Windows Services for Linux, которые занимаются, в том числе, псевдотерминалами и переводом escape-кодов в цвета — это подсистема в Windows.
А баш внутри запущен или там хуяш — это уже неважно.
Но ты ведь школьник и думаешь, что это сам GNU bash рендерит шрифты, в том числе меняя их цвет, лол.
>>814481 >Смотри на пикрелейтед, маня, о каких 300мб ты говоришь Дотнет тоже учёл? >можно и в обычной консоли сделать, без повершелла, маня ну и как же покрасить отдельный кусок текста без SetConsoleTextAttribute и прочего мусора? >>814482 Только вот ты похоже читать и пытаться понять смысл даже не пробовал.
>>814596 что делай вот так? вы тут двое совсем ёбнулись? это массив указателей, и причем первый, это указатель на строчку пути до исполняемого файла (может быть \0).
>>814538 > int main(int argc, string argv[]) { нахуя ты его объявляешь как string? что это вообще такое, вы в тот тред вообще попали?
>>814648 Это в мит питон вместо схемы. Ну нормальные курсы, я вот сейчас началсикп не осилил пытаюсь. Как заявляется, это единственный вводный курс, на котором тебя заставят на сишке структуры данных пилить. Что касается книг-они подробнее. Курс не ставит себе целью научить сишке, а только программировать вообще
>>814680 Спиздили всю подсистему. Я понимаю что тебе больна, но от этого факт остаётся фактом – они сами не смогли даже нормальные средства вывода в консоль написать за столько-то лет.
>>814683 >Спиздили всю подсистему. Т.е. WSL разработал кто-то другой, а в MS спизили? Чего только не узнаешь на дваче.
> Я понимаю что тебе больна Больна только тебе, школьник. Я пользуюсь линуксом уже лет 8, лет 6 из них чисто им. Только я, в отличие от тебя, не красноглазый фанатик.
> они сами не смогли даже нормальные средства вывода в консоль написать за столько-то лет. Драйвер для консоли, который понимал escape-коды для ANSI-терминалов был ещё под DOS, когда никаким linux и не пахло.
>>814690 >Драйвер для консоли, который понимал escape-коды для ANSI-терминалов был ещё под DOS, когда никаким linux и не пахло И? Это отрицает тот факт, что мне чтобы разукрасить слово в консоли под шиндой нужно сделать как минимум сначала вызвать GetStdHandle, потом помешать битмаски руками, потом как минимум 2 раза вызывать SetConsoleTextAttribute чтобы просто разукрасить ебаное слово?
Да – они спиздили чужой апи, если тебе так угодно – потому что их апи представляет из себя кучу безидейного говна.
>>814716 > Да – они спиздили чужой апи, если тебе так угодно ANSI-последовательности придумали не в Linux. Они там просто поддерживаются из-за совместимости с эмулятором терминалов, древних, как говно мамонта (уже почти 40 лет не могут закопать!). У Microsoft во времена DOS тоже был драйвер ANSI.SYS, но он был настолько нахуй никому не нужен, что в Windows NT его перестали поддерживать (точнее, в системе он валялся как минимум до Vista, но исключительно для совместимости с DOS-приложениями).
> их апи представляет из себя кучу безидейного говна. Это ANSI-последовательности представляют собой кучу протухшего говна, которая создает проблем больше, чем решает. Вот как выглядит типичный раскрашенный вывод в терминал в линуксе: if (isatty(1)) printf("с цветами"); else printf("без цветов"); Что будет, если типичный говнокодер при рефакторинге поменяет одну ветку и забудет поменять другую? Что будет, если убрать isatty? А теперь посмотрим, как выглядит типичный раскрашенный вывод в терминал у нормальных людей (вне зависимости от языка и ОС): colorize(Color_Gray, Color_Black); printf("Нехай colorize() сам решает, как на данной платформе раскрасить что-либо, и нужно ли это"); Какой подход похож на используемый в Windows API?
>>814888 А что будет если завтра все люди на земле вместе одновременно пукнут? На что будет походить сломанная пополам земля, как думаешь? Мне кажется таки на винапи – как минимум по запашку.
Нуфак в тхреде. Есть пару вопросов. 1. Правда ли, что на Сишке легче писать, чем на плюсах? 2. Понимаю что тред не по asm, но будут лабы по AVR студии на asm по ардуино, есть ли аналоги для линухи?
>>815024 1) Смотря что сравнивать, но в основном да – сишка нааамного меньше синтаксически нагружена; 2) Судя по гуглом их компиляторы есть и для линукса, а иде вполне себе запускается под ввайном. Если не осилил пердолинг с ним – всегда можно накатить виртуалку.
>>815190 А ещё там 9000 способов выстрелить себе в ногу, умные указатели порождают проблемы с циклическими ссылками, RAII работает по стандарту "как реализовали, так реализовали, нихуя не гарантирую" (поведение деструкторов например) и куча всего прочего.
Сишка тупо лёгкая как палка, и на ней прострелить себе ногу без желания сложнее.
>>815208 >А ещё там 9000 способов выстрелить себе в ногу Например? >умные указатели порождают проблемы с циклическими ссылками Обожаю высосанные из пальца недостатки. Да, порождают. Но какой процент кода с использованием умных указателей организует циклические ссылки в структурах данных? 0.01% в лучшем случае. > RAII работает по стандарту "как реализовали, так реализовали, нихуя не гарантирую" (поведение деструкторов например) Можно подробнее? > Сишка тупо лёгкая Бывает, что это нужно и тогда её используют.
>>815212 >Например? cppquiz.org >Можно подробнее? Как исключения с raii сочетаются например. >Обожаю высосанные из пальца недостатки. Так в плюсах всегда все так – сначала из пальца высасывают векторы с булами и кладут на них хуй, потом признают что не смогли реализовать хэшмэп, потом почти признают недавно введение асинки некорректными, и вместо того чтобы поступить как с хэшмэпом собираются в катиться ещё пачку костылей. Ну это все конечно проблемы из пальца высосанные, ничего страшного. >Бывает, что это нужно и тогда её используют. А ещё чаще бывает что проекты на плюсах отказываются от половины фишек языка ради того чтоб не утонуть.
>>815249 >Как исключения с raii сочетаются например. Отлично, а что?
>Так в плюсах всегда все так – сначала из пальца высасывают векторы с булами Тут не поспоришь. Комитет за всех решил, что компактность важнее скорости доступа. Это, конечно, неправильно.
> почти признают недавно введение асинки некорректными Лол. Твой ник?
> бывает что проекты на плюсах отказываются от половины фишек языка Только из-за старой code base, которую не хотят приспосабливать в новым фишкам.
>>814888 >colorize(Color_Gray, Color_Black); printf("Нехай colorize() сам решает, как на данной платформе раскрасить что-либо, и нужно ли это"); Так-так-так-так. И как же он решит, что раскрашивать, а что — нет? Мне в гойлову залезет и оттуда считает мои мысли?
>>814888 > Вот как выглядит типичный раскрашенный вывод в терминал в линуксе: >if (isatty(1)) printf("с цветами"); else printf("без цветов"); >Что будет, если типичный говнокодер при рефакторинге поменяет одну ветку и забудет поменять другую? Что будет, если убрать isatty?
Он так только в твоём манямире выглядит. И проблемы, которые ты перечислил, существуют там же.
>>814888 > уже почти 40 лет не могут закопать > валялся > кучу протухшего говна > создает проблем больше, чем решает какой категоричный малец.
> if (isatty(1)) printf("с цветами"); else printf("без цветов"); > Что будет, если типичный говнокодер при рефакторинге поменяет одну > ветку и забудет поменять другую? Что будет, если убрать isatty? а тут вообще чёт проигрунькал.
>>816078 >> Что будет, если типичный говнокодер Говнокодер не может сделать так, чтобы в коде в printf писать везде с цветами, но при выводе не на tty управляющих кодов не было, но виноват ему почему-то линукс. В общем, типичный виндокодер, не умеющий в проектирование.
Рассказать ему, как надо, или не стоит метать бисер перед свиньёй?
уже который день читаю спецификацию pthread, Process Scheduling. это просто ад какой-то, нихуя вообще не понятно. а такие предложения меня вообще добивают нахуй: > An application should not rely only on the use of SCHED_RR to ensure application progress among multiple threads if the application includes threads using the SCHED_FIFO policy at the same or higher priority levels or SCHED_RR threads at a higher priority level.
Коротенькая и простая программа (всего 19 строк), берет строку как аргумент и выводит ее горизонтально, потом вертикально. Почему-то она не работает. Наверное потому что там указатели (которые я еще не проходил). При компиляции gcc ошибок и ворнингов не выдает, однако сама программа говорит >segmentation fault Посмотрите, пожалуйста, и скажите где я дурак и как перестать им быть.
>>816587 Имеешь в виду, что я вывожу слово по одному знаку? Ну так было у автора, я только argv подправил. Да и всякое форматирование между буквами можно добавить в случае чего.
>>816524 >should not rely on.... вот тута. правда еще про приоритеты упоминается. весь цпу може выжрать sched fifo такого же или большего приоритета или sched rr большего приоритета
>>816753 Говнокод. В пул-реквесте тоже говнокод. -funroll-loops без необходимости, да еще и глобально для всех модулей - зашквар. unsigned short без необходимости экономить место - тормоза и зашквар. Отсутствие пробелов вокруг операторов - дальше не читал, фтопку.
>>816769 > тип данных типа Байт 256 значений #include <stdint.h> uint8_t > чому тормоза Но у нас в сишечке есть такая штука, как integer promotions, и при выполнении арифметических операций uint8_t преобразуются к int, а при присваивании обратно в uint8_t обрезаются. Иногда (на x86, или когда компилятору хватает ума обойтись без преобразований) это ни на что не влияет, но в других случаях (на других архитектурах, где нет доступа к 8-битным частям регистров, а иногда и на x86 тоже) из-за этих преобразований возникают по нескольку лишних (по сравнению с int/unsigned int) инструкций. То же и с short. Поэтому реальные посоны используют uint_fast8_t/uint_fast16_t, которые на том же x86 - синонимы unsigned int.
и вообще, что значат приоритеты сам не допёр, ведь есть ещё nice. хотя тут отрезают сходу: Calling the nice() function has no effect on the priority of processes or threads with policy SCHED_FIFO or SCHED_RR. The effect on processes or threads with other scheduling policies is implementation-defined. но не понятно что с SCHED_OTHER... ведь This structure shall include at least the following member: int sched_priority
Ананасы, посоветуйте хорошую легковесную либу, с помощью которой можно генерить всякую хуйню в JSON-формате. Желательно, чтобы минимально использовались mallocи/free в идеале - вообще без них, но маловероятно, что такая либа была кем-то написана, ибо из-за фрагментации памяти железо уже начинает падать.
>>817261 Сам напиши. Если данные полностью готовы до вывода, сам вывод получается простой: тебе, по сути, нужен только putchar, который умеет кодировать спецсимволы и стек того, что требуется закрыть (массивы, хэши). Делов-то на сто строк, особенно если pretty print не делать.
Анон, насколько часто ты используешь динамическую память? Я вот делаю всё максимально статически-стековым и всегда стараюсь убедить заказчика в том, что быстрота написания кода с использованием динамической памяти и более красивый код совершенно не оправдывают возможных проблем в будущем.
>>817849 Сейчас пилю проект на двух платформах - хМега и процессор на арме с линупсом. И если в хмеге мне аллокация вообще недоступна, то на линупсе без неё я сосну вообще.
>>817876 А я вот соснул с фрагментацией динамической памяти на не-линукс платформе из-за того, что изначально хуйню пилили на линупсе не задумываясь о хоть какой-нибудь детерминированности что в общем-то простительно для нереалтаймовых систем с большими объемами ОЗУ Теперь нужно передалать всё это говно, в итоге должно получиться что-то типа 5-метрового бинарника, который потребляет ~50кб ОЗУ, лол.
Господа указатели, может кто насоветовать приличную либу под C способную читать и писать такой мерзкий формат файлов как Excel (.xls и более новый .xlsx, с которым вообще гемор) ?
>>818187 В анус твой сом. Это во-первых требует установленного самого экселя, что уже не вариант, а во-вторых если б я хотел возни с этим лайном то уже сделал бы.
Я пробовал другой изврат с мелкософтскими компонентами - установку драйвера эксель (около 20мб, доступен для загрузки на этом их сайте бесплатно) и чтение эксель-файлов через него (он типа представляет таблицы в виде базы данных). Но это реально дикий ультраизврат, учитывая какой извращенный SQL-синтаксис там + файлы так можно только прочесть, а создать поди вряд ли.
Короче нужна именно чистая независимая либа, а не какой-то сом анальный и прочее из мира C#-быдлокодеров. Или конвертер с экселя в CSV, но таких годных я тож не нашел. Пакет опеноффиса может впринципе работать с этими таблицами, но там исходников сука на 300мб и проще таки убиться чем выделить требуемый код с этого пиршества обезьян
>>818111 >>818213 >способную читать и писать такой мерзкий формат файлов как Excel тебе зачем? если поебаться с ячейками, подумай о переводе в другой формат который понимает Excel - xml, cvs, ods. з.ы. я просто послал нахуй этот микрософт и перевел все в odt.
>>818232 Занимаюсь "работой за еду" (ну т.е. фрилансом. таки на C и еще одном ъ-языке поудобнее, тоже без ООП и всякого говна) чтобы у мамки на шее не сидеть. Точнее, чтобы набомжевать себе $600 на новую пекарню, ибо недавно полетело барахло и сижу сейчас на прежнем древнем ПК 2004 года выпуска, лол.
Так-то самому мне пердольство с этими ячейками нафиг не сдалось и МС тоже нахуй посылаю, но например в этом вот говнофрилансе на днях неплохое бабло уплыло из-за того что эти сраные таблички нечем было читать/писать. Так что решил найти и осилить чо-то чтобы было на случай если понадобится, но пока ничего нет.
>>818673 Ну есть у тебя int ∗foo, и ты хочешь прочитать свой int по этому указателю. Что ты будешь делать? ∗foo (не ∗ foo ведь?). То же и с массивами, если у тебя есть foo[2], то и использовать ты будешь foo[n]. Декларации в сишечке стремятся отражать то, что предполагается с переменной делать.
>>818213 А какие проблемы установить эксель? Кроме офиса никто с офисными документами не работает по опеределению, т.к. формат проприетарный. Это называется vendor lock.
>>818944 Мне нужно что-то практичное на следующие 20 лет. Потом я умру.
МС запилил win10 и под raspberry. Запилит и под прочие модные одноплатники. Мне не мода нужна, а простота лепить гуй, графику в окошке, играть с модными OpenCV & Co
>>819230 Автор, скажем так, не очень разбирается, но честно запостил в начало статьи ссылку на how-to-c-response, где поясняют за все его всктезисы. Стоит почитать.
>>819291 > инициализация через {} поэлементна Скомпиль что-то вроде struct { int a, b, c; } foo = { 1, 2 }; Маленькие структуры/массивы компилятор инициализирует поэлементно, но для сколько-нибудь большие заполнит memcpy (или memset, если инициализатор { 0 }).
> глобальные по умолчанию - 0. Автор про автоматические говорит, а не про глобальные.
Ради интереса глянул попристальнее в софтвар цент убунты. Это же пиздец, столько программ, каждую кто-то написал блять, на любую хуету. то и моитвирует и немного огорчает. Алсо, а как в такой софтвар центр свою поделку пропихнуть? Я понимаю, что мои консольные приложения там нахуй никому не упали, просто интересно
>>819306 > охуенное определение Норм определение. Зависит от компилятора и флагов, очевидно же.
> struct thing localThing = {0}; - глобальная. Ну то есть auto-allocated в заголовке и local в имени ты предпочел не заметить? Понятно, что имеется в виду локальная.
>>819311 > Зависит от компилятора и флагов, очевидно же. да ну это вообще пиздец тогда. если нет в стандарте - значит нет.
> Ну то есть auto-allocated в заголовке и local будешь дурачком перекидываться? в первом примере он показывает глобальную и её бессмысленную инициализацию нулями в функции, во втором - без функции. и ты хочешь сказать, всё это время это было локально? функции локально не объявляются.
>>819314 > если нет в стандарте - значит нет. Ты про что вообще? Про то, что вместо отсутствующих в списке инициализации инициализаторов подразумеваются нули? Так это есть в стандарте, это нормально. Наблюдаемое поведение: написал { 1 } - все остальные элементы стали 0, а первый - 1; написал { 0 } - все стали 0. А я говорил о том, как это реализуется компилятором.
> будешь дурачком перекидываться? Дурачком прикидываешься ты. Тебе показали сниппет, а не цельную функцию: локальную переменную и функцию, которой такие переменные инициализируют нулями. Две разных сущности. Это понятно любому человеку, способному абстрактно мыслить. Ты еще спроси, где это автор memset взял, ведь хедер не подключен!
Поясните немного нюфагу. Хочу коньеплировать небольние кусочки кода на си, и читать что вышло на ассемблере. Не означает ли это то, что мне сперва нужно знать асм, или же это не суть важно, что первым учить? Уже начал читать Лекции по си, праты, и не хотелось бы скакать уже с темы на тему. Однако если окажется, что лучше сперва асм, то так и сделаю
> Дурачком прикидываешься ты. ты просто отбитый. пытаешься ГОВОРИТЬ ЗА АВТОРА, что он НА САМОМ ДЕЛЕ хотел сказать. а, ведъ тебе в голову не приходит мысли, что local в имени, имеется веду локальная в транслейшин юнит... короче нахуй иди.
>>819321 Можно учить параллельно. Да и вообще, асм особо учить не нужно. Для x86 достаточно запомнить имена (и назначение) регистров (включая регистр флагов), разобраться со стеком, эффективной адресацией (effective address). Потом будешь просто смотреть в мануале, что делают конкретные инструкции.
>>819322 > ГОВОРИТЬ ЗА АВТОРА Блять, автор тебе в заголовке написал: речь идет об автоматических переменных. Все. Глобальные переменные автоматическими не могут быть по определению, что ты тут устроил вообще?
>>819324 ну да, по суте немного про то как это работает, стек, флажки, и тупо справочник по инструкциям, например с сайта intel. жаль что поиск по pdf голимый какой-то... или у меня такой ридер...
>>819334 > Как следует из названия, POSIX (Portable Operating System Interface) Всегда считал, что там ещё есть "for uniX" в конце. Открыл http://www.opengroup.org/austin/papers/posix_faq.html Q0. What is POSIX? What is POSIX.1? POSIX is a registered trademark of the IEEE.
POSIX is an acronym for Portable Operating System Interface.
Вот и верь после этого русским википидорам, которые пишут "for uniX" в конце.
в вообще, из за этих x я раньше дико путался, подумать только, linux-unix-posix... а ещё gnu, который не unix. господи, да я и сейчас всю картину не вижу...
>>818947 Ну тогда тебе Delphi, C#, C++ Builder или Qt - в самый раз, но вот через 20 лет никто не знает какая технология будет нужна для гуестроения. Вот например джава продержалась около 20 лет и умерла. Питон - умирает, но еще не окончательно
>>820215 >Да, но зачем? Ну как, чтобы опыт получить в разработке программок. >>820214 Это да, в опенсурс вкатиться я уже думал. Только я представил как коммит делаю, и мне стало стыдно почему-то. Да и в целом я хотел бы разобраться с пдф форматом, а в особенности с его уязвимостями и как их лучше закрыть а потом как это лучше взломать, чтобы еще лучше закрыть.
А еще я думал запилить музпроигрыватель консольным, но такой тоже уже есть
>>820220 >Ну как, чтобы опыт получить в разработке программок. Выбери что-нибудь попроще, на пдфчиталку слишком много времени уйдет, а толку будет мало.
> его уязвимостями и как их лучше закрыть а потом как это лучше взломать, чтобы еще лучше закрыть. Все его уязвимости и методы их закрытия давно известны, ты точно нового ничего не найдешь.
>>820230 Решать задачи через программки с консольным интерфейсом весело и полезно на всех этапах обучения, просто задачки надо подбирать по-сложнее. На кой тебе читалки? Поверить в свои силы?напиши имиджборду на сях,лол
>>820247 >читалки Это просто первое что пришло в голову, тк в стандартной читалке нет человеческих закладокили я не искал. Сами по себе читалки мне не так важны, как важно овладеть языком
>>820376 Ну тогда vim с несколькими плагинами - твой выбор. Eclipse хорош, но уж слишком жирный и тормозной, Qt Creator иногда практически нереально настроить под какой-то специфический проект (Но если ты делаешь что-то уровня лаба2, то это - твой выбор). Ну а emacs ты не сможешь выбрать, ибо только сам emacs может выбрать тебя.
>>820382 >emacs да не, нормально, просто вкатываться нужно сразу, потом сложнее. зато плюсов море, и вот мне уже не нужен файловый менеджер, терминал... правда, я всё ещё, не умею в лисп. но как-то накорябал свою подсветку. стандартная не тащит, там подсветка имён структура и любых типов - короче, что-то такое...
Пытаюсь написать интерпретатор/терминал/оболочку (не знаю как назвать) для парочки команд в микроконтроллер, чтобы через последовательный порт можно было заставлять его что-то делать прямым текстом (командами а-ля баш). Пока пишу под ПК на линуксе. Вопрос следующий: как перехватить стрелочки, чтобы не выводился мусор типа "^[[D", а каретка перемещалась по вводимой строке? Пробовал getchar() и scanf() с одинаковым результатом, но я понятия не имею как предотвратить вывод этого мусора. Остальное я представляю себе как реализовать. Обязательный момент - это использование только функций из страндартной библиотеки. И, кстати, вводимую строку пишу в массив символов - это нормально так делать или стоит переехать на указатели?
>>821402 (OP) Вот объясните мне, нахуя нужны в линуксе статические библиотеки? В каких слуаях вообще они используются, если приемущества только у динаических? В инете толком про них не пишут. Возможно нубский вопрос. Сегодня начал красноглазить, можете прописчать обряд посвящения.
С# Visual Studio 2015Аноним05/09/16 Пнд 21:29:18#522№836210
Анон, спасии!! как убрать этот конфуз? c#: using SimpleWifi; //нормас using SimpleWifi.Win32; подчеркивает Win32 работаю в VS 2015, у кого-нибудь было что-то подобное?
Что читать:
- Классика от Отцов: http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/%7Eats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
- https://arhivach.org/thread/155908/
- https://arhivach.org/thread/173837/
- https://arhivach.org/thread/180461/
- https://arhivach.org/thread/182958/
- https://arhivach.org/thread/188294/
Шапка: http://piratepad.net/bJ1SdmkZyu