Это копия, сохраненная 10 апреля 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем компилировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №38: https://arhivach.ng/thread/419611/
- №39: https://arhivach.ng/thread/423396/
- №40: https://arhivach.ng/thread/428550/
Скажите уже раз и навсегда, чё юзать на линуксе шланг или гсс
То, что тебе больше нравится. Если похуй - подкинь монетку.
cc
Ох уж этот пердо-рабский менталитет. Пока было одно от царя и бога, они спокойны, как только появился выбор из целых двух вариантов - ох, ах, мам, янизнаю что выбрать, пасаветуйти за меня, мне самому слишком сложно, не привык думать и решать за самостоятельно.
> Ох уж этот пердо-рабский менталитет
А был быфронтендский сказали бы "ох блять, теперь придется в джвух проверять как код конпилируется"
default:
puts("Напиши свой компилятор, с блэкджеком и шлюхами!");
да, я знаю, что в эту ветку не зайдет, потому и дописал этот вариант не стоит вскрывать эту тему
Блядь, break; забыл.
Сука, а я-то думал, чому мой детектор тревогу бьет на этот кусок кода.
> Какое?
Либо результат, умноженный на три, будет меньше INT_MAX просто потому, что он меньше, либо будет переполнение, и при переполнении остаток тоже будет меньше INT_MAX. Значит, при делении на INT_MAX ты всегда будешь получать ноль. Ну разве что ты найдешь компьютер, где INT_MAX делится на 3, тогда ты ради разноообразия будешь изредка получать 1, но не больше.
Иди нахуй.
что-то ты не выспался
Мне нужно читать бинарные файлы и редактировать их.
Например.
Есть картинка в raw-формате. Мне нужно считать из этой картинки величины для всех пикселей и поместить их в соответствующий двухмерный массив. Вроде бы простая задачка, но я не понимаю, как читать из бинарника по одному байту. Работал только с текстовыми файлами, а там чтение построчно, все проще.
Виртуальные машины меня пока не интересуют. Я хочу сделать удобный консольный калькулятор с блекджеком и шлюхами, а то обычный гуишный совсем не удобный.
Неважно. Мне не только raw-файлы надо читать, это только как пример.
В raw-файле каждый байт - это 1 пиксель, число в байте - это интенсивность белого цвета. Мне надо как то побайтно прочитать.
Как это сделать? Сначала записать в память все содержимое файла, а потом уже побайтно отсекать?
Да и так и так можно, лол. Си разрешает к массиву обращаться хоть как к одномерному, хоть как к трехмерному, етц. Главное, за пределы не вылететь.
В общем, Интернет тебе в руки, fread в поисковую строку и удачи.
Я такое в сишке ни разу не делал, тоже интересно. Делал подобное в питоне (он совсем тормозной для этих дел) и дишке. В дишке все замечательно получалось - читал файл сразу крупными кусками, обрабатывал и складывал массив, потом выплевывал в другой файл. Правда потребление памяти было огого, потому что я что-то не оптимально делал, но работа по сравнению с питоном просто сказочная была.
Вот стандартная библиотека ввода-вывода, там много всяких полезных функций для твоей задачи.
https://www.opennet.ru/docs/RUS/libc/libc-3.html
Вон в википедии есть пример как прочитать пять байт из файла.
https://en.wikipedia.org/wiki/C_file_input/output#Example
https://ru.wikipedia.org/wiki/Файловый_ввод-вывод_в_языке_Си#Пример_использования
>>64180
>>64182
Ок, спасибо.
Теперь другой вопрос. Что делать, если структура бинарника примерно известна, но размер данных внутри структуры непостоянный?
Например, такая структура: сначала идет текстовый заголовок, затем количество байтов в Int32, которое занимает эта структура, затем сами данные, которые могут включать в себя другие заголовки и т.д., а также имеют непостоянный размер.
Как читать данные из таких структур? Искать в цикле текстовый заголовок, а затем читать указанное количество байт?
K&R
Вот начал. Правильно прочитал всю строку с пробелами? Теперь нужно научиться как распарсить строку на числа и команды и посчитать то что там написано. Сначала простые арифметические действия +-*/.
За детерминированные конечные автоматы пояснить сможешь?
К счастью в Си можно большую часть кода (кроме препроцессора) писать хоть в одну строку. А книжка - это скан кривой, наверное.
>>64148
> не понимаю, как читать из бинарника по одному байту
Зачем тебе по байту?
buffer = malloc(width ∗ height);
fread(buffer, 1, width ∗ height);
адресуешься buffer[y ∗ height + x]
>>64189
Читаешь несколькими fread. Строки побайтово. Можешь еще прочитать или смапить (mmap()/MapViewOfFile()) файл целиком и потом парсить его из памяти. Это проще, если файлы относительно небольшие.
>>64222
NULL - это (void ∗) 0, укозатель. '\0' - это целочисленная константа (int) 0, а в крестах (char) 0.
>>64241
Возьми любую книгу про компиляторы. Можешь книгу дракона, можешь какое-нибудь говно попроще типа https://compilers.iecc.com/crenshaw/
buffer = malloc(width ∗ height);
fread(buffer, 1, width ∗ height, fp);
адресуешься buffer[y ∗ width + x]
Пиздец я.
Зачем нужны вообще эти книги по языкам? Серьезно, какой смысл их читать, если без четкого понимания что ты хочешь делать все это бесполезное чтиво, а с четким пониманием тебе скорей всего не по языку придется гору литературы изучать, а по всяким ручкам в ос, api, особенностям железа. Сказать по правде мне кажется большинство программистов осваивали языки постольку поскольку, поэтому и не могут внятно ответить на извечный вопрос со стороны непосвещенных "с чего начать". У человека просто появляется желание что то реализовать он берет чужой кусок кода начинает его ковырять методом тыка, гуглить постепменно начинает вникать как это работает, усваивает минимальные азы, а потом садится и обклажившись документацией по системам сборки, фреймворкам, библиотекам, штурмует мозгом стену до переопухания. Язык постигается попутно попутно, дрочь на них мне лично видится странным, а книги по языкам я вообще не понимаю для кого.
Твоя проблема в том что ты утилитарист. И вообще как можно знать что ты хочешь не зная как и что ты можешь?
> как можно знать что ты хочешь не зная как и что ты можешь?
Это вопрос пустопорожний - с чего ты взял что надрочив си по заданиям в книжке и написав хэловорд ты необходимые знания c умениями приобрел? Скажешь тебе (например) - иди вон фильтры для изображений запили (регулируемую яркость, сепию, grayscale) ты так и так их просто так не напишешь, ты пойдешь перебирать тонну всякой хуйни по битмапам и особенгностям работы с ним и еще всякой дополнительной херни связанной с тем куда там это все вывести и через что настройки реализовать. И так происходит постоянно, даже владея языком в совершенстве эта поебень не заканчивается никогда, и чтобы этой ебатней заниматься нужен позитивный стимул в виде идеи и желинии ее реализовать.
Ну раз ты скозал что нужон, значит так и есть. Это звучит примерно "чтобы заниматься радиотехникой надо хотеть собрать айфон", бредово короче.
из-за перфекционизма не могу взяться за свой пет-проджект, потому что неуверен, что в совершенстве знаю язык, чтобы его написать. Это нормально?
мимо
Нет, не нормально, делай его, делай как можно более лучше, нет предела совершенству.
Иначе ты его никогда не начнёшь.
> звучит примерно "чтобы заниматься радиотехникой надо хотеть собрать айфон", бредово короче.
То есть ты за язык схватился с расчетом на то что достигнешь когда нибудь такой уровень просветления, который позволит познать дзен и написать свою операционную систему с попов-офис?
Просто сильно резануло ухо про айфоны, как будто блять любая деятельность сводится к тому чтобы запилить йобу и стать успешным. С таким подходом иди в бизнес лучше, программирование не для тебя.
> Просто сильно резануло ухо про айфоны, как будто блять любая деятельность сводится к тому чтобы запилить йобу и стать успешным. С таким подходом иди в бизнес лучше, программирование не для тебя.
Вот уж странное высказывание! Чем плоха цель придумать и реализовать йобу? Язык это же инструмент для созидания, а не самоцель.
Ты потерял нить разговора. Перечитывай.
Ничего плохого, у меня на самом деле тоже есть подобная цель, но она долгосрочная и может быть я ее никогда не реализую, но в любом случае путь к ней усеян маленькими квестами, как связанными ( то есть опыт в создании которых пригодится и продвигает меня ближе к цели) так и не связанными, то есть они конечной цели не дадут ничего но помогают сейчас прокачать скилы и пополнить знания.
Что касается айфонов то я имел в виду идеи вроде "вот я сейчас стану великим погромиздом, напишу какой нибудь телеграм и заживу" диструктивные как по мне
Чуть подробнее.
%X, если мне память не изменяет.
printf("%02x\n", ch);
Попробуй базу данных. Или если совсем новичок, то напиши свою лог ин процедуру на одном стракте и постепенно попробуй к ней прикрутить больше фич.
Doom
Что вообще интересного можно реализовать отверткой? Для новичка. Всякие болты крутить умею.
Для крестов юзай шlang. Если си для тебя лишь инструмент для вката - юзай что угодно, хоть вижуал студию. Если же собираешься работать с си то есть либо ембедить никсы в весы в пятерочке, либо писать алгоритмы для микроволновок за 30к в месяц, или поддерживать схожее легаси говно из 90-ых то GCC, ибо он написан как раз под стандарты 89/99, на которых то говно и работает.
ideone.com (выбираешь просто C), wandbox.org (можешь вписать ключик -ansi даже, если хочешь)
Нет, таких книг не существует.
Значит GCC, спасибо, с ним и работаю. В целом мне интересно почитать чем они отличаются, не совсем поверхостно, не для новичков, но и не совсем в дебри уходить. Об архитектуре представление имею, с Си знаком, но не в качестве основного языка, а на уровне написать биндинг к СИшной либе.
Ну а что именно тебя интересует?
Т.к. шланг - поделка изначально выступавшая в роли догоняющего, их мануал написан в стиле чем мы лучше GCC, поэтому если тебя интересует что-то не конкретное, то могу только посоветовать полистать менпейдж.
Я лично юзаю GCC, т.к. на старых машинах он дает большую производительность. Преобразуя код в нижние уровни он пытается его отпимизировать для минимальных затрат ресурсов. Очевидно в этой фиче GCC нет смысла если ты пишешь Си код для 64 битных процев ЩТО тут ты либо долбоеб либо школьник вонаби реверсинженер ловитель пакетов. Плюс многие платформы уже перестают поддерживать GCC (спасибо JVM и новым мультиязыковым компилерам);
Хочется сесть сразу на 2 стула, чтобы с джеком дениелсом и флорентиной не спеша покуривая сигару читать книгу перед камином, получать удовольствие и учить язык за одно.
Сейчас читаю "программирование на си для начинающих" перри-миллер. Вроде книга хорошая, но непонятно почему в книжке main(), а в компиляторах int main(). Учитывая что до этого я только бейсик в школе все совсем сложно.
На си ты не заработаешь на Джек дениелс и флорентину.
"int main(void);" - полный прототип (в реальных программах, конечно, делать прототип main не стоит)
"main()" - просто упоминание функции. Скобки добавляются чтобы ты понял, что это не просто что-то main, а функция main.
int в начале - тип возвращаемых функцией данных. В некоторых всяких хуйжективхуйси можно опускать у main(); возвращаемое значение. К самому си это отношения не имеет. Просто виндовские костыли.
add:
в некоторых говнокомпиляторах (пробабли после 99 стандарта) можно не указывать возвращаемое значение main(), и они по умолчанию проставят тебе int, только реально этим пользоваться -- пиздец какой друной тон, придуманный долбоебами из JVM подобных языков, который потом еще и крестовики переняли. Код с такой хуйней как плевок в лицо будет воспринят всеми нормальными людьми. Что gcc по 99 стандарту, что шланг запрещают опускать возвращаемое значение у main, поэтому просто восприми это как опечатку.
Это понятно что инт это тип данных.
>Что gcc по 99 стандарту, что шланг запрещают опускать возвращаемое значение у main, поэтому просто восприми это как опечатку.
Ясно понятно, буду иметь ввиду.
При чем тут говнокомпиляторы, если это стандартный синтаксис для C89? Поддерживаешь C89 - поддерживаешь неявный инт, указание любых аргументов для функций с пустыми скобками, декларации аргументов перед { а не в () и всю прочую хуйню. Даже если тебе не нравится. Да, это старый синтаксис, писать так не стоит, но знать о нем нужно - еще встречаются исходники, написанные в таком стиле.
Запомни щенок, блять. Всегда пиши только так:
int main(int argc, const char argv) {...}
Когда будешь вызывать свою программу из шелла или из командной строки, то int - это всегда будет код завершения твоей программы. Примечательно, что командная строка оперирует не логическим состоянием а уровнем ошибки и поэтому в комнадной строке 0 - это правда нормальное завершения процесса а 1 - это ложь ненулевой уровень ошибки и соотвественно всё, что выше единицы - это ложь. Так как на уровень ошибки отводится 1 байт, то уровни ошибки от 0-255. Дальше.
int argc - arguments count это количество аргументов, которые твоя программка получает, когда вызывается из командной строки.
const char argv - это arguments values значения аргументов, которые передаются при вызове из командной строки. Конст, потому что меня в универе препод учил, что нельзя изменять входные данные программы.
Шелл сам определяет как разбиваются аргументы командной строки. Как правило это пробел, но можно и что-то индусское накостылить.
А ещё запомни щенок. Явное, лучше чем явное. И тебя никто не стукнет по рукам, если ты напишешь лишнего, но запутанного.
> шланг запрещают опускать возвращаемое значение у main
Как же оно тогда без ворнингов-то конпелируется? https://wandbox.org/permlink/tiXtDxWXuSc2vBWA
>>64952
> командная строка оперирует
> уровнем ошибки
Зависит от реализации. Сишка вообще знает только о EXIT_SUCCESS и EXIT_FAILURE, причем FAILURE может быть и 100500, а не 1.
> const char *argv[]
Нету const в стандарте. Туда можно писать, и пишут.
> препод учил
Это его половые проблемы.
>const char argv[]
никакого конста, ибо храниться параметр будет в любом случае все время работы main(), а даже его возможная перезапись никак не отразится на безопасности работы с памятью. конечный юзер сам по себе никуда ничего не вводит, зпускается все чаще всего make/exeс хуйней, а значит сломать твою прогу таким образом обычному юзеру будет тяжело.
>argument values
arguments vector*;
>>64955
>9 кланг созданный в эпоху джава детей и вкатывальщиков не могущих осилить даже поинтеры в ОЧЕНЬ СЛОЖНОМ си
Уверен, что ниже 9 версии не будет ни одного без ворнинга
> Уверен, что ниже 9 версии не будет ни одного без ворнинга
И в предыдущих не будет ворнингов. И в гцц тоже.
Только что твой же код на ванде запустил со всеми гсс и всеми клангами кроме 9-ых, и ВЕЗДЕ выдало ворнинг.
-Werror передает привет.
Никто и не говорит, что невалидный. Дело в стандартах (не только писанных, но и общепринятых) Писать int перед main для си прогера должно быть то же самое, что саму точку входа называть main и никак иначе — бетонный стандарт.
> должно быть то же самое, что саму точку входа называть main
Периодически обзываю точку входа start, когда пишу под bare metal. Как мне жить-то теперь?
Алсо, выяснилось, что ворнинги на implicit int есть только в gcc. clang (любой) соответствует стандарту. Вот, например, третий шланг: https://wandbox.org/permlink/tiXtDxWXuSc2vBWA
>>65019
Переносимо - никак, но есть ungetc().
Не очень понял что ты имел ввиду, ибо по ссылке открылся аутпут 9 кланга.
Из интереса накатил сейчас на ведро 7-ой кланг и даже без флагов словил ворнинг
Значит реально зависит от стандарта.
Я всегда думал что это приколы компиляторов. Позорно ретируюсь.
YACC/Bison + flex + c/cpp
Очередное невзлетит.
[CODE]void plus_1(int i) { i += 1; }
int main(void) {
int i = 1;
plus_1(&i);
printf("%d", i); // => 2
}[/CODE]
Репост из ньюфаг-треда в самый адекватный тред.
Скачал на udemy пару курсов по С и микроконтроллерам, сижу изучаю, вкатился к вам в тред, у вас тут лампово? Как относитесь Embedded программистам?
Да нахуй радач, мне больше нравится байты перекладывать.
https://ideone.com/ZJ8mdK
Следующий щаг - добавить понимание умножения и деления с их повышенным приоритетом. Как лучше всего это сделать?
Ну сначала ищи операции умножения деления, делай их пока ни одной такой операции не останется, после этого у тебя останется привычная строка со сложением вычитанием
Есть такая штука как isdigit().
И выглядит сильно лучше моего парсера одного файла "Конфига"
Алсо, есть какие IDE получше Code::Blocks? CLion адово тормозной, как и Студии.
Но это не IDE. И вечно наяривать gcc дохуя файлов -std=99 -Werror -o prog.exe несколько заебывает. Не мейкфайлы и шелл-скрипты же делать ради этого.
Тогда надо будет либо загонять весь ввод в строку и работать уже с ней - сразу появляется ограничение на длину строки, либо делать длинные стеки под числа и операторы - тоже появляется ограничение на длину стека. Хочется сделать без ограничений.
Ограничений не будет, если ты используешь динамическую память. Ну не сожрет же твой калькулятор больше ста метров, ну.
Тогда зачем тебе си? И да, слабо умножение самому написать, а не просто return f*x?
Ну епт, умножение железно поддерживается даже каким-нибудь древним AVR8535. А Си просто нравится. Как и Перл. А вот для Форта я туповат, увы
Непонятная ебля у тебя, ну не мое дело, если не хочешь каких-то ограничений стеков и т.д., делай все проще.
Читаешь ввод посимвольно.
1) Читаешь первое число
2) Читаешь знак
3) Читаешь второе число
4) Читаешь второй знак
4.1) Если он плюс или минус, то совершаешь операцию над первым и вторым числом
4.2) Если умножить или разделить, то кладешь в буфер первое число плюс знак
4.2.1) Читаешь следующее число
4.2.2) Совершаешь действие
5) В итоге у тебя в буфере первое число и знак, и результат вычисления - второе число, а это пункт 3 - GOTO 3)
Если следующий знак — открывающая скобка, идёшь назад до первой открывающейся, и считаешь все
Запили ещё парсинг скобок, возведение в степень и возможность задания собственных констант каких-нибудь, а то какую-то хуйню для школьников делаешь.
Ну серьезно, если челик спрашивает как сделать умножение то у него проблемы.
Виртуалку поставь и надрачивай все с нуля. Я когда сам только начинал, пытался умножение сделать через байты. Закономерно проебался, поэтому не советую пытаться. Сделай просто исключения на умножение чисел, типа x>1, x<1 && x>0, x<0, x<-1, x>-1 && x<0 Если решишь ебаться с байтами, для начала сделай только int.
Через битысамофикс*
> Как лучше всего это сделать?
Рекурсивно разбиваешь выражение, сходя из приоритета операций, от наименьшего к наибольшему. Составляешь дерево: в предка кладешь операцию, в потомков (ты используешь лишь бинарные операции, потому их всегда будет 2) -- разбитые выражения.
Продолжаешь опускаться вниз до тех пор, пока у тебя не останутся лишь числа (если выражение некорректно, то останется некоторая мусорная часть).
Потом проходишься по дереву снизувверх и склеиваешь числа по операции-родителю.
В этот метод легко добавляется обход скобочек (внешние скобочки просто отбрасываются), обработка унарных операций (в случае унарной операции родитель будет иметь одного потомка) и прочее.
Можешь, кстати, написать не калькулятор, а символьное дифференцирование. Оно делается в точности так же, только обход снизу вверх чуть усложнится.
Ее величество, Рекурсия беспощадно разбирает подобные задачки. SICP читай.
Ключевая операция - соединение двух отсортированных последовательностей в одну отсортированную последовательность. Например, есть у тебя 1 3 4 6 7 и 2 5 8. Одновременно двигаешься по обеим, смотришь, где меньше, и складываешь в результат. 1<2 значит выбираем единицу из первой, остается 3 4 6 7 и 2 5 8, дальше аналогично 2, 3, 4, 5, 6, 7, 8. Идея в том, что эти две подпоследовательности в момент соединения гарантировано отсортированы, потому что рекурсия сначала доходит до самых маленьких (по 2 элемента, думаю несложно), и потом соединяет по 4, по 8 и т.д. Степень двойки или нет - не принципиально, просто местами будут по одному, а не по два попадаться.
Я не он, но ты хуево объяснил без обид
>Одновременно двигаешься по обеим
После этого перестал читать, невозможно что-то делать одновременно.
Тот кому ты объясняешь, ты это зря ему объясняешь, в гугле стоит ввести heap sort, heap sort для чайников, там будет 1000000 объяснений с разных точек, видео, презентации, иллюстрации, а ты надеешься ему объяснить лучше? Зря время теряешь.
Поправлюсь - одновременно в одном потоке.
Как только добавят возможность его закрыть.
Я не учился в музыкалке на пианиста. Да и якобы скорость работы в нем не всегда нужна.
Сап. Пишу базу данных на си, что-то типа списка одноклассников/одногруппников, пока что сделал только добавление в файл бд. Как организовать поиск через структуры из файла? Я ваще нихуя не пойму. Например вот так выглядит бд в файле:
|NAME USER |2CH |ABU |HUY |
|NAME USER |2CH |ABU |HUY |
а так выглядит структура:
typedef struct _bd
{
char name[25];
char user[25];
char 2ch[20];
char abu10];
char huy30];
}bd;
соглы. Вим не столько для написания кода, сколько для моментального форматирования текста. Как sed только немного круче. Он в отличие от sed интерактивный. Пожалуй, на этом отличия заканчиваются.
266x426, 0:09
Vim с каким-нибудь ClangCompleter и парой десятков плагинов очень классная штука, если у тебя проект не на десятки тысяч строк и полновесная IDE особо не нужна. Просто берёшь и пишешь код.
SICP это мем только у дурачков. Когда ты так говоришь, ты выставляешь себя дегенератом
Пусть твоя прога хранит как в .json. Популярно и удобно.
Так ее и посоветовали человеку, который не знает, как сделать умножение в программе, хуле ты доебался.
Просто читай одну запись за другой с помощью fread. Так работает (работал) DBF. Если захочешь искать быстрее, можешь запилить индексы, например. В простейшем случае ты можешь записать индексы записей, отсортированных по имени, в отдельный файл, а потом двоичным поиском читать индексы и соответствующие им записи.
Сори, анон, но как-то костыльно написано + логику всю переписывать, если добавлять приоритеты операций, который возникают при использовани скобок, операторов умножения/деления и т.д. Советую почитать про запись выражений в польской нотации. Будет гораздо проще сделать нормальный калькулятор. Строчек в 200, думаю, влезет
function foo (int, str) { };
var f1 = foo.bind(null, 1, ".");
> «Поинтерами баловать можно, а баловать кодом нельзя»© The C Language
>>65875
Ух как медленно грузится
Я пытаюсь что-то типа такого https://paste.ofcode.org/78985hzGxnFE25Hhgq9z8M
Естественно код не рабочий
В плюсах можно.
В си можно делать через указатель на функцию, да и пожалуй всё, да и то это не совсем то, что ты хочешь.
Ну целевой проект просто на Си, не буду же я весь код переписывать. Так то конечно если б с чистого листа, на плюсах делал бы.
Если хочешь, можешь сделать через макрос типо.
#define f() foo(2, 4)
Сможешь писать просто f();
Единственное что это всего лишь макрос, который препроцессор развернет перед компиляцией, но это визуально ближе к тому, что ты хочешь хотя бы.
О, спасибо. Мне в принципе и нужно для того чтоб в 10 местах одно и то же не исправлять если что, а как там препроцессор подготавливает это уже похуй.
Программа компилируется но естественно падает при запуске.
Читал про нее - не очень понравилась что нужно дофига конвертировать выражение используя для этого кучу лишних длинных массивов. А тут хоть может костыльно, но всего два коротеньких стека под операторы и под числа, длина которых равна количеству разных приоритетов +1, и всего лишь один проход по выражению.
https://ideone.com/K0zNua
Делал примерно как посоветовали >>65378, логика программы при этом не пострадала, только стеки увеличились на одну ячейку, появилась рабочая область в виде двух смежных ячеек в этих стеках, которую можно перемещать по стеку и добавилась проверка приоритета операторов.
Я не эксперт, но 150 строчек многовато
Рекурсивный спуск жи.
Мимо
Вот этого удвою единственный ценитель среди здешних говноедов.
Уверен? Несколько лет его юзаю, нагрузка на память и процессор в разы меньше, чем у CLion.
Хм, а я старые Студии и не рассматривал. А в 2008 С++98 ака Си с классами, по сути.
Так vi/emacs из той же оперы, только без гуя и с режимами.
Ручками установить errno, и если он выставлен - обрабатывать возвращаемое как целочисленные коды ошибок. Ну или завести свою глобальную переменную под это дело.
>header
define PROIZOSHLA_ZALUPA 1488
>func.c
if (zalupa cond)
ErrorHandler(PROIZOSHLA_ZALUPA);
>Error_handler.c
if (func(x) = 1488)
puts("произошла залупа пиздец короче чтото не так");
void errorhandler(int error) {switch (error)
case 1488:
puts("zalupa occured error code 1488");
break
;}
Он имеет в виду что там компилятор старый, но ему ничто не мешает прикрутить туда компилятор от новой студии.
Тебе же написали - неверный указатель. Сделай в load_file аргумент или указателем на массив фиксированного размера, или выкинь фиксированный размер из LIST нахуй и принимай указатель на указатель. И unsigned тоже выкинь. https://ideone.com/3aWjFh
>>66010
> обработка вложенных скобок практически всегда через рекурсию выполняется
Нет, нормальные люди пилят явный стек, это позволяет нормально обрабатывать ошибки, а не вываливаться через сто уровней рекурсии вручную или через longjmp.
>>66080
> Сейчас ведь IDE не модно
> модно
Ты, наверное, из мейнтейнеров leftpad.js? Или тебе просто нравится дрочить на инструменты вместо решения задач?
>>66131
> Если в функции, которая возвращает double, что-то пошло не так, как это событие передать наружу?
Или выделить из всего диапазона double что-то ненужное для индикации ошибки (например, банально вернуть NaN), или bool func(double ∗result).
>>66221
Зачем /TC, если можно просто добавить в проект файлы с расширением .c, а не .cpp?
>>66235
И енжой проблемы с отладкой и инкрементальной компиляцией. Но в основном с отладкой.
Через настройки, лол.
С отладкой дело решается так же как и с компилятором, а проблема с инкрементальной компиляцией вообще откуда должна взяться?
Алсо для этого уже придумали мейкфайлы чтобы ничего в настройках ide не менять и удобно компилить из под терминала.
> а проблема с инкрементальной компиляцией вообще откуда должна взяться?
Прошу прощения. Я имел в виду Edit&Continue.
> Сделай в load_file аргумент или указателем на массив фиксированного размера, или выкинь фиксированный размер из LIST нахуй и принимай указатель на указатель.
Это какой то пиздец пиздеца. Я вначале отправлял значение (char *)LIST[num] а потом и вообще нахуй перенес массив по месту использования а в теле порограммы оставил только чиселки, с ними меньше проблем.
> Ты, наверное, из мейнтейнеров leftpad.js? Или тебе просто нравится дрочить на инструменты вместо решения задач?
Нет, я как раз давненько в веб фронтенд не лазил хотя левоотступ это вроде из ноды ну да хуй с ним уже и забыл что IDE и любимый редактор друг друга не исключают. Звиняюсь.
>удобно компилить из под терминала
Ну не знаю, что удобнее. Альт-табаться до окна терминала, жать вверх и энтер. Или же просто ctrl+f5.
Мимо
Явно какое-то браузерное говно. Атом?
>>66271
Зависит от подхода к программированию. Если ты компилируешь при каждом изменении (F5-driven development), тогда конечно в консольку ходить не очень удобно. Если ты пишешь относительно большие куски, то консоль норм, и даже удобнее. А так, сейчас любой редактор можно научить компилятор запускать по хоткею.
В иде/редакторах обычно есть интеграция терминала.
Тем более это дело привычки, я много чего делаю в терминале, но меня наверное можно назвать красноглазиком, т.к. я на работе пишу драйвер под линукс.
Не знаю, не пользовался им, выглядит красиво, работает скорее всего так себе.
Думаю вот с вскода попробовать перекатиться на саблайм.
>не знаю, что удобнее
while :; do gcc "FILE" 2&>logfile; sleep 2; done
watch cat logfile
И отвешиваешь терминал на второй монитор, чтобы смотреть, какие ошибки выплёвывает компилятор.
Какже ИДЕдети сосут. Я просто тащусь.
>F5-driven development
Да, оно, идеальное название. Написал строк десять, собрал, повторяю, когда решил проверить - запускаю и молюсь на распиханные в первой версии кода принты.
>while :; do gcc "FILE" 2&>logfile; sleep 2; done
while :; do gcc "FILE" 2&>logfile; sleep 2; done &
да, в конце ещё пизже будет поставить амперсанд, чтобы отправить цикл в фон.
Ну от подхода зависит. Я не постоянно пишу, а набегами. Между ними подсознание придумывает, как решить конкретную проблему. Ну и у меня не никсы.
char *lineptr[MAXLINES];
Я правильно понимаю, что это объявляет массив из maxlines элементов, каждый из которых является указателем на строку?
strcpy(p, line);
lineptr[nlines++] = p;
Каким образом работает это? Ведь длина строки не указана, вдруг там не хватит места для копирования p?
p не имеет никакого отношения к твоему массиву с УКАЗАТЕЛЯМИ на строки. Где-то в памяти создаешь строку p, копируешь в нее line. А за тем просто в свой массив копируешь указатель (адрес начала строки p) p.
Т.е. строки хранятся отдельно, а массив просто коллекционирует их адреса/указатели.
Спасибо, теперь все понятно
>>1362244
Господи, почему же Бабаян с Пентковским отдались Интелу. Если бы они не ушли к ним на западе все еще не было бы микропроцессоров, способных хотя бы в 1 MOPS. А мы были бы монополистами в мире микропроцессоров, создавали бы самые технологичные и быстрые решения, доход от продажи которых составлял бы триллионы долларов в год, ведь выхода у других стран не было бы - Интел сам не может, а остальные вообще полные бомжары. И только наш Эльбрус пробивает сверхзвуковой барьер в микропроцессорных вычислениях. Мы стали бы властелинами мира, держали в руках всю компьютерную индустрию, не продай они наши технологии врагу. Как так можно было поступить. Ублюдки.
>не продай они наши технологии врагу. Как так можно было поступить. Ублюдки.
Все правильно сделали, малаца, люблю их.
Добавил скобочки на рекурсии.
https://ideone.com/rDppF4
Теперь нужно думать как парсить многосимвольные операторы, типа синусов и тангенсов.
>эта весна и обострившиеся шизики повсюду
>Как же вы сюда попадаете-то?
Такая ты наивная няша :3
Ничего прохладного. Пентковский создал набор инструкций SSE (на основе разработок микропроцессора Эль-90, который в 1990м году стал бы быстрейшим в мире, если бы пошел в серийное производство (развал СССР сделал эти планы неосуществимыми). Интел догнал бы его по производительности только через 10 лет (на самом деле не догнал бы - Пентковского-то у них не было бы, выпускайся на родине Эль-90). SSE до сих пор используется в новейших процессорах Интел) для Pentium 3, который увеличил производительность 3ки в 4 раза.
А Бабаян пришел в Интел в 2004 году. Угадай, что Интел выпустит спустя 2 года с его прихода? Core 2, который станет отцом для твоего любимого Core i7, на который ты дрочишь. И эти микропроцессоры просто рвут все остальные в производительности. Очевидно, что в них использовались наработки Бабаяна для процессора Эль-2000.
Так что когда ты теперь восхищаешься великолепными сверхбыстрыми процессорами Интел, тебе стоит вспомнить, кто стоял у их истоков. Советские ученые. Без их работ мир бы сейчас все еще радовался бы 0.5 MIPS'ам и 256 Кб оперативной памяти.
Хуль теперь плакаться, радуйся, что из-за совместной разработки выиграл лично ты. Аля наивная фантастика 60-х, про совместное покорение космоса.
То есть все правильно сделали - кинули пидорашек вроде тебя, гнида через хуй и уехали к белым людям.
Ну хоть кто-то не дебил.
Не могу понять толсто это или тонко.
Алсо: вот допустим у меня объявлено Mix_Music mymusic;
в исходниках SDL_mixer объявлено вот так
struct _Mix_Music {
Mix_MusicInterface interface;
void context;
SDL_bool playing;
Mix_Fading fading;
int fade_step;
int fade_steps;
};
typedef struct _Mix_Music Mix_Music;
Я правильно понимаю что не могу вот так4 в тупую в своем коде mymusic->context вызывать а только через какой нибудь
char buffer = Mix_GetContext(mymusic);
объявленный публичным, верно?
А тотального отставания в электронике у СССР как бы и не было, ага. Во всем виновато копирование System/360, чоуж. И хуевое руководство.
>если бы пошел в серийное производство
Но ты же понимаешь, что он никогда бы не пошел в серийное производство?
Я много читал про все это не далече, чем полгода назад. Про компьютеры из СССР. Из прочитанного я понял, что все компьютерные технологии Совка - это копипиздинг западной техники, микросхем, микропроцессоров, технологий производства жестких дисков, мониторов и прочего прочего. И единственной реально революционной (все остальное - тупое говно тупого говна, которое появлялось в совке, когда на западе такие решения уже лет 10 как устарели) разработкой был этот пресловутый Эльбрус. Кстати, его концепт тоже спизжен - с машин компании Берроуз, которые не использовали ассемблера в процессорных командах, вместо него был высокий АЛГОЛ (его наши тоже спиздили, назвав "язык высокого уровня Эль-76"). Но концепт концептом, язык языком, спиздили и спиздили, а итог должен был превосходить суперкомпьютеры Берроуз да и вообще компьютеры всего мира.
Но. Эльбрус 1 был сдан в 1980 году и никогда не пошел в серию. При этом он был слабее батьки-Берроуза, с которого вдохновлялся. Фэйл.
Срочно начали пилить Эльбрус 2. Вот он как бы уже должен был быть гораздо сильнее и лучше предыдущего (хотя все равно безнадежно сосал у какого-нибудь Крэя). Но и он не пошел в серию. А почему? Машина-то получилось, как принято общественностью, неплохая. А потому что НЕТ БЛЯДЬ У СОВКА ЭЛЕМЕНТАРНОЙ БАЗЫ. Не мог он, как и сейчас не может, массово производить суперкомпьютеры и/или микропроцессоры. Потому что нет такой школы и промышленной технологии полупроводников, как у США (сейчас кто-нибудь кукарекнет, что многое из разработки теории и промышленности полупроводников разработали как раз-таки в СССР "Ряяя, ты что, не слышал про Алфероваааа, ряя", но я не знаю конкретно за Алферова, знаю только, что с проводниками в СССР и России полный пиздец - т.е., даже если наши какие-то технологии первыми разработали, воспользоваться ими они не смогли). Не умели и не умеют в транзисторы, интегральные схемы, микропроцессоры. Поэтому и выпустили Эльбрус 2 мелким тиражом. В количестве БЛЯТЬ 3 ШТУК. Все остальные Эльбрусы 2 - это так называемые "Эльбрус-1к2", т.е. перенос БЭСМ-6 на элементную базу Эльбруса 2. Рассказывать, что это за говно, думаю, не нужно. Берут устаревшую на 20 с лишним лет машину и натягивают на нее (или ее на) концепт Эльбрусовской системы с языком высокого уровня в процессорных командах. На выходе получается дикое, монструозное, страшное, нестабильное тупое говно, отстающее от западных машин как минимум на поколение. А ведь это "революционная разработка".
Нету блять элементарной базы. Поэтому не смогли бы они выпускать эти "Эль-90". Были они на бумаге, вполне возможно, что помогло людям, участвовавшим в их разработке, вкатиться в Интел, Sun, Моторолу и AMD. Но производить такое промышленность СССР никогда бы не смогла. Нет технической обеспеченности.
Так что да - лучшее, что могло случиться с Эльбрусом - это переход его команды в Интел. С отечественной элементарной и технической базой о мировом господстве в микропроцессорах можно забыть и даже на заикаться, а Интел успешно все вывел и выдал в массы.
>если бы пошел в серийное производство
Но ты же понимаешь, что он никогда бы не пошел в серийное производство?
Я много читал про все это не далече, чем полгода назад. Про компьютеры из СССР. Из прочитанного я понял, что все компьютерные технологии Совка - это копипиздинг западной техники, микросхем, микропроцессоров, технологий производства жестких дисков, мониторов и прочего прочего. И единственной реально революционной (все остальное - тупое говно тупого говна, которое появлялось в совке, когда на западе такие решения уже лет 10 как устарели) разработкой был этот пресловутый Эльбрус. Кстати, его концепт тоже спизжен - с машин компании Берроуз, которые не использовали ассемблера в процессорных командах, вместо него был высокий АЛГОЛ (его наши тоже спиздили, назвав "язык высокого уровня Эль-76"). Но концепт концептом, язык языком, спиздили и спиздили, а итог должен был превосходить суперкомпьютеры Берроуз да и вообще компьютеры всего мира.
Но. Эльбрус 1 был сдан в 1980 году и никогда не пошел в серию. При этом он был слабее батьки-Берроуза, с которого вдохновлялся. Фэйл.
Срочно начали пилить Эльбрус 2. Вот он как бы уже должен был быть гораздо сильнее и лучше предыдущего (хотя все равно безнадежно сосал у какого-нибудь Крэя). Но и он не пошел в серию. А почему? Машина-то получилось, как принято общественностью, неплохая. А потому что НЕТ БЛЯДЬ У СОВКА ЭЛЕМЕНТАРНОЙ БАЗЫ. Не мог он, как и сейчас не может, массово производить суперкомпьютеры и/или микропроцессоры. Потому что нет такой школы и промышленной технологии полупроводников, как у США (сейчас кто-нибудь кукарекнет, что многое из разработки теории и промышленности полупроводников разработали как раз-таки в СССР "Ряяя, ты что, не слышал про Алфероваааа, ряя", но я не знаю конкретно за Алферова, знаю только, что с проводниками в СССР и России полный пиздец - т.е., даже если наши какие-то технологии первыми разработали, воспользоваться ими они не смогли). Не умели и не умеют в транзисторы, интегральные схемы, микропроцессоры. Поэтому и выпустили Эльбрус 2 мелким тиражом. В количестве БЛЯТЬ 3 ШТУК. Все остальные Эльбрусы 2 - это так называемые "Эльбрус-1к2", т.е. перенос БЭСМ-6 на элементную базу Эльбруса 2. Рассказывать, что это за говно, думаю, не нужно. Берут устаревшую на 20 с лишним лет машину и натягивают на нее (или ее на) концепт Эльбрусовской системы с языком высокого уровня в процессорных командах. На выходе получается дикое, монструозное, страшное, нестабильное тупое говно, отстающее от западных машин как минимум на поколение. А ведь это "революционная разработка".
Нету блять элементарной базы. Поэтому не смогли бы они выпускать эти "Эль-90". Были они на бумаге, вполне возможно, что помогло людям, участвовавшим в их разработке, вкатиться в Интел, Sun, Моторолу и AMD. Но производить такое промышленность СССР никогда бы не смогла. Нет технической обеспеченности.
Так что да - лучшее, что могло случиться с Эльбрусом - это переход его команды в Интел. С отечественной элементарной и технической базой о мировом господстве в микропроцессорах можно забыть и даже на заикаться, а Интел успешно все вывел и выдал в массы.
>Не умели и не умеют в транзисторы, интегральные схемы, микропроцессоры.
а на чем тогда военная электроника работает? она все-таки у совка была пусть и не особо крутая да и сейчас что-то делают
Ну, да. По мелочевки пилят какую-то хуету мелкими партиями. Но это предел.
Да пиздежь это всё. Я будучи школьником годами занимался радиотехникой, паял всё, начиная с ламповых усилков со здоровенными трансформаторами и заканчивая схемами на логических элементах (микрухи с ноготь) и ни разу не видел ни одной иностранной детали. Вся элементная база была русская. Отставание пошло только с компьютеров (микропроцессоров).
Зачем ты что-то объясняешь залетным детям из hw, которые с трудом себе-то объяснят что такое ток?
Там не деталь, а сами элементы были иностранными. Можно погуглить, у всех отечественных диодов, микросхем и прочего были зарубежные прототипы. Где-то был сайт, где перечислялись с фотками советские копии и иностранные оригиналы.
Мда, то-то было так много брака среди телевизоров и радиомагнитофонов, а электронных устройств сложнее "Электроники ИМ-02" в гражданском потребление просто не существовало.
Видимо, только твои говноподелки пилить эти микроэлементы и подходили.
> сами элементы были иностранными. Можно погуглить, у всех отечественных диодов, микросхем и прочего были зарубежные прототипы.
Ну все охуеть теперь в Америке колёса круглые, давай нахуй на квадратных езди
Это называется "аналог". Аналоги есть не только между отечественными и зарубежными деталями, но и внутри отечественных например. Дело в том, что схемотехника примерно унифицирована. Изобретать детали с нестандартными параметрами не круто.
Есть разные архитектуры. Тот же интел и арм.
В си нет публичных/приватных полей, можешь обращаться так, как хочешь, если есть специальная функция геттер лучше обращайся через неёопять же не обязательно, для поддержания эстетики между либой и твоим кодом.
Ну прата же. В C17 ничего особо интересного нет.
>>66660
Полей нет, но если вот так struct _Mix_Music лежит в .c файле внутри SDL или в приватном (не распространяемом) .h, а typedef к ней в публичном .h, то единственный легальный способ достучаться до полей - через геттеры. Это классический способ инкапсуляции в Си (который, кстати, не осилили в крестах, где методы должны торчать в определении класса в .h вместе со всеми остальными кишками).
Дело говоришь. При чем тут Сишка? Как сейчас помню, поднимаю в 88-м на советском компьютере javascript...
Всем привет, я новичок.
Кто-нибудь может сделать так, как гифке, написав код на С?
И так же в среде разработки покадрово сохранить и сделать один файл .gif на выходе, а потом показать код?
Хочу выбрать язык, на котором буду делать такие вещи, а возможности языков не знаю.
Помогите, пожалуйста.
http://www.cyberforum.ru/3d-modeling/thread2421226.html
Не сомнено, про Сишку ни слова. Но писькомерство и а вот если бы
Ну берешь либу для работы с гифками, рендеришь изображение во фреймбуфер, пишешь кадр в гифджиф, рендеришь следующий кадр, пишешь. От языка тут абсолютно ничего не зависит.
Как мне кажется, всё-таки большая часть производительности из-за out-of-order execution, а не SSE. Да, оно безусловно важно, но без OOO ты бы до сих в асме сидел и руками вычислял трупуты и латенси. Особенно в 90-х, когда компиляторы разве что константы сфолдить могли.
RIP Itanium
typedef struct _TAG_ {
int x,y,w,h;
img_t img;
} g_t;
g_t Button1;
...
_draw_img(Button1.img, Button1.x, Button1.y, Button1.w, Button1.h)
Когда тоже самое было через обычные переменные все ОК
Любопытное про кодинг под PowerPC на пастген-консолях. Чтобы далеко не ходить, вывод такой что эти чипы примерно равны 1/3 от K8(Athlon64) равной частоты на сложном (branch and microcode-heavy) коде.
http://cbloomrants.blogspot.com/2010/07/07-10-10-powerpc-suxors.html
http://cbloomrants.blogspot.com/2010/07/07-21-10-x86.html
Ну нам-то откуда знать? Проблема где-то еще. Видимо, у тебя img инвалидный, ты структуру вообще инициализируешь?
>>66475
>>66452
Что-то мне кажется вы этого долбаеба Бабаяна ну хотя бы слегкааааа так переоцениваете. Ну хотя бы самую малость. За Пентковского не скажу, так как нихуя о нем не знаю, не знаю на кой ляд ему этот SSE сдался, но раз хотел разработать, значит есть за что.
Но Бабаян - огромнейший хайпожор, который "изобрел" читай спиздил все подряд прорывные технологии. Его Sun нахуй послали, прокрутив на залупе с его "невероятными процессорами", а свой охуенный Эльбрус ДВЕТЫЩИ он так никогда и не выкатил. Лол, обещал захуярить и похоронить Интел с начала 90х, а в итоге выкатили какое-то говнище только в 2008, которое с глубоким проглотом сосет у самых бюджетных Интелов. ГДЕ БЛЯТЬ ПРОТОТИП СУКА? В смысле, раз такой охуенный процессор был, где хоть один? Почему Sun нахуй послали? Потому что он им говна лил за шиворот, как вам льет. Увидел кучу модных, появившихся на заре 90х терминов (по крайней мере в отношение процессоров) - суперскалярность, VLIW, параллелизм, предвыборка кода. И как начал спамить этой терминологией всех подряд, не забывая еще спиздануть, что все это придумал он.
Пиздабол он какой-то, миллион раз уже попадался, поэтому я ему не очень-то верю.
> ты структуру вообще инициализируешь?
Инициализирую бля! Как понять "иницмализирую"?
Картинки не битые если что
> как вам льет. Увидел кучу модных, появившихся на заре 90х терминов
Кому вам, мудила? Он в каждой лекции трындит про Эльбрус 1-2 повторяя по кругу что - OoO суперскаляр, первый (сирийный) в мире, интел только в 93ем осилил, всем давали пасасать.
Итаниум никакого отношения ни к эльбрусу ни к бабаяну не имеет.
Бабаяноёб порвался.
Кого блять Интел только в 93 осилил, долбаеб? Суперскалярный мейнфрейм? Ну охуеть теперь, вот только Интел по микропроцессорам, а не по мейнфреймам специализируется. Первый же суперскалярный рабочий микропроцессор создала Моторола в 88 году, но никак не уебан Бабаян.
Но и с желанием быть первым суперскалярщиком Бабаян сосёт бибу, так как Крэй создавал АБСОЛЮТНО СЕРИЙНЫЕ (а не 1-2 штуки, как его невъебенные "серийные" Эльбрусы) суперскалярные машины на 16 лет раньше этого пиздабола.
Так что непонятно на что он тут претендует, на какое первенство. На суперскалярность? Сорян, вы опоздали на 16 лет, надо было раньше приходить. На суперскалярный микропроцессор? Извините, но что-то никто никогда не видел ваших рабочих суперскалярных микропроцессоров. Короче, он знатный пиздабол.
> Бабаяноёб порвался
kek написал порвавшийся долбоеб с горелой дупой. Иди с бабаяном на хабре спорь кто там первый и кто круче, тут тема про язык Си.
> The result is that you can get wins by randomly offsetting your arrays when you know they will be used together. Some amount of this is just unavoidable.
Ох лол. Как же рад, что под x86 всё делаю. Особенно когда читаю про модели памяти различных архитектур (например DEC Alpha - ебануться).
Алсо, это чувак из RAD Game Tools? Как они туда столько классных людей набирают? Одни Фабиан и Кейси стоят сотни программистов.
Что нового в С17?
Память выделил? Или в указатель что-то записал перед вызовом?
GCC и современные стандарты поддерживает.
Короче у меня похоже проблема с пониманием как правильно работать со структурами
пикрелейтед - когда я передаю картинку в модуль программа сегфолтится
функция из модуля делает вот это
void module_draw_img(img_t p, int x, int y)
{
SDL_Surface pixbuf = (SDL_Surface )p;
SDL_Rect dest;
dest.x = x;
dest.y = y;
dest.w = pixbuf->w;
dest.h = pixbuf->h;
SDL_BlitSurface(pixbuf, NULL, screen, &dest);
}
когда тоже самое на пикрелейтед через обычные глобальные переменные все работает, видимо потому что еще функции (которые для каждого элемента приходится отдельную держать) инлайнятся.
Включи пошаговую отладку, посмотри на каком вызове падет. Ну или тошни в лог, перед каждым вызовом. Смотри где падает.
Потому что у тебя все переменные в структуре в стеке, ВОЗМОЖНО кроме img_t. Надо смотреть и ее описание, возможно там есть член требующий явной инициализации.
> Ну или тошни в лог, перед каждым вызовом.
жабаскрипты жабаскриптики так и делаю
Алсо:
loadIMG: music 28x33
loadIMG: info 32x32
loadIMG: vol 65x32
drawIMG: vol 0x0 x:0 y:480
drawIMG: info 0x0 x:0 y:480
То есть то что я и подозревал - когда я вызываю btn_init(Button1) оно внутри с копией структуры работает внутри а на глобальной структуре это никак не отражается.
Надо как то правильно через поинтер в функцию ссылку на структуру передавать
>>66946
> ВОЗМОЖНО кроме img_t. Надо смотреть и ее описание, возможно там есть член требующий явной инициализации.
typedef void* img_t;
Вот так вот оно в заголовке определено
*через указатель.
> Я честно говоря вообще не понимаю, как это у тебя компилируется.
прикидываюсь clang -ом
попробовал по твоему через struct _TAG_ Button1;
тоже компилируется и тоже валится на том же месте, то есть и то и то примерно одно и тоже
>>66952
А как правильно то? https://paste.ofcode.org/vi5TZjpwaZhLrLfGAv68Bt
Когдя я их использую он (компилятор) вечно пиздит
static void btn_init(g_t btn) {
btn->img = module_load_img( btn->path ); // модуль знает путь к папке с картинками
btn->w = module_get_img_width( btn->img );
btn->h = module_get_img_height( btn->img );
}
static void btn_draw(g_t btn) {
module_draw_img(btn->img, btn->x, btn->y, btn->w, btn->h);
}
Примерно понял, можешь пасту не делать, сейчас попробую
Спасибо заработало.
то есть корректный код для моего примера выглядит вот так https://paste.ofcode.org/GHjwTb99cprrU44Ru9j6WX
Либо передавай в свой инит указатель, либо вообще нахуй убери и обращайся в интернете напрямую к баттон1,2,3, они у тебя все равно глобальные на какой-то хуй.
Двачую, засунь переменные в начало мейна, ты все равно их в функцию передаешь, тогда в чем смысл глобальноститем более она тут вообще не к месту
> обращайся в интернете напрямую к баттон1,2,3, они у тебя все равно глобальные на какой-то хуй.
так и было изначально, но с этим неудобно работать, мне вот надо еще 2 элемента идентичных добавить и обрабатывать, надо опять каждой по хуевой горе переменных объявить и функций написать.
Сабжевый код это упращенная версия
>>66980
Пока (к сожалению) не могу, много где еще напрямую обращение идет, но когда код чище в нем уже лучше видно как можно так все организовать что бы они в глобальной области видимости не весели.
Откуда берётся "С89 - тру, остальное от дьявола". Я сначала думал это такая толстота, но на лоре и в конфах частенько встречаю С89 бояр поливающих говном остальные стандарты и заявляя, что дескать после С89 остальное - это заливание анальное огораживание разработчиков.
Чем С89 лучше С11?
Единственное объяснение - это старым восьмибитным компилятором под спектрум не соберется.
>Говноед, уходи
>Выискивает куски в посте не относящиеся к теме
>офтопит
>подрывается
>называет другого говноедом
пиздуй обратно в /b, бiдло
на лоре хотя бы тебя не пидорнут с форума за отказ лизать жопу макаке и на любую нетривиальную проблему распишут разжеванные тома
В main.c:
#include <hiredis.h>
В /usr/local/lib:
libhiredis.a libhiredis.so libhiredis.so.0.14
В /usr/local/include:
hiredis
gcc -L libhiredis -o main main.c
main.c:2:10: fatal error: hiredis.h: No such file or directory
#include <hiredis.h>
^~~~~~~~~~~
compilation terminated.
если запустить
sdl2-config --libs
то он выдаст вот такую хуйню
-L/usr/local/lib -lSDL2
sdl2-config --cflags
-I/usr/local/include/SDL2
Надеюсь тебе это поможет
>Подскажите
Но зачем? Ведь если тебе подскажут, оно заработает, а значит пердолингу конец. Пердоля против пердолинга, ты сам себя отрицаешь.
Ничем не помогло. Вот ldconfig:
>ldconfig -p | grep hiredis
>libhiredis.so.0.14 (libc6,x86-64) => /usr/local/lib/libhiredis.so.0.14
>libhiredis.so (libc6,x86-64) => /usr/local/lib/libhiredis.so
Пока компилю через жопу:
gcc -o main -I./hiredis main.c hiredis/libhiredis.a с самой либой в директории
Напиши сначала как в книжке Господа нашего http://www.cypress.com/file/56651/download, калькулятор с польской нотацией юзающий стэк тянешь знач. из стека пока не будет операция - выполняешь операцию над числами и суешь обратно в стэк, парсер легчайше сделать для такой хуйни.
Может, вообще в какой-то книге можно почитать про такие базовые best-practice по Сишке?
третий день пишу на си
По хорошему удаляй в том же скоупе, что и выделяешь, чтобы все было более менее наглядно или делай подобие ООП с конструктором и деструктором, только все равно деструктор придётся ручками дёргать.
Оно как бы вообще идея плохая. Я так понял, просто для примера возможности.
Читал первую, лайтовая приятная книжка. Легко читается, легко понимается. Моя первая книга по си, могу сказать что ок.
Там же (?) пишут, что под PS2 (не говоря о более ранних консолях) было намного жестче (типа постоянный стриминг с DVD, постоянная загрузка/выгрузка текстур в мизерную видеопамять с основной несколько раз за кадр), хуже тулинг, вот это все. Железка крайне любопытная кстати https://hwdocs.webs.com/ps2
https://www.youtube.com/watch?v=PvK2nVMKEQ4
только вчера сам об этом гуглил
надо вот так вот делать
srand( time(NULL) );
зкштеа("random: %d ", rand() % 10); // => 0...10
Это в учебнике который я читал написано про это что надо через переменную
time_t t;
srand(time(&t);
И дальше уже используешь rand().
Если интересует почему так, то потому что статические (т.е. компилируемые без рантайма) языки так устроены что никакого рандома быть не может.
напиши ка цикл или алгоритм который рандомно числа подбирает - не сможешь. Тебе так и так надо какое то стартовое значение которое должно меняться, но в бинарнике же ты не можешь значение менять (в зависимости от запуска итд).
>>67408
Да блять выкинь ты нахуй этот учебник, открой документацию нормальную и смотри http://www.tutorialspoint.com/c_standard_library/c_function_time.htm
Функция time из стандартной библиотеки, принимает в качестве аргумента поинтер то есть туда нахуй что угодно можно сунуть, если указатель указывает на ноль то он возвращает 1 января 1970 в милисекундах
#include <time.h>
int main() {
char \*t = {0,0,0};
long int a = time(&t);
printf("time: %li %li\n", t, a);
}
Все функции void, аргументов нет.
Пробовал void (mas[8])() = { &f1, ... } - на каждую данную функцию ругается "ссылка на неразрешённый внешний символ _f1 в функции _foo" в файле file.obj
Без амперсанта то же.
Если сделать так:
void (mas[8])();
mas[0] = &f1;
mas[1] = &f2;
...
то та же ошибка, но не ругается на нулевую функцию.
typedef void (funcs)();
funcs* mass[8];
не помогает
typedef юзай, проще будет
Да, это не решение проблемы, я неправильно написал свой код.
У функций, которые клал в массив, было по два прототипа - в хэдере и в другом файле
Как с этим блять работать то вообще?
> Mingw64
Надо им было переименовать проект когда форкали, а то все ссылки видут на обычный mingw
А пакетный менеджер там есть хоть какой то? А то блять какой не возьми они все на повершеле поголовно, ну в чем проблема взять руби или пистон тот же ну нахуя опять завязывать свои приложения на МС поделия, ну ничему вообще люди не учатся.
> Cygwin
> лучь света
Поспешил с выводами, такое чувство что мне проинсталировали дебиан скомпилированый для винды.
Говно короче.
Пердоли как всегда, писать программы на Си -не пишем, лучще попиздим про кривые костыли, изображая ложную активность.
>>67630
> писать программы на Си -не пишем, лучще попиздим про кривые костыли
А толку их писать если их проверить нельзя
так и gem и npm есть но мне же надо dev хидеры и либы типа libogg libsdl ...
Просто ведь вопрошаю чем под виндой люди пользуются, как под нее разрабатывают, где компиляторы, мейк все вот это берут как код собирают итд. Это ведь самая распространенная ос программ которых под винду нет наверное можно на одном диске сложить и в ней что, нихуя нет и не придумано ничего для автоматизма и удобной разработки?
Я не верю в это, не хочу верить. Не хочу верить что в 2019г мне придется ходить сейчас по сайтам и качать инсталяторы архивы того что мне надо для сборки потом открывать документацию и курить как же в винде пути устроены там же не сделаешь cd ~project/ && make
> Просто ведь вопрошаю чем под виндой люди пользуются
mingw-w64, ответили уже. И Visual Studio еще. У крупных проектов обычно есть готовые проекты для VS, ей и собирают (msbuild все дела). Детектится по использованию ucrt, например.
> мне придется ходить сейчас по сайтам и качать инсталяторы архивы
Один инсталлятор. msys2. Внутри обычный pacman, которым ты ставишь компилятор и либы. В его же консольке собираешь либы, которых в бинарном виде не завезли.
> Што? Это-то тут при чем? Тру рандома вообще быть не может, а какой-нибудь твой пхп просто сам делает srand().
Ну во первых не мой, хотя мне нравится пхп как яхык за исключением некоторых вещей,
Во вторых инструкции типа srand ни в одном известном мне процессоре тоже нет.
mingw-w64 я уже качнул, но что то у меня там неправильно поставилось, msys2 на первый взгляд то что нужно, но пока не трогал, завтра попробую его и мингв через него. Но мне кажется паке тов там раз два и опчелся, но посмотрим.
А вижуал студия платная же да и проект на опенсорцные либы и флаги гцц/шланг завязан, это чисто для шинд-онли коммерческих приложений.
> Во вторых инструкции типа srand
Потому что srand() это функция сишного рантайма, с чего бы ей быть инструкцией? И пхп до 7 вроде версии просто обращался к сишным rand()/srand(). Обычно (псевдо)случайные числа генерируют программно, но еще есть специальные железки для криптографии и есть инструкции типа rdrand в x86, там в качестве источника энтропии используются датчики и внутреннее (непредсказуемое) состояние, поэтому задавать seed не нужно.
>>67776
> я паке тов там раз два и опчелся
Да. Если что-то не очень распространенное - собирай сам. На самом деле, если тебе вот прямо совсем не хочется собирать лишнее говно самому, кросскомпилируй из-под федоры - у них больше всего готовых девлиб под винду в репозитории.
> А вижуал студия платная же
Community бесплатная, платные фишки для сборки не нужны. Весит только много, даже если build tools качать, это да.
> Потому что srand() это функция сишного рантайма, с чего бы ей быть инструкцией?
srand это функция стандартной библиотеки которая после компиляции превратилась в инструкции процессору и обречена выдавать статически предсказанный результат. Ты никак не можешь на это повлиять этот код исполняется на железе
А рантайм он компилирует (превращает код в инструкции) во время исполнения, и по нескольку раз еще потом гонят с оптимизациями и деоптимизациями. Если даже сишная rand() после каждой компиляции программы другие числа начинает по кругу гонять, то тут то нахуя какие то srand(time(NULL)) придумывать? Где логика?
> is an instruction for returning random numbers from an Intel on-chip hardware random number generator which has been seeded by an on-chip entropy source.[2] RDRAND is available in Ivy Bridge processors
Ох лол вот это я обосрался (хотя на самом деле обосрался интел со своими нейросетями в процессорах)
> srand это функция стандартной библиотеки которая после компиляции превратилась в инструкции процессору и обречена выдавать статически предсказанный результат
Она ничего не выдает, она void возвращает, привет.
> А рантайм он компилирует (превращает код в инструкции) во время исполнения
Для выражения типа state ∗ 1103515245 + 12345 абсолютно похуй, какие там были оптимизации, и когда именнно его превратили в машинный код. Оно вычисляет следующее состояние ПГСЧ (следующее случайное число), и его результат целиком зависит лишь от state. И вот как раз state и устанавливают с помощью srand.
Причем это сделано не потому что просто так получилось, или потому разработчики языка дебилы, а для того, чтобы результаты были воспроизводимыми, когда ты будешь тестировать свой говнокод (передаешь в srand() одно и то же число, или запоминаешь, что именно ты туда передавал в прошлый раз).
> Если даже сишная rand() после каждой компиляции программы другие числа начинает по кругу гонять
Не начинает, в этом вся суть. Если не вызовешь srand() вообще, то будет одна и та же последовательность, которая зависит от реализации генератора. И насчет круга ты тоже слегка загнул. Даже у линейного конгруэнтного генератора выше период последовательности 231.
Это ты, наверное, еще не знаешь про denormals, сорта NaN и про разную псевдо-хуйню у long double в x86.
Да вообще песец полный. Там еще оказывается два нуля есть, положительный и отрицательный.
Похуй, gcc все равно в putchar() свернет.
Функционал компилятора выходит за рамки того, что продиктовано стандартом. Вот в этом всем и отличаются.
Братишка читай лучше сразу праймер прата.
Укажете на ошибки? Подскажите еще пожалуйста как с массивом со строчкой из букв сделать можно программу, или там придется переписывать?
https://pastebin.com/EARV37u4
> Укажете на ошибки?
С -Wall собери, компилятор сам укажет. Алсо, ты задачу не привел, хуй знает, что ты пытаешься сделать. Алсо, пробелы можно одним printf-ом выводить: printf("%*s", 10, "").
Задачка со звёздочкой.
Все мы знаем, что с помощью поразрядных операций можно установить, сбросить, инвертировать отдельно взятые биты одной инструкцией, не изменяя остальные биты, например, в некой 8-битной переменной tepm:
char temp; >переменная
temp |= (1 << 5); >установить пятый бит переменной, не изменяя остальные
temp &= ~(1 << 4); >сбросить чётвёртый бит переменной, не изменяя остальные
temp ^= (1 << 7); >инвертировать первый бит, не изменяя остальные
Также можно устанавливать/сбрасывать несколько битов сразу, не изменяя остальные, например:
temp |= ((1 << 5) | (1 << 3));
temp &= ~((1 << 5) | (1 << 3));
temp ^= ((1 << 5) | (1 << 3));
Вопрос: как одной инструкцией с помощью одних лишь побитовый операций, не прибегая к использованию функций, одновременно установить и сбросить несколько битов, не изменяя остальные?
> инструкцией
Пиздец перевод. Это кто, прата?
> char temp; >переменная
> temp ^= (1 << 7); >инвертировать первый бит
> первый бит
Пиздец перевод. Алсо, запись значений больше SCHAR_MAX в signed char - implementation defined.
Один бит это единица. Если нужно несколько бит, меняешь единицу на число с нужным расположением и количеством бит.
>С -Wall собери, компилятор сам укажет.
Огромнейше благодарю. Одно выражение не имело смысла. Удалил, скомпилировал с C-wall и ошибок не обнаружено.
Нужно было создать с помощью циклов расширяющуюся пирамиду до введенной заглавной буквы.
Чистить надо же только после calloc, malloc, etc? Если я просто поинтер ебанул (int* p = &jopa), при выходе из области видимости православно рипнется и p и jopa?
Да, вручную освобождать нужно только то, что ты вручную же и выделил. Ну или если тебе какая-то либа выделила.
В каком проекте? Почему это должно как-то отличаться от C++, по твоему? Просто собираешь .asm в .obj и линкуешься к нему. Если IDE, то куда тыкать, зависит от IDE, а ты ее не указал.
Что за бред, при чем тут C++ вообще? Или тебя смущает extern "C" в декларации? Просто убери, и все.
Замени плюсовые касты на си-стайл касты.
https://ideone.com/k8SWKL
То есть 6.000000
Потому что это какая-то хуета. Перепиши с нуля и задумайся хоть немного
Добавляй 0.5 если тебе нужно округление
Привыкай к костылям, числа с плавающей точкой это те еще сволочи
https://ideone.com/OBGEN8
Нельзя использовать что-то кроме stdio.h, нельзя массивы и циклы. Вроде это все нельзя, остальное можно. Ебал в рот тех, кто придумывает такие задания.
Ах да, там нужно разделить a.b на a и b и сравнить что больше, максимум цифр после точки 5.
Нет, бывают правильные костыли.
Потому что современные программеры — макаки, а чем меньше кода надо писать, и чем меньше задумываться над своей поделкой, тем больше макака рада.
Рекурсивный спуск имеет в своей основе представление о формальных грамматиках, так что это более общее и намного шире применимое решение.
>целый день
Я уже много дней бьюсь по несколько часов. Пока сделал только базовую арифметику, скобочки, степень, остаток от деления и целочисленное деление. На этом пока остановился, так-как знаний маловато, буду вникать в теорию, а потом продолжу.
https://pastebin.com/ng3s7h61
>>68966
Рекурсия легче, не надо самому динамически выделять память, но труднее ловить ошибки.
>чем меньше кода надо писать, и чем меньше задумываться над своей поделкой, тем больше макака рада.
Лол,обычно это называют эффективность.
Ребята, вы делаете пиздецкий говнокод. Пожалуйста, прочитайте КиР перед тем как что-то постить в этот тред. Проделайте все (ну хотя бы процентов 70) упражнений. Это займет у вас месяц при неспешном чтении.
В результате вы разберетесь и в построении калькулятора, и в работе со строками, и в сортировке и даже в работе динамической памяти вместе с работой в файловой системе.
Нужно внести правило банить любого, чей вопрос обсуждается и решается в K&R.
мимо читавший второкурсник
>страдайте хуетой месяц, и только потом программируйте
Классный способ отшить любого, привив отвращение к программированию.
Я не говорю идти читать ебаный стандарт, это охуенная книга с кучей практических заданий, а не попыток этих неумех собрать из лего истребитель.
Это книга специально для вкатывания и написана. Калькулятор там как раз и разбирается где-то в 4 главе
Книга это хуета с хуетой. Интересно решать левые плешивые задачки только тому у кого собственных задач нет, то есть нет интереса к программированию, а вместо этого только фетиш на учебу.
Наверно решать интегралы и считать плотность вероятности ты тоже учился на практике и без грамма теории, да?
Не неси хуйню, это серьезный яп системного уровня, а не петухоскрипт. С таким подходом когда он дойдет до работы с памятью ему ничего не останется как жидко пернув умереть
Нет, она написана для тех кто уже умеет программировать хотя бы на каком-то другом языке.
Ему уже достаточно тех знаний, которые он имеет, чтобы вкатится в нее
Тупая аналогия. Раблта с памятью это просто, совсем не нужно ничего зубрить как с формулами, нужно только понять, а для этого не нужно не только знаний, но доже ума, реально тупой справится. нужно только желание понять, а не писать хуйню вслепую. Но с последним отношением, опять, значит к программированию нет интереса.
Может и достаточно, я начал с неё и несмог в неё совсем. И есть мнение что не я один. Прочитал перри и сейчас читаю прата.
А мне нравится мой говнокод. Для вас может смешно, но для меня это первая более-менее крупная программа на Си, которая работает и уже была успешно использована по назначению.
Читаю сейчас "Язык программирования C. Лекции и упражнения, 6-е издание" Прата. По ощущениям написано очень растянуто, зато всё понятно.
калькуляторщик
пиздец пиздец пиздец
Вам реально в кайф жрать 1000 страничное дерьмо вместо книги на 200 страниц от создателей языка и по совместительству людей, написавших unix?
Охуеть, не хочу учить как деды и байтоебы, хочу хвастаться перед мамкой количеством страниц. Поссал на вас.
Да, есть такое. Хоть на дваче могу побыть чсв-уебаном, а ирл я полуметровый няша-стесняша :3
Сейчас современность, поэтому начали с современного чтива, а олдовую книгу от отцов-основателей тоже почитаем, когда руки дойдут, не волнуйся.
Зачем мне читать кривой манула дидов если есть благородная книжка где все не торопясь и обстоятельно изложено? Ем флорентину, попиваю джек дениелс и покуривая сигару читаю перед камином, а ты завидуй плебей.
Могу позавидовать. Слабоумные более счастливы. А дедовские книги не кривые. Просто написаны в то время, когда комп был не у каждого примата, а только у тех, с кем можно поговорить как с homo obrazovannies, а не кормить тысячами страниц, от которых мозг отключается. Учил по K&R и не чувствовал себя кретином, сосите залупу, честь имею.
Ну раз ты так учил то конечно все так должны учить, дед. Все кто не так учат неучи и балбесы. Ппц ты песком сыплеш, старпер.
Бедняжка. Небось, мать наехала "вон у Ленки-то сын за 2 недели программизм освоил и дом родителям купил, не то что ты, нахлебник..."
Труъ-кодеры всем скопом поссали тебе на лицо, оставив немного для следующего анона, кому тоже месяц (не 5 лет, не год даже, а МЕСЯЦ БЛЯДЬ) учебы - унижение. У гуманитариев понятие глубины, видать, из коробки поломано.
Что за пиздец, без циклов и всего остального это вообще выглядит как несвязанный шизофазический бред, странный у вас препод.
Как добился?
>>69021
Хуй знает, я вообще особо си не учил, так было полкурса в универе, перед плюсами, вот их более менее учил, в основном по курсам с ютубчика, пробовал читать какую-то книжку, осилил страниц 200 может, потом забил хуй.
Но я очень быстро информацию усваиваю, может в этом дело.
кернел-дев-20-лвл
Мои комиты есть в ядре линукса, да и на работе я драйвер пишу, собственно связанные с ним патчи туда и отправляются, шутник.
> комиты есть в ядре линукса
Ебать ты говномес, ты уже понял, что ядро линуха это показатель того как не нужно разрабатывать ПО?
Общий уровень кода так себе конечно, благо я работаю не надо самим ядром, а просто портим драйвер в апстрим периодически.
Но как опыт для первой работы я щитаю довольно хороший.
алсо помимо линуха ещё QNX дёргаю, в теории можно ещё DPDK и Винду потыкать
На самом деле я даже не знаю, что этону видимо пока кастомерам это не нужно, да и вообще вряд ли будет нужно, учитывая что мы мультигиговый езернет разрабатываем как бы, вероятно поддержку вайфай 6 тоже будем делать совместно с квалкомом, а QNX очень даже, на нем весь аутомотив будет держаться, поэтому и пилим.
Удобнее обработка ошибок, строгая, статическая типизация, проблемы с памятью решаются на этапе компиляции, darta races отлавливаются на этапе компиляции, алгебраические типы данных, статический полиморфизм, макросы получше, производительность такая же, можно юзать уже существующие библиотеки на C и C++.
Короче 0 минусов, одни плюсы.
>Статическая типизация
Поехавший? Ты в си треде если что, а не в треде КулСмузиСкрипт2010.
>Проблемы с памятью
Какие проблемы с памятью?
Не убедил
Акцент на строгости типизации. Я в курсе, что в сях она статическая, лол. Хотя с учетом того, что в реальном сишном проекте ехал void через void и другие веселые касты для имитации ооп, то от статической типизации тут одно название.
И не надо строить из себя целочку, мол память не течет, не бьется и вообще все заебись. Тонны тулинга для битья кожаным мешкам по рукам существуют не от хорошей жизни.
Парсер съел звездочки возле void
Реальный сишный проект не пишется с нуля, а переписывается с прототипа что бы было очень быстро
Спасибо, кеп..Только зачем ты это написал? Я же пояснил выше, что не в embedded и на популярных архитектурах у C нет преимущств ни в чем. Даже в скорости.
Спасибо, Раст создавался под Файервокс, это тормозящее говно я удалил со всех устройств, в какой там ембедед вы еще хотите я не понимаю.
Я тоже FF не пользуюсь, но я гуглил бенчмарки последних версий FF, куда намержили подсистем на расте из servo. Так там все +/- как в хроме с производительностью
Не понятно твое копротивление, что ты хочешь то?
> ехал void через void и другие веселые касты для имитации ооп
kek тоже прям сразу в глаза бросилось, и потом когда программа падает непойми из за чего приходится консоль-логами фпринтами ловить.
Си,Сипп, жс три брата акробата, костыльные во многом и архаичные но каждый в своей области мэинстрим.
А нахуя мне раст? Вот потихоньку на Си пилю валидатор некоторых файлов текстовых. Процесс вполне идет, не вижу причин менять язык.
Мы тут угораем по духу старой школы, не мешай.
Ужасно. Валидатор текстовых файлов это не программа, кроторую сделал и люди пользуются, а задача для скрипта. Текстовые файлы постоянно меняются, и ты будешь на каждый пук пересобирать свой высер? Я уже не говорю, что там кода нагорожено, кроме тебя никто не разберется. Короче, тут два варианта, либо ты умный мудак, который специально делает такое говно защитить свою незаменимость, либо необучаемый колхозный идиот, которому лень изучить лучший инструмент под задачу.
А я и делаю для себя, в общем-то. С перспективой допила в нормальный редактор файлов такого формата.
Для души, короче. Ну и я необучаемый еблан, который как встретил Си, так на нем и застрял
>спойлер
Я тоже, лол, но тут нечем гордиться.
Хотя, по правде, писал и на вижуал бейсике, джаве, решетке, но в конце концов мне нужны в основном программы, и тут только сишка нормальная, а для скриптообразных задач вроде программ для работы через веб-парашу, решетка удобнее, я ебал пердолиться на сях с этими сетевыми запросами. И решетка по крайней мере хотя бы экзешники делает как у людей, работающие терпимо, хоть и медленнее.
Тыкал палочкой в раст, не понравилось что хелловорд весит два метра, а то и больше. Го тоже выдает столь же жирные хеловорды. Ди выдает чуть поменьше - 300 кб, но там сборщик мусора хоть есть, а что впихнули такого жирного в раст - не понятно. А на няшной всего два килобайта получается на tcc и 30 на gcc. Кресты не пробовал, но там вроде тоже всё няшно.
А сях тоже анальные функции, те же яйца, даже выглядит одинаково. Никто ведь не заставляет лепить функции на каждый пук, как и классы и тем более иерархии. Только дебилы лепят говно потому что оно есть в языке. Просто считай что название и скобочки это условный символы для обрамления кода, и всё, никаких проблем, ооп, функций, и прочего ненужного говна. Просто спроси себя: "Язык для меня, или я для языка? Кто главнее, кто кому подчиняется?" и будет ясно чмо ты позорное или человек.
Си это системный, машинный язык. Какой код написал, такой и получил.
Раст это веб-параша. Декларативная хуйня для определенных действий, а какой там будет код всем похуй. Вебмакакам похуй на код, у них хозяин богатый, если будет тупить/тормозить просто добавит еще серверов.
Херово тыкал, че. Я тоже удивился от бинаря в полтора мегабайта на одном принте в консоль. Когда как у С и С++ выходит по 8кб. Минутный гуглеж и раст тоже выдал бинарник в 9кб.
а на асме меньше 1кб, ибо main НИНУЖЕН нахуй, под меткой _start: отпечатываешься и милости просим exit 0) Эх, аж плакать хочется...
Да похуй как-то. Я лучше залинкую libunwind и стандартную библиотеку(те самые полтора мегабайта), получу производительность как на асме, чем буду экономить сраные полтора мегабайта, пердолиться в десять раз больше и получить ту же производительность. Полтора мегабайта, в которые входит куча полезных библиотек, которые нужны всем и всегда, это не 30мб у джавы, в которые напиханы даже аллах и твоя мамка
>это не 30мб у джавы
>почему вы так плохо живете?
>а хохлы еще хуже!
Это не ответ, а виляние жопой, лишь подтверждающее.
Т.е. неудобность разработки и отстутствие уверенности в сесурности написанного кода - это нормально, а 1.5мб бинарника - ето плохо. Если что, раст по умолчанию линкует все статически, в 1.5мб залинковано много всего - stdlib, libunwind, pthreads и другое. Если ты в сях юзаешь динамически эти либы,то ВНЕЗАПНО в памяти процесса будут загружены все те же либы. Да, они будут шариться с другими процессами, но все же.
Я уже написал, что в расте можно линковать динамически и тогда все будет как по дефолту в С
>Т.е. неудобность разработки и отстутствие уверенности в сесурности написанного кода - это нормально
"Уверенность" это мемчик дебилов, заменяющий мышление. Для таких есть Питон, уверенный язык, вот и нахуй иди в свой загон.
В расте на этапе компиляции работает статический анализ. Ты разве не юзаешь его в своих проектах? А санитайзеры? Если нет, то ты максимум лабу в универе пишешь и дальше общаться я смысла не вижу. Вообще все мои сообщения адресованы сеньерам, которые по какой-то причине еще не читали/думали над внедрением раста. ты явно не входишь в их число, так что можешь идти нахуй
Блять, ебанат, ты понимаешь что в си проектах люди юзают свои либы? А уж особенно эмбедщики, пишущие, можно сказать на совершенно другом языке. Твой Раст это пердеж для хипстеров-уебанов без образования. И не надо сейчас пукать что нинужно, лучше просто съеби.
Люби Раст, ебись в жопу111
>>69313
>>69317
>>69309
>натужно шутим, потому что посуществу аргументы не придумываются
>>69312
Про эмбедед я ни слова не писал, раст еще сырой для этого.
Про либы - я не понял, к чему ты это высрал. Либы можно не выкидывать, вызывать из раста сишные либы, а из С - растовские. Интероп же. unwind, stdlib и прочее можно не юзать, никто не заставляет. Просто это удобно и накладных расходов мало.
Чем жопу смазываешь?
В каком нахуй контексте, поехавший растодебил
Варианты:
- Долго и нудно дебажить код, выставляя memory breakpoints
- Запустить PVS-Studio или аналог
- Юзать санитайзеры (intel inspector, appverifier, встроенные в clang(если можешь скомпилить под него))
Действительно, затупил ночью. Чаю, все работает.
Ну так определи после чего именно хуйня начинается. Ты скорее всего где-то за буфер лезешь.
Так может ты нам принтф покажешь, а не кишки crt? Хотя у меня такое чувство, что ты как-то CRT ломаешь, а printf просто не повезло обращаться к сломанному.
>>69443
> Как индекс может быть -1?
А почему нет? Тебе важно лишь не вылезать за пределы объекта при обращении к памяти.
char array[3] = { 'a', 'b', 'c' };
char ∗parray = &array[1];
printf("[0] = %c, [-1] = %c\n", parray[0], parray[-1]);
Вы тоже это видите? 0_0
В обсуждаемом выше скриншоте анона это сделано, чтобы EOF (-1) можно было передавать в ctype-функции и получать при этом валидные результаты. Да, можно было прибавлять 1 везде при обращении к массиву, но пришлось бы писать комментарий об этом в коде, который обращается и при объявлении этого массива тоже пояснять, почему там элемент для '\0' по индексу 1. (Просто предположение; не знаю, чем там у Microsoft думают.)
Согласен, на вид неоч.
Неактуально для небольшого количества значений. Ещё больше кода будет.
У gcc/mingw есть рейндж расширения стандарта для кейсов, можно писать типа
switch (val)
{
case 0 ... 2:
case 10:
//
break;
default:
//
break;
}
битовые маски
[code]if(value>0 && value<3)[/code] уже не катит?
For++?
> сишка примитивна
Ну так и заебись же, легче того же питона в освоении.
Поделитесь хорошей либой-хедером с ассертами
У openssl, наскока я помню, свой эррор хендлинг, и в потоки она не может, т.к. технология под std99 сделана, поэтому тут с 17 версией, где потоки уже дефолт могут понадобится костыли в большом количестве. С 11 все точно ок должно быть
for (i=0; i<9; i++);
{
printf("%c \n" , buffer);
}
#include <stdio.h>
#include <time.h>
int main(void)
{
int i=0;
time_t timer;
char buffer[26];
struct tm* tm_info;
time(&timer);
tm_info = localtime(&timer);
strftime(buffer, 26, "%Y-%m-%d", tm_info);
Ну а дальше идёт как раз цикл for. Переделал его под while и все нормально работает. В чем дело?
#include <stdio.h>
#include <time.h>
int main(void)
{
int i=0;
time_t timer;
char buffer[26];
struct tm* tm_info;
time(&timer);
tm_info = localtime(&timer);
strftime(buffer, 26, "%Y-%m-%d", tm_info);
for (i=0; i<9; i++)
printf("%c \n" , buffer);
return 0;
}
printf("%c \n" , buffer);
Переменная buffer содержит адресс массива, в принтфе ты 9 раз выводишь первый байт адреса в виде символа. Иди читай документацию по принтфу.
Это куда? У меня же и так printf ("%c \n", buffer[и]); и по условию он должен и так меняться.
И где тут решение? Должна была вывестись текущая дата.
Это не то что мне нужно. Мне нужно выводить по 1 элементу массива, а не весь целиком. Вот так надо.
Да и ты не решил проблему, а просто обошел ее мимо. Почему цикл for не работает как надо?
>Вебмакакам похуй на код, у них хозяин богатый, если будет тупить/тормозить просто добавит еще серверов.
Вебмакакам как раз не похуй - их код запускается у конечных юзеров в том числе и на некромобилочках с засраным ведроидом пятилетней давности, и если у их заказчика клиенты не закажут доставку сраной пыццы, потому что зависло на смартфоне - то их ждет долгая анальная неделя.
Блять идиот, потому что тебе нужно вывести элемент n по адресу &buffer[n1] (n++) или str (str++), а ты пытаешься вывести в каждой итерации весь массив со спецификатором const char
Короче иди нахуй
И да если ты хочешь чему-то научиться, в первую очередь выбрось принтф из своего кода
Это какой-то токсичный хуесос тут семенит.
заебал, ты из какого языка такой прикатился сюда, что ты не можешь массив вывести сука?
https://wandbox.org/permlink/5tseLtkRjIJalAGE
на нахуй и съеби отсюда
с чего ты хуеешь, семен? Тебе сказали какая и где у тебя ошибка, уже даже притащили решение
я даже написал в стиле твоего дохлого питона чтобы ты глазьки свои бедьненькие не сломал уебан не способный поставить нужный спецификатор в принтф
Теперь глотай, пидарок.
Причем тут это? Автор дебич берет тему указателей, которая и так сложная для нубов, а потом говорит вот есть многомерные массивы давайте еще тут про указатели чтобы было окончательно непонятно если вдруг было понятно, и тут же еще начинает затирать за уровни косвенности. Вот зачем так делать?
Что нахуй может быть непонятного в указателях? Указатель = переменная с адресом. Все. Что вы там сложного находите блять?
Извините, а в чем заключается сакральный смысл использования write() вместо printf() ?
Не вместо, а когда в машинном (не человекочитаемом символьном) виде надо данные в голову файла загнать, например.
Вот, например, мой велосипед, который сугубо Хаффменовским кодом сжимает буржуйские тексты в среднем почти в 2 раза. Что бы я делал без fwrite()?
https://github.com/PolazhinetsA/univer/blob/master/kod.c
тащемта все легко
вот у тебя есть переменная допустим
char anus со значением "jopa"
и есть переменная-указатель
char (star)dirka, ты можешь присвоить ей значение, находящееся по адресу переменной anus (star)dirka = &anus
Теперь твоя переменная (star)dirka содержит указатель на ячейку памяти, в которой хранится переменная anus.
Теперь, чтобы не ебаться с первой переменной, ты можешь передаватб нескольким функциям указатель на анус, и они смогут найти по нему твой anus и расширить твою жопу с jopa до joopa.
Таким же образом, если, допустим, anus - это важная переменная записывающая в себя кучу флагов по всей программе, ты можешь задавать поинтеру точный адрес внутри ануса, зная, что в этом месте массива запишется какая-то инфа, которую тебе потом надо будет вызвать (star)dirka = &anus[n a]
Ты так же можешь создавать массивы указателей. А можешь и создать n-мерный массив указателей, в котором будут лежать указатели на n n указателей на ((n n) * n)-мерные массивы указателей указывающие на w-мерные указатели.
есть еще указатели в структурах. Если объект структуры является указателем, то обращение к нему происходит через стрелку list->next,
если обхект структуры указателем не является, то обращаешься к нему по его местонахождению (т.е. разыменовываешь) через точку tvoya_jopa.shirina
еще можно создавать указатели на фукнции, и даже массивы указателей на функции, и можно даже их вызывать вместо функций, но я давно не пишу на си поэтому уже слабо представляю какой в этом смысл.
короче поинтеры оч важная хуйня в ассемблере. выделил в каком-то месте память, запомнил его поинтером, а потом не заебываясь снес поинтер и пошел дальше своими делами заниматься.
Хорош деанон, когда я сам ни капли не скрываюсь в тех местах, где подписан PolazhinetsA. Держи задачку посложнее. Тащи сюда фотки моего хуя с Reddit.
Твоя мать полметровую линейку не тем концом приложила, вот и выслушиваешь потом "прикинь, сынок, спала с одним аноном, у него 12см, а ощущения на все 38"
printf это не функция а макро алиас главной __printf__ функции. Вызывая прототип принтф, а потом и сам его сишник, компилятор только форматирует текст и понимает, что вызвана stdoutput часть большой __printf__ функции, затем, получив отформатированный однострочный массив, выводит его посимвольно. С write та же история, только памяти она потребляет в несколько раз меньше и сразу выводит посимвольно. Ах да, printf еще запускает функции рекурсивно, а аутпут от write будет только из зоны видимости.
Ну и главный сдешний миф, что мол принтф хорошая вещь для дебага - полнейший бред. Большая часть ошибок на любом этапе работы с большинством C проектов из-за хуевого железа и хуевой памяти, с чем принтф абсолютно не поможет, а только усугубит проблемы
я с праты тоже сразу ничего не понял, и забил, потом покукарекал в гейос, но там все еще хуже (субЪективно)
> Что вы там сложного находите блять?
То шо звездочка тама используется и при объявлении указателя и для получении значения по адресу, помимо ее математической функции. Запутаться можно.
А как же хуевый код...
>вот у тебя есть переменная допустим
>char anus со значением "jopa"
>и есть переменная-указатель
>char (star)dirka
Спасибо, после объяснения уровня б стало чуть более понятно.
>>1370497 (OP)
>>1370497 (OP)
>>1370497 (OP)
>>1370497 (OP)
>>1370497 (OP)
Ну я нормально не смотрел, но: сжатый-разжатый исходный код самой программы превращается в мусор. Размер минимального кода более чем один бит, хотя пробел должно было бы в один бит свернуть. Размер кода (вроде бы) не лимитируется - попробуй пожать и разжать текст, в котором частоты символов соответствуют последовательности фибоначчи (abccdddeeeeeffffffff ну ты понел).
Ну и нахуй он нужен? На сях сейчас пишут только системщину и возможности языка отлично позволяют это делать без каких либо проблем. Еще раз повторяю, нахуй нужен раст то?
Это копия, сохраненная 10 апреля 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.