Четвертый тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годныму средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. Дрочим на --analyze. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека" (да, в студию в последнее время завезли stdint и stdbool, почти все новые фишки из C11, static_assert и даже юникод). C snprintf все до сих пор плохо. Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (в частности, потыкать threads.h и stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и неполной поддержкой C99. - Borl... ээээ...
Stephen Prata "C Primer Plus, 6th Edition" (2014) Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002) Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) "Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (4th Edition)" (2014)
Jon Erickson "Hacking: The Art of Exploitation, 2nd Edition" (2008) Анон из предыдущего треда рекомендует например, в качестве примера применения Си на практике.
>>630083 Там почти полная копия pthreads. Так что можно просто пролистать соответствующий раздел стандарта, и всё сразу станет понятно в общем-то. Если всё ещё непонятно, то изучать pthreads тогда, по ним инфы навалом.
>>629828 Да, но inline как был хинтом, так и остался. Если нужно обязательно заинлайнить что-то, используй расширения своего компилятора.
>>629965 Треды, как и многие другие библиотечные фишки C11 еще не везде поддерживаются, поэтому пока писать код только на тредах C11 я бы не стал. А вот то, что язык теперь официально знает про многопоточный код и умеет в нативные thread-local переменные - это охуенно.
Решил написать базу данных @ Сделал выделение памяти, связывание её, сохранение, загрузка @ Как делать структуры? Сильно специфично. Как делать поиск. Сильно специфично. @ Сижу пишу интерпретатор своего байт кода. @ Придётся придумать человеческий код и его компиляцию в байтовый. @ Заебись сел.
>>630588 Ты пишешь парсер с использованием gtk+? Больной ублюдок. Открой уже для себя perl. С ним, я уверен, ты сократишь свою программу до одной строчки.
status ты объявляешь как int, какое нахер служебное слово.
Функция scanf() возвращает число успешно считанных элементов. Если операции считывания не происходило, что бывает в том случае, когда вместо ожидаемого цифрового значения вводится какая-либо буква, то возвращаемое значение равно 0.
Для выхода можно использовать не только q, а любую другую БУКВУ
int main() { long num; long sum = 0L; int status; printf("Please enter on integer to be summed "); printf("(q to quit): "); status = scanf("%ld", &num); while(status == 1 ){ // == means "is equal to" sum = sum + num; printf("Please enter next integer (q to quit): "); status = scanf("%ld", &num); printf("status = %i ", status); } printf("Those integers sum to %ld.'n", sum); return 0; }
>>630755 Я слишком туп для такого дерьма, я и обычными базами пользоваться не умею, просто васяню. главная задачи - избавить себя от геморра связывать данные. Потому что код становится жутким.
Но мысль всей хрени в чём, данные - не типизованы, главно чтоб их получить, нужно пройтись по массивам(хеш таблицы, например)/спискам/деревьям и прочие. То есть какая-то такая, простая система. Меня больше волнует фрагментация...
>>629715 (OP) Аноны, помогите пожалуйста, нужно написать GUI на C с полем для ввода и выводом графика в реалтайме, как это сделать? На все есть 6 часов, с GTK+ раньше вообще не работал.
>>631518 > На все есть 6 часов, с GTK+ раньше вообще не работал Если ты раньше не работал с графичискими тулкитами и учитывая то, что ты тратишь время здесь... Ты не осилишь.
>>632410 >Потому что это нестандартное и неподдерживаемое говно? Но ведь это же стандартная библиотека на C, везде, где я смотрел, предлагают или использовать kbhit(), или системные прерывания - я бы их мог накодить, но это будет слишком геморройно для маленькой утилиты.
>>632420 Это нестандартная библиотека, доставшаяся в наследство со времен Borland C. Если тебе всего лишь нужно прервать программу, сделай: http://ideone.com/v3sGZ7 - будет мммаксимум портабельно.
А вот что касается проблем с kbhit - там может быть все, что угодно. Начиная от кодировки консоли по умолчанию и заканчивая режимом ввода. Если хочешь разбраться, изыскания можно начать отсюда https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033%28v=vs.85%29.aspx Алсо, MinGW использует CRT студии, к ней есть исходники - посмотри, как kbhit реализована.
Антон, как реализовать проход через массив, что приходит аргументом в функцию без того, чтоб всегда передавать дополнительным аргументом количество элементов в массиве?
void foo(int bar[], int bar_length){ / fancy loop over the array / }
>>633749 Ну и третий вариант - написать динамичские массивы себе, если есть необходимость. Минимально, это будет структура, содержащая: указатель на данные, текущий размер массива, размер выделенной памяти (чтобы не перевыделять память с добавлением каждого элемента, а иметь некоторый запас).
>>633771 Да, как обычный вызов функции: менюшка.ссылканафункцию(аргумент). Но в самой структуре, в указателе ссылканафункцию ты должен заранее указать тип этого аргумента.
>>633785 Сложи указатели в массив и касти указатель к нужному типу структуры. Или объясни подробнее, зачем тебе по разным структурам ходить в одном цикле.
>>633791 Да, понимаю, что массивом проще. Делаю поиск по слову среди структур с одинаковой структурой, но разным содержанием (например, книги и машины итп)
>>633793 > например, книги и машины Ты тот анон, который БД пилит? У тебя вообще как данные хранятся? По рандомным структурам в рандомных местах пройтись for-ом можно только уложив указатели в массив. Если у тебя используется какая-то структура данных (а должна!), которая содержит структуры или указатели на них, то расскажи, какая.
>>633802 MS Visual C в комфортности работы с кодом один из лидеров + имеет бесплатную версию с кучей плюшек искоропки. Безусловно, если ты планируешь после изучения языка закатиться во встраиваемые системы, линукс изучить придется. Но работать можно и на виндовс, просто используя кросскомпиляцию. Главное не ставь средство работы как самоцель, просто программируй много и часто, смотри как работают другие, читай книги и тут же практикуй, иначе ты никогда не продвинешься.
>>633802 Нет, конечно. Почему ты так решил? Какой-нибудь code::blocks в винде работает так же, микрософт вон конпелятор делает, gcc можно прикрутить, никаких проблем
>>633811 Visual Studio Express тебе хватит просто за глаза. Можешь скачать с торентов видеокурс по Си от "Специалист"а, вроде. Там довольно быстро но достаточно полно расжевывается суть языка и его основные особенности.
>>633821 >посоны как отключить дискретную видеокарту >посоны, отключил встроенную видеокарту, линупс не стартует в графической среде >посоны где посмотреть настройки графической системы на хуйнянейм >посоны драйвер неправильно встал, кривое разрешение, как поправить >посоны монитор не дает настроек, где посмотреть частоту развертки моего хуйнянейм
Линукс хорошая вещь, но хороша ложка к столу. Совершенно ни к чему ебаться с новой и неизвестной системой, если на старой можно решать эту же задачу с таким же результатом.
>>633797 > БД пилит Не, нея, я долго всё обдумывал и сопоставлял. В итоге отказался от байт-кода, потому что будет некрасиво в коде (отдельным процом же лишь опция, эксперимент в будущем), а если пытаться красиво, например на макросах, то ебли дай боже. Поэтому я нашёл для себя оправдание всё это (эту хуйню) оборачивать в функции - гибкость, чтоб можно было указатели иметь и в виде смещения от начала "хипа" и в виде прямых указателей, с конвертацией в разные варианты, int16 int32 int64 - короче занимаюсь хуйнёй.
Но зачем типизировать данные, я до сих пор не понимаю. Ты же типа их туда создавал, тебе виднее что они есть. Хуй знает.
>>633824 Да не будет того же результата. Под виндой удобно разрабатывать только в стиле проприетарного софта 90-х годов, когда зависимостей у твоего кода мало и они все куплены.
Репост из общего треда Анон, нужна помощь ну просто пиздец, спросить больше не у кого. http://rghost.ru/79CSjsxQz Там два файла, один список бинарный, другой Си. Необходимо при нажатии на клавишу 5 вывести самый старый инструмент, затем предложить редактирование его даты. (Волнует именно сортировка). Моих познаний не хватает, три дня как за язык сел, и сразу прошу прощения за кривое оформление кода.
>>634032 Как это реализовать? Мне надо сортировать бинарный файл со структурой по нескольким полям (день, месяц, год). Мне нужно прочитать файл в массив структур, а потом поэтапную сортировку по дате? Или как?
>>634286 Перестановка их местами у меня получилась, функция swap внизу файла описана. Мне теперь надо найденную структуру tmp[t], она же temp_buffer[t], редактировать и обратно занести в бинарный файл.
>>633811 >>633822 Visual Studio 2015 Community Edition. Старые, в том числе и Express, весят меньше, но умеют нормально только в C89. Если места на винте жалко и/или не хочется ставить гигабайты непонятных программ - вообще лучше взять Pelles C до первого серьезного проекта.
>>633853 Смотришь потом в код, а там простыни вместо полутора инструкций. Интринсики тебе зачем дали? В другие конпеляторы не можешь, так хоть GCC-шные используй.
>>634305 Подход из стандартной библиотеки: 0 - success, > 0 ошибка (получится автоматически, если коды ошибок запихать в enum, а первым членом enum сделать success). Если функция должна возвращать что-то осмысленное в int, то есть вариант: < 0 ошибка, иначе что-то осмысленное.
>>633858 > Как ты решишь проблему порядка байт, через инлайны? А в чем проблема-то? Все твои DBI16TOLE будут инлайн-функциями, с телом или пустыми (препроцессором обеспечишь). Алсо, необходимость в препроцессоре тоже под вопросом: компиляторы сейчас умные, и, как минимум, шланг рантаймовый тест на endianess понимает, оптимизирует до константы и затем ненужные ветки if через dead code elimination выкидывает нахуй. А если какой-то компилятор и не оптимизирует, то две инструкции на тест - нихуя не оверхед.
Где можно скачать диск для книги Эриксона, чтобы загружаться на виртуалке? Перешел по ссылке из книги, и на том сайте есть ссылка на образ, но скачать невозможно.
>>634474 Попробовал. Он качается, только тупит сильно. И, может быть, у тебя браузер отобразить его пытается, а не скачать. Правой кнопкой по ссылке, сохранить как и т. д. Можешь взять какой-нибудь wget или download master. Алсо, а зачем тебе именно их LiveCD? Поставь любую убунту, тебе хватит.
>>634494 Не обязательно интересоваться какингом, чтобы читать такое. Стоит почитать, чтобы потом понимать проблемы с безопасностью в своем и чужом коде.
https://ideone.com/bVHv5M Почему-то второй раз память выделяется по тому же адресу, а не как пишут в книге. Это связано с реализацией аллокатора винды? Есть у этих двух способов аллокации какие-то плюсы и минусы?
>>635971 >а линукс мамка не разрешает устанавливать Проиграл. У меня мамка считает линукс говом для шизиков-аутистов (дословно, она вообще повсюду детектирует шизиков кто хоть сколько-нибудь отличается от среднего пидорахи), потому что ей там неудобно писать отчеты и делать дипломы для детей в фотошопе. Скоро куплю себе ноут и накачу линукс.
>>636132 Так поставь как вторую ос, хуле ты. При покупке ноута главное убедись что для него есть нормальные драйвера, иначе ты скорее админом станешь чем программировать научишься.
>>636137 >главное убедись что для него есть нормальные драйвера В каких статьях об этом написано? >иначе ты скорее админом станешь чем программировать научишься Тоже нормально. Тем более мне надо не учиться, а углублять имеющиеся знания.
>>636186 >В каких статьях об этом написано? Нигде не написано. Лучший выбор - ноутбук без дискретной видеокарты на штеуде. Если дискретка именно нужна - ищи наличие линуксовых драйверов на неё. Со всем остальным проблем давно нету. >ем более мне надо не учиться, а углублять имеющиеся знания. Ну тут 2 стула: ты растёшь как хакир-погромист или растёшь как админ, одновременно делать и то и другое не намного продуктивнее, чем поотдельности.
>>636258 А еще можно не выделываться, и поставить линукс на виртуалку, винду на виртуалку и osx на виртуалку (похуй, что будет хостом, пусть даже и тот же линукс) - это даст возможность проводить различные хеккерские эксперименты без риска угробить ОС/данные. Идите-ка вы с ОС-срачем в /s/. У нас тут тредик языка, которому на ОС, проц и прочие детали похуй. По крайней мере, в теории.
>>636374 >А еще можно не выделываться, и поставить линукс на виртуалку, винду на виртуалку и osx на виртуалку Тормозит пиздецово же. Очень раздражают легкие лаги и отрывочные движения мышки.
>>636394 Проверь, что в BIOS включена поддержка виртуализации (VTx). Проверь, что виртуалка использует виртуализацию. Даже на моем нищепк тормозит только OSX, да и то лишь слегка.
Господа, а здесь можно обсуждать качество говнокода? Что можно улучшить в моей реализации кучи? https://ideone.com/lKcWqO
Глобальная переменная будет скрыта в .c-файле. Снаружи будет виден только интерфейс. Неудобство в том, что массив для перестроения в кучу надо заполнять особым образом, оставляя нулевой элемент пустым. Это очень неудобно. Можно сделать так, чтобы индексы начинались с нуля, но тогда не получится написать такие красивые байтоебские процедуры parent, left и right.
>>636829 >Я уш думал тут дествительно куча Почему у меня не куча? Они нужны не только для сортировков, а еще для приоритетных очередей. Потом я буду наворачивать биномиальные и фибоначчиевые сливаемые кучи.
Продолжаем кавалькаду стёба над моим кодом, http://pastebin.com/A42mrQVk - и тут я решил сделать двусвязный список, от фрибейскика вся это большебуквенность.
>>636975 Нахуя ты это выкладываешь? Это никто не будет читать. Тем более с твоими петросянскими наименованиями переменных (это может быть забавно для небольшого кода, но для кода из 400 строк). Свой список реализовать на коленке для простейших задач можно в 5 минут. Это не рокет сайенс. Для чего-то более качественного можно просто юзать готовые решения, типа реализации связных списков в ядре Linux, только для юзерспейса.
>>636808 Убери xorswap, сейчас он уже неактуален т.к. код, генерируемый компилятором, получается хуже, чем "наивно" через временную переменную или банальное сложение/вычитание в случае целочисленных переменных.
>>637326 Уточню: в большинстве случаев неактуален (если ты не собираешься писать в условиях сильно ограниченной RAM или малого числа доступных регистров).
>>637326 Ебать, если и на сосаче нашёлся господин, доебавшийся до хакирьства. То и я могу накинуть за щёку, например отсутствием проверок на переполнение - но предпологаю, что у парина задача писать и позновать, а не дрочить на стрёме.
>>637443 >писать и позновать Тогда смысл пользоваться "хитрыми" битовыми приемами? Такие вещи только усложняют понимание. Сначала код должен правильно работать, а потом уже надо начинать его оптимизировать.
>>638520 CLion, Eclipse CDT - если не пугает монструозность и нужно максимум функционала IDE. Code::blocks, gnome builder, kdevelop и прочее - из легкий и минималистичных. Если хипстер дохуя - любой атом/саблайм с плагинчиками.
>>638763 Ну системную хуету, что ещё писать можно. Местные вон ОС свою пилят, где-то анончик здеся БД делал, кто-то в реверсинг вкатывается. Компилякторы ещё всякие для мастурбации, драйвера пишущие хэлло сосач до загрузки ядра. >чья деятельность наиболее безблагодатна: ФПвноедов или байтоебов. Ну ОСями, драйверами, интерпритаторами, дебаггерами и прочим кто-то же пользуется, в отличие от кластеров мультипарадигм.
>>638805 Google -> Английския язык учебник Google -> Язык C учебник Google -> Написание драйверов для %os_name% Google -> Написание вирусов для %os_name% Google -> Ассемблер %processor_type% Google -> Реверс инжиниринг Google -> Исходники драйверов %os_name%
Как извлечь максимум профита из книги Танненбаума "Архитектура компьютера"? Перечитывать главы, выписывать что-нибудь или что с ней делать для усвоения материала? Выписывать все интересующее заебешься.
>>634484 > Алсо, а зачем тебе именно их LiveCD? Поставь любую убунту, тебе хватит. Там только хитрый косяк будет, если на 64-разрядах запустишь. Регистры будут другими. И команды при отладке тоже малость отличаться будут.
>>639108 >>639109 >The command to manipulate personality flags is setarch То есть надо попросить полюзывателя "отключи-ка рандомизацию, оч хочу тебя хакнуть"?
>>639197 чёт я тут не врубился, ты, мразь, хочень провести тесты или хочель хакирить? может быть нты не сюда зашёл, или даже скорей не смог прочитать тему до конца? может мне за тебя прочитать, и например, пояснить какой адресс выставлять на возврате? сдохни сука
Помогите вернуть веру, я очень много обдумывал, буквально часами, я размышлял о внутренней структуре и внешней, ища баланс где главное - оптимальность в максимуме. Но это просто не получается не как, нельзя сделать общую бд без оверхеда. И я не могу притронуться больше к этому коду, не могу идти поперёк своего мирка. Как и к тому коду, который я писал специализированно для кое-какой информации, тоже бд только заточенная - неприятно писать заточено, когда хотел абстрагироваться на общим апи.
Я заложник придуманного мной же механизма, структуры пока ещё сильно отчётливы, и их заливаю алкоголями но они не стираются. И вместо того чтобы писать, я читаю всякую хуйню, про взлом от касперски, про емакс, малафью.
>>640422 Все правильно, пацану нужен под задачу контейнер - он пишет контейнер, нужда база данных - пишет базу. Не слушай всех этих питухов, что упиваются этим тармазным генерализированным библиотечным кодом, он нужен только для полных нулей. Норм пацан всегда напишет идеальную реализацию под свою задачу.
Как вообще чекнуть, какой юзер запускает программу? Некоторые программы выводят в консольку "this function required root access" или что-то похожее, как такое сделать?
Вопрос от неофита: есть в стандарте тип знаковый, беззнаковый и с плавающей точкой соответвующий разрядности машины, что б максимально шустрый для нее был? Аналог int из Nim, например.
>>641830 >что б максимально шустрый для нее был Нихуя не понял, что ты там своим потоком сознания изложить пытался. >Аналог int из Nim, например. Он же транслируется в си => сконпелируй и посмотри.
>>641830 > соответствующий разрядности машины Тебе это не нужно. Используй int/long и положись на компилятор. Если нужна какая-то гарантированная размерность, посмотри в stdint.h типы int_fast_t. С плавающей точкой особого выбора нет - float/double в зависимости от требуемой точности.
Допустим у меня есть FILE* pizda; В некоторых случаях, мне надо поменять дескриптор файла для вывода(перенаправить stdout куда-нибудь/или при ошибке его сделать невалидным) Я писал что-то типа: stdout->_File = myNewMegaDescriptor; myFile->_File = -1; и т.д.
В последних версиях Visual C++ CRT скрыли поля структуры _iobuf. Ну и хуле теперь делать? Нигде не написан нормальный механизм работы с дескриптором файла. И уверен, где-то подобное говно использовалось.
>>641891 >перенаправить stdout куда-нибудь почитай про unix way, это ни разу не твоей программы дело, т.е. вообще, от слова совсем >или при ошибке его сделать невалидным его можно закрыть - навсегда, а не нахрен
Где-то есть инфа, чему может быть равно значение (адрес, а не сам блок памяти), который возвращает malloc на разных системах и для разных компилляторов? (Особенно интересует различие win7 и win10)
>>642473 И что, ты часто с 16-битными char работаешь? Я тебе секрет открою: fread/fwrite по стандарту эквивалентен fgetc/fputc в цикле, а еще по стандарту читать из файла можно ровно то, что ты туда написал. Что приводит нас к интересной мысли о том, что на системах, где CHAR_BIT != 8 ты либо в принципе не можешь читать с помощью стандартной библиотеки файлы из "мира людей", либо тебе подложат костылик, и в одном char будет ровно один байт. Поэтому все это твое дрочево не имеет никакого практического смысла. Не говоря уже о порядке байтов в твоем 16-битном char.
>>642576 У нас сейчас существует такая штука, как ASLR. Все, на что ты можешь надеяться, это > 0x400000 и < 0x7x000000 на 32-битной системе (x зависит от ОС).
>>642579 Я же не из практических соображений спрашиваю, а так, вообще.
А по теме то я уже понял что из мира людей не получить стандартными функциями. По стандарту все эти функции пишут/читают весь байт (он же char). А на всех DSPхах stdio не стандартный, и от хостовой системы зачастую зависит. До полного безумия и отсутствия портируемости вообще.
Анон, как ты определяешь указатели? Ставишь звездочку перед именем переменной или перед типом данных? Или, может, вообще ставишь между типом и именем переменных, отделяя зве*дочку пробелами? Что более правильно? Есть какая-то едва уловимая разница на интуитивном уровне.
>>642832 int ∗variable; void ∗function(void ∗); void (∗function)(void ∗); Правило простое: декларация указателя отражает использование. Например, первый пример: ∗variable = 1;
>>642859 Нет, не так. Я решаю задачу из N&R. Условие ниже. Цикл ввода придумал таким. Кстати, почему из очереди каждый раз выводится один и тот же элемент? https://ideone.com/6oLJ94
Write the program tail, which prints the last n lines of its input. By default, n is 10, say, but it can be changed by an optional argument, so that tail -n prints the last n lines. The program should behave rationally no matter how unreasonable the input or the value of n. Write the program so it makes the best use of available storage; lines should be stored as in the sorting program of Section 5.6, not in a two-dimensional array of fixed size.
>>642868 Каст перед malloc убери, тут у нас Си. Насчет одного и того же элемента - покажи, где у тебя в enqueue выделяется память, в которую копируется вводимоя строка? Нигде, ты хранишь указатель на буфер, который каждый раз перезаписываешь fgets. На самом деле tail не так прост, как кажется. Строки могут быть очень длинными, длиннее 100 символов.
>>642881 >Нигде, ты хранишь указатель на буфер, который каждый раз перезаписываешь fgets Блджад, действительно. Указатель, который я сохраняю, указывает на постоянный блок памяти, которая перезаписывается. Стало быть, надо создавать новые строки перед сохранением в очереди?
>>642881 >Каст перед malloc убери, тут у нас Си Понятно, что указатель это просто unsigned число, но почему компилятор сам выводит нужный тип? В чем отличаются C и C++ в этом отношении?
Интересно, сколько бы понадобилось времени, чтобы отреверсить даже такой код и понять, что здесь используется очередь?
>>642895 malloc возвращает указатель на void. Особого смысла в касте при присваивании нет, потому что информация справа от = дублирует тип указателя слева. Я не знаю, почему в плюсах решили, что каст обязательно должен быть, но в сишечке каст избыточнен.
> указатель это просто unsigned число Не думай так. Указатель - это непрозрачное значение. На одних архитектурах это просто число, на других архитектурах указатель на функцию может быть численно равен указателю на данные, а где-то в указателе вообще могут быть закодированы метаданные.
>>642931 > от чего зависит тип, возвращаемый маллоком? (64 или 32 инт) В общем и целом, размер указателя определяется размером адресуемой памяти, что в свою очередь определяется разрядностью процессора. А на практике размер определяется разрядностью кода, который ты компилируешь. Т.е., 32-битный исполняемый файл содержит 32-битные указатели. Этот же 32-битный файл можно запустить на 64-битной системе, если проц и ОС умеют, но указатели останутся 32-битными.
>>642868 Вроде, решил задачу, но теперь выводятся какие-то лишние пустые строки после каждой строки текста, и всего выводится строк на одну меньше. А еще непонятно, как освобождать память.
>>643019 free освободит память по тому указателю, который ты в нее скормил, т.е., только саму queue. Строки тебе нужно освобождать самому. Например, можешь сделать API вида dequeue(struct queue ∗q, char ∗dest_buffer) и вызывать free внутри dequeue, а можешь просто решить, что вызывающий dequeue получает строку во владение и должен сам вызвать free.
>>643044 >можешь сделать API вида dequeue(struct queue ∗q, char ∗dest_buffer) и вызывать free внутри dequeue Смотри, вот так нормально? https://ideone.com/VlIRVw Только здесь совсем не проверяется переполнение буффера.
Но кстати, к типизации у меня дохуя претензий, ладно в ц99 завезли нормальные типы, до этого вообще мрак, как делать хасл математику над указателями - пиши макросы под каждую платформу.
Но чё вызывает мою основную жопоболь - printf - ладно, возможно они и не нужны в отлаженном проекте, но бля...
>>644663 Ну ты же животное просто если у тебя всё на маллоке заканчивается. Когда в си занимаешься вещами вроде ptr = something лучше явно указать тип, если не уверен, иначе выебешь сам себе мозг пока будешь искать где у тебя могло даные перекосоёбить силами слабой типизации.
>>644664 Ну C так-то и позиционирует себя как высокоуровенный ассемблер (у которого, на секунду, типизации нету), которому похуй что ты там ворошишь.
>>644734 > лучше явно указать тип Если справа void ∗, ничего нигде перекосоебить не может. Оно так задумано, и нормально работает.
> типизации нету Типизация есть, просто компилятор ничего не проверяет (потому что не может). А стандарт говорит, что при указании несовместимых типов будет UB.
Поясните студиозусу-баклану за динамическую память. Вот у нас есть malloc() и calloc(). malloc выделяет sizemem неинициализированной памяти, причем для изменения объема по malloc требуется вызывать realloc. А в calloc память выделяется динамически, сразу инициализируется и сама добавляется по мере необходимости. Вопрос: а нахуй тогда нужен неповоротливый malloc? То есть malloc, конечно, возвращает указатель на начало блока, что удобно, но после calloc мы тоже можем один раз спросить указатель, что явно удобнее, чем потом походу программы добрую дюжину раз ебаться с realloc.
>>647268 > и сама добавляется по мере необходимости Это ты к чему? Вся разница между ними что calloc зануляет память (потому чуть медленее) в отличие от malloc.
>>647268 >А в calloc память выделяется динамически, сразу инициализируется и сама добавляется по мере необходимости. Ты, видимо, живёшь в каком-то волшебном мире.
Анон, с чего начать, если у меня есть несколько лет опыта на скриптоте? То есть базовые конструкции и операции меня не интересуют, но ро указатели и работу с памятью я только понаслышке.
А что такого полезного можно написать на Си? На Пистоне я, допустим, скрипт, который проверяет почту и созраняет файлы написал. Скриптота деформировала мой мозг лол.
Чего можно покурить по эксплойтам кроме очевидной книги из шапки и 9 переведенных статей от некого хакера? Решил погрузиться с головой и сразу поставить цель - написать эксплойт к одной из cve-2012.
>>648390 Инкрементирую этого. Всегда чесались руки сделать свой ламповый спойт, только вот между теорией и практикай огромная пропасть. Алсо, сколько мандеев стоит один сплойт?
>>648838 > Где имеет смысл применить и закрепить полученные знания Я десктопный софт и дрова пилю, мне норм. Можешь расширение для руби написать, например.
>>648390 >>648760 Можете попробовать поразбирать чужие сплоенты и малварь, поскроллить blackhat archives, ну и целенаправленно искать презентации и статьи по интересующим техникам.
Как в люниксе передавать имя файла программе? Разбираюсь с программой simplenote.c из книги Эриксона.
Скомпилировал так: gcc simplenote.c -o simplenote Запускаю так: ./simplenote data.txt hui Возникает ошибка: No such file or directory Файл существует и лежит рядом с программой.
>>649405 >Файл существует и лежит рядом с программой Даже когда создал файл notes в /tmp, все равно появляется ошибка. К тому же флаги говорят создавать файл, если его нет.
>>648838 Хуй знает, я вот написал написал свою выделялку памяти, а на ней выделяют память всякие авлдеревья (я типо базу данных писал, как будто, а на самом деле стл чтоль)... - угарно вроде. Некогда не любил рекурсию, но сбалансированные деревья, в общем они дают мне спокойствие что стек не переполнится.
>>642944 > Я не знаю, почему в плюсах решили, что каст обязательно должен быть В C любой указатель неявно кастуется в void°, и наоборот. В C++ появились классы и иерархии типов. Неявный каст разрешён только вверх по иерархии, адрес объекта класса-потомка можно присваивать указателю типа базового класса. Если бы возможно было работать с void° как в C, это бы привело к аномальной системе типов, где void одновременно и базовый тип для всех типов и подтип всех типов.
>>649826 В компьютере буквы пронумерованы. Он не хранит буквы, только их номера. И с помощью кодовой страницы определяет, какие буквы показывать при выводе.
>>649783 То есть, это какие-то философские заморочки, никакого отношения к практике не имеющие.
>>649871 Можно добавить, что: - это просто общепринятая практика. У себя ты можешь создать массивчик, и если ты встречаешь в нем число 1 - твой код рисует смайлик, а если 2 - букву 'A', а если 3 - фразу "ОП - хуй" - компьютеры всегда работают с числами, а программа решает, как их интерпретировать; - существует дохуя многобайтовых кодировок, и в каком-нибудь UTF-8, где для кодирования символа используется от 1 до 6 байтов, getchar() будет возвращать не весь код символа, а эти байты по одному когда создавался Си, такой проблемы не было - 128 символов хватало всем, поэтому в языке до сих пор тут и там вылезают проблемы по поводу Unicode .
>>649924 >То есть, это какие-то философские заморочки, никакого отношения к практике не имеющие. Система типов это самая практика и есть. Просто кодерам непонятно, они же TAPL не читали.
>>651215 Разве? Насколько я помню, сканкоды PS/2 к ASCII отношения не имеют, их нужно транслировать в ASCII по таблицам. То же самое и с USB-шными скандкодами.
>>651058 Да, есть стандарты, они описывают, у какой клавиши какой сканкод.
Двач, поясни за Кернигана и Ричи. Программы написанные в первой главе, начиная с подсчета символов у меня отказываются правильно работать. Консоль только принимает символы, но ни куда их не выводит... Пишу под Windows в Dev C++. Можете материть сколько угодно - да, я ньюфажик после школьного паскаля (а знал его на 5 лол)
>>652877 #include <stdlib.h> в самое начало файла, system("pause"); в самый конец main() (перед return, если есть return). Если это решит проблему, рекомендую научиться компилировать и запускать программы из командной строки.
>>653012 Откуда тут iostream? Ты ошибся либо тредом, либо книгой. Возможно, ты не вводишь Ctrl+Z после своих символов, и твоя программа крутится в for, вечно ожидая EOF. Возможно, ты хочешь выводить счетчик после каждого сиимвола, в таком случае ; перед printf надо убрать.
>>653481 Мы тут все такие умные, знаем путь к библиотеке, даже имеем задолжность - библиотекарша наверно думает что мы зачитываемся, и мечтает познать этот внутренний мир. Но я только пролистал формы сортировки - чтобы ловко козырять глубинами мысли. Короче кидаю посыл, не читал - программинг не внял.
>>657351 Да. Большинство историй успеха в Си по крайней мере такие. Не представляю, как можно попасть с улицы. Можно попробовать устроиться на скриптокодера и писать нативные расширения для язычка на Си. Или в асушники/плисоводы/эмбеддеры, но там проблема как выше: без опыта не нужны, особенно в кризис.
>>657755 Хм. А "срезы" поверх массива? Срез - это когда я хочу посчитать среднее не с 0 до (N-1), а с A до (B + (N-1)), и часть массива передаю в функцию.
>>657755 Это в чистом виде не передаются. А можно обернуть в структурку и структурку по значению передать. Другое дело, что передача по значению чего-то кроме примитивных типов в сишечке не оправдана.
>>657759 Передаешь указатель на массив, стартовый индекс, количество элементов. Или передаешь указатель на начало "среза" и количество элементов. Сам массив ты не передаешь.
создал тип данных структуру (в отдельном H-файле), объявил несколько структур, которые внутри себя имеют указатели на нижестоящую и вышестоящую структуру. Создал там же ссылку на первый указатель по типу: struct *adress = &struct1 Когда вызываю эту ссылку в функции в другом подключаемом сишном файле, хуячит ошибку. Если объявляю ссылку на адрес внутри этой функции программа компилируется. Но если пишу после этого сразу что-то по типу adress = &struct1.next выводит предупреждение и данное присваивание не работает. Если присваивание так не работает, то как правильно? Если я объявляю в хидере структуру и ссылки и он подключается к главному файлу, то тип данных структура и ссылка должна же являться глобальным объявлением и должна работать в любых функциях? В общем, что я делаю не так?
>>657860 >хидере Сука, чтобы у тебя хуй не стоял. А вообще хедер без прямого инклуда в каждом объектном файле сам не подключается, так что в каждом модуле хуярь этот хедер, если у тебя там не определены эти структуры.
>>642473 >Как правильно по стандарту: stdint.h The header <stdint.h> declares sets of integer types having specified widths, and defines corresponding sets of macros. It also defines macros that specify limits of integer types corresponding to types defined in other standard headers >CHAR_BIT != 8 нет никаких uint8_t. Вообще. Не поддерживаются. Че за платформа?
>>657872 >>657871 хедер я подключил в объектном файле, к счастью извилин на это все таки хватило
Объявление стуруктуры из хедера:
typedef struct { void Next; // ссылки на следующую строку void Previous; // ссылка на предыдущую строку void Left_neighbor; // сслыка на левого соседа-столба void Right_neighbor; // ссылка на правоо соседа-столба uint8_t Y; // координаты ячейки с которой начнется вывод символов из массива uint8_t X; // У - номер строки, Х - номер позиции в строке uint8_t Select_comand; // код команды char Text[20]; // текст строки(в оригинале была const char) } MenuLine; // название типа
если последнюю строку оставить так, то в при вызове в другой функции он выдает ошибку что эта ссылка не декламирована( точнее не скажу, т.к. прога на домашнем компе нихуя не хочет работать на 8ке) А вот если последнюю строку перетащить в нужную функцию то вроде ошибку не выдает. Но если приписать еще MenuLine Select_MenuLine = &ScreenLine1_1; Select_MenuLine = &ScreenLine1_1.Next; то warning и не работает. А мне подобное нужно, т.е. через эти ссылки перехожу на другой экран меню.
typedef struct { void Next; // ссылки на следующую строку void Previous; // ссылка на предыдущую строку void Left_neighbor;// сслыка на левого соседа-столба void Right_neighbor; // ссылка на правоо соседа-столба uint8_t Y;// координаты ячейки с которой начнется вывод символов из массива uint8_t X; // У - номер строки, Х - номер позиции в строке uint8_t Select_comand; // код команды char Text[20]; // текст строки(в оригинале была const char) } MenuLine;// название типа
>>657882 >>657880 typedef struct { void Next; // ссылки на следующую строку void Previous; // ссылка на предыдущую строку void Left_neighbor; // сслыка на левого соседа-столба void Right_neighbor; // ссылка на правоо соседа-столба uint8_t Y; // координаты ячейки с которой начнется вывод символов из массива uint8_t X; // У - номер строки, Х - номер позиции в строке uint8_t Select_comand; // код команды char Text[20]; // текст строки(в оригинале была const char) } MenuLine; // название типа
>>657961 >typedef struct MenuLine >{ >struct MenuLine ∗Next; >struct MenuLine ∗Prev; >... >}MenuLine; Кстати, никогда не понимал зачем нужна возможность дважды именовать структуру до и после (кроме спермоизъебств где первое как тип второе как указатель.
>>658014 В отличие от плюсов, в Си пространства имен struct и типов не пересекаются (у тебя в коде могут быть struct Foo и typedef unsigned int Foo). Имена структур указываются с ключевым словом struct, а если тебя такой способ не устраивает, тебе нужен typedef. В typedef ты можешь определить безымянную структуру, как в >>657880, и это будет работать. Но если тебе потребуется тип этой структуры во время ее определения, пока typedef еще "не отработал", ты никуда не денешься от необходимости обозвать структуру и обращаться к ней через struct, как в >>658014, либо сделать почти то же самое отдельно: // Объявляем тип Foo, на данный момент являющийся "incomplete struct Foo". // На основании неполных типов можно объявлять указатели, но их дереференсить, // пока тип не будет определен. typedef struct Foo Foo; // Определяем содержимое struct Foo. struct Foo { // Объявляем указатель на Foo, который пока все еще является // "incomplete struct Foo". Foo ∗anotherFoo; }; В обоих случаях тебе нужно, чтобы у структуры было имя. А уж дублировать его, или в вендостиле писать tagFoo - дело твое. Некоторые пишут struct _Foo - это неправильно, идентификаторы с подчеркиванием зарезервированы.
Вариант с отдельным typedef на практике более удобен - он скрывает реализацию. Ты можешь определить API, работающий с Foo ∗, положить в .h только строчку с typedef, а саму struct определить в .c, и потом менять содержимое структуры как угодно, не требуя изменения или перекомпиляции "клиентского" кода.
>>658222 С точки зрения кода, разыменование в компиль-тайме станет обычным обращением к ячейке через регистр и, возможно, каким-нибудь смещением, но при этом на стеке не будет выделятся место для хранения этой переменной (хотя, конечно, сильно зависит от компилятора), но с точки зрения читаемости кода, лучше перегнать в переменную, ибо синтаксис Сишечки позволяет городить невообразимые конструкции.
>>658144 ты всё больше и больше меня пугаешь. представляю длину твоей бороды и как там воняет. сидишь тут, расстыковываешь всё, популярно. мочек чтоль?
КАК РАССЧИТЫВАЕТСЯ РАЗМЕР ПАМЯТИ, ЗАНИМАЕМЫЙ СТРУКТУРОЙ? Там же не просто складываются размеры членов структуры, а как-то выравниваются?
И самый главный вопрос. Как рассчитывается размер, если там указатель на такую же структуру? Не могу догнать. Например, вот. struct node { int id; struct node *next; };
>>661508 > Как рассчитывается размер, если там указатель на такую же структуру? Как и размер любой другой структуры: сумма размеров её членов плюс выравнивание. То, на что указатель указывает, частью структуры не является и в её размер не входит. Для 32-битной системы, для не хитровыебанного компилятора sizeof(struct node) будет 8. 4 байта инт + 4 байта указатель.
У меня возник вопрос. Почему участок кода на пике, не вызывает никаких предупреждений при компиляции и выполняется нормально? Компилятор: GCC 5.3.1-1 с -Wall.
>>661633 > Restrict is a "no data hazards will be generated" contract between the programmer and the compiler. The compiler relies on this information to make optimizations. If the data is, in fact, aliased, the results are undefined and a programmer should not expect the compiler to output a warning. The compiler assumes the programmer is not lying.
Анон, есть IDE для ньюфага? Лучше всего что-то типа Notepad++, но с компилятором. CODE:: Blocks реально монстр, раньше писал на Dev-C++, но он протух уже год как. VS - это просто пиздец, я же только хеллоуворды пишу пока.
>>666003 Поссал на парашу с полумертвым недолиспом, которым пользуются 3,5 говноеда и без которого emacs не юзабельное говно, вместо классического и для всех удобного управления при помощи скриптов Божественного Vim'а.
>>666013 >ВЫ ВСЕ ВРЁТИ!!! БОЖЕСТВЕННЫЙ ВИМ УСТАРЕЛ!!! ТВОЯ АРГУМЕНТАЦИЯ ГОВНО!!! ЕМАКС!!!ЕМАКС!!!ЕМАКС!!!ЕМАКС!!!ЕМАКС!!!ЕМАКС!!! >Иди нахуй пользователь не emacs'а Ясно. Этот петух, поклоняющийся мозолееду порвался. Кстати, твоя параша уже почти год не обновлялась. И тебе ли говорить о говне мамонта? В Vim'е хотя для скриптописания обновы постоянно выходят.
>>666018 Возможно потому, что пользователей Vim'а больше и в нем быстрее правят недостатки нежели в emacs'е, который и нахуй никому не нужен, имеющий код еще из 70-х годов и тормозящий даже на среднем железе, если не выпиливать из него не нужное говно, которым его обвесили из коробки?
>>666025 >нет людей, которые согласились бы коммитить >следственно и обновляется раз в несколько лет ибо никто не хочет разбираться в говнокоде, написанном >40 лет назад >лагает на core i5 образца конца 2011 года и 6Гб памяти - нищеброд кококо Ясно. Эти мозолеоправдания.
>>666030 >думает, что ОСей кроме Linux, Windows и MacOS не существует Уебывай. Даже емаксопетухи лучше тебя.
>>666031 >убунтенок Ясно. Для тебя тормоза емакса даже не заметны. Вероятно ты привык к тормозам. >нету нормальных кодеров, осиливших лисп >считает, что elisp имеет что-то общее с божественным лиспом >>зато куча скриптомакак >не осилил скриптописание и считает, что конфиги для ПО надо писать на своем ЯП. Ясно.
>>666036 >Ясно. Для тебя тормоза емакса даже не заметны. Вероятно ты привык к тормозам. Просто я не хочу тратить время на арчи и прочее дерьмо, которое мне ничем не поможет в будущем. Ты, конечно, можешь компилировать себе генту с федорами и наслаждаться своей илитарностью. >считает, что elisp имеет что-то общее с божественным лиспом Щитаю что это семейство языков, а не куча размазанного макаками по зоопарку скриптопараши дерьма.
>>666037 Согласен. Емаксопетухов мало. Но емакс хоть запустить на кофеварки можно в отличии от твоего проприетарного говна. Впрочем, если тебе нравится кушать то, что позволит тебе господин...
>>666040 >Просто я не хочу тратить время на арчи и прочее дерьмо, которое мне ничем не поможет в будущем. Ты, конечно, можешь компилировать себе генту с федорами и наслаждаться своей илитарностью. >Считает, что конфигурировать систему нормально можно только на раче с гентой. Ясно.
>Щитаю Еще раз ясно.
>что это семейство языков, а не куча размазанного макаками по зоопарку скриптопараши дерьма. >считает, что интерфейсы для взаимодействия с ПО - не нужны Понятно. Кстати, твой емакс научился уже в подсветку синтаксиса сразу нескольких языков без мокрописечных аддонов? К примеру связку HTML+CSS+JS осилит? Или придется пердолится? По крайней мере пару месяцев назад еще приходилось пердолится.
>>666046 >К примеру связку HTML+CSS+JS осилит? Понятия не имею, и сомневаюсь в этом. А ты случаем не пробывал редактировать си, питон и лисп в одном файле? >Считает, что конфигурировать систему нормально можно только на раче с гентой. Какие профиты в этом? Нитармазит, кококок, на 0,5 быстрее включается? разве что в случаях когда у тебя последний суперйобапроцессор с каким-то экзотическим набором инструкций
>>666055 >Понятия не имею, и сомневаюсь в этом. А ты случаем не пробывал редактировать си, питон и лисп в одном файле? Ну-ну-ну. Исходник странички, на которую ты сейчас смотришь - это как раз смесь HTML+CSS+JS. Так что юзкейс жизненный, нечего передёргивать. независимый наблюдатель
>>666059 а) Я смотрю на приложение; б) То, что требуется смесь языков не значит, что это нельзя структурировать; в) Никогда этим не интересовался, не передёргиваю. Возможность наверняка есть, но вряд ли из коробки.
>>666055 >ь си, питон и лисп Слишком экзотично для меня. Но мне хватило и HTML+CSS+JS, с которыми, без дополнительных инструментов невозможно работать. То ли дело Vim, в котором все базовые возможности работают из коробки .
>Какие профиты в этом? Нитармазит, кококок, на 0,5 быстрее включается? Будучи сишником, мне интересно знать как работает то, чем я пользуюсь. Разница между дистрибутивами небольшая, но все та же Убунту предназначена для домохозяек в большей степени и есть некоторые ограничения. Поэтому, считаю что лучше взять дистрибутив, в котором предусматривается сразу возможность гибкой настройки.
>>666062 >То ли дело Vim, >от скриптоваськов скриптоваськам
>Будучи сишником, мне интересно знать как работает то, чем я пользуюсь Будучи сишником, мне интересно что и как работает, но мне посрать какой там будет менеджер пакетов, в чём там отличия возможности администрирования, стандартных пакетов библиотек и все остальное. Файловая система, модель памяти и всё остальное там не отличается разнится – мне легче поставить дистрибутив для домохозяек и писать что-то, а не ебурится со сборкой.
>>666066 >Файловая система Может отличаться. Где-то ext4, где-то btrfs. >стандартных пакетов библиотек Может сильно отличаться. Как минимум версии библиотек. И если ты любитель использовать новые возможности, у тебя могут быть занятные проблемы, если не знаешь подробностей.
>Скрипты не нужны. Ясно. Ты этим все сказал. Иди почитай о том, что такое скрипт и для чего он нужен.
>>666071 >Может сильно отличаться. Если буду писать что-то кроссплатформенное – предпочту поставлять всё в комплекте, либо писать конкретные версии зависимостей. Сомневаюсь что самые базовые вещи в какой нибудь glibc сильно разнятся при разбросе в пару версий. >Ясно Это можно написать о твоём манявидении.
>>666641 В роли констант у enum практически нет преимуществ по сравнению с #define, зато есть ограничение на тип значения (только int), в то время как макросом можно задать любое значение. Вот вообще ни разу мне не пригодились enum'ы, и более того, даже специально подумав, я не знаю где их реально можно было бы применять так, чтобы это было однозначно лучшим решением для данной ситуации.
>>666016 Есть. Битфилды. В рантайме дешевле bool делать и жрать на 7 бит больше памяти, чем тормозить процессором, а для обмена битфилды использовать не получается, потому что они даже в пределах платформы часто непереносимы, и проще сразу делать масками.
А вот про enum ты зря. Очень удобно указывать в качестве аргумента функции вместо безликого int. Алсо, ограничение на тип (и особенно то, что он знаковый) иногда мешает, тут ты прав.
>>666656 Как минимум не надо ебаться с макрофункциями, если перечисления идут по возрастанию, задал начальный и ок, компиль сам все сделает. Плюс типизация - для интерфейсов либ, например, более понятное назначение аргумента функции.
>>666661 >Очень удобно указывать в качестве аргумента функции вместо безликого int Так-то да, но typedef int Yoba ничем не хуже же, а typedef long long Yoba, там где это может понадобиться, даже объективно лучше.
Что до битфилдов, то тут обычный трейдоф память/скорость, это я еще могу себе представить — например в каком-нибудь эмбеде, если таких структур вдруг нужно хранить дохуя, а обращения к ним нечастые, то почему бы и не упаковать их. Хотя тоже, конечно, довольно сомнительная фича.
>>666695 Не понимаю до конца. Смотри, есть генератор m-последовательности над конечным расширением двоичного поля, просто поток нулей и единиц. И есть символ из восьми бит. Как выполнить XOR гаммы с кодом символа? Ведь гамма вырабатывается непрерывно, а символ фиксирован.
Допустим, символ такой: 00011010 И гамма - это поток 1011010101110101101
Имеем: 00011010 10110101 XOR: 10101111
Если бы оба числа были фиксированы, то можно было бы завести bit_iterator и пройти по всем соответствующим битам. Но генератор выдает по одному биту за обращение к нему.
>>666720 >>666720 Просто там же рядом те же самые YOBA_MODE_FOO и т.д. задать дефайнами и всё, получится не хуже, ведь никакой автоматической проверки корректности значений для enum'ов не завезли, и у тебя вполне можно сделать YobaMode var = 567 (вообще любое совместимое с int значение).
>>666736 Не понимаю, кто тебе мешает 8 раз взять из генератора по 1 биту, собрать из этого байт и поксорить. Или наоборот реализовать битстрим из байтового потока сдвигами и масками.
>>667345 Ты прав, однако. Хотя унарному плюсу и можно при очень большом желании найти применение, в первую очередь он есть в языке просто "шоб было". Я даже совсем забыл про него.
Господа сишники, заберите пожалуйста своего коллбек-дауна из нюфаг треда. И уберите книгу про ксакинг из шапки (или, как минимум, допишите что не для нюфагов. Она печально действует на таких вот >>667494
>>666656 Загляни в исходные коды разных проектов, ты заметишь, что их очень много. Как и говорит само название "enum", он создан для перечислений.и вполне удобен, если надо определить целую группу констант. Через define'ы это будет более громоздко выглядеть.
>>668243 Не переживай, я на C практически не пишу, а если пишу, то только какие-то мелкие вещи, обычно только исходники читаю в большом количестве. Битфилды на практике ни в одном коде, что смотрел, не встречал.
Посоны, поясните за SSE2 в основных С/С++ компиляторах (GCC, вижуалстудио). Не за тот SSE2 который сам пердолишь вставками, а тот который по опции компилятора автоматически юзается.
Для оптимизации какого кода он его применяет и насколько эффективно? Только для вычислений или так же всякие поиски строк может ускорять?
>>668322 Ну, во-первых, все вычисления с плавающей точкой по умолчанию на SSE (FPU мёртв настолько, что уже из процессоров выпиливают). У GCC не всегда получается разглядеть параллельные операции, и он высирает лапшу там, где можно было упаковать и посчитать разом. Циклы векторизуются более-менее нормально (особенно если про restrict не забывать, а если еще и количество итераций константное, то вообще заебись). За строки не скажу, но предполагаю, что не осилит без твоей помощи. А вообще, objdump тебе в помощь - конпелируй, смотри.
>За строки не скажу, но предполагаю, что не осилит без твоей помощи Вот что-то тоже так подозревал, может как-нибудь осилю полноценно затестить и с юникодом и без.
а Криску да, норм идея читнуть, вообще давно о нем не вспоминал
Сосоны, поясните за GetProcAddress Короч пытаюсь я сделать так HANDLE hThread; DWORD dwThread; DWORD exThread; HANDLE lib = LoadLibrary("ntdll.dll"); LPVOID _NtSetInformationThread = GetProcAddress(lib, "NtSetInformationThread"); (_NtSetInformationThread) (GetCurrentThread(), 0x11, 0, 0); А эта сука мне пишет 151 C:\Dev-Cpp\.c called object is not a function
Вот этот код не компилируется: http://pastebin.com/GgjaARaW error: value out of range. в строке mov al, [b + si]
Что здесь не так? Адрес массива b - 32-битное число, прибавляем к нему байт и получаем адрес следующего элемента. Я подумал, что надо явно указать размер числа, которое берется по адресу в скобках, но mov al, byte [b + si] тоже не компилится.
>>668589 Ты пытаешься вызвать указатель на void. А вызывают обычно функции. Определи правильный тип, а чтобы не запутаться и не писать лишние касты, еще и тайпдеф к нему: // Определяем тип NtSetInformationThread, являющийся указателем на функцию с // определенными типами аргумнтов и возвращаемого значения, с конвенцией вызова // __stdcall (она же NTAPI). typedef NTSTATUS (NTAPI ∗NtSetInformationThread(HANDLE,THREAD_INFORMATION_CLASS,PVOID,ULONG);
// Определяем переменную типа "указатель на функцию" и присваиваем ей значение. NtSetInformationThread pNtSetInformationThread = (NtSetInformationThread) GetProcAddress(...);
// И вызываем. pNtSetInformationThread(...);
>>668850 У тебя 32-битный код. Используй для адресации 32-битные регистры (ESI блять!). Алсо, ты тредом ошибся, ну да и похуй.
Чет я поехал. Захотелось мне keepassx на gtk3 переписать от нефиг делать. Можете обоссать - врят ли поможет. Мб кто тоже захочет попробовать свои силы.
>>671320 Порно с ним ещё поищи. Он пробитый олдфаг, и не стоит пытаться подсесть на хуец емакса если сам Линус на нём пишет – это говноедство уровня совка. Открывай в студиях/цлионах и не парься – они и не такое дерьмо индексируют (последний правда с дикими свопами).
>>671280 После 'git pull' я юзаю 'ctags -R && vim <нужный-файл>'. Без 'git pull' просто 'vim <нужный-файл>'. 'ctags -R' у меня на пекарне отрабатывает за 10-15 секунд. Ещё Taglist плагин для vim юзаю, но это так, чисто для общего представления, какая хуета объявлена/определена в файле, что я смотрю в данный момент.
>>671280 А нахуй всё ядро индексировать? Там есть какая-то более менее независимая центральная часть типа управления памятью/процессами/объектами ядра плюс драйверы с архитектурами.
>>671768 Когда работают – это и означает, что нет типов. PHP и JS так работают, им норм. Почему бы и не вызвать void* как функцию? Ничего ведь не мешает.
>>671825 > Почему бы и не вызвать void∗ как функцию? Ничего ведь не мешает. Мешает. Существуют машины, где два указателя на данные и на код могут быть численно равны, но указывать на различные сущности, поэтому Си однозначно отделяет указатели на функции от указателей на данные. Примерно потому же и void∗ нельзя разыменовывать. Ну и недостаток информации о способе вызова функции тоже мешает, да.
>>671831 Очевидно сишка никакой проблемы ни в первом, ни во втором не видит: http://ideone.com/qBhXL6 С каких вообще пор сишке стало не хватать информации о способе вызова функции? Всегда хватало, а тут вдруг перестало? Тут кто-нибудь сишку учил? >>671838 Ой, я умоляю, в PHP и JS тоже есть разные типы. >>671849 Дык говорю, типизация уровня PHP.
Если какой гайд для написания простейшего ядра ОС, чтобы оно просто показало "Hello World" при загрузке в virtualbox? Нужно ли для этого писать отдельный компилятор и libc?
>>672652 Компилятор писать не нужно, GCC вполне хватит. А писать нужно первичный загрузчик, который прочитает твой код с диска, перейдет в защищенный режим и передаст управления (придется разобраться с objcopy). Но ты можешь просто взять GRUB, который загрузит твой ELF. А вот libc придется писать. По крайней мере, простейшую puts, которая запишет твой хелловорлд в видеопамять. Погуляй по osdev.ru, наверняка там гайды есть.
>>672783 >>672731 > На каком языке советовать инфу на русскоязычной борде? Да похуй абсолютно, с чего начинать, чтобы вкатиться. Можно было, например, Кулакова посоветовать. Анон ознакомится, а потом все равно будет сам гуглить то, что ему нужно.
>>673727 >что именно делает ; я не понимаю Нихуя не делает. Тело цикла должно содержать хотя бы один оператор, а каждый оператор должен заканчиваться символом ';'. В данном случае, оператор не содержит ни одного выражения, т.е. является пустым.
>>673735 Бля, там нет никакого поллинга самого по себе в этой программе. Это просто пример, когда компилятор может оптимизировать код и заменить условие на while(1). Но если переменная foo может быть изменена чем-то извне, в отрывае от этой программы, то тогда нужно юзать volatile, чтобы компилятор оставил проверку выражения перед каждой итерацией.
Что за омское объяснение? Как он получает 65520? 2^n в случае с 16 = 2^5 (т.к. в десятичном представлении разрядов пять), то есть 2^n = 32 Значение величины без знака = 16 Итого у меня выходит 16, а у Подбельского — 65520
>>673754 n - количество битов используемых для хранения числа заданого типа, а не количество рязрядов в конкретном числе. Если для инта используется 16 битов то 2^16 - 16
>>673741 >will notice that no other code can possibly change the value stored in foo А как вообще что-то может изменить значение переменной вне функции, где она определена? Допустим это ячейка памяти микроконтролёра, которая может меняться извне, но тогда у неё есть конкретный адрес. А в этом псевдокоде при рантайме только определяется её адрес. >>673761 А, всё понял. Было такое подозрение, но что-то затупил. Мне всё равно что-то непонятно, почему при применении "-" точка отсчёта именно 65536 Просто придумали такую условность, чтобы не городить преобразование типа на ровном месте?
>>673770 > как вообще что-то может изменить значение переменной вне функции Ну например ты зарегал какой-нибудь асинхронный ввод/вывод, зарегал флаг register_flag(&foo) и сидишь в таком простом spinloop, ждешь завершения. Произошло прерывание, и обработчик поменял foo.
>>673708 Не слушай даунов, глобальная переменная foo может где то изменяться, может быть в другом потоке, может еще где, хотя еще по идее должна быть волатильной. >Зачем нужен short, если у него битность такая же, как у простого инта? Это ты про какую платформу говоришь то? По стандарту char <= short <= int На 32 битной short = 16bit, int = 32 bit
>>673787 Таблица показывает общепринятые размеры для одной конкретной платформы (x86), для других платформ размеры могут быть другими. Лишь бы соблюдалось неравенство, которое >>673780 упомянул.
>>673790 >>673787 Ой, это вообще для 16-битного кода. На 32-битных машинах short - 16-битный, int (и, соответственно, enum) и long - 32-битные, long long - 64-битный.
>>673802 Не определит. Внутри цикла ты локальную переменную stop не меняешь, поэтому он мог бы считать, что она не меняется. Если бы не volatile. Но в моем надуманном примере можно выкинуть локальную переменную и указатели, сделав глобальную (ну, почти - видимость static ограничена модулем) static volatile bool ctrl_c_trapped и устанавливать в обработчике сигнала сразу ее, и ее же проверять внутри цикла.
>>673790 Интересно. >>673805 А где она меняется? Я вижу только присвоение адреса stop определённой ранее termination_flag_ptr termination_flag_ptr = &stop;
И как это вообще работает? Сигнал прерывания приходит в функцию trap_ctrl_c но как?! там же выполняется другой цикл другой фукнции!, в ней меняется *termination_flag_ptr на тру зачем условие на проверку незанулённости указателя вообще?, а дальше-то что? Каким образом это присвоит true стопу?
>>673812 ОС обрабатывает Ctrl+C специальным образом (в *nix приложению сигнал посылается, в Windows это имитируется), рантайм приостанавливает и сохраняет состояние того, что выполнялось (регистры процессора, вся хуйня) и вызывает установленный тобой обработчик SIGINT, а после того, как обработчик вернет управление, восстанавливает состояние и продолжает выполнять код. Ну а обработчик просто по указателю меняет значение переменной stop.
>>673818 > справился То, что в конкретном случае все работает, как надо, не гарантирует, что оно будет работать, как надо с другой версией компилятора, на другом компе и т. д. Надеяться на компилятор НЕЛЬЗЯ.
>>673812 >в ней меняется termination_flag_ptr на тру termination_flag_ptr - это и есть стоп. Там хранится адрес переменной stop, а через * мы обращаемся к самой переменной.
>>673821 А какова функция строчки >signal(SIGINT, trap_ctrl_c); она только определяет в какую функцию посылается сигнал? Или она постоянно выполняется? Я запутался.
>>673823 > ты так категорично заявил, что компиль глупенький С выключенной оптимизацией компилятор как раз глупенький. Он для удобства отладки старается не класть переменные в регистры, а перечитывать их какждый раз. А вот с -O3 и без volatile пример превращается в бесконечный цикл как раз потому, что компилятор не глупенький.
>>673825 Почитай первый тредик. Большинством голосов было решено, что читать стоит. Если тебе что-то не нравится, там есть еще и C Primer Plus и ебаный hard way.
>>673840 Си - не тот язык, который можно выучить по туториалом. Он простой, но в нем есть множество неочевидных подводных камней. Приношу свои извинения, если мое определение хардвея тебя задело.
>>673847 Ну а как его в таком случае учить и чем пример + в этом смысле лучше? Можно конечно лезть писать на одних циклах и ифах, но это же хуйня полная. Я могу простенькие проги писать, но чужой промышленный код на C я не понимаю, там очень много используются конструкции, о которых у меня представление в лучшем случае приблизительное.
>>673836 >Большинством голосов было решено Я не про K&R мир праху R и долгих лет K, которые достойны всяческого уважения. Я про упоротых, изучающих С в 2016.
>>673850 Когда я учил язык, я читал все, что было доступно на тот момент (хотя доступно было не так много).
>>673852 Ну вот как перепишут хотя бы одну из распространенных ОС на другом языке, тогда и будем с тобой про упоротых разговаривать. А еще лучше тогда, когда embedded с сишечки перекатится.
>>673850 >чужой промышленный код на C я не понимаю, там очень много используются конструкции, о которых у меня представление в лучшем случае приблизительное Итак, 2043 год. Виртуальная реальность процветает. Изобретена телепортация через компьтер - между двумя экранами возникает связь, и телепортируемый объект в цифровом виде передается по Сети адресату.
Старый, грязный подвал. В нем живет 60-летний хакер Пупкин, до сих пор безуспешно пытающийся выразить свой протест обществу. Изредка его навещает внук, горящий желанием постигнуть азы давно утерянного искусства - хакерства.
- деда, а деда, а правда что раньше программисты знали ассемблер? - да, внучек, сорок лет назад все было совсем по-другому... вот помню спиздил я пароль на интернет у соседа - и в тюрьму угодил... - деда, а деда, а правда что ты умеешь ворды ксорить в уме? - да, было дело... как я ксорил ворды в 2000-м!... а как я ксорил дворды в 2010-м!... а в 2020-м, вот это был ксор!!!! - деда, а деда...
Внучек с дедушкой медленно шли по прекрасному зеленому парку, мимо них проходили довольные жизнью люди... Светило солнце, дул прохладный освежающий ветерок... Но что-то было не так. Вот исчез один проходящий мимо; вот пропал еще один человек где-то вдали.
Гнусный металлический голос где-то рядом картавя произнес: "Ваше время истекло. Введите номер кредитной карточки..."
В то же мгновение свет померк и внучек с дедушкой оказались сидящими перед загаженными экранами старинных компьютеров в одной из комнат грязного вонючего подвала, где дед собственно и обитал.
Внучек сбросил блестящий шлем виртуальной реальности на заблеванный и усыпанный окурками пол и подбежал к деду. С тем явно было не все в порядке. Старик в корчах стучался головой о старую разъебанную клавиатуру. Внук проворно снял с того шлем и принялся откачивать...
- ненавижу, ненавижу... сквозь слезы трясся дед, злым взглядом буравя монитор. На экране того красовалась надпись: "Попытка несанкционированного доступа пресечена". В добавок из динамика донесся хриплый прокуренный смех и голос, нечто навроде "получил свои 220 вольт, придурок? хакер, бля, недоделанный."
И тут стальная решимость появилась в старческих глазах. Старик отключился от сети и принялся что-то писать в хексах... Прошло два месяца.
- Смотри, внучек. Вот это - хак последнего механизма компьютерной телепортации. Теперь все, что получают эти кретины за свои деньги, сможем получить и мы, и - абсолютно бесплатно.
Пара нажатий на клавиши - и перед экраном компьютера материализовались две бутылки холодной пепси-колы.
Но вышло так, что хак опять не удался. На экране появилось лицо администратора. - Опять ты, старпер ебучий. Уже полгода тебя ищем, откуда ты нахаляву к сети подключаешься. А тут еще и механизм телепортации вздумал наебать. Ну сука, жди наряд через пол-часа...
Аааааааааааа! - взвыл от ужаса неудачливый хакер. Глаза его быстро-быстро забегали по сторонам. - Опять менты придут, коаксилами отпиздят. Но назад уже не повернуть. Идти некуда. Прокуренные желтые пальцы забегали по клавиатуре. И через пять минут, роняя слюни, старик, с трудом распрямившись встал и ударил кулаком по ENTERу.
В ту же секунду от удара ментовской ноги вылетела входная дверь.
- Ну что, попался, СУКА??? В комнату медленно зашли трое здоровенных амбалов в синих формах. На рукаве у каждого эмблема - четырехцветное развевающееся окошко и белая надпись - Microsoft.
Старик медленно расстегнул ширинку. Достал свой сморжопившийся хакерский хуй. И начал ссать в экран монитора....
Как позже выяснилось, последний пупкинский хак все же удался. Все включенные в это время системы телепортации оказались в тот момент каким-то неизвестным образом подключены к его терминалу. И все, что попадало в экран пупкина метериализовывалось в самых разных частях света...
Итак, на глазах охуевших ментов мощная хакерская струя била прямо в экран и пропадала где-то за ним. И попадала прямо в рожи несчастным перепуганным юзерам, затапливала компьютерные залы, истинно хакерское ссанье стекало по клавиатурам и пиджакам миллионов пользователей, погонам и фуражкам военных...
Пока один пьяный майор из службы безопасности не достал пистолет и не выстрелил в экран.
Пуля ранила хакера в живот. Довершили дело майкрософские ублюдки, добив деда ногами...
Пердолюсь с stm32 и индикатором hd44780. Надо реализовать иерархическое меню, по типу: 1 Уй 1.3 Изда 1.3.2 Джигурда Во время навигации по меню надо обновлять строку на индикаторе и запускать функцию которая будет чего-то делать (считывать данные с цифрового энкодера, чего-то включать/отключать и т.п.). Как это правильно реализовать?
Посмотри, нормально ли я придумал? Хочу сделать представление меню в виде массивов структур typedef struct { int StrPointer; int Pointer; uint8_t PointerType; } MenuStructTypeDef; Где, StrPointer - указатель на строку (длина фиксирована), для вывода названия функции или дочернего подменю. Pointer - указатель на функцию или массив. PointerType - тип предыдущего указателя, т.е. определение чем является данный пункт меню: конечной функцией или точкой входа в подменю. И соответственно хочу рекурсивно подобным образом заполнить все дочерние подменю, т.е. массивы. В нулевом элементе каждого массива данные хранить не буду, запишу только его длину в каком нибудь поле структуры. (иначе не понятно до какого значения его можно обходить) Вроде в такой реализации можно без проблем будет проходить по меню и вниз и вверх. Памяти займет не так много. И выглядеть будет менее убого, чем вложенные case/enum. Только вот проблема: Никак не могу придумать как можно объявить данные массивы структур константами, так чтобы они попали во flash память, а не RAM? Ведь все значения полей структур всех массивов будут определены уже на момент компиляции.
>>674384 > Никак не могу придумать как можно объявить данные массивы Не выделывайся. Сделай максимально банально и просто: http://ideone.com/XVDif6 Всё константно, обходить - c проверкой .title != NULL. При переходе в подменю текущее меню пихать в какой-нибудь стек, пункт Back (если нужно) можно добавлять кодом (незачем его хранить везде). Хэндлеры у подменю - нужная штука, ибо позволяют до захода, допустим, в меню Bluetooth, проверить его наличие и сказать "Нет у меня никакого Bluetooth".
>>681734 Нам норм. К тому же это такая аналогия: в шапке крестотреда хуева туча свистоперделок и дохуя всего, что аж блять она из монитора начинает вытекать, а у нас всё чётко, лаконично.
>>681734 крестобляди - почти как уже сишарпобляди и джавабляди - обмазываются своей поеботой и не замечают очевидных вещей. Все правильно анон сказал - ярая аналогия по языкам.
>>682436 Проверь, что у исходника кодировка UTF-8 с BOM (она же UTF-8 with Signature). В Microsoft недавно сдались и обещали сделать распознавание без BOM по умолчанию, но это вроде в бетке еще.
>>682423 Но, тем не менее, до того, как человек узнаёт о других, безопасных функциях, а заодно и о локалях, у него будет scanf, который сломается из-за десятичного разделителя.
Что читать:
- Классика от Отцов: http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/%7Eats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует. Дрочим на --analyze.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека" (да, в студию в последнее время завезли stdint и stdbool, почти все новые фишки из C11, static_assert и даже юникод). C snprintf все до сих пор плохо. Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (в частности, потыкать threads.h и stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99.
- Borl... ээээ...
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (4th Edition)" (2014)
Jon Erickson "Hacking: The Art of Exploitation, 2nd Edition" (2008)
Анон из предыдущего треда рекомендует например, в качестве примера применения Си на практике.
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
Сурс шапки: http://piratepad.net/bJ1SdmkZyu