Вы видите копию треда, сохраненную 15 марта 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 помогает читать сложные сишные декларации.
Прошлые треды:
- №36: https://arhivach.ng/thread/407257/
- №37: https://arhivach.ng/thread/414099/
- №38: https://arhivach.ng/thread/419611/
Правда, что E1->E2 и (*(E1)).E2 не эквивалентны?
Нет, не правда. Стрелочка лишь сахарок для второго выражения. Это если ты не ошибся тредом. У соседей по обыкновению все непросто.
Похоже, ошибся тредом ты. Это у соседей явно прописано, что E1->E2 это эквивалент (*(E1)).E2, так что всё просто.
А вот в C со вторым может быть UB, когда с первым его может не быть. Забавно.
> А вот в C со вторым может быть UB, когда с первым его может не быть.
Пруф из стандарта или хотя бы пример будет?
https://pastebin.com/ARxKm18y ну вот, например 8-я и 9-я строка
Хоть такой каст указателей и доступ к члену несуществующей структуры и сомнителен, вроде считается что так можно.
Однако, в 9-й строке, `°ps` это lvalue а про него сказано
http://port70.net/~nsz/c/c11/n1570.html#6.3.2.1
> An lvalue is an expression (with an object type other than void) that potentially designates an object; if an lvalue does not designate an object when it is evaluated, the behavior is undefined.
объекта типа struct S нет, значит `°ps` — это UB?
> доступ к члену несуществующей структуры и сомнителен
По-хорошему так нельзя, потому что типы разные.
> объекта типа struct S нет
Так чего ж ты кастил указатель, если объекта нет? Ты определись, либо кастить можно, и объект есть, либо у тебя все сломалось еще при касте.
То есть, нельзя кастить, если объекта нет?
Тогда, например, integer aliasing (разрешение читать int через lvalue типа unsigned int и т.д.) теряет всякий смысл, т.к. по-твоему нельзя кастить указатель на int к указателю на unsigned int.
> integer aliasing
Это разрешено явно до сих пор не понимаю, нахуя, как и чтение байтиков инта через указатель на char. В остальных случаях тебе нужны совместимые типы. Структура с интом несовместима. На самом деле в моем мире бегают розовые пони, помахивая -fno-strict-aliasing, поэтому у меня нет никакого UB при чтении интов через структуру. Чего и тебе желаю.
> Это разрешено явно до сих пор не понимаю, нахуя, как и чтение байтиков инта через указатель на char. В остальных случаях тебе нужны совместимые типы.
Лазать через структуру явно разрешено в том же списке http://port70.net/~nsz/c/c11/n1570.html#6.5p7
> An object shall have its stored value accessed only by an lvalue expression that has one of the following types:
> …
> — a type that is the signed or unsigned type corresponding to the effective type of the object,
> …
> — an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or
> — a character type.
> an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or
Там просто формулировка говно, смотри сноску, это про алиасинг. Имеется в виду, что int будет алиаситься не только с char или каким-нибудь unsigned интом, но и со структурой, у которой один из членов int или совместим с ней.
Классика. Это UB:
void test(float ∗a, int ∗b) {
∗a = 1.0;
printf("%g\n", ∗a);
∗b = 0;
printf("%g\n", ∗a); // Компилятор может не перечитывать a.
}
float foo;
test(&foo, (int ∗) &foo)
Это нет:
struct s { float x; };
void test(float ∗a, struct s ∗b) {
∗a = 1.0;
printf("%g\n", ∗a);
b->x = 0.0;
printf("%g\n", ∗a); // А вот тут компилятору придется перечитывать a.
}
float foo;
struct s bar;
test(&foo, &bar);
Ну так и почему кастить к указателю на unsigned int можно исходя из тех правил, хотя объекта типа unsigned int нет, а кастить к указателю на структуру нельзя?
> почему кастить к указателю на unsigned int можно исходя из тех правил
Я уже говорил, что не знаю, почему сделано исключение для signed/unsigned. Вот с char все понятно, это в свое время завезли для memcpy и прочих fwrite. Какие проблемы может решать чтение signed инта через unsigned, я не понимаю. По мне, оно только ломает alias analysis еще больше.
>Какие проблемы может решать чтение signed инта через unsigned, я не понимаю.
ПРоблему совместимости со старым кодом
> совместимости со старым кодом
Неужели так много говнокода, в котором путаница со знаком у указателей? По мне, так кода, который ломает strict aliasing - гораздо большая куча, которая к тому же продолжает расти. Вон даже целый линукс есть. Но что-то никто не торопится убирать strict aliasing. Зато убрали gets(), убрали олдскульный стиль аргументов у функций, где же тут совместимость?
Твой код не демонстрирует доступ через aggregate or union type, т.к. b->x имеет тип float.
Доступ через aggregate or union type это присваивание структур.
Выражения типа a компилятор заменяет на ☆(a+b), так как выражение симметрично, то с точки зрения компилятора следующие выражения идентичны:
array и i[array], так как будет заменены одинаково: ☆(array+i);
=====
зачем вообще понадобиться может писать i[array]?
Потроллить можно.
Незачем, это следствие ассоциативности арифметики указателей, такой небаг языка
Неисправляемый ворнинг лучше подавить, чтобы при компиляции новые ворнинги не потерялись в куче старых
Ну окей, ∗b = (struct s) { 0.0 }; доволен?
>>40043
> Просто мне кажется, все исправить не выйдет
А ты постарайся. Можно писать даже для шланга с его -Weverything.
>>40258
> Неисправляемый ворнинг лучше подавить
Если уж совсем никак нельзя по-другому, то да, стоит отключить, но лучше локально (#pragma GCC diagnostic push, #pragma GCC diagnostic ignored "-Wshootingyourselfinthefoot", #pragma GCC diagnostic pop или аналоги). Иначе можно проебать реальную проблему в том же файле.
Спасибо) но это для Линукса. Я как понял там у Винды всё по другому. Есть функция _msize, но мне интересно как она устроена.
Выделяй степень двойки, храни размер сам, не лезь не в свое дело. Ты ведь понимаешь, что оно зависит от реализации - сегодня так, а завтра сломалось?
> у Винды всё по другому
У какой винды? Какой компилятор? Какая версия рантайма? Например, если линковаться с MSVCRT, то перед блоком будет указатель на структуру с информацией.
>у тебя бесконечная память с нулевой латенси и бесконечный проц
Ну бля, товарищь Тюринг, я больше не хочу с вами ебаться в жопу.
Давай примеры и обоснования, епте.
Это ты так ненавязчиво намекнул что знаешь лучше Кармака и Ромеро как управлять памятью?
Не помню уже, насколько я знаю прямо на сайте у автора можно скачать pdf.
Если нет, то может быть здесь:
http://mirknig.su/knigi/programming/188694-game-engine-black-book-wolfenstein-3d.html
>а элегантное
ну так это другое, инженеры пишущие и оптимизирующие код и смузихлебы с фреймворками
>this book has only bit of text and plenty of drawings attempting to describe in great detail the Wolfenstein 3D game engine and its hardware, the IBM PC with an Intel 386 CPU and a VGA graphic card.
Автор маладца, сам Ромеро рецензировал. Я кинул ему 20 баксов, просто за слезы ностальгии.
>инженеры пишущие и оптимизирующие код
Инженерам на тот момент было около 23х лет, мне почти в два раза больше, чемпион по проебыванию жизни впустую.
Но это 1 эдишн, 2й только за деньги.
3["sosu"]
жаль, что описанные в книге подходы устарели и в современном байтоебстве и оптимизоне кододрочерство, алгоритмы и безумные асмовые вставки уступили место датадрочерству и превращению структур данных в write-only пиздец (кококо микроархитектурка порешала). И вот нихуя не понимаю, зачем они при этом на крестах пишут процедурный код.
Степень происходящего пиздеца в современном ёбастрое можно оценить в гитхабе:
https://github.com/CRYTEK/CRYENGINE/tree/release/Code
Сравнить с:
https://github.com/id-Software/Quake-III-Arena
А я думал это какие-то древние тайны сишки. Эх, нет романтики.
Нихуя себе, это на чем вообще основано то.
>датадрочерству
Что ты под этим подразумеваешь?
>write-only пиздец
А в чем смысл write-only структур??
Мы нахи из народа ноя?
Это откуда? Про вольфенштейн? Сейчас маллоки достаточно крутые, чтобы не пилить ничего своего (кроме, разве что, пулов объектов), но в 90х были все описанные проблемы.
Просто драйвера, ну что не понятно-то, хочу драйвера
На деле хотелось бы изучить программирование драйверов под Windows 9x 7, 8.1, 10 (насколько я знаю WDK windows 10 един для них). Меня интересует программирование драйвера фильтров.
Я осмелюсь предположить, что некоторая часть присутствующих довольно глубоко знакома с Lisp'ом.
Я прав?
Отзовитесь.
конкретней
Скоро заканчиваю читать прату. По совпадению появится еще немного свободного времени. Хочу в сторону лиспа двигаться. Очень нравится парадигма.
Пробовал Haskell, но несмотря на то, что не так уж и сложно, в целом, не зашло.
>Это откуда? Про вольфенштейн? Сейчас маллоки достаточно крутые, чтобы не пилить ничего своего (кроме, разве что, пулов объектов), но в 90х были все описанные проблемы.
В наше время кастомные аллокаторы поверх выделенного штатным тоже используются но по другой причине (сосноли соснули) и всего двух простейших типов - stack allocator когда коридорное кинцо, очень легко выделять и прибивать сразу весь уровень/этапы и pool allocator используют когда кинцо с опенворлдом и ГТА-подобное и в процессе движения камеры/персонажа мир постоянно загружается/выгружается. В таком случае домики и пешеходы квадратно гнездовым методом впихиваются в чанки стандартных размеров.
для мелкой же бойлерплейтухи применяется обычный маллок или аналогично работающая велосипедная версия.
apr апача со своими аллокаторами динамической памяти, энжинх тоже..
это к примеру, не для срача
Я разве сказал, что наличие качественного системного аллокатора кого-то останавливает от написания велосипедов?
Где можно про это почитать что-нибудь? Вообще не разбираюсь в pool stack allocator'ах.
Попробуй в сторону clojure, хотя бы что-то практичное будет. Из функциональщины в проде используется только erlang/elixir (по сути одно и тоже, синтаксис просто разный, если не углубляться), scala (сидит на двух стулах) и clojure какой-нибудь. Поэтому можешь попробовать что-то из этого, но сразу скажу, что будет очень непривычно, по крайней мере, со мной это было так. Я от эрланга первую неделю ахуевал нехуйски.
SICP тред есть
конечно, читал, никогда не советую книги которые сам до этого не прочитал
плюс еще в том, что даже последние издания есть на русском - темы, которые там затрагиваются, и так сложные, если их еще и на английском читать, то мозг вспухнет
да зачем тебе читать то, глянь как в библиотеках это сделано
в той же apr, которую выше упоминал
>Есть же сикп-тред и кложетред.
ЛОЛ, их тоже уже нет. Судя по всему, либо вопросов нет, либо у специалистов такая дикая востребованность, что нет времени здесь сидеть.
Какой? У меня был знакомый, который этим зарабатывал, но он, когда ходил как-то странно подпрыгивал, махал руками, из еды ел только печеночные паштеты и яблоки. Он сторчался.
>ЛОЛ, их тоже уже нет
По-моему ты просто не умеешь пользоваться двачем.
>что нет времени здесь сидеть
Здесь сидят в основном школьники\студенты, мужики скорее иногда потроллить заходят.
>>42405
Ты перепутал, это был коммон-лишпер (еще в пидорском пиджачке, розовой футболке и с противным носом, да?). Хаскеллисты за здоровый образ жизни! Только штанга, только хардкор.
>(еще в пидорском пиджачке, розовой футболке и с противным носом, да?)
Лол, почти угадал, носил постоянно старый рваный оранжевый пиджак, но на лиспе особо не кодил, только на КЛОЖУР.
Так кложур - это же и есть лисп. То есть он был кложуристом, но зарабатывал кодом на хаскеле? Чет ты запизделся походу, дружище.
Я выучу С и Лисп, найду тебя по ойпи и выебу твою семью.
> основном школьники\студенты, мужики скорее иногда потроллить заходят
А где серьезные перцы сидят?
Он оба языка использовал в работе, как-будто ты сам подобное не делаешь. Каждый программист с несколькими языками работает, за редким исключением в виде каких-нибудь дедов.
>или блек
Что за блек?
>драйвера
Их типов и подтипов дохуя, нужно во всем разбираться?
>>42502
>Форт - для лохов, правильные пацаны выбирают Фактор!
Да одно и тоже по сути. У меня для форта вроде процессор завалялся, может стоит вспомнить старину.
>>42499
Язык интересный, поможет мышление развить. Бывает быстрее сишки!111 Вообщем, попробуй, но дальше чем просто увлечение - это вряд ли уедет.
Что запишет эта строчка в х3?
Знаю ,что маллок возвращает адрес на массив, но там еще одна звезда появляется и что выходит? х3 хранит адрес адреса этого массива?
Напиши это кодом где-нибудь и прикрепи картинкой, непонятно, немного, что в объявлении переменной делает амперсанд, или это миссклик?
Это из си++, там есть такое дело.
Ну представь что амперсанда нет, (получится си чистый) и по рассуждаем. Что будет в переменной х3
...Gcc
Да, это так работает? Блин, а я хотел иметь короткие имена для читаемости, придётся дефайнами.
Записывает в виде инта, мусорное содержимое первого(единственного) аллоцированого элемента?
Сделаю лишь предположение, что присваивать ссылке не переменную, а конкретное значение это UB.
Что будет в переменной зависит от компилятора. В случае gcc там скорее всего будет 0. У msvc не знаю.
Забыл добавить.
Если так уж хочется необычного, посмотри на F#. Не исключено что скоро понадобится.
f# и не собирался взлетать, подыхать и быть кому то нужным
это просто еще одно добавление к ml-семейству на хорошей платформе
и все
очень полезный язык для расширения горизонтов
и интересный
планирую к старости начать пописывать что-нибудь на ml-семействе, живя в деревне и сдавая квартрки
Собирался, но не сложилось.
>это просто еще одно добавление к ml-семейству на хорошей платформе
А, так ты про ризон?
>очень полезный язык для расширения горизонтов
Или про скалу?..
бамп
В смысле? Это про функциональщину или лисп?
разве там есть?
>Где можно про это почитать что-нибудь? Вообще не разбираюсь в pool stack allocator'ах.
Вот статья, правда про кресты.
https://www.gamedev.net/articles/programming/general-and-gameplay-programming/c-custom-memory-allocation-r3010/
Если про зачем это нужно то тут 3 причины:
1) У консолей ограниченная память и без свопа. Чтобы делать ёбу им приходится экономить, а так как еба как правило кросплатформенная, то на пеку переносятся все те же подходы.
2) Как упоминается в статье - частичное избегание стрельбы по ногам с учетом предметной области путем ограничения функциональности аллокаторов.
3) Скорость работы. В тесной связке с файловым движком приобретает большой смысл в опенворлд играх, когда содержимое огромной карты (превышающее размер доступной оперативы в несколько десятков раз) необходимо постоянно кусками прогонять через ОЗУ, в идеале избегая видимых недогрузов и подгрузок.
>У консолей ограниченная память и без свопа
А чем это обусловлено? Что за у них особенности в архитектуре, что затрудняет реализацию свопа?
у меня старенький core2duo, 4 гига оперативы, хост - 10я винда
на vmware workstation - debian, i3, консоль и vim, кодить можно без проблем, браузер и pdf-viever так же запускаю в винтуалке чтобы на хост не переключатся
могу порекомендовать сделать примерно так же как у меня
удачи
Спасибо за совет, задумывался как раз над тайлами.
А в vim каково кодить? Можно настроить кошерный автокомплит, подсветку ошибок и прочие радости зажравшихся? Насколько долго учиться кодить в этом, чтобы не сидеть неделю за манами?
есть альтернативный подход к кодингу в виме и в юниксах - в редакторе ты пишешь код
а все остальное делаешь в командной строке и соответствующими утилитами
Не могу найти, где для MinGW, собственно, скачать GTK2. Под MSYS2 не вариант, винапи подергать таки надо. Или всякие юниксовые аналоги "получить список файлов в директории" заведутся?
VirtualBox (можно взять старую версию, которая без hardening, она гораздо быстрее стартует), разрабатывать в винде, директорию с исходниками расшарить в виртуалку, компилировать и запускать в линуксе. Виртуалку можно запускать в headless режиме, чтобы не мешалась, подключаться к ней по SSH.
Странно, просто по первой ссылке качаешь GTK и подрубаешь либы вместе с хэдерами, можешь это в студии сделать (только поставь компилировать как сишный код). А вообще по идее msys тоже думаю, что подойдет, но проще будет первый вариант. Также если тебе не критично плюсоватость, то есть Qt, там быстро-легко интерфейс накидай и уже функционалом займись.
Также чтобы это можно было установить как пакет. Не совсем понимаю как это должно устанавливаться, походу через make && make install.
То есть тебе интересно как оформить приложение в .deb(-ВСТАВЬ НАЗВАНИЕ СВОЕГО ЛУЧШЕГО ДИСТРА) архив? В интернете есть масса информации по этому поводу, думаю, нам тут нет смысла это рассказывать. Не из жадности так говорю, а из здравой рациональности.
Товарищи, помогите, пожалуйста, с регулярными выражениями (а именно - с библиотекой regex.h)
Надо из строки вычленить даты форма HH:MM и вывести. Регулярное выражение я составил и протестил, а вот с реализацией через regex.h - проблемы... Не подскажете, что я делаю не так?
https://ideone.com/Op2sZI
Суть я понял. Типа искать первое встречное совпадение, после чего смещать указатель на конец этого совпадения, и по новой.
Но зачем тогда нужен параметр nmatch в regexec?
int regexec(const regex_t preg, const char string, size_t nmatch, regmatch_t pmatch[], int eflags);
Бывают случаи, когда nmatch > 1?
Оно нужно, когда ты хочешь помимо (или вместо) куска текста, соответствующего всему регулярному выражению, доставать части в скобках.
Первый regmatch соответствует всему выражению, каждый следующий — подвыражениям в соответствующих скобках, в порядке появления открывающих скобок.
У тебя там 4 пары скобок + регулярное выражение целиком, итого 5 значений.
19:36 соответствует выражению целиком.
Первое 19 соответствует всему подвыражению (([0-1][0-9])|(2[0-3])) так как подходит под первую часть условия "или" внутри него.
Второе 19 соответствует просто ([0-1][0-9]).
Далее выводится пустое место, потому что в общем тексте совпадения "19:36" подвыражению (2[0-3]) ничего не соответствует.
И наконец идет 36, соответствующее последней паре скобок ([0-5][0-9]).
Таким образом нужное количество regmatch'ей в массиве зависит от того, сколько пар скобок тебе нужно анализировать. Если тебе нужно только все совпадение целиком, то можно обойтись без массива.
char ☆ baz = malloc(10);
то нолик(\0) автоматически ставится вконце массива baz?
если нет, то как мне вставлять нолик вконец?
malloc просто выделяет динамическую память и всё. А ноль должен стоять не в конце памяти, а в конце строки(то-есть после нуля может быть ещё доступная память)
Во-первых есть стандартные функции работы со строками, во-вторых пиши остальное сам. Что тебе конкретно то нужно, вопросы совсем новичковские, почитал бы сперва по сайтикам.
А, вот, пришла идейка накостылить hashmap (или как оно там называется?) для нужных мне типов данных и сгруппировать поля в них. Насколько плохая идея?
Почитал еще - просто ассоциативный массив. Наверное, будет нормально.
Не писать под DOS.
Linux or Windows, this is not important in this question. You must:
1) Read about DJVU format documentation
2) Read about PDF format documentation
3) ???
4) Profit
Sosi huj kstati
Sam sosi hui bichara.
You can write in Russian, idiot.
Ну вот на винде ты использовал Windows API. Ты #ifdef-аешь функции, где ты их использовал и пишешь аналогичные реализации с POSIX-функциями и линуксовыми либами. Рано или поздно в твоем коде сама по себе выделится прослойка, которая общается с ОС, тогда ты выделишь ее в отдельный файл или даже либу, а #ifdef-ы снесешь.
Если же ты Windows API не пользовался, а обошелся стандартной библиотекой или уже кроссплатформенными либами, ты просто делаешь cc file.c -lsdelatzaebis -lanotherlibrary, все собирается и даже работает, если в твоем коде нет ошибок.
По-прежнему Изучаю регулярные выражения.
Пытаюсь вычленить из текста url-ссылки. Но чё-то ссылки вообще не ищутся((9(
https://pastebin.com/F2mBusEV
Может кто подсказать, в чём проблема?
Регулярное выражение тестил здесь: https://regex101.com/ - всё работает вроде как
Душевно. Спасибо
Во-первых, чтобы вставить в сишную строку символ \ надо писать его два раза подряд: \\.
Во-вторых, posix'ные регулярные выражения не поддерживают некоторые штуки типа \d, \w и тому подобного, и вместо этого нужно писать [[:digit:]], [[:alnum:]] и всякое такое.
В итоге должно получиться что-то вроде этого:
"([[:alpha:]]+://)?(www\\.)?([[:alnum:]]+\\.)+[[:alnum:]]+(:[[:digit:]]+)?(/|(/[[:alnum:]]+)+\\.[[:alnum:]]+)?"
Правильно буит "Danke schön". А если ö на клаве нет, то пишут "Danke schoen".
Ибо schon и schön - совсем разные слова. Глаза режет.
Дайте интересных занятий для проверки своих скиллов. Хочу утереть двачеров, которые говорят, что тянки не могут в программирование.
Занятий или заданий? Задания в гуглокартинках по запросу warosu programming challenges, занятия CS50 в гугле и книги из шапки.
> тянки не могут в программирование
> занятий для проверки скиллов
Да они даже в русский язык не могут.
Перепишешь на хвостовую рекурсию - расскажу.
Добавь после ифа ещё один иф, который печатает "только натуральныеы", если 'n' окажется меньше 1. Либо смени, чтобы if(n>1)... else printf "только натуральныеы" А вообще это обычная рекурсия. Функция вызывает саму себя, понижая каждый раз 'a', прибавля 'n' к промежуточной переменной, которую вернёт когда все рекурсивные вызовы функций завершатся и самая первая функция вызвавшая рекурсию вернёт результат промежуточных вычислений.
а какой смысл в строчке 'return a' ? Ведь она возвращяет всегда то что дали ей вначале a!
Это условие окончания рекурсии, типо a умножить на 1 = а.
Распиши как эта функция будет работать хотя бы при н = 3, и поймёшь что к чему.
>Распиши как эта функция будет работать хотя бы при н = 3
Я пробую, нихуя не понятно всё равно
Если хочешь хорошо разобраться с рекурсией, поработай с бинарными деревьями, хотя я думаю тебе рановато ещё.
В конкретно это случае, давай я распишу.
3 умножить на а = 2 умножить на а + а = 1 умножить на а + а + а ==
Теперь мы попадаем в наше условия окончания рекурсии, что а на 1 это а, и подставляем.
== а + а + а.
Надеюсь поймёшь.
а бляьб... смысл в том чтобы каждый раз а у нас было. спасибо аноны, буду ебать бинарные дервья наверно.
>3 умножить на а = 2 умножить на а + а = 1 умножить на а + а + а ==
блеть ты гений, где работаешь, расскажи о себе. вышка есть?
Я работаю системным девом по факту, пишу драйвер под линукс.
Вышки ещё нет, третий курс пока что.
>>45566
Ну немного балуюсь питоном, ещё на работе всякие баш-скрипты пишу и CI на ямле пилил.
В принципе плюсы я тоже более менее знаю, но на работе применять их негде, т.к. в ядро не примут драйвер написанный на плюсах, хех.
20 дал если что.
Я двачер, который не прошел бассейн, зачем так грубо про нас..?
Могу только дать совет учить и понимать смысл, а не гнаться за очками. Потому что экзамены важнее. Не копипасти чужой код, даже если в жопе рейтинга. Да и еще, они смотрят на прогрессию, если ты получил 3 лвл, а экзамены пишешь на 0, то это тревожный звоночек. Лучше иметь 1 лвл, но сдать все экзы на 30-60 балов
И ты уже проявляешь не самостоятельность, когда пишешь тут такие просьбы. А могла бы тыщу сайтов загуглить сама (в шк этот навык гугления понадобится) И желательно на инглише гуглить тоже.
И вообще я это все рассказываю, не потому что ты тян или мне понравилась ты мне уже не понравилась своим "утереть нос"
А потому что я уже не поступлю в эту школу, в договоре написано что шанс 1 раз на жизнь. Так что спускаю их важные данные.
>А чем это обусловлено? Что за у них особенности в архитектуре, что затрудняет реализацию свопа?
Его отсутствием в операционной системе соснулей.
Можешь спиздить на русракере SDK PS4, там про все подробно. Если в кратце - на соснулях уже давно обыкновенные ОС с точно такой же хуевой тучей библиотек, времена ебания регистров на ассемблере закончились лет так 15-20 назад.
>"Danke schoen"
Спасибо, всегда не знал, что делать в случаях, когда лень ставить фашистораскладку.
Какой левел языка?
> Можно ли обучаться дистанционно?
> Нет, вы должны лично присутствовать в Школе 21 в Москве, поскольку основная часть процесса обучения проходит в прямом взаимодействии с другими студентами. К тому же все учебные материалы хранятся в электронном виде во внутренней сети Школы 21, и чтобы получить их, вы должны прийти в школу.
Ясно, хуета.
Что значит без фор?
Если тебе нужно будет заполнить массив определенным способом ты будешь каждому элементу отдельно присваивать, не юзая for?
Хуйня какая-то.
базарю очередные юзлес курсы, которые ничем не отличаются от так же бесплатных курсов из инета
Это и означает без сложной логики. Судя по базе заданий, там дают фундамент для последующего изучения алгоритмики. Оно и понятно, новичкам ни в одном языке сложную логику не дадут, иначе они нихуя не выучат.
Ебучий долбоеб научившийся по хело ворлдам с /пр высирать в джейпейн параше свои дженерик проги считающие гыыы скока я ебал телок веди имя узнай знаю ли я пацана с таким иминем))) плиз завали ебало и не пиши ничего. Если ты не понимаешь почему новичкам в си даже на самых тупых курсах в стерлитамаке не дадут а первые месяцы ничего кроме вайла ну или свича с одним кейсом — просто иди нахуй тупой выродок
Ты че тупой? Как думаешь почему в школе треугольники изучают раньше чем призмы и функции? Или ты в шестом классе так же пиздел училкам мол где мои интегралы Мань Аркадьевна зачем мне эту хуйню учить можно же из библиотеки 1996васянлиб функцию вызвать!!!)))
Ладно скажу тебе чтобы ты понял получше, очевидно они там готовят не макак-дизайнеров, а реальных программеров, по вашему терминалоебов.
Блядь, чем фор сложнее вайла, ты какую-то хуйню несёшь.
А я могу считаться терминалоёбом ака реальным программером, если я пишу драйвер в ядро?
Нам не запрещали в универе на первом курсе юзать принтфы или фор/ду вайл.
>Блядь, чем фор сложнее вайла, ты какую-то хуйню несёшь
>>45684
>Что значит без фор?
>>45684
>Если тебе нужно будет заполнить массив определенным способом ты будешь каждому элементу отдельно присваивать, не юзая for
>>45939
>Нам не запрещали в универе на первом курсе юзать принтфы или фор/ду вайл.
Пиздец. Это точно Си тред? Как можно не вспомнить про goto блять. Сразу видно ни строчки кода на ассемблере не писали.
мимо фп господин
Если их научат правильно пользоваться goto, окей просто, но тыкать goto там, где можно обойтись без него полный бред, только ухудшает читаемость.
да это си тред и тут есть встроенные циклы
А что там было на бассейн, что ты не прошел? Там вроде бы всё легко быть.
Хочешь поподробнее разузнать да? Девочка?
Ну спроси ,что конкретно тебя интересует. Может отвечу. А пилить гигантские пасты мне не кайф, и так много тебе дал уже подсказок
Проходил осенью интенсив в юнитфактори, тоже самое, но возможно от школы к школе меняются подходы. Первую неделе ебете линукс до посинения, начинаете разбирать си, собственно следующие 3 недели только сижкой и занимаетесь. В конце первой недели проект вдвоем, после второй — втроем, и на третьей впятером. Последняя неделя — несколько больших пректов, но абсолютное большинство успело сделать только один
Если никогда не работала на маке, советую заранее разучить хоткеи, всякие прыгания по страницам, в конец строки, и самое полезное — control+shift+enject
Не забывай проверять свои работы перед заливкой на вогсфер, не стесняйся спрашивать у шарящих ребят, ни при каких условиях не заебывай админов, даже если кажется , что они не заняты, хорошо высыпайся и не пытайся что-то сделать дома. Не общайся с одними и теми же людьми, всегда ищи новых и учись у них чему-то бтв юзание дебагеров приравнивается к читингу. Ну и само дальнейшее обучение по крайней мере в Киеве того не стоит, но бассейн это супер экспириенс.
О чём ты вообще? Какое ещё сложное изучение через месяц?
>>45590
Этого не слушайте. Система отбора никому неизвестна, главное стремиться поступить и усердно трудиться.
>>45989
Если до школы не программировал, то задания на бассейне не будут казаться лёгкими.
четвёртый месяц в школе 21 задавайте ответы
> юзание дебагеров приравнивается к читингу
Ну охуеть теперь. Мне принтфами отлаживать чтоле?
Мимо
Для лаба1.ц дебаггер не нужен, как и принтфы отладочные в принципе.
Я только так и умею. Получается довольно неплохо по крайней мере все работает, хотя я понимаю, что с приличной конторки меня бы выгнали ссаными тряпками.
Нииблядь
Прохожу Прату, на пике задача.
В принципе, решение из вереницы if-ов приходят сами на ум. Гугление показало что практически все решили именно через простыню if-ов.
Но заебавшись в 10й раз переписывать if-ы да, я тупой, решил по-своему.
Ты наверное будешь смеяться над ньюфагом, а мне вот дичайше прёт что я написал понятный мне код.
Просто хотел поделиться.
И вопрос есть - если например железо поддерживает операцию swap как атомарную, как ее вызывать? Через ассемблерные вставки?
Спасибо.
Новый бассейн начинается 25 февраля.
Что было на старом? Что вы изучали, что ты вылетел с бассейна?
> если например железо поддерживает операцию swap как атомарную, как ее вызывать
Компилятор и сам может сгенерировать. Но зачем тебе атомарно? Ты бы лучше в restrict поиграл, там ему самое место.
>Компилятор и сам может сгенерировать.
А как он знает что надо сгенерировать? Он видит что я взаимоменяю значения?
А то как-то сухо везде, "вот это так делается - делайте так же".
Хочется историю, мотивацию к созданию.
Можно док-ва из дискретки тоже, что всё это работает, только вкратце, вводить в дискретку талмудами не надо.
Высокоуровневый, мультипарадигма и без ооп. Сейфовый, сверхбыстрый и простым синтаксисом.
Сверхбыстрый за счёт увеличения времени компиляции.
Тогда даже Си пососет.
Вопросы?
> сейфовый
> сверхбыстрый
Выбери что-нибудь одно.
> Сверхбыстрый за счёт увеличения времени компиляции.
Фортран?
> Тогда даже Си пососет.
Нет.
>Выбери что-нибудь одно.
Сделав умнее компилятор и возложив больше усилия на компилятор, мы получим сверхбыстрый код
>Фортран?
Нет
>Нет.
Да
Как сделаешь такой код более быстрым и удобным?
#include <stdio.h>
int main() {
int height = 0;
int nbLeaflets = 0;
scanf("%d %d", &height, &nbLeaflets);
int tinuviel = height <= 5 && nbLeaflets >= 8;
int calaelen = height >= 10 && nbLeaflets >= 10;
int falarion = height <= 8 && nbLeaflets <= 5;
int dorthonion = height >= 12 && nbLeaflets <= 7;
if(tinuviel) {
printf("Tinuviel");
}
if(calaelen){
printf("Calaelen");
}
if(falarion){
printf("Falarion");
}
if(dorthonion){
printf("Dorthonion");
}
if(!tinuviel && !calaelen && !falarion && !dorthonion){
printf("Uncertain");
}
return 0;
}
Как сделаешь такой код более быстрым и удобным?
#include <stdio.h>
int main() {
int height = 0;
int nbLeaflets = 0;
scanf("%d %d", &height, &nbLeaflets);
int tinuviel = height <= 5 && nbLeaflets >= 8;
int calaelen = height >= 10 && nbLeaflets >= 10;
int falarion = height <= 8 && nbLeaflets <= 5;
int dorthonion = height >= 12 && nbLeaflets <= 7;
if(tinuviel) {
printf("Tinuviel");
}
if(calaelen){
printf("Calaelen");
}
if(falarion){
printf("Falarion");
}
if(dorthonion){
printf("Dorthonion");
}
if(!tinuviel && !calaelen && !falarion && !dorthonion){
printf("Uncertain");
}
return 0;
}
Пиздец, это вот этому учат в этой школе: пытаться соптимизировать код из 5 ифов?
Ебать как полезно.
Скоро дойдете до оптимизации кода из одного принтфахелоу ворлд
Даже интересно, вас там будут чему-то реально полезному учить или вот такой хуйнёй будете все время заниматься.
Лучше сами что-то немного изучили и начали свой проект пилить, любой, и то больше опыта бы было.
не блядь, серьёзно? вот ето — хваленая школа 21?
Вы хоть оформляйте нормально, а не кидайте как есть
Спасибо, написал туда.
Нормальный ценник, а со школочмошников нужно брать в джва паза больше
С программированием в принципе знаком почти 10 лет. Но серьезно никогда не занимался.
Короче, пока vs code. В студии я работал какое-то время, но там слишком много пока ещё ненужных вещей, которые занимают место.
В студии есть встроенный компилятор, к вс код нужно прикручивать или компилятор от студии или мингв ставить.
Я поставил мингв. Вроде бы работает, но почему-то дебагер не видит gdb. Он же идёт вместе с мингв, разве нет?
Не уверен, лучше погугли.
грит, что у тебя в переменной miDebuggerPath должно быть что-то помимо "gdb". Найди поиском путь до gdb и впиши этот путь в переменную. Как мне кажется.
Но я тут просто мимио ошиваюсь
Он в той же папке что и компиляторы. Ладно, поищу дальше что можно сделать
А у тебя компилятор сам-то хоть работает? Потому что если компилятор не видит, то значит у тебя в environment нет переменной, в которой находится путь до компилятора и дебагера. Я к тому, что там в предыдущем пикриле должно быть, наверное, не просто gdb, а full_absolute_path/gdb.exe
асло, попробуй ещё закомментировать в json-настройке переменную "setup commands" и всё, что с ней связано и тогда запустить дебагер.
В path естественно всё прописано, и бинарник он создаёт.
Если путь до дебагера прописывать другим образом, то он просто не находит его.
Не влияет. То же самое
А ещё в ошибке указано, что переменная назывется "MIDebuggerPath", но в настройках переменная называется "miDebugerPath". Я так-то хз критичен ли тут регистр, но мне кажется, что критичен.
>>46809
А разве в винде нормально, что путь начинается от корня? Я бы заменил слэши на бэкслэши. И либо вписал "C:\Programm FIles\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin\gdb.exe ", либо "${path}/gdb".
Но очевидно, что тут что-то ещё помимо этого. Но на этом мои полномочия всё.
Я и отдельную переменную для miDebugerPath делал, и полный путь писал. Безрезультатно.
Можно было студию ставить, но она ненужна пока.
Молодец.
це не язык. це формат передачи данных json, который вытесняет xml, ну, или не вытесняет, но конкурирует с ним. А если ты про язык, на котором обычно пишут, то это английский, ну и судя по тому, что настраивался мингв под студию, то это язык программирования Си, как и тред, в котором мы находимся.
Это просто скрипт для консоли чтоб компилить/дебажить с одной кнопки
в шёпотину.
Пердолик поставил на винду пердовысер (даже два!) и пердолится. Что удивительного?
Нормальные люди ставят студию и работают, но пердоли работать не могут, вот и ставят пердософт имитируя деятельность пердоленьем с ним.
Вс код тоже проект мелкомягких, как и студия, какие проблемы?
Он удобный и намного легче студии.
я не говорю, что студия хуже вс кода, каждый пользуется тем, чем ему удобно, нет смысла осуждать кого-то за выбор рабочего окружения
>какие проблемы?
Твой дебилизм проблема. И мингв и вскод это линуксовые пердовысеры, какая разница кто их делал. Ни то ни другое на винде не нужно, там есть студия, в 100500 раз лучше, и всё работает без пердоленья. Но пердоля бесполезен, ему страшно когда всё работает, ведь тогда придется что-то делать - программировать, а он не может, вот и качает пердовысеры и ебется с ними, отттягивая неизбежное осознание собственного ничтожества.
>намного легче студии
Студий дохуя версий, качаешь подходящую к твоему железу. Всё равно любая будет бесконечно лучше пердовысеров.
>каждый пользуется тем, чем ему удобно
>У МИНЯ НИРАБОТАИТ, ПОСОНЫ ПАМАГИТИ, Я ТУПОЙ
Такое-то удобство, азаза. Именно потому что тупой, и ставит пердософт. Как выше и обяснил, пердософн прекрасно подходит дебилам, сознавая из ничего занятие на пустом месте, как колесо для хомячков, в котором они радостно крутятся, воображая что умные и делают умные дела.
Бля, ты какой-то дегенерат, который дико топит за конкретное ИДЕ, хотя ИДЕ это просто инструмент, можно в блокноте код писать, правда только для лаборатории подходит, т.к. серьезные проекты писать без нормального редактора довольно проблемно.
чувак, лечись в тебе слишком много злости
Я не ставил студию потому что там много ненужных мне на данных момент вещей. Как научусь грамотно писать проекты - поставлю. А пока функционала vs code мне хватает.
Машина тянет студию, просто у меня и так дохуя тяжеловесных программ типа матлаба и прочих cad/cae. Если есть альтернатива более лёгкой (и удобной естественно) версии программы, то почему нет? К тому же будет полезный опыт настройки чтоб понять что к чему и куда идёт.
И вопрос, почему это работает
for (int i = 0; i < (p2 - 1); i++)
а в случае передачи значения p2 через указатель - не работает
for (int i = 0; i < (*p2 - 1); i++)
Хотя можно сбилдить вижлой кажись, или цыгвин скочать. В чём разница будет? Что с С ABI будет? Смогу винапи юзать? А опенгл?
Ну обычный пузырьковый алгоритм. 23 строчка.
Это работает.
https://pastebin.com/n1jMKfYx
Это не работает.
https://pastebin.com/aYjHDzHb
Можете вкратце но аргументированно объяснить почему программист на c# или backend зарабатывает в среднем ощутимо больше, чем на c?
Спасибо.
Задачи разные плюс сложность изучения
Потому что ооп. А ооп прост для освоения типичному обывателю. Плюс схожесть с другими языками для ооп
Я твою мать нежно трахал даже предварительно не выделив памяти под свой хуй ибо у нее там ведро пиздец далбаеб иди нахуй
>Я твою мать нежно трахал даже предварительно не выделив памяти под свой хуй ибо у нее там ведро пиздец далбаеб иди нахуй
Нет, не можешь, любой может обосраться. Основная хуйня, что Раст помогает писать корректные проги, а Сишка - нет.
Предлагаю тебе съебать и заняться делом. Например, выучить какой-нибудь хоть немного полезный язык, а если остаёшься то подготовь свою жопу к принятию моего трехмерного массива
> Это не работает.
А должно? А -Wall компилятору не пробовал указать, чтобы он тебе пояснил, что по адресу N (=5), который ты передал в p2, нету размера массива?
Да. Код на джаве написан. Ну и что, зато весит меньше и интерфейс приятный
> Всё равно.
А какая разница, откуда ты берешь число, когда передаешь его вместо указателя? Включи ворнинги, читай ворнинги! А сделать ты хочешь вот это:
int length = N;
bubl(inp, &length);
Это франшиза топовой французской школы 42. Обучение бесплатно, требуется только пройти отбор, который тоже бесплатный.
Выпускники сразу претендуют на сеньеора в гугл.
>франшиза
Я бы сказал, говнопародия.
Выпускники такой школы могут только сосать хуй на пару с мамашей.
Скажу сразу, что есть подводные камни, из-за которых на деле все сложнее, чем кажется.
Охуел дома от сычевания в туториалы с мамкой. Я на верном пути?
На бассейне можно набирать уровень? Что за задачи делаете? Хотя бы примерно, чтобы понять к чему готовиться.
Можно. Уровень отслеживает твой прогресс. Изучение похоже на типичный С-бугурт-тред: листы, байтоебля, массивы, компилятор. Изучи волл векстра веррор стандарты, ибо после другого языка на си будет перепрыгнуть тяжелее, у меня как у джава-хуя, например, была лютая любовь открывать тело функции в той же строке где она объявлена, из-за чего до 4 дня я получал нулевые отметки, машина даже не будет проверять твои задания, если что-то не по стандарту. Если в задании явно не написано, что определенную функцию/библиотеку/оператор можно применять в задании — значит применять его нельзя. Ну и большинство людей в твоих проектах будут дегенератами, надейся только на себя.
Первое же про что почитай — типы данных, большинство людей, что на бассейне, что в /пр нихуя не могут именно из-за того что в первую очередь не понимают с чем работают.
Про типы данных жиза. Уже второй год пошёл, как я учусь, а до сих пор не понимаю, как флоаты хранятся. И даблы соответственно.
>из-за которых на деле все сложнее, чем кажется.
Поясни за камни? Был на встрече, хотел спрашивать студентов, но мне сказала Руслана, что такие вопросы нельзя задавать.
Выпускники претендуют?
Вас там будут учить 5 лет, и вы все там будете участвовать в реальных проектах, с настоящим рабочим конвейером, CI настроите, тестеры будут отдельной командой.
Или что, ты думал ты научишься писать крутойты так будешь думать код и тебя без опыта с одной бумажкой возьмут на сеньора?боже, вы такие наивные
И всё таки, сколько вас там будут учить? Мне просто очень интересно что вам это даст и как поможет.
Чтобы изменить переменную внутри функции, например.
В функцию всегда передается копия аргумента. ТО указатели нужны:
1. Чтобы копировать только указатель вместо большой структуры.
2. Чтобы изменения сделанные внутри функции отразились на переданном объекте.
3. Передача колбеков.
Ну коллбеки это уже указатели на функцию, ему рановато это, пожалуй
Зависит от скорости обучения от 1.5 года до 4. И всё бесплатно. А ты и дальше плати за свою шарагу.
Если передавать указатель вместо переменной, это значит что он создаёт копию этой переменной и будет занимать больше места в памяти? Значит надо всегда оперировать указателями, даже если нет необходимости менять аргумент?
Просто хочу понять когда имеет смысл использовать указатель, а когда нет.
Почему ты решил в школе выучить невостребованную сишечку? Твоя голоа запилить патч для линуса?
Представь что тебе надо передать один байт. Указатель на него будет занимать 4 байта на 32 битной системе.
Школа-кун, что вы там сейчас программируете?
Динамическое очко твоей мамаши
>вижел
Я пока не досмотрел почему, но мне кажется, что последние числа при делении 1/10 это просто данные с соседней ячейки памяти, не связанные с самим результатом деления.
fucking_school++
>- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
700 страниц
Чем можно заняться на сишке? Что обычно пишется?
Например, я задал структуру, например слова с переводом. Ввожу слово в консоли и перевод через '-', все эти строки записываю в файл.
Потом хочу прочитать этот файл и найти перевод нужного мне слова или наоборот. Как организовать поиск нужной строки по файлу без всякой лишней хуйни и динамической памяти(потому что еще не изучил, если она, конечно, в таком роде заданий нужна)?
Я не знаю на кого ты похож, я же не вижу тебя
А в идеале - с использованием WinAPI, и являющиеся редактором конфигов или чем-то похожим.
Можешь по простому объяснить чем scanf от sscanf отличается, а то про эти буферы нихуя не понятно
Основная проблема стандарта не в количестве страниц, а в языке, которым он написан. Вон мы в самом начале треда обсуждали дереференс, и если бы формулировки были четкими и ясными, да еще не размазанными по половине стандарта, а сгруппированными по смыслу, обсуждать было бы нечего.
>>47542
> как организовать поиск нужной строки по файлу без всякой лишней хуйни и динамической памяти
Делаешь на стеке буфер достаточно размера (килобайт, например), читаешь строки по одной с помощью fgets, попутно разбиваешь их на слово и перевод с помощью strtok, strcmp проверяешь совпадения (или используешь какую-нибудь нестандартную _stricmp, чтобы не учитывать регистр).
>>47588
Совершенно нормальный подход, так все и делают. Разве что я бы для удобства чтения привел в соответствие тип и префикс имени: mymap_get(mymap ptr map, ...).
>>47598
> с использованием WinAPI, и являющиеся редактором конфигов
Винда кэширует полупрожеванные .ini на некоторое время, когда ты делаешь GetPrivateProfileString/Int, поэтому можешь не заморачиваться и читать напрямую, не изобретая никаких внутренних мапов.
>>47708
scanf() читает из stdin (пользовательский ввод из консоли). sscanf() читает из сишной строки в памяти. Можешь считать, что scanf() - это что-то подобное fgets(buffer, ..., stdin), после которого идет sscanf(buffer, format, ...) хотя на самом деле оно не так реализовано.
У - Уябывай в макакотред
Да, ведь как охуенно натягивать сову на глобус юниксвей на винду, попутно обсирая оконные приложения в системе которая называется "Окна", и при этом думать что ты не дебил.
есть какие то книги или примеры по функциональному программированию, как правильно писать функции как струтурировать и тд или это все с опытом приходит ?
В 10
> линукс, там консоль юникодная
В винде тоже юникодная, в том смысле, что ты можешь выводить и UTF-16, и UTF-8, и все будет норм, только отобразится не все. Да и зачем тебе эмодзи и хангыль в консоли?
Да, ведь комбинировать программы это юниксвей, а не единственный способ иметь нормальную билдсистему, например.
Сам так сперва ставил unsign, где типо положено; но стали возникать возникать трудноуловимые проблемы с приведением типов при арифметических операциях, теперь везде стараюсь ставить просто int.
Пишу glsl шейдер, хочу провести препроцессинг, но gcc, что только
расширения .c переваривает, можно как-то свой .vert сунуть?
..Такие флаги: gcc -E -C -P PRE.c -o RESULT.c .
unsigned типы вообще чаще всего не для этого используются..
а чтобы байтики туда-сюда подвигать..
Чтобы можно было безопасно битовые сдвиги делать и битовые поля на весь word.
>>48251
Ну я хотел поизящнее. Уже нашёл "-<"
gcc -E -C -P -< shad/test.vert -o shad/test.vert_, препроцессинг есть
, но только когда делаю #include он не влезает, почему-то файл остаётся того же размера, наверное должен быть флаг для разрешения переразмеривания. Вообще как прочитал это UB кормить gcc не .c файлы, но glsl похож синтаксисом так, что.. надо ещё поковыряться.
>Вообще как прочитал это UB кормить gcc не .c файлы, но glsl похож синтаксисом так, что.. надо ещё поковыряться.
Поищи тогда в тулзах от производителя видюхи. В glsl должен быть свой препроцессор же.
По сравнению с gss`ишным он приметивен, там нет например #include который мне нужен.
gcc
>Делаешь на стеке буфер достаточно размера (килобайт, например), читаешь строки по одной с помощью fgets, попутно разбиваешь их на слово и перевод с помощью strtok, strcmp проверяешь совпадения (или используешь какую-нибудь нестандартную _stricmp, чтобы не учитывать регистр).
Создал 2 массива строк через *, в цикле(пока не конец файла начал считывать строки через gets, сразу же делил через strtok_s, на всякий случай выводил в консоль 2 массива строк, все хорошо выводилось, но с поиском не получилось, потому что в следующем цикле введенная мной строка и эти массивы через strcmp не сравнивались. Теперь такой вопрос, как все строки в этих массивах сохранить, чтобы использовать их для сравнения в следующем цикле с введенной мной строкой?
>Чтобы не мешался значащий бит?
чаще всего signed типы немного сложнее устроены.. если планируешь байтоебить, полезно будет таки узнать
ВО ВСЕХ ПРОЕКТАХ ТАКАЯ ХУЙНЯ С WCHAR_T ЖОПОЙ???
Если я наделаю в своем проекте
#define char wchar_t
#define fputc fputwcc
И прочее, то я не буду сукой? Мне глаза режут эти названия просто.
Смена локали ВНЕЗАПНО может сломать всякие atof. Они, сука, разделитель системный тянут, так что какой-нибудь 5.71 может считаться как 0,00.
Так как тогда блять делать нормальную кросплатформенную залупу для консоли? У меня уже агрессия какая-то, я не думал, что на винде все так злобно с этим.
Я так и делаю, но ощущаю жжение в одной точке.
> Стоит ли везде юзать unsigned int
unsigned int не стоит, из-за него компилятору на 64-битной системе придется генерировать лишние 1-2 инструкции (но если собирать с -frapv, то и для int тоже!). А вот size_t использовать можно и нужно, если итерируешься по индексам.
>>48333
Может быть, код покажешь?
>>48360
> Смена локали ВНЕЗАПНО может сломать всякие atof
Внезапно локаль - это не только и не столько про кодировки, а как раз про всякие десятичные точки. Меняй не LC_ALL, а только LC_CTYPE.
> Так как тогда блять делать нормальную кросплатформенную залупу для консоли?
Не бывает кроссплатформенных программ сложнее хелловорлда. Страдай и портируй.
Куда вообще указывает адрес при создании переменной?
Попробуй вдуматься в то, что ты делаешь.не работает, потому что и не должно, попробуй осмыслить, что происходит, когда ты передаешь в свою функцию адреса переменных
Всё, сообразил. Думал прокатит.
Я знаю как надо правильно свапать. Про указатели я сразу понял всё, просто экскрементирую.
>А вот size_t использовать можно и нужно, если итерируешься по индексам.
То есть for (size_t i = 0; i < size; i++) ...
И чем этот сайз отличается от unsigned int?
Оцените класс по шкале от лоха до страуструпа.
>не бывает кроссплатформенных программ сложнее хелловорлда. Страдай и портируй.
Но жавабляди...
>Не бывает кроссплатформенных программ сложнее хелловорлда
А у меня программа уровня хелловорлда.
Она берет текстовый файл и с указанной частотой выводит слова в середине консоли (чтобы быстро читать). И даже на такой нупской задаче сосу с кроссплатформой.
Рекомендую лучше termux поставить с nano или vim'oм вместе с клавой для кодинга. Удобнее в разы.
Там код на виртуальной машине выполняется, не сравнивай.
БЫСТРОФИКС ЗАБЫЛ ПРО РАЗМЕТКУ В ПРОШЛОМ ПОСТЕ БЛЯ
А тогда зачем его нужно в счетчиках юзать то?
> И чем этот сайз отличается от unsigned int?
На 64-битных машинах unsigned int 32-битный, unsigned long как получится (привет, Microsoft), а size_t везде 64-битный. Если компилятор положит 32-битное значение в 64-битный регистр, ему нужно заботиться об арифметике с переполнением, а вот положить 64-битный size_t в 64-битный регистр можно без дополнительных сложностей. К тому же, size_t - это хорошая подсказка читающему, что речь идет о размере объекта или индексе.
>>48472
> Но жавабляди...
if (osName.startsWith("windows 9"))
Так не получится. У тебя каждый следующий fgets затирает массив c новой строкой, а по-отдельности ты сохраняешь только указатели внутрь этого массива. Я тебе предлагал не совсем такой вариант. Я предлагал вводить искомую строку до чтения файла, потом читать построчно и сравнивать, храня в памяти только текущую строку, а не весь файл. Вот как-то так: https://ideone.com/MsdkUO
Но если ты очень хочешь читать файл в память, и тебя устраивает захардкоженное максимальное количество строк, то просто сделай двумерный массив со строками:
char c[20][200]; // 20 строк максимум, по 200 символов каждая.
и читай не в c, а в c[i], ну и strtok тоже делай для c[i]. Алсо, чтобы заработало, надо убирать \n в концах строк, их fgets оставляет.
Есть, но это самый годный варик как по мне.
1 КБ. Чтобы упростить вычесления, можешь задефайнить 1кб размер и прибавлять один для конца строки, если много чарстрингов то читать их так будет намного удобнее
Можно ли
>word = strtok(line, "=");
>translation = strtok(NULL, "");
Заменить на
word = strtok_s(c, "-", &translation);
Что именно тебе непонятно? От тебя требуется написать программу, которая на вход получает текст с переносами и прочими вещами, но выводит на экран символы перевода строки видимыми. Простая софтина. Можешь несколькими путями сделать. Я б через регэкспы сделал.
Я понял. "tab" и "\t" — два разных термина. Просто не самым понятным языком написано.
Буду писать на ифах, потому что в книге, по сути, ничего больше не представляли. Решил оставить все предыдущие знания всех предыдущих языков программирования и изучить Си с нуля.
Везде, твой код — не калькулятор, а хер знает что. Касаемо ошибки: чему равно d? Оно у тебя не инициализируется и не присваивается нигде.
Ты в d не указал что он равен с.
> Просто не самым понятным языком написано.
Это английский.
> Буду писать на ифах, потому что в книге, по сути, ничего больше не представляли.
Ни в чём себе не отказывай. В книге скорее всего и подразумевается данным примером на практике проверить как ты усвоил материал. Если окромя ифов и циклов ничего не было, значит задачу совершенно точно можно решить уже пройденным матералом.
> Решил оставить все предыдущие знания всех предыдущих языков программирования и изучить Си с нуля.
Если раньше говнокодил на скриптовых языках, то правильное решение, но ломка будет страшная.
>>48955
Если с 3-го раза не понял, стоило бы отложить чтение на пару часов доя прогулки на свежем воздухе. И, да, пожалуйста.
int N;
scanf("%d", &N);
x +=2;
for (int i = 0; i <= N; i++){
printf("%d", i x);
x = x + i N;
}
printf("%d", x);
return 0;
Правильная логика?
> где можно онлайн записывать код
https://ideone.com/
https://wandbox.org/
> решить
Что там решать, когда все до мелочей описано?
> Правильная логика?
Зависит от того, как ты объявил x.
>Зависит от того, как ты объявил x.
Как инт. А как ещё можно?
Просто практикуюсь на задачах.
Спасибо за список сайтов.
Мужик уходи с виндузятни и юзай джисиси или джибиди
Почему на картинке в одном месте переменная называется PTR а в другом месте - STR? Автор ёбу дал?
Адрес указывает на байт. В памяти хранятся байты, других ячеек не бывает. Если тип указателя больше чем байт меньше не бывает, то указывает на начало - первый байт.
Но зачем?
Так, что ты знаешь про объявления указателей в Си? Ты же в курсе, что указатель это отдельная переменная ссылающаяся на другую переменную?
char str[] = “Hello”;
char *ptr;
ptr = &c;
Понятно должно быть без проблем, как по мне.
>Ты же в курсе, что
Алё, кто знает про указатели, тому не нужны картинки. Такие картинки предназначены тем кто не понимает, чтобы они посмотрели и поняли. Но тут мы видим, что картинка - говно нарисованное жопоруким дебилом. В результате не помогает понять, а только еще больше путает.
>указатель это отдельная переменная ссылающаяся на другую переменную
Неправильно. Указатель ссылается на память, какую угодно, а вовсе не на переменные.
> Указатель ссылается на память, какую угодно
вообще то в си указатели типизированные, за исключением спец случая void..
ну, он же циклически печатает
-5,-3,-1
изначальный -1 будет каждую итерацию инкрементироваться, а изначальный 4 будет каждую итерацию декрементироваться. Доходят до {1,2} и после этой итерации условие перестаёт выполняться.
спасибо
Седьмая строка - typedef struct rect_tag rect_t;
Тридцать четвертая строка - rect_t intersection(rect_t r1, rect_t r2) {
Что за тайпдеф стракт? Почему рект_т нужен?
Короче, я только новичок в программирование, а курс сразу кидает на амбразуры. Нахуй так жить.
>typedef struct rect_tag rect_t;
сам нубас, но чутка понимаю структуры и кажется, что это какая-то мусорная строка. Зачем вообще объявлять структуру rect_tag, а потом тут же её переопределять как rect_t. Или так типо не нужно будет к её полям каждый раз прописывать доступ?
У тебя во время присвоения значения произойдёт ошибка мисматч. Ты с типами данных разберись, у тебя каша в голове какая-то. Либо ты жирная зелень что скорее всего так и есть
Это чтобы не писать каждый раз struct, а писать просто rect_t
Часто используется еще такой способ
typedef struct {
....
} rect_t
Если ты просто обьявишь структуру то тебе потом везде прийдеться писать struct rect_t, а с тем дерьмом можно писать просто rect_t. Почитай что такое typedef или просто игнорируй (пока) ту хуйню. Это чисто для удобства сделано, чтобы код почище был.
Но для задачи по поиску пересечение двух прямоугольников это может быть удобно. Собственно моя задача об этом и была.
А что почитать? Не могу найти инфу доступную.
вот и все
>1960
>Массив - ссылочный тип.
>2019
>Javamakaka: си устарел
>Java: массив - ссылочный тип
Я правильно понял, что твоя функция берет аррей и умножает каждое число в нем на три?
Учусь читать код.
Объясни, кто тебе мешает сделать static const uint8_t data1[] = { ... }; Литералы, которые тебе предложили, практически ничем от этого не отличаются. Это ведь протокол какой-то, неужели сложно имена переменным придумать? Ну или если компилятор умеет в __COUNTER__, можно обернуть в макрос и генерировать серийные номера.
> Как программист на Си я специально посетил сей тред, чтобы недвусмысленно и решительно высказать своё "фи" так называемому компилятору ШЛАНГ. Надеюсь это говно никогда не взлетит и все так и будут сидеть на GCC и VC.
С разморозкой. Вынуждены вас огорчить, за время вашего криосна это поделие с байткодом таки хайпануло по-крупному и уже вот овер 5 лет как стало кококорпоративным стандартом в кресто-няшно-мейнстриме, а мелкомягкие таки сдались и поддержку оного шланга у себя в студии запилили.
Один только линус пока держится и еще пара красноглазых.
> Реквестирую небольшие программы на Си, написанные хорошим стилем. Ибо чую я, что костылить ООП в стиле map_get(mymap #m, const char #key, char #value) - хуевый путь.
https://github.com/id-Software/Quake-III-Arena
чел откуда ты столько знаешь, опыт или книги есть спецальные просто вот про unsigned int удивило , ты просто в компиляторе разбираешься круто или где то инфу взял ?
1. Выходит, со шлангом проблем нет, а проблемы с
LLVM? Почему же выше сказано наоборот?
2. Какие тогда проблемы с LLVM?
Какой же у тебя лютый говнокод, просто пиздец. Взять хотя бы циклы, это же потенциальная база для выполнения операции переполнения буфера.
Если ты заранее знаешь размер массива, то на какой хуй ты не указываешь его длинну? Если ты знаешь длинну массива, то на какой хуй ты её вычисляешь в цикле? Идиота ты кусок ебаный. Делай цикл с отчётом от последнего элемента в массиве, это заодно примитивная оптимизация, которая требует меньше машинных операций и защита от переполнения массива.
Блядь, животное ты ебанутое и ты ещё будешь давать советы нубам не читать чужой код? Ох ты и чепуха ебаная. Твоё место в ЖЭКе на получение униформы и метлы. Ебать, что за дегроды растут.
>>50096
Анон, не слушай ты эту хуету >>50078 ебаную, он поц пиздючный, решил тут повыёбываться.
> Какой же у тебя лютый говнокод, просто пиздец. Взять хотя бы циклы, это же потенциальная база для выполнения операции переполнения буфера.
Если он случайно забудет изменить макрос после изменения массива при объявлении — да, если уж используешь макрос для размера будь добр при объявлении массива дать ему этот размер.
> Если ты заранее знаешь размер массива, то на какой хуй ты не указываешь его длинну?
Собственно вот.
>Если ты знаешь длинну массива, то на какой хуй ты её вычисляешь в цикле?
В каком месте он вычисляет длину в цикле?
>Идиота кусок ебаный.
Давай без оскорблений, все когда-то начинали.
>Делай цикл с отчётом от последнего элемента в массиве, это заодно примитивная оптимизация, которая требует меньше машинных операций и защита от переполнения массива.
Вот тут объясни что ты имеешь в виду.
> Блядь, животное ты ебанутое и ты ещё будешь давать советы нубам не читать чужой код? Ох ты и чепуха ебаная. Твоё место в ЖЭКе на получение униформы и метлы. Ебать, что за дегроды растут.
Опять же, успокойся, пожалуйста.
Во-первых, есть переменная i, которая на каждой итерации цикла прохождении от 0 до конца массива инкриминируется. В этот момент происходят операции вычисления длинны массива циклом, в условии хоть и задан предел, ро цэ переменная, значение которой можно поменять в любой момент и вот в этом проблема безопасности кода.
Во-вторых, обратный цикл от известного максимума до нуля не производит операций по вычислению длинны массива (он тупо уже не вырастет). Соответственно даже изменив на лету макс значение переменной во вреия выполнения не приведёт к чему либо страшному. Дизассемблируй оба цикла, чтобы нагляднее было.
Я не он, а кто это?
Нет никаких проблем. Просто у сектантов пригорает от лицензии шланга, она для них слишком свободная.
>>50583
> операции вычисления длинны массива
Это ты так сейчас обозвал практически бесплатную инструкцию lea?
> проблема безопасности кода
Какие-то фантазии. Если есть баг, позволяющий испортить my_size, то скорее всего, он же позволит испортить и i. Да, на проходе по массиву из конца в начало можно выиграть несколько байт размера кода, заодно проиграв в быстродействии, но вот на безопасность проход в обратном порядке не влияет вообще никак.
Ебланы сука ощущение что вы поиграться просто хотите, а не реально чтото понять
Как решать подобные задачи?
Определение площади пересечения прямоугольников?
Формализовать задачу. Определить закономерность, алгоритм. Разбить решение на элементарные части. Оптимизировать. И уже потом писать код.
Да ничего плохого в форе нет, просто старые стандарты, ну и поэтому много задач алгоритмических в задачниках задуманы для решения вайлами, попробуй, хороший челлендж
Не смеши. Если размер массива задан, то проход в цикле от последнего элемента до 0 безопасен тем, что динамически ты уже не поменяешь размер массива. Попробуй добавить элемент в массив во время выполнения цикла.
«Если есть баг» — не заданный размер массива и есть баг. В него динамически можно добавлять элементы.
В быстродействии обратный цикл выигрывает — это пускай маленькая, но оптимизация. И он таки быстрее, чем цикл с перебором элементов, который ты выше представил.
Влажным негритянским пенисом тебе по губам, шлюшка ты белая. Проститутка, сгоняй на хуй и не возвращайся.
Эй хуета из ШкОлЫюНеТфАкТоРи, иди нахуй. Я твой рот ебал, ебаный дебил. Нахуй ты что-то пишешь вообще ты же тупой как пень
Если мне нужен счётчик и я знаю сколько раз провернется алгоритм, я всегда беру фор. Вайл только для неопределенного количества итераций и без счетчика.
Можно вайлом сделать то же что и фор, но зачем? Это ведь усложняет код.
У меня за плечами МФТИ прикладной математики, щенок ты самообразованный. Раз папа сказал тебе пошёл нахуй, значит ты встаёшь и идёшь нахуй. Залупа ты мелкобуквенная.
Аноны, подскажите. Надо сделать тест на 80-100 вопросов, в каждом вопросе только 2 ответа "да" или нет". Потом сравнивать набранные баллы. Например, если по по одной шкале(для определенной шкалы, существуют определенные вопросы, например, 2, 5, 19, 44, хотя все вопросы в тесте идут по порядку, т.е. 1, 2, 3, 4, 5...100.) 10-15 баллов - это средний показатель, то что ниже - низкий показатель, соответственно выше - высокий. В итоге, прошедшему тест на экран выводятся его результаты.
В гугле почитал, то что вопросы нужно грузить из файла, но в каком, собственно, виде это делать?
Запускаешь его с поданым в параметр именем файла и считыватешь, или пайпуешь и читаешь через стандарт инпут
Можно про первый вариант поподробнее, а то я тупой. Как должен выглядеть файл?
1)Вопрос
-Да
-Нет
2)Вопрос 2
-Да
-Нет
и т. д.
Вот так?
В строчке первым пусть идут номер вопроса, потом баллы за да и нет, а потом сам вопрос.
В консоли или куда там пусть выводятся вопросы по порядку, а как вводить ответ уже сам решай.
Например
1,5,0,Ты пидор?
2,0,5,Твоя мать шлюха?
3,2,4,Почему мужчины смеются над блондинками?
Лучше разделитель запятая, потому что многие программы работают так. Например через екскль будет удобнее импортировать данные.
Если хочешь с другими вариантами ответа, то тут можно поставить число после порядкового номера которое будет указывать на количество вариантов ответа, а в последующих строках, собственно, сами варианты с весом ответа.
Например
1,3,Ты пидор?
5,Да
0,Нет
5,Немношк
Твоя любимая цитаты с твоей любимой работы?
> Попробуй добавить элемент в массив во время выполнения цикла
Попробуй делить на ноль в цикле. Попробуй по нулевому указателю писать. Если ты захочешь сделать глупость - тебе никто не запретит.
> В быстродействии обратный цикл выигрывает
Хуево дружит с кэшами и еще более хуево векторизуется.
https://pastebin.com/vwdDTVCK
Алгоритм придумал за минут 10-20, всего ушло 2 часа
Алсо, толком не тестировал. Завтра протестирую. Но вроде работает.
Не понимаю о чём ты.
Но это vs-code с gcc. Где там шланг?
Вот например целая специализация на edx:
https://www.edx.org/professional-certificate/dartmouth-imtx-c-programming-with-linux
Если тебе сертификат не нужен, то можно бесплатно всё проходить.
Решил тряхнуть стариной и вспомнить С, прохожу первый курс, оооочень всё медленно объясняют, вплоть до объяснения где на клаве найти спецсимволы.
Вы видите копию треда, сохраненную 15 марта 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.