Этого треда уже нет.
Это копия, сохраненная 26 ноября 2015 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
39 Кб, 400x512
Коданы, может я пиздоглазый, но не заметил треда про Си не плюсы или решетка, а чистый си
Хочу программировать под микроконтроллеры и байтоебить. Подкиньте хорошей литературы. И еще интересно, является ли знание сабжа, на достаточном уровне, так сказать плюсом в карму, при устройстве на работу. Алсо, большой роли плюсы в карму не играют, больше для себя собираюсь этим заниматься.
#2 #518572
Они емнип когда-то были, но не взлетели. В принципе, крестотред уже и так наполовину забит байтоебством, в прошлом вон вообще асм был, так что почти рилейтед и можно спрашивать там. Но если ты возьмешься за поддержание отдельного, будет здорово.
#3 #518635
win в /pr/ не обсуждают, вот и весь сказ.
#4 #518660
Вот насчет кармы это ты очень верно сказал
Си - это печать на всю жизнь
Освоил c#, python, erlang, haskell, go
А работа все равно уже 16 лет находится только на си и иногда на крестах
Все это мое "саморазвитие" нахуй никому не нужно
Прям хоть профессию меняй
40 Кб, 360x360
#5 #518704
>>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 радикально не становятся.
#6 #518708
А что, еще остались контроллеры без крестов?
#8 #518720
C (няшная сишка) - самый простой и убогий язык из тех, что используются на практике. Более убогий - только брейнфак. Единственное выразительное средство - копипаст, для автоматизации которого есть даже специальный второй язык-препроцессор. Делает решение любой задачи нетривиальным, так что его решение задач с его помощью может требовать высокой квалификации. Тем не менее, типичная няшаблядь ничего не знает и не умеет. Даже дибиловатый обгвидок знает, помимо гвидопыха, еще и сишку, но сишкаблядь не знает ничего кроме нее. Языком владеют почти все, но только няшаблядь этим знанием гордится, остальные стыдливо скрывают. Также няшаблядь может ошибочно считать что знает C++ или несуществующий язык C/C++. Благодаря C компьютерные программы - самое ненадежное из всего созданного человеком.
215 Кб, 468x500
#9 #518728
>>518720

> Благодаря C компьютерные программы - самое ненадежное из всего созданного человеком.

#10 #518731
>>518712
Да что не так с жтк? Мне хоть один кутепидор может уже прояснить или нет?
#11 #518732
>>518731
Gtk - самый лучший оконный фреймворк для C.
Потому что других нет.
#12 #518734
>>518731

> Да что не так с жтк?


Оно не написано на смолтоке.
#13 #518740
Указывать сиблядям на проблемы языка бесполезно. Кроме сишки сиблядь нихуя не знает и не умеет, а на любое обвинение у сибляди есть универсальный ответ - "криворукость". Этим сиблядь как-бы намекает, что что все вокруг криворуки - т.е. сотрудники микрософта и интеля, пишущие кривые драйвера и библиотеки, прыщебляди, пишущие дырявое ведро своей системы вот уже не первый десяток лет, просто другие сибляди из соседнего подвала полусвовковой шаражки, в которой сиблядь работает. А вот сама сиблядь - сука граф Шарль Ожье де Бац де Кастельмор д’Артаньян среди педерастов, владеющий техникой левитации, предсказания будущего и написания небыдлокода на сишке. К сожалению, простым смертным едва ли не удастся увидеть творения сенсея, так и будут они работать с глючным говном криворуких интелевских и микросовтовских инжеренов, внезапно падающим от какого-нибудь buffer overflow, несмотря на зиллионы человекочасов, проёбанных на его тестирование и отладку.
93 Кб, 720x499
#14 #518744
Идут года, сохнут глотки евангелистов, но на настоящий день не существует языка, который позволяет быстро писать быстрые и портабельные программы, за исключением няшной сишки. Без RTL-то ниосиливается.

У крестов был шанс, но шиза строструпа, мэнглинг и RTL-то все равно есть, а значит ее надо портировать. Это может быть и ок, быстрые программы писать можно, но быстро их писать уже нельзя.
19 Кб, 388x257
17 Кб, 485x424
38 Кб, 1680x1260
#15 #518754
>>518744

> Идут года, сохнут глотки евангелистов, но на настоящий день не существует языка, который позволяет быстро писать быстрые и портабельные программы, за исключением няшной сишки



> Кроме сишки сиблядь нихуя не знает и не умеет

15 Кб, 200x221
#16 #518756
Ну и Фортран еще, хотя это и говно мамонта.
40 Кб, 604x601
Аноним #17 #518760
>>518754

> 1. forth


> сейчас сейчас, еще неделю, я форт-систему уже почти совсем дописал


> 2. виртоговно


> сейчас сейчас, еще недельку, я собиратель мусора на стеке допишу


> 3. петухан-куриханыч


этот язык пока да, не знаю и не умею. У него есть библиотека времени выполнения
#18 #518762
>>518760

> У него есть библиотека времени выполнения


Надо полагать, сишные printf и malloc являются инструкциями процессора?
Аноним #19 #518763
http://www.reddit.com/r/rust/comments/2lfbk3/help_me_understand_why_rust_binaries_are_so_large/
Собственно, хит эрат демонстрандум. Roost не смог стать еще толще и вытек из треда.
Аноним #20 #518765
>>518762

> Надо полагать, сишные printf и malloc являются инструкциями процессора?


Это СТАНДАРТНАЯ БИБЛИОТЕКА языка Си, но не библиотека времени выполнения. Программу без стандартной библиотеки написать на языке программирования можно, без RTL нет.
#21 #518767
>>518763

> 2015


> считать размер бинарника

#22 #518768
>>518767

>2015


>Хеллоуворлд на мегабайт

Аноним #23 #518769
>>518763
ОСТАНОВКА
Петухан таки в деле, даже как-то удивительно.
http://www.reddit.com/r/rust/comments/2iwtjh/151byte_static_binary_for_x8664_linux_in_rust/
Кстати где-то там еще годебилы на хабре были, правда они изящнее поступили и просто не стали писать сборщик мусора, объявив его НЕ НУЖНЫМ.
#24 #518770
>>518765

> CRT (C Runtime Library)


> не библиотека времени выполнения

Аноним #25 #518771
>>518770
Ах ты гад, так это ты как раз та самая мифическая сиблядь, которая погрузила братюню в пучины отчаяния, заставив высрать очередную копипасту?
#26 #518775
>>518771
Я шарпогосподин.
73 Кб, 507x623
Аноним #27 #518787
>>518775
Тогда не знаю, поймешь ты или нет, но вот. Видишь, нет библиотеки времени выполнения, маллоков и принтфов.
#28 #518830
>>518731

>Да что не так с жтк?


Третья версия, например.
#29 #518831
>>518744

>мэнглинг и RTL-то все равно есть


Мэнглинг не мешает, а без стдлибы вполне можно обойтись, так очень многие делают. На самом деле и без libc вполне можно жить - все равно обычно или при инициализации память берешь сколько нужно, или постраничными кусками. Так что без разницы, маллок дергать или сисколл. Работа с файлами через простенькую обертку, а больше ничего и не нужно по большому счету.
#30 #518836
>>518830
Тебе не нравится цифра три?
#31 #518840
>>518831
Удвою этого господина

>при инициализации память берешь сколько нужно, или постраничными кусками


На рубеже нулевых делали некий проект под freebsd
Быстро выяснилось, что стандартный malloc не использовал повторно освобожденные блоки
Короче в итоге так и обошлись - при старте делали sbrk на сконфигурированное значение, а управление кучей свое
#32 #518841
>>518836
Мне не нравится, что гтк теперь практически гномолиба.
#33 #518896
>>518841
Понятно. Очередные религиозные прыщефобии.
#34 #519018
Почему в /зк всегда тонут (или же вообще не создаются) треды о языках программирования, которые мне интересны? Хочу чтоб был C-тред, Ada-тред и, может быть, Rust-тред. Ведь такой тип языков – это самые охуенные языки программирования же.
#35 #519025
>>519018

> самые охуенные языки программирования


> байтоебское дерьмецо, осваиваемое за 2 дня


Посмотри го-тред к примеру. Обсуждать тупую элементарную парашу смысла нет, поэтому обсуждают Илюшу.
#36 #519027
>>519025

> осваиваемое за 2 дня


> подразумевая, что хаскель осваивать дольше

#37 #519033
>>519025
Ada - элементарный язык? Ты ебанулся? Можно придумать и посложнее, конечно, но элементарным я бы не назвал.
Что касается C, то тут я тоже не согласен. Сам язык минимален, но для того, чтобы научиться писать на C надежный и легко поддерживаемый код, нужно времени побольше, чем 2 дня. И если в C нет "поддержки" ООП или ещё каких-то там возможностей в виде ключевых слов, то это не значит, что всего этого нет совсем, тебе точно также, как и с другими языками, нужно разобраться как на C правильно реализуются дженерики, рантайм полиморфизм и прочее. Зато простота и минималистичность самого языка дает преимущество в том плане, что сишный код всегда однозначно понятен, что сильно упрощает изучение чужого исходного кода.
#38 #519048

>чтобы научиться писать на C надежный и легко поддерживаемый код, нужно времени побольше, чем 2 дня


Ясен хуй - он ведь для этого не предназначен. Можно и ложкой бассейн вычерпать больше чем за 2 дня.

>как на C правильно реализуются дженерики, рантайм полиморфизм и прочее


Через нечитаемые костыли. Плавали - знаем.

>сишный код всегда однозначно понятен


Троллинг_ор_джаст_ступид.жпг
#39 #519066
>>519048

>Ясен хуй - он ведь для этого не предназначен. Можно и ложкой бассейн вычерпать больше чем за 2 дня.


Суть в том, что на C научиться писать надежный и поддерживаемый код таки можно (см. успешные ОС), а такой же производительный на каком-нибудь хачкелле – нет.

>Через нечитаемые костыли. Плавали - знаем.


Нечитаемые костыли в C получаются, когда на него пытаются искусственно навесить слишком толстый слой абстракций, которого там не должно быть. Если рассматривать задачу всегда с практической точки зрения (то есть цель – то, как должна в итоге работать программа), то окажется, что все необходимое на C отлично реализуется, и не более многословно, чем в какой-нибудь джаве.

>>сишный код всегда однозначно понятен


>Троллинг_ор_джаст_ступид.жпг


Что не так?
#40 #519074
>>519066

> слишком толстый слой абстракций, которого там не должно быть


В самом деле, зачем нужны абстракции? Копипаст наше всё.
#41 #519081
>>519074
Это как посмотреть. В C копипаст, так или иначе, всегда делает какую-то реальную работу, и при этом его в большинстве случаев возможно заменить на функции/макросы, или как-то ещё переструктурировать код, избавившись от большинства повторений; в то время как в какой-нибудь джаве, например, "абстрактная" иерархия классов там, где это не нужно, вполне может оказаться кодом, по сути вообще ничего полезного не делающим.
#42 #519122
>>519066

> надежный и поддерживаемый код


> и не более многословно


Этот поехал уже в своем манямирке, уносите.
#43 #519126
>>519122
Сравнивая с джавой. Там обработка исключений точно также занимает немалую часть кода.
#45 #519135
>>519126

> Сравнивая с джавой


С какой парашей еще сравним, м?
#46 #519226
>>519127
Для такого есть goto.
#47 #519276
>>519226
Для такого есть функции и в них циклы.
Открываешь все файлы, передаёт их на обработку, закрываешь — всего три функции.
Вызываются они внутри ещё одной функции.
Файлы будут закрыты в любом случае, т.к. в Сишке нет исключений, так что выполнение в любом случае приползёт к последней функции, закрывающей их.
Данный товарисч конечно же OCHE UMNY VIIYNOSHA но к сожалению он мудак.
Пiчальбида.
#48 #519284
>>519276
А если надо подгружать файлы в рантайме, ммм?
#49 #519350
>>519033

>правильно реализуются дженерики


мм, а как? я токо два варианта могу - на макросах запилить, тогда будет типизация работать по итогу, но отладка отвалитца
или на void*, тогда типизации не будет
#50 #519360
>>519350
C11 дает тебе еще один путь: делаешь копипастой сколько надо функций, а потом макрос с _Generic, который по типам аргументов выбирает нужное говно.
Правда нахуй это говно нужно кроме как "преобразовать в строку для печати" в толк не возьму. Ну да, есть еще трюки с "дефолтными аргументами", но это все настолько ненужно, что я прям даже не знаю.
#51 #519387
>>519360
Нет. _Generic это про другое. Суть дженериков же как раз заключается в избегании копипасты. А _Generic+макрос ближе к оверлоаду (правда толку от него все равно нет).

>>519350
На макросах типа #define GENERIC_SORT(name, type, comp_func) самый лучший вариант я считаю. С отладкой проблем нет, т.к. тот же clang, выдавая ошибку, показывает не только на строчку с инстанциированием, но и кусок раскрытого макроса с ошибкой. Плюс всегда есть ключ -E, позволяющий целиком увидеть во что раскрывается макрос.
#52 #519389
>>518562
Там тебе надо общий пррнцип понять, на примере каких-нибудь 8 ми битных микроконтроллеров.
RTOS не всегда нужна, для начала разберись как раьотает периферия.
#53 #519390
>>518704
Полно заказов на разраьотку по под процы, только мало кто умеет.
Одна из реальных задач: FSK модем на msp430.
#54 #519413
>>519387

> #define GENERIC_SORT(name, type, comp_func)


Ох уж эти костыли-костылики. Не говоря уже о том, что нет ничего более уёбищного, чем макросы на основе переписывания строк.
#55 #519431
>>519413
Плюс в том, что в этом случает ты используешь их только тогда, когда это действительно нужно, в отличие от крестов, что положительно влияет на скорость компиляции и размер кода.
#56 #519557
>>519431
То есть те же шаблоны ты можешь использовать непреднамеренно?
#57 #519569
>>519557
В С++ ты делаешь весь класс темплейтным, хотя часто можно обойтись парой методов, а все тяжелое убрать из хедера. В си ты десять раз подумаешь, надо ли использовать дженерик на макросах.
#58 #519676
вкачусь в тред и скажу, что си после джавы действительно кажется Б-гоподобным.
Си #59 #519678
Сишечка рулит, остальное - УГ
#60 #519682
>>519676
Согласен. Веет чем-то настоящим. Но Java тоже пойдёт.
#61 #519683
>>519033

> нужно разобраться как на C правильно реализуются дженерики, рантайм полиморфизм и прочее.


Няшная - это низкоуровневый язык, который нужен чтобы возить байтики в тележках. И точка.
#62 #519685
>>519683
Хотя нет, это было когда-то там. Сейчас спецификации на всякие там кристаллы разрослись, одно Intel HD Audio чего стоит. Из-за этого начинают криво писаться драйвера, код плохо реюзается, каждому приходится разбираться заново. Так что эти ваши полиморфизмы с субтипами начинают быть все более нужными, даже в няшной.
#63 #519691
>>519685

>Так что эти ваши полиморфизмы с субтипами начинают быть все более нужными, даже в няшной.


No thanks. У нас уже есть эталон кривизны - драйвера ATI (хотя и Nvidia не отстает), нового не надо.
#64 #519695
>>519691
Эталон кривизны - это что-то из средневековья, этакое демонстративное устрашение темного люда.

Надо искать эталон прямизны, и, найдя его, пользоваться на здоровье и рассказывать другим.
#65 #519697
>>519695

>Надо искать эталон прямизны, и, найдя его, пользоваться на здоровье и рассказывать другим.


Абсолютно согласен, но где ж его найдешь?
Даже люди, проектирующие процессоры (невероятно ответственная работа), до сих пор не могут найти золотую середину в вопросе обратной совместимости, да так, что у одних дескриптор сегмента по всем восьми байтам распидорасило, а другие вешают новые команды на опкоды старых с префиксом.
#66 #519700
Вот, как раз поясните: с развитием новых стандартов теперь есть ли возможность:
1) задать разрядность signed/unsigned в битах/байтах?
2) обрушить программу при переполнении целого?
Вопрос про стандарты самого языка, однако, про gcc отдельно тоже интересно.
#67 #519703
>>519683

>который нужен чтобы возить байтики в тележках. И точка.


И правильно - ведь компьютеры и предназначены для перевозки байтиков. Бойлерплейт из абстракций не нужен, особенно сейчас, когда закон Мура закончился.
#69 #519706
>>519700

>задать разрядность signed/unsigned в битах/байтах?


#include <inttypes.h>
Там есть int8_t/uint8t/int16_t/uint16_t и так далее.

>обрушить программу при переполнении целого?


Насколько я знаю, в gcc нет такой фичи, только самопальные проверки. С ассемблерной вставкой полегче, но код превращается в нечитабельное говно:
add eax, dword ptr some_number
jo overflow_handler
#70 #519707
>>519706
Обосрался, не inttypes, а stdint.
#71 #519713
>>519705
>>519706
Огромное спасибо. Про ассемблер знаю, жалко, что по-прежнему нет универсального способа.
#72 #519719
>>519683
Не пойми неправильно, дженерики на макросах и динамик диспатчинг бывают нужны в сишке в первую очередь как средство достижения максимальной эффективности программы, но никак не ради абстракций или облегчения кодинга. Например дженерик сортировка в виде макроса + инлайн функция сравнения = ноль оверхэда, в отличие от того же qsort из стандартной библиотеки. Также иногда бывает необходимо работать через общий интерфейс с массивом указателей на разные объкты - соответственно прицепляем к структурам vtable'ы или просто указатели на функции, т.к. это тупо самый быстрый способ выбора реализации функции когда конкретный тип объекта заранее не известен.
Вообще я имел ввиду то, что изучить сишку (как и любой язык) - это ведь не только запомнить синтаксис, который действительно можно за 2 дня выучить. Многое, для чего в большинстве других языков имеется какая-то специальная фича, в C возможно сделать кучей разных способов, и нужно не так уж мало времени потратить, чтобы выработать самые годные техники для всех ситуаций.
Алсо да, сорт оф RAII при помощи goto (как тут выше заметили) - жизненно важная штука. Также всем советую еще всегда возвращать из функции код ошибки, а результат - через переданный параметром указатель, тогда можно делать
if (((rc = func1(...)) != 0) ||
((rc = func2(...)) != 0) ||
((rc = func3(...)) != 0)) {
switch (rc) {
//обрабатываем ошибки
}
}
это самый компактный способ выполнить ряд операций, которые могут зафейлиться и, в случае чего, обработать ошибки.
Всё это очень простые вещи конечно, но таки тоже требуют уделить им внимание при изучении языка.
#73 #519728
Посоны, позвольте разбавить ваши интеллектуальные беседы своим дибильным вопросом.
Тоже байтоебствую с stm32, компилятор gcc.
Передаю данные на индикатор функцией, которая на вход получает указатель на строку. Соответственно надо знать когда строки кончаются. Функция strlen из string.h успешно работает. Но она порождает слишком много ассемблерного кода - НИНУЖНА.
Непонятно как вообще может быть определена длинна строки, если передается только указатель? Нуль-терминатор? Но оно же токо в плюсах?
Попытался найти код функции strlen, нифига не нашел. Но если проект собирается, очевидно она есть. Где её можно взять?
#74 #519731
>>519728
Нуль-терминированные строки есть не только в плюсах, они появились задолго до появления языков высокого уровня, лол.
Я вижу два варианта:
1) Можешь сам написать аналог strlen,там ничего сложного.
2) Если не хочешь использовать нуль-терминированные строки, запили строки кортежем длина строки + сама строка.
Для байтоебства первый вариант предпочтительней.
#75 #519735
>>519728
В K&R вроде была strlen. Там же код тривиальный типа while(звезда str++)++len;
#76 #519737
>>519719

>ноль оверхэда


Указатели на функции, определение которых доступно компилятору, почти всегда инлайнятся. Разницы по скорости с темплейтом не будет.
#77 #519739
>>519728
char stroka[] = "tekst stroki";
size_t dlina_stroki = sizeof( stroka );
#78 #519741
#79 #519742
>>519737
Т.е. компилятор не будет вызывать библиотечный qsort, а сгенерит для меня специальную версию qsort'а с заинлайненым сравнением, так что ли?
#80 #519744
>>519742
Только если компилятору будет доступно определение qsort. Если бы qsort была объявлена в хидере, как и функция сравнения, то вызов бы заинлайнился.
#81 #519745
>>519741
Что тебе не нравится?
#82 #519747
>>519744
От это да, потом нужно будет самому проверить. Я что-то всегда думал, что он инлайнит только вызовы по имени функции, а тут получается, что отслеживает значение в указателе и тоже инлайнит. Все ж таки действительно немало тонкостей в няшной.
#83 #519750
>>519731
>>519735
Действительно в K&R описывается нуль-терминатор.
Так и сделаю.
>>519745
Скорее всего потому, что если инициализировать строку как "текст", будет добавлен "\0", а если как массив {char1, char2, char3...} не будет.
#84 #519752
>>519750
Если инициализировать массив string literal'ом, при этом указав размер массива равный количеству букв, то '\0' в конец строки не добавится.
Напр. char str[4] = "test"; - нуль-терминатор добавлен не будет.
#85 #519753
>>519731

> Для байтоебства первый вариант предпочтительней.


Но почему, ведь второй вариант эффективнее, длина вычисляется за О(1)?
#86 #519754
>>519739
А вот это не работает с указателем. Так сразу попробовал.
Попробуй передай &stroka[0], ничего хорошего не получишь.
#87 #519755
>>519753
Байтоебство байтоебству рознь. Где-то нужно оптимизировать по памяти (вариант с кортежем отпадает), где-то по скорости.
#88 #519765
>>519753
Все равно в индикатор выталкиваю символы по 1ному. Да и строки короткие (1-5 символов).
#89 #519766
>>519754
Зато strlen вызывать не нужно - компилятор уже все посчитал.
#90 #519792
>>519744
А LTO это не про эти оптимизации?
41 Кб, 400x511
#91 #519835
Зачем картинку испортил, пидор?
#92 #519883
>>518562
Если для себя то не еби мозги себе и покупай Ардуину. Если хочешь действительно байтоебить то идешь на сайт easyelectronics и там проходишь учебный курс по AVR там все начинается с тру байтоебства ассемблера, но написано очень годно. Ну а по Си Кериган и Ричи классика.
#93 #519884
>>518704
че за плата на пике? Какую годноту посоветуешь почитать для того что бы впердоливать во всякие ARM Unix'ы?
#94 #519885
>>519884
а все в глаза долблюсь увидел что за плата.
#95 #519899
>>519792
LTO по идее должна и в объектном файле инлайнить. А из хидера должно и без LTO инлайнится.
#96 #520068
Сегодня при конвертировании строки из utf8 в cp1251 с помощью функции iconv, в качестве параметров указателей in и out буферов (в хэдэре объявлены с restrict) передал указатели с одинаковым значением (т.е. использовал один буфер). Все отлично работает, но вот думаю, может быть все же стоит использовать два буфера? Или в данной ситуации ничего плохого произойти не может?
#97 #520078
>>518562
1. Искусство программирования Unix.
2. Справочник по сям.
3. Хуилиарды кода на сях в СПО.

Опционально: собор и базар.
#98 #520286
>>520068
Зависит от операционной системы. Если что-то переносимое, то лучше два буфера, а если работает и так...
#99 #520796
>>520078

>собор и базар.


говно без идей
#100 #520799
>>519728

>Но оно же токо в плюсах?


ох лол блять... совсем молодёжь охуела
#101 #522433
Отличаются ли чем-нибудь (кроме наличия/отсутствия деструктора) thread_local поинтер и thread specific storage (функции tss_… в c11 и thread_key_… в posix)? Что лучше использовать в c11?
#102 #522586
Почему этот тред такой мёртвый? :(
#103 #522587
>>522586
Потому что мало кто из двачеров жалует няшную
бамп годному треду
#104 #522588
>>522587
Если знаешь, ответь на >>522433 вопрос позязя. Просто я не очень понимаю необхогдимость добавлять в стандарт tss_ набор функций, если есть thread_local. Может быть есть какое-то отличие, которое я не понимаю?
#105 #523029
>>518562
Тебе сюда, коллега

>>522265
#106 #523043
>>519739

>size_t dlina_stoki = sizeof(stroki) - 1



поправил, не благодари
143 Кб, 1280x1024
#107 #524583
Запилил тут себе poor man's деструкторы в качестве упражнения. Как вам?

Алсо, почему C тред опять тонет?!
20 Кб, 311x278
#108 #524599
>>524583

> NULL


> printf


> голые указатели


> Си строки

#109 #524604
>>524599
Ну а что ты ожидал увидеть? Это же C тред в конце концов.
#110 #524610
>>524604
Мб как свифт-обезьяна переменную именует не буковками а смайликами.
#111 #524614
>>524583
Сорцы будут?
#112 #524621
>>524614
Если допилю до вменяемого состояния, то будут конечно, правда там смотреть особо не на что. Просто в начале automatic блока создается объект – стэк, в который потом записываются указатели на объекты и указатели на деструкторы, в конце блока это всё в цикле вызывается и уничтожается. Сейчас мне надо придумать как лучше сделать обработку ошибок. Вообще, таких велосипедов уже написано > 9000, мне просто свой сделать захотелось.
#114 #524795
>>524689
А теперь то же самое через подмену адреса возврата, чтобы с return работало, а не только с break.
#115 #524826
>>524795

>через подмену адреса возврата


Будет не портабельно же. Если там добавить глобальную переменную const struct deinit_stack deinit_stack и потом сделать #define return auto_deinit(&deinit_stack); return, то будет тоже работать с return по идее. Алсо, в любом случае это всё хуита, ни один нормальный человек не станет всерьёз использовать что-то такое.
sage #116 #526256
>>524689
поясните за ключевые слова automatic и release, в гугле ничего не нашел. Это точно чистый Си?
#117 #526273
>>526256
Это макросы, блядь.
sage #118 #526747
>>526273
а где они определены?
sage #119 #526748
>>526747
а все понял
#120 #527369
>>526273

>макросы


>не капсом


>#define if else


>#define true false

#121 #527401
>>527369

>впервые увидел как меняют синтаксис сишки макросами


Ни в коем случае не заходи на http://libcello.org/, вообще охуеешь.
#122 #527685
>>524583
Стоп, а разве в pure c запрещены {}-блоки без костылей типа do-while (0)? Может быть, я что-то не понимаю, но разве вместо autovar нельзя просто объявить переменные внутри блока, чтобы они автоматическими были? Или у меня мозги поражены крестами, лол.
#123 #527687
>>527685
Из простого блока ты не выйдешь break-ом.
#124 #527692
>>527687
То есть у тебя break'и используются в блоках как "исключения для бедных", лол? Я бы на твоем месте сделал для такого обычные блоки и отдельный макрос, который делает goto за закрывающую скобку. Вроде был инструмент для генерации уникальных меток, но я запамятовал. Гулять так гулять, а по производительности это будет лучше, чем циклы, которые выполняются один раз.
#125 #527693
>>527692
Я мимокрокодил вообще. Я ему предлагал >>524795 непортабельный, но красивый вариант.
sage #126 #527695
>>527692
Алсо, цикл выкидывается, даже если без оптимизаций собирать - этой идиоме больше лет, чем тебе.
#127 #527699
Поясните, как си хранит double ? Я так понял там под мантису 52+1 бита. Максимальное число, которое помещается в мантису 2^53=9007199254740992, выходит можно хранить 15-16 разрядов, но если написать
\tdouble a = 123.45678901234567;
\tprintf("%.14lf\n", a);
выводит 123.45678901234567, как он умещает 17-й разряд?
#128 #527701
#129 #527702
>>527701
можно по подробнее я правильно понимаю, что иногда, когда в экспоненте хватает места, часть мантисы он может переложить в экспоненту? В мантисе храниться 1.9290123283179010, а не 1.2345678901234567, как я думал. Или где тогда она?
#130 #527703
>>527695
Да похуй, зачем пессимизировать преждевременно? А еще - отдельный макрос на выход с деинициализацией будет няшнее, чем break, выглядит, как отдельная команда.
#131 #527998
>>527401
Они там совсем ебанулись, добавили лишних знаков и конструкций и пишут про повышение уровня си. Лучше бы библиотеку стандартную расширяли.
#132 #528111
>>527998
Кстати, почему для сей нет человеческой библиотеки коллекций? Даже обосранный резиновый стэк самому приходится писать.
#134 #528636
>>528610
Беда в том, что эта либа гнутая.
#136 #528803
>>528797
В чем подвох? Одинаково же будет, не?
#137 #528804
>>528803
А, понял. Охуеть просто, вообще пушка.
#138 #528806
>>528804
Энджой ер сишечка.
#139 #529279
>>528804
Убери точку с запятой после вызова макроса и все.
#140 #529282
>>529279
Поясни. Почему нужен тот костыль и почему нельзя дочку с запятой?
мимопроходил
#141 #529292
>>529282
Потому что после блока {} не должно быть точки с запятой, если ожидается else.
#142 #529293
>>529292
А в крестах надо?
#143 #529294
>>529293
Во всех языках с сишным синтаксисом после if и else надо statement. Или это expression statement (выражение, которое на ; заканчивается) или это statement с ключевым словом (ну тот же do или вложенный if), или это compound statement ({ такая хуйня в фигурных скобочках }).

Если ты написал if (expr) {y}; else ..., то после (expr) у тебя уже ДВА statement (compound в { скобочках } и пустое выражение с ;). Компилятор после второго statement уже не ожидает никакого else, поэтому и охуевает, внезапно его встретив.
#144 #529296
>>529294
Нихуя не понял. Но спасибо за ответ. Потом ещё раз прочитаю.
#145 #529297
>>529296
Ок. В крестах точно такое же поведение }; нельзя. И в JavaScript. И в PHP. И в Java.
#146 #529302
Php
#147 #529490
>>529292
А если просто писать HUI (hui), без точки с запятой? Тогда ведь можно обойтись блоком, его можно будет вставить везде.
#148 #530740
Посоветуйте по С книг для начинающих.
#149 #530845
>>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»

И незабывайте-про:
http://fprog.ru/2009/issue1/eugene-kirpichov-fighting-mutable-state/
А не то.
#150 #530868
>>530845

> fprog.ru/2009/issue1/eugene-kirpichov-fighting-mutable-state/


Хуета какая-то от неосилятора.
sage #151 #530871
>>530868
А ну да, у тебя ж еще и MISRA в списке. Тогда понятно: ты перечисляешь способы скатить мощь сишечки до своей любимой функциональнойпарашинейм.
#152 #530873
>>530845

>Rob Pike: «Notes on Programming in C»


Где можно скачать полностью? На первой странице в гугле только маленький кусок.
#153 #530874
>>530873
есть особый гугл: ebdb.ru
#154 #530948
Спасибо, няшки, за книжки.
1869 Кб, 275x154
#155 #531713
Сап, сишники-ананасы, посоветуйте хороший компилятор для чистого С. Пробовал искать сторонние - такого говна поел, что пиздец. Первые два вообще не ставятся, третий закрывает программу при попытке ввода данных, четвертый пытается отличить if от IF и так далее.
#156 #531722
>>531713
gcc/MinGW.
#157 #531750
Привет, сишники, объясните, пожалуйста, отличие main() от int main()
Вроде бы одно и то же, но в Кернигане и Ритчи int не объявляют, а в интернетике во всех кодах его ставят. Зачем?
#158 #531753
>>531713
Для шиндоус: Pelles C (полная поддержка C99/C11), и, внезапно, вижуал студия 2015 (там почти все необходимое, наконец, запилили, да и сам компилятор весьма неплох).

>>531750
Во времена K&R все функции по умолчанию возвращали int, если не было указано иное. В современных редакциях стандарта это пофиксили, теперь нужно писать тип возвращаемого значения, а старое поведение deprecated и кое-где уже даже не поддерживается. Я не уверен, но вроде в свежей редакции K&R тоже уже правильно, посмотри сам.. Алсо, int main() - это плюсы, а в сишечке - int main(void) или int main(int argc, char argv).
#159 #531760
>>531753

>вижуал студия 2015


Где можно скачать ломаную, а не с таблеткой на один год?
#160 #531762
>>531760
Бери Community Edition, она бесплатная: входишь в аккаунт Microsoft, она сама активируется, опционально выходишь и удаляешь аккаунт Microsoft.
#161 #531784
>>531753
Спасибо! Может, есть новое издание, попробую поискать.
А вот int main(void), кстати, ни разу не видел. Везде в скобках ничего нет. Это тоже уже устаревшая версия записи?
#162 #531793
>>531784
Пустые скобки в C в отличие от C++, где они эквивалентны (void) означают неизвестное число параметров. Например:
[code lang="c"]
int foo (); //declaration
//...
foo (1); //call
//...
int foo (int input) //definition
{
//...
}
[/code]
#163 #531799
Смотри, анон.
#include <stdio.h>
#include <string.h>

Если я не делаю второй инклуд, то компилятор ругается на встроенную функцию strlen.
[Warning] incompatible implicit declaration of built-in function 'strlen'

Почему так? Ведь без инклуда string.h этот код просто не должен компилироваться. Должна быть ошибка "такой функции нет".
#164 #531805
>>531799
Ты упоминаешь ее, и тем самым неявно объявляешь. Компилироваться должно, компоноваться нет.
#165 #531808
>>531793
А теперь и пустые скобки нельзя. Для функций с переменным числом аргументов надо как минимум один аргумент и ..., а для остальных нужно явно указывать аргументы.

>>531799
Компилятор "знает" такую функцию, чтобы в определенных режимах (с оптимизацией) заменять ее вызов на эквивалентный код. Это "знание" не на уровне языка (не декларация), а на уровне компилятора. Так как функция при вызове неявно >>531753 объявляется как int strlen(), а компилятору известно о другом, он ругается.
#166 #531942
>>531793
Кстати, вот ещё вопрос: в программах в интернетике в конце описания функции main ставят действие "return 0;". Обязательно ли его вставлять?
#167 #531950
>>531942
Нет, для main (и только для нее!) есть исключение: если выполнение доходит до конца функции, неявно возвращается 0.
#168 #531952
>>531942
0 - код успешного завершения программы. передаётся выше в ОС. любой не 0 = в ходе выполнения была ошибка.
#169 #531954
>>531952
В стандарте весело, кстати. Есть 0, EXIT_SUCCESS (может совпадать, и таки совпадает с 0) и EXIT_FAILURE, а остальные коды возврата - implementation defined. На деле, конечно, так, как ты сказал.
#170 #532900
Эй! Сишники! Насколько сложно сейчас найти работу, где требуются знания Си?
#171 #532901
Поясните про inline? Для чего он нужен?
#172 #532921
>>532901
Это тоже хинт, как register, restrict и const. Если register предлагает компилятору ускорить доступ к переменной, то inline предлагает ему ускорить вызов функции. И, в отличие от register, компиляторы хоть и не всегда, но все же часто обращают на это внимание, подставляя тело inline-функции в месте ее вызова (что позволяет потом оптимизировать код еще больше). Современные компиляторы, опять же, и сами инлайнить умеют очень хорошо, но если функция несложная, маленькая, то inline можно указать а если ты уверен, что так точно будет лучше, то иногда даже какой-нибудь нестандартный __forceinline/__attribute__((always_inline)), т.е., "инлайни и ниебёт" можно воткнуть. Обычно в пример оправданного инлайна приводят какую-нибудь векторную арифметику - несколько выражений без ветвлений будут развернуты в десяток-два инструкций в месте вызова и отработают гораздо быстрее, без затрат времени на передачу аргументов, не сбрасывая конвейер процессора и т.п.
#173 #532928
>>532921
Постой. const - это хинт? Разве?
#174 #532980
>>532928
This, поэтому константы объявляются с помощью #define
#175 #533089
>>528636
LGPL же. Можно линковать со своими проектами.
#176 #533333
>>518562 (OP)
Это могила Берроуза?
#177 #533366
>>533333
лал
#178 #533386
>>532980
Да, const по сути просто хинт. Но ты-то, как и с другими хинтами, в любом случае обязан соблюдать ограничения, которые спецификатор накладывает.
#179 #533578
>>533333
Юрия Петухова.
#180 #533620
Анон, помоги ньюфагу! Пытаюсь скомпилить 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.

Вот с ними:

http://pastebin.com/6wXWCtLN
sage #181 #533697
>>533620
Без сорсов, очевидно, нужны заголовочные файлы и либа.
С сорсами, очевидно, тоже нужны заголовочные файлы и... лучше собрать либу.

CMake поставить не пробовал? Хочешь руками?
Возьми на http://luadist.org/ уже собранные либы lua (тебе нужны оттуда include/.h и lib/.a? ну и .dll потом), укажи пути в команде компилятору (gcc -Iпуть-к-папке-с-h srlua.c полный-путь-к-liblua.dll.a)
#182 #533873
>>533620

>скомпилить srlua через mingw компилятор


Зачем? Есть же vagrant + virtualbox
#183 #533994
Здравствуйте. Я хотел бы спросить по поводу преобразования типов. Допустим у нас есть три переменные: short a, short b и int c. Нужно ли мне выполнять явное преобразование, если я хочу вычислить: c = a b? То есть надо ли мне записывать это так: c = (int) a b или c = (int) (a * b)?
#184 #534005
>>533994
ЕМНИП, не нужно. Но компилятор ругнётся, что выполняется неявное преобразование.
35 Кб, 851x740
40 Кб, 851x740
#185 #534007
>>534005
Хуй тебе. Нужно преобразовывать иначе пикрил. Хотя возможно, это зависит от компилятора.
#186 #534010
>>534007
Что у тебя за компилятор?
#187 #534012
>>534010
GCC 4.9.2. На скрине же видно!
#188 #534018
>>534012
И что у тебя не работает?
#189 #534019
>>534018
Все работает. Я просто показал >>534005, что компилятор может молчать и не преобразовывать тип самостоятельно.
#190 #534022
>>534019
Таки всё в сях есть int или указатель на int, не забывай об этом.
#191 #534024
>>534022
Ты к чему это? Я тебя не совсем понял.
#192 #534026
>>534024
То, что ты написал long, а по факту там хитровыебанный int, потому и не ругается. Ты могу бы вообще char написать.
206 Кб, 1366x768
#193 #534031
>>534026
Пикрелейтед. Ничего, что MinGW?
50 Кб, 851x740
34 Кб, 851x740
33 Кб, 851x740
#194 #534033
>>534026
Даже если из float в long или даже в char. Компилятору плевать на это.
#196 #534040
>>534034
Ну по поводу float, все немного по-другому... А вообще, почему мы спорим? Я говорю, кто-то написал, что компилятор выдаст ошибку, я говорю что компилятор не выдает ошибки, ты говоришь почему так, я и так знал почему и мы спорим не из-за чего.
#197 #534041
>>534040
Это я написал, что компилятор выдаст предупреждение. По-хорошему, вот если так по-честному, то должен бы.
#198 #534055
А какой есть компилятор Си, который может в c99, и в ассемблерные вставки на синтаксисе intel?
#199 #534063
>>534055
Watcom.
#200 #534068
#201 #534313
>>534007
Это от машины зависит:

> Тип short часто имеет размер 16 бит, long — 32 бита, a int — или


> 16, или 32. Компилятору разрешено самостоятельно выбирать размер в соответствии с


> характеристиками аппаратуры и следующими ограничениями: числа типа short и int


> должны иметь длину не менее 16 бит, long — не менее 32 бит; тип short должен быть


> не длиннее int, a int — не длиннее long.



У меня, например, на x86 long идентичен int и переполнение в обоих случаях.
#202 #534388
Поясните за fscanf. Допустим у меня есть строка: key: value.
Как мне это скормить fscanf, чтобы он считал эту запись в соответствующие переменные?
#203 #534390
Поясните за fscanf. Допустим у меня есть строка: key: value.
Как мне это скормить fscanf, чтобы он считал эту запись в соответствующие переменные?
#204 #534409
>>534390
>>534388
Как же раздражает гуглокапча.
Пока нашел только способ, в котором надо считать одну строку и вычленить из нее елементы. Но я полагаю, должен же быть способ, как-нибудь считать два значения из одной строки? Пока делал так: fscanf ("%s[^:]%d", key, &value);
#205 #534414
>>534390
fscanf - хуета для одноразового кода, парси вручную (strtok, strtol, strtod, все дела).

> fscanf ("%s[^:]%d", key, &value)


Да, примерно так оно и делается. Только у тебя размер буфера не указан (что будет, если введешь больше, чем размер key?). Надо:
"%размер[^:]: %d"
#206 #534418
>>534055
Все могут в той или иной мере. Но код на асме лучше вынести в отдельные файлы, и с ними линковаться.

>>534041
Что за цирк вы тут устроили? -Wconversion
#207 #534423
Как правильней писать в main: return 0 или exit (EXIT_SUCCESS)?
#208 #534424
>>534418

>-Wconversion


В примере >>534007 это не сработает, потому что там присваивается произведение переменных с типом int переменной с типом long. int может быть преобразован в long без потери информации, значит неявное преобразование не может испортить значение, т.е. предупреждение не выведется. Значение портит переполнение вызванное произведением переменных типа int. Чтобы этого не было, нужно один из операндов преобразовать в long.
#209 #534425
>>534423

>exit (EXIT_SUCCESS)


this
#210 #534426
>>534423
Если это единственный return, то лучше ничего не писать. А вообще, exit для других функций оставь, а в main лучше return (вопрос вкуса, реальной разницы нет).
33 Кб, 851x740
#211 #534427
Подтверждаю слова этого.
#213 #534430
>>534424
А, вы о таких вещах. Ну это да.
#214 #534444
Хочу педальку для вима https://github.com/alevchuk/vim-clutch
#215 #534445
Если я хочу выделить память для хранения строки, безопасней ли использовать calloc, в случае, если я могу как-нибудь пропустить '\0'? Или все равно, что использовать?
#216 #534450
>>534445
Если ты можешь пропустить где-то \0, то и решай эту проблему - напиши раз и навсегда себе модуль для работы со строками, ну и внимательнее будь. А так, да, calloc может немного подстраховать. Но ты с таким же успехом можешь в длине на 1 ошибиться и затереть самый последний \0.
#217 #534461
>>534423
А ты посмотри что происходит после return 0 - например, в gcc после этого вызывается exit(return_value)
#218 #534641
Есть ли какие-нибудь статьи или что-то вроде того о threads.h? Многопоточностью я еще не увлекался, а вот сейчас решил научится работать с ними. Даже не знаю с чего начать.
#219 #534644
>>534641
Зачем оно тебе? С поддержкой очень безрадостно пока. Почитай лучше про pthreads/Windows processes and threads, будет намного полезнее.
#220 #534696
Что в си означает выражение &&addr? Это не логическая операция.
#221 #534697
>>534696
Дай-ка фрагмент кода, где ты это откопал.
140 Кб, 1062x879
#222 #534703
>>534697
Тот кусок уже не нашел, но вот аналогичный. Это из мануалов по обфускации кода и приемам антиотладки.
#223 #534707
>>534703
Теперь я понял, почему мой компилятор жаловался на метки. Честно говоря, никогда не сталкивался с такой штукой и могу предположить только, что это. Надо будет и самому почитать про это. Интересно же.
#224 #534710
>>534707
Да, это вообще охуенно. И материалы классные. Там надо знать не только си на высоком уровне, но еще и теорию чисел.
#225 #534733
>>534710
Брось ты это дело. Нет лома против иды, деобфускатора типа миазмы, и маленькой тележки знаний наподобие http://pferrie.host22.com/papers/antidebug.pdf
#226 #534734
>>534696
в с++11 rvalue сылка
#227 #534738
>>534734
Еще походу в Си && используется для взятия адреса метки(label). Вот хуй знает где это в стандарте, мож кто подкинет
#228 #534739
>>534738
Вот че в инетах нашел
Note: In GNU C the operator '&&' may also be used as unary operator for taking addresses of labels.
#229 #534758
Почему этот код нормально отработал на идеоне, а у меня на компе происходит ошибка при выполнении? Компилирую в DevCpp.

https://ideone.com/abSF9g
#231 #534780
>>534761
Как все сложно то...
#232 #534781
Посоветуйте годной литературы по Си, кроме K&R.
#233 #534820
>>534758
Ну видимо ты не можешь редактировать .text секцию просто так. Не знаю как на винде, на линухе надо вызвать mprotect.
125 Кб, 1366x768
#234 #534833
>>534758
Потому что ideone компилирует с gcc -O2, так что твой самомодифицирующийся код нихуя не делает.
#235 #534836
>>534833
Что надо сделать, чтобы этот код работал?
#236 #534839
>>534836
Ничего. Он не может работать. Память с кодом всегда read-only, сделать ее read-write тебе ос не позволит, да и вообще нахуя ты собрался опкоды на бред менять? Даже если ты их поменяешь, скорее всего получишь undefined instruction.
#237 #534840
>>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
#238 #534841
>>534840
Есть djvu этой книжки?
#239 #534842
Пиздец, там в makeCodeWritable используется mprotect. Это значит, что на винде все это не заработает? Есть способы то же самое повторить на винде?
#240 #534844
>>534841
гуглить надо, у меня нет. Гугли VirtualProtect для винды и mprotect для линухи. Вроде так
#241 #535047
У меня тут вопрос возник. Есть у меня есть два указателя. Первый указывает на строку а второй на произвольный участок(не инициализирован). Я могу сразу вызывать memcpy, чтобы скопировать строку в участок, на который указывает второй указатель? Или мне необходимо для нечала выделить память с помощью malloc?
#242 #535084
>>535047
Либо malloc(), либо занять область на стеке:
char string[MAXNAME] = "";
#243 #535090
https://ideone.com/yNK4rv
Что не так в этой сортировки? Почему она работает слишком медленно. Даже 256 элементов, занимает почти секунду.
#244 #535093
>>535090
Все. Вопрос закрыт. Я кретин. Прошу прощения за то, что потревожил. Дело было в строке: 7.
#245 #535107
>>518562 (OP)

>может я пиздоглазый


Ты русский? Значит - пиздоглазый!
#246 #535113
>>535107

>пиздоглазый


"штсдгву БсзшвщкфяЮ
Х
ОСТ_ифде, не?
Ъ
#247 #535126
>>535113
оПХБЕР, ЕЯРЭ БНОПНЯ
Зачем вы срете в нашем уютном тредике?
#248 #535136
>>535126
OST_BALT{}y - pizdoglazyie
#249 #535359
Как заинлайнить функцию из стандартной библиотеки?

Она у меня тупо вызывается через call, а я хочу чтоб компилятор ее на место вызова вставил.
#250 #535393
>>535359
Скопируй исходник функции себе в проект и делай с ним, что угодно. По-другому никак.
#251 #535411
>>535359
собрать статически, не?
#252 #538504
Умею делать циклы и функции. Как с помощью этого можно сделать какое-то практическое приложение? Чего нужно еще знать?
#253 #538586
>>538504
системные вызовы
#254 #538592
>>538504
Вызывай функцию в цикле, устраивай цикл внутри функции, запускай в цикле функции, которые выполняют внутри себя цикл, внутри которого вызываются функции.
#255 #538636
>>538504
Научись в fopen/fgetc/fputc и напиши упаковщик методом RLE.
#256 #538646
>>538504
Структуры, ссылки, указатели. Напиши наследование структур с виртуальной таблицей методов.
#257 #539475
Дорогие байтоебы, вопрос по рынку (глобальному). Как за последние годы, по ощущениям, изменилось число вакансий, конкуренция? Когда Сишка пойдет ко дну, и пойдет ли вообще?
#258 #539924
>>539475
Она ко дну никогда не пойдёт, но востребована в очень узком секторе.
#259 #540099
Компилятор ругается что нельзя инициализировать массив переменной длины.

[code]
#include <sys/inotify.h>
#include <linux/limits.h>

...

const size_t kMaxEvent = sizeof(struct inotify_event) + NAME_MAX + 1;
char buf[kMaxEvent] = ""; // buffer for at least 1 event

[/code]

При этом в /usr/include/linux/limits.h:11:

#define NAME_MAX 255\t/ # chars in a file name /

А в /usr/include/linux/inotify.h:

[code]
struct inotify_event {
__s32 wd;
__u32 mask;
__u32 cookie;
__u32 len;
char name[0];
};
[/code]

Ведь конец должен считаться просто указателем? Не зря же меня заставили вручную возможную длину учитывать добавлением NAME_MAX?
#259 #540099
Компилятор ругается что нельзя инициализировать массив переменной длины.

[code]
#include <sys/inotify.h>
#include <linux/limits.h>

...

const size_t kMaxEvent = sizeof(struct inotify_event) + NAME_MAX + 1;
char buf[kMaxEvent] = ""; // buffer for at least 1 event

[/code]

При этом в /usr/include/linux/limits.h:11:

#define NAME_MAX 255\t/ # chars in a file name /

А в /usr/include/linux/inotify.h:

[code]
struct inotify_event {
__s32 wd;
__u32 mask;
__u32 cookie;
__u32 len;
char name[0];
};
[/code]

Ведь конец должен считаться просто указателем? Не зря же меня заставили вручную возможную длину учитывать добавлением NAME_MAX?
#260 #540107
>>540099
Разве NAME_MAX тут это не максимальный возможный размер? А sizeof(struct inotify_event) + NAME_MAX + 1 его всегда будет превышать. Хотя это не важно.

Я, вероятно, хуйню скажу, но может из-за переменного размера (хотя он и конст...) компилятор разделяет строку "char buf[kMaxEvent] = "";" на
char buf[kMaxEvent];
buf = "";

А присваивать так значение массиву нельзя, только при инициализации можно.
#261 #540109
>>540099
Нельзя в Си делать массивы переменной длины, насколько я помню.
#262 #540112
>>540109
Можно же, их просто инициализировать нельзя.
int ar[n];
int i =0;
for (i=0; i<n; i++){
ar = i;
}
#263 #540113
>>540112
хм, там ar[и] внутри лупа, конечно же.
#264 #540125
>>540107

>Разве NAME_MAX тут это не максимальный возможный размер?


NAME_MAX - максимально возможный размер имени файла, а та структура состоит из имени файла и прочей лабуды

>>540112

>Можно же, их просто инициализировать нельзя.


Похоже, что это правильный ответ. Даже в тривиальном случае:

const size_t kMaxEvent = 10;
char buf[kMaxEvent] = {0};

Нельзя.
#265 #540135
>>540099
#define kMaxEvent sizeof(struct inotify_event) + NAME_MAX + 1;
Энджой ер сишечка, в которой const - нихуя не конст и может меняться в рантайме.
#266 #540221
Анон, что здесь происходит во второй строчке? Что означают эти две звездочки в данном контексте и какая вообще логика там реализуется? До указателей в K&R пока не дошел.

https://ideone.com/6owLDE

struct list root = NULL;
struct list
*tmp = &root;
#267 #540223
>>538504
Можешь забыть про циклы и хуярить лямбда-исчислением, чисто на функциях.
#268 #540285
>>540223
хуя ты извращенец
#269 #540293
>>540221
ну если одна звёздочка - это указатель, то две - это указатель на указатель
#270 #540302
Си сам по себе не сложен по синтаксису. Так что дрочи практику, ну и пролистай пару книжек по алгоритмам, типа Дасгупты или Кормена.
#271 #540495
>>534841
>>534844
Прошу тебя, не надо это писать. Хотя книгу поверхностно почитать может и полезно будет.

Лучше изучай LLVM http://habrahabr.ru/company/abbyy/blog/265871/
#272 #543906
Тред не читал.

Господа, посоветуйте годный учебник для дебилов, где были бы изложены все нюансы С11.
sage #273 #543929
>>543906
Берёшь документацию и читаешь.
http://www.iso.org/iso/ru/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57853
Ах да, ты же дебил. Ну извини, годной инфы для дебилов не завезли, это тебе в детсаду надо спросить.
#274 #543930
>>543929
Спасибо, капитан.
#275 #543943
>>543930
Но он прав. Разве что покупать стандарт не обязательно. Ты ведь не разработчик компилятора, а хуй простой, так что последнего черновика (N1570) тебе вполне достаточно. Есть "21st Century C", её тут иногда советуют, но книжка на троечку. Если ты только учишь язык, найди книгу по C99, их дохуя, а потом просто посмотри список нововведений в С11.
#276 #544339
>>543943
Ок, так и сделаю. Наверну K&R, потом уже по стандартам отдельно посмотрю.
#277 #544341
>>544339
Только не забывай, что код в K&R - адов говнокод по современным меркам, а в режиме С99/C11 некоторые примеры даже не скомпилируются.
#278 #544375
>>544341

>адов говнокод


А как этот говнокод задетектить?
#279 #544403
>>544341
Приведи пример говнокода из K&R. Именно говнокода, а не кода, который не удовлетворяет современным стандартам.
#280 #544421
>>544403
Абзац про goto. Хотя там так и сказано, что так делают только черви-пидоры, хуже которых нет.
#281 #544427
>>544403
Так код, который не удовлетворяет стандартам - он говнокод и есть. Стандарты не из воздуха писались по крайней мере, бОльшая их часть. Множество примеров уязвимы к переполнению буфера, однобуквенные переменные, extern декларации внутри функции, implicit int, "лесенки" из вложенных for/if/while, вот это всё. Сейчас проглядел - оно лучше, чем я о нём думал. Видимо, на меня так кривой скан русского издания повлиял много лет назад. Но аргументы в силе: лучше брать что-нибудь менее протухшее.

>>544421
А вот с тобой не соглашусь. Пример для вложенного for адекватен (лучше бы туда return воткнуть, но это не всегда то, что нужно). Пример для goto cleanup - это вообще единственный способ сделать нормальную очистку без дублирования if (fp) fclose(fp) и if (obj) { free(obj->data); free(obj); } при каждой ошибке.
#282 #544433
>>544427

>Так код, который не удовлетворяет стандартам - он говнокод и есть.


Довольно странное определение. Если говорить о времени, когда была написана K&R, то код удовлетворял стандартам, а значит - не был говнокодом. Со временем стандарты поменялись, код остался тем же, но стал говнокодом. Выходит, что результат проверки, является ли код говнокодом, не постоянен во времени и зависит не от самого кода, а от того, какие на данный момент актуальны стандарты в языке.
#283 #544449
>>544427

>Пример для вложенного for адекватен


Не совсем, если fastjump ведёт не на завершение метода, а после него что-то ещё делается кроме очистки, это уже говнокод, а не fastjump.
#284 #544461
>>544433
Ну вот у нас тут goto-срач намечается. Были времена, когда можно было себе позволить писать на бейсике лапшу из GOTO, приправляя её POKE с магическими числами, и это было нормально пока один теорехтетик не вскукарекнул про considered harmful. Теперь это однозначный говнокод.

Так и с K&R. Это было нормально, например, потому, что программу писало полтора человека, которые отлично знали и сам язык, и свой код. Это было нормально, когда программы не торчали переполняющимся буфером в интернет. А теперь у нас гитхаб, и надо писать так, чтобы понял мимохуй, который сишечку вообще не учил, а учил плюсы "за 24 часа". И желательно вдалбливать про безопасность не в послесловии, а при первом упоминании массива или указателя. И про signed/unsigned тоже. И про UB до кучи, а то компиляторы стали умные и делают то, что разрешено стандартом, а не то, что ожидает человек, прочитавший K&R.

>>544449

> Не совсем, если fastjump ведёт не на завершение метода


Если бы это было завершение метода, то можно было бы сделать очистку и return прямо в for, а обычно хочется хотя бы, допустим, записать что-то в найденный элемент, что обычно и делается.

ладно, не обращайте внимания, я упорот
#285 #544485
>>544461
Нульчую этого упорыша.

школьник-кун
#286 #544497
>>544461

>Ну вот у нас тут goto-срач намечается ... Теперь это однозначный говнокод.


В низкоуровневом программировании на С оператор goto активно используется, это уже вроде 100500 раз перетирали.

>компиляторы стали умные и делают то, что разрешено стандартом, а не то, что ожидает человек, прочитавший K&R


Я не утверждаю, что код из K&R актуальный. Тот, кто изучает C по K&R, должен обязательно учитывать, что язык сильно поменялся с того времени. Но, извини, я всё ещё не могу считать исключительно по этой причине код, предложенный в той книге, говнокодом.
#287 #544554
Тред не читал
Для того, чтобы перевестись в другой универ, нужно за полгода хоть на каком-то уровне выучить С абсолютно очевидно потому, что у них этот курс есть, а у нас - нет.

Скачал Dev C++, но он пока не может обработать даже банальный хеллоуволд. Гугл говорит, это потому, что у меня windows 8.1, слишком новая система для MinGW. Я подозреваю, это ещё и потому, что система не простая, а 64-разрядная. Соответственно, вопрос - есть какие-то ещё среды работы с Pure C под 8.1, или стоит ебаться с Dev C++? Или вообще готовиться к анальной ебле с каким-нибудь древним Turbo C?
#288 #544558
>>544554
Ставь CodeLite + TDN-MinGW 64 (можно и х86, но зачем?). Работает везде, на 10-ке в том числе. А вообще под винду удобнее в Visual Studio писать.
#289 #544563
>>544554
Алсо проверь правильность PATH.
#290 #544566
>>544554
>>544558
Вот двачую вижуал студию. Они в 2015 допилили поддержку современной сишечки до приемлемого уровня. Пару галочек уберёшь на тему ололо-safer-функций, и для новичка будет ок. Особенно если ты не смог MinGW поставить почему-то.

>>544497

> В низкоуровневом программировании на С оператор goto активно используется


Ты код на бейсике, про который я говорю, не застал или забыл? То, как сейчас goto используется (даже в GCC-шном стиле с адресами меток), не идет ни в какое сравнение с тем, что было.

> Я не утверждаю, что код из K&R актуальный.


> Тот, кто изучает C по K&R, должен обязательно учитывать


Тот, кто изучает K&R не может этого учитывать. Он не знает, как правильно. Он не может делать скидку на возраст книги. Он язык только учит, он не может пока различать, хороший код тогда и хороший код сейчас. И после K&R ему приходится... ну не переучиваться, но ломать некоторые плохие привычки. Я не утверждаю, что K&R нужно выкинуть. Ее нужно почитать (задачки там, вся хуйня), но лучше бы, чтобы она не была первой книгой.
#291 #544585
>>544566

>Ты код на бейсике, про который я говорю, не застал или забыл?


Мы вроде о C говорим, не? Я лично с бейсиком вообще не сталкивался и особо не стремился.

>Тот, кто изучает K&R не может этого учитывать. Он не знает, как правильно. Он не может делать скидку на возраст книги. Он язык только учит, он не может пока различать, хороший код тогда и хороший код сейчас.


Ты крайне плохо думаешь о новичках. Я читал эту книгу, и я это всё учитывал.

>но лучше бы, чтобы она не была первой книгой


Поправлю, она не должна быть единственным источником информации о языке C. Но первой книгой может быть вполне, какой и была в моём случае.
#292 #544621
>>544558
>>544558
>>544566

Благодарю.
>>544566
>не смог MinGW
ну на этой версии Dev C++ уже стояла сравнительно новая версия, поэтому нужно было разбираться больше. Отсюда и вопрос - стоит ли ебаться
#293 #544623
>>544566

>но лучше бы, чтобы она не была первой книгой


Стиль кодирования от автора, мелкие буквы, где стоят знаки подчёркивания, пробелы и т.д. все дела.
#294 #544630
>>544621

>ну на этой версии Dev C++ уже стояла сравнительно новая версия, поэтому нужно было разбираться больше. Отсюда и вопрос - стоит ли ебаться


Если тебе принципиально нужно работать в кроссплатформенной IDE, то поебаться стоит. В итоге у тебя на разных машинах будет одинаковая среда разработки, что очень удобно. На винде 99% проблем с MinGW - это кривая переменная среды PATH. Dev C++ просто не видит компилятора или инклюды. Почитай внимательнее ошибки.
Но если линукс не нужен, но ставь VS и просто забудь про эту еблю с MinGW.
#295 #544870
>>544497
>>544566
Посоны, изучаю С по K&R. Планирую после обмазаться Linux Kernel Style Guide. Этого будет достаточно?

>>544585

>она не должна быть единственным источником информации о языке C


Получается, что ты либо читаешь еще одну книгу параллельно/после (зачем тогда K&R? время не резиновое), либо гуглишь статьи и вопросы на SO - но, чтобы их гуглить, нужно уже знать, что ты хочешь найти.
14 Кб, 600x600
#296 #544885
Можно этот тред будет нубских вопросов о C?

Я так и не вразумею, когда прописываешь [code]int a = 10;[/code]

Программа где резервирует ~4 байта для переменной a?
Я слыхал что в block scope, ну типа в самом файле сурс кода, но в другом случае я углядел что там немного хитровыебанно, и по какой-то там hex формуле что ли хранится чето такое, потом из memory как то выгребается

кто-нить может по-русски уже сказать

2. Как написать 10^10 но так, чтобы программа calculated это значение? А то приходится писать как 1 000 000 0000 чтобы работало и калькулировала.
#297 #544896
>>544870

>зачем тогда K&R?


Вот меня этот вопрос тоже волнует. Перекатываюсь на си и кресты с шарпа, и сразу встала проблема с литературой. Ну то есть хотелось бы найти некий относительно современный толмуд, куда можно было бы обращаться по необходимости, а не только SO шкурить. В шарпе это решается очень просто - кнопкой F1 плюс хелп постоянно обновляется, следуя за новыми фишками языка и это не говоря уже про StyleCop и Resharper. По крестам книг просто вагон, С++14 уже нормально расписан, поэтому тоже вопросов особо не возникает.
А с си как-то всё печально. Не, у меня, конечно есть книга 1995 года,. но это как-то несерьёзно по-моему.
#298 #544898
>>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. Вроде в С нету такого оператора.
#299 #544900
>>544885
1. Да забей ты на её местоположение, нахуя тебе знать, где она лежит?
2. Если компилятор не вычисляет, то либо функцию используй, либо вычисляй заранее.
#300 #544901
>>544898
Я же. Теперь моя проблема.

Я родил пару минут назад гениальный код:

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. Хочу нормальный последовательный подход.
#301 #544903
>>544901
Сорян, звездочки проебал, там a это указатель, и (a + i) берется по адресу.
#302 #544952
>>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


Что-то типа объявление, определение, инициализация.

>>544901
char a[] = "abc";

> Хочу нормальный последовательный подход.


Сегфолт может быть либо потому, что по адресу ничего не замаплено (решается раздумьями, откуда в программе взялся такой указатель), либо потому что память не читается (то же), либо не пишется (то же + тут как раз может быть read-only память). Можешь сделать readelf -l и/или info proc mem и т. п. в gdb.
#303 #545020
>>544952

>Можешь сделать readelf -l и/или info proc mem и т. п. в gdb.


Спасибо, readelf мне показался трудночитаемым, да выше дата сегмента ничего нет, а вот (gdb) info proc mappingspmap) - это находка.
#304 #545072
>>544870

>зачем тогда K&R? время не резиновое


Затем, что классика. Но, согласен, если ты хочешь побыстрей всё выучить и начать зарабатывать деньги, то да, можешь не читать. Эта книга больше интересна тем, кто любит язык C и хотел бы узнать о нём, как можно больше.

>гуглишь статьи и вопросы на SO


Тащемто есть ещё man, если ты работаешь в UNIX-like ОС. Для меня это достаточно исчерпывающий источник информации. Под виндой, по идее, тоже должен быть аналог.
#305 #545109
>>544898

>Declaration - это дать знать компилятору о новой сущности, чтобы он мог искать ошибки с ее использованием


ты делаешь declaration переменной, расположенной в другой единице трансляции, чтобы сделать возможной ее использование в этой единице трансляции
компилятор же обрабатыват каждую единицу трансляции (по сути .c файл с кодом) по отдельности, формируя объектные obj файлы, далее линковщик все это собирает в исполняемый файл
другое дело, что правила declaration разные, для переменных нужно дописывать extern, для функций пишешь прототипы, свои заморочки есть для структур - тут разрабы языка поступили, как и в других случаях - строгость, формальность языка была приведена в жертву удобству и краткости
#306 #545125
>>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];

int main(void) {
extern void bar(void);
bar();
printf("foo[0] = %i\n", foo[0]);
return 0;
}

Магия! extern нет, размерность разная, definition нет, но это почему то работает. Не отвечай. Мы-то с тобой знаем, где здесь что, как работает, и какие тут проблемы. Но дай анонам самим подумать.
#307 #545196
>>545125

> Не отвечай. Мы-то с тобой знаем, где здесь что, как работает, и какие тут проблемы. Но дай анонам самим подумать.


ох ебать, ну что за выебоны
#308 #545258
>>545125

>выносящий мозг


Ну и что в нём выносящего?
Алсо С++ компилятор пошлёт тебя в жопу с твоими int foo[16384]. Пример говнокода as is.
#309 #545259
>>545072

>Но, согласен, если ты хочешь побыстрей всё выучить и начать зарабатывать деньги, то да, можешь не читать.


За живое задел. Я изучаю С УЖЕ отрезав время от других, более перспективных в отношении денег, вещей. И переутомление подсказывает, что совмещение всего мне пора заканчивать. С - самое интересное и, увы, самое низкоприоритетное из моих занятий, а время и силы в следующий раз где-то через год будут.
#310 #545274
>>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).

#311 #545303
>>545109
>>545125
Тут следукт понимать, что кроме стандарта есть и реализация, произвольная. Например, IAR такой код проглатывает, но не проверяет сигнатуру функций.

А от extern функций тоже бывает польза. Вот я в текущем проекте ими реализовал своего рода интерфейс модуля расширения, и проверка его корректности съехала, таким образом, на линковщик.
#312 #545311
Что за хуйню я читаю!? Это же пиздец ребята, я на Си не первый год сижу и никогда не заморачивался даже в самом битоёбском деле о такой хуйне, которая тут обсуждается. Впечатление такое, что здесь не Си изучается, а некая абстрактная хуета способная заглядывать в будущее. Зачем, зачем блядь заморачиваться над проблемой неоднозначно поставленой школьником для решения ведомых только ему, неформальных задач.
#313 #545319
>>545311
А хуле ещё обсуждать? Не инжекты в процессы же, лол. Зато сверху вон привели классический пример, из-за которого Си люто ненавидим. Любой, сука, зстет может превратить код в нечитаемое и несопровождаемое говно. Что в мэйнстримных языках сделать несколько сложнее.
#314 #545320
>>545274
Я и не говорил, что это хороший код. Я говорил, что этот код работает.

> J.5.11


Фактически, про UB там написано потому, что в одном translation unit может быть int, а в другом float, и тогда это, конечно же, UB. Одинакового размера. А механизм, позволяющий код типа >>545125 был введен в свое время не потому что >>545109

> строгость, формальность языка была приведена в жертву удобству и краткости


а потому что весь механизм заимствован и поддерживался для линковки с Fortran. И оно будет работать, потому что это де-факто стандарт и еще из-за того, что линкеру на стандарт сишечки похуй, что бы там комитет по этому поводу не думал. Хотя это и не повод так писать в наши дни.

>>545258

> С++ компилятор пошлёт тебя в жопу


У нас тут про сишечку тредик, если ты не заметил. А в сишечке это полностью валидный код. Ну, пока типы/размеры совпадают, да.

>>545303
Не совсем понял, о чём ты. Функции и так extern. Их можно сделать static, но по умолчанию они extern.
9 Кб, 420x237
#315 #545324
прошлый тонет тут https://2ch.hk/pr/res/544175.html

задачка такова.
есть ОП пик - на нем изображена оптопара.
необходимо на любом доступном вам языке написать код осуществляющий инкремент и декремент переменной в зависимости от вращения колеса относительно оптопары.

так как было очень дахуя тупых школоты=тролей которые в глаза не видали мышку с шариком.
оптопара это 2 расположенных максимально близко датчика излучения.
колесо диск похуй как назовите можно сравнить с колесом обычного веласипеда со спицами ПРИ ЭТОМ известно, что расстояние между датчиками в опто паре МЕНЬШЕ чем толщина спицы.
развадить электрически ничего ненадо.
тое
мы имеем 2 бита изменяющихся во времени - скорость обсчета заведомо больше на несколько порядков чем скорость реакции датчиков на внешнее возбуждение.

оп пик слегка изменен красным относительно колеса в масштабе показано соотношение окон датчиков и лепестков диска (спиц ебаного веласипеда)

в прошлом треде до конечной реализации так и не дошли( выдерну наиболее перспективнаи идеи.

>>544283
>>544300
>>544321
ну и как жеж без него)
>>544366

ну на тебе задачку решиш моя помосчь тебе наврятле больше понадобится.
#316 #545334
>>545320

>Я и не говорил, что это хороший код. Я говорил, что этот код работает.


В твоём конкретном случае работает. У кого-то это уже может не завестись. Для этого и существует понятие "неопределённое поведение". Например, если ты в 1.c сделаешь инициализацию

int foo[1] = { 1 };

то линковщик уже ругнётся.

>весь механизм заимствован и поддерживался для линковки с Fortran. И оно будет работать, потому что это де-факто стандарт и еще из-за того, что линкеру на стандарт сишечки похуй, что бы там комитет по этому поводу не думал.


Было бы ещё интересней, если бы ты какие-нибудь ссылки приложил к своему заявлению, где о подобном говорится.
#317 #545337
>>545324
Я несовсем понял задачу, но давай подумаем. Я так понимаю тебе нужно знать куда вращается колесо со спицами?
Суть проста - чередование активации фотодиодов задаёт направление.

Вот тебе функция:

//это должны быть названия твоих диодов и их коды, физически их сопоставь как левый\правый или передний\задний или верхний\нижний, а код может быть любым значением.

#define LEFT 0b00000001
#define RIGHT 0b10000000

unsigned char previous = NULL;

unsigned char kudablya(unsigned char value)
{
if(value & LEFT && previous & RIGHT)
{
previous = value;
return RIGHT;
}
if(value & RIGHT && previous & LEFT)
{
previous = value;
return LEFT;
}

return NULL;
}
#317 #545337
>>545324
Я несовсем понял задачу, но давай подумаем. Я так понимаю тебе нужно знать куда вращается колесо со спицами?
Суть проста - чередование активации фотодиодов задаёт направление.

Вот тебе функция:

//это должны быть названия твоих диодов и их коды, физически их сопоставь как левый\правый или передний\задний или верхний\нижний, а код может быть любым значением.

#define LEFT 0b00000001
#define RIGHT 0b10000000

unsigned char previous = NULL;

unsigned char kudablya(unsigned char value)
{
if(value & LEFT && previous & RIGHT)
{
previous = value;
return RIGHT;
}
if(value & RIGHT && previous & LEFT)
{
previous = value;
return LEFT;
}

return NULL;
}
#318 #545339
>>545337
Она принимает код активного диода и возвращает 1 из трёх значений - левый\правый и NULL, нужный для колибровки направления. Хотя о его нужности можно и поспорить. Тогда функция примет ваще примитивный вид

#define LEFT 0b00000001
#define RIGHT 0b10000000

unsigned char previous = NULL;

unsigned char kudablya(unsigned char value)
{
if(value & LEFT && previous & RIGHT)
{
previous = value;
return RIGHT;
}

previous = value;
return LEFT;
}
#319 #545342
>>545339
Однако для её правильной работы нужно колесо двинуть туда-сюда, чтобы условие начало выполняться.
#320 #545372
>>545334

> какие-нибудь ссылки приложил к своему заявлению


Ну, например: http://www.lurklurk.org/linkers/linkers.html#dups
#321 #545489
Пожалуй нубский вопрос, не обессудьте: аргументы командной строки можно раздобыть где-то вне main? Про GetCommandLine знаю, однако ж требуется универсальность. Спасибо.
#322 #545492
>>545489
нет
#323 #545677
>>545489

>аргументы командной строки можно раздобыть где-то вне main


Можно. Хуяришь глобальную переменную и оттуда ковыряешь данные по необходимости.
#324 #545845
>>545677
Я думаю, это и так было очевидно. Можно и как аргументы передавать другим функциям. Но в каждом случае тебе нужно сделать какие-то манипуляции в main() для этого.
#325 #545854
>>545845
Если у тебя нет контроля над main(), в чем проблема написать GetCommandLine и аналоги под каждую следующую платформу, которую необходимо поддерживать?
#326 #545867
Как на маке намутить gcc? Есть ли команда в терминале как в линуксе?
#327 #545869
>>545854
Доступ к комстроке вне main есть не на всех платформах.
#328 #545898
>>545489
обычно делают так: описывают структуру с полями где перечислены возможные аргументы, заводят глобальную переменную (зачастую сразу делают безымянную структуру), пишут функцию разбора - в нее прямо передается argc, argv, в этой функции происходит разбор и заполнение глобальной структуры
таким образом, main не засоряется - функция разбора вызывается один раз в самом начале
дальше уже пользуются данными из глобальной структуры, ну либо еще дописывают функции доступа и вызывают уже их, а не напрямую читают из структуры
#329 #545940
>>545869
Примеры будут?
150 Кб, 1280x985
#330 #545949
#331 #545986
>>545867
Анон, ответь
#332 #545991
>>545986
XCode, homebrew
#334 #546003
Ардуиноблядь в треде, посоветуйте книжку для ардуинобляди, чтобы ардуиноблядь смогла выйти за рамки ритмичного помигивания светодиодом.
#335 #546005
>>545992
чёт яннп
#337 #546008
>>546005
Типа коллекцiя закладок, собираемых сообществом.
#338 #546012
>>546008
А эти компиляторы не кривые? А то не хочу как на виндоусе со всякими ошибками в стиле "вы взяли scanf, а не scanf_s".
#339 #546017
>>546012
Спокойно, там внутри Darwin.
#340 #546021
>>546017
А можно поподробнее? Я в Си меньше недели, про все ништяки еще не знаю. Что за Дарвин?
243 Кб, 960x540
#341 #546026
>>546021
Ну я это, я.
#342 #546031
>>546006
О, привет. Тебя все еще не заебало таскать с собой это говно?

>>546012

> на виндоусе


-D_CRT_SECURE_NO_WARNINGS / -D__STDC_WANT_SECURE_LIB__=0
#343 #546039
>>546031
Что это?
>>546026
Нет, ну серьезно
#344 #546051
>>546039
Это магия, избавляющая майкрософтовый компилер от пропаганды _s, очевидно же.
#345 #546065
>>546051
Отлично. А по той ссылке что можешь порекомендовать взять?
426 Кб, 1111x1600
#346 #546185
>>544952
Вот спс!

>Либо ты пишешь снаружи функции


Ну по идее для базовых кодов, все всегда пишется внутри int main(), не? Я так и не совсем понял почему это так обязательно, тот же "printf("Hello, World!\n");" засовывать в main, почему без него то не работает?

>Поясни поподробнее. Может, тебе показывали код на асме для доступа к автоматической и статической переменной?


Ну наверное, это было на слайде, и там колонка была, типа программа резервирует память в этом месте и.т.д.
#347 #546194
>>546185

> Ну по идее для базовых кодов, все всегда пишется внутри int main()


Код да. А переменные можно делать глобальными (в пределах программы или только одного файла, причем последнее предпочтительнее). Ну, когда ты уверен, что это необходимо.

> засовывать в main, почему без него то не работает?


Так задумано. Код программы описывается функциями, выполнение программы начинается с функции main() и заканчивается после выхода из неё. Код вне функций никому не нужен, но можешь подумать, что было бы, если бы тебе разрешили так писать: ты линкуешь программу из двух файлов, в обоих код вне функций, какой из двух файлов должен выполниться первым? В плюсах есть такая проблема. Там у глобальных объектов конструкторы вызываются до main(). В случайном порядке.
#348 #546237
>>546065
Ананасы, нид совет, я вообще ничего не понял по той ссылке
#349 #546239
>>545492
>>545677
>>545898
Спасибо всем. Доступа к main нет от слова совсем просто. Странно что полно дряни типа errno, а argv, которые актуальны на всём протяжении работы, для любого потока в переменную не вынесены. Ну да и черт с ним.
#350 #546278
>>546239

>Странно что полно дряни типа errno, а argv, которые актуальны на всём протяжении работы, для любого потока в переменную не вынесены.


Я думаю, это связано с тем, что размер argv непредсказуем.
#351 #546292
>>546278
Хотя я сейчас подумал, что если учитывать, что argv, argc будут лежать на стеке main() на протяжении всей работы программы, то фактически не нужно их куда-то копировать в кучу. Тащемто действительно странно, что не продумали глобальный доступ к ним by design. Может, кто из местных анонов пояснит, почему так сделали.
#352 #546304
>>546278
Ну так-то в некоторых компиляторах (не будем показывать пальцем на Microsoft) есть __argc, __argv и даже __wargv.
#353 #546343
>>546292

>argv, argc будут лежать на стеке main


Лежать будут указатели на них.
А вообще командная строка хранится в process environment block (PEB) которые создается системой при старте нового процесса. PEB кладется куда-то в адресное пространство процесса, в отличие от остальных структур процесса, что прячутся в адресное пространство системы. Это для винды, под юниксами делается как-то похоже скорей всего.
Забирать агрументы командной строки можно еще и функцией GetCommandLine.
Но тебе это знать не нужно, тк ты слишком маленький еще.
#354 #546347
>>546343

> Забирать агрументы командной строки можно еще и функцией GetCommandLine.


> Но тебе это знать не нужно, тк ты слишком маленький еще.


Откуда в треде столько ЧСВшных уёбков? Про GetCommandLine ещё было сказано в сообщении, с которого началось обсуждение этой проблемы >>545489
#355 #546371
>>546343

> Лежать будут указатели на них.


Почему это? Будут лежать именно argc и argv. На x86 на любой ос их даже найти там можно без проблем (если main не модифицировала).

> А вообще командная строка хранится в process environment block


Скорее в _PEB.ProcessParameters, но тебе это знать не нужно, тк ты слишком маленький еще.
#356 #546372
>>546347
Не обращай внимания, у нас тут байтоебский чатик. А ты бы лучше рассказал поподробнее, зачем это тебе понадобилось?
#357 #546385
>>546372

>зачем это тебе понадобилось?


Я не тот анон, которому нужен доступ к argv вне main() из коробки. Я просто участвовал в обсуждении.
#358 #546398
>>546347
>>546371
Сосите хуй, в общем. Я элита, вы говно. На этом постить прекращаю.
#359 #546399
>>546398
Наконецто.
288 Кб, 1275x1755
298 Кб, 1275x1755
#360 #546411
тред скоро пизданеца о бамп лимит
над пилить перекат.

и от макаки требувать отдельного треда микроконтроллеры.
с двымя под ветками да с сиськами как у мамки ыыыыыыыыыыыыыыы

первая электроника второй код а третий дружба как у поней мать их так.
#361 #546419
>>546411
да дети да я пишу код еще под архитектуру ебаных конца восьмидесятых.
мне предлогает атмел я его нахуй шлю с его удобностью и сраными 3-5 мегагерцами.
тупым подсчетом реакции на прерывание мы видим что нас жестоко хотят наебать.
да проще да ненужен програматор да архитектура "ЗАТОЧЕННА ПОД С"
НО я на своем разогнаном ВИЖУ на порядок больше чем ты на сваих сраных 10 мегагерцах.
а если ты код неумееш писать кто тебе в этом виноват?.
мы имеем тоже что и вы да у нас нет встроенной флеши но кто мешает ее подключить?
написать код - размять сваи мазги
поиграть в угодайку погуглить даташиты всю хуйню.
#362 #546420
кстати электронщики не стоит использувать ету поебалу китайскую жидкай силикон для конечных устройств.
как правило все идет на скрутках или на пайке.
эта смола меня раз пиздец как подъхебла
смантировал ну и думаю пачистю пайку бянзинчиком ОГА - ЭТА ХУЙНЯ РАСТВОРЯЕТСЯ в бянзинчиге.
и термоусадка в гавно превратилась... плак плак.
девайс надо переделывать(
#363 #546538
>>546372
То не я, уже пояснили.
Мне-то просто знать наверняка надо было.
Я фана ради конпелятор теперь уже транслятор осилить пытаюсь, вот и использую в качестве "универсального ассемблера". Собственно и думал, не используя волшебных имён, подобно питону совместить тело програмы с блоком инициализации верхнего модуля и вынеся аргументы и прочее в отдельный модуль. Вобщем-то и так можно проинициализировать их из main, однако лишь для полностью подконтрольного приложения, не библиотеки например.
#364 #546584
>>546538
Библиотеке аргументы должны либо скармливаться явно, либо она вообще не должна о них знать.
sage #365 #547721
Окей, сосоны. Поясните мне за такую хуйню. Я не буду говорить о том, что может я дебил, скажу так. Я дебил и не понимаю, какого хуя, чтобы изучить стандарт С11, на котором считается, что я должен писать, я должен платить бабки блядь? Какого хуя? Это такая же хуйня как JPEG 2000. Они тоже требуют бабки за спецификации. Какого хуя? Что за на хуй хуйня? Как изучать С11 при таком раскладе? Может K&R новое издание вышло с изменениями. Просто это вообще пиздос полнейший. Я бы вообще не возникал, если бы сейчас на венде сидел, там меня масм устраивал, но бля... На прыщах нужно как-то адаптироваться к новым стандартам и все такое. Или не надо?
sage #366 #547722
>>518732
Го свой напишем? Ну типа WxWidgets только для сишки и более аккуратный/интуитивно понятный. Сделаем кашерный ученик по нему и плюсофаги соснут хуйца, т.к. весь мир перейдет на сишку, кек.
sage #367 #547725
>>518787
Ебать уебищен этот синтаксис AT&T. У интела няша
#368 #547779
>>547725
сорта говна
#369 #547781
>>547721
Ну вроде я находил бесплатные версии в тырнете.
#370 #547829
>>547721
препринты
#371 #547998
>>547721
Есть TR, там всё то же, но бесплатно. Тебе хватит. Если у тебя какие-то проблемы с этим, можешь на K&R/C89 писать - многие так и делают, фанатично искореняя всякие C99измы, какой уж тут C11.
sage #372 #548001
#374 #548019
>>548004
700 страниц, ебал я в рот
#375 #548025
>>548019
А ты вычти введение про environment (там, в основном для разработчиков ОС и компиляторов), описание стандартной библиотеки (если уже учил Си, там не так много функций добавилось), приложения (проглядеть по диагонали или вообще не читать), и из 700 останется 150 страниц про язык. Хотя учить язык по спеке - это максимум мазохизм, конечно.
#376 #548866
Байтоёбы, поясните ньюфагу, нахуя знать тыщщщу архитектур и кичиться этим? Какая нахуй разница: ARM, AVR, MIPS, x86? Ну кроме разрядности шины? Ведь сишному коду всё едино?
#377 #548871
>>548866
Если байтоёбишь просто потому что ты дохуя 1337, то чтоб выебнуться. Если для performance, то а как ещё-то? Конпелятор же не знает, какие у тебя данные, как они поступают и т.д. Да и в общем случае не всегда оптимально оптимизирует.
116 Кб, 1200x1200
#378 #548932
>>548866
Как ты без ассемблера напишешь полностью ядро ОС???
Нет у меня конечно получилось 1 раз, но это было только благодаря создателям тулчейна, которые сделали так, что все само сохранялось и восстанавливалось, и предоставили интринсики для работы с указателем стека...
#379 #548986
>>548866
Для общего развития, лол.
1) Сложный дебаг, дебаг чужого блоба, реверсинг.
2) Понимание, в какие примерно инструкции соберется код, помогает понять, как делать не надо (например, почему на этой конкретной системе исключения пиздец медленные, на этой часто можно пренебречь выравниванием, вот в той big-endian, и если ты хочешь совместимости, изволь ебать байтики, а вот та - вообще DSP с 24-битными словами, иди ищи пидараса, который к размеру int привязался).
3) Ну, и если у тебя сколько-нибудь критичный к скорости код, то ты рано или поздно придешь к Intel VTune Amplifier (или аналогу), а там без знания архитектуры никуда.
#380 #549127
>>548866

>нахуя знать тыщщщу архитектур


Я не думаю, что кто-то реально шарит в большом количестве архитектур. Обычно на какой-то одной специализируются, разве нет?

>Какая нахуй разница: ARM, AVR, MIPS, x86?


DA TI OHUEL

мимо-работающий-со-SPARC'ом
#381 #550558
>>548986

> на этой часто можно пренебречь выравниванием


Ты блять внатуре уебок чтоли? А ну пошел на хуй отседова на зассаные кресты, там тебе и место
#382 #550565
>>550558
Ну умеет x86 alignment fault проглатывать, ну пользуются этим часто. Оттого, что ты тут порвался, ничего не изменится ведь.
103 Кб, 599x527
#383 #550757
>>550558
На stm8 выравнивание не нужно, например...
340 Кб, 1746x864
#384 #552567
Си-нуб(Недавно закончил чтение C&R) просит помощи. Есть ли возможность реализовать в маздайной консольке цвитные строки, так, чтобы без особых костылей и надстроек над самой консолькой?
#385 #552571
>>552567
Консолька винды 8.1 шлёт нахуй управляющие последовательности ANSI.
Выручай анон.
#386 #552635
Накидайте что ли гитхабовских проектов на С, что бы можно было поковырять, да набраться уму-разуму. Желательно не что то крупное в котором можно утонуть.
#387 #552845
>>552635

ну зайди на мой, у меня там си-карнавал просто - https://github.com/artnavsegda/artnavsegda
#388 #552870
>>552635
sqlite почитай для начала.
#389 #553007
Подскажите API винды для получения информации о железе. Хочу посмотреть, получится ли так определить, что мы находимся под эмулятором.
#390 #553008
>>553007
Нагуглировал такую штуку.
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724958%28v=vs.85%29.aspx

Из той структуры, похоже, мало интересного можно узнать. Только о процессоре и архитектуре.
#391 #553010
>>552571
WinAPI
#393 #553198
>>553146
Ебать ты крут
#394 #553293
>>553007
Тебе нужно WMI + реестр на предмет всяких VirtualBox Additions.
#395 #553765
Поцоны, может кто силен в C и SYSV Shared memory одновременно?
Вобщем смысл в том, что нужно создать сегмент с заранее заданым shmid, а не рандомным, как делает функция shmid().
Далее аттач уже работает, и все хорошо.

Или подскажите, как такие сегменты создавать, чтобы id=0, 1, итд было, а не рандомное uint32_t число?
~ # ipcs -m

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 admin 666 557056 7
0x000006fd 32769 admin 666 12692 1
22 Кб, 593x271
#396 #553784
>>553765
А чем тебе не нравится рандомное число?
32 Кб, 604x209
#397 #553788
>>553765
Вот тут пример, как работать с шаред мемори.
https://www.cs.cf.ac.uk/Dave/C/node27.html
Базарю, ID знать не надо, надо знать key.
#398 #554019
>>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 не существует, т.е. его надо как-то создать.
#399 #554022
>>554019
Да, пробовал IDA на этих утилитах, но постиг неудачу: архитектура MIPS, а для нее нет hex-rays decompiler, и вообще многих штук, которые бы повысили читаемость кода до того уровня, чтобы я осилил листинг.
#400 #554084
>>554019
Ка грустно быть тобой!
Начнем с того, что стандарт posix определяет только api, соответственно нет переносимого надежного способа заставить shmget сгенерировать тебе сегмент памяти с id из определенного диапазона.
То есть в этой твоей пипиетарщине используют грязный хак с системными вызовами в обход uclibc.
И самое хуевое, что после обновления Ядра может перестать работать сама пипиетарщина.
#401 #554110
>>554084
Непереносимый код мне и не нужен, учитывая то, что эта проприетарщина также никуда перенесена быть не может.
Вот только я не понял, как там этот shmget дергает системные вызовы?
в системный вызов ведь также передается и key, т.е. получается там ядро хакнуто?

вот код uclibc:
int shmget (key_t key, size_t size, int shmflg)
{
return __syscall_ipc(IPCOP_shmget, key, size, shmflg, NULL, 0);
}

#define __NR___syscall_ipc __NR_ipc
#include "ipc.h"
_syscall6(int, __syscall_ipc, unsigned int, call, long, first, long, second, long,
\t\t third, void , ptr, void , fifth)
#402 #554127
Анон, подскажи, как на Си намутить безопасный массив. Гугл завален гайдами на С++, а на Си ничего нет.
#403 #554156
>>554127
А безопасный - это как? Границы проверять при доступе? Ну так сделай Array_Get, Array_Put и проверяй.
#404 #554177
>>554156
Да, границы от перезаполнения
#405 #554178
>>554156
Можешь рассказать поподробнее про эти две функции? Я первую неделю на Си
#406 #554181
>>554178
Не могу, я их выдумал. Если тебе нужно проверять границы - проверяй их при каждом доступе. Чтобы не забыть о проверке случайно, оберни доступ к массиву в функцию.
#407 #554185
>>554181
А как это реализовать? Ассертом?
#408 #554242
>>554110
Не обязательно, может там просто задана определенная конфигурация при которой может быть всего 16 сегментов, х.з короче.
47 Кб, 600x628
#409 #554247
>>554110
Обрати внимание на два крайних аргумента, что будет, если они будут не нулевыми?
#410 #554264
>>554247
они похоже, зарезервированы для совместимости, дальше вызов имеет вид:

case SHMGET:
return sys_shmget(first, second, third);

Проблема только одна: не могу найти код самого sys_shmget, может я настолько туп? Ищу в исходниках ядра, и не нахожу конкретики.
#411 #554265
>>554242
Не, их можно создавать через shmget с номерами явно большими, я проверял.
#412 #554277
>>554127
запили функцию, которой будешь контролировать все свои опасности и работай с массивом только через неё.
#413 #554316
>>518732
Ты забыл про Windows API.
91 Кб, 800x606
#414 #554369
>>554264

http://lxr.free-electrons.com/ident?i=sys_shmget
Надо в гугле искать, а не самому исходники рыть, она платформеннозависима, соответственно ты и не можешь её найти п кроссиплатформенном коде.
39 Кб, 599x448
#415 #554371
>>554264
А нет, она вполне себе кросс....
http://lxr.free-electrons.com/ident?v=2.4.37;i=sys_shmget
#416 #554374
Аноны, помогите начинающему. Есть допустим stdio.h, там прописана декларация функций и прочая-прочая. Остальное где? Откуда сами функции берутся? Как это всё происходит?
#417 #554392
>>554371
Спасибо, анон!
По твоей наводке удалось проследить, как оно создается:
отсюда http://lxr.free-electrons.com/source/ipc/shm.c?v=2.4.37#L231
идем сюда http://lxr.free-electrons.com/source/ipc/shm.c#L484
и начинаем греть голову, как бы это все вызвать в реальном коде. Пока идей нет.
#418 #554397
>>554392
А вот тут - ахтунг!
Этот файл из linux 2.4.х!
У тебя какая версия ядра?
#419 #554401
>>554397
У линуса на гитхабе это все тоже есть.
И да smid <= 16 это колдунство то еще,
такое впечатление, что эти куски памяти создаются в самом начале работы ядра.

А то, что программа как-то использует именно их - это все быдлокодерство и грязные хаки...
#420 #554424
>>554397
Да, там 2.6.30, я естественно с оглядкой на это ядро делаю.

>>554401
Да, сейчас попробовал: если не создано вообще ни одного shm-сегмента, то shmid первым создает сегмент 0, а вот уже второй сегмент создается с большим ID.
Теперь пытаюсь выяснить: то ли сегменты <16 все-таки можно создать, то ли создатели этого дела ебанутые, и остальные 15 никогда там не работали и не проверялись.
#421 #554427
>>554424
Короче, аноны, докопался:
http://lxr.free-electrons.com/source/ipc/util.h#L158

Получается, создать их все-таки можно, но не в текущем ядре, на котором крутится система.
т.к. по дефолту SEQ_MULTIPLIER = 32768, и соответственно, создаются сегменты с 32768*номер сегмента + id сегмента.
Итого, единственные вариант, где номера сегментов будут нужные: SEQ_MULTIPLIER = [0-15].
Теперь ищу в ядре, где это значение записано, и поменяю бинарно (а ядро тоже блобом, патчей, который накатил создатель этого дерьма - также нет).
442 Кб, 455x500
#422 #554432
>>554427

>SEQ_MULTIPLIER


http://lxr.free-electrons.com/source/include/linux/ipc.h#L8
Вот оно, держи.
школьник кун
190 Кб, 900x557
#424 #554438
>>554427
Я бы не стал так менять, ибо можно жестко наколоться!
Кто знает, что там еще поменяно???
школьник-кун
#425 #554443
>>554438
Ты так говоришь, как-будто у меня есть выбор!
95 Кб, 800x517
#426 #554446
>>554427

158 static inline int ipc_buildid(int id, int seq)
159 {
160 return SEQ_MULTIPLIER * seq + id;
161 }

265 new->id = ipc_buildid(id, new->seq);
266 return id;

Мне кажется, или тут fail???
59 Кб, 437x604
#427 #554450
>>554443
seq - это номер версии,

Если ты меняешь SEQ_MULTIPLIER, то у тебя пропадает история версий этого твоего сегмента, то есть ты не сможешь отличить текущий сегмент, от того, который когда-то давно освободили.

Походу, твои быдлокодеры считают, что сегменты создаются в самом начале работы...
#428 #554452
>>554446
Вообще, возвращает оно то, что надо, так что скорее всего id = key, new->id = shmid или что-то подобное.
287 Кб, 599x527
#429 #554453
>>554450
Ядро патчить не надо, попробуй передать вместо настоящего shmid вот такое значение:
shmid%SEQ_MULTIPLIER,
вдруг сработает???
#430 #554454
>>554450
Могу только сказать, что оно никогда не освобождается при работе, там даже перезапуск сервисов не предусмотрен.
Возможно этот юзерспейс писался для какого-нибдуь старого ядра, или для ядра с таким патчем:
http://www.programdoc.com/1272_129170_1.htm
Но я проверил, патч в ядро не брали, и в том ядрес, на котором все это работает, такого нет.
#431 #554456
>>554454
Вот это
>>554453
должно сработать, ибо похоже, для сегментов история не проверяется в ядре...
#432 #554457
>>554374
Нельзя тупые вопросы задавать, да?
#433 #554460
>>554456

> должно сработать, ибо похоже, для сегментов история не проверяется в ядре...



Не сработало: если таким образом модифицировать key, то id выдается тот же самый, ничего не меняется.
Если модифицировать id, то shmat (dst): Identifier removed
Т.е. зааттачиться к сегменту не выходит.
#434 #554461
>>554460
Значит ШМАТ проверяет версию сегмента, жаль.
#435 #554462
>>554460

>shmat (dst): Identifier removed


Ну тогда придется патчить ядро,
проследи все зависимости от SEQ_MULTIPLIER, и поправь их так, чтобы не было зависимости от версии.
#436 #554473
>>554374
А сами функции линкер берет из библиотек (.a, .lib) - там хранится набор уже скомпилированных в объектные файлы функций (статическая библиотека) или указания, в какую .so/.dll обратиться за этими функциями при запуске (динамическая библиотека). Одна из библиотек называется CRT (C runtime library) и цепляется автоматически, поэтому от тебя никаких телодвижений не требуется.
#437 #554477
>>554473
Спасибо, анон! А откуда линкер знает, к какой библиотеке это относится? Я просто пытаюсь разобраться в механизмах всего этого.
#438 #554488
>>554477
Вот я включаю заголовок либы в свой файл, по скобкам или кавычкам определяется локальный заголовок или нет. Потом что происходит? В заголовке не прописано ничего, только определение функций в данном случае.
#439 #554512
>>554488
Дальше у линковщика есть список дефолтных путей, в которых он ищет функции в библиотеках,которые там лежат, если нашел - добавил функцию в экзешник, если не нашел - будет ошибка.
#440 #554531
>>554477

> Вот я включаю заголовок либы в свой файл, по скобкам или кавычкам определяется локальный заголовок или нет.


Никакой разницы, системный это заголовок или твой. И даже заголовок ли это вообще (ты с тем же успехом можешь декларировать функции сам). Когда ты декларируешь, но не определяешь функцию или глобальную переменную, компилятор помещает в объектный файл имя (символ), помеченное как extern. Типы либо кодируются прямо в это имя (в С++, гугли name mangling), либо теряются (в С в лучшем случае в символ попадает общий размер аргументов функции).
На этом работа компилятора заканчивается, и в дело вступает линкер. У него перечислены объектные файлы (то, во что скомпилировалась программа), а затем библиотеки (дефолтная, плюс указанные тобой).
Линкер пытается для кажого extern (не определённого, внешнего) символа найти объектный файл, где определён символ с таким же именем (public символ). Т.е., он связывает, допустим, обращение к fopen из твоего объектного файла с тем объектным файлом, где лежит fopen. Поэтому он и называется линкер ("редактор связей" в старой русскоязычной литературе).
Если символ не был найден в объектных файлах, линкер идёт по списку библиотек (в том порядке, в котором они указаны). Когда он находит символ в одной из библиотек, он "достаёт" из библиотеки соответствующий объектный файл и добавляет его к списку объектных файлов, участвующих в сборке. Этот процесс повторяется, пока линкер не разрешит все extern-символы, или пока не закончатся библиотеки в списке. В первом случае линкер пойдёт компоновать исполняемый файл, а во втором он скажет "undefined reference to _some_name".
#441 #554544
>>554531
Блин, даже не знаю, как тебе благодарность выразить, настолько четко и ясно объяснил. Ебану вискаря за твое здоровье. Спасибо огроменное! Двач-помогач!
#442 #554558
помогите нульку, господа.
почему я получаю Segmentation fault(core dumped)?

http://pastebin.com/znRAfFhZ
#443 #554605
>>554558
Ты объявил указатель s в main, но: ты не инициализировал этот указатель, и в результате getchars пишет введённый текст в случайное место памяти (чаще всего в стеке). Поэтому программа падает.
Чтобы прочитать строку, тебе нужно выделить под неё буфер. Например, так: char s[MAXLINE]; или ты можешь использовать malloc().
#444 #554610
>>554605
спасибо!
#446 #554673
>>554646
Ты вконец охуел. Хотя бы вопрос сюда скопировал!

> Как узнать, сколько вордов занимает функция


Никак это не проделать в общем случае. Ты можешь пропарсить объектники или отладочную информацию, отсортировать и посчитать размеры но по ссылке совершенно справедливо пояснили за инлайн. Или можешь собирать без оптимизаций или с оптимизациями, но контролируя каждый билд дизассемблером и надеяться на то, что компилятор не меняет порядок функций. Но проще всего вынести всё необходимое тебе в .dll и посчитать хэш сразу всей кодовой секции.
sage #447 #554676
>>554673
Алсо, добавлю, что Visual Studio уже достаточно давно увлекается неполным склеиванием функций, превращая код в страшную лапшу, когда адрес конца функции меньше адреса её начала. Так что нужно очень внимательно смотреть за оптимизациями и прочим LTCG.
#448 #554677
>>554673
Пиздец, нахуя тогда в той книге этот пример с хешированием по вордам функции?
#449 #554680
>>554677
Книгу покажи. Алсо, по стандарту Си ты вообще не можешь никак читать код функций (нельзя конвертировать указатель на функцию в указатель на данные любого типа, даже в указатель на void и то нельзя).
#450 #554685
>>554680

>Книгу покажи


www.cs.arizona.edu/~collberg/.../lecture1.pdf
#452 #554696
>>554686
А. Ну смотри, раз ты в это лезешь, ты должен быть готов мириться со всем этим говном.
В книге гцц, в гцц можно брать адреса меток lecture1.pdf, страница 31, например - разница между двумя адресами даст тебе приблизительный размер функции. Иногда, лол. Когда-нибудь ты будешь делать "правильно", а пока просто собирай с -O0
33 Кб, 200x200
#453 #555803
>>518562 (OP)
Есть задача. Программу написанную на Си нужно переписать на ассемблер. Есть .ехе и .с файлы. Программа небольшая. Анон, помоги.
#454 #555849
Посоны, как работать с memmem? (_GNU_SOURCE)

можете привести пример рекурсивного вызова? (надо найти все позиции, которые создержат искомые бинарные данные)

просто когда я засовываю memmem в while() оно ловит segmentation fault, а если хоть 100 раз подряд написать без while - работает нормально.
#455 #555871
>>555803
А почему не хочешь, чтобы компилятор тебе ее на ассемблер переписал?
у GCC есть:
gcc -S hello.c
у других скорее всего аналогично.
#456 #556090
>>555849

> просто когда я засовываю memmem в while() оно ловит segmentation fault,


Покажи, как засовываешь.
#457 #556101
>>554696
Пиздец, нахуй тогда нужна такая защита, которая работает только иногда? Там еще дальше показывается, как шифруется секция кода от метки до метки, и выходит, что точно так же метки дадут только приблизительные границы шифруемого кода? Ебаное говно, нахуй это нужно вообще?
#458 #556114
>>556101
Если ты будешь делать в реальности что-то защищать, ты можешь, например, взять свой объектный файл с защищаемым кодом и посмотреть/посчитать в дизассемблере точную длину функции. Или пропарсить объектный файл, отсортировать символы и считать функцией все байты до следующего символа.
Если же ты шифруешь секцию целиком, ты можешь просто распарсить заголовки исполняемого файла, там будут точные размеры и офсеты секций - их загрузчик использует.
Ещё протекторы делают макросы для программиста с _emit (http://stackoverflow.com/questions/731428/what-is-the-equivalent-of-emit-on-linux) последовательностей магических байтов в нужных местах функции, протектор их ищет в бинарнике и заменяет эти последовательности и код между ними на шифрованный эквивалент. Например, https://www.google.com/search?q=макросы%20themida
#459 #556275
>>556114
Насколько сложно самому написать парсер объектных файлов и как это можно сделать? Ничего не нагуглил об этом.
#460 #556587
http://pastebin.com/LiMhctkb
Анончик, почему сишка - неортогональное говно?
#461 #556593
>>556587
Потому что переменные любого типа приводятся к int.
49 Кб, 560x373
#462 #556669
А где можно посмотреть на различные коды написанные на C?
Есть ли сайт где можно сортировать списки кодов по просмотрам, фаворитам, дате?
Мне было бы интересно полюбоваться различными интересными кодами (с комментариями естественно), ну например код в котором все слова переводятся в верхний регистр (uppercase).

И кстати, может кто-нить подсказать, где все программеры тусуются? Ну на каком сайте/irc канале? русскоязычный/англоязычный
а то я только про канал #C на freenodes знаю
#463 #556672
>>556669

>А где можно посмотреть на различные коды написанные на C?


Скачай бубунту, там их дохуищща.

>Есть ли сайт где можно сортировать списки кодов по просмотрам, фаворитам, дате?


нет.

>И кстати, может кто-нить подсказать, где все программеры тусуются?


Да ты ебанулся, программеры не тусуются, это противоречит их естеству.
#464 #556710
>>556114
(MS) COFF - очень просто, ELF чуть сложнее. Можно готовые либы найти. А вообще, гугли форматы. Можешь википедию для начала почитать.

>>556669
На гитхабе есть поиск по языку, тебе мало? Ну иди на ideone, pastebin, govnokod.
#465 #556729
>>554680
Что то мне кажется ты немножечко пиздишь. Хоть я и не пытался прочесть из оперативной памяти код программы, но точно знаю, что имея указатель, любые данные на которые он указывает, можно обрабатывать как данные того типа, в котором ты хочешь их видеть. В конце концов, стандарт Си распространяется скорее всего только на компилятор, что не мешает присвоить адрес функции указателю на данные так же легко, как присвоить значение переменной. Совсем другое дело, если ограничения ОС по работе с оперативной памятью будут мешать прочесть данные по указателю, но даже чисто теоретически - функция в одном процессе с программой, а значит должна быть в одном адресном пространстве и может быть как минимум прочтена, а как максимум скопирована куда нибудь и исполнена.
#466 #556742
>>556729
Я не знаю, как устроены ограничения по работе с оперативкой, однако если их нет по отношению к изучаемой функции, то есть уйма способов вытянуть адреса начала и конца функции и самый простой - найти сигнатуру соответствующую команде jmp на адрес команды исполняемой после вызывающей функции.
#467 #556745
>>556742

>функцией


функцию

фикс
#468 #556746
>>556729

> Что то мне кажется ты немножечко пиздишь


Я говорил ПО СТАНДАРТУ (преобразование указателей на данные в указатели на функции упоминается в Common Extensions, но это не портабельно).

На x86 ты можешь читать код. Но не ограничивайся x86, ознакомься, например, с https://ru.wikipedia.org/wiki/Гарвардская_архитектура

>>556742

>найти сигнатуру соответствующую команде jmp


Существует как минимум три способа вернуть управление на x86 и ещё десяток других на других архитектурах. При этом они все могут применяться в одной и той же функции, т.к., return может быть несколько, да и компилятор может парочку своих воткнуть.
#469 #556836
>>556746

>При этом они все могут применяться в одной и той же функции, т.к., return может быть несколько, да и компилятор может парочку своих воткнуть.



ааа, внатуре
#470 #556967
>>556275
в потрохах бекэндов яп очевидно же
#471 #558872
Ананасы, недавно решил начать учить Си самостоятельно, но чую, что не хватает практики с алгоритмами. Посоветуйте какую-нибудь книжку, где упор делается именно на составление красивых алгоритмов.
Аноним #472 #559214
>>558872
http://drakon.su/
Тут есть всё, что тебе нужно знать об алгоритмах и их красивом оформлении.
Аноним #473 #559216
>>559214
Чтоб не блукал по ссылкам
http://drakon.su/biblioteka/start
sage #474 #559389
>>559214
Ты опять выходишь на связь?
12 Кб, 597x392
#475 #559428
мб кто подскажет почему в кусочке этого кода оба массива заполняются одними и теми же элементам хотя должо быть наоборот
#476 #559470
>>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) Перепиши это говно.
10 Кб, 263x193
prime number #477 #559535
Пытаюсь найти наименьший prime number greater than the inputted value (наименьшее простое число, которое больше чем введенный номер).

Допустим, юзер ввел 8, а программа должна найти следующее простое число (prime number) = 11.
https://ideone.com/uKcWmo

Кстати, как мне "дебугнуть" мой код? А то он чето не пашет сейчас. У меня есть встроенный lldb, который работает как gdb debugger.

Я ввел в него скомпилированный код test.out
а дальше попытался дебугнуть этот код, не получилось.
#478 #559554
>>559535
Ты документацию к lldb читал? Так иди читай.
http://lldb.llvm.org/tutorial.html
http://lldb.llvm.org/lldb-gdb.html
Файл ил консоли lldb грузится командой "file test.out".
#479 #559927
>>559535
У тебя в программе нет ни генератора простых чисел, ни проверки делимости (кроме 2 и 3).
#480 #562156
Хочу попросить помощи для студента-первокурсника, чтобы добрые аноны помогли разобраться в постейших лабараторных на си.
Хочу очень во всем этом разобраться.
Мои контакты: golffstream@yandex.ru
#481 #562158
>>562156
А напиши их сюда, мне вот оче интересно что за лабораторные,
мимобезвышки
2464 Кб, 2236x2236
2153 Кб, 2322x1899
#482 #562169
>>562158
Очень простые. Но я хотел бы именно позадавать вопросы, понять.
Задание номер 10
#483 #562227
Среда monodevelop, Ubuntu 14.04, math.h добавлен, в параметрах компиляции прописано -lm -lSDL -lGL -lc -lgcc

Error: undefined reference to `sinf' (5555)

Какого хуя, а?
#484 #562233
>>562227
А, и компилятор GCC.
#485 #562754
>>562227
Покажи финальную командную строку линкера.
92 Кб, 175x175
#486 #563795
Привет, погроммач, я тоже первокур, который мало чего понимает.
Помогите мне, пожалуйста, разобраться с самым простым.
Нужно разобраться, как работают циклы (особенно те, што считают суммы квадратов чисел, считают всякую тригонометрию) и массивы; и как, сопсно, обозначать и правильно использовать переменные, как подбирать нужные к ним действия.
Лучше по скайпику линк: "gnwoerk", штобы тут не засорять.
Надеюсь на доброту анона.
#487 #563836
>>518562 (OP)
Приветствую вас. Ни у кого случайно не завалялась реализация фибонначиевых куч на си? Был бы ультра благодарен за подгон. lonelypath[at]yandex.ru если что. Всем счастья.
#488 #563873
>>563795
>>563836
Что за хуесосы в православном треде?
#489 #564224
>>563873
А што, собствинна, не так? Мммм?
#490 #570112
Анон, какая есть функция в СИ, чтобы округлить дробную часть числа до определенного десятка. Например, число 2.982001 до 2.982000
#491 #570130
>>570112
До тысячных?
floor(2.982001*1000) / 1000, но имей в виду, что не все числа могут быть точно представлены в виде float или double.
#492 #570133
>>570130
Спасибо, надеюсь сработает
#493 #570139
>>570133
Если тебе жизненно необходимо точное представление, изобрети свой fixed-point и храни тысячные в целочисленной переменной (т.е., например, не метры с плавающей точкой, а миллиметры без нее).
#494 #570142
>>570130
Ты можешь объяснить почему это так работает?
Я знаю что такое флор, но вот именно как ты сделал до тысячных, а если мне надо до 10000сячных?
#495 #570179
>>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 и умножаешь/делишь. Это арифметика школьная, куда точку поставить.
#496 #570186
>>570179
Спасибо большое, так и думал
#497 #571325
Есть живые?
Объясните нубу как пользоваться pipe. Вот есть у меня легендарный процесс A и его дочерний популярный процесс B, я ввожу некие данные в A, но мне нужно передать их в B, обработать их там и вернуть результат в A, как это провернуть?
31 Кб, 491x311
#499 #572109
>>571867
Спасибо, буду мозг ебать пытаясь зрозумить.
#500 #572379
>>571325
Методов на самом деле дохуя,
выбор зависит от задачи...

У тебя процессы, или так, потоки?
Если процессы, то они крутятся на одной машине, или могут быть на разных?
#501 #572391
Спрошу в тонущем треде, дабы не засорять раздел.

>>572109

>зрозумить


Одни хохлы, блядь. И под кроватью хохлы. Вы всегда были или набижали после скачек? Не замечал вас до 2013 года в русскоязычном сегменте интернета. Даже вконтакте вас особо заметно не было.
#502 #572426
>>572391
Скоро сам забалакаешь на ихней мове.
#503 #572534
>>572379
Ну я просто учусь пока, процессов 2 (про дочерний я напутал чутка): запускаю процесс (программу), ввожу туда пачку значений (пускай будет 2, не суть важно наверное), запускается второй процесс через execl, который по pipe должен получить эти значения, обсчитать и вывести результат. Находятся они на одной машине, до сетей пока еще не дошел.
>>572391
Мань, заспокойся, руssкий я, руssкий.
#504 #572994

>#include <iostream>


>#include <sstream>


>#include <algorithm>


>#include <iterator>


>


>int main()


>{


> std::string str;


> std::getline(std::cin, str);


> std::istringstream ist(str);


> std::copy(std::istream_iterator<std::string>(ist),


> std::istream_iterator<std::string>(),


> std::ostream_iterator<std::string>(std::cout, " ") );


>}


Как этот кусок(удаляет лишние пробелы между словами) переписать на Си, посоны? Желательно объяснение для моего уровня дцп-кодера.
#505 #573136
>>572994
Это кресты? Ну и пиздец же
#506 #573140
>>572994
char input[100] = {"surprise mother fucker"};
char result[100];
// fgets(input, 100, stdin);
for (int i, j = 0; i < strlen(input); i++, j++) {
\tif (input == ' ') {
\t\twhile (input[++i] == ' ') {}
\t\tresult[j++] = ' ';
\t}
\tresult[j] = input;
}
printf("%s\n", result);
#508 #573167
>>573136
Ага, они самые.
>>573145
Не работает. Когда запускаю ничего в консоли не выводит и потом закрывается. В кодблокс компилировал если что.
#509 #573169
>>573167
Лол, в Дев спп работает, но после выполнения есть строка >щ@
#510 #573172
>>573169
А если по одному символу вводить, то нет этой строки.
#511 #573177
Всё, заработало. Спасиб :3
#512 #573247
Вернемся к вопросу по pipe, издание второе уточненное и дополненное: как положить данные в pipe в процессе А, а потом забрать их оттуда в процессе B?
#513 #573595
#include <stdio.h>
#include <stdlib.h>

int main()
{
int n=0, i=0, j, k=0, x=0;

FILE input, output;

if ((input = fopen("input.txt", "r")) == NULL)
printf("no file\n");
else
fscanf (input, "%d", &n);
output = fopen("output.txt", "wt");
while (k<=n)
{
k=0;
i++;
x=x+i;
for (j=1; j<n; j++)
{
if((x%j) == 0)
k++;
}
}
fprintf(output,"%d",x);
fclose(input);
fclose(output);

return 0;
}

помогите, какого хуя программа не завершается. просто запускается и нихуя не происходит. из дебага нихуя не понятно
#513 #573595
#include <stdio.h>
#include <stdlib.h>

int main()
{
int n=0, i=0, j, k=0, x=0;

FILE input, output;

if ((input = fopen("input.txt", "r")) == NULL)
printf("no file\n");
else
fscanf (input, "%d", &n);
output = fopen("output.txt", "wt");
while (k<=n)
{
k=0;
i++;
x=x+i;
for (j=1; j<n; j++)
{
if((x%j) == 0)
k++;
}
}
fprintf(output,"%d",x);
fclose(input);
fclose(output);

return 0;
}

помогите, какого хуя программа не завершается. просто запускается и нихуя не происходит. из дебага нихуя не понятно
#514 #573638
>>573595
Бесконечный цыкол
#515 #574063
>>573247
Сам разобрался.
#516 #576540
Пора перекат пилить. Кто решиться стать опом?
#517 #579551
>>518562 (OP)

Запилил перекат.
Все у кого есть глаза, приглашаются сюда >>579550 (OP)
#518 #579760
>>573595
как верно заметил >>573638 , у тебя бесконечный цикл.
При каждой итерации ты присваиваешь k = 0
[CODE]
while (k<=n)
{
k=0;
[/CODE]
Тред утонул или удален.
Это копия, сохраненная 26 ноября 2015 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски