Это копия, сохраненная 25 мая 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или зведочки.
Что читать:
- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
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
Почему нейроночки пишут на всяком говне а не на C?
Потому что заебешься.
Кстати, где можно новичку найти учебники по OpenCL на русском? А то по CUDA, вон, академики из МГУ пишут книги, а по OpenCL нет такого вот всего...
Кек, да на аглицком-то толковых нет, просто разбросанная по интернету документация, которая целостна в голове у 1.5 пердоликов
Хотя не, я обосрался
Отбой, функция отрабатывает нормально. Дело где-то в другом месте...
Короче, трабла в том, что я в функцию передаю массив int m[], затем m меняю, а в main изменения не передаются.
Как передать?
>>946682
Оба ебанутые.
Во-первых не по ссылке, а по указателю.
Во-вторых:
Параметр m - должен быть указателем на ДИНАМИЧЕСКУЮ память. Т.е. ты не можешь написать
>int m[]={43 25 45 13 27 41};
Сперва ты должен сделать что-то вроде:
int m = malloc( sizeof(int) 6)
Потом проинициализировать значениями.
Да и вообщше привиди полный код с main(). У тебя там труха полная, даже лень разбирать.
Читани сначала оп-пик.
> int m[]={43 25 45 13 27 41};
Таковым и является. В main создан динамический массив, а вот эту вот строку я написал сам, чтобы показать, какой, например, массив поступает.
Короче, проблема решена.
А в догонку вопрос.
Если я передаю массив в функцию, я по сути передаю указатель на первый элемент массива.
И менять я сам указатель не могу же в функции, верно?
Можешь делать с указателем что хочешь.
конечно если это не *const
Ты можешь присвоить этому указателю новое значение. Однако это значение не вернётся обраттно в вызывающую ф-цию.
Чтобы вернуть значение новго указателя из ф-ции ты должен передать указатель на указатель.
В твоём случае realloc - вероятнее всего вернёт новый указатель и ты долже вернуть его обратно.
Следовательно ты должен предевать не m[] а указатель на m[].
Спасибо. Всё мне разъяснил
Пикрил, не смотри что 95, дает базу и многое до сих пор актуально на NT-системах, просто параллельно сверяйся с msdn.
А можно что-то попроще? Чтобы я мог создать окно выбранного размера и рисовать там пиксели, линии, прямоугольники, дуги, многоугольники, эллипсы. Или хотя бы отдельные пиксели.
Спасибо, аноний. То что пытался найти на всяких сайтах 2 часа и не нашёл нашёл в этой книге за первые 10 минут.
> C (чистый, pure, бедняжка:'c)
> x64-разрядную шинду
Алсо, пытался в OpenGL и Direct3D, но ниасилил
Алсо2, работать надо с 2D, нужна будет просто статичная картинка (от расчетов)
Вверху информация. Можешь WinApi использовать. В книге, которая выше сразу пример рисования текста. А тут http://www.codenet.ru/progr/delphi/WinAPI/ есть справочник функций.
Или sdl попробуй.
Только что узнал что в си есть goto. В курсах такого не говорили. Просто подумал, а вдруг в си тоже есть goto? И оказалось да. Оказывается си не такой уж и плохой, по сравнению с ассемблером. Это многое упростит.
>Хотя бы список программ, где часть написана на чистом си не подкинете?
Репу GNOME на github смотри
Тогда Пелевина.
>>946629
Я изучаю по "C для программистов с введением в C11".
10 прошло с моей сознательности, а это говно всю советуют. хорошо что я решил, что лучше линупс, чем отсосать фуллбловн у винап.
Фень Юань (GUI) и Рихтер (не GUI) все еще актуальны. Но если ты тот, кто выше про окно и png спрашивал, бери SDL2 и не выделывайся.
Для Си есть libtcc, но лучше прикрути нормальный скриптовый язык. Какой-нибудь lua, например.
чаю
>работать надо с 2D, нужна будет просто статичная картинка (от расчетов)
Используй SDL, вот тебе туториал: http://lazyfoo.net/tutorials/SDL/
В Си нет других удобных указателей, кроме обычных указателей (адрес места хранения вот сейчас). В крестах можно придать указателю нужные свойства через операторы и конструкторы/деструкторы, в Сях - только через громоздкие вызовы процедур.
Представь себе, что ты передаёшь указатель на большой массив в процедуру, и эта процедура созраняет его в статичной переменной для вычислений в будущем (для сглаживания, например). Потом ты как-то меняешь свою программу (и она состоит из 10000 строк, например), и где-то между вызовами этой функции ты трёшь этот массив, указатель на который где-то сохранён. Потом ты вызываешь эту процедуру и получаешь Undefined Behaviour, потому что данных в этом месте хранения уже нет. Или ты делаешь realloc, и данные могут быть в другом месте.
Указатели - это гениальнейшая вещь, только в других языках они лучше и выразительнее, чем "адрес места хранения вот сейчас".
> Или ты делаешь realloc, и данные могут быть в другом месте.
И тоже получаешь UB, разумеется.
а можно из кода делать системные вызовы для компиляции? Я так один раз сделал, у меня комп повис. Или можно оформить отдельный код, который компилирует мой изначальный код. Хотя по сути это и будет обычный скрипт.
луа для того и нужен, чтобы ничего не компилировать динамически. везде где статика там си, если есть динамические сценарии, то можно юзать луа, которые интерпретируемый.
если изменять код на лету, это типичный морф как в вирусах, если компилить либу и подключать на лету, то придется приложение перезапускать, чтобы все в памяти отобразилось, либо лепить велосипед которые на лету будет секцию линка в памяти править на лету. Лучше интерпретатор пускать, это выбор всего геймдева даже.
Непонимаю. Сделал как в туториале, но какая то ошибка, которую я непонимаю.
Ты либы не слинковал, с виду. На ворнинги похуй.
Алеша, ты не в курсе, что крестовый рантайм спокойно влезает только в разработанное очко твоей мамаши, а всякий embed посыпется нахуй от таких раскладов?
Мне кажется или легче на ассемблере написать операционную систему и там уже программировать на си, чем на WinAPI, SDL, OpenGL и тд?
Тебе кажется. Если ты не осилил простые API, то ОС ты тем более не осилишь.
Загрузчик ОС, который переводит её в защищённый режим. А дальше уже идёт небольшая графическая состовляющая, позволяющая запустить одну программу, которая может повлиять на весь компьютер даже стерть загрузчик с жёсткого диска и просматривать файлы через программы и просто просматриватель файлов.
Дак и сейчас не все же процессоры общего назначения
Я почти перешёл в защищённый режим но не получилось. И не понятно почему. x86-64 для пидоров.
Буду переходить на ARM.
>>946603 (OP)
Я похоже придумал как реализовать свою программу. Файл .msfso превращу в .bmp и выведу через функцию WinAPI. И никаких SDL не надо.
Только вот потом мне надо будет организовать вставку видео и аудио. Можно ли в WinAPI сделать так? Чтобы по нажатию в некоторой области окна воспроизвелось видео или аудиофайл.
Лучше сразу прикрути к своему окну WebKit браузер.
Или сделать универсальный процессор, конечно всегда лучше специфическое устройство, но есть устройства с широким спектром задачь, ПК например.
Вот для таких устройств ARM IBM AMD Qualcom решили разработать гибридную архитектуру, каждая архитектура для чего-то хороша, вот и решили повыкидывать мусор из amd64 POWER9 arm64 так чтобы остались только сильные стороны и объединить это в одной системе.
И как сие чудо назвается?
Менялось. Появлялись новые API-функции, и в серьезных проектах ими пользуются. А вот хелловорлды можно спокойно по .hlp-файлам от Windows 95 писать, все будет работать, это вам не линукс.
uint8_t num = 0xfe; //254
uint32_t ip_v4 = 0xc0a8d301; //192.168.211.1
((uint8_t *)&ip_v4)[1] = num;
Ананасы, что скажете о таком коде? Опасно делать такое приведение или нет? знаю, что можно всё сделать с помощью битовых масок, но такой код больше нравится
Про union не слышал? Как только сокеты сделали уже стали юнионом куски ip устанавливать вместо твоей нечитаемой каши.
>>948409
Только с endianness будет проблема, но в твоем примере тоже самое (читай, используй библиотечную функцию).
https://ideone.com/GnlMuk
Алё, болезный, 95-ый шиндовс не на NT-ядре. И Win32 API (который кстати появился раньше Win95) там кастрированый.
Да мне-то всего лишь один октет сменить надо, поэтому объявление юниона выглядело бы излишним (насколько я понял, что юнионы, что приведения в моем коде имеют абсолютно тот же смысл для компилятора).
ну если у тебя есть вышка по специальности, плюс несколько лет опыта работы по профилю то сможешь устроится на более-менее норм работу
но получать все равно будешь примерно на 30% явашника или вебмакаки на аналогичной позиции
вкатывальщикам же абсолютно нечего здесь делать
Какие задачи тебе интересны? Микроконтроллеры и ембеддед? Машинное обучение, анализ данных? Энтерпрайз? Геймдев? Веб-приложения? Ещё дохуя всего не перечислил.
Отсюда и надо смотреть.
Если хочешь именно денег, то тут нехуй делать, имхо.
Си знать обязан каждый. Поэтому учи.
Изучи только Си - ты никому не нужен.
Чтобы устроиться ты должен освоить охеренный стек соопуствующих технологий. А какие именно технологии - зависит то задач и к чему у тебя лежит душа.
Да.
>вкатывальщикам
А вот щас обидно было. Где же скилзы прокачать, как не выслушивая говно от анонов с двача?
Ты в начальной школе учился? Откуда в твоем выражении может взяться ноль? Если хочешь сделать saturated subtraction - сделай явным образом, через if. Какого хуя ты unsigned для отрицательных чисел используешь?
Какого ляда ты используешь разные флаги для одной и той же переменной? Более тоо, %u - это для unsigned int, а не для uint32_t, ты обосрался два раза.
Неудачный выбор языка. Попробуй JavaScript, он тебе в самый раз подойдет.
Лучше SDL ничего не придумано. Бери 2 версию, она и через OpenGL, и через Direct3D может 2D графику рисовать. Первая только программно.
>>947876
Кресты там абсолютно не нужны.
См. примеры: http://www.willusher.io/pages/sdl2/
Пикрелейтед выводит пустое черное окно.
Компилятор TDM-GCC 4.9.2 64-bit Release
(sch & sch1) == 0
И вообще так пишут только школьники
!(sch & sch1)
sch1 = sch1/2
sch1 >>= 1
И ещё:
> Откуда в твоем выражении может взяться ноль?
Попробуй поприсваивать разные значения переменной с типом _Bool.
ну и трахайся тогда со старшим битом. можно ебучую макаронину заделать, или перевести старший бит в младший и обратится к массиву
uint32 a[2] = { -1, 0 } ; b &= a[ну ты понял] ;
Блядь, да мне простой способ нужен а не этот пиздец, это базовые вещи, хочу логики.
какие, нахуй, базовые вещи, где это видано чтобы отрицательные числа в ноль ухуячивались?
А где это видано, чтобы unsigned содержал в себе отрицательные числа? И, опять же, посмотри на _Bool.
>Все отрицательные к нулю сгонять
Ебать ты колхозник по образу мысли.
Лучше на выпасе, после обеда читни что-нибудь про кампуктеры.
С моей башни очень похоже на ундефайнд бехавиоур где-то в коде до этого.
можешь надеть ещё одну шапочку из фольги - добавь прямо в условие ифа принтф через запятую, типа
if (printf("%i",sch&sch1, sch&sch1==0), sch&sch1==0)
>А где это видано, чтобы unsigned содержал в себе отрицательные числа?
1) undefined behaviour
2) ты выводишь беззнаковое через знаковый флаг
А что? implementation-defined?
>>949082
>Вероятно и в сравнении в if'е тоже сравнивается мусор.
Слабо положить разность в больший знаковый тип?
ну, бинарно. значение может быть разное, в результате обеззначивания - 3 варианта, описаны в с99.
Третий раз за день меня называют школьником и просят съебать. Грустно всё это, я ведь просто немного туплю. Все тупят. Каждый может что-то забыть, не додуматься сразу. Сонливость, плохой день, просто не пошло, всякое бывает. Всеж мы люди, в конце-то концов, а вы так набрасываетесь на бедного ньюфага.Надеюсь это твои Семёны.
Я сегодня из-за невнимательности где-то час не мог понять в чём проблема. Я делаю свой формат картинок чтобы не пользоваться чужим и непонятным png, но и чтобы не пользоваться громоздским bmp. И я забыл что вчера после сигнатуры начал добавлять 4 байта с комментарием, обозначающем версию. Но теперь понял и уже почти всё нормально.
12 битные цвета?
Какого хуя? Зачем оверхед этот нужен?
Надо на поинтерах все писать.
Аргумент из стека можно использовать (менять), а указатель надо
1) разыменовать
2) выделить место под переменную, на которую он указывает, если хочется менять её.
3) если программа многопоточная, скопировать с тек всё равно придётся, так как может ёбнуть
Дебил? Если мне не надо менять значение? Про сайд-эффекты слышал?
>Асемблер не знаю
Впрочем, все понятно.
Если значение менять не надо то не меняй блядь, это же С.
А о лишних инструкциях хотел бы подробнее узнать, не гуглится, ну а структуры само собой лучше указателем передавать.
> А о лишних инструкциях хотел бы подробнее узнать, не гуглится
gcc -S file.c или https://godbolt.org/
>Если значение менять не надо то не меняй блядь, это же С.
Ты реально собрался делать каждый раз локальную копию int/float/double-переменных, переданных в функцию?
Нет конечно, можно и по значению передать.
Пишу игровой движок с минимумом зависимостей (только OpenGL + WinAPI/Cococa/X-Window, только хардкор), базовый функционал уже готов, собираюсь переезжать на ГитХаб. Есть вопросы по стилю:
1) Зашкварно ли использование строк вместо enum-ов в качестве аргументов функций? Делаю API одновременно и для C, и для Lua, хотелось бы гомогенности в интерфейсах.
2) Зашкварно ли использование макросов-оберток над функциями?
Спасибо.
> использование строк вместо enum-ов
Сложный вопрос. Аргументы против: с enum нет нормального контроля типов, но есть защита хотя бы от опечаток, со строками нет. Плюс тормоза при сравнении строк.
> Зашкварно ли использование макросов-оберток над функциями?
Нет, если макрос простой, ты можешь обосновать его существование, и можешь обосновать, почему это не static inline функция.
Есть битовые поля.
>OpenGL
>X
Так говно ж мамонта, ему уже сколько, 25 лет, пиши на Vulkan + Wayland diplay server protocol.
Минимально адресуемая единица - 1 байт. Хочешь ворочать отдельными битами - используй бытовые операции. Тчк.
>В чём проблема запилить такой тип данных? Возможно ли это?
В архитектуре компьютера. Память адресуется побайтово.
>В чём проблема запилить такой тип данных?
Нельзя будет адресовать его машинным адресом. Для адресации такого объекта придётся перепиливать указатели и каждый раз их менять перед обращением к ЦП - и они будут занимать больше места (3 бита на адресацию битов и ещё сколько-то байт на выравнивание, если ты не совсем поехал и не будешь паковать вообще все объекты с дробным размером).
Можно хоть триты запилить (в другом языке), но Сишечка создана так, чтобы быть максимально ближе к железу (при условии сохранения портабельности).
хуефаг, если бы они были то их бы и использовали. Можно наколхозить с потерями производительности из обычных транзисторов, но смысла в этом нет. И сама информация может только в бинарном виде хранится, еще далеко до всего этого.
> сама информация может только в бинарном виде хранится
Я же говорю, ньюфаг. Не позорься. Погугли про MLC флеш память чтоли, например.
Либо ты можешь объяснить, где именно в MLC троичность, либо пиздобол.
Все существующие алгоритмы сделаны для двоичной логики. Их можно напрямую перенести на троичную без использования третьего состояния битов, но нахрен это?
Сетунь жи есть, совок использовал. Но там троичность за счет специфичности элементной базы. Правда, она была дешевле и производительнее.
Пидорахены не могут в продакшн, поэтому даже если идеи годные есть все по пизде идет. Давно пора сдать СНГ в рабство США.
>т.е. один трит записывался в два двоичных разряда, четвёртое состояние двух двоичных разрядов не использовалось.
Больше на обосрамс похоже.
Работало же. Но долбоебы загубили дешевую массовую ЭВМ для предприятий.
Почитал статью о троичных ЭОМ, годнота оказывается. В 2007 последнюю сделали. Проблема то в том что эти элементы не сожмешь до 10нм, думаю начнут считать на молекулах и атомах тогда дойдет дело и до 10тичной системы счисления, если до 36ричной то идеально вообще.
Квантовые компьютеры уже пытаются делай айбиэм и дивейв, но кьюбиты это немного не то что нужно в повседневних задачах.
>Работало же.
Даже если работало, получение троичной логики путём отрезания четвёртого состояния никаких преимуществ по сравнению с четверичной машиной не даёт.
Сап, /пр, думаю тут есть те кто и на плюсах пишет, с другом один вариант, поделился кодом, только пишет он на плюсах, я же на простом си, проблема только с функцией, как преобразовать int&?
Думаешь что самый умный и разбираешься в схемотехнике лучше разработчиков микросхем?
Даже если допустить, что в процессорах уперлись в двоичную логику не из соображений схемотехники, то как быть с другими цифровыми устройствами? Например АЦП, ЦАП, цифровые фильтры?
>>949934
Таким же образом можешь взять FPGA и сделать себе троичный компьютер. Цена вопроса - 100$-200$
> Либо ты можешь объяснить, где именно в MLC троичность, либо пиздобол.
Ты сказал про информацию в бинарном виде, я тебе показал реально существующий формат хранения, где более двух логических уровней, т.е., не бинарный вид. Где я пиздобол?
int& - это ссылка, она же скрытый указатель на int. Все дереференсы внутри функции компилятор делает автоматически. Соответственно, тебе нужно заменить & на звездочку и проставить звездочки перед каждым использованием n1 и n2.
Там 2^n, потому что это нужно для практического применения, и только. Если понадобится 3, будет 3, никаких принципиальных сложностей в этом нет.
Блять помогите выделить 4 гигабайта памяти в программе, напишите мне простой хеллоу ворд с этим, я уже неделю ебусь, не могу выделить больше 1го. Самое ебаное что я не могу во-первых перемножить тысячи друг на друга, у меня получается ноь, НОЛЬ КАРЛ, а даже если написать одной цифрой размер то больше 1го гига система мне не выдаёт.
У тебя 32-битная или 64-битная система? Ты не можешь записать цифру в 4 гига в 32-битной переменной, будет вот этот самый ноль. Ты не можешь выделить 4 гига непрерывным куском (без PAE) в 32-битном коде, тебе не хватит адресного пространства - оно всего 4 гига, и даже если предположить, что тебе доступны все 4, есть еще твоя программа, которой тоже занимает какие-то адреса, деля 4 гига на сколько-то до, и сколько-то после. На 64-битной системе память вполне выделится, если только у менеджера кучи (у реализации malloc()) нет каких-либо ограничений на размер объекта.
Там может храниться три "уровня" только в том случае, если ты выбросишь один "уровень". Никто в зздравом уме так делать не будет, это пустая трата ресурсов.
На кой ляд нужно получать троичную логику путём обрезания четверичной? КОМУ ЭТО НАДО?
> Там может храниться три "уровня" только в том случае, если ты выбросишь один "уровень"
Нет. Допустим, у тебя есть минимальный сигнал 0 и максимальный n. Ты можешь разбить получившийся диапазон на любое количество поддиапазонов m. Центр каждого поддиапазона с некоторым допустимым отклонением и будет логическим уровнем. Смотри пик. Причем m не обязано быть степенью двойки или четным числом, можно сделать m=3, ничего никуда обрезать не нужно. Но с ростом m растут требования к точности, становится сложнее избегать неоднозначностей, уменьшается надежность, поэтому когда тебе нужны гарантии, MLC сосет у SLC.
Спасибо, понял. Но то, что все кодеки, сжатия, кодировки и вообще всё работает с двоичными данными - это факт. Пока не будет разработан новый набор алгоритмов, которые работают быстрее на троичной логике (и они должны будут стать популярны), это всё нинужно.
@
@
@
Прошло 3 часа, это говно по прежнему не работает. Муками и болью я дошёл до одного цикла, в котором, предположительно, была неисправность. Смотрю на свой цикл, смотрю на цикл исходной проги. Мой цикл ничем не отличается от того цикла, которой я пизжу. Ладно, проблема не в нём. ДЕБАГ
@
@
@
Прошло ещё 3 часа, ничего не изменилось, это говно не работает. Код уже как-то не пишется, голова не думает, я просто лежу на столике. Волею судеб скопипастил цикл из исходной проги себе в код. Вывожу им и его функцией вывода — вроде всё норм. Но моя прога и та, которую я списываю выводят информацию несколько по разному. Предположил, что обсёр в моей функции вывода инфы. ДЕБАГ
@
@
@
Прошёл ещё час, я не знаю в чём проблема. Функция исправна, всё вроде должно быть норм. На мониторе два ёбаных цикла, я всё ещё на том же месте, хех... Смотрю на них — полностью одинаковые. Полностью. На хуй мне два цикла? Делать всё равно нечего, займусь чисткой кода. Стёр свой цикл, свою функцию вывода перенёс в скопипизженный цикл. Закрываю вим, компиляю. ДЕБА... Стоп, ЧЁ БЛЯДЬ? Всё работает как должно. Неисправность таки была в моём цикле! Но... Они же были полностью одинаковые. ПИЗДА
А самое обидное-то то, что я не могу посмотреть где в моём цикле был фейл, так как вим был закрыт и история проебланилась. Вот такая история. Исходная прога выводила информацию(изображение) в терминал, символами, а моя работала с пикселями на экране. Это так, уточнение.
Наоборот же. Написанный мной цикл не работал, а скопипасщенный работал идеально. Вывод: Всегда нужно копипастить.
Если честно, я не понял, до этого не использовал int, можешь подсказать где конкретно ставить?
Ебучая разметка.
Если честно, я не понял, до этого не использовал int*, можешь подсказать, где конкретно звездочки поставить?
Поставить &? Мне анон >>950077 про звездочки писал.
Мне просто нужно код из плюсов в обычный си перевести
Ну почитай ты какую-нибудь книгу про указатели уже. Там всего два варианта. Или у тебя адрес в памяти. Или у тебя кампуктер читает значение, которое лежит по этому адресу памяти.
Угадай какое действие называется разыменование?
Обязательно читать? Если я этот код в простому коду си приведу, то выполню 70% лабы, а я уже заебался их делать каждую неделю по новой программе, анон, помоги пожалуйста, просто покажи где мне * ставить.
void frag (int звёздочка fug) { ........ }
main()
{
int звёздочка fag;
int fig;
frag(fag);
frag(&fig);
}
Дарю ЗВЕЗДОЧКИ всем ITT:
××××××××××××××××××××××××××××××××
××××××××××××××××××××××××××××××××
××××××××××××××××××××××××××××××××
××××××××××××××××××××××××××××××××
Лучше бы пездочки подарил
Поставил CodeBlocks, поставил на него CSFML (по этому тутору: http://www.sfml-dev.org/tutorials/2.4/start-cb.php)
Создал пустой проект, прилинковал хуйню по этому же тутору
В проект закинул этот код (http://transit.iut2.upmf-grenoble.fr/doc/libcsfml-doc/html/)
Не копмилился из-за функций со звуком, убрал, скомпилолось
И вот нихуя
Ругается на функцию sfRenderWindow_clear() перед компилом ее комментирую, ЧТОБЫХОТЬЧТОТО
После компила кода открывается ебанаяблять консоль и ошибка
Алсо, попробовал сейчас этот SDL2 (даже на с++) и neehooя не работает
Либо я рукожоплю с линковкой (ничего в ней не понимаю, лол), либо это из-за х64-винды
Ну и да. я в глаза долблюсь и туториал для плюсов. В любом случае, в самом SDL2 ничего плюсоспецифичного нет, у меня на обычном Си нормально работает.
>>950749
Ну никак не получается, такое ощущение, что я где-то проебался, даже на плюсах не выходит
Все просто, там используется 32-битный mingw, поэтому тебе надо 32-битную же SDL2. Помести из lib/x86 библиотеки SDL2.dll, SDL2_image.dll, libpng16-16.dll и zlib1.dll. Тогда появится окно с синим экраном.
Попробуй запустить собранный .exe без IDE, из Explorer. Попробуй докинуть DLL-ки в папку с .exe.
На сайте автора SDL, лучше скачать сразу полный комплект:
https://www.libsdl.org/projects/SDL_image/
https://www.libsdl.org/projects/SDL_mixer/
https://www.libsdl.org/projects/SDL_net/
https://www.libsdl.org/projects/SDL_ttf/
Класть в каталог с EXE-шником.
Ты точно из lib\x86 библиотеки положил? Такое с 64-битными будет выскакивать.
Да в пизду, блять, снес сейчас всё нахой
Короче, вопрос открыт
Винда (х64), чистый Си, что юзать для 2д-графики и как, блять?
Без SDL/SDL2, пожалуйста D:
Ебал тибя и весь твой род-урод в рот, хехе, малалетний лапоть. Иди нахуй, пицца остынет, хуйло ты.
Поставь нормальную студию вместо этого кривой недо-IDE с кривым портом GCC. В ней все успешно собирается.
Не слушай этого пидора.
Только открытые инструменты, только голый make только молодось, только хардкор!
Можешь юзанть Эклипс, он гибче и удобнее, кодблок можешь юзать для создания скетчей или потестить чего
Какого хрена ей еще надо, непонятно.
Пидор твой отец членодевка, а этот кодоблокс в очко себе засунь, хуесос.
make-то как раз все норм собирается
Охуеваю с того что больше половины копротивляются с виндой, для прогинга она не годится.
Это единственный неосилятор итт. Винда гораздо лучше годится для коденка - в винде есть нормальные отладчики и вижуал студия, а в линуксе только жцц.
Зато для пердолинга годится. Как и С, азазахаха!
>винде есть нормальные отладчики
Единственный CDB и то в VS, в которой нет С11 и С99, а есть только кресты.
No, it's not.
GCC дает хороший вывод о ошибках, есть gdb, есть clang, есть хуева туча компиляторов, и все можно потестить с помошью make или баш скрипта.
clang часто вообще пишет как это фиксить.
В винде в отладчики не смотят, особенно утята, да и выдают выхлоп такой себе.
Ну и уебищный гуй размывает понятие о том как вообще устроен свой код.
> есть gdb
Для тех, кто хочет потратить 5 минут на ввод команд (вместо того, чтобы быстро глазками посмотреть код прямо в студии или дизасм в каком-нибудь x64dbg) в винде есть windbg, есть упомянутый cdb, да и gdb никуда не делся. В общем, есть выбор, и есть отладчики с GUI.
> В винде в отладчики не смотят, особенно утята
В винде как раз можно без проблем что-нибудь отладить, как свое, так и чужое, с символами и без. В линуксе из-за отстутствия вменяемых отладчиков большинство отлаживается printf-ами и git bisect-ом. Мало кто умеет хорошо пользоваться gdb, еще меньше тех, кто может нормально отладить в gdb stripped бинарники.
Ок, уел. Оно все равно практически неюзабельное. Но все нормальные фичи из C99/C11 давно есть.
>>951502
Мне Си нужен для решения конкретных практических задач, и мне похуй, где именно я буду их решать, лишь бы это было быстро и качественно. А тебе, видимо, только ради "мам, смотри, я пердолюсь в консольку! мам, я вывел хелловорлд! я какир, мам!".
>>951504
Впрочем, при желании VS компилирует и _Generic. Хоть и несколько охуевает от себя самой.
Но самый главный плюс линукса как платформы для разработки в том, что там нет винды.
Нет, серьёзно, в винде я постоянно пердолюсь в какие-то базовые вещи, которые везде есть из коробки. Такое чувство, что ОС мешает мне пользоваться программами, попутно разваливаясь, в связи с чем возникает необходимость подпирать её довольно уродливыми костылями.
В 2017 году винда нужна исключительно как зависимость для кадов и игорей, для всего остально существует мак или прыщи. Тащемта что угодно можно поставить, только бы без винды. Это продукт созданный для заработка денег, из-за чего в него постоянно лепили (опять же) костыли, много костылей, только бы внешне он выглядело нормально, а что под капотом все срать хотели, это никому не нужно.
Eclipse (бесплатно), CLion (платно).
Sloved by /pr/
Ну ты видимо используешь clang/C2, а я не хочу его использовать.
Не, зачем вы так меня тралити?
time laba3
Реклама в проводнике и дубликаты программ наше все. Кады и триде вообще давно на линукс перекатилось.
64, но щас поглядел битность у самой программы 64
ничего нового.
А под GTK3?
Ты бы еще серым по белому код рисовал."string literal" - это не char ∗, а const char ∗. В верхнем варианте ты создаешь массив s1 и копируешь в него строку (при инициализации), поэтому все ок. В нижнем варианте ты ссылаешься на сам литерал, strtok пытается его модифицировать, а компилятор вполне мог сделать его ридонли.
Не стоит вскрывать эту тему.
Модификация строкового литерала - undefined behavior, так что просто не нужно этого делать. Видишь строку в кавычках, подразумеваешь char const * const.
объявляй в глобальной видимости. s[] = "sadsadasd".
компилятор же не будет дублировать строчку?
Есть вопрос по блендингу - появилась какая-то непонятная для меня вещь:
Сначала включаю glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), рендерю свет. Потом - glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA) и рендерю соника - но вокруг него вдруг появляется какая-то левая рамка, причем разная для разных изображений.
Знаю, что двухмерный свет надо делать по-другому - сначала рендерятся предметы, затем отдельный черный фреймбуфер для сплошной тени, потом из него вырезаются кружки света, и уже потом он рендерится поверх всего остального. Но все равно интересно, отчего такое происходит.
Хоть в какую сторону копать?
Только не обязательно глобальную переменную городить: static char s1[] = "foo"; вполне себе дает модифицируемую строчку без накладных расходов на инициализацию.
В простейшем случае у менеджера кучи есть список блоков (адрес, размер, статус), причем свободные блоки склеиваются. Если следующий за твоим блок свободен, и он достаточного размера, realloc() просто отрезает от него нужный кусок в пользу твоего. Если нет, она идет по списку и ищет (первый попавшийся или, например, наимешьший) подходящий свободный блок. Обычно списков несколько, а дескрипторы блоков более сложные. Если ты не об этом, тогда уточни вопрос.
Как загрузить текстуру так, чтобы загружать не из отдельного файла, а из кода? То есть я напишу хекс код картинки и она будет загружена в текстуру? как это сделать?
Идешь в свойства проекта, указываешь директории с инклудами и либами. Инклуды инклудишь через #include <file.h>, дополнительные либы указываешь в поле для дополнительных либ.
> которые будут находится в папке с проектом мог подключать?
#include "file.h"
>>953003
> То есть я напишу хекс код картинки и она будет загружена в текстуру?
Абсолютно так же, как и из файла, через glTexImage2D создается текстура, в последнем параметре адрес твоего массива с картинкой. Если нужно конкретнее, пости компилирующийся хелловорлд.
Угу, Xcode.
>>953003
Очень просто. Картинка у тебя УЖЕ в памяти (в виде массива unsigned char, но могут и иных типов) просто кидаешь её указатель в OpenGL. Правда, ещё нужно её параметры правильно. Размеры, глубину пикселей, их тип (RGB, RGBA и прочие).
Пример:
float pixels[] = {
0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f
};
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels);
Хуле не ясного?
Сап ананасы, вкатился нуфаг. Дали задание:найти количество отрицательных элементов массива и вставить найденное кол-во перед первым в массиве отрицательным числом. Я написал какую-то поеботу, которая ищет сами элементы, но не могу додуматься, как вывести их кол-во. Прошу подсказки, пик прилагаю.
Заведи счетчик, положи в него 0, а когда найдешь отрицательный элемент, прибавь к счетчику 1. После цикла выведи счетчик.
Ну вроде работает, но все равно не понимаю, нахуя он лезет куда-то в тулкиты которые вместе с визуалкой установились?
Всё, вроде бы понял, даже получилось. Но как сделать элегантней, под один цикл не получается вывести?
Ок, уяснил. Еще вопрос, написано сделать "Вставка найденного количества перед первым в массиве отрицательным числом ", что это значит?
UPD: Т.е. мне нужно вывести все элементы массива и как-то пропихнуть перед первым отрицательным элементом моё число S. Как это сделать?
хотя... проще будет создать еще один массив размером n+1 и последовательно копировать данные как тебе надо
Перефразирую. Через realloc() не проебутся данные в массиыве, если я его увеличиваю/уменьшаю?
Если realloc() увеличивает размер объекта, то сохраняется (копируется) то, что было, а остальное тебе нужно инициализировать самому. Если размер объекта уменьшается, данные обрежутся. И не забывай про то, что адрес объекта смениться может.
Вот, именно то. Т.е при уменьшении размера данные в начале не повредит? Это именно то,что я и хотел, спасибо.
Да. Только не -INT_MAX, а EOF. Но лучше парсить ручками через strtol и прочие strto*. scanf подходит только для лаб.
Мне просто надо считать число, а введена может быть любая белиберда.
Я не понимаю, почему происходит пикрил.
Сначала scanf грит, что всё норм, возвращает 1 и число 23, хотя там "23у35".
А потом она начинает без ожидания ввода считывать что попало, у меня так при проверках бесконечно циклится сообщение, что введено не то.
Т.е. если я пишу
while (scanf("%d", &c)!=1)
{
printf ("Eshe raz, plz\n");
}
то у меня просто циклится сообщение printf.
> то у меня просто циклится сообщение printf.
Потому что scanf не с чем конец строки (для нее это whitespace) матчить - добавь пробел или \n (похуй) в шаблон scanf. А лучше не ебать себе мозг хуйней, сдизайненной для студентов и рептилоидов, и явно сделать fgets и strtol, проверяя ошибки.
>scanf подходит только для лаб
sscanf'ом так удобно из строки достать значения, в одну строчку. Через strtol надо городить огород из условий. У меня иногда возникает необходимость распарсить текст на няшной, есть какие-то готовые инструменты, чтобы самому не заниматься велосипедостроением? Пытался mpc использовать для этого, но так и не смог разобраться, вроде похоже на скрипт для flex, но не то. Можно использовать flex/bison для сложных случаев, но для более простого хотелось бы что-то попроще.
Кто говорит? Как говорит?
У меня GCC 5.3.0 собирается это без ошибок и предупреждений.
Может быть, он stdlib забыл подключить, хуй знает.
GCC 5.4.1
Смотрю у тебя тоже Geany который умер и не развивается из-за всяких модных саблаймов
Хм, Clang 4.0 ничего не говорит http://ideone.com/kYgRPy а GCC 6.3 вообще не компилится http://ideone.com/aHWlYP
Значит проблема в последних версиях GCC 5 и 6
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 и т.п. штуками, но блядь, всё равно не круто.
Я не забросил и до сих пор пишу свой GUI-тулкит. Раньше я делал GTK-подобной тулкит, с объектами, но относительно недавно в глаза бросился нукляр и я захотел запилить что-то вроде него, но не такое глючное и более подходящее для моих задач. Нукляр это функциональщина, если кто не знает. while(true){ if(create_button() == 1) printf("press"); } Никаких объектов.
Всё шло тащемта хорошо, но возникла необходимость кэшировать результаты вычислений, чтобы мой высер не тупил как чёрт знает что.
Простой пример: Есть виджет "button", кнопка. Кнопка может принимать множество состояний — нажатие, отжатие, align, обычное состояние etc. Допустим тулкит рисует первый кадр в котором кнопка находится в обычном своём состоянии. Тулкит трудился, считал, срал на битмап и вот она кнопочка. Заебись.
Второй кадр. По хорошему стоит узнать, не изменилось ли состояние кнопки, и если не изменилось, то просто скопировать часть готового битмапа в новый кадр. На словах это просто, но как сделать что-то подобное без объектов непонятно. У меня ведь нет никакой информации о том, что было с этой, конкретной кнопкой в прошлом кадре. Ну и с чем мне сравнивать?
Если бы у меня было что-то вроде GTK, с объектами, то всё было бы действительно просто. В функцию отрисовки кнопки прилетает указатель на объект button, в котором хранится вся информация именно о этой кнопке, о том, что было с ней в предыдущем кадре, о том, что с ней сейчас, и на основе этого легко понять нужно ли брать готовую картинку из предыдущего кадра или нарисовать по новой. ИРЛ всё совершенно иначе, всё вышесказанное простое упрощение, главное что смысл понятен. А если объектов нет, то как?
*Надеюсь этот текст хоть кто-то понял. Тут вроде были понимающие в GTK люди, да и нукляроёбы тоже были.%%
Алсо, почему нукляр взлетел? Он же ничего не кэширует и рисует с нуля каждый кадр, это долго. Я понимаю, что его в основном использует с OpenGL и т.п. штуками, но блядь, всё равно не круто.
>Надеюсь этот текст хоть кто-то понял. Тут вроде были понимающие в GTK люди, да и нукляроёбы тоже были.
Тут есть даже я, разобравший Иксы и Presentation Manager и заново их собравший, как Никола Тесла собирал и разбирал электромоторы в уме, и так несколько раз. Очень просто они устроены, не нужны там некокие «объекты-субъекты», каждое окно и каждое поле ввода получает сообщение "paint" через обыкновенную очередь сообщений (не сокет и не пайп, они там тоже нинужны) и вызывает функции вроде «ставь точку вон туда» с координатами, и только-то.
Ты бы лучше вот подумал, на кой хер нам ещё один новый GUI-тулкит и куда нам его, солить?.. Их десятки, а будут сотни, и всё, что тут можнозделоть — дать им растровую сетку (по одной для каждого окна верхнего уровня) и пусть на ней и рисуют.
> каждое окно и каждое поле ввода получает сообщение "paint" через обыкновенную очередь сообщений (не сокет и не пайп, они там тоже нинужны) и вызывает функции вроде «ставь точку вон туда» с координатами, и только-то.
Стоп-стоп-стоп. Либо я тебя неправильно понял, либо ты описал функцию отрисовки.
У меня есть линия. Горизонтальная. На 10 пикселей. Чтобы такую нарисовать нужно поставить 10 точек, 10 итераций цикла. Можно конечно 120 раз в секунду ебашить по 10 итераций, но линия-то как была, так и есть, ничего не меняется. В таком случае гораздо производительнее, условно говоря, вместо 10 итераций выполнять один memcpy. Но в моей ситуации эта линия может измениться, цвет поменять, ещё что, и memcpy тут не обойтись, нужно заново пройти 10 итераций и нарисовать линию запрошенную изменениями, и потом опять до момента изменения копировать память. Проблема тут в том, что без объектов тулкит не может узнать поменялась ли линия, т.к. он не знает что было с ней в прошлом кадре.
Если я тебя просто неправильно понял, то опиши свою мысль нагляднее, пожалуйста.
> на кой хер нам
> нам
Мне. Я хочу написать то, на чём мне будет удобно писать свои хотелки. GTK говно, нукляр баговый и не для моих целей. В остальном у нас есть груда крестоговна и различные обвязки.
>Либо я тебя неправильно понял, либо ты описал функцию отрисовки.
Попробую ещё раз на примере сетевых протоколов, где несколько слоёв.
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, классы объектов — это всего лишь правила доступа к данным, то есть контракты только и всего.
>Либо я тебя неправильно понял, либо ты описал функцию отрисовки.
Попробую ещё раз на примере сетевых протоколов, где несколько слоёв.
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, классы объектов — это всего лишь правила доступа к данным, то есть контракты только и всего.
Это называется window handle.
Не выйдет. Мой тулкит работает следующим образом. Есть цикл и в нём весь рантайм(это в пользовательской программе):
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)
А потом заново. В такой ситуации место установки следующей точки всегда равняется нулю, там ничего нет. А если я не буду очищать пиксам, то при анимации виджетов будут артефакты. В любом случае нужно всё тереть.
> Этим пусть занимаетьса драйвер видеокарты
> Вне видеодрайвера?
НЕТУ ДРАЙВЕРА ВИДЕОКАРТЫ
Есть пиксмап и всё.
> Ну и что, поставь границы отсечения и не будет он рисовать за ними.
Я... Наверно... Другое имел в виду. Голова уже болеть начинает.
Слушай. Я, бля, нихуя тебя не понимаю. Я тут велосипедирую графический тулкит а не графический сервер. Возможно всем этим ты хотел донести до меня великую истину, но я её не уловил. Можно толще? Вот пиксмап у меня есть. Всё. Больше ничего нет. Аще.
Не выйдет. Мой тулкит работает следующим образом. Есть цикл и в нём весь рантайм(это в пользовательской программе):
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)
А потом заново. В такой ситуации место установки следующей точки всегда равняется нулю, там ничего нет. А если я не буду очищать пиксам, то при анимации виджетов будут артефакты. В любом случае нужно всё тереть.
> Этим пусть занимаетьса драйвер видеокарты
> Вне видеодрайвера?
НЕТУ ДРАЙВЕРА ВИДЕОКАРТЫ
Есть пиксмап и всё.
> Ну и что, поставь границы отсечения и не будет он рисовать за ними.
Я... Наверно... Другое имел в виду. Голова уже болеть начинает.
Слушай. Я, бля, нихуя тебя не понимаю. Я тут велосипедирую графический тулкит а не графический сервер. Возможно всем этим ты хотел донести до меня великую истину, но я её не уловил. Можно толще? Вот пиксмап у меня есть. Всё. Больше ничего нет. Аще.
>Каждый кадр это:
>Очистка пиксмапа
Как я и думал, в условиях "свободного ПО" дитя оказывается без глазу.
>Вот пиксмап у меня есть. Всё. Больше ничего нет. Аще.
Там должны быть границы, регионы, прямоугольники и тому подобное.
То есть, каждому окну рамки нужны:
- Регион, где разрешается рисовать (внутренние границы отсечения)
- Регион, где рисовать надо (например, область окна, требующая обновления)
- Регион, где рисовать не следует (например, области, перекрытие другими окнами)
- Прямоугольник, где разрешается рисовать (внешние границы области рисования)
И т.д.
Возможно, все они могут быть сведены к двум прямоугольникам и регионам: "прямоугольник, задающий область рисования" и "регион, задающий пробелы в области рисования".
И ещё надо запоминать и выдавать на уровень ниже границы того, что действительно было нарисовано. Чтобы облегчить работу графического сервера, видеодрайвера и всех остальных.
И ещё нужна очередь сообщений и всё остальное. Твой пример с циклом "while" это называется OpenLook и от этого давно отказались. Примеры как он выглядел и как под него писали код нетрудно найти в Гугле.
> - Регион, где рисовать надо (например, область окна, требующая обновления)
Как понять где требуется обновление? Посмотри на картинку. Это, короче, кадр и новая итерация в пользовательском цикле. На окне размещено куча кнопок, но нажата т.е. требуется обновить только одну, размещённую где-то в средине кода кнопку. И вот, опять же, цикл:
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 поменялось ли в неё что-то с прошлого кадра, и если не поменялось, то достаточно просто скопировать уже просчитанный результат из этого самого предыдущего кадра, не просчитывая всё повторно. Вот не получается узнать поменялась ли.
> OpenLook
Спасибо, буду постигать.
Картинку забыл.
Или ты делаешь никому не нужное неудобное stateless-говно (хайп вокруг nuklear скоро кончится), или ты делаешь объекты и колбеки. Или ты делаешь еще большее говно, давая контролам уникальные айди и создавая внутри объекты по требованию. Колбеков не будет, но это единственное преимущество. Можешь еще адрес возврата получать вместо id, лол.
Как сложно жить.
>нужна кнопка в центре и только она, но я никак не могу прыгнуть прямо на неё, мне сначала нужно отрисовать все предыдущие кнопки
NYET.
Каждая кнопка это окно, а у каждого окна есть границы.
Действия мышкой над этими границами приведут к тому, что в окно будет направлено сообщение "мышь нажата".
Обработчик сообщений для окна выберет это сообщение из очереди и затем начнёт рисование в окне. При этом будут заданы границы того, где он может рисовать (ему не разрешат ничего рисовать вне границ окна), а по окончании всех его действий с растровой сеткой будут заданы границы того, где он нарисовал.
Растровая сетка будет возвращена оконной оболочке вместе с границами нарисованного.
Драйвер устройства перенесёт нарисованное в видеопамять.
>Вот не получается узнать поменялась ли.
Графическая среда сохраняет состояние, вот этот >>956783 анонимус прав.
Так вы о разных вещах говорите. Он говорит о stateless-GUI, который каждый кадр реквестит отрисовку всего нужного на текущий момент GUI (может так случиться, что это каждый кадр совершенно разный GUI), тулкит придумывает элементам интерфейса прямоугольники, юзает какой-нибудь алгоритм, чтобы придумать layout этим прямоугольникам, срет результатом в видеокарту, а в конце кадра забывает обо всем. Если однажды при отрисовке клик попал в один из прямоугольников - юзер получает клик, если нет - хуй с ним. Весь необходимый стейт (состояние чекбокса, текст и курсор в поле ввода и т.д.), хранит не тулкит, а вызывающий код.
Да, мы говорим о разных вещах.
Честно говоря даже не знаю как поступить. У меня полно хороших задумок хороших программ, но я каждый раз сталкиваюсь с необходимостью написания своего тулкита, и вот я пытаюсь осилить его битый год. Подход нукляра, какой же он охуенный. Я уже думал, что в скором времени таки допишу тулкит и буду заниматься чем-то действительно полезным, но обосрач. И что, опять возвращаться в степь GTK? Меня тошнит от GTK.
Аноны, как вы видите идеальный тулкит для гуя? Цели: Простые десктопные приложения. С чего брать пример?
>VLC так и написан
ты че, ёбнулся? qt морда на c++ полностью, а работа с видео, стримами, устройствами на C
Ну так тоже вариант.
> Сравни для начала все что есть.
GTK и QT? В общем они одинаковые. Я много чего крутил в руках, но всё оно либо одинаковое, либо укуренное.
> Clutter, SDL, GLFW, EFL смотри.
Это же бэкенды отрисовки, что там смотреть.
В целом мне нужен концепт размещения виджетов на экран. В GTK есть пакование в боксы и grid(в 3.0+), ни то ни другое мне не показалось приятным, а если я сделаю свой GTK но с размещением как в нукляре, то это, вероятно, будет совсем пиздец. Что делать — хуй знает.
Под винду? Выкидываешь рантайм (или компилируешь с динамическим хотя бы), втыкаешь кастомную точку входа, мержишь секции, профит.
EFL это либы для интерфейсов
>ни то ни другое мне не показалось приятным
а мне наоборот понравился подход, когда компонент занимает все место в контейнере
А теперь собери clangом или чем угодно другим, и покушай.
Короче накидал пикрел, буду ориентироваться на него. Надеюсь будет удобно.
матанопетух, уймись
result->top = !!(table->frame & TABLE_FRAME_ABOVE);
зачем двойное отрицание, в чем тайный смысл?
Привести 0 или n к 0 или 1.
& - это побитовый оператор, смысл выражения в выделении одного или нескольких битов по маске, а потом к проверке, был ли хотя бы один из этих битов ненулевой. Более традиционная форма:
(value & FLAGS) != 0 (проверить, установлены или нет один или несколько битов FLAGS) или (value & FLAGS) == FLAGS (когда нужно убедиться, что все биты FLAGS были установлены).
Это понятно, но ведь достаточно записать как:
result->top = (table->frame & TABLE_FRAME_ABOVE);
Видимо, не понятно. Смотри, пусть:
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.
да, верно код старый. все понятно, скорее там бул в структуре размером с байта и это позволяет избежать переполнения. хитро сука, не то что нынешнее племя.
двойное отрицание для кастинга мне еще не встречалось, возьму на заметку.
>не слишком она старая
заебись же для вкатывания, как минимум можно много инфы нарыть и готовых примеров.
Алсо некоторые диды до сих пор на 8051 быдлокодят в радаче даже тред есть, да и на вакансии натыкался, где требовался опыт ковыряния в этом говне динозавров
>автоматически преобразует значение к 0 или 1
Почему, кстати, 1, а не все единицы, так же удобнее?
Потому что сделать n * bool иногда хочется, а все единицы позволяют только для branchless conditional assignment делать, когда битность совпадает. В общем реже оно нужно и ненадежно.
Нахуй тебе дискавери. Возьми аналог за 100 рублей с али, достаточно, чтобы начать вкатываться.
Можно, но я имел в виду неявные умножения/сдвиги в коде типа const char *something[] = { "foo", "bar" }; puts(something[some_bool]);
Очевидные Хэррисы про железо (ISBN 978-0-12-394424-5) и Хеннесси/Паттерсон про высокий уровень и ISA (ISBN 978-0-12-383872-8). Начинать с последней, читать обе.
Алсо, у меня есть вот такой случайный набор букв и цифр, он подустарел, но может чего найдешь еще там: 8E2AD03BC44EBBA5DBCFC7ADBB1779BC53644166
>чтобы взяли, скажем в интел/амуде/гнусмас, и в будущем заниматься разработкой архитектуры для новых процессоров
уф, так и чувствую твое разочарование лет через десять :D
http://4chan-science.wikia.com/wiki/Mathematics
http://4chan-science.wikia.com/wiki/Math_Textbook_Recommendations
В этом списке есть книги, которые сначала были написаны на русском, а потом были переведены на английский. Так что некоторые книги можно и на русском прочитать, но большинство годной литературы пишется на английском и не переводится на русский.
Чому так?
Что сейчас не хватает процессорам так это инструкций и гибридности, для определенной задачи больше подходит определенная архитектура.
Не хватает аппаратной реализации строк, массивов, инкрементов, корней/степеней, поддержки разных интеджеров нативно без переобразований.
Иди в IBM.
А можно ли среагировать на событие не проверяя состояния в цикле?
Сколько ресурсов жрет такой цикл и как минимизировать последствия такого костыля?
USB насколько знаю вообще в это не может, ведь это интерфейс для передачи данных а не сигналов, но если бы производители плат покаялись и одумались сделав современную замену ps/2 то как в коде обрабатывалось бы нажатие?
Вообще и на низком уровне все на костылях, идет исполнение цикла, если что-то сделал то создается прерывание и обрабатывается.
Как учитывая все это потребление процессора 1-2% в простое?
а зачем тебе графические клиент-серверные архитектуры типа вейланда или иксов когда ты сидишь на собственном компе? вот когда понадобится запускать графическую прогу на другом конце шара и отрисовывать ее у себя тогда и пользуй
фреймбуфер (ладно, шутка)
Поставить галочку в инсталляторе, а потом включить в свойствах проекта для нужной билд-конфигурации или для всех.
Какое железо?
Конечно опрашиваются, оно же само по себе сигнал не пошлет
>Тут есть даже я, разобравший Иксы и Presentation Manager и заново их собравший
Сложно ли проксировать иксы в виндовой гуй? Все существующие подделки иксов под венду рисуют всё через свои костыли, и не вписываются в стандартный интерфейс.
Дай переменным нормальные имена, нехристь!
>по-православному
Пасха Христова определяется очень просто и всегда одинаково:
После весеннего равноденствия (20 марта) смотрим когда ближайшее полнолуние (11 апреля) и после него ближайшее воскресенье (16 апреля) и есть день Пасхи Христовой. Но если на этот день попадает празднование жидовского песаха то празднование Светлой Христовой Пасхи переносится на следующее воскресенье. Чтобы не праздновать Восресение Распятого одновременно с распинавшими. В этом году песах в синагоге сатаны празднуется с 11 по 17 апреля. Таким образом день Пасхи Христовой переносится на неделю. День ближайшей Пасхи - 23 апреля.
Это правило определения дня Пасхи установлено неизменным первым вселенским собором в Никее. Кто ему не следует на того падает проклятие собора - анафема. Никак не зависит от календарей - принимается во внимание только равноденствие и полнолуние, которым календари абсолютно безразличны - что есть они, что их нет.
И не надо стенать, "как мол так, мы на синагогу что ли должны ориентироваться когда нам праздновать нашу Пасху." Именно так, и на синагогу тоже. И из комнаты где идет молитва лучше выйти, если вдруг еретики какие заходят и начинают молиться вместе с вами. И из своего собственного дома лучше выбежать если его кто-то поджог. И христианскую свадьбу лучше перенести если рядом у безбожника-соседа день рождения и музон гремит сатанинский.
Но главное не наши рассуждения в данном случае. Главное то, что так установлено отцами - одновременно с жидовским песахом Пасха Христова не празднуется и точка.
Итак, ближайшая Пасха 23 апреля. Начало Великого поста соответсвенно выпадает на 6 марта.
Не хочется добавлять в православный алгоритм расчет богомерзкого песаха. Герман Львович, не по божески это.
1. Concurrency. Потому как паралелизм дораха обходится, иногда настолько что однопоточное решение быстрее, в то время как в Go не юзаются потоки операционной системы, избегается оверхед.
Строки кажется и не нужны.
2. Templates говорят позволяет добится большей оптимизации.
Чего нет?
Если ты о браузерах и файломенеджерах, vlc, mpv. То этого и не должно быть, он может и тебе не нужно.
Отдельно ставь.
Мозила не может в вейланд.
Ozone Chromium может, webkit (epiphany, midori) может.
Почти вся Qt5 хуйня работает.
GTK3 тоже должно работать, не проверял пока. Я имею в виду приложения в которых не сказано ничего о поддержке вейланда скорее будут работать чем нет.
Конкуренци это не параллелизм. Паралелизм это когда потоки создаются, что не обезательно для конкуренци.
Шаблоны чем плохи? Что лучше?
И как это не нужен? Скоро в смартфонах по 32 ядра будет на десктопах 16 потоков норма уже.
хипстеры и это засрут. не каждый алгоритм можно рспаралелить, а запуск процессов есть в любой ос и да, потоки тоже нинужны.
>>958328
тем, что шаблоны обобщают, а это всегда хуже конкретики.
Ну насчет шаблонов он частично прав. Когда реализуешь какую-нибудь коллекцию на Си, приходится жертвовать либо производительностью, либо проверкой типов, либо копипастить код. В такие моменты очень хочется шаблоны. Хотя я бы предпочел явную кодогенерацию на этапе компиляции, а не крестовую магию.
Интересно, если ли для Си какие-нибудь препроцессоры уровня Nemerle, чтобы обрабатывать AST? Такая штука была бы намного удобнее крестовых шаблонов.
Мне лично только лямбд не хватает, все остальное норм. Concurrency легко эмулировать сопрограммами (setjmp/longjmp), только задачи нужно переключать вручную.
Я про родные люнупс аппликухи. В смысле запускаемые под LXSS.
У местных даунов с ней какие-то проблемы. То ли хэдеры с либами не могут добавить, то ли путают 32-битные и 64-битные версии.
Хз, у меня проги на SDL компилились с первого раза и на винде, и в линуксе.
Есть два файла: 1.txt и 2.txt
Как мне проверить каждую строку первого файла с каждой стройок второго файла и при совпадении сделать XYZ? Строка номер 1 файла один со строкой 1 2 3 4 5 6....n до конца файла 2. Потом строка номер 2 файла 1 со строкой 1 2 3 4 5 6....n до конца файла 2?
Я нашелнабросал такое - но такой алгоритм проверяет первую строку одного файла с первой строкой другого, вторую строку со второй и тд.
Если есть исходник такой хуйни - буду рад. В гугле - хуйня подобная моей.
http://pastebin.com/bvDd1LLV
У тебя явно какие-то проблемы с пониманием массивов символов - ты кормишь в fgets один символ массива, а не сам массив. Твоя программа самым простым способом решается так:
открыли файлы;
while (fgets(первый файл)) {
rewind(второй файл); // Перематываем на начало.
while (fgets(второй файл)) {
if (strcmp(строка1, строка2) == 0) {
зделоть;
}
}
}
закрыли файлы. Но это ебически неоптимальный способ (зато простой). По идее, стоит прочитать второй файл в память, и сравнивать строки уже с памятью, не перечитывая повторно. Но у понадобится узнать про маллок и указатели хотя бы, а у тебя проблемы даже с массивами.
>маллок
ой нет, нахуй нахуй
Вопросы оптимальностей и прочих оптимизаций неактуальны.
Спасибо большое, я попробую переписать это в код и надеюсь заработает :3
Если файл 8 гигов то наверно лучше неоптимальный и простой алгоритм юзать?
По моему убеждению хуйня все это, все хуйня.
Бешешь sha256sum обеих файлов и сравниваешь, вуаля!
> кормишь в fgets один символ массива, а не сам массив
А как правильно?
fgets(slovovmassive[], ?, ?);
{
for (x=0; x < 5; x++) //
{
fgets(ch_1[x], sizeof(ch_1), file_1);
for (y=0; y < 5; y++)
{
fgets(ch_2[y], sizeof(ch_2), file_2);
if (ch_1[x]==ch_2[y])
printf("\sasai\n",stroka);
else
printf("ne sasai");
stroka++;
}
Не робит нихуя твое "пока"
Да-да, основное предназначение SDL - как раз наименее безболезненно получать контекст опенгл и пользовательский ввод, не разбираясь, что там за очередное говно стоит у пользователя вместо гуя. Все остальные "фичи" этой либы - неюзабельные костыли.
Ебануться, спасибо тебе, ты охуенен, благодаря таким как ты мы эволюционируем.
Не разобрался с файлами - мне указать вместо массивов два моих файла?
Ну есть же и фичи какие-то.
У меня в supertux кстати опенгл не работает, а должен, но сдл работает.
>>958700
>Не разобрался с файлами - мне указать вместо массивов два моих файла?
Вместо имен файла кинешь туда argv[1] argv[2]
Спасибо, разобрался, вбил имена файлов.
Господи, ты даже не представляешь, как ты мне помог, живи здорово и счастливо
Я понял, что нужно указать (?) файлы и потом в массивы грузить их содержимое -но нахуя, если и так все работает)))0000
Ебать я дно. Я тебя понял, понял почему ты написал именно так. Пиздец я дно. Спасибо тебе большое, ты спас моё ёбааную задницу - я не знаю кто ты такой, но я желаю тебе заработать много денег и жить в счастьи и гармонии. СИ-воды самые лучше. Крестобляди соснули.
СПАСИБО!
Даже у меня в школе был mingw. На английском, блядь, угу. Прекрати ныть. Ныть хорошо, но не без толку же.
Заодно разберёшься с make и потеряешь рассудок\анальную девственность в таком особом обряде инициации.
Я бы тебя не нанял.
Ну и пошёл нахуй тогда, болезный. Пиздец, компилятор поставить не в состоянии.
Дрочи, компилируй, дрочи, компилируй! Запускай программы! Мусори в пайпы! Открывай сокеты! Сравнивай строки! Вычисляй фибоначчи!
Я не знаю, придумай чего-нибудь, короче. Потом будешь с резюме показывать. "Сматрите как я умею."
зря ты ты так.3760 у нас в шараге даже вижуала нет кодим на крестах в какой то веб параше
cpp.sh
так что прошу понять и простить
Если ты еще не понял то я хочю вкатится ,а этот дрочь на уровне красноглазия мне еще рано
Я только учюсь
Осталась папка bin ,которая неудаляется потому что она под админом
Качал с офф сайта
Пример 3 из 3, это обычные 3! вариантов
Но может быть и 2 из 3:
1 2; 2 1
2 3; 3 2
3 1; 1 3
и.т.д.
Нужна генерация мыпы на различные варианты перестановок вплоть до 10 из 20. Чтобы не генерить перестановки при каждом запросе, а просто искать в мапе индекс начало искомого запроса и выдавать под список
ненужны нам в кфс такие долбоебы
> просто искать в мапе индекс начало искомого запроса и выдавать под список
что ты пишешь блядь
Короче нужно получить массив перестановок для всех вариантов
int map[N][20]:
{{ 1,0,0....,0},
{ 2,,0,0....,0}... { 20,0,0....,0},
{ 1,2,0,...,0}, { 2,1,0,...,0},
{ 1,3,0,...,0}, { 3,1,0,...,0},
....
{ 19,20,0,...,0}, { 20,19,0,...,0},
{ 1,2,3,...,0}, { 1,3,2,...,0}, { 2,1,3,...,0},...,{ 3,2,1,...,0},
{ 1,2,4,...,0}, { 1,4,2,...,0}, { 2,1,4,...,0},...,{ 4,2,1,...,0},
...
{ 18,19,20,...,0}, {18,20,19,...,0}, { 19,18,20,...,0},...,{ 20,19,18,...,0}
....
..
{ 1,2,3,...,20},....{ 20,19,18,...,1}}
Да, был: Type smth
Получили его указатель Type p= &smth
И преобразовали его к в void: void pp = (void*)p
Макаба звёздочки в разметку конвертит
Большое спасибо!
А ты думаешь, что существуют компиляторы на руснявом?
Так ты ее не закрывай, дебил
Выставлять шланг не обязательно, по большей части студия и своим собственным cl код с C11 компилирует нормально.
У тебя устаревшие сведения. C99 полностью (кроме мелких проблем с либами) и всё нужное из C11 есть по дефолту. Полная поддержка при установке фронтенда от clang.
Недавно пытался скомпилировать с _Generic, cl послал меня нахуй, а clang скомпилировал нормально
И часто ты компилируешь код с _Generic? Оно плохо определено в стандарте и практически неюзабельно на текущий момент. Возможно, в С21 поправят, уточнят, тогда можно будет начинать использовать.
сменил но все равно тоже самое
Отсутствие символов для системных либ - это нормально, это не ошибка. Если очень хочешь их (вот только нахуя они нубу?) - можешь погуглить "configure symbol source".
какой 21? Сам же прекрасно понимаешь, что если прошлые стандарты называются 88, 99, 11, то следующий-то по аналогии должен состоять из двух одинаковых цифр, так что следующий стандарт по определению обязан быть 22.
А вот мне нравится 2010 студия. Точнее, всё что выше, не ставится на XP.
А про 14 и будущий 17 вам не доложили?
C90 блядь.
>>959068
Вот в этом-то и дело. Написать портабл-код и использовать портабл код в студии с гарантией отсутствия пердолинга не получится, у них в макро заявлена поддержка лишь C++98 (про С не узнавал).
На стандарты в МС болт клали.
Стандарты обзываются по году выпуска, следующий выпуск стандарта намечен ориентировочно на 2021.
>>959203
> использовать портабл код в студии с гарантией отсутствия пердолинга не получится
У меня от тебя _GNU_SOURCE. Не считаю пердолингом создание пары дефайнов под компилятор. Никакого портабл кода все равно не существует, системно-зависимые вещи приходится писать и #ifdef-ать для любой программы сложнее хелловорлда.
> у них в макро заявлена поддержка лишь C++98
По факту у них почти полная поддержка C++14.
Сап, аноны. Для сортировки разного количества чисел приходиться каждый раз изменять код. Как можно задать
n чисел в файле? Т.е. чтобы код сосчитал все цифры в файле и задал его как n-чисел, дальше сам разберусь.
Но ведь у тебя код и так считает числа. В 17 строке после цикла k = количество чисел + 2 (вроде бы). Добавь обработку ошибок fscanf в строке 16, и будет точно.
Ну так передавай первым аргументом в функцию длину массива. Ну или еще есть variadic >>959482
arguments
Сделай массивы 10000 элементов (по условию) длиной. Иначе тебе придется городить динамическое выделение памяти через malloc (выделяешь 100 элементов, если закончились - делаешь realloc, добавляя еще столько же и т. д.).
Спасибо, анон. А еще микровопрос, разве консоль имеет ограничение на кол-во строк? А то из 1000 только 295 чисел пишет в файле все нормально, можно ли как-то продолжить запись во второй,третий,... ряд?
Я это еще не изучал, да уже и без динамического выделения памяти все получилось.
Не помню, как в десяточке. Попробуй кликнуть правой кнопкой по заголовку консоли и поискать там параметры. Среди прочего там будет размер буфера экрана.
> можно ли как-то продолжить запись во второй,третий,... ряд
Нет. Консоль, в простейшем случае (когда ты работаешь с ней через printf, а не в виде окна с символами) - это печатная машинка. Можно вернуться к началу текущей строки (\r), но к предыдущей строке вернуться нельзя никак. Впрочем, ты можешь выводить числа горизонтально - просто убери \n из printf.
Перелавай массив по указателю бляха.
http://pastebin.com/MMS3tSLF
Первая строка содержит целое число k количество конечных автоматов. Следующие k строк содержат по два целых числа
ni и mi число состояний и переходов i-го автомата.
Выход должен состоять из k строк. На i-й строке выходного файла выведите одно число – нетривиальность i-го автомата.
Сделал так как смог. Но хотелось бы сначало ввести кол-во строк потом числа, а только потом конечные результаты. Не пойму как запихнуть в цикл.
Не усложняй себе жизнь, гибкие массивы норм (мы ведь про Type elements[]; последним элементом структуры, правда?). А вот делать realloc() на один элемент больше - избыточно, лучше выбрать больший шаг хотя в одном из прошлых тредов мы выяснили, что как минимум в линуксе можно и +1 делать, не теряя в производительности.
Да, про него. Ты прав, реально сейчас наделаю дел, а потом переделывать буду 10 раз. То что добавляю по одному тут опять же требование. Спасибо!
Это копия, сохраненная 25 мая 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.