24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Коданы, может я пиздоглазый, но не заметил треда про Сине плюсы или решетка, а чистый си Хочу программировать под микроконтроллеры и байтоебить. Подкиньте хорошей литературы. И еще интересно, является ли знание сабжа, на достаточном уровне, так сказать плюсом в карму, при устройстве на работу. Алсо, большой роли плюсы в карму не играют, больше для себя собираюсь этим заниматься.
Они емнип когда-то были, но не взлетели. В принципе, крестотред уже и так наполовину забит байтоебством, в прошлом вон вообще асм был, так что почти рилейтед и можно спрашивать там. Но если ты возьмешься за поддержание отдельного, будет здорово.
Вот насчет кармы это ты очень верно сказал Си - это печать на всю жизнь Освоил c#, python, erlang, haskell, go А работа все равно уже 16 лет находится только на си и иногда на крестах Все это мое "саморазвитие" нахуй никому не нужно Прям хоть профессию меняй
>>518562 Сидел в туалете, думал над твоим вопросом... Я вижу такой путь развития:
1) Читаешь K&R 2) Накатываешь FreeBSD 3) На няшной пишешь свой вариант утилиты dd, поглядывая в исходники оригинала при необходимости (https://svnweb.freebsd.org/base/release/10.0.0/bin/dd/). Если ты еще совсем нуб в Си - пишешь сперва эту: https://svnweb.freebsd.org/base/release/10.0.0/bin/mkdir/ 4) Теперь пора делать проект средней сложности. Например накати иксы (gnome2 какой-нибудь) и с использованием gtk напиши какую-нибудь альфа-версию эмулятора некроприставки вроде NES. Чтобы можно было поиграть в марио без звука. Попутно осваивая потоки, работу с графикой через анальные прокладки GTK. 5) Сделал? Ты охуеннен. Ты уже можешь начать читать вот это http://www.osrtos.com/ с пониманием того, что тебе больше потребуется. Параллельно изучай спрос на рынке труда на различные мощные микроконтроллеры и необходимые применения. 6) Заказываешь отладочную плату подходящего тебе МК, например на пикриле распространенная плата ARM Cortex-M3 от NXP. 7) Портируешь на какую-нибудь RTOS свой некроэмулятор NES. 8) Выкладываешь на ютуб работу устройства чтобы потешить ЧСВ (хотя даже этим там уже никого не увидишь). 9) Начинаешь обивать пороги автомобильных, промышленных компаний, производителей бытовой техники, и прочих. 10) Работаешь в Рашке, тут главное не сдаться и не начать писать селекторы каналов для телевизоров Рекорд на 8-битном winchip до конца жизни. 11) Сдаешься в Корею в самсунг. Профит.
Слишком сложно? Ну тогда будешь максимум как дихальт - поддерживать некрожелезо на некропредприятиях за еду, как бомбила с паяльником и ассемблером. А насчет сложности - многие умудряются такие вещи делать на энтузиазме в свободное от работы время, но на С-way радикально не становятся.
C (няшная сишка) - самый простой и убогий язык из тех, что используются на практике. Более убогий - только брейнфак. Единственное выразительное средство - копипаст, для автоматизации которого есть даже специальный второй язык-препроцессор. Делает решение любой задачи нетривиальным, так что его решение задач с его помощью может требовать высокой квалификации. Тем не менее, типичная няшаблядь ничего не знает и не умеет. Даже дибиловатый обгвидок знает, помимо гвидопыха, еще и сишку, но сишкаблядь не знает ничего кроме нее. Языком владеют почти все, но только няшаблядь этим знанием гордится, остальные стыдливо скрывают. Также няшаблядь может ошибочно считать что знает C++ или несуществующий язык C/C++. Благодаря C компьютерные программы - самое ненадежное из всего созданного человеком.
Указывать сиблядям на проблемы языка бесполезно. Кроме сишки сиблядь нихуя не знает и не умеет, а на любое обвинение у сибляди есть универсальный ответ - "криворукость". Этим сиблядь как-бы намекает, что что все вокруг криворуки - т.е. сотрудники микрософта и интеля, пишущие кривые драйвера и библиотеки, прыщебляди, пишущие дырявое ведро своей системы вот уже не первый десяток лет, просто другие сибляди из соседнего подвала полусвовковой шаражки, в которой сиблядь работает. А вот сама сиблядь - сука граф Шарль Ожье де Бац де Кастельмор д’Артаньян среди педерастов, владеющий техникой левитации, предсказания будущего и написания небыдлокода на сишке. К сожалению, простым смертным едва ли не удастся увидеть творения сенсея, так и будут они работать с глючным говном криворуких интелевских и микросовтовских инжеренов, внезапно падающим от какого-нибудь buffer overflow, несмотря на зиллионы человекочасов, проёбанных на его тестирование и отладку.
Идут года, сохнут глотки евангелистов, но на настоящий день не существует языка, который позволяет быстро писать быстрые и портабельные программы, за исключением няшной сишки. Без RTL-то ниосиливается.
У крестов был шанс, но шиза строструпа, мэнглинг и RTL-то все равно есть, а значит ее надо портировать. Это может быть и ок, быстрые программы писать можно, но быстро их писать уже нельзя.
>>518744 > Идут года, сохнут глотки евангелистов, но на настоящий день не существует языка, который позволяет быстро писать быстрые и портабельные программы, за исключением няшной сишки
>>518754 > 1. forth > сейчас сейчас, еще неделю, я форт-систему уже почти совсем дописал > 2. виртоговно > сейчас сейчас, еще недельку, я собиратель мусора на стеке допишу > 3. петухан-куриханыч этот язык пока да, не знаю и не умею. У него есть библиотека времени выполнения
>>518762 > Надо полагать, сишные printf и malloc являются инструкциями процессора? Это СТАНДАРТНАЯ БИБЛИОТЕКА языка Си, но не библиотека времени выполнения. Программу без стандартной библиотеки написать на языке программирования можно, без RTL нет.
>>518744 >мэнглинг и RTL-то все равно есть Мэнглинг не мешает, а без стдлибы вполне можно обойтись, так очень многие делают. На самом деле и без libc вполне можно жить - все равно обычно или при инициализации память берешь сколько нужно, или постраничными кусками. Так что без разницы, маллок дергать или сисколл. Работа с файлами через простенькую обертку, а больше ничего и не нужно по большому счету.
>>518831 Удвою этого господина >при инициализации память берешь сколько нужно, или постраничными кусками На рубеже нулевых делали некий проект под freebsd Быстро выяснилось, что стандартный malloc не использовал повторно освобожденные блоки Короче в итоге так и обошлись - при старте делали sbrk на сконфигурированное значение, а управление кучей свое
Почему в /зк всегда тонут (или же вообще не создаются) треды о языках программирования, которые мне интересны? Хочу чтоб был C-тред, Ada-тред и, может быть, Rust-тред. Ведь такой тип языков – это самые охуенные языки программирования же.
>>519018 > самые охуенные языки программирования > байтоебское дерьмецо, осваиваемое за 2 дня Посмотри го-тред к примеру. Обсуждать тупую элементарную парашу смысла нет, поэтому обсуждают Илюшу.
>>519025 Ada - элементарный язык? Ты ебанулся? Можно придумать и посложнее, конечно, но элементарным я бы не назвал. Что касается C, то тут я тоже не согласен. Сам язык минимален, но для того, чтобы научиться писать на C надежный и легко поддерживаемый код, нужно времени побольше, чем 2 дня. И если в C нет "поддержки" ООП или ещё каких-то там возможностей в виде ключевых слов, то это не значит, что всего этого нет совсем, тебе точно также, как и с другими языками, нужно разобраться как на C правильно реализуются дженерики, рантайм полиморфизм и прочее. Зато простота и минималистичность самого языка дает преимущество в том плане, что сишный код всегда однозначно понятен, что сильно упрощает изучение чужого исходного кода.
>чтобы научиться писать на C надежный и легко поддерживаемый код, нужно времени побольше, чем 2 дня Ясен хуй - он ведь для этого не предназначен. Можно и ложкой бассейн вычерпать больше чем за 2 дня. >как на C правильно реализуются дженерики, рантайм полиморфизм и прочее Через нечитаемые костыли. Плавали - знаем. >сишный код всегда однозначно понятен Троллинг_ор_джаст_ступид.жпг
>>519048 >Ясен хуй - он ведь для этого не предназначен. Можно и ложкой бассейн вычерпать больше чем за 2 дня. Суть в том, что на C научиться писать надежный и поддерживаемый код таки можно (см. успешные ОС), а такой же производительный на каком-нибудь хачкелле – нет.
>Через нечитаемые костыли. Плавали - знаем. Нечитаемые костыли в C получаются, когда на него пытаются искусственно навесить слишком толстый слой абстракций, которого там не должно быть. Если рассматривать задачу всегда с практической точки зрения (то есть цель – то, как должна в итоге работать программа), то окажется, что все необходимое на C отлично реализуется, и не более многословно, чем в какой-нибудь джаве.
>>сишный код всегда однозначно понятен >Троллинг_ор_джаст_ступид.жпг Что не так?
>>519074 Это как посмотреть. В C копипаст, так или иначе, всегда делает какую-то реальную работу, и при этом его в большинстве случаев возможно заменить на функции/макросы, или как-то ещё переструктурировать код, избавившись от большинства повторений; в то время как в какой-нибудь джаве, например, "абстрактная" иерархия классов там, где это не нужно, вполне может оказаться кодом, по сути вообще ничего полезного не делающим.
>>519226 Для такого есть функции и в них циклы. Открываешь все файлы, передаёт их на обработку, закрываешь — всего три функции. Вызываются они внутри ещё одной функции. Файлы будут закрыты в любом случае, т.к. в Сишке нет исключений, так что выполнение в любом случае приползёт к последней функции, закрывающей их. Данный товарисч конечно же OCHE UMNY VIIYNOSHA но к сожалению он мудак. Пiчальбида.
>>519033 >правильно реализуются дженерики мм, а как? я токо два варианта могу - на макросах запилить, тогда будет типизация работать по итогу, но отладка отвалитца или на void*, тогда типизации не будет
>>519350 C11 дает тебе еще один путь: делаешь копипастой сколько надо функций, а потом макрос с _Generic, который по типам аргументов выбирает нужное говно. Правда нахуй это говно нужно кроме как "преобразовать в строку для печати" в толк не возьму. Ну да, есть еще трюки с "дефолтными аргументами", но это все настолько ненужно, что я прям даже не знаю.
>>519360 Нет. _Generic это про другое. Суть дженериков же как раз заключается в избегании копипасты. А _Generic+макрос ближе к оверлоаду (правда толку от него все равно нет).
>>519350 На макросах типа #define GENERIC_SORT(name, type, comp_func) самый лучший вариант я считаю. С отладкой проблем нет, т.к. тот же clang, выдавая ошибку, показывает не только на строчку с инстанциированием, но и кусок раскрытого макроса с ошибкой. Плюс всегда есть ключ -E, позволяющий целиком увидеть во что раскрывается макрос.
>>518562 Там тебе надо общий пррнцип понять, на примере каких-нибудь 8 ми битных микроконтроллеров. RTOS не всегда нужна, для начала разберись как раьотает периферия.
>>519387 > #define GENERIC_SORT(name, type, comp_func) Ох уж эти костыли-костылики. Не говоря уже о том, что нет ничего более уёбищного, чем макросы на основе переписывания строк.
>>519413 Плюс в том, что в этом случает ты используешь их только тогда, когда это действительно нужно, в отличие от крестов, что положительно влияет на скорость компиляции и размер кода.
>>519557 В С++ ты делаешь весь класс темплейтным, хотя часто можно обойтись парой методов, а все тяжелое убрать из хедера. В си ты десять раз подумаешь, надо ли использовать дженерик на макросах.
>>519033 > нужно разобраться как на C правильно реализуются дженерики, рантайм полиморфизм и прочее. Няшная - это низкоуровневый язык, который нужен чтобы возить байтики в тележках. И точка.
>>519683 Хотя нет, это было когда-то там. Сейчас спецификации на всякие там кристаллы разрослись, одно Intel HD Audio чего стоит. Из-за этого начинают криво писаться драйвера, код плохо реюзается, каждому приходится разбираться заново. Так что эти ваши полиморфизмы с субтипами начинают быть все более нужными, даже в няшной.
>>519685 >Так что эти ваши полиморфизмы с субтипами начинают быть все более нужными, даже в няшной. No thanks. У нас уже есть эталон кривизны - драйвера ATI (хотя и Nvidia не отстает), нового не надо.
>>519695 >Надо искать эталон прямизны, и, найдя его, пользоваться на здоровье и рассказывать другим. Абсолютно согласен, но где ж его найдешь? Даже люди, проектирующие процессоры (невероятно ответственная работа), до сих пор не могут найти золотую середину в вопросе обратной совместимости, да так, что у одних дескриптор сегмента по всем восьми байтам распидорасило, а другие вешают новые команды на опкоды старых с префиксом.
Вот, как раз поясните: с развитием новых стандартов теперь есть ли возможность: 1) задать разрядность signed/unsigned в битах/байтах? 2) обрушить программу при переполнении целого? Вопрос про стандарты самого языка, однако, про gcc отдельно тоже интересно.
>>519683 >который нужен чтобы возить байтики в тележках. И точка. И правильно - ведь компьютеры и предназначены для перевозки байтиков. Бойлерплейт из абстракций не нужен, особенно сейчас, когда закон Мура закончился.
>>519700 >задать разрядность signed/unsigned в битах/байтах? #include <inttypes.h> Там есть int8_t/uint8t/int16_t/uint16_t и так далее. >обрушить программу при переполнении целого? Насколько я знаю, в gcc нет такой фичи, только самопальные проверки. С ассемблерной вставкой полегче, но код превращается в нечитабельное говно: add eax, dword ptr some_number jo overflow_handler
>>519683 Не пойми неправильно, дженерики на макросах и динамик диспатчинг бывают нужны в сишке в первую очередь как средство достижения максимальной эффективности программы, но никак не ради абстракций или облегчения кодинга. Например дженерик сортировка в виде макроса + инлайн функция сравнения = ноль оверхэда, в отличие от того же qsort из стандартной библиотеки. Также иногда бывает необходимо работать через общий интерфейс с массивом указателей на разные объкты - соответственно прицепляем к структурам vtable'ы или просто указатели на функции, т.к. это тупо самый быстрый способ выбора реализации функции когда конкретный тип объекта заранее не известен. Вообще я имел ввиду то, что изучить сишку (как и любой язык) - это ведь не только запомнить синтаксис, который действительно можно за 2 дня выучить. Многое, для чего в большинстве других языков имеется какая-то специальная фича, в C возможно сделать кучей разных способов, и нужно не так уж мало времени потратить, чтобы выработать самые годные техники для всех ситуаций. Алсо да, сорт оф RAII при помощи goto (как тут выше заметили) - жизненно важная штука. Также всем советую еще всегда возвращать из функции код ошибки, а результат - через переданный параметром указатель, тогда можно делать if (((rc = func1(...)) != 0) || ((rc = func2(...)) != 0) || ((rc = func3(...)) != 0)) { switch (rc) { //обрабатываем ошибки } } это самый компактный способ выполнить ряд операций, которые могут зафейлиться и, в случае чего, обработать ошибки. Всё это очень простые вещи конечно, но таки тоже требуют уделить им внимание при изучении языка.
Посоны, позвольте разбавить ваши интеллектуальные беседы своим дибильным вопросом. Тоже байтоебствую с stm32, компилятор gcc. Передаю данные на индикатор функцией, которая на вход получает указатель на строку. Соответственно надо знать когда строки кончаются. Функция strlen из string.h успешно работает. Но она порождает слишком много ассемблерного кода - НИНУЖНА. Непонятно как вообще может быть определена длинна строки, если передается только указатель? Нуль-терминатор? Но оно же токо в плюсах? Попытался найти код функции strlen, нифига не нашел. Но если проект собирается, очевидно она есть. Где её можно взять?
>>519728 Нуль-терминированные строки есть не только в плюсах, они появились задолго до появления языков высокого уровня, лол. Я вижу два варианта: 1) Можешь сам написать аналог strlen,там ничего сложного. 2) Если не хочешь использовать нуль-терминированные строки, запили строки кортежем длина строки + сама строка. Для байтоебства первый вариант предпочтительней.
>>519719 >ноль оверхэда Указатели на функции, определение которых доступно компилятору, почти всегда инлайнятся. Разницы по скорости с темплейтом не будет.
>>519742 Только если компилятору будет доступно определение qsort. Если бы qsort была объявлена в хидере, как и функция сравнения, то вызов бы заинлайнился.
>>519744 От это да, потом нужно будет самому проверить. Я что-то всегда думал, что он инлайнит только вызовы по имени функции, а тут получается, что отслеживает значение в указателе и тоже инлайнит. Все ж таки действительно немало тонкостей в няшной.
>>519731 >>519735 Действительно в K&R описывается нуль-терминатор. Так и сделаю. >>519745 Скорее всего потому, что если инициализировать строку как "текст", будет добавлен "\0", а если как массив {char1, char2, char3...} не будет.
>>519750 Если инициализировать массив string literal'ом, при этом указав размер массива равный количеству букв, то '\0' в конец строки не добавится. Напр. char str[4] = "test"; - нуль-терминатор добавлен не будет.
>>518562 Если для себя то не еби мозги себе и покупай Ардуину. Если хочешь действительно байтоебить то идешь на сайт easyelectronics и там проходишь учебный курс по AVR там все начинается с тру байтоебства ассемблера, но написано очень годно. Ну а по Си Кериган и Ричи классика.
Сегодня при конвертировании строки из utf8 в cp1251 с помощью функции iconv, в качестве параметров указателей in и out буферов (в хэдэре объявлены с restrict) передал указатели с одинаковым значением (т.е. использовал один буфер). Все отлично работает, но вот думаю, может быть все же стоит использовать два буфера? Или в данной ситуации ничего плохого произойти не может?
Отличаются ли чем-нибудь (кроме наличия/отсутствия деструктора) thread_local поинтер и thread specific storage (функции tss_… в c11 и thread_key_… в posix)? Что лучше использовать в c11?
>>522587 Если знаешь, ответь на >>522433 вопрос позязя. Просто я не очень понимаю необхогдимость добавлять в стандарт tss_ набор функций, если есть thread_local. Может быть есть какое-то отличие, которое я не понимаю?
>>524614 Если допилю до вменяемого состояния, то будут конечно, правда там смотреть особо не на что. Просто в начале automatic блока создается объект – стэк, в который потом записываются указатели на объекты и указатели на деструкторы, в конце блока это всё в цикле вызывается и уничтожается. Сейчас мне надо придумать как лучше сделать обработку ошибок. Вообще, таких велосипедов уже написано > 9000, мне просто свой сделать захотелось.
>>524795 >через подмену адреса возврата Будет не портабельно же. Если там добавить глобальную переменную const struct deinit_stack deinit_stack и потом сделать #define return auto_deinit(&deinit_stack); return, то будет тоже работать с return по идее. Алсо, в любом случае это всё хуита, ни один нормальный человек не станет всерьёз использовать что-то такое.
>>524583 Стоп, а разве в pure c запрещены {}-блоки без костылей типа do-while (0)? Может быть, я что-то не понимаю, но разве вместо autovar нельзя просто объявить переменные внутри блока, чтобы они автоматическими были? Или у меня мозги поражены крестами, лол.
>>527687 То есть у тебя break'и используются в блоках как "исключения для бедных", лол? Я бы на твоем месте сделал для такого обычные блоки и отдельный макрос, который делает goto за закрывающую скобку. Вроде был инструмент для генерации уникальных меток, но я запамятовал. Гулять так гулять, а по производительности это будет лучше, чем циклы, которые выполняются один раз.
Поясните, как си хранит double ? Я так понял там под мантису 52+1 бита. Максимальное число, которое помещается в мантису 2^53=9007199254740992, выходит можно хранить 15-16 разрядов, но если написать double a = 123.45678901234567; printf("%.14lf\n", a); выводит 123.45678901234567, как он умещает 17-й разряд?
>>527701 можно по подробнее я правильно понимаю, что иногда, когда в экспоненте хватает места, часть мантисы он может переложить в экспоненту? В мантисе храниться 1.9290123283179010, а не 1.2345678901234567, как я думал. Или где тогда она?
>>527695 Да похуй, зачем пессимизировать преждевременно? А еще - отдельный макрос на выход с деинициализацией будет няшнее, чем break, выглядит, как отдельная команда.
>>529293 Во всех языках с сишным синтаксисом после if и else надо statement. Или это expression statement (выражение, которое на ; заканчивается) или это statement с ключевым словом (ну тот же do или вложенный if), или это compound statement ({ такая хуйня в фигурных скобочках }).
Если ты написал if (expr) {y}; else ..., то после (expr) у тебя уже ДВА statement (compound в { скобочках } и пустое выражение с ;). Компилятор после второго statement уже не ожидает никакого else, поэтому и охуевает, внезапно его встретив.
>>530740 Брайан Керниган, Деннис Ритчи: «Язык программирования Си», Tony Albrecht: «Pitfalls of Object Oriented Programming», MISRA-C:2004 Language Guidelines, Rob Pike: «Notes on Programming in C», Peter Krzyzanowski: «C Programming Style»
>>530868 А ну да, у тебя ж еще и MISRA в списке. Тогда понятно: ты перечисляешь способы скатить мощь сишечки до своей любимой функциональнойпарашинейм.
Сап, сишники-ананасы, посоветуйте хороший компилятор для чистого С. Пробовал искать сторонние - такого говна поел, что пиздец. Первые два вообще не ставятся, третий закрывает программу при попытке ввода данных, четвертый пытается отличить if от IF и так далее.
Привет, сишники, объясните, пожалуйста, отличие main() от int main() Вроде бы одно и то же, но в Кернигане и Ритчи int не объявляют, а в интернетике во всех кодах его ставят. Зачем?
>>531713 Для шиндоус: Pelles C (полная поддержка C99/C11), и, внезапно, вижуал студия 2015 (там почти все необходимое, наконец, запилили, да и сам компилятор весьма неплох).
>>531750 Во времена K&R все функции по умолчанию возвращали int, если не было указано иное. В современных редакциях стандарта это пофиксили, теперь нужно писать тип возвращаемого значения, а старое поведение deprecated и кое-где уже даже не поддерживается. Я не уверен, но вроде в свежей редакции K&R тоже уже правильно, посмотри сам.. Алсо, int main() - это плюсы, а в сишечке - int main(void) или int main(int argc, char argv).
>>531760 Бери Community Edition, она бесплатная: входишь в аккаунт Microsoft, она сама активируется, опционально выходишь и удаляешь аккаунт Microsoft.
>>531753 Спасибо! Может, есть новое издание, попробую поискать. А вот int main(void), кстати, ни разу не видел. Везде в скобках ничего нет. Это тоже уже устаревшая версия записи?
>>531784 Пустые скобки в C в отличие от C++, где они эквивалентны (void) означают неизвестное число параметров. Например: [code lang="c"] int foo (); //declaration //... foo (1); //call //... int foo (int input) //definition { //... } [/code]
Если я не делаю второй инклуд, то компилятор ругается на встроенную функцию strlen. [Warning] incompatible implicit declaration of built-in function 'strlen'
Почему так? Ведь без инклуда string.h этот код просто не должен компилироваться. Должна быть ошибка "такой функции нет".
>>531793 А теперь и пустые скобки нельзя. Для функций с переменным числом аргументов надо как минимум один аргумент и ..., а для остальных нужно явно указывать аргументы.
>>531799 Компилятор "знает" такую функцию, чтобы в определенных режимах (с оптимизацией) заменять ее вызов на эквивалентный код. Это "знание" не на уровне языка (не декларация), а на уровне компилятора. Так как функция при вызове неявно >>531753 объявляется как int strlen(), а компилятору известно о другом, он ругается.
>>531952 В стандарте весело, кстати. Есть 0, EXIT_SUCCESS (может совпадать, и таки совпадает с 0) и EXIT_FAILURE, а остальные коды возврата - implementation defined. На деле, конечно, так, как ты сказал.
>>532901 Это тоже хинт, как register, restrict и const. Если register предлагает компилятору ускорить доступ к переменной, то inline предлагает ему ускорить вызов функции. И, в отличие от register, компиляторы хоть и не всегда, но все же часто обращают на это внимание, подставляя тело inline-функции в месте ее вызова (что позволяет потом оптимизировать код еще больше). Современные компиляторы, опять же, и сами инлайнить умеют очень хорошо, но если функция несложная, маленькая, то inline можно указать а если ты уверен, что так точно будет лучше, то иногда даже какой-нибудь нестандартный __forceinline/__attribute__((always_inline)), т.е., "инлайни и ниебёт" можно воткнуть. Обычно в пример оправданного инлайна приводят какую-нибудь векторную арифметику - несколько выражений без ветвлений будут развернуты в десяток-два инструкций в месте вызова и отработают гораздо быстрее, без затрат времени на передачу аргументов, не сбрасывая конвейер процессора и т.п.
>>532980 Да, const по сути просто хинт. Но ты-то, как и с другими хинтами, в любом случае обязан соблюдать ограничения, которые спецификатор накладывает.
Анон, помоги ньюфагу! Пытаюсь скомпилить srlua через mingw компилятор. Код glue.c компилируется без проблем, а вот srlua.c выдате ошибки, мол нехватате исходников lua. Ну я и скачал сорсы луа и добавил их в фолдер с кодом, компиляция пошла, но лезут другие ошибки.
Вот без сорсов луа:
C:\gcc-lua-install\tdm-gcc\bin>gcc C:\gcc-lua-install\srlua.c C:\gcc-lua-install\srlua.c:19:17: fatal error: lua.h: No such file or directory compilation terminated.
>>533620 Без сорсов, очевидно, нужны заголовочные файлы и либа. С сорсами, очевидно, тоже нужны заголовочные файлы и... лучше собрать либу.
CMake поставить не пробовал? Хочешь руками? Возьми на http://luadist.org/ уже собранные либы lua (тебе нужны оттуда include/.h и lib/.a? ну и .dll потом), укажи пути в команде компилятору (gcc -Iпуть-к-папке-с-h srlua.c полный-путь-к-liblua.dll.a)
Здравствуйте. Я хотел бы спросить по поводу преобразования типов. Допустим у нас есть три переменные: short a, short b и int c. Нужно ли мне выполнять явное преобразование, если я хочу вычислить: c = a b? То есть надо ли мне записывать это так: c = (int) a b или c = (int) (a * b)?
>>534034 Ну по поводу float, все немного по-другому... А вообще, почему мы спорим? Я говорю, кто-то написал, что компилятор выдаст ошибку, я говорю что компилятор не выдает ошибки, ты говоришь почему так, я и так знал почему и мы спорим не из-за чего.
>>534007 Это от машины зависит: > Тип short часто имеет размер 16 бит, long — 32 бита, a int — или > 16, или 32. Компилятору разрешено самостоятельно выбирать размер в соответствии с > характеристиками аппаратуры и следующими ограничениями: числа типа short и int > должны иметь длину не менее 16 бит, long — не менее 32 бит; тип short должен быть > не длиннее int, a int — не длиннее long.
У меня, например, на x86 long идентичен int и переполнение в обоих случаях.
>>534390 >>534388 Как же раздражает гуглокапча. Пока нашел только способ, в котором надо считать одну строку и вычленить из нее елементы. Но я полагаю, должен же быть способ, как-нибудь считать два значения из одной строки? Пока делал так: fscanf ("%s[^:]%d", key, &value);
>>534390 fscanf - хуета для одноразового кода, парси вручную (strtok, strtol, strtod, все дела).
> fscanf ("%s[^:]%d", key, &value) Да, примерно так оно и делается. Только у тебя размер буфера не указан (что будет, если введешь больше, чем размер key?). Надо: "%размер[^:]: %d"
>>534418 >-Wconversion В примере >>534007 это не сработает, потому что там присваивается произведение переменных с типом int переменной с типом long. int может быть преобразован в long без потери информации, значит неявное преобразование не может испортить значение, т.е. предупреждение не выведется. Значение портит переполнение вызванное произведением переменных типа int. Чтобы этого не было, нужно один из операндов преобразовать в long.
>>534423 Если это единственный return, то лучше ничего не писать. А вообще, exit для других функций оставь, а в main лучше return (вопрос вкуса, реальной разницы нет).
Если я хочу выделить память для хранения строки, безопасней ли использовать calloc, в случае, если я могу как-нибудь пропустить '\0'? Или все равно, что использовать?
>>534445 Если ты можешь пропустить где-то \0, то и решай эту проблему - напиши раз и навсегда себе модуль для работы со строками, ну и внимательнее будь. А так, да, calloc может немного подстраховать. Но ты с таким же успехом можешь в длине на 1 ошибиться и затереть самый последний \0.
Есть ли какие-нибудь статьи или что-то вроде того о threads.h? Многопоточностью я еще не увлекался, а вот сейчас решил научится работать с ними. Даже не знаю с чего начать.
>>534703 Теперь я понял, почему мой компилятор жаловался на метки. Честно говоря, никогда не сталкивался с такой штукой и могу предположить только, что это. Надо будет и самому почитать про это. Интересно же.
>>534836 Ничего. Он не может работать. Память с кодом всегда read-only, сделать ее read-write тебе ос не позволит, да и вообще нахуя ты собрался опкоды на бред менять? Даже если ты их поменяешь, скорее всего получишь undefined instruction.
>>534836 книжку читай внимательнее, там в main вызывается makeCodeWritable(...). Наверняка выше было реализация этой функции. https://books.google.com.ua/books?id=mig-bH3u0Z0C&pg=PT292&lpg=PT292&dq=char+p%3D%26%26begin&source=bl&ots=b3rFht4xWo&sig=LT2URWU1FAe7He7XqrjamftX17A&hl=ru&sa=X&ved=0CCwQ6AEwAmoVChMI2v7Bs-XCxwIVJaZyCh1VTw__#v=onepage&q=char%20p%3D%26%26begin&f=false
У меня тут вопрос возник. Есть у меня есть два указателя. Первый указывает на строку а второй на произвольный участок(не инициализирован). Я могу сразу вызывать memcpy, чтобы скопировать строку в участок, на который указывает второй указатель? Или мне необходимо для нечала выделить память с помощью malloc?
>>538504 Вызывай функцию в цикле, устраивай цикл внутри функции, запускай в цикле функции, которые выполняют внутри себя цикл, внутри которого вызываются функции.
Дорогие байтоебы, вопрос по рынку (глобальному). Как за последние годы, по ощущениям, изменилось число вакансий, конкуренция? Когда Сишка пойдет ко дну, и пойдет ли вообще?
>>540099 Разве NAME_MAX тут это не максимальный возможный размер? А sizeof(struct inotify_event) + NAME_MAX + 1 его всегда будет превышать. Хотя это не важно.
Я, вероятно, хуйню скажу, но может из-за переменного размера (хотя он и конст...) компилятор разделяет строку "char buf[kMaxEvent] = "";" на char buf[kMaxEvent]; buf = ""; А присваивать так значение массиву нельзя, только при инициализации можно.
>>540107 >Разве NAME_MAX тут это не максимальный возможный размер? NAME_MAX - максимально возможный размер имени файла, а та структура состоит из имени файла и прочей лабуды
>>540112 >Можно же, их просто инициализировать нельзя. Похоже, что это правильный ответ. Даже в тривиальном случае:
>>540099 #define kMaxEvent sizeof(struct inotify_event) + NAME_MAX + 1; Энджой ер сишечка, в которой const - нихуя не конст и может меняться в рантайме.
Анон, что здесь происходит во второй строчке? Что означают эти две звездочки в данном контексте и какая вообще логика там реализуется? До указателей в K&R пока не дошел.
>>543930 Но он прав. Разве что покупать стандарт не обязательно. Ты ведь не разработчик компилятора, а хуй простой, так что последнего черновика (N1570) тебе вполне достаточно. Есть "21st Century C", её тут иногда советуют, но книжка на троечку. Если ты только учишь язык, найди книгу по C99, их дохуя, а потом просто посмотри список нововведений в С11.
>>544403 Так код, который не удовлетворяет стандартам - он говнокод и есть. Стандарты не из воздуха писались по крайней мере, бОльшая их часть. Множество примеров уязвимы к переполнению буфера, однобуквенные переменные, extern декларации внутри функции, implicit int, "лесенки" из вложенных for/if/while, вот это всё. Сейчас проглядел - оно лучше, чем я о нём думал. Видимо, на меня так кривой скан русского издания повлиял много лет назад. Но аргументы в силе: лучше брать что-нибудь менее протухшее.
>>544421 А вот с тобой не соглашусь. Пример для вложенного for адекватен (лучше бы туда return воткнуть, но это не всегда то, что нужно). Пример для goto cleanup - это вообще единственный способ сделать нормальную очистку без дублирования if (fp) fclose(fp) и if (obj) { free(obj->data); free(obj); } при каждой ошибке.
>>544427 >Так код, который не удовлетворяет стандартам - он говнокод и есть. Довольно странное определение. Если говорить о времени, когда была написана K&R, то код удовлетворял стандартам, а значит - не был говнокодом. Со временем стандарты поменялись, код остался тем же, но стал говнокодом. Выходит, что результат проверки, является ли код говнокодом, не постоянен во времени и зависит не от самого кода, а от того, какие на данный момент актуальны стандарты в языке.
>>544427 >Пример для вложенного for адекватен Не совсем, если fastjump ведёт не на завершение метода, а после него что-то ещё делается кроме очистки, это уже говнокод, а не fastjump.
>>544433 Ну вот у нас тут goto-срач намечается. Были времена, когда можно было себе позволить писать на бейсике лапшу из GOTO, приправляя её POKE с магическими числами, и это было нормально пока один теорехтетик не вскукарекнул про considered harmful. Теперь это однозначный говнокод.
Так и с K&R. Это было нормально, например, потому, что программу писало полтора человека, которые отлично знали и сам язык, и свой код. Это было нормально, когда программы не торчали переполняющимся буфером в интернет. А теперь у нас гитхаб, и надо писать так, чтобы понял мимохуй, который сишечку вообще не учил, а учил плюсы "за 24 часа". И желательно вдалбливать про безопасность не в послесловии, а при первом упоминании массива или указателя. И про signed/unsigned тоже. И про UB до кучи, а то компиляторы стали умные и делают то, что разрешено стандартом, а не то, что ожидает человек, прочитавший K&R.
>>544449 > Не совсем, если fastjump ведёт не на завершение метода Если бы это было завершение метода, то можно было бы сделать очистку и return прямо в for, а обычно хочется хотя бы, допустим, записать что-то в найденный элемент, что обычно и делается.
>>544461 >Ну вот у нас тут goto-срач намечается ... Теперь это однозначный говнокод. В низкоуровневом программировании на С оператор goto активно используется, это уже вроде 100500 раз перетирали. >компиляторы стали умные и делают то, что разрешено стандартом, а не то, что ожидает человек, прочитавший K&R Я не утверждаю, что код из K&R актуальный. Тот, кто изучает C по K&R, должен обязательно учитывать, что язык сильно поменялся с того времени. Но, извини, я всё ещё не могу считать исключительно по этой причине код, предложенный в той книге, говнокодом.
Тред не читал Для того, чтобы перевестись в другой универ, нужно за полгода хоть на каком-то уровне выучить С абсолютно очевидно потому, что у них этот курс есть, а у нас - нет.
Скачал Dev C++, но он пока не может обработать даже банальный хеллоуволд. Гугл говорит, это потому, что у меня windows 8.1, слишком новая система для MinGW. Я подозреваю, это ещё и потому, что система не простая, а 64-разрядная. Соответственно, вопрос - есть какие-то ещё среды работы с Pure C под 8.1, или стоит ебаться с Dev C++? Или вообще готовиться к анальной ебле с каким-нибудь древним Turbo C?
>>544554 Ставь CodeLite + TDN-MinGW 64 (можно и х86, но зачем?). Работает везде, на 10-ке в том числе. А вообще под винду удобнее в Visual Studio писать.
>>544554 >>544558 Вот двачую вижуал студию. Они в 2015 допилили поддержку современной сишечки до приемлемого уровня. Пару галочек уберёшь на тему ололо-safer-функций, и для новичка будет ок. Особенно если ты не смог MinGW поставить почему-то.
>>544497 > В низкоуровневом программировании на С оператор goto активно используется Ты код на бейсике, про который я говорю, не застал или забыл? То, как сейчас goto используется (даже в GCC-шном стиле с адресами меток), не идет ни в какое сравнение с тем, что было.
> Я не утверждаю, что код из K&R актуальный. > Тот, кто изучает C по K&R, должен обязательно учитывать Тот, кто изучает K&R не может этого учитывать. Он не знает, как правильно. Он не может делать скидку на возраст книги. Он язык только учит, он не может пока различать, хороший код тогда и хороший код сейчас. И после K&R ему приходится... ну не переучиваться, но ломать некоторые плохие привычки. Я не утверждаю, что K&R нужно выкинуть. Ее нужно почитать (задачки там, вся хуйня), но лучше бы, чтобы она не была первой книгой.
>>544566 >Ты код на бейсике, про который я говорю, не застал или забыл? Мы вроде о C говорим, не? Я лично с бейсиком вообще не сталкивался и особо не стремился. >Тот, кто изучает K&R не может этого учитывать. Он не знает, как правильно. Он не может делать скидку на возраст книги. Он язык только учит, он не может пока различать, хороший код тогда и хороший код сейчас. Ты крайне плохо думаешь о новичках. Я читал эту книгу, и я это всё учитывал. >но лучше бы, чтобы она не была первой книгой Поправлю, она не должна быть единственным источником информации о языке C. Но первой книгой может быть вполне, какой и была в моём случае.
Благодарю. >>544566 >не смог MinGW ну на этой версии Dev C++ уже стояла сравнительно новая версия, поэтому нужно было разбираться больше. Отсюда и вопрос - стоит ли ебаться
>>544566 >но лучше бы, чтобы она не была первой книгой Стиль кодирования от автора, мелкие буквы, где стоят знаки подчёркивания, пробелы и т.д. все дела.
>>544621 >ну на этой версии Dev C++ уже стояла сравнительно новая версия, поэтому нужно было разбираться больше. Отсюда и вопрос - стоит ли ебаться Если тебе принципиально нужно работать в кроссплатформенной IDE, то поебаться стоит. В итоге у тебя на разных машинах будет одинаковая среда разработки, что очень удобно. На винде 99% проблем с MinGW - это кривая переменная среды PATH. Dev C++ просто не видит компилятора или инклюды. Почитай внимательнее ошибки. Но если линукс не нужен, но ставь VS и просто забудь про эту еблю с MinGW.
>>544497 >>544566 Посоны, изучаю С по K&R. Планирую после обмазаться Linux Kernel Style Guide. Этого будет достаточно?
>>544585 >она не должна быть единственным источником информации о языке C Получается, что ты либо читаешь еще одну книгу параллельно/после (зачем тогда K&R? время не резиновое), либо гуглишь статьи и вопросы на SO - но, чтобы их гуглить, нужно уже знать, что ты хочешь найти.
Я так и не вразумею, когда прописываешь [code]int a = 10;[/code]
Программа где резервирует ~4 байта для переменной a? Я слыхал что в block scope, ну типа в самом файле сурс кода, но в другом случае я углядел что там немного хитровыебанно, и по какой-то там hex формуле что ли хранится чето такое, потом из memory как то выгребается
кто-нить может по-русски уже сказать
2. Как написать 10^10 но так, чтобы программа calculated это значение? А то приходится писать как 1 000 000 0000 чтобы работало и калькулировала.
>>544870 >зачем тогда K&R? Вот меня этот вопрос тоже волнует. Перекатываюсь на си и кресты с шарпа, и сразу встала проблема с литературой. Ну то есть хотелось бы найти некий относительно современный толмуд, куда можно было бы обращаться по необходимости, а не только SO шкурить. В шарпе это решается очень просто - кнопкой F1 плюс хелп постоянно обновляется, следуя за новыми фишками языка и это не говоря уже про StyleCop и Resharper. По крестам книг просто вагон, С++14 уже нормально расписан, поэтому тоже вопросов особо не возникает. А с си как-то всё печально. Не, у меня, конечно есть книга 1995 года,. но это как-то несерьёзно по-моему.
>>544885 Другой нуб вкатывается. Бородатые дядьки, поправляйте. 1. Короч, есть такие понятия как declaration, definition и initialization (сори, не знаю как definition перевести). Declaration - это дать знать компилятору о новой сущности, чтобы он мог искать ошибки с ее использованием (int a;). Definition - выделяет память под эту сущность (сюрприз! в С int a; одновременно и declaration, и definition). Initialization - заполнить выделенную память чем-то на твой выбор. (int a = 10; - все три действия сразу). Разницу между Declaration и Definition легче просмотреть с функциями: void a(); - declaration; void a() { return 0; } (с телом) - definition. Память под int a = 10; скорее всего выделена в стэке, кроме случая, если это написано вне функций - тогда в data segment. 2. Вроде в С нету такого оператора.
>>544885 1. Да забей ты на её местоположение, нахуя тебе знать, где она лежит? 2. Если компилятор не вычисляет, то либо функцию используй, либо вычисляй заранее.
char a = "abc"; (a + i) = 'z'; // i == 0; ожидание: "zbc"
И получил сегфолтом по лицу. Забегая наперед, я уже понял что "abc" это статическая строка прямо в бинарнике, который в памяти ридонли. Проблема в том, что я это понял, случайно связав воспомниания с SO и каких-то книг. До того, как меня стукнуло это осознание, я разглядывал core dump в gdb (думал что у меня a + i выскакивает) и ни к чему не пришел.
Вопрос: каков должен быть порядок действий в gdb или неважно где, чтобы дебаггинг меня провел по такому пути. Segfault at line 2 (это было) -> Segfault cause: Write to RO area -> The area = text segment (RO) ну и следующий из этого очевидный вывод, что a указывает на text segment.
В моем же случае было Segfault at line 2 -> долго смотрел на line 2 -> ДОГАДАЛСЯ))) -> a указывает на text segment. Хочу нормальный последовательный подход.
>>544885 > когда прописываешь int a = 10; > где резервирует ~4 байта для переменной a Есть два с половиной стула. Либо ты прописываешь это внутри функции, тогда переменная будет автоматической, место под нее выделится в стеке при входе в функцию, а при выходе переменная с точки зрения языка перестанет существовать. Либо ты пишешь снаружи функции (а также внутри функции, но с ключевым словом static), тогда место под переменную будет один раз отведено при компиляции, и она будет жить после загрузки программы до ее завершения на одном и том же месте.
> какой-то там hex формуле Поясни поподробнее. Может, тебе показывали код на асме для доступа к автоматической и статической переменной?
> Как написать 10^10 Ты можешь использовать scientific notation (1e10), но будь осторожнее. Во-первых, это значение на 32-битной системе влезет только в long long (в обычный unsigned long влезает только 4.2e9). Во-вторых, эта нотация определяет литералы с плавающей точкой (которые обрезаются до целого при присваивании к целочисленной переменной). Со всеми вытекающими последствиями в виде невозможности точно представить некоторые значения (хотя в double без потерь влезет всё, что тебе может пригодиться, лучше об этом помнить).
>>544896 > declaration, definition и initialization Что-то типа объявление, определение, инициализация.
> Хочу нормальный последовательный подход. Сегфолт может быть либо потому, что по адресу ничего не замаплено (решается раздумьями, откуда в программе взялся такой указатель), либо потому что память не читается (то же), либо не пишется (то же + тут как раз может быть read-only память). Можешь сделать readelf -l и/или info proc mem и т. п. в gdb.
>>544952 >Можешь сделать readelf -l и/или info proc mem и т. п. в gdb. Спасибо, readelf мне показался трудночитаемым, да выше дата сегмента ничего нет, а вот (gdb) info proc mappings (и pmap) - это находка.
>>544870 >зачем тогда K&R? время не резиновое Затем, что классика. Но, согласен, если ты хочешь побыстрей всё выучить и начать зарабатывать деньги, то да, можешь не читать. Эта книга больше интересна тем, кто любит язык C и хотел бы узнать о нём, как можно больше. >гуглишь статьи и вопросы на SO Тащемто есть ещё man, если ты работаешь в UNIX-like ОС. Для меня это достаточно исчерпывающий источник информации. Под виндой, по идее, тоже должен быть аналог.
>>544898 >Declaration - это дать знать компилятору о новой сущности, чтобы он мог искать ошибки с ее использованием ты делаешь declaration переменной, расположенной в другой единице трансляции, чтобы сделать возможной ее использование в этой единице трансляции компилятор же обрабатыват каждую единицу трансляции (по сути .c файл с кодом) по отдельности, формируя объектные obj файлы, далее линковщик все это собирает в исполняемый файл другое дело, что правила declaration разные, для переменных нужно дописывать extern, для функций пишешь прототипы, свои заморочки есть для структур - тут разрабы языка поступили, как и в других случаях - строгость, формальность языка была приведена в жертву удобству и краткости
>>545109 > правила declaration разные, для переменных нужно дописывать extern, для функций пишешь прототипы Для переменных не всегда обязателен extern. Но extern позволяет избежать лишних проблем. И для функций тоже можно extern, но это не решает никаких проблем, поэтому extern не пишут.
Есть один пример, выносящий мозг новичкам: 1.c: int foo[1]; void bar(void) { ++foo[0]; }
2.c: #include <stdio.h> int foo[16384]; int foo[16384]; int foo[16384];
Магия! extern нет, размерность разная, definition нет, но это почему то работает. Не отвечай. Мы-то с тобой знаем, где здесь что, как работает, и какие тут проблемы. Но дай анонам самим подумать.
>>545125 > Не отвечай. Мы-то с тобой знаем, где здесь что, как работает, и какие тут проблемы. Но дай анонам самим подумать. ох ебать, ну что за выебоны
>>545072 >Но, согласен, если ты хочешь побыстрей всё выучить и начать зарабатывать деньги, то да, можешь не читать. За живое задел. Я изучаю С УЖЕ отрезав время от других, более перспективных в отношении денег, вещей. И переутомление подсказывает, что совмещение всего мне пора заканчивать. С - самое интересное и, увы, самое низкоприоритетное из моих занятий, а время и силы в следующий раз где-то через год будут.
>>545125 >но это почему то работает > This is mentioned in the C standard in informative Annex J as a common extension: > > J.5.11 Multiple external definitions > > There may be more than one external definition for the identifier of an object, with or without the explicit use of the keyword extern; if the definitions disagree, or more than one is initialized, the behavior is undefined (6.9.2).
>>545109 >>545125 Тут следукт понимать, что кроме стандарта есть и реализация, произвольная. Например, IAR такой код проглатывает, но не проверяет сигнатуру функций.
А от extern функций тоже бывает польза. Вот я в текущем проекте ими реализовал своего рода интерфейс модуля расширения, и проверка его корректности съехала, таким образом, на линковщик.
Что за хуйню я читаю!? Это же пиздец ребята, я на Си не первый год сижу и никогда не заморачивался даже в самом битоёбском деле о такой хуйне, которая тут обсуждается. Впечатление такое, что здесь не Си изучается, а некая абстрактная хуета способная заглядывать в будущее. Зачем, зачем блядь заморачиваться над проблемой неоднозначно поставленой школьником для решения ведомых только ему, неформальных задач.
>>545311 А хуле ещё обсуждать? Не инжекты в процессы же, лол. Зато сверху вон привели классический пример, из-за которого Си люто ненавидим. Любой, сука, зстет может превратить код в нечитаемое и несопровождаемое говно. Что в мэйнстримных языках сделать несколько сложнее.
>>545274 Я и не говорил, что это хороший код. Я говорил, что этот код работает. > J.5.11 Фактически, про UB там написано потому, что в одном translation unit может быть int, а в другом float, и тогда это, конечно же, UB. Одинакового размера. А механизм, позволяющий код типа >>545125 был введен в свое время не потому что >>545109 > строгость, формальность языка была приведена в жертву удобству и краткости а потому что весь механизм заимствован и поддерживался для линковки с Fortran. И оно будет работать, потому что это де-факто стандарт и еще из-за того, что линкеру на стандарт сишечки похуй, что бы там комитет по этому поводу не думал. Хотя это и не повод так писать в наши дни.
>>545258 > С++ компилятор пошлёт тебя в жопу У нас тут про сишечку тредик, если ты не заметил. А в сишечке это полностью валидный код. Ну, пока типы/размеры совпадают, да.
>>545303 Не совсем понял, о чём ты. Функции и так extern. Их можно сделать static, но по умолчанию они extern.
задачка такова. есть ОП пик - на нем изображена оптопара. необходимо на любом доступном вам языке написать код осуществляющий инкремент и декремент переменной в зависимости от вращения колеса относительно оптопары.
так как было очень дахуя тупых школоты=тролей которые в глаза не видали мышку с шариком. оптопара это 2 расположенных максимально близко датчика излучения. колесо диск похуй как назовите можно сравнить с колесом обычного веласипеда со спицами ПРИ ЭТОМ известно, что расстояние между датчиками в опто паре МЕНЬШЕ чем толщина спицы. развадить электрически ничего ненадо. тое мы имеем 2 бита изменяющихся во времени - скорость обсчета заведомо больше на несколько порядков чем скорость реакции датчиков на внешнее возбуждение.
оп пик слегка изменен красным относительно колеса в масштабе показано соотношение окон датчиков и лепестков диска (спиц ебаного веласипеда)
в прошлом треде до конечной реализации так и не дошли( выдерну наиболее перспективнаи идеи.
>>545320 >Я и не говорил, что это хороший код. Я говорил, что этот код работает. В твоём конкретном случае работает. У кого-то это уже может не завестись. Для этого и существует понятие "неопределённое поведение". Например, если ты в 1.c сделаешь инициализацию
int foo[1] = { 1 };
то линковщик уже ругнётся.
>весь механизм заимствован и поддерживался для линковки с Fortran. И оно будет работать, потому что это де-факто стандарт и еще из-за того, что линкеру на стандарт сишечки похуй, что бы там комитет по этому поводу не думал. Было бы ещё интересней, если бы ты какие-нибудь ссылки приложил к своему заявлению, где о подобном говорится.
>>545324 Я несовсем понял задачу, но давай подумаем. Я так понимаю тебе нужно знать куда вращается колесо со спицами? Суть проста - чередование активации фотодиодов задаёт направление.
Вот тебе функция:
//это должны быть названия твоих диодов и их коды, физически их сопоставь как левый\правый или передний\задний или верхний\нижний, а код может быть любым значением.
>>545337 Она принимает код активного диода и возвращает 1 из трёх значений - левый\правый и NULL, нужный для колибровки направления. Хотя о его нужности можно и поспорить. Тогда функция примет ваще примитивный вид
Пожалуй нубский вопрос, не обессудьте: аргументы командной строки можно раздобыть где-то вне main? Про GetCommandLine знаю, однако ж требуется универсальность. Спасибо.
>>545677 Я думаю, это и так было очевидно. Можно и как аргументы передавать другим функциям. Но в каждом случае тебе нужно сделать какие-то манипуляции в main() для этого.
>>545845 Если у тебя нет контроля над main(), в чем проблема написать GetCommandLine и аналоги под каждую следующую платформу, которую необходимо поддерживать?
>>545489 обычно делают так: описывают структуру с полями где перечислены возможные аргументы, заводят глобальную переменную (зачастую сразу делают безымянную структуру), пишут функцию разбора - в нее прямо передается argc, argv, в этой функции происходит разбор и заполнение глобальной структуры таким образом, main не засоряется - функция разбора вызывается один раз в самом начале дальше уже пользуются данными из глобальной структуры, ну либо еще дописывают функции доступа и вызывают уже их, а не напрямую читают из структуры
>>544952 Вот спс! >Либо ты пишешь снаружи функции Ну по идее для базовых кодов, все всегда пишется внутри int main(), не? Я так и не совсем понял почему это так обязательно, тот же "printf("Hello, World!\n");" засовывать в main, почему без него то не работает? >Поясни поподробнее. Может, тебе показывали код на асме для доступа к автоматической и статической переменной? Ну наверное, это было на слайде, и там колонка была, типа программа резервирует память в этом месте и.т.д.
>>546185 > Ну по идее для базовых кодов, все всегда пишется внутри int main() Код да. А переменные можно делать глобальными (в пределах программы или только одного файла, причем последнее предпочтительнее). Ну, когда ты уверен, что это необходимо.
> засовывать в main, почему без него то не работает? Так задумано. Код программы описывается функциями, выполнение программы начинается с функции main() и заканчивается после выхода из неё. Код вне функций никому не нужен, но можешь подумать, что было бы, если бы тебе разрешили так писать: ты линкуешь программу из двух файлов, в обоих код вне функций, какой из двух файлов должен выполниться первым? В плюсах есть такая проблема. Там у глобальных объектов конструкторы вызываются до main(). В случайном порядке.
>>545492 >>545677 >>545898 Спасибо всем. Доступа к main нет от слова совсем просто. Странно что полно дряни типа errno, а argv, которые актуальны на всём протяжении работы, для любого потока в переменную не вынесены. Ну да и черт с ним.
>>546239 >Странно что полно дряни типа errno, а argv, которые актуальны на всём протяжении работы, для любого потока в переменную не вынесены. Я думаю, это связано с тем, что размер argv непредсказуем.
>>546278 Хотя я сейчас подумал, что если учитывать, что argv, argc будут лежать на стеке main() на протяжении всей работы программы, то фактически не нужно их куда-то копировать в кучу. Тащемто действительно странно, что не продумали глобальный доступ к ним by design. Может, кто из местных анонов пояснит, почему так сделали.
>>546292 >argv, argc будут лежать на стеке main Лежать будут указатели на них. А вообще командная строка хранится в process environment block (PEB) которые создается системой при старте нового процесса. PEB кладется куда-то в адресное пространство процесса, в отличие от остальных структур процесса, что прячутся в адресное пространство системы. Это для винды, под юниксами делается как-то похоже скорей всего. Забирать агрументы командной строки можно еще и функцией GetCommandLine. Но тебе это знать не нужно, тк ты слишком маленький еще.
>>546343 > Забирать агрументы командной строки можно еще и функцией GetCommandLine. > Но тебе это знать не нужно, тк ты слишком маленький еще. Откуда в треде столько ЧСВшных уёбков? Про GetCommandLine ещё было сказано в сообщении, с которого началось обсуждение этой проблемы >>545489
>>546343 > Лежать будут указатели на них. Почему это? Будут лежать именно argc и argv. На x86 на любой ос их даже найти там можно без проблем (если main не модифицировала).
> А вообще командная строка хранится в process environment block Скорее в _PEB.ProcessParameters, но тебе это знать не нужно, тк ты слишком маленький еще.
>>546411 да дети да я пишу код еще под архитектуру ебаных конца восьмидесятых. мне предлогает атмел я его нахуй шлю с его удобностью и сраными 3-5 мегагерцами. тупым подсчетом реакции на прерывание мы видим что нас жестоко хотят наебать. да проще да ненужен програматор да архитектура "ЗАТОЧЕННА ПОД С" НО я на своем разогнаном ВИЖУ на порядок больше чем ты на сваих сраных 10 мегагерцах. а если ты код неумееш писать кто тебе в этом виноват?. мы имеем тоже что и вы да у нас нет встроенной флеши но кто мешает ее подключить? написать код - размять сваи мазги поиграть в угодайку погуглить даташиты всю хуйню.
кстати электронщики не стоит использувать ету поебалу китайскую жидкай силикон для конечных устройств. как правило все идет на скрутках или на пайке. эта смола меня раз пиздец как подъхебла смантировал ну и думаю пачистю пайку бянзинчиком ОГА - ЭТА ХУЙНЯ РАСТВОРЯЕТСЯ в бянзинчиге. и термоусадка в гавно превратилась... плак плак. девайс надо переделывать(
>>546372 То не я, уже пояснили. Мне-то просто знать наверняка надо было. Я фана ради конпелятор теперь уже транслятор осилить пытаюсь, вот и использую в качестве "универсального ассемблера". Собственно и думал, не используя волшебных имён, подобно питону совместить тело програмы с блоком инициализации верхнего модуля и вынеся аргументы и прочее в отдельный модуль. Вобщем-то и так можно проинициализировать их из main, однако лишь для полностью подконтрольного приложения, не библиотеки например.
Окей, сосоны. Поясните мне за такую хуйню. Я не буду говорить о том, что может я дебил, скажу так. Я дебил и не понимаю, какого хуя, чтобы изучить стандарт С11, на котором считается, что я должен писать, я должен платить бабки блядь? Какого хуя? Это такая же хуйня как JPEG 2000. Они тоже требуют бабки за спецификации. Какого хуя? Что за на хуй хуйня? Как изучать С11 при таком раскладе? Может K&R новое издание вышло с изменениями. Просто это вообще пиздос полнейший. Я бы вообще не возникал, если бы сейчас на венде сидел, там меня масм устраивал, но бля... На прыщах нужно как-то адаптироваться к новым стандартам и все такое. Или не надо?
>>518732 Го свой напишем? Ну типа WxWidgets только для сишки и более аккуратный/интуитивно понятный. Сделаем кашерный ученик по нему и плюсофаги соснут хуйца, т.к. весь мир перейдет на сишку, кек.
>>547721 Есть TR, там всё то же, но бесплатно. Тебе хватит. Если у тебя какие-то проблемы с этим, можешь на K&R/C89 писать - многие так и делают, фанатично искореняя всякие C99измы, какой уж тут C11.
>>548019 А ты вычти введение про environment (там, в основном для разработчиков ОС и компиляторов), описание стандартной библиотеки (если уже учил Си, там не так много функций добавилось), приложения (проглядеть по диагонали или вообще не читать), и из 700 останется 150 страниц про язык. Хотя учить язык по спеке - это максимум мазохизм, конечно.
>>548866 Если байтоёбишь просто потому что ты дохуя 1337, то чтоб выебнуться. Если для performance, то а как ещё-то? Конпелятор же не знает, какие у тебя данные, как они поступают и т.д. Да и в общем случае не всегда оптимально оптимизирует.
>>548866 Как ты без ассемблера напишешь полностью ядро ОС??? Нет у меня конечно получилось 1 раз, но это было только благодаря создателям тулчейна, которые сделали так, что все само сохранялось и восстанавливалось, и предоставили интринсики для работы с указателем стека...
>>548866 Для общего развития, лол. 1) Сложный дебаг, дебаг чужого блоба, реверсинг. 2) Понимание, в какие примерно инструкции соберется код, помогает понять, как делать не надо (например, почему на этой конкретной системе исключения пиздец медленные, на этой часто можно пренебречь выравниванием, вот в той big-endian, и если ты хочешь совместимости, изволь ебать байтики, а вот та - вообще DSP с 24-битными словами, иди ищи пидараса, который к размеру int привязался). 3) Ну, и если у тебя сколько-нибудь критичный к скорости код, то ты рано или поздно придешь к Intel VTune Amplifier (или аналогу), а там без знания архитектуры никуда.
>>548866 >нахуя знать тыщщщу архитектур Я не думаю, что кто-то реально шарит в большом количестве архитектур. Обычно на какой-то одной специализируются, разве нет? >Какая нахуй разница: ARM, AVR, MIPS, x86? DA TI OHUEL
Си-нуб(Недавно закончил чтение C&R) просит помощи. Есть ли возможность реализовать в маздайной консольке цвитные строки, так, чтобы без особых костылей и надстроек над самой консолькой?
Накидайте что ли гитхабовских проектов на С, что бы можно было поковырять, да набраться уму-разуму. Желательно не что то крупное в котором можно утонуть.
Поцоны, может кто силен в C и SYSV Shared memory одновременно? Вобщем смысл в том, что нужно создать сегмент с заранее заданым shmid, а не рандомным, как делает функция shmid(). Далее аттач уже работает, и все хорошо.
Или подскажите, как такие сегменты создавать, чтобы id=0, 1, итд было, а не рандомное uint32_t число? ~ # ipcs -m
>>553784 Ну, проблема немного шире: я пишу интерфейс к махровой проприетарщине, которая работает через shm, так вот в качестве shmid там может быть число от 1 до 16, и оно жестко зашито во всех программах в этом комплексе. И вот каким-то образом оригинальный интерфейс управления создает сегмент shmid с id равным 0-16, в то время, как функция shmid из uclibc (а эти программы тоже на uclibc писаны) возвращает совсем не те значения.
>>553788 Key мне никак не поможет. Видишь листинг ipcs? Там key=0, а если я сделаю shmid с таким key, то он вернет совсем не 0, а функцию от этого key с результатом ближе к концу uint32_t.
Вообще, полное задание имеет вид "скопировать shmid 0 в shmid 1", при этом shmid=1 не существует, т.е. его надо как-то создать.
>>554019 Да, пробовал IDA на этих утилитах, но постиг неудачу: архитектура MIPS, а для нее нет hex-rays decompiler, и вообще многих штук, которые бы повысили читаемость кода до того уровня, чтобы я осилил листинг.
>>554019 Ка грустно быть тобой! Начнем с того, что стандарт posix определяет только api, соответственно нет переносимого надежного способа заставить shmget сгенерировать тебе сегмент памяти с id из определенного диапазона. То есть в этой твоей пипиетарщине используют грязный хак с системными вызовами в обход uclibc. И самое хуевое, что после обновления Ядра может перестать работать сама пипиетарщина.
>>554084 Непереносимый код мне и не нужен, учитывая то, что эта проприетарщина также никуда перенесена быть не может. Вот только я не понял, как там этот shmget дергает системные вызовы? в системный вызов ведь также передается и key, т.е. получается там ядро хакнуто?
вот код uclibc: int shmget (key_t key, size_t size, int shmflg) { return __syscall_ipc(IPCOP_shmget, key, size, shmflg, NULL, 0); }
>>554178 Не могу, я их выдумал. Если тебе нужно проверять границы - проверяй их при каждом доступе. Чтобы не забыть о проверке случайно, оберни доступ к массиву в функцию.
Аноны, помогите начинающему. Есть допустим stdio.h, там прописана декларация функций и прочая-прочая. Остальное где? Откуда сами функции берутся? Как это всё происходит?
>>554397 У линуса на гитхабе это все тоже есть. И да smid <= 16 это колдунство то еще, такое впечатление, что эти куски памяти создаются в самом начале работы ядра.
А то, что программа как-то использует именно их - это все быдлокодерство и грязные хаки...
>>554397 Да, там 2.6.30, я естественно с оглядкой на это ядро делаю.
>>554401 Да, сейчас попробовал: если не создано вообще ни одного shm-сегмента, то shmid первым создает сегмент 0, а вот уже второй сегмент создается с большим ID. Теперь пытаюсь выяснить: то ли сегменты <16 все-таки можно создать, то ли создатели этого дела ебанутые, и остальные 15 никогда там не работали и не проверялись.
Получается, создать их все-таки можно, но не в текущем ядре, на котором крутится система. т.к. по дефолту SEQ_MULTIPLIER = 32768, и соответственно, создаются сегменты с 32768*номер сегмента + id сегмента. Итого, единственные вариант, где номера сегментов будут нужные: SEQ_MULTIPLIER = [0-15]. Теперь ищу в ядре, где это значение записано, и поменяю бинарно (а ядро тоже блобом, патчей, который накатил создатель этого дерьма - также нет).
Если ты меняешь SEQ_MULTIPLIER, то у тебя пропадает история версий этого твоего сегмента, то есть ты не сможешь отличить текущий сегмент, от того, который когда-то давно освободили.
Походу, твои быдлокодеры считают, что сегменты создаются в самом начале работы...
>>554450 Могу только сказать, что оно никогда не освобождается при работе, там даже перезапуск сервисов не предусмотрен. Возможно этот юзерспейс писался для какого-нибдуь старого ядра, или для ядра с таким патчем: http://www.programdoc.com/1272_129170_1.htm Но я проверил, патч в ядро не брали, и в том ядрес, на котором все это работает, такого нет.
>>554456 > должно сработать, ибо похоже, для сегментов история не проверяется в ядре...
Не сработало: если таким образом модифицировать key, то id выдается тот же самый, ничего не меняется. Если модифицировать id, то shmat (dst): Identifier removed Т.е. зааттачиться к сегменту не выходит.
>>554460 >shmat (dst): Identifier removed Ну тогда придется патчить ядро, проследи все зависимости от SEQ_MULTIPLIER, и поправь их так, чтобы не было зависимости от версии.
>>554374 А сами функции линкер берет из библиотек (.a, .lib) - там хранится набор уже скомпилированных в объектные файлы функций (статическая библиотека) или указания, в какую .so/.dll обратиться за этими функциями при запуске (динамическая библиотека). Одна из библиотек называется CRT (C runtime library) и цепляется автоматически, поэтому от тебя никаких телодвижений не требуется.
>>554477 Вот я включаю заголовок либы в свой файл, по скобкам или кавычкам определяется локальный заголовок или нет. Потом что происходит? В заголовке не прописано ничего, только определение функций в данном случае.
>>554488 Дальше у линковщика есть список дефолтных путей, в которых он ищет функции в библиотеках,которые там лежат, если нашел - добавил функцию в экзешник, если не нашел - будет ошибка.
>>554477 > Вот я включаю заголовок либы в свой файл, по скобкам или кавычкам определяется локальный заголовок или нет. Никакой разницы, системный это заголовок или твой. И даже заголовок ли это вообще (ты с тем же успехом можешь декларировать функции сам). Когда ты декларируешь, но не определяешь функцию или глобальную переменную, компилятор помещает в объектный файл имя (символ), помеченное как extern. Типы либо кодируются прямо в это имя (в С++, гугли name mangling), либо теряются (в С в лучшем случае в символ попадает общий размер аргументов функции). На этом работа компилятора заканчивается, и в дело вступает линкер. У него перечислены объектные файлы (то, во что скомпилировалась программа), а затем библиотеки (дефолтная, плюс указанные тобой). Линкер пытается для кажого extern (не определённого, внешнего) символа найти объектный файл, где определён символ с таким же именем (public символ). Т.е., он связывает, допустим, обращение к fopen из твоего объектного файла с тем объектным файлом, где лежит fopen. Поэтому он и называется линкер ("редактор связей" в старой русскоязычной литературе). Если символ не был найден в объектных файлах, линкер идёт по списку библиотек (в том порядке, в котором они указаны). Когда он находит символ в одной из библиотек, он "достаёт" из библиотеки соответствующий объектный файл и добавляет его к списку объектных файлов, участвующих в сборке. Этот процесс повторяется, пока линкер не разрешит все extern-символы, или пока не закончатся библиотеки в списке. В первом случае линкер пойдёт компоновать исполняемый файл, а во втором он скажет "undefined reference to _some_name".
>>554531 Блин, даже не знаю, как тебе благодарность выразить, настолько четко и ясно объяснил. Ебану вискаря за твое здоровье. Спасибо огроменное! Двач-помогач!
>>554558 Ты объявил указатель s в main, но: ты не инициализировал этот указатель, и в результате getchars пишет введённый текст в случайное место памяти (чаще всего в стеке). Поэтому программа падает. Чтобы прочитать строку, тебе нужно выделить под неё буфер. Например, так: char s[MAXLINE]; или ты можешь использовать malloc().
>>554646 Ты вконец охуел. Хотя бы вопрос сюда скопировал!
> Как узнать, сколько вордов занимает функция Никак это не проделать в общем случае. Ты можешь пропарсить объектники или отладочную информацию, отсортировать и посчитать размеры но по ссылке совершенно справедливо пояснили за инлайн. Или можешь собирать без оптимизаций или с оптимизациями, но контролируя каждый билд дизассемблером и надеяться на то, что компилятор не меняет порядок функций. Но проще всего вынести всё необходимое тебе в .dll и посчитать хэш сразу всей кодовой секции.
>>554673 Алсо, добавлю, что Visual Studio уже достаточно давно увлекается неполным склеиванием функций, превращая код в страшную лапшу, когда адрес конца функции меньше адреса её начала. Так что нужно очень внимательно смотреть за оптимизациями и прочим LTCG.
>>554677 Книгу покажи. Алсо, по стандарту Си ты вообще не можешь никак читать код функций (нельзя конвертировать указатель на функцию в указатель на данные любого типа, даже в указатель на void и то нельзя).
>>554686 А. Ну смотри, раз ты в это лезешь, ты должен быть готов мириться со всем этим говном. В книге гцц, в гцц можно брать адреса меток lecture1.pdf, страница 31, например - разница между двумя адресами даст тебе приблизительный размер функции. Иногда, лол. Когда-нибудь ты будешь делать "правильно", а пока просто собирай с -O0
>>554696 Пиздец, нахуй тогда нужна такая защита, которая работает только иногда? Там еще дальше показывается, как шифруется секция кода от метки до метки, и выходит, что точно так же метки дадут только приблизительные границы шифруемого кода? Ебаное говно, нахуй это нужно вообще?
>>556101 Если ты будешь делать в реальности что-то защищать, ты можешь, например, взять свой объектный файл с защищаемым кодом и посмотреть/посчитать в дизассемблере точную длину функции. Или пропарсить объектный файл, отсортировать символы и считать функцией все байты до следующего символа. Если же ты шифруешь секцию целиком, ты можешь просто распарсить заголовки исполняемого файла, там будут точные размеры и офсеты секций - их загрузчик использует. Ещё протекторы делают макросы для программиста с _emit (http://stackoverflow.com/questions/731428/what-is-the-equivalent-of-emit-on-linux) последовательностей магических байтов в нужных местах функции, протектор их ищет в бинарнике и заменяет эти последовательности и код между ними на шифрованный эквивалент. Например, https://www.google.com/search?q=макросы%20themida
А где можно посмотреть на различные коды написанные на C? Есть ли сайт где можно сортировать списки кодов по просмотрам, фаворитам, дате? Мне было бы интересно полюбоваться различными интересными кодами (с комментариями естественно), ну например код в котором все слова переводятся в верхний регистр (uppercase).
И кстати, может кто-нить подсказать, где все программеры тусуются? Ну на каком сайте/irc канале? русскоязычный/англоязычный а то я только про канал #C на freenodes знаю
>>554680 Что то мне кажется ты немножечко пиздишь. Хоть я и не пытался прочесть из оперативной памяти код программы, но точно знаю, что имея указатель, любые данные на которые он указывает, можно обрабатывать как данные того типа, в котором ты хочешь их видеть. В конце концов, стандарт Си распространяется скорее всего только на компилятор, что не мешает присвоить адрес функции указателю на данные так же легко, как присвоить значение переменной. Совсем другое дело, если ограничения ОС по работе с оперативной памятью будут мешать прочесть данные по указателю, но даже чисто теоретически - функция в одном процессе с программой, а значит должна быть в одном адресном пространстве и может быть как минимум прочтена, а как максимум скопирована куда нибудь и исполнена.
>>556729 Я не знаю, как устроены ограничения по работе с оперативкой, однако если их нет по отношению к изучаемой функции, то есть уйма способов вытянуть адреса начала и конца функции и самый простой - найти сигнатуру соответствующую команде jmp на адрес команды исполняемой после вызывающей функции.
>>556729 > Что то мне кажется ты немножечко пиздишь Я говорил ПО СТАНДАРТУ (преобразование указателей на данные в указатели на функции упоминается в Common Extensions, но это не портабельно).
>>556742 >найти сигнатуру соответствующую команде jmp Существует как минимум три способа вернуть управление на x86 и ещё десяток других на других архитектурах. При этом они все могут применяться в одной и той же функции, т.к., return может быть несколько, да и компилятор может парочку своих воткнуть.
>>556746 >При этом они все могут применяться в одной и той же функции, т.к., return может быть несколько, да и компилятор может парочку своих воткнуть.
Ананасы, недавно решил начать учить Си самостоятельно, но чую, что не хватает практики с алгоритмами. Посоветуйте какую-нибудь книжку, где упор делается именно на составление красивых алгоритмов.
>>559428 > мб кто подскажет почему > заполняются одними и теми же элементам Из куска кода непонятно, чего ты хочешь добиться, и что вообще здесь происходит.
1) В case 10 дублируется условие. 2) mass2[i - 5] будет писать вне массива при flag != 0 && i < 5. flag точно инициализируется 0? 3) В default не хватает break (не критично, пока ты еще case не добавишь в конец). 4) Если Inter() будет выдавать последовательность 1 1 1 1 1 10 2 2 2 2 2 12, ты заполнишь массивы разными элементами. Хуй знает, что тебе не нравится. 5) Перепиши это говно.
prime numberАноним16/10/15 Птн 10:11:49#477№559535
Хочу попросить помощи для студента-первокурсника, чтобы добрые аноны помогли разобраться в постейших лабараторных на си. Хочу очень во всем этом разобраться. Мои контакты: [email protected]
Привет, погроммач, я тоже первокур, который мало чего понимает. Помогите мне, пожалуйста, разобраться с самым простым. Нужно разобраться, как работают циклы (особенно те, што считают суммы квадратов чисел, считают всякую тригонометрию) и массивы; и как, сопсно, обозначать и правильно использовать переменные, как подбирать нужные к ним действия. Лучше по скайпику линк: "gnwoerk", штобы тут не засорять. Надеюсь на доброту анона.
>>518562 (OP) Приветствую вас. Ни у кого случайно не завалялась реализация фибонначиевых куч на си? Был бы ультра благодарен за подгон. lonelypath[at]yandex.ru если что. Всем счастья.
>>570133 Если тебе жизненно необходимо точное представление, изобрети свой fixed-point и храни тысячные в целочисленной переменной (т.е., например, не метры с плавающей точкой, а миллиметры без нее).
>>570142 floor округляет вниз (1.23 -> 1, 1.9 -> 1). Есть еще round, который округляет как в школе (1.23 -> 1, 1.9 -> 2) и ceil который округляет вверх (1.23 -> 2, 1.9 -> 2).
Тебе нужно оставить тысячные доли, а остальное отбросить. Ты умножаешь число на тысячу, "перемещая" эти нужные тебе разряды из дробной в целочисленную часть (2.982001*1000 -> 2982.001) и отбрасываешь оставшуюся дробную часть (floor(2982.001) -> 2982.0). После этого ты возвращаешь разряды обратно в дробную часть, разделив результат на 1000 (2982.0 / 1000 = 2.982).
> если мне надо до 10000сячных Значит на 10000 и умножаешь/делишь. Это арифметика школьная, куда точку поставить.
Есть живые? Объясните нубу как пользоваться pipe. Вот есть у меня легендарный процесс A и его дочерний популярный процесс B, я ввожу некие данные в A, но мне нужно передать их в B, обработать их там и вернуть результат в A, как это провернуть?
>>572109 >зрозумить Одни хохлы, блядь. И под кроватью хохлы. Вы всегда были или набижали после скачек? Не замечал вас до 2013 года в русскоязычном сегменте интернета. Даже вконтакте вас особо заметно не было.
>>572379 Ну я просто учусь пока, процессов 2 (про дочерний я напутал чутка): запускаю процесс (программу), ввожу туда пачку значений (пускай будет 2, не суть важно наверное), запускается второй процесс через execl, который по pipe должен получить эти значения, обсчитать и вывести результат. Находятся они на одной машине, до сетей пока еще не дошел. >>572391 Мань, заспокойся, руssкий я, руssкий.
Хочу программировать под микроконтроллеры и байтоебить. Подкиньте хорошей литературы. И еще интересно, является ли знание сабжа, на достаточном уровне, так сказать плюсом в карму, при устройстве на работу. Алсо, большой роли плюсы в карму не играют, больше для себя собираюсь этим заниматься.