Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или зведочки.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Stephen Prata "C Primer Plus, 6th Edition" (2014) Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
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)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
>>946634 Кстати, где можно новичку найти учебники по OpenCL на русском? А то по CUDA, вон, академики из МГУ пишут книги, а по OpenCL нет такого вот всего...
Дайте, пожалуйста, учебник или руководство по WinApi. А то я из всей информации смог нарыть лишь то что devcpp предлагает. Пример окна. А в гугле эти пислоглоты предлагают мне использовать c++. ЧТО ЗА ИДИТО ПРИДУМАЛ ТАК НАЗВАТЬ ЯЗЫК?!?!
Оба ебанутые. Во-первых не по ссылке, а по указателю.
Во-вторых: Параметр m - должен быть указателем на ДИНАМИЧЕСКУЮ память. Т.е. ты не можешь написать >int m[]={43 25 45 13 27 41}; Сперва ты должен сделать что-то вроде: int m = malloc( sizeof(int) 6) Потом проинициализировать значениями. Да и вообщше привиди полный код с main(). У тебя там труха полная, даже лень разбирать.
>>946850 > int m[]={43 25 45 13 27 41}; Таковым и является. В main создан динамический массив, а вот эту вот строку я написал сам, чтобы показать, какой, например, массив поступает.
>>946888 Короче, проблема решена. А в догонку вопрос. Если я передаю массив в функцию, я по сути передаю указатель на первый элемент массива. И менять я сам указатель не могу же в функции, верно?
>>946896 Можешь делать с указателем что хочешь. конечно если это не *const
Ты можешь присвоить этому указателю новое значение. Однако это значение не вернётся обраттно в вызывающую ф-цию. Чтобы вернуть значение новго указателя из ф-ции ты должен передать указатель на указатель. В твоём случае realloc - вероятнее всего вернёт новый указатель и ты долже вернуть его обратно. Следовательно ты должен предевать не m[] а указатель на m[].
>>946665 А можно что-то попроще? Чтобы я мог создать окно выбранного размера и рисовать там пиксели, линии, прямоугольники, дуги, многоугольники, эллипсы. Или хотя бы отдельные пиксели.
>>947060 Вверху информация. Можешь WinApi использовать. В книге, которая выше сразу пример рисования текста. А тут http://www.codenet.ru/progr/delphi/WinAPI/ есть справочник функций. Или sdl попробуй.
>>946603 (OP) Только что узнал что в си есть goto. В курсах такого не говорили. Просто подумал, а вдруг в си тоже есть goto? И оказалось да. Оказывается си не такой уж и плохой, по сравнению с ассемблером. Это многое упростит.
Хотелось бы увидеть примеры реальных программ. Пока смог найти только исходники старых игр (DOOM, квэйк и т.п.). Но есть ли что поновее (не игры)? Хотя бы список программ, где часть написана на чистом си не подкинете?
сап, анон, есть два сту... кхех... настольная приложуха. Динамический лексический словарь, который пополняется юзверем. Работать приложуха должна фоном. Иногда на некоторые слова приложуха тригерится и выкидывает юзверю куски си-кода. И всё это говно должно неприрывно работать и перекомпилироваться во время выполнения. Так, как во время фонового выполнения уже кодер вносит патчи и всякие фичи. Внимание, знатоки, вопрос. Сколько хуё... кхм... Как GCC заставить этот код постоянно компилироваться "на лету"? Видел, в одной статье как с помощью malloc() код сконверченный в поток байтов, запиханных в массив знаков, запускали в JIT. Или же проще искать сторонние интерпритаторы для си, которые помогут в этом случае. Короче, дайте линк на годное чтиво, особенно по компиляторам. Или лучше искать документацию GCC? И куда тогда смотреть, чтобы достичь моего эффекта?
сап, анон. Я искренне не понимаю, почему у людей горит с сишных указателей. По-моему это чуть ли не гениальнейшая вещь, которой Си может похвастаться. Это ведь круто, когда ты должен сам контролить активные области, а не полагаться на транслятор, в надежде, что он выполнит так как надо. Хотя я сам и не до конца понимаю и не разбираюсь в указателях, но это однозначно куртая фича по моему скромному мнению. Это ведь круто, что одна переменная может иметь кучу различных имён, указывающих на неё. Если память кодера коротенькая и он просто не помнит название переменной, то просто можно вызывать её по синонимам-указателям. Хотя, это не уникальная вещь, это лишь одно из практических применений указателей. В общем, я каждый раз недоумеваю, когда кто-то бугуртит на указатели.
В Си нет других удобных указателей, кроме обычных указателей (адрес места хранения вот сейчас). В крестах можно придать указателю нужные свойства через операторы и конструкторы/деструкторы, в Сях - только через громоздкие вызовы процедур.
Представь себе, что ты передаёшь указатель на большой массив в процедуру, и эта процедура созраняет его в статичной переменной для вычислений в будущем (для сглаживания, например). Потом ты как-то меняешь свою программу (и она состоит из 10000 строк, например), и где-то между вызовами этой функции ты трёшь этот массив, указатель на который где-то сохранён. Потом ты вызываешь эту процедуру и получаешь Undefined Behaviour, потому что данных в этом месте хранения уже нет. Или ты делаешь realloc, и данные могут быть в другом месте.
Указатели - это гениальнейшая вещь, только в других языках они лучше и выразительнее, чем "адрес места хранения вот сейчас".
>>947268 а можно из кода делать системные вызовы для компиляции? Я так один раз сделал, у меня комп повис. Или можно оформить отдельный код, который компилирует мой изначальный код. Хотя по сути это и будет обычный скрипт.
>>947781 луа для того и нужен, чтобы ничего не компилировать динамически. везде где статика там си, если есть динамические сценарии, то можно юзать луа, которые интерпретируемый.
>>947781 если изменять код на лету, это типичный морф как в вирусах, если компилить либу и подключать на лету, то придется приложение перезапускать, чтобы все в памяти отобразилось, либо лепить велосипед которые на лету будет секцию линка в памяти править на лету. Лучше интерпретатор пускать, это выбор всего геймдева даже.
>>947883 Алеша, ты не в курсе, что крестовый рантайм спокойно влезает только в разработанное очко твоей мамаши, а всякий embed посыпется нахуй от таких раскладов?
>>947992 Загрузчик ОС, который переводит её в защищённый режим. А дальше уже идёт небольшая графическая состовляющая, позволяющая запустить одну программу, которая может повлиять на весь компьютер даже стерть загрузчик с жёсткого диска и просматривать файлы через программы и просто просматриватель файлов.
>>948017 Я почти перешёл в защищённый режим но не получилось. И не понятно почему. x86-64 для пидоров. Буду переходить на ARM. >>946603 (OP) Я похоже придумал как реализовать свою программу. Файл .msfso превращу в .bmp и выведу через функцию WinAPI. И никаких SDL не надо. Только вот потом мне надо будет организовать вставку видео и аудио. Можно ли в WinAPI сделать так? Чтобы по нажатию в некоторой области окна воспроизвелось видео или аудиофайл.
>>948016 Или сделать универсальный процессор, конечно всегда лучше специфическое устройство, но есть устройства с широким спектром задачь, ПК например. Вот для таких устройств ARM IBM AMD Qualcom решили разработать гибридную архитектуру, каждая архитектура для чего-то хороша, вот и решили повыкидывать мусор из amd64 POWER9 arm64 так чтобы остались только сильные стороны и объединить это в одной системе.
>>948245 Менялось. Появлялись новые API-функции, и в серьезных проектах ими пользуются. А вот хелловорлды можно спокойно по .hlp-файлам от Windows 95 писать, все будет работать, это вам не линукс.
>>946603 (OP) uint8_t num = 0xfe; //254 uint32_t ip_v4 = 0xc0a8d301; //192.168.211.1 ((uint8_t *)&ip_v4)[1] = num; Ананасы, что скажете о таком коде? Опасно делать такое приведение или нет? знаю, что можно всё сделать с помощью битовых масок, но такой код больше нравится
>>948409 Да мне-то всего лишь один октет сменить надо, поэтому объявление юниона выглядело бы излишним (насколько я понял, что юнионы, что приведения в моем коде имеют абсолютно тот же смысл для компилятора).
>>948622 ну если у тебя есть вышка по специальности, плюс несколько лет опыта работы по профилю то сможешь устроится на более-менее норм работу но получать все равно будешь примерно на 30% явашника или вебмакаки на аналогичной позиции вкатывальщикам же абсолютно нечего здесь делать
>>948622 Какие задачи тебе интересны? Микроконтроллеры и ембеддед? Машинное обучение, анализ данных? Энтерпрайз? Геймдев? Веб-приложения? Ещё дохуя всего не перечислил. Отсюда и надо смотреть. Если хочешь именно денег, то тут нехуй делать, имхо.
Изучи только Си - ты никому не нужен. Чтобы устроиться ты должен освоить охеренный стек соопуствующих технологий. А какие именно технологии - зависит то задач и к чему у тебя лежит душа.
>>948835 Ты в начальной школе учился? Откуда в твоем выражении может взяться ноль? Если хочешь сделать saturated subtraction - сделай явным образом, через if. Какого хуя ты unsigned для отрицательных чисел используешь?
Какого фига в первом случае (первые 2 пика) участок кода работает некорректно, а во втором случае (последние 2 пика) корректно? Это баг компилятора или я чего то не понимаю? Компилятор TDM-GCC 4.9.2 64-bit Release
>>949026 ну и трахайся тогда со старшим битом. можно ебучую макаронину заделать, или перевести старший бит в младший и обратится к массиву uint32 a[2] = { -1, 0 } ; b &= a[ну ты понял] ;
>>949070 > ты выводишь беззнаковое через знаковый флаг Я и через %u выводил, там мусор. Вероятно и в сравнении в if'е тоже сравнивается мусор. Нет чтобы так сразу и написать, но хуй, обязательно надо "ГАГАГА НУ ТЫ ДАУН".
>>949115 Третий раз за день меня называют школьником и просят съебать. Грустно всё это, я ведь просто немного туплю. Все тупят. Каждый может что-то забыть, не додуматься сразу. Сонливость, плохой день, просто не пошло, всякое бывает. Всеж мы люди, в конце-то концов, а вы так набрасываетесь на бедного ньюфага.Надеюсь это твои Семёны.
>>949152 Я сегодня из-за невнимательности где-то час не мог понять в чём проблема. Я делаю свой формат картинок чтобы не пользоваться чужим и непонятным png, но и чтобы не пользоваться громоздским bmp. И я забыл что вчера после сигнатуры начал добавлять 4 байта с комментарием, обозначающем версию. Но теперь понял и уже почти всё нормально.
Аргумент из стека можно использовать (менять), а указатель надо 1) разыменовать 2) выделить место под переменную, на которую он указывает, если хочется менять её.
>>949433 Асемблер не знаю, погуглю об этом. >>949562 Обычно ведь не приходится менять, а если надо то есть пасс бай value. >>949563 Ну да, надо учитывать все.
>>949587 Если значение менять не надо то не меняй блядь, это же С. А о лишних инструкциях хотел бы подробнее узнать, не гуглится, ну а структуры само собой лучше указателем передавать.
>>946603 (OP) Пишу игровой движок с минимумом зависимостей (только OpenGL + WinAPI/Cococa/X-Window, только хардкор), базовый функционал уже готов, собираюсь переезжать на ГитХаб. Есть вопросы по стилю: 1) Зашкварно ли использование строк вместо enum-ов в качестве аргументов функций? Делаю API одновременно и для C, и для Lua, хотелось бы гомогенности в интерфейсах. 2) Зашкварно ли использование макросов-оберток над функциями? Спасибо.
>>949684 > использование строк вместо enum-ов Сложный вопрос. Аргументы против: с enum нет нормального контроля типов, но есть защита хотя бы от опечаток, со строками нет. Плюс тормоза при сравнении строк.
> Зашкварно ли использование макросов-оберток над функциями? Нет, если макрос простой, ты можешь обосновать его существование, и можешь обосновать, почему это не static inline функция.
>>949709 >В чём проблема запилить такой тип данных?
Нельзя будет адресовать его машинным адресом. Для адресации такого объекта придётся перепиливать указатели и каждый раз их менять перед обращением к ЦП - и они будут занимать больше места (3 бита на адресацию битов и ещё сколько-то байт на выравнивание, если ты не совсем поехал и не будешь паковать вообще все объекты с дробным размером).
>>949814 Можно хоть триты запилить (в другом языке), но Сишечка создана так, чтобы быть максимально ближе к железу (при условии сохранения портабельности).
>>949861 хуефаг, если бы они были то их бы и использовали. Можно наколхозить с потерями производительности из обычных транзисторов, но смысла в этом нет. И сама информация может только в бинарном виде хранится, еще далеко до всего этого.
Либо ты можешь объяснить, где именно в MLC троичность, либо пиздобол.
Все существующие алгоритмы сделаны для двоичной логики. Их можно напрямую перенести на троичную без использования третьего состояния битов, но нахрен это?
>>949934 Почитал статью о троичных ЭОМ, годнота оказывается. В 2007 последнюю сделали. Проблема то в том что эти элементы не сожмешь до 10нм, думаю начнут считать на молекулах и атомах тогда дойдет дело и до 10тичной системы счисления, если до 36ричной то идеально вообще. Квантовые компьютеры уже пытаются делай айбиэм и дивейв, но кьюбиты это немного не то что нужно в повседневних задачах.
>>946603 (OP) Сап, /пр, думаю тут есть те кто и на плюсах пишет, с другом один вариант, поделился кодом, только пишет он на плюсах, я же на простом си, проблема только с функцией, как преобразовать int&?
>>949939 Думаешь что самый умный и разбираешься в схемотехнике лучше разработчиков микросхем? Даже если допустить, что в процессорах уперлись в двоичную логику не из соображений схемотехники, то как быть с другими цифровыми устройствами? Например АЦП, ЦАП, цифровые фильтры?
>>949934 Таким же образом можешь взять FPGA и сделать себе троичный компьютер. Цена вопроса - 100$-200$
>>949897 > Либо ты можешь объяснить, где именно в MLC троичность, либо пиздобол. Ты сказал про информацию в бинарном виде, я тебе показал реально существующий формат хранения, где более двух логических уровней, т.е., не бинарный вид. Где я пиздобол?
>>950033 int& - это ссылка, она же скрытый указатель на int. Все дереференсы внутри функции компилятор делает автоматически. Соответственно, тебе нужно заменить & на звездочку и проставить звездочки перед каждым использованием n1 и n2.
>>950113 Там 2^n, потому что это нужно для практического применения, и только. Если понадобится 3, будет 3, никаких принципиальных сложностей в этом нет.
>>946603 (OP) Блять помогите выделить 4 гигабайта памяти в программе, напишите мне простой хеллоу ворд с этим, я уже неделю ебусь, не могу выделить больше 1го. Самое ебаное что я не могу во-первых перемножить тысячи друг на друга, у меня получается ноь, НОЛЬ КАРЛ, а даже если написать одной цифрой размер то больше 1го гига система мне не выдаёт.
>>950129 У тебя 32-битная или 64-битная система? Ты не можешь записать цифру в 4 гига в 32-битной переменной, будет вот этот самый ноль. Ты не можешь выделить 4 гига непрерывным куском (без PAE) в 32-битном коде, тебе не хватит адресного пространства - оно всего 4 гига, и даже если предположить, что тебе доступны все 4, есть еще твоя программа, которой тоже занимает какие-то адреса, деля 4 гига на сколько-то до, и сколько-то после. На 64-битной системе память вполне выделится, если только у менеджера кучи (у реализации malloc()) нет каких-либо ограничений на размер объекта.
Там может храниться три "уровня" только в том случае, если ты выбросишь один "уровень". Никто в зздравом уме так делать не будет, это пустая трата ресурсов.
На кой ляд нужно получать троичную логику путём обрезания четверичной? КОМУ ЭТО НАДО?
>>950174 > Там может храниться три "уровня" только в том случае, если ты выбросишь один "уровень" Нет. Допустим, у тебя есть минимальный сигнал 0 и максимальный n. Ты можешь разбить получившийся диапазон на любое количество поддиапазонов m. Центр каждого поддиапазона с некоторым допустимым отклонением и будет логическим уровнем. Смотри пик. Причем m не обязано быть степенью двойки или четным числом, можно сделать m=3, ничего никуда обрезать не нужно. Но с ростом m растут требования к точности, становится сложнее избегать неоднозначностей, уменьшается надежность, поэтому когда тебе нужны гарантии, MLC сосет у SLC.
Спасибо, понял. Но то, что все кодеки, сжатия, кодировки и вообще всё работает с двоичными данными - это факт. Пока не будет разработан новый набор алгоритмов, которые работают быстрее на троичной логике (и они должны будут стать популярны), это всё нинужно.
Списывал одну прогу. Списал, работает, но не так как надо. ДЕБАГ @ @ @ Прошло 3 часа, это говно по прежнему не работает. Муками и болью я дошёл до одного цикла, в котором, предположительно, была неисправность. Смотрю на свой цикл, смотрю на цикл исходной проги. Мой цикл ничем не отличается от того цикла, которой я пизжу. Ладно, проблема не в нём. ДЕБАГ @ @ @ Прошло ещё 3 часа, ничего не изменилось, это говно не работает. Код уже как-то не пишется, голова не думает, я просто лежу на столике. Волею судеб скопипастил цикл из исходной проги себе в код. Вывожу им и его функцией вывода — вроде всё норм. Но моя прога и та, которую я списываю выводят информацию несколько по разному. Предположил, что обсёр в моей функции вывода инфы. ДЕБАГ @ @ @ Прошёл ещё час, я не знаю в чём проблема. Функция исправна, всё вроде должно быть норм. На мониторе два ёбаных цикла, я всё ещё на том же месте, хех... Смотрю на них — полностью одинаковые. Полностью. На хуй мне два цикла? Делать всё равно нечего, займусь чисткой кода. Стёр свой цикл, свою функцию вывода перенёс в скопипизженный цикл. Закрываю вим, компиляю. ДЕБА... Стоп, ЧЁ БЛЯДЬ? Всё работает как должно. Неисправность таки была в моём цикле! Но... Они же были полностью одинаковые. ПИЗДА
А самое обидное-то то, что я не могу посмотреть где в моём цикле был фейл, так как вим был закрыт и история проебланилась. Вот такая история. Исходная прога выводила информацию(изображение) в терминал, символами, а моя работала с пикселями на экране. Это так, уточнение.
>>950427 Ну почитай ты какую-нибудь книгу про указатели уже. Там всего два варианта. Или у тебя адрес в памяти. Или у тебя кампуктер читает значение, которое лежит по этому адресу памяти. Угадай какое действие называется разыменование?
>>950440 Обязательно читать? Если я этот код в простому коду си приведу, то выполню 70% лабы, а я уже заебался их делать каждую неделю по новой программе, анон, помоги пожалуйста, просто покажи где мне * ставить.
>>950733 Алсо, попробовал сейчас этот SDL2 (даже на с++) и neehooя не работает Либо я рукожоплю с линковкой (ничего в ней не понимаю, лол), либо это из-за х64-винды
>>950742 Ну и да. я в глаза долблюсь и туториал для плюсов. В любом случае, в самом SDL2 ничего плюсоспецифичного нет, у меня на обычном Си нормально работает.
>>950767 Все просто, там используется 32-битный mingw, поэтому тебе надо 32-битную же SDL2. Помести из lib/x86 библиотеки SDL2.dll, SDL2_image.dll, libpng16-16.dll и zlib1.dll. Тогда появится окно с синим экраном.
>>950872 Не слушай этого пидора. Только открытые инструменты, только голый make только молодось, только хардкор! Можешь юзанть Эклипс, он гибче и удобнее, кодблок можешь юзать для создания скетчей или потестить чего
>>951109 Это единственный неосилятор итт. Винда гораздо лучше годится для коденка - в винде есть нормальные отладчики и вижуал студия, а в линуксе только жцц.
>>951398 No, it's not. GCC дает хороший вывод о ошибках, есть gdb, есть clang, есть хуева туча компиляторов, и все можно потестить с помошью make или баш скрипта. clang часто вообще пишет как это фиксить. В винде в отладчики не смотят, особенно утята, да и выдают выхлоп такой себе. Ну и уебищный гуй размывает понятие о том как вообще устроен свой код.
>>951483 > есть gdb Для тех, кто хочет потратить 5 минут на ввод команд (вместо того, чтобы быстро глазками посмотреть код прямо в студии или дизасм в каком-нибудь x64dbg) в винде есть windbg, есть упомянутый cdb, да и gdb никуда не делся. В общем, есть выбор, и есть отладчики с GUI.
> В винде в отладчики не смотят, особенно утята В винде как раз можно без проблем что-нибудь отладить, как свое, так и чужое, с символами и без. В линуксе из-за отстутствия вменяемых отладчиков большинство отлаживается printf-ами и git bisect-ом. Мало кто умеет хорошо пользоваться gdb, еще меньше тех, кто может нормально отладить в gdb stripped бинарники.
>>951493 Ок, уел. Оно все равно практически неюзабельное. Но все нормальные фичи из C99/C11 давно есть.
>>951502 Мне Си нужен для решения конкретных практических задач, и мне похуй, где именно я буду их решать, лишь бы это было быстро и качественно. А тебе, видимо, только ради "мам, смотри, я пердолюсь в консольку! мам, я вывел хелловорлд! я какир, мам!".
>>951483 Но самый главный плюс линукса как платформы для разработки в том, что там нет винды.
Нет, серьёзно, в винде я постоянно пердолюсь в какие-то базовые вещи, которые везде есть из коробки. Такое чувство, что ОС мешает мне пользоваться программами, попутно разваливаясь, в связи с чем возникает необходимость подпирать её довольно уродливыми костылями. В 2017 году винда нужна исключительно как зависимость для кадов и игорей, для всего остально существует мак или прыщи. Тащемта что угодно можно поставить, только бы без винды. Это продукт созданный для заработка денег, из-за чего в него постоянно лепили (опять же) костыли, много костылей, только бы внешне он выглядело нормально, а что под капотом все срать хотели, это никому не нужно.
>>951990 Ты бы еще серым по белому код рисовал."string literal" - это не char ∗, а const char ∗. В верхнем варианте ты создаешь массив s1 и копируешь в него строку (при инициализации), поэтому все ок. В нижнем варианте ты ссылаешься на сам литерал, strtok пытается его модифицировать, а компилятор вполне мог сделать его ридонли.
Аноны а зачем clang and gcc на плюсах пишут? Почему говорили что зря так делали? И действительно ли надо компилятору ООП и темплейты и прочая хрень? Теперь если gcc без поддержки плюсов собирать то он потом и сам себя не соберет.
>>952091 Модификация строкового литерала - undefined behavior, так что просто не нужно этого делать. Видишь строку в кавычках, подразумеваешь char const * const.
Раз уж тут за OpenGL начали пояснять, то продублирую свой вопрос из /gd/: Есть вопрос по блендингу - появилась какая-то непонятная для меня вещь: Сначала включаю glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), рендерю свет. Потом - glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA) и рендерю соника - но вокруг него вдруг появляется какая-то левая рамка, причем разная для разных изображений. Знаю, что двухмерный свет надо делать по-другому - сначала рендерятся предметы, затем отдельный черный фреймбуфер для сплошной тени, потом из него вырезаются кружки света, и уже потом он рендерится поверх всего остального. Но все равно интересно, отчего такое происходит. Хоть в какую сторону копать?
>>952214 Только не обязательно глобальную переменную городить: static char s1[] = "foo"; вполне себе дает модифицируемую строчку без накладных расходов на инициализацию.
>>952631 В простейшем случае у менеджера кучи есть список блоков (адрес, размер, статус), причем свободные блоки склеиваются. Если следующий за твоим блок свободен, и он достаточного размера, realloc() просто отрезает от него нужный кусок в пользу твоего. Если нет, она идет по списку и ищет (первый попавшийся или, например, наимешьший) подходящий свободный блок. Обычно списков несколько, а дескрипторы блоков более сложные. Если ты не об этом, тогда уточни вопрос.
Когда я программировал на линуксе в gedit с помощью кланга и консолечки я мог просто в папку с исходным файлом добавлять библиотеки, которые мне нужны и подключать их. А когда я начал в виндовс программировать, с помощью DecCpp но на си я не могу так сделать. Надо какие то либы подключать или что там. Так как сделать так чтобы я библиотеки (.h файлы), которые будут находится в папке с проектом мог подключать?
Раз уж тут за OpenGL начали пояснять, то продублирую свой вопрос из /gd/: Как загрузить текстуру так, чтобы загружать не из отдельного файла, а из кода? То есть я напишу хекс код картинки и она будет загружена в текстуру? как это сделать?
>>953002 Идешь в свойства проекта, указываешь директории с инклудами и либами. Инклуды инклудишь через #include <file.h>, дополнительные либы указываешь в поле для дополнительных либ.
> которые будут находится в папке с проектом мог подключать? #include "file.h"
>>953003 > То есть я напишу хекс код картинки и она будет загружена в текстуру? Абсолютно так же, как и из файла, через glTexImage2D создается текстура, в последнем параметре адрес твоего массива с картинкой. Если нужно конкретнее, пости компилирующийся хелловорлд.
Очень просто. Картинка у тебя УЖЕ в памяти (в виде массива unsigned char, но могут и иных типов) просто кидаешь её указатель в OpenGL. Правда, ещё нужно её параметры правильно. Размеры, глубину пикселей, их тип (RGB, RGBA и прочие).
>>946603 (OP) Сап ананасы, вкатился нуфаг. Дали задание:найти количество отрицательных элементов массива и вставить найденное кол-во перед первым в массиве отрицательным числом. Я написал какую-то поеботу, которая ищет сами элементы, но не могу додуматься, как вывести их кол-во. Прошу подсказки, пик прилагаю.
Чет я не понял, кланг прямо из коробки в 2017 еще установить нельзя что-ли, собирать обязательно? Попытался хеловорд запустить с него, а он полез куда-то в инклуды визуал студии, что это было?
>>954863 Если realloc() увеличивает размер объекта, то сохраняется (копируется) то, что было, а остальное тебе нужно инициализировать самому. Если размер объекта уменьшается, данные обрежутся. И не забывай про то, что адрес объекта смениться может.
То, что scanf %d будет возвращать ноль, если получит только символы и будет возвращать -INT_MAX, если получит число вне int, это твёрдо и чётко, можно проверки делать, опираясь на это?
>>956175 Мне просто надо считать число, а введена может быть любая белиберда. Я не понимаю, почему происходит пикрил. Сначала scanf грит, что всё норм, возвращает 1 и число 23, хотя там "23у35". А потом она начинает без ожидания ввода считывать что попало, у меня так при проверках бесконечно циклится сообщение, что введено не то.
>>956204 > то у меня просто циклится сообщение printf. Потому что scanf не с чем конец строки (для нее это whitespace) матчить - добавь пробел или \n (похуй) в шаблон scanf. А лучше не ебать себе мозг хуйней, сдизайненной для студентов и рептилоидов, и явно сделать fgets и strtol, проверяя ошибки.
>>956175 >scanf подходит только для лаб sscanf'ом так удобно из строки достать значения, в одну строчку. Через strtol надо городить огород из условий. У меня иногда возникает необходимость распарсить текст на няшной, есть какие-то готовые инструменты, чтобы самому не заниматься велосипедостроением? Пытался mpc использовать для этого, но так и не смог разобраться, вроде похоже на скрипт для flex, но не то. Можно использовать flex/bison для сложных случаев, но для более простого хотелось бы что-то попроще.
>>956478 1) Huita - тайпдеф для безымянной структуры. 2) Функция huita_new возвращает указатель на struct Huita. 3) А по факту возвращает указатель на безымянную структуру типа Huita. Конечно же, компилятор ругается. Если ты хочешь использовать struct- и typedef- имена взаимозаменяемо, сделай typedef struct Huita { ... } Huita;
Давно не посещал этот тред, но думаю несколько Анонов меня должны помнить. Я не забросил и до сих пор пишу свой GUI-тулкит. Раньше я делал GTK-подобной тулкит, с объектами, но относительно недавно в глаза бросился нукляр и я захотел запилить что-то вроде него, но не такое глючное и более подходящее для моих задач. Нукляр это функциональщина, если кто не знает. while(true){ if(create_button() == 1) printf("press"); } Никаких объектов. Всё шло тащемта хорошо, но возникла необходимость кэшировать результаты вычислений, чтобы мой высер не тупил как чёрт знает что. Простой пример: Есть виджет "button", кнопка. Кнопка может принимать множество состояний — нажатие, отжатие, align, обычное состояние etc. Допустим тулкит рисует первый кадр в котором кнопка находится в обычном своём состоянии. Тулкит трудился, считал, срал на битмап и вот она кнопочка. Заебись. Второй кадр. По хорошему стоит узнать, не изменилось ли состояние кнопки, и если не изменилось, то просто скопировать часть готового битмапа в новый кадр. На словах это просто, но как сделать что-то подобное без объектов непонятно. У меня ведь нет никакой информации о том, что было с этой, конкретной кнопкой в прошлом кадре. Ну и с чем мне сравнивать? Если бы у меня было что-то вроде GTK, с объектами, то всё было бы действительно просто. В функцию отрисовки кнопки прилетает указатель на объект button, в котором хранится вся информация именно о этой кнопке, о том, что было с ней в предыдущем кадре, о том, что с ней сейчас, и на основе этого легко понять нужно ли брать готовую картинку из предыдущего кадра или нарисовать по новой. ИРЛ всё совершенно иначе, всё вышесказанное простое упрощение, главное что смысл понятен. А если объектов нет, то как?
*Надеюсь этот текст хоть кто-то понял. Тут вроде были понимающие в GTK люди, да и нукляроёбы тоже были.%%
Алсо, почему нукляр взлетел? Он же ничего не кэширует и рисует с нуля каждый кадр, это долго. Я понимаю, что его в основном использует с OpenGL и т.п. штуками, но блядь, всё равно не круто.
>>956737 >Надеюсь этот текст хоть кто-то понял. Тут вроде были понимающие в GTK люди, да и нукляроёбы тоже были. Тут есть даже я, разобравший Иксы и Presentation Manager и заново их собравший, как Никола Тесла собирал и разбирал электромоторы в уме, и так несколько раз. Очень просто они устроены, не нужны там некокие «объекты-субъекты», каждое окно и каждое поле ввода получает сообщение "paint" через обыкновенную очередь сообщений (не сокет и не пайп, они там тоже нинужны) и вызывает функции вроде «ставь точку вон туда» с координатами, и только-то.
Ты бы лучше вот подумал, на кой хер нам ещё один новый GUI-тулкит и куда нам его, солить?.. Их десятки, а будут сотни, и всё, что тут можнозделоть — дать им растровую сетку (по одной для каждого окна верхнего уровня) и пусть на ней и рисуют.
>>956742 > каждое окно и каждое поле ввода получает сообщение "paint" через обыкновенную очередь сообщений (не сокет и не пайп, они там тоже нинужны) и вызывает функции вроде «ставь точку вон туда» с координатами, и только-то. Стоп-стоп-стоп. Либо я тебя неправильно понял, либо ты описал функцию отрисовки. У меня есть линия. Горизонтальная. На 10 пикселей. Чтобы такую нарисовать нужно поставить 10 точек, 10 итераций цикла. Можно конечно 120 раз в секунду ебашить по 10 итераций, но линия-то как была, так и есть, ничего не меняется. В таком случае гораздо производительнее, условно говоря, вместо 10 итераций выполнять один memcpy. Но в моей ситуации эта линия может измениться, цвет поменять, ещё что, и memcpy тут не обойтись, нужно заново пройти 10 итераций и нарисовать линию запрошенную изменениями, и потом опять до момента изменения копировать память. Проблема тут в том, что без объектов тулкит не может узнать поменялась ли линия, т.к. он не знает что было с ней в прошлом кадре.
Если я тебя просто неправильно понял, то опиши свою мысль нагляднее, пожалуйста.
> на кой хер нам > нам Мне. Я хочу написать то, на чём мне будет удобно писать свои хотелки. GTK говно, нукляр баговый и не для моих целей. В остальном у нас есть груда крестоговна и различные обвязки.
>>956752 >Либо я тебя неправильно понял, либо ты описал функцию отрисовки. Попробую ещё раз на примере сетевых протоколов, где несколько слоёв. 1. Драйвер видеокарты: это он переключает кадры, это он работает с видеобуфером, о чём никто кроме него даже и не знает. 2. Оконный менеджер: он создаёт области разделяемой памяти (они же растровые сетки) и выдаёт их окнам по запросу. Важно, что он никогда не ждёт никого из тех, кому выдаёт разделяемую память, вместо этого они присылают ему запросы, а он отвечает на них, и иногда (возможно) бросает на верхний уровень краткие уведомления — но никогда и никого не ждёт, чтобы не зависнуть вместе с какой-нибудь Мозиллой-Тормозиллой. Думаю, что книги Таненбаума тут помогли бы, но в общем, эти возможности есть в современных ОС уже наверное во всех. 3. Служебный поток в каждой проге: отправляет "send"-запросы на низкий уровень, получает от него растровые сетки и возвращает их назад — и вопреки стереотипам, это работает ни разу не медленно, поскольку на отображение страниц памяти расходуется очень немного времени и тактов процессора. 4. Поток отрисовки, он же поток обработки сообщений: у него своя очередь, куда ему последовательно ставят задания и уведомления о том, что произошло, будь то нажатие на клавишу или сигнал от таймера или сообщение "paint". Он ставит точки на растровой сетке и ничего даже о ней не знает. Зато у него есть шрифты, цветовая палитра (тут сто миллионов цветов, если мало, добавим ещё), штриховки-закраски, границы отсечения, границы им нарисованного и т.д.д.д.д.д. 5. Тулкит, фреймвор, C++ и браузер. Ещё встроенная СУБД с хранимыми поцедурами и куча ключевых слов, "лет", "муд", "фн", "твюэйт", "патирнь", "салюжяньсь". 6. Скриптовый езыг поверх всего етово. 7. Самый последний XML. 8. Таблица стилей. 9.......... 10..... 11... ...
>У меня есть линия. Горизонтальная. На 10 пикселей. Чтобы такую нарисовать нужно поставить 10 точек, 10 итераций цикла. Не ставь точку, если на растровой сетке она уже стоит, не терзай кеш процессора.
>Можно конечно 120 раз в секунду ебашить по 10 итераций, но линия-то как была, так и есть, ничего не меняется. Этим пусть занимаетьса драйвер видеокарты, сколько там у него кадров-в-секунду.
>В таком случае гораздо производительнее, условно говоря, вместо 10 итераций выполнять один memcpy. Вне видеодрайвера? Ни разу не будет выполнено ни одной memcpy.
>Но в моей ситуации эта линия может измениться, цвет поменять, ещё что, Тогда у тебя поток отрисовки, он же поток обработки сообщения, вытащит из очереди сообщение "paint" и начнёт рисовать.
>и memcpy тут не обойтись, нужно заново пройти 10 итераций и нарисовать линию запрошенную изменениями, Ну и что, поставь границы отсечения и не будет он рисовать за ними.
>и потом опять до момента изменения копировать память. Выше видеодрайвера не надо копировать память. Потом, когда-нибудь, он получит сообщение от кококонного менеджера (и зачем я всё это пишу, а?) и перенесёт изменённый прямоугольник в видеопамять. Это никого на верхнем уровне волновать не должно.
>Проблема тут в том, что без объектов тулкит не может узнать поменялась ли линия, т.к. он не знает что было с ней в прошлом кадре. Объекты вам принёс великий маг и чародей Бэльгэйц чтоб вы сидели тихо и не рыпались и не смели никуда мигрировать с маздаЯ. Объекты под люнюфьсь — это вообще такой трешак, что ни в сказске скозать ни пером описать, вот правду говорят, у семи нянек дитя без глазу.
>Если я тебя просто неправильно понял, то опиши свою мысль нагляднее, пожалуйста. БРОСЬ КАКУ!!!
IRL, классы объектов — это всего лишь правила доступа к данным, то есть контракты только и всего.
>>956761 Не выйдет. Мой тулкит работает следующим образом. Есть цикл и в нём весь рантайм(это в пользовательской программе): int main(void) { while(true) { draw_button("button1"); draw_button("button2"); draw_button("button3"); } } Довольно грубый пример. И вот я записываю каждую кнопку в свою глобальную переменную и ориентируюсь на неё. Круто? Да. Но крутость продолжается до тех пор, пока в цикл кто-то не добавит какое-нибудь условие вроде: ... if(shit == 1) { draw_button("button2.5"); } ... В кишках тулкита всё пойдёт по пизде, т.к. всегда летели три кнопки, а сейчас внезапно четвёртая пришла. Что с ней делать? Откуда она? Я ведь не могу контролировать цикл вне своего тулкита. Если прикрутить сюда объекты, то это тоже ничего не решит, всё в любом случае будет пидорасить. А для того, чтобы не пидорасило, нужно чтобы в пользовательской проге всё определялось один раз и после всем заправлял тулкит, как в GTK: int main(void) { draw_button("button1"); draw_button("button2"); draw_button("button3"); toolkit_main_loop(); } Привет каллбекам и прочей параше.
>>956762 Ты описываешь какую-то низкоуровщину, с которой мне и работать не придётся, а я не могу тебя понять, связи не вижу.
Всё что у меня есть это bitpixmap так же они называются?. Указатель на память, куда я пишу данные, из которых образуются пиксели. Для простоты создана функция draw_point(x, y). > Не ставь точку, если на растровой сетке она уже стоит У нас недопонимание друг друга. Каждый кадр это: - Очистка пиксмапа - Отрисовка чего-либо на него - Скармливание пиксмапа бэкенду отрисовки (иксы/валеный/etc) А потом заново. В такой ситуации место установки следующей точки всегда равняется нулю, там ничего нет. А если я не буду очищать пиксам, то при анимации виджетов будут артефакты. В любом случае нужно всё тереть.
> Этим пусть занимаетьса драйвер видеокарты > Вне видеодрайвера? НЕТУ ДРАЙВЕРА ВИДЕОКАРТЫ Есть пиксмап и всё.
> Ну и что, поставь границы отсечения и не будет он рисовать за ними. Я... Наверно... Другое имел в виду. Голова уже болеть начинает.
Слушай. Я, бля, нихуя тебя не понимаю. Я тут велосипедирую графический тулкит а не графический сервер. Возможно всем этим ты хотел донести до меня великую истину, но я её не уловил. Можно толще? Вот пиксмап у меня есть. Всё. Больше ничего нет. Аще.
>>956769 >Каждый кадр это: >Очистка пиксмапа Как я и думал, в условиях "свободного ПО" дитя оказывается без глазу.
>Вот пиксмап у меня есть. Всё. Больше ничего нет. Аще. Там должны быть границы, регионы, прямоугольники и тому подобное.
То есть, каждому окну рамки нужны: - Регион, где разрешается рисовать (внутренние границы отсечения) - Регион, где рисовать надо (например, область окна, требующая обновления) - Регион, где рисовать не следует (например, области, перекрытие другими окнами) - Прямоугольник, где разрешается рисовать (внешние границы области рисования) И т.д.
Возможно, все они могут быть сведены к двум прямоугольникам и регионам: "прямоугольник, задающий область рисования" и "регион, задающий пробелы в области рисования".
И ещё надо запоминать и выдавать на уровень ниже границы того, что действительно было нарисовано. Чтобы облегчить работу графического сервера, видеодрайвера и всех остальных.
И ещё нужна очередь сообщений и всё остальное. Твой пример с циклом "while" это называется OpenLook и от этого давно отказались. Примеры как он выглядел и как под него писали код нетрудно найти в Гугле.
>>956774 > - Регион, где рисовать надо (например, область окна, требующая обновления) Как понять где требуется обновление? Посмотри на картинку. Это, короче, кадр и новая итерация в пользовательском цикле. На окне размещено куча кнопок, но нажата т.е. требуется обновить только одну, размещённую где-то в средине кода кнопку. И вот, опять же, цикл: while(true) { draw_button("button"); draw_button("button"); draw_button("button"); ... draw_button("button"); // Вот она! ... draw_button("button"); draw_button("button"); draw_button("button"); }
Как видишь нужна кнопка в центре и только она, но я никак не могу прыгнуть прямо на неё, мне сначала нужно отрисовать все предыдущие кнопки. Чтобы оптимизировать всё это дело желательно как-то проверять в функции draw_button поменялось ли в неё что-то с прошлого кадра, и если не поменялось, то достаточно просто скопировать уже просчитанный результат из этого самого предыдущего кадра, не просчитывая всё повторно. Вот не получается узнать поменялась ли.
>>956769 Или ты делаешь никому не нужное неудобное stateless-говно (хайп вокруг nuklear скоро кончится), или ты делаешь объекты и колбеки. Или ты делаешь еще большее говно, давая контролам уникальные айди и создавая внутри объекты по требованию. Колбеков не будет, но это единственное преимущество. Можешь еще адрес возврата получать вместо id, лол.
>>956781 >нужна кнопка в центре и только она, но я никак не могу прыгнуть прямо на неё, мне сначала нужно отрисовать все предыдущие кнопки NYET. Каждая кнопка это окно, а у каждого окна есть границы. Действия мышкой над этими границами приведут к тому, что в окно будет направлено сообщение "мышь нажата". Обработчик сообщений для окна выберет это сообщение из очереди и затем начнёт рисование в окне. При этом будут заданы границы того, где он может рисовать (ему не разрешат ничего рисовать вне границ окна), а по окончании всех его действий с растровой сеткой будут заданы границы того, где он нарисовал. Растровая сетка будет возвращена оконной оболочке вместе с границами нарисованного. Драйвер устройства перенесёт нарисованное в видеопамять. >Вот не получается узнать поменялась ли. Графическая среда сохраняет состояние, вот этот >>956783 анонимус прав.
>>956801 Так вы о разных вещах говорите. Он говорит о stateless-GUI, который каждый кадр реквестит отрисовку всего нужного на текущий момент GUI (может так случиться, что это каждый кадр совершенно разный GUI), тулкит придумывает элементам интерфейса прямоугольники, юзает какой-нибудь алгоритм, чтобы придумать layout этим прямоугольникам, срет результатом в видеокарту, а в конце кадра забывает обо всем. Если однажды при отрисовке клик попал в один из прямоугольников - юзер получает клик, если нет - хуй с ним. Весь необходимый стейт (состояние чекбокса, текст и курсор в поле ввода и т.д.), хранит не тулкит, а вызывающий код.
Честно говоря даже не знаю как поступить. У меня полно хороших задумок хороших программ, но я каждый раз сталкиваюсь с необходимостью написания своего тулкита, и вот я пытаюсь осилить его битый год. Подход нукляра, какой же он охуенный. Я уже думал, что в скором времени таки допишу тулкит и буду заниматься чем-то действительно полезным, но обосрач. И что, опять возвращаться в степь GTK? Меня тошнит от GTK. Аноны, как вы видите идеальный тулкит для гуя? Цели: Простые десктопные приложения. С чего брать пример?
>>956902 > Сравни для начала все что есть. GTK и QT? В общем они одинаковые. Я много чего крутил в руках, но всё оно либо одинаковое, либо укуренное.
> Clutter, SDL, GLFW, EFL смотри. Это же бэкенды отрисовки, что там смотреть.
В целом мне нужен концепт размещения виджетов на экран. В GTK есть пакование в боксы и grid(в 3.0+), ни то ни другое мне не показалось приятным, а если я сделаю свой GTK но с размещением как в нукляре, то это, вероятно, будет совсем пиздец. Что делать — хуй знает.
Аноны, с какой платы начать изучать микроконтроллеры? Слышал, что советуют stm32l-discovery, но не слишком она старая? Все таки лет 7 уже прошло(или сколько там), или в мире микроконтроллеров не так все быстро меняется?
Анон, есть один вопрос: Если бы тебе ресетнули все проффесиональные знания, и оставили лишь знания об источниках знаний, учебниках, курсах и подобном, какие учебники годнота, какие мусор. Какой список учебников по математике ты составил бы для средней школы? Просто я подозреваю, что я мыслю о математических процессах очень неэффективно и неправильно. Хочу поправить фундамент, так сказать. Особенно интересует есть ли годные англоязычные учебники по математике переведенные на русский?
& - это побитовый оператор, смысл выражения в выделении одного или нескольких битов по маске, а потом к проверке, был ли хотя бы один из этих битов ненулевой. Более традиционная форма: (value & FLAGS) != 0 (проверить, установлены или нет один или несколько битов FLAGS) или (value & FLAGS) == FLAGS (когда нужно убедиться, что все биты FLAGS были установлены).
>>957476 Видимо, не понятно. Смотри, пусть: table->frame = 0x5023; #define TABLE_FRAME_ABOVE 0x1000 тогда table->frame & TABLE_FRAME_ABOVE выдаст 0x1000, а !!0x1000 выдаст 1. Если бы не было !!, мы бы присвоили в result->top 0 или 0x1000, а с !! присваиваем или 0, или 1. Когда у тебя int предназначенный для хранения bool, очень удобно, когда там не лежат странные ненулевые значения. В С99 появился bool, он при присваивании к нему автоматически преобразует значение к 0 или 1, а тут, видимо, старый код или разработчики по какой-то причине не хотели настоящий bool.
>>957477 да, верно код старый. все понятно, скорее там бул в структуре размером с байта и это позволяет избежать переполнения. хитро сука, не то что нынешнее племя.
>>957272 >не слишком она старая заебись же для вкатывания, как минимум можно много инфы нарыть и готовых примеров.
Алсо некоторые диды до сих пор на 8051 быдлокодят в радаче даже тред есть, да и на вакансии натыкался, где требовался опыт ковыряния в этом говне динозавров
>>957509 Потому что сделать n * bool иногда хочется, а все единицы позволяют только для branchless conditional assignment делать, когда битность совпадает. В общем реже оно нужно и ненадежно.
Посоветуйте книг по архитектуре процессора(Таненбаума уже почитал). И вообще, в каком направлении развиваться(стоит ли, например, ебаться с ардуионо или другими железками), чтобы взяли, скажем в интел/амуде/гнусмас, и в будущем заниматься разработкой архитектуры для новых процессоров(ну или чем-то таким, связанным с процессорами - мб эмуляция/виртуализация). Щас студентота, неплохо знаю асссемблер и си(++), но опыта с микроконтроллерами не было
>>957532 Очевидные Хэррисы про железо (ISBN 978-0-12-394424-5) и Хеннесси/Паттерсон про высокий уровень и ISA (ISBN 978-0-12-383872-8). Начинать с последней, читать обе.
>>957532 Алсо, у меня есть вот такой случайный набор букв и цифр, он подустарел, но может чего найдешь еще там: 8E2AD03BC44EBBA5DBCFC7ADBB1779BC53644166
>>957532 >чтобы взяли, скажем в интел/амуде/гнусмас, и в будущем заниматься разработкой архитектуры для новых процессоров уф, так и чувствую твое разочарование лет через десять :D
>>957532 Что сейчас не хватает процессорам так это инструкций и гибридности, для определенной задачи больше подходит определенная архитектура. Не хватает аппаратной реализации строк, массивов, инкрементов, корней/степеней, поддержки разных интеджеров нативно без переобразований. Иди в IBM.
>>946603 (OP) А можно ли среагировать на событие не проверяя состояния в цикле? Сколько ресурсов жрет такой цикл и как минимизировать последствия такого костыля? USB насколько знаю вообще в это не может, ведь это интерфейс для передачи данных а не сигналов, но если бы производители плат покаялись и одумались сделав современную замену ps/2 то как в коде обрабатывалось бы нажатие? Вообще и на низком уровне все на костылях, идет исполнение цикла, если что-то сделал то создается прерывание и обрабатывается. Как учитывая все это потребление процессора 1-2% в простое?
>>957642 а зачем тебе графические клиент-серверные архитектуры типа вейланда или иксов когда ты сидишь на собственном компе? вот когда понадобится запускать графическую прогу на другом конце шара и отрисовывать ее у себя тогда и пользуй
>>956742 >Тут есть даже я, разобравший Иксы и Presentation Manager и заново их собравший Сложно ли проксировать иксы в виндовой гуй? Все существующие подделки иксов под венду рисуют всё через свои костыли, и не вписываются в стандартный интерфейс.
>>957926 >по-православному Пасха Христова определяется очень просто и всегда одинаково:
После весеннего равноденствия (20 марта) смотрим когда ближайшее полнолуние (11 апреля) и после него ближайшее воскресенье (16 апреля) и есть день Пасхи Христовой. Но если на этот день попадает празднование жидовского песаха то празднование Светлой Христовой Пасхи переносится на следующее воскресенье. Чтобы не праздновать Восресение Распятого одновременно с распинавшими. В этом году песах в синагоге сатаны празднуется с 11 по 17 апреля. Таким образом день Пасхи Христовой переносится на неделю. День ближайшей Пасхи - 23 апреля.
Это правило определения дня Пасхи установлено неизменным первым вселенским собором в Никее. Кто ему не следует на того падает проклятие собора - анафема. Никак не зависит от календарей - принимается во внимание только равноденствие и полнолуние, которым календари абсолютно безразличны - что есть они, что их нет. И не надо стенать, "как мол так, мы на синагогу что ли должны ориентироваться когда нам праздновать нашу Пасху." Именно так, и на синагогу тоже. И из комнаты где идет молитва лучше выйти, если вдруг еретики какие заходят и начинают молиться вместе с вами. И из своего собственного дома лучше выбежать если его кто-то поджог. И христианскую свадьбу лучше перенести если рядом у безбожника-соседа день рождения и музон гремит сатанинский.
Но главное не наши рассуждения в данном случае. Главное то, что так установлено отцами - одновременно с жидовским песахом Пасха Христова не празднуется и точка.
Итак, ближайшая Пасха 23 апреля. Начало Великого поста соответсвенно выпадает на 6 марта.
Чего не хватает в C? 1. Concurrency. Потому как паралелизм дораха обходится, иногда настолько что однопоточное решение быстрее, в то время как в Go не юзаются потоки операционной системы, избегается оверхед. Строки кажется и не нужны. 2. Templates говорят позволяет добится большей оптимизации.
>>958292 Чего нет? Если ты о браузерах и файломенеджерах, vlc, mpv. То этого и не должно быть, он может и тебе не нужно. Отдельно ставь. Мозила не может в вейланд. Ozone Chromium может, webkit (epiphany, midori) может. Почти вся Qt5 хуйня работает. GTK3 тоже должно работать, не проверял пока. Я имею в виду приложения в которых не сказано ничего о поддержке вейланда скорее будут работать чем нет.
>>958330 хипстеры и это засрут. не каждый алгоритм можно рспаралелить, а запуск процессов есть в любой ос и да, потоки тоже нинужны. >>958328 тем, что шаблоны обобщают, а это всегда хуже конкретики.
>>958340 Ну насчет шаблонов он частично прав. Когда реализуешь какую-нибудь коллекцию на Си, приходится жертвовать либо производительностью, либо проверкой типов, либо копипастить код. В такие моменты очень хочется шаблоны. Хотя я бы предпочел явную кодогенерацию на этапе компиляции, а не крестовую магию.
>>958376 Интересно, если ли для Си какие-нибудь препроцессоры уровня Nemerle, чтобы обрабатывать AST? Такая штука была бы намного удобнее крестовых шаблонов.
>>958320 Мне лично только лямбд не хватает, все остальное норм. Concurrency легко эмулировать сопрограммами (setjmp/longjmp), только задачи нужно переключать вручную.
Аноны помогите кто чем может.Задали написать простой 2D шутер, вид сверху на С.Я вообще не епу как это делать читаю ,Прату, вроде решаю простые задачки, но как сделать игру хз? В инете есть только змейка.Покидайте гайдов или примеров каких с комментами (рус\англ) плиз.Хеелп
>>958617 У местных даунов с ней какие-то проблемы. То ли хэдеры с либами не могут добавить, то ли путают 32-битные и 64-битные версии. Хз, у меня проги на SDL компилились с первого раза и на винде, и в линуксе.
>>946603 (OP) Есть два файла: 1.txt и 2.txt Как мне проверить каждую строку первого файла с каждой стройок второго файла и при совпадении сделать XYZ? Строка номер 1 файла один со строкой 1 2 3 4 5 6....n до конца файла 2. Потом строка номер 2 файла 1 со строкой 1 2 3 4 5 6....n до конца файла 2?
Я нашелнабросал такое - но такой алгоритм проверяет первую строку одного файла с первой строкой другого, вторую строку со второй и тд.
>>958627 У тебя явно какие-то проблемы с пониманием массивов символов - ты кормишь в fgets один символ массива, а не сам массив. Твоя программа самым простым способом решается так: открыли файлы; while (fgets(первый файл)) { rewind(второй файл); // Перематываем на начало. while (fgets(второй файл)) { if (strcmp(строка1, строка2) == 0) { зделоть; } } } закрыли файлы. Но это ебически неоптимальный способ (зато простой). По идее, стоит прочитать второй файл в память, и сравнивать строки уже с памятью, не перечитывая повторно. Но у понадобится узнать про маллок и указатели хотя бы, а у тебя проблемы даже с массивами.
>>958632 >маллок ой нет, нахуй нахуй Вопросы оптимальностей и прочих оптимизаций неактуальны. Спасибо большое, я попробую переписать это в код и надеюсь заработает :3
>>958632 Если файл 8 гигов то наверно лучше неоптимальный и простой алгоритм юзать? По моему убеждению хуйня все это, все хуйня. Бешешь sha256sum обеих файлов и сравниваешь, вуаля!
>>958646 >>958650 Я за тебя написал уже. Все, что тебе оставалось: char stroka1[1024]; // и stroka2 аналогично и fgets(stroka1, sizeof(stroka1), file1); // и второй fgets аналогично и strcmp поправить. И погуглить, какой хедер подключить для strcmp.
>>958679 Да-да, основное предназначение SDL - как раз наименее безболезненно получать контекст опенгл и пользовательский ввод, не разбираясь, что там за очередное говно стоит у пользователя вместо гуя. Все остальные "фичи" этой либы - неюзабельные костыли.
>>958686 Ну есть же и фичи какие-то. У меня в supertux кстати опенгл не работает, а должен, но сдл работает. >>958700 >Не разобрался с файлами - мне указать вместо массивов два моих файла? Вместо имен файла кинешь туда argv[1] argv[2]
>>958743 Ебать я дно. Я тебя понял, понял почему ты написал именно так. Пиздец я дно. Спасибо тебе большое, ты спас моё ёбааную задницу - я не знаю кто ты такой, но я желаю тебе заработать много денег и жить в счастьи и гармонии. СИ-воды самые лучше. Крестобляди соснули. СПАСИБО!
>>958821 Даже у меня в школе был mingw. На английском, блядь, угу. Прекрати ныть. Ныть хорошо, но не без толку же. Заодно разберёшься с make и потеряешь рассудок\анальную девственность в таком особом обряде инициации.
>>958838 Дрочи, компилируй, дрочи, компилируй! Запускай программы! Мусори в пайпы! Открывай сокеты! Сравнивай строки! Вычисляй фибоначчи! Я не знаю, придумай чего-нибудь, короче. Потом будешь с резюме показывать. "Сматрите как я умею."
Подскажите алгоритм всех перестановок позиций из числа не полного списка Пример 3 из 3, это обычные 3! вариантов Но может быть и 2 из 3: 1 2; 2 1 2 3; 3 2 3 1; 1 3 и.т.д. Нужна генерация мыпы на различные варианты перестановок вплоть до 10 из 20. Чтобы не генерить перестановки при каждом запросе, а просто искать в мапе индекс начало искомого запроса и выдавать под список
>>959015 Создаешь пустой проект win32 и в свойствах проекта меняешь как написано тут >>957775 Затем добавляешь в проект исходный файл с расширением .c и будет тебе С11
>>959058 У тебя устаревшие сведения. C99 полностью (кроме мелких проблем с либами) и всё нужное из C11 есть по дефолту. Полная поддержка при установке фронтенда от clang.
>>959089 И часто ты компилируешь код с _Generic? Оно плохо определено в стандарте и практически неюзабельно на текущий момент. Возможно, в С21 поправят, уточнят, тогда можно будет начинать использовать.
>>959117 Отсутствие символов для системных либ - это нормально, это не ошибка. Если очень хочешь их (вот только нахуя они нубу?) - можешь погуглить "configure symbol source".
>>959093 какой 21? Сам же прекрасно понимаешь, что если прошлые стандарты называются 88, 99, 11, то следующий-то по аналогии должен состоять из двух одинаковых цифр, так что следующий стандарт по определению обязан быть 22.
Вот в этом-то и дело. Написать портабл-код и использовать портабл код в студии с гарантией отсутствия пердолинга не получится, у них в макро заявлена поддержка лишь C++98 (про С не узнавал).
>>959132 Стандарты обзываются по году выпуска, следующий выпуск стандарта намечен ориентировочно на 2021.
>>959203 > использовать портабл код в студии с гарантией отсутствия пердолинга не получится У меня от тебя _GNU_SOURCE. Не считаю пердолингом создание пары дефайнов под компилятор. Никакого портабл кода все равно не существует, системно-зависимые вещи приходится писать и #ifdef-ать для любой программы сложнее хелловорлда.
> у них в макро заявлена поддержка лишь C++98 По факту у них почти полная поддержка C++14.
>>946603 (OP) Сап, аноны. Для сортировки разного количества чисел приходиться каждый раз изменять код. Как можно задать n чисел в файле? Т.е. чтобы код сосчитал все цифры в файле и задал его как n-чисел, дальше сам разберусь.
>>959482 Но ведь у тебя код и так считает числа. В 17 строке после цикла k = количество чисел + 2 (вроде бы). Добавь обработку ошибок fscanf в строке 16, и будет точно.
>>959484 >>959486 А я том, что если в файле будет 51 число, то программа работать не будет, и мне придется менять, задаваемые размеры массива и кол-во вызова функции на 51, как избежать этого?
>>959489 Сделай массивы 10000 элементов (по условию) длиной. Иначе тебе придется городить динамическое выделение памяти через malloc (выделяешь 100 элементов, если закончились - делаешь realloc, добавляя еще столько же и т. д.).
>>959491 Спасибо, анон. А еще микровопрос, разве консоль имеет ограничение на кол-во строк? А то из 1000 только 295 чисел пишет в файле все нормально, можно ли как-то продолжить запись во второй,третий,... ряд?
>>959498 Не помню, как в десяточке. Попробуй кликнуть правой кнопкой по заголовку консоли и поискать там параметры. Среди прочего там будет размер буфера экрана.
> можно ли как-то продолжить запись во второй,третий,... ряд Нет. Консоль, в простейшем случае (когда ты работаешь с ней через printf, а не в виде окна с символами) - это печатная машинка. Можно вернуться к началу текущей строки (\r), но к предыдущей строке вернуться нельзя никак. Впрочем, ты можешь выводить числа горизонтально - просто убери \n из printf.
Анон помоги. http://pastebin.com/MMS3tSLF Первая строка содержит целое число k количество конечных автоматов. Следующие k строк содержат по два целых числа ni и mi число состояний и переходов i-го автомата. Выход должен состоять из k строк. На i-й строке выходного файла выведите одно число – нетривиальность i-го автомата. Сделал так как смог. Но хотелось бы сначало ввести кол-во строк потом числа, а только потом конечные результаты. Не пойму как запихнуть в цикл.
Возник вопрос. Имеется динамический массив структур. Причем растет массив через realloc путем добавления 1 элемента. Т.е. сначала просто у меня структура, потом массив из двух, вжух теперь из 3 и поехало.Структура в своем составе имеет интовый массив [32]. Так вышло что по новому заданию массив в структуре может быть 32, 64,128, 150. Вижу 2 решения задать в структуре объединение с 4 массивами и выбирать потом тот размер который нужен (sizeof к структуре всегда будет давать 1 размер). Но загорелась жопа зачем то усложнить и сделать гибкий массив. Но помню читал, что массив из структур в составе которых гибкий массив не есть гуд. Но сделал черновой вариант и все работало. Так как лучше поступить. Через юнион конечно надежнее, но ломает сделать с гибким массивом
>>959618 Не усложняй себе жизнь, гибкие массивы норм (мы ведь про Type elements[]; последним элементом структуры, правда?). А вот делать realloc() на один элемент больше - избыточно, лучше выбрать больший шаг хотя в одном из прошлых тредов мы выяснили, что как минимум в линуксе можно и +1 делать, не теряя в производительности.
>>959623 Да, про него. Ты прав, реально сейчас наделаю дел, а потом переделывать буду 10 раз. То что добавляю по одному тут опять же требование. Спасибо!
Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или зведочки.
Что читать:
- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/%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 2017 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)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
- https://arhivach.org/thread/155908/
- https://arhivach.org/thread/173837/
- https://arhivach.org/thread/180461/
- https://arhivach.org/thread/182958/
- https://arhivach.org/thread/188294/
- https://arhivach.org/thread/193780/
- https://arhivach.org/thread/198868/
- https://arhivach.org/thread/206632/
- https://arhivach.org/thread/211714/
- https://arhivach.org/thread/217128/
- https://arhivach.org/thread/223224/
- https://arhivach.org/thread/235327/
- https://arhivach.org/thread/237852/
- https://arhivach.org/thread/243867/
Шапка: http://piratepad.net/bJ1SdmkZyu