Этого треда уже нет.
Это копия, сохраненная 28 января 2016 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
78 Кб, 792x1023
C Programming Language #3 #609376 В конец треда | Веб
Третий тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годныму средству программирования как на системном, так и на прикладном уровне.

Что читать:

- Классика от Отцов: http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/%7Eats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs

Чем конпелировать:

- Очевидный GCC.
- clang: оче годно, батя рекомендует. Дрочим на --analyze.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека" (да, в студию в последнее время завезли stdint и stdbool, почти все новые фишки из C11, static_assert и даже юникод). C snprintf все до сих пор плохо. Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (в частности, потыкать threads.h и stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99.
- Borl... ээээ...

Что еще почитать:

http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.

Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.

Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.

Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).

Ben Klemens "21st Century C: C Tips from the New School" (2012)

Stephen G. Kochan "Programming in C (4th Edition)" (2014)

Прошлые треды:

- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
#2 #609388
пук
#3 #610139
>>609376 (OP)
Посоны. Че там ~у хохлов~ в новом стандарте?
Шаблоны завезли? Многопоточность завезли?
Как там вообще?
#4 #610151
>>610139
Завезли еще немного юникода (никто не пользуется), многопоточность (никто не пользуется) и костыль вместо шаблонов (погугли _Generic). Ну и еще немного плюшечек туды и сюды. Как-то так.
Проектирование на Си #5 #610977
Кто-нибудь когда-нибудь видел книжки о том, как правильно проектировать на Си? Что-нибудь вроде Александреску или Б4. Всё что удалось найти это обоссаная книжка про эмуляцию ООП, что и без неё ясно.
#6 #610993
>>609376 (OP)
Благословляю хорошую шапку.
мимокрестоанон
#7 #611091
>>610977
Си, по сути, остается таким же незамысловатым процедурным языком, каким он был в семидесятых. Правда, теперь в нем есть ограниченная поддержка модулей, опирающаяся на два ключевых слова: extern и static. Поэтому старые добрые книжки по структурному программированию тебе в помощь.
#8 #611108
Какие плюсы у чистого си?
78 Кб, 1252x1080
#9 #611115
>>611108
Два плюса.
#10 #611121
>>611115
Шутку про инкремент этому господину.
#11 #611170
Посоветуйте, как продумать архитектуру для такой библиотеки.

Надо строить конечное поле Галуа, в котором определены операции над многочленами. Степень расширения не более чем 32 из-за ограничения встроенных типов. Характеристика базового поля равна 2.

Предполагаю, что основой библиотеку будет функция GF(unsigned polynomial), которая возвращает указатель на таблицу индексов на куче. В функции GF надо определить номер старшего бита в переменной polynomial и снять с нее маску. Она нужна для построения таблицы индексов (определение переполнения разрядной сетки).

Для конкретной реализации конечного поля надо где-то хранить базис этого поля и следы базисных элементов. Думаю, что надо завести структуру gf, в которой будет храниться таблица индексов, таблица базисных элементов, таблица следов и, возможно, что-то еще.

Пусть необходимое поле уже построено, и информация о нем хранится в структуре gf. Как при помощи этой структуры выполнять операции над многочленами типа умножения, возведения в степень, нахождения обратного? Если умножением занимается функция gfmul, то как выглядит ее вызов, если многочлены хранятся в таблице индексов? gfmul(gf->index[5], gf->index[11])? Это же ебаный вырвиглаз. Хранить в структуре gf указатели на функции, которые реализуют арифметические операции над многочленами? То есть, если надо умножить два многочлена, которые представляют собой 5-ю и 11-ю степень порождающего многочлена, я могу захотеть сделать это вызовом gf->mul(5, 11). Поэтому функция mul должна как-то уметь находить в gf->index[] 5 и 11 элемент. Причем она объявлена отдельно, но сама является частью структуры gf и должна уметь пользоваться данными из этой структуры. Выглядит как говно.

На чистом си вообще можно написать что-то сложнее вирусов и консольных калькуляторов?
#12 #611202
>>611170

>На чистом си вообще можно написать что-то сложнее вирусов и консольных калькуляторов?


Линукс?
#13 #611209
>>611202
Я имею в виду полезное прикладное ПО, а не говно мамонта. На чем пишутся математические библиотеки? Как люди пердолятся со всем этим говном, не умеющим в архитектуру?
#14 #611214
>>611209
Ядро Андроида - говно мамонта?
#15 #611239
>>611214
Это порезанное ядро прыщей => говно мамонта.
#16 #611244
>>611239
https://ru.wikipedia.org/wiki/Ядро_Linux

> Последняя версия: 4.3 (2 ноября 2015)

#17 #611252
>>611244
Ондроед на троечке базируется.
В любом случае, это легасиобразное говно мамонта вызванное недостаточным развитием железа.
15 Кб, 250x188
#18 #611260
>>611252
Профессор, вам до сих печет от успеха Линукса?
#19 #611300
>>611260
Блять эти очки, рубашка и причёска. 100 процентый пидораха нахуй. Наверняка преподаёт в каком-нибудь засраном МГУ и втирает про успешность советской науки даже почти наверняка не читал никаких книг кроме советских. А эта улыбка в конец разозлила. Ещё и линукс ему наверно не угодил по вымышленной причине типа пользуйтесь отечественными аналогами.
#20 #611310
>>611300
Зекач такой зекач, как можно не знать Таненбаума?
https://ru.wikipedia.org/wiki/%D0%A2%D0%B0%D0%BD%D0%B5%D0%BD%D0%B1%D0%B0%D1%83%D0%BC,_%D0%AD%D0%BD%D0%B4%D1%80%D1%8E

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


> Computer Networks, ISBN 0-13-066102-3


> В переводе: Компьютерные сети, ISBN 5-318-00492-X


> Operating Systems: Design and Implementation, ISBN 0-13-638677-6


> В переводе: Операционные системы: разработка и реализация ISBN 5-469-00148-2


> Modern Operating Systems, ISBN 0-13-031358-0


> В переводе: Современные операционные системы, ISBN 978-5-498-07306-4


> Также написал:


> Structured Computer Organization, ISBN 0-13-148521-0


> В переводе: Архитектура компьютера ISBN 5-469-01274-3


> Distributed Systems: Principles and Paradigms, ISBN 0-13-088893-1


> В переводе: Распределённые системы. Принципы и парадигмы ISBN 5-272-00053-6


> Книга «Операционные системы: разработка и реализация» (англ. Operating System: Design and Implementation) и Minix [1] вдохновили Линуса Торвальдса на создание ядра Linux. В автобиографии Just For Fun Торвальдс описывает её как «книга, которая подняла меня на новую высоту». Впоследствии Таненбаум написал распределённую операционную систему Amoeba, полностью реализующую идею микроядра.



Только вот Linux взлетел, а профессор со своими микроядрами соснул.
#21 #611316
>>611300

> 100 процентый пидораха нахуй. Наверняка преподаёт в каком-нибудь засраном МГУ и втирает про успешность советской науки даже почти наверняка не читал никаких книг кроме советских.



Хотя вообще-то возможно, лол. Вот Вирт к примеру типичный пидорашка, любит рассказывать охуительные истории как американские рептилоиды убили европейскую науку. И СССР ему нравится.
#22 #611317
>>611316

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


Покажи
#23 #611321
>>611170

>На чистом си вообще можно написать что-то сложнее вирусов и консольных калькуляторов?


С в этом плане не так сильно отличается от любого ООП языка, ну наследования нет (бери в руки препроцессор), шаблонов (препроцессор), ну вместо this->yoba(x) надо писать yoba(this,x), нет перегрузки операторов (вместо a+b надо писать add(a,b)), исключений (вместо add(a,b) надо писать Result add(T a, T b, Tab_result), и возврата кортежей (Result add(T a, T b, Tab_result, T result2), и буфер надо выделять вне функции (вместо vector = yoba(a) надо писать vector=malloc(...);yoba(a, vector)).
Но так все точно так же, определяешь структуры данных, прячешь имплементацию в .c файл, чтобы наружу торчала только struct
yoba;, пишешь конструктор, деструктор, и вперед.
#24 #611322
>>611317
Лекция, когда он приезжал в Россию, ЕМНИП в блоге Алены C++ было видео. О том, какая была передовая система Lilith и язык Oberon, но нам навязали Windows и C++.
#25 #611324
Аноны, на русском есть годные книги для ньюфагов?
#26 #611325
>>611324
add. по c#
#27 #611326
>>611321
Вот смотри более-менее нормальный сишный интерфейс для математики https://github.com/ampl/gsl/blob/master/spmatrix/gsl_spmatrix.h
4487 Кб, 300x325
#28 #611404
>>610151

>юникода (никто не пользуется)


збсь, можно будет запиливать нормальную человеческую интернационализацию в прошивках бытовых приборов.

>многопоточность (никто не пользуется)


збсь, можно будет запилисть реализацию "стандартной" многопоточности на базе BuguRTOS

>костыль вместо шаблонов (погугли _Generic)


спорная хрень, пока не знаю, как применить...

школьник-кун
#29 #611405
>>610977
Проектирование ПО != паттерны конкретного языка.
#30 #611411
>>611300
Как же я проиграл, хоспаде.
950 Кб, 2048x1536
#31 #611413
>>611209

>Как люди пердолятся со всем этим говном, не умеющим в архитектуру?


Ебанашка, а как связаны архитектура и язык программирования?

Или ты думаешь, что аррхтектура, это когда ООП искаропки?

Тогда у меня для тебя плохие новости!
#32 #611552
Подскажите хороший IDE, пожалуйста.
#33 #611553
15 Кб, 266x35
#34 #611598
>>609376 (OP)
Что делают эти строки?
Что делает тильда?
#35 #611676
1. Записывает в переменную setting результат побитового и переменной Code и макроса-маски SET_IOCTL.
2. Обнуляет в переменной Code биты по маске SET_IOCTL.

Тильда - побитовое не.
#36 #611707
>>611598
& - побитовый and. То есть
0110101 &
1100110 =
0100100

~ - побитовый not:
~101010111
=010101000

a &= b - краткая запись a=a&b
#37 #611733
sage #38 #611898
Чому если я считываю строку с помощью
fgets(str, 128, stdin);
и использую strcat, например
strcat(str, str1);
он строки объединяет с переносом т.е. выводить будет не
"строка1строка2" а
"строка1
строка2"
а если использую gets(str);
тогда все нормально.
В чем подвох?
#39 #611899
>>611898
Сега прилипла
#40 #611992
26 Кб, 500x335
#41 #612027
>>611992
Пайк, залогиньтесь.
#42 #612125
>>611898
Потому что fgets сохраняет \n в буфер, а gets ее ждет, но не сохраняет.
#43 #612129
>>612125
Алсо не используй gets, ты ему не можешь указать размер буфера и может быть buffer overflow.
#44 #612160
>>612129
fgets лучше gets?
#45 #612165
#46 #612166
>>612165
Как тогда строки без переноса объединять?
#47 #612214
>>612166
Ну идея в том, чтобы \n заменить на \0.
[code lang="c"]
char str1 = "world";
char buf[128 + strlen(str1)];

fgets(buf, 128, stdin);

char
pos = strchr(buf, '\n');
if (pos != NULL) *pos = '\0';

strcat(buf, str1);
printf("%s\n", buf);
[/code]
165 Кб, 960x634
как связать передвижение авто и светофор? ВСЕМКУМЫСА! #48 #613026
Необходимо реализовать программу "автомобильный перекресток со светофорами"

Светофор у меня будет работать по таймеру
Класс авто будет иметь функции передвижения и остановки.

Как проверять значение светофора? как проверять свободна ли полоса для поворота?

Как связать передвижение авто и светофор?

Я в этой теме ньюбас, так что остудите горящие пуканы пжалста.
#49 #613184
>>613026
Ну там потоки, семафоры, мьютексы... Вот это вот всё.
#50 #613227
>>613026
Я б перекресток как граф рассматривал, вершина графа - собственно полоса. Например с правой можно прямо (в идеале не меняя полосы, но можно) и направо только в крайнюю полосу, с центральной только прямо (опять же в свою полосу), с левой только налево в любую полосу (например). Быдлорежим "с левой полосы направо ты тачку мою видел еп" пока не рассматриваем.

В простейшем случае если на ребре графа есть машина, остальные "не занимают" перекресток и стоят за стоп линией, даже если на действие в данной полосе зеленый свет, если посложнее - посчитать, сколько машин вместит одно ребро графа (длина ребра/(длина машины+стандартная дистанция между машинами).

Как-то так, вот такие идеи. По идее рисовать надо, но ломак.
#51 #613426
Дано натурально число, записать его цифры. Т.е. 12356 дается, записываю 1 2 3 4 5 6.
Можно просто считывать scanf("%s", &str); и через цикл выводить?
#52 #613434
>>611552
Borland C++ Seattle, скачай на рутрекере.
#54 #613493
>>613485
У меня к тебе вопросы.
1)Что значит size_t
2)Что значит asprintf и snprintf
3)Что значит putchar
#55 #613502
Тест
#56 #613506
>>613493
size_t - это беззнаковый целый тип. Ну типа натуральное число. Я бы мог еще добавить, что он имеет разрядность, достаточную для хранения указателей, но лучше не буду. В принципе, можешь заменить size_t на unsigned int. В большинстве случаев эти типы совпадают.

asprintf - форматированный вывод в строку. Память под результирующую строку выделяется автоматически. Ты даешь этой функции неинициализированный указатель на строку, а она сама выделит памяти столько, сколько нужно. Эта функция является расширением GNU и не входит в стандарт.

snprintf - почти тоже самое, но есть два нюанса. Память под результирующую строку должна быть выделена заранее (хоть на стеке, хоть в куче, хоть в статической памяти). Функция считывает не более n символов, включая завершающий нуль (n передается в качестве второго аргумента). Есть еще sprintf, но я бы не советовал, ибо она не контролирует количество считываемых символов. snprintf входит в стандарт C99.

putchar - вывод одного символа.
#57 #613509
>>613434

> Borland


> C++


Уходи.
#58 #613522
>>613506

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


Правильнее сказать, что он имеет разрядность, достаточную для хранения размера любого объекта (т.е, для хранения результата sizeof). Размер указателя теоретически может быть как меньше, так и больше размера size_t.

>>613485

> вариант рабов Стандарта


В случае отсутствия asprintf, она реализуется буквально тремя строками. Хорошая, удобная функция, как и strdup, которой тоже в стандарте нет. А вот хранить в size_t что-то, не являющееся размером, количеством или индексом - моветон.
#59 #613526
>>613506
зачем size_t, когда есть unsigned int?
#60 #613530
>>613522

>Правильнее сказать, что он имеет разрядность, достаточную для хранения размера любого объекта


Точно. Спасибо. Это я с D уже путаю. Там по спецификации: size_t is an alias to one of the unsigned integral basic types, and represents a type that is large enough to represent an offset into all addressible memory.

>В случае отсутствия asprintf, она реализуется буквально тремя строками.


Если человек спрашивает, что такое putchar, врядли стоит грузить его такими вещами.

>моветон


В данном случае некритично, я считаю.

>>613526
Потому, что тупо пишется короче. Можно, конечно, взять какой-нибудь uint32_t, но это же дополнительный хедер подключать надо.
#61 #613531
>>613530

> Если человек спрашивает, что такое putchar, врядли стоит грузить его такими вещами.


Врать не стану, но про asprintf и snprintf я не очень понял.
Как я понял то что они динамически выделяют память. Ты даешь указатель на строку, а она выделит сама столько сколько надо. Но для чего это используется я не понимаю я до конца не понимаю.
#62 #613557
Немного не по адресу, но как убрать окно список ошибок, чтобы оно вообще не открывалось и осталось только окно вывод?
112 Кб, 1280x775
#63 #613559
>>613531
Хорошо. Давай попробуем с коментами.
#64 #613562
>>613559
Все, все стало понятно.
Если будут не цифры, а символы, то тогда
len = asprintf(&s1, "%c", str);
Или нет?
121 Кб, 1280x775
#65 #613563
>>613559
Да, забыл еще кое-что. Если ипользуешь asprintf, то потом выделенную память желательно освободить. Обрпти внимание на строки 2 и 22.
#66 #613565
>>613563
Освобождаем чтобы потом можно было повторно использовать s1, ну и чтобы не грузило так сказать?
#67 #613567
>>613562
Вот смотри. Есть функция printf. Она принимает формат и список переменных/констант для вывода. Функция выводит все указанные переменные и/или константы на стандартный вывод (чаще всего в консоль) в соответсвии с форматом. То есть, она все конвертирует в строку.

Функция asprintf делает тоже самое. Только она сконвертированные данные сохраняет в строку, а не выводит в консоль.

>>613565
Да. Чтобы не было утечки памяти.
Если тебе уже не нужна строка, сохраненная в s1, то чтобы использовать s1 для хранения другой строки, память надо освободить. Если ты просто вызовешь asprintf второй раз для s1, то функция просто выделит новую память и запишет указатель на новый блок память в эту переменную, но прежняя строка так и останется "висеть в воздухе".
46 Кб, 713x537
#68 #613571
>>613567
Изобразил вот схематично. Может быть, так будет понятнее.
#69 #613585
>>613565
Кстати, если тебе это задание дал препод, то мне кажется, он может не принять вариант решения с использованием библиотечной функции. Так что, на всякий случай, иди вот сюда: https://ru.wikipedia.org/wiki/Itoa_%28%D0%A1%D0%B8%29 и списывай реализацию Кернигана и Ричи.
#70 #613586
Ебать.
Неужто в си пытаются вкатиться подобные тупорылые долбаебы котрым на пальцах нужно разжевывать ручное управление памятью.

Мимо жаба-примат
#71 #613592
>>613586
Дело в том, что многие вкатываются не по своей воле, а по воле преподов, которые дают такие задания до того, как объяснять что-то про управление памятью. Типа, вот я вам рассказал как объявлять переменные и делать условия/циклы. Вперед! Выполняйте задание. Для некоторых изучение Си - необходимость, которая отнюдь не вселяет в них желание побольше узнать о языке и уж точно не прибавляет энтузиазма для изучения по этой теме чего-то большего, чем рассказывают на занятиях.
#72 #613594
>>613585
Да не, никто не давал.
#73 #613602
>>613592
Хуй знает.
15 лет назад когда мне на 2 курсе преподавали теорию операционных систем, то на сях там был минимум и почти сразу перекатились на кресты.
Жаба-примат.
6 Кб, 537x206
#74 #613614
Чем мое решение плохо?
#75 #613618
>>613614
Так у тебя же 1234567 изначально является строкой, а не числом. Ты просто ее читаешь с клавиатуры и вставляешь пробелы между символами.

Алсо, strlen лучше вынести за цикл.
5 Кб, 484x182
#76 #613623
>>613618
А что в этом плохого? Наоборот же, решение более универсальное.
Так ты имел ввиду? А почему так лучше?
#77 #613643
>>613623
Изначальное условие было такое: дано натуральное число. Я это понял как то, что у нас есть двоичное представление этого числа, а не строковое. Но если тебя устраивает строковое представление, то можно и так, если тебя не смущает, что программа фактически работает со строками, а не с числами.

>А почему так лучше?


Потому что семантически это означает, что функция strlen должна вызываться на каждом проходе цикла. А естри strlen вынесена за цикл, то и вызываться будет только один раз. У тебя ведь длина строки не меняется по ходу цикла. Так зачем делать одну и ту же бесполезную работу на каждой итерации? Сейчас считается, что большиснтво компиляторов самостоятельно оптимизирует такие вещи. Тем не менее, в данном случае, вынесение функции за цикл выглядит более логично и является примером хорошего стиля. Причем это не я придумал. Можешь Криса Касперски почитать, например (серия статей "Сишные трюки").
#78 #613751
>>613602
За 15 лет общее число программистов увеличилось сильнее, чем число хороших, поэтому если раньше дегенератов было 10%, то сейчас 75.
197 Кб, 764x576
#79 #613769
Предстоит в вузике экзамен по языку.
Подскажите какие-нибудь тесты порешать.
Сложнее -лучше.
Наподобии этого.
#80 #613981
>>609376 (OP)

> "Си: грязные истории"


Это такая тонкота или одно из двух? Поисковики находят только этот тред, а хочется почитать.
#81 #613990
Сосоны. Написал сканер портов. Где я соснул?
http://pastebin.com/p4m2Sg6i
Выдает ошибку сегментирования.
#82 #613991
Если записать int a,b,c,d,e,f,g; то будут ли они занимать те же ячейки памяти, что и элементы int penis[5]; ?
#83 #613992
>>613991
Нет. Они могут и в регистрах быть. Вообще сишечку создавали в качестве абстрактного ассемблера, где намеренно замалчивается конкретная реализация регистров и памяти.
#84 #613997
>>613981
Это толстота. Оно на английском http://btdigg.org/search?info_hash=&q=Expert+C+Programming.+Deep+C+Secrets

>>613990
Собираешь с отладочной информацией (gcc -g), пускаешь под gdb, оно говорит, где ты соснул. Ты рассказываешь нам, и мы разбираем проблему.
#85 #613998
>>613990
Но вообще, тебе нужно выделять каждому потоку свой ip, и пробрасывать его через pthread_create если уж ты каждому подключению отдельный тред выделяешь. Алсо, адрес весьма просто инкрементируется одним циклом, а не этим безобразием.
#86 #614000
>>613997
http://pastebin.com/yBAnDyVK такая вот хуйня.
#87 #614005
>>614000
У тебя ip = NULL, туда пишет sprintf, это нормально? Алсо, после создания потока туда снова пишет sprintf, хотя поток мог еще не успеть воспользоваться значением из буфера.
#88 #614006
>>614005
Да в принципе хуй с ним. Спасибо за помощь, пацаны. Напишу на масме, это быстрее, чем ебаться с сишкой.
#89 #614007
>>614006
Нихуя не быстрее. Пофикси еще переменные i, j, u, y, их никто за тебя нулем инициализировать не будет.
#90 #614010
>>614007
Еще как быстрее. Сейчас увидишь.
Хули там, wsa стартуешь, инкрементируешь ecx и через ustr$ переводишь в текст, потом добавляешь в пременную, добавляешь точку и еще так 4 раза, потом обновляешь и все ок. В поток отправляешь всю хуйню, тот быстро копирует и все. Ну короче элементарно бля. Там ебли намного меньше, чем с сишкой.
кстати зря многие говорят, что масм - язык низкого уровня. он высокоуровневый, как и другие языки ассемблера. Более высокоуровневый fasm, но мне масм больше нравится
#91 #614046
>>614010
Кто тебе мешает абсолютно то же сделать на Си?

for (uint32_t v4addr = 0x7f000001; v4addr < 0x7fffffff; ++v4addr) {
_beginthread(scan_port, 0 (LPVOID) htonl(v4addr));
}

int scan_port(LPVOID arg) {
SOCKADDR_IN sa;
sa.sin_port = htons(12345);
sa.sin_addr.s_addr = (ULONG) param;
socket();
connect();
}

Говнокод, но суть понятна.
15 Кб, 708x478
#92 #614122
Юзер дает нам 2 слова, наша задача определить сколько раз встречается буквосочетание заданной длины с заданной позиции, во втором слове.
Вот мое решение, но оно не верное. И не до конца правильное в плане поставленного условия.
#93 #614262
>>613509
Это ты уходи, он и в Си может.
#94 #614396
>>614046

>0x7f000001


Как тонко.

>>614122
Ты объясняешь задачу как омич.
Там цикл надо добавить в strstr, а возвращаемое значение использовать как первый аргумент функции.
#95 #614465
>>611310
Да что вы вспоминаете срач более чем 20-летней давности! Сам Таненбаум с тех не критикует линуксы. Линуксы с давних пор уже не монолитные, а по большей части модульные. Да и с микроядрами он не соснул, так как сделал надежную ОС (правда для учебных целей и встроенных систем). Просто данную идею сложно реализовать, так как найдется немного людей, которые будут создавать с нуля ОС, опираясь на архитектуру.
#96 #614469
>>613769
Почитай об указателях. Попробуй сам попрактиковать. А то, что на пике - абсолютно бессмысленное дерьмо. Ярчайший пример говнокода. Такое вряд ли часто пишут. Но хорошо понимая логику работы с памятью и собственно сами указатели, даже это можно понять за пару минут.
#97 #614608
Супец громисты!
Есть один проект и этот проект писан под линуксы с использованием пары либ, в т.ч. libusb. Взял я значит его, сунул в проект кодблоксов под виндами, скачал прекомпиленные mingw либы, положил рядом, настроил в кодблоксах опции сборки (build options -> search directories -> compiler/linker, сунув туда, соответственно пути к директориям include и lib библиотек). И соснул большого, получив целый ворох undefined reference'ов, например:

> undefined reference to `libusb_get_bus_number



Что я сделал не так, кроме использования виндов? Дайте советов мудрых. В гоголе, стеке и прочем уже искал.
#98 #614704
>>614608

> сунув туда, соответственно пути к директориям include и lib библиотек


Так же, как инклуды нужно использовать в исходнике, так и используемые либы нужно явно указать линкеру, а не только место, где их искать. В командной строке ты можешь сделать -lusb, поищи подобное в Code::Blocks.
668 Кб, 960x720
#99 #615052
>>614704
Понял, разобрался, помогло. Большое спасибо, анон!
#100 #615517
>>613769
[code]--++cpp[/code]
лолшто, это говно вообще можно скомпилировать?
#101 #615520
>>614396

>Как тонко.


Чё тонкого то? Логично, что тестировать программу будешь на локалхосте в начале.

>>614000'

>This page has been removed!


Чё ты исходники поудалял, пидор? Секретные дохуя?
#102 #615932
[code lang="c"]
#include "test.h"
[/code]
#103 #615948
Здравствуйте.
Есть строка вида 12345,6789,x,0123,"xyi, pizda",333,"333-33",,,,"",,,"",0,98,"",,,, ну и так далее.
Нужно вытаскивать строки между запятыми и кавычками(если они есть) для дальнейшего использования. Реализовать это получилось в теле main, а в отдельную функцию, возвращающую очередную строку между запятыми не получается: вылезает ошибка сегментации. Причём первые строки вытаскиваются и возвращаются нормально, а вот последняя вообще никак.
Сама функция:

char NextstrField(char buf, int posbuf)
{
char
str=NULL;

if (!(str=(char)malloc(sizeof(char)BUF_SIZE))){
printf("Out of memory\n");
system("pause");
exit(-1);
}

int i;
unsigned short QwoteActive=0;

for (i=0,memset(str,0,sizeof(str));i<445;++i,(posbuf)++){

if (buf[(
posbuf)]=='"'){ // если встречается кавычка
(posbuf)++;
if (QwoteActive) QwoteActive=0;
else {
if (buf[(
posbuf)]=='"') break;
QwoteActive=1;
}
}

if ((str=buf[(posbuf)])==',' && !QwoteActive || buf[(posbuf)]==0x0A || buf[(*posbuf)]==0x00){
str='\0';

break;
}
}
return str;
}

Кусок кода в main:
for (posbuf=0;str1[posbuf]!=0;posbuf++){
if (str1[posbuf]=='\0' || str1[posbuf]=='\n') break;
str2=NextstrField(str1,&posbuf);
puts(str2);
}
#103 #615948
Здравствуйте.
Есть строка вида 12345,6789,x,0123,"xyi, pizda",333,"333-33",,,,"",,,"",0,98,"",,,, ну и так далее.
Нужно вытаскивать строки между запятыми и кавычками(если они есть) для дальнейшего использования. Реализовать это получилось в теле main, а в отдельную функцию, возвращающую очередную строку между запятыми не получается: вылезает ошибка сегментации. Причём первые строки вытаскиваются и возвращаются нормально, а вот последняя вообще никак.
Сама функция:

char NextstrField(char buf, int posbuf)
{
char
str=NULL;

if (!(str=(char)malloc(sizeof(char)BUF_SIZE))){
printf("Out of memory\n");
system("pause");
exit(-1);
}

int i;
unsigned short QwoteActive=0;

for (i=0,memset(str,0,sizeof(str));i<445;++i,(posbuf)++){

if (buf[(
posbuf)]=='"'){ // если встречается кавычка
(posbuf)++;
if (QwoteActive) QwoteActive=0;
else {
if (buf[(
posbuf)]=='"') break;
QwoteActive=1;
}
}

if ((str=buf[(posbuf)])==',' && !QwoteActive || buf[(posbuf)]==0x0A || buf[(*posbuf)]==0x00){
str='\0';

break;
}
}
return str;
}

Кусок кода в main:
for (posbuf=0;str1[posbuf]!=0;posbuf++){
if (str1[posbuf]=='\0' || str1[posbuf]=='\n') break;
str2=NextstrField(str1,&posbuf);
puts(str2);
}
42 Кб, 1366x728
6 Кб, 456x242
СИ трабл #104 #615980
Привет, Анон! НИд халп!
Ситуация следующая.
Есть функция, в которой создается массив типа char - db и массив указателей на char, указывающие на каждое отдельное слово в db. В первом цикле определяется длина текущего слова strlen(ptr_arr+i) и прибавляется к l - общей длине массива db. В db передается строка: "1;qwe;asd;zxc;2;cvb xc vbc;1823;12;3;m". strtok выделяет лексему в соответствии с разделителями(';' и '\n'), следующая инструкция находит длину l. Ну, и суть, собсно, проблемы: во время трассировки на нулевой итерации внешнего цикла вместо, ожидаемого мной l=2, я, сука, получаю l=4!! Где моя ошибка, подскажи Анон? На пикче код и отладчик. ( использование средств языка весьма ограничено, не обращайте внимание на реализацию )
#105 #616145
>>615980
В ДНК, очевидно же!
l = l+... вместо l+=...
*(ptr_arr+i) вместо ptr_arr
Входные данные у тебя не
"1;qwe.." a "1\0qwe...".
И самое главное:
ptr_arr + i это указатель на указаель на строку, а не указатель на строгу, уебок, блядь.
Когда ты ptr_arr + i его передаешь в strlen, strlen считает "длину указателя", ВНЕЗАПНО оказывается, что это там 4 ненулевых байта подряд...

школьник-кун
#106 #616146
>>616145
ptr_ar должен быть с кватратными скобками, но движок их захавал, бида-пичать!
25 Кб, 279x210
#107 #616229
Привет, няши.
Передо мной стоит такая задача: принять по UART несколько пакетов, описание протокола есть, осталось понять, как эффективнее это сделать.
Когда приходит байт - вызывается прерывание.
Как более эффективно складывать в буфер байты и далее находить в нем пакеты?
Вижу 2 варианта, поясните за плюсы и минусы:
1. Кольцевой буфер, вот такой вариант: http://microsin.ru/content/view/1098/44/
как только в нём появится новые данные, в главном цикле забираю байт, прогоняю через конечный автомат, который ищет начало пакета, данные и конец пакета.
2. Кольцевой буфер, который работает так: если массив заполнился, смещает в цикле все элементы буфера (цикл в том же прерывании выполняется), добавляет ноль в конец массива.
Далее можно уже в главном цикле при помощи привычных функций из string.h и stdio.h найти пакет и т.д.
Вот тут походу минус в том, что в прерывании крутится цикл.
603 Кб, 1024x683
#108 #616233
>>616229

>2. ...


Допустим ищешь ты пакет в главном цикле, работает какой-нибудь scanf и тут БАЦ! приходит новый байт и весь буфер смещается на один элемент.
Что случится?
#109 #616235
>>616229

>Как более эффективно складывать в буфер байты и далее находить в нем пакеты?


Конечным автоматом.

> смещает в цикле все элементы буфера


Каким образом? Копированием? Чем это лучше простого сдвига указателя в случае кольцевого буфера? Хуита какая-то.
#110 #616236
>>616229
Какого типа протокол?
Запрос-ответ, или потоковый асинхронный?

Вообще-то оба твои варианта- сорта говна, причём второй полное ровно, а первый может не подойти для протоколов типа запрос-ответ.
#111 #616240
>>616235

>Каким образом? Копированием? Чем это лучше простого сдвига указателя в случае кольцевого буфера? Хуита какая-то.


Да, копированием.

>Конечным автоматом.


Это хорошо.

>Какого типа протокол?


>Запрос-ответ, или потоковый асинхронный?


Потоковый асинхронный.
На некоторые пакеты надо отправить что-то в ответ.
В основном только принимаю.
#112 #616246
>>616240
DMA есть?
Кольцевые буфера поддерживает?
#113 #616248
>>616246
Да, DMA есть.
Сейчас вот смотрел про DMA: в циклическом режиме заполняет половину буфера, генерируется прерывание, далее заполняется вторая половина и генерируется прерывание.
Т.е. мне надо поставить флаги в прерывании, что типа пора обрабатывать, в главном цикле запустить обработку, при помощи конечного автомата?
#114 #616250
>>616240
Зависит от железки, протокола и требуемого размера буфера, вестимо. Если тебе не лень реализовывать FSM - делай на кольцевом буфере, будет быстро и красиво. Если лень - делай это свое копирование, будет медленно и понятно.
#115 #616252
>>616250
У меня протокол не сложный, с FSM не заебусь.
Вариант с копированием я увидел у одного старого погромиста с опытом, думал - во как красиво то сделано.
Оказалось, что сделано максимум хуево.
#116 #616262
>>616248
Тогда делай кольцевой буфер с DMA, если там есть регистр с текущим адресом, то на прерывания можно забить: в главном цикле смотришь, разницу между текущим и прошлым значением регистра, - разбираешь соотв. число байт, разбирать лучше всего автоматом.

Для ответов сделай пинг-понг буферизацию через DMA, один пакет отправляется, - второй пишется в свободный буфер, дальше меняешь буфера местами.

Для пинг-понга можно заюзать прерывания
#117 #616278
>>616262

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


Классный подход, мне нравится.
#118 #616281
>>616278
Это типовое решение тащемта.
У меня так один знакомый хекс-файлы в бутлоадере разбирал.
школьник-кун
313 Кб, 1021x1280
#119 #616333
>>616281
Лови няшку.
sage #120 #616406
>>616333
ФУ БЛЯДЬ ФУ НАХУЙ
395 Кб, 610x502
#121 #616458
>>616406
Нульчую.
школьник-кун
#122 #616513
>>616333
Продолжение?
#123 #616564
>>616513
К сожалению нет. Но что-то там произошло, да.
#124 #616980
Можно ли делать так:
char F(char s1,char s2)
{
/
тут делаем что-то со строкой s2, используя s1, при этом s1 не изменяется, а s2 - да /
возвращаем s2;
}

int main()
{
/
где-то тут выделяем память для s1 и s2 */
s2=F(s1,s2);
}

Просто мне хочется, чтобы возвращалась именно строка, а не через void. Терзают сомнения, что может что-то случиться плохое.
#125 #616981
>>616980
Что за нах, куда потерялись звёздочки.
#126 #616985
>>616980
можно, но дизайн хуевый получился
#127 #617249
>>616980
Если ты возвращаешь s2, то можно не принимать его в качестве аргумента. Конечно же в случае, если s2 полностью выводится из s1 (допустим измененная копия строки). Ты просто можешь вернуть указатель на s2 без выделения памяти для нее в функции main, выделив ее в F(char \*s1).
#128 #617443
>>617249
У меня из строки s1 копируются несколько символов подряд в s2.
#129 #617448
>>617443
char \F(char \s1)
{
/ объявляем и выделяем память под s2
/ тут делаем что-то со строкой s2, используя s1, при этом s1 не изменяется /
возвращаем указатель на s2;
}

int main()
{
/объявляем s2
/ где-то тут выделяем память для s1 и заполняем ее чем-то */
s2 = F(s1);
}

Как-то так.
#130 #617449
>>617448
Звезда рандомно теряется?

>/объявляем s2


>объявляем указатель на s2

#131 #617717
Ищу книгу по С, не такую нудную, как K&R, но и не такую объемную, как у Прата. Желательно коротенькую, описывающую актуальные методы с примерами.
#132 #617722
>>617717

> не такую нудную, как K&R


Да ты охуел, я ее на одном дыхании за 2 выходных прочитал.
#133 #617969
>>617717
Может тебе еще программу сделать, которая за тебя пишет код и рассказывает охуительные истории?

>Ищу книгу по С, не такую нудную, как K&R


>но и не такую объемную, как у Прата.


Не осилил или слишком скучно, тогда программирование - это явно не твое.

>Желательно коротенькую, описывающую актуальные методы с примерами.


https://learnxinyminutes.com/docs/c/
>>617722
Двачую. Ньюфаги совсем охуели. Я K&R в десятом классе читал и мне было интересно. Особенно задания выполнять.
#134 #618072
Мне тоже было очень интересно выполнять задания из кнр.

Вообще Си уютный язык. И ламповый.

К сожалению программирование меня всё больше и больше печалит засильем скриптовых языков, которые порождают такие программы как Firefox, при открытии с пустой вкладкой сжирающий 350 мегабайт оперативки. И всех всё устраивает: докупим ещё планочку на 8 гигов оперативы и норм.

Может я старею, но меня всё больше тянет на что-то старое доброе, чем на ту парашу, которую остервенело клепают обезумевшие рынки, которым кровь из носу нужно расти каждый год.
14 Кб, 1393x421
#135 #618078
Господа сишники, подскажите, где можно взять книжку, описанную на пикрелейтед? Может, в бумажном варианте есть у кого? Нигде не могу найти.
#136 #618093
>>618078
Зачем тебе именно эта?
#137 #618103
>>618093
На неё ссылались некоторые источники, хотелось бы ознакомиться.
Я модифицирую игру для PS1, приходится ковырять экзешники, читая много mips кода. А игры писались на сишечке, хотел упростить себе жизнь.
#138 #618126
>>618103
Замени её «Архитектурой компьютера» Эндрю Таненбаума.

Ничего особенного там скорее всего нет, кроме оптимизаций, т.е. рассказа о том, что вычислительные действия вроде:
A + B + X + Y
могут быть выполнены не за три команды, а за две, как:
(A + B) + (X + Y)
где действия в скобках займут один такт процессора, и сложение между скобками займёт ещё один такт, MIPS это умеет.

Похожим образом ускоряются и операторы условия, т.к. процессор вместо флажков состояния ("conditional
flags") использует обыкновенные регистры.

Взято из книги «Understanding and Writing Compilers», Richard Bornat.
#139 #618129
>>618126
А где мне задавать вопросы? Ну, понимаешь, это такая сфера деятельности, где некоторые ответы можно вечность искать. Живого ассемблер треда нет, а самостоятельно понять "какой код на си мог при компиляции привести к ЭТОМУ" я не всегда могу.
#140 #618136
>>618129

> Живого ассемблер треда нет


Оживи >>600262 (OP) этот.
#141 #618140
>>618136
Как я его оживлю, если я не могу отвечать, а могу только спрашивать? Вернее, я уже и отвечать могу, но вопросы никто не задаст моего низкого уровня, ибо людей нет в сфере.
#142 #618149
>>618072
Согласен. Я хоть не профессионал, но на Си, как любителю мне очень нравится писать. Все прозрачно, как напишешь так и будет. Теория заключается в понимании работы железа. Можно написать абсолютно все, что пожелаешь. Радует, что замену сишечке так и не нашли.

>Firefox, при открытии с пустой вкладкой сжирающий 350 мегабайт


У меня съедает примерно 90Мб на старте(это под линем). Что я делаю не так?

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


Нужны же ИННОВАЦИИ!!! Даже если эти инновации представляют из себя пропиаренную переделку уже давно известной технологии.
#143 #618162
>>618149
Во вы два долбоеба. Работобыдло из офисов повывалило, видимо.
#144 #618414
>>617249
>>617448

>можешь вернуть указатель на s2 без выделения памяти для нее в функции main, выделив ее в F


Всё-таки мне этот момент непонятен. Если я возвращаю указатель из функции, программа крашится. Там же неизвестно что хранится по адресу, после завершения функции? Получается, нужно объявлять в самой функции как static или что?
#145 #618422
>>618414
Ой, нет всё нормально. Крашится, когда функция void, а не char* и в неё же я передавал указатель на строку и выделял там память.
#146 #618829
>>618414

>Там же неизвестно что хранится по адресу, после завершения функции?


Известно. Функция возвращает указатель на участок памяти, с которым ты работал. При завершении работы, функция самостоятельно не освобождает память.

>Получается, нужно объявлять в самой функции как static или что?


static необходим только для того, что значение переменной, отмеченной как static, сохранялось до следующего вызова функции. Как просто пример использования static, можно взять подсчет количества вызовов этой самой функции.
#147 #618881
Поясните за сборку пакетов, допустим HTTP. Я правильно понимаю, что необходимо просто отправлять строку в которой различные поля разделены при помощи \r\n? Или можно как-то иначе это делать? И есть ли готовые библиотеки для работы с протоколами?
#148 #618894
>>618881

> просто отправлять строку в которой различные поля разделены при помощи \r\n


Да.

> библиотеки


Ну curl же.
#149 #618930
>>618894
Благодарю.
#150 #619834
Я тут хотел спросить. Допустим есть у меня набор каких-то неизвестных данных. Мне необходима возможность по-разному их интерпретировать (допустим как int, char, double, struct smth). Как мне это сделать? Допустимо для этого выделить динамически память под void (звезда) или char (звезда) и затем при помощи указателей(int, char, double, struct smth) пройтись по этим данным? Или это будет плохим способом решения?
#151 #619836
>>619834
С совершенно произвольными данными ничего не сделаешь. Рассказывай подробнее, что сделать надо.
#152 #619969
>>619834
Используй union.
#153 #620075
Посоветуйте хороший, годный конпелятор си типа tcc, но не с таким парашным синтаксисом ассемблера.
#154 #620081
>>619834
Стандарт запрещает любые подобные выебоны (в том числе и >>619969 union). Чтобы все было пиздец как кроссплатформенно, нужно читать побайтово и вручную собирать многобайтовые типы (сдвигами и т. д., что особенно весело для какого-нибудь double).

Если ты нормальный человек, то указатели вполне ок, озаботься только выравниванием и endianess - будет достаточно переносимо.

>>620075
Советую взять любой понравившийся ассемблер (nasm, fasm), писать ассемблерный код отдельным модулем (файлом) и потом линковать к основной программе. Когда ты осознаешь, что код на ассемблере можно заменить интринсиками, проще будет его найти и переписать.
Алсо, в tcc дохуя неисправленных багов и напрочь отсутствующий оптимизатор. Единственное, за что его следует любить и уважать, так это за -run.
#155 #620222
>>620081

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


Это как раз то, что я и имел ввиду.

> то указатели вполне ок,


А это как раз то, что я хотел сделать.
Спасибо за ответ.
#156 #620288
>>620081

>Алсо, в tcc дохуя неисправленных багов и напрочь отсутствующий оптимизатор. Единственное, за что его следует любить и уважать, так это за -run.


Тогда посоветуй еще какой-нибудь компактный компилятор, который генерировал бы маленькие экзешники. Хеллоуворлд, скомпилированный tcc, весит всего 2.5 кб, почти как на ассемблере. Другие компиляторы даже с оптимизациями меньше 25 кб не генерят.
#157 #620296
>>620288

>Другие компиляторы даже с оптимизациями меньше 25 кб не генерят.


$ clang -O3 helloworld.c -o helloworld && du --apparent-size -b helloworld
6600 helloworld
$ gcc -O3 helloworld.c -o helloworld && du --apparent-size -b helloworld
6720 helloworld

>почти как на ассемблере


$ clang -O3 helloworld.s -o helloworld && du --apparent-size -b helloworld
6568 helloworld
$ gcc -O3 helloworld.s -o helloworld && du --apparent-size -b helloworld
6704 helloworld
Ты ведь понимаешь что эти 6 кб это всякие таблицы релокаций и прочая ELF-хуйня? От нее не избавишься.
#158 #620297
>>620296
А впрочем можно вот так сделать.
$ clang -O3 helloworld.c -nostdlib -lc -o helloworld && du --apparent-size -b helloworld
3424 helloworld
$ cat helloworld.c
#include <stdio.h>
#include <stdlib.h>

void _start(void)
{
printf("Hello, World!\n");
exit(0);
}
#159 #620305
>>620288
tcc просто динамическая линкуется к рантайму. Рантайм в Windows весит 400 КБ (используется древняя MSVCRT.DLL, что само по себе плохо).
Можно взять Pelles C из шапки, с -MD он тоже сгенерит 2 КБ плюс 300 КБ рантайм (если статически линковать рантайм, будет что-то около 30 КБ минимум) . Можно взять Visual C++, он генерирует 4.5 КБ плюс рантайм (со статической линковкой 50 КБ). А можно перестать загоняться по поводу размера файла.
#160 #620315
Итак. Почему я долбоеб?
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void print(void);
int i;
int main(void)
{
char
buff = malloc(1000);
pthread_t t[2];
pthread_create(t[1], NULL,(void
()(void )) print, NULL);
pthread_create(t[2],NULL,(void ()(void ))print,NULL);
}

void
print(void)
{
i++;
printf("huyhuyhuy\n %d", i);
}

//ну кроме того, что с типом функции объебался. Ну похуй. Это насрать. Компилируется без ошибок и прочей хуйни. У меня в принципе ни одна программа скомпилированная не запускается. Я писал сканнер портов и нихуя. Написал другой. опять нихуя. Включил kdbg и там у меня показывает ошибку сегментации ДО входа в майн. Что за нахуй?
Компилирую gcc -pthread [sourcename].c

>>620288
Можно дос стаб удалить и будет еще меньше. А так да. я под венду пишу на масме, потому что ебал я писать на сишке там. У меня там MessageBox по 64кб выходит. Я помнится, писал под DOS когда-то, так с тех пор я вообще каждый байт блядь пытаюсь сэкономить. Даже в сишке ассемблерными вставками пользуюсь. Вообще, используй __imp_MessageBoxA@16 и не еби себе мозг. Хотя лучше, конечно, пиши на масме под венду. Под прыщами на нем не попишешь.
#161 #620317
Хули у меня все указатели обрезались, я не понял бля? >>620315-кун
#162 #620319
>>620317
Абу просто жабогосподин. Вот и режет указатели. Ибо нехуй.
#163 #620322
Почему моя функция strcmp работает неправильно?
https://ideone.com/VWF7Ln
sage #164 #620324

>дос


>MessageBoxA


>16


>пиши на масме под венду


Пиздец, куда я попал?
#165 #620328
>>620322
int strcmp(char s, char t){
\twhile(s++ == t++)
В цикле while указатели убери. У тебя это итак указатели. Ты просто адрес инкрементируй, а не то, что находится в указателе, киса.
>>620324
Долбоеб. 16 - это кол-во байт передаваемых в MessageBoxA(dword hwnd, dword capture, dword text, dword status(или как там)); дебильный блядь.
А ты думал это под дос, сука, мессадж бокс блядь? Охуеть не встать. Иди блядь мсдн читай, уебок.
#166 #620329
>>620322
Потому что внутри while и s, и t уже инкрементировались и указывают на следующий символ. Ты, кстати, хуйней какой-то занимаешься, нормальные компиляторы все равно обнаруживают эти паттерны и заменяют на вызовы библиотечных функций (которые быстрее потому что реализованы через sse.)
#167 #620332
>>620329
Да мне просто интересно писать говно.
#168 #620333
>>620328

>Иди блядь мсдн читай, уебок.


А оно мне надо?

>кол-во байт передаваемых


>2016


>x86-64


>не передавать аргументы через регистры



>MessageBoxA


>A

#169 #620335
>>620333
Кто тебе сказал, что через регистры, уебок? А ты не слышал о том, что можно передавать адрес операнда, который находится в переменной? Ты не слышал про макро среду языков ассемблера различных? Не? И если что в таблице экспорта именно так обозначается все. Ебать ты даун, хуево быть тобой. Не надо ему мсдн читать, бля. Охуеть не встать, с какими ебланами я на борде сижу.
#171 #620341
>>620315

>Почему я долбоеб?


Тебе все перечислить?
1. Не проверяешь возвращенный malloc-ом результат на NULL.
2. Не освобождаешь память.
3. А нахуя ты ее вообще выделил-то?
4. Массив t не инициализирован перед использованием, привет undefined behavior.
5. Первый аргумент pthread_create - не просто какой-то произвольный указатель. По этому указателю будет записан ид созданного потока. Собственно, у тебя падает как раз потому что этот ид записывается в рандомное место памяти.
6. print кастуется к несовместимоу типу.
7. После создания потока его надо где-то либо join-ить, либо detach-ить.
8. main должна возвращать int, но return нигде не видно.
9. print неправильного типа - она не принимает аргументов, а должна принимать один типа "указатель на void".
10. i не атомарная, поэтому в i++ возникает race condition между потоками.
11. print должна возвращать указатель на void, но return опять нигде нет.
12. Компилируй gcc -Wall -Wextra -Werror -pthread yoba.c -o yoba, тогда гцц тебе сразу все это укажет.
#172 #620342
>>620335

>Кто тебе сказал, что через регистры, уебок?


Я и говорю, какой мудак в 2016 на 64-битном хуе86 передает не через них? Шиндовсбляди, видимо.

>А ты не слышал о том, что можно передавать адрес операнда, который находится в переменной?


Это тут вообще при чем?

>Ты не слышал про макро среду языков ассемблера различных?


Ты не слышал про си?
#173 #620344
>>620341
А, еще i не инициализирована.
#174 #620345
>>620341
Ты не углядел главное - t[2] - это вне массива.
#175 #620350
>>620342

> Шиндовсбляди, видимо.


Ты не поверишь, но 64-битный fastcall в шинду завезли точно такой же.
#176 #620352
>>620350

>64-битный fastcall


Во-первых он называется System V ABI.
Во-вторых в шиндовсе опять свой стандарт. Он, кстати, довольно интересный - первые 4 аргумента передаются через регистры, но 32 байта на стеке под них все равно выделить надо (но не надо заполнять), причем даже если функция принимает меньше 4 аргументов. Остальные аргументы идут над этими 32 байтами.
#177 #620355
http://pastebin.com/6B9cyKs0 в общем вот он мой сканер портов. Такая вот хуйня. ЧЯДНТ?
#178 #620357
>>620355
22 - стек разве позволяет взять такой огромный размер.
Дальше лень смотреть. Говнокод я лютый вижу здесь.
мимокрок
#179 #620359
>>620355

>ЧЯДНТ?


>pthread_t t[0x7fffffff]


http://ideone.com/rQVWum
Дальше не читал, хуйня полная написана.
#180 #620360
>>620355

> pthread_t t[0x7fffffff];


Всегда так делаю.

> ЧЯДНТ


Не прочитал ничего про многопоточное программирование. Например, у address все шансы затереться раньше, чем поток им воспользуется. И я тебе уже об этом писал в середине треда.
#181 #620362
>>620359
Всего лишь 4Гб. Тебе жалко что ли? Или компуктер не позволяет?
#182 #620364
>>620362
Лол, а я и не подумал. Поменял значение, все запустилось, лол.
#183 #620365
>>620341

>Не проверяешь возвращенный malloc-ом результат на NULL


Боишься, что на твоем калькуляторе не хватит памяти для выделения?
#184 #620368
>>620365
Про квоты слышал когда-нибудь?
#185 #620369
>>620364

быстрофикс:правда нихуя не происходит кроме нагрузки проца в 1 поток.
#186 #620371
>>620365
А если требуется брать много памяти, а система и так загружена? Будто что-то плохое, предусмотреть такую ситуацию. Тем более, она вполне реальна.
#187 #620375
Возник вопрос, а нужно ли вообще распараллеливание для сканера портов? Разве там не упирается все в сетевуху?
#188 #620376
>>620371

> предусмотреть такую ситуацию


И свалиться не просто, а успев выругаться в консолечку. Потому что в программе серьезнее хелловорлда выругаться в логи может не получиться, и показать уведомление может не получиться, и даже завершиться красиво может не получиться. Поэтому если программа не сервис, мелкие аллокации проще всего вообще не проверять и в том редком случае, когда память кончится, просто свалиться.
#189 #620377
>>620375
Спрашивающий - новичок. Он не может в неблокирующие сокеты. И в сырые сокеты тем более не может.
#190 #620378
>>620376

>Потому что в программе серьезнее хелловорлда выругаться в логи может не получиться, и показать уведомление может не получиться, и даже завершиться красиво может не получиться.


А может и получиться. Гвидон вон вполне нормально бросает MemoryError в таких случаях.
#191 #620379
>>620378
Да и сваливаться ведь не обязательно. Иногда же бывают случаи, когда невозможность выделения памяти не является критической ошибкой. В таком случае, можно просто залочить возможность на некоторое время или же просто выделить меньше памяти, если это возможно.
#192 #620382
>>620338
Ну охуеть, должно быть 0
#193 #620384
>>620382
return s - t;
'y' - 'z' == -1
Где ошибка? Возвращает разницу, когда находит не совпадение.
#194 #620385
>>620322
У тебя же есть реализованный strlen
if (strlen(s)<strlen(t)) return -1;
if (strlen(s)>strlen(t)) return 1;
if (strlen(s)==strlen(t)) return 0;
#195 #620386
>>620384
man strcmp
#196 #620390
>>620385
>>620382
>>620386
Что несешь-то? strcmp это лексикографическое сравнение, а не просто по длине.
#197 #620394
>>620390
Ну тогда хуй с ним
10 Кб, 665x80
#198 #620396
>>620386
И что не так? Работает, как и библиотечная.
#199 #620397
>>620377
Поясни-ка мне за сокеты. Почему select возвращает 1, а данных для чтения нет?

FD_ZERO(&check);
FD_SET(Socket, &check);
if (select(0, &check, 0, 0, &timeout) > 0)
{
ioctlsocket(bind_socket, FIONREAD, &read_byte); // != SOCKET_ERROR
}
Почему read_byte == 0? WSAGetLastError() возвращает 0.
#200 #620399
>>620397
man select
#201 #620402
>>620396
Сижу, обзавшийся своим же говном. Извините
#202 #620405
Ебать вы тут насрали.
#203 #620406
>>620399
И что там нового для меня? Возвращается 1, а данных нет. По таймауту не отваливается.
#204 #620408
Как правильней писать time(0) или time(NULL)?
#205 #620409
>>620406
Может быть, тебе FIN приходит просто?
#206 #620410
>>620408
NULL, подчеркивая, что это должен был быть указатель.
#207 #620412
>>620410
Открыл страницу в man'e и понял уже. Прошу прощения за столь глупый вопрос.
#208 #620421
>>620409
FIN: No more data from sender
Типа нет больше данных от отправителя?
#209 #620423
>>620421
Ты хоть на локалхосте проверяешь?
#210 #620429
>>620423
Да, а что? Если что это >>620375 не мой пост. Мне от браузера данные надо получить, у меня SSL соединение устанавливается нормально, а заголовок дождаться не получается.
#211 #620432
>>620429
В древней опере тестирую, всё почти нормально. Хотя бы первый запрос обработать получается, а keep-alive по таймауту завершаю. А с хромом ни в какую. Он пересоздаёт подключение, запрашивает одну страницу, а остальные отваливаются на select с нулём байт и не срабатывает таймаут.
#212 #620450
Поясните по поводу assert(). Я правильно понимаю, что его стоит использовать только на этапе отладки? То есть оттестил программу, а когда релизишь, то надо ставить #define NDEBUG?
#213 #620467
В Pellec C размер шрифтов никак не увеличивается? Ебаный вырвиглаз же. Зато компилируется быстро.
#214 #620471
>>620467
Сам нашел. Обычно шрифт можно было с клавиатуры увеличивать, а тут никак.
#215 #620513
>>620341

>Не освобождаешь память.


Если память используется на протяжении всей работы программы, какой смысл её освобождать по завершении программы? Она будет автоматически освобождена операционной системой.
#216 #620553
>>620513

>Если память используется на протяжении всей работы программы


Как часто такое бывает? Если маленькое приложение, ладно. Но вообще, всегда рекомендуется это делать явно для обеспечения все той же переносимости. Да и разве сложно сделать это?
#217 #620557
>>620421

> нет больше данных


Да, например если удаленный хост закрыл соединение (сделал shutdown(..., SD_SEND)), по TCP уйдет FIN, select на другой стороне прервется, а в сокете будет 0 байтов.
Может быть, у тебя в реализации протокола проблемы, и оно просто не хочет с тобой разговаривать?

>>620450
Да, именно так. Если не нравится, можешь сделать общий хедер и инвертировать в нем условие (#ifndef DEBUG #define NDEBUG ... #endif). И потом собирать с -DDEBUG, а релиз без.
Ну а оставлять ли ассерты в релизах - дело твое. Только не используй их по назначению - для проверки соблюдения контракта, а не вместо обработки ошибок.

>>620553
Такое бывает часто, в любой мелкоутилитке. При нормальном выходе рантайм обязан сделать и flush файлам, и закрыть их потом, и память освободить.
#218 #620747
>>620377

>сырые сокеты


А они разве нужны для сканера портов? Если я не ошибаюсь, сырые сокеты просто позволяют тебе собрать свой пакет, со своими параметрами, не прибегая к помощи ядра. А для сканера портов не будет достаточно, просто слать TCP и/или UDP пакеты и просто ждать ответа? Или есть нюансы?
#219 #620781
>>620747
Существует несколько способов сканирования. Полноценная установка соединения - самый медленный из них.
#220 #620792
>>620781
Ладно. Попробую почитать на досуге подробнее о сырых сокетах. Пока мне на голову приходит только: 1) отправить SYN; 2) дождаться SYN/ACK; 3) перейти к следующему порту, не отправляя ACK.
#221 #620893
>>620792
Да, именно так. Только желательно на SYN/ACK отвечать RST, чтобы все были счастливы а то мало ли, хост решит, что это у тебя SYN flood такой и обидится. Алсо, у нас тут тредик про сишечку. А про хакеров где-то рядом тонет.
#222 #620911

> шланг


> компилятор



Для гомосексуалистов разве что.
#223 #620936
>>620911
У штульманавта пригорело?
#224 #620994
Может кто дать исходники любого консольного ftp-клиента на Си? Пилю свой велосипед, но очевидно, что я что-то делаю не так.
#225 #621005
>>620994
apt-get source <ftp-client-name> если линукс.
Если windows, гугли свободные ftp-клиенты, заходи на официальный сайт и качай исходники.
https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A1%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5_FTP-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%8B
#226 #621018
>>621005
Спасибо. Собственно, проблема в том, что пока-что программа работает в диалоговом режиме - я ввожу команды протокола, а сервер мне отвечает. Вот тут и появляются проблемы. Или программа виснет на recv() после отправки первой же команды, или при использовании неблокирующего сокета recv() как-то странно данные возвращает, с запаздыванием на пару отправленных команд. Скорее всего, это я накосячил, но как поправить - непонятно.
#227 #621027
>>621018
Покажи код, может быть? Попробуй написать простой телнет-клиент для начала и потестить на локалном netcat - сразу увидишь, где и как у тебя что отправляется. Потом этим же телнет-клиентом уже к ftp вручную коннектиться попробуй.
#228 #621032
>>621027
Собственно, у меня пока только это и есть (телнет клиент). Код завтра скину, еще помучав.
#229 #621037
>>621027
А, и про netcat - спасибо, не знал о таком.
#231 #621173
>>621138
В си с юникодом традиционно все плохо (до C11).
Конкретно не так ты указываешь format specifier - 'c' - это char, а чтобы был wchar_t, надо '%lc'. Дальше тебе стоит кодировку исходника. Например, в гцц -finput-charset по умолчанию UTF-8, другие компиляторы не будем показывать пальцем могут ожидать какую-то другую.
А если у тебя шиндоус, тебя ждут проблемы в MSVCRT, баги в реализации консоли и прочие радости. В определенный момент ты решишь написать свой велосипед для вывода в консоль под виндой, я гарантирую это.
#232 #621184
>>621173
gcc rus_alpha.c -finput-charset=UTF8
Так? Если да, то мне вместо символов выводит знаки вопроса. Кодировка в терминале (xfce4-terminal) также UTF-8.
#233 #621188
>>621184
Сделал setlocale(LC_CTYPE, "") и заработало. Это корректный способ?
#234 #621189
Как сделать чтобы sleep() принял float со значением 0.5 вместо округленного int
#235 #621190
>>621189
usleep()
Принимает микросекунды.
#236 #621192
>>621188
https://ideone.com/lPPK4M
С %с всё корректно, лол.
#237 #621193
>>621188
Хуй знает. По идее, да. Зачем тебе это вообще? Выводи UTF-8 через printf, это работает и не требует усилий.

>>621192
С '%c' оно берет из аргументов int и преобразовывает к signed char. А если из юникодной кириллицы отбросить старшие биты, ничего похожего на нормальный результат получиться не должно в принципе.
#238 #621197
>>621193
Через printf не работает.
https://ideone.com/veJvei
Или что-то не так?
#239 #621207
>>621197
А, ну если тебе с символами работать, то конечно так не получится разве что делать работу %lc вручную, wctomb, все дела. А просто вывод строк работает если терминал UTF-8.

Забей, это был плохой совет.
#240 #621228
https://ideone.com/VfABvJ
Оу... Оказывается что в юникоде "ё" вне последовательности... Как все сложно то.
#241 #621234
>>621228
Всё ещё сложнее. "й" и "ё" можно записать двумя способами.
#242 #621252
>>621234
Всмысле? Ты имеешь ввиду это:
https://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4#.D0.9C.D0.BE.D0.B4.D0.B8.D1.84.D0.B8.D1.86.D0.B8.D1.80.D1.83.D1.8E.D1.89.D0.B8.D0.B5_.D1.81.D0.B8.D0.BC.D0.B2.D0.BE.D0.BB.D1.8B Впрочем. Придется ознакомится наверное поближе с чудесным миром кодировок.
#243 #621579
Не совсем по теме треда, но. В общем, не могу понять, как в winsock узнать, есть ли данные, которые сокет принял и можно их оттуда забирать.
#244 #621588
Как запомнить про префиксную и постфиксную форму записи? Всё время путаюсь...

Например, хочу организовать такой крутой цикл в одну строчку:
while (++i<len && !isalpha(inq));

Как будет себя вести i ?
#245 #621690
>>621579
Чтобы дождаться данных select(0, ..., ..., ..., &timeout);
Если возвращает >= 1, то данные есть. Если ты передавал больше 1 сокета, то используй макрос FD_ISSET. Если только один, то пришли данные на этот сокет. Если < 0, то отвалилось по таймауту или какая-то ошибка.

Чтобы узнать, сколько на данный момент доступно данных ioctlsocket(bind_socket, FIONREAD, &read_byte);

А если ты мне ответишь на вопрос, почему select возвращает 1, а ioctlsocket ноль, буду очень благодарен.
#246 #621709
>>621588
Сначала инкрементируется, затем сравнится.
Если префиксная форма, то инкрементируется перед операцией, если постфиксная — после выполнения операции над i.
#247 #621713
>>621588
Что именно у тебя вызывает сложности? Префиксный инкремент/декремент выполняется до обращения к переменной, постфиксный, соответственно, после. В твоём примере произойдёт увеличение i на единицу и сравнение его с len, поэтому ты не обработаешь последний символ. Здесь надо постфиксный. Или местами поменять условие, т.к. у тебя i будет указывать на следующий символ за нужным тебе. Ещё неплохо бы inq изменять каким-то образом в сторону увеличения.

>хочу организовать такой крутой цикл в одну строчку


Оно, конечно, круто while (∗s++ = ∗t++), но, как по мне, лучше избегать таких конструкций.
#248 #621777
>>621713

> ∗s++ = ∗t++


> лучше избегать таких конструкций


Это идиома, ее поведение абсолютно прозрачно, зачем ее избегать? Другое дело, что конкретно в примере >>621588 лучше сделать нечто вроде:
while (i < len && !isalpha(inq[ i ]))
++i;
или в крайнем случае пустой for а еще лучше функцию типа skip_non_alpha, тогда будет одновременно читаемо и красиво.

>>621690

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


Это целиком и полностью неверный подход: это очень медленно, и это неудобно, когда у тебя много сокетов. Правильнее попросить систему уведомить тебя, когда можно будет читать/писать. И вот тут появляются варианты. Если уже есть окно, и нужно передавать медленно и немного - WSAAsyncSelect хватает с головой. Если скорость важна - overlapped IO или IOCP. Если не осилишь такое, WSAEventSelect. Если нужно кроссплатформенность - select. Если не осилишь ничего из описанного вообще, тогда блокирующие сокеты. А про существование FIONREAD лучше вообще пока забыть.

>>621690

> почему select возвращает 1, а ioctlsocket ноль


select возвращает общее число выбранных дескрипторов (во всех наборах), а ioctlsocket - код ошибки.
#249 #621813
А как вычислить сумму ряда на C?
#250 #621814
>>621813
Сложить.
#251 #621816
>>621813
int sum = 0;
for (int i = 0; i < N; i++) {
sum += element;
}
И в чем у тебя проблема была?
#252 #621817
>>621816

>element


фикс
#253 #621818
>>621817
А... Курсив!
#254 #621852
>>621777

>Это идиома


Просто привёл пример "крутого цикла в одну строку". Хотя мне всё равно не нравятся такие конструкции.

>Это целиком и полностью неверный подход


А если у меня на каждое подключение создаётся отдельный поток?
Не >>620375

>Если уже есть окно


У меня нет виндового окна.
Жду до таймаута с помощью select, потом читаю/закрываю, смотря что вернулось.

>Если нужно кроссплатформенность - select


Не сказать, что нужна. Но с помощью select и жду, когда данные придут.

>overlapped IO или IOCP


WSAIoctl, WSARecv, WASSend? Или что?

>А про существование FIONREAD лучше вообще пока забыть.


Что с ним не так?

>ioctlsocket - код ошибки


Не нашёл, как с помощью неё узнать код ошибки. Сделать неблокируемым, доступное кол-во байт и некое SIOCATMARK. Ошибка же через WSAGetLastError.

Грамотные примеры реализации можешь посоветовать, где посмотреть?
#255 #621876
Есть ли практической применение рекурсивного вызова main()?
#256 #621913
>>621852

> WSAIoctl, WSARecv, WASSend? Или что?


Все функции, где есть lpOverlapped.

>> FIONREAD


> Что с ним не так?


А зачем лишний сисколл, если можно сразу прочитать, когда одна из функций ожидания сказала, что данные есть (или получить WSAEWOULDBLOCK без ожидания, если состояние сокета по какой-то причине неизвестно)?

> Не нашёл, как с помощью неё узнать код ошибки.


Она сама возвращает SOCKET_ERROR, если ты ей неверные аргументы скормишь, и 0, если отработала нормально. А select возвращает SOCKET_ERROR (-1) или количество дескрипторов. Вопрос >>621690 вроде об этом был, разве нет?

> примеры реализации можешь посоветовать


http://www.amazon.com/Network-Programming-Microsoft-Windows-Edition/dp/0735615799 ответит на все твои вопросы. Не уверен насчет второго издания, но первое даже на русском есть.

>>621876
Хуй знает... ну можно командную строку перезадать или дополнить в каких-то случаях. Например, в зависимости от какого-то ключика читать командную строку из файла. Например: https://www.google.com/search?q=compiler+response+file
#257 #621952
Не подскажите годной литературы по WinAPI?
7 Кб, 209x240
#258 #621957
>>621952
Рихтер, потом MSDN. Можно просто MSDN, ее можно прямо по разделам читать.
#259 #621960
>>621957
Премного благодарен.
#260 #621961
Здесь стоит задавать вопросы касательно С в реалиях микроконтроллеров? А то в радаче треды полумертвые.
#261 #621962
>>621961
Если связано с Си, почему бы и нет?
#262 #621968
>>621962
Разбираю даташит и атмеловские библиотеки, замечаю запись такого вида:
var1 = (uint_8)(var2 >> 8);
или просто:
var1 = (unsigned char)var1;

Беглый просмотр по объявлению переменных объяснения не дал, что это за запись такая?

Также есть вопрос по поводу объявления функций, что такое inline разобрался, но почему очень часто функцию объявляют как static inline разобраться не могу.
#263 #621969
>>621968
Приведение типов же.
#264 #621970
>>621968
(имя_типа) переменная — это такое явное преобразование типов из одного в другой.
static кажется и в случае с inline ограничивает ее область видимость до файла, в котором она находится. То есть, это функция будет видна только в том файле, в котором она объявлена.
#265 #621971
>>621968

> но почему очень часто функцию объявляют как static inline разобраться не могу



static здесь говорит, что функцию снаружи вызывать никто не будет. Поэтому в объектный файл она может вообще не скомпилироваться, если компилер ее везде заинлайнит. Если просто inline, то компилер попытается инлайнить функцию везде, где может, но все равно дополнительно в объектник положит копию функции, которую можно вызвать снаружи. А она может и нахуй не нужна.
#266 #621972
>>621971
Вот для примера:
static inline a(int i) { return i + 1; }
int b(int i) { return a(a(a(i))); }

Если положить в 1.c и компилировать с помощью `gcc -Os -c 1.c`, то на выходе в объектнике нет символа `a` (можно посмотреть с помощью `readelf -s 1.o`). Если же static убрать, то символ есть, то есть функция `a` теперь тоже есть в объектнике и ее можно вызвать снаружи.
#267 #621975
ясно, нужно освежить функциональную вложенность для достаточного понимания работы программы
#268 #621978
>>621968
Когда не знаешь, попробуй гуглить.
https://gcc.gnu.org/onlinedocs/gcc/Inline.html

>When a function is both inline and static, if all calls to the function are integrated into the caller, and the function's address is never used, then the function's own assembler code is never referenced. In this case, GCC does not actually output assembler code for the function, unless you specify the option -fkeep-inline-functions.

#269 #621996
Как читать проекты на сишке? С чего начинат? Как определять "main" файл, который может носить произвольное название?
С какого конца раскручивать?
Мб лучше сначала хедеры читать, а потом *.c?

Просто я наткнулся на проект на ncurses, принцип работы которого хотел бы понять. А именно, как "прибит" интерфейс к самому приложению.
#270 #621998
>>621996
Если unix-подобная ОСь, то найти main очень даже просто.
#271 #621999
>>621998
Да, точно, я затупил что-то. Не имел дела с сишкой полтора года.
#272 #622003

>Стандарт ISO/IEC 9899:2011 (он же C11)



теперь можно быстрые веб-сайтики клепать на сишке?
#273 #622004
>>622003
Ты думаешь, раньше кто-то запрещал? Но вообще, для сайтиков есть более подходящие инструменты.
#274 #622007
>>622004

>Ты думаешь, раньше кто-то запрещал? Но вообще, для сайтиков есть более подходящие инструменты.


с++?

а реально, есть какие фреймворки или типа того? Занимается этим серьезно?
#275 #622009
>>622003
А в этом стандарте много нового ввели? Я думал там потоки только завезли. И кажется еще что-то с юникодом связанное.
#276 #622012
>>622007
Python/PHP/Java конечно На роутерах бэкенд иногда на сишечке, иногда на плюсах. За фреймворки не скажу, всё, что видел - велосипеды.

>>622009
Потоки, чуть лучший юникод, выравнивание в памяти, static_assert, анонимные структуры (как у MS было), _Generic, эксклюзивный доступ к файлам, ну и еще что-то по мелочи.
#278 #622068
>>622007
vibe.d
#279 #622097
Товарищи, заметил непонятную ересь у себя. Сам я новичок, пишу на сях меньше пары месяцев. Есть код вида
eoucheck = fgetc(DB_table);
while (!feof(DB_table)) {
\twhile (eoucheck != '\n') {
\t\twhile (eoucheck != '|') {

который не работает. Он и не должен работать, или это я такой аутист?
#280 #622098
>>622097
табы прикрепились, это не я.
#281 #622101
>>622098
У тебя eoucheck вне цикла.
#282 #622103
>>622101
То есть fgetc(). Оно один символ возьмет из потока перед циклом и все.
#283 #622105
>>622103
Т.е. это должно выглядеть, как while((eoucheck = fgetc(DB_table)) != EOF) <блаблаблаблабоди> или о чем ты?
#284 #622107
#285 #622109
>>622097
Дабы внести ясности (хотя, скорее всего, вам и так это ясно), не работает именно переход от строчки на другую строчку по завершению оной.
При том варианте в посте, и >>622105 одинаково не работает именно это.
#286 #622112
>>622109
У тебя какая-то очень странная конструкция. Зачем здесь циклы для '\n' и '|'? Что ты хочешь сделать вообще?
#287 #622114
>>622112
Согласен, поэтому и спрашиваю. Окей, рассказываю поподробнее. Есть файлик DB_table с содержимым вида:
S | himpanze
G |orilla
M | akaka
Необходимо пройтись по строчкам и в переменную w1 вписать до |, а в w2 соответственно после. В общем, с этим все ясно. Я пришел к выводу, что можно пройтись по строчкам и до | с помощью fgetc() записать необходимые символы в переменную, и после | соответственно тоже. Код получился таким, каким я указал выше.
#288 #622120
>>622114
И, забыл указать, важная беда - это rb, а не rt.
#289 #622121
>>622120
Т.е. в таком случае я должен использовать fread, верно?
#290 #622123
>>622114
Тебе кажется нужен strtok. С помощью него удобней парсить строки. Считай все из файла и парси.
#291 #622125
>>622123
Да, я думал о таком. Но как указать максимальный размер строки? Писать условный 1024? А если выйдет так, что строчка равно 1025? Или плевать на них, и сказать, мол, у меня запрещено так делать?
#292 #622127
>>622125
Создавай динамический массив и изменяй его размеры, когда считанных символов становится больше чем твой буфер.
man malloc
man realloc
#293 #622128
>>622127
Да, это очевидный вариант, хоть и затратный по памяти. Хорошо, я попробую, спасибо.
252 Кб, 535x700
#294 #622131
>>609376 (OP)
Здраствуй анон, помоги нублу.
Учу основы кодинга по пику, однако встал вопрос, который даже стыдно задавать, не могу понять как работает простейшая программка.
Есть одна функция, которая выводит на экран строку в обратном порядке.

void print_reverse(char
s)
{
size_t len = strlen(s);
char t = s + len -1;
while(t >= s)
{
printf("%c",
t);
t = t - 1;
}
puts("");
}
*
Помоги, задать вопрос больше некому.
#295 #622138
>>622128
Ну затратный он или нет, зависит от того, как ты будешь увеличивать. Куда затратней, статику большую использовать. Но в твоем случае, это вообще не существенно, так как у тебя больше нескольких кБ вероятно не будет.

>>622131
https://ideone.com/C8gQOy
Сюда код, в котором есть указатели не выкладывай. Здесь звезды съедает.
#296 #622141
>>622131

#include <stdio.h>
#include <stdlib.h>
void print_reverse(char s)
{
size_t len = strlen(s);
char
t = s + len -1;
while(t >= s)
{
printf("%c", *t);
t = t - 1;
}
puts("");
}

int main()
{
char x[40];
puts("Введи строку \n");
fgets(x, 39, stdin);
print_reverse(x);
return 0;
}

Вот весь код, который работает. Однако понимания не прибавило лол
#296 #622141
>>622131

#include <stdio.h>
#include <stdlib.h>
void print_reverse(char s)
{
size_t len = strlen(s);
char
t = s + len -1;
while(t >= s)
{
printf("%c", *t);
t = t - 1;
}
puts("");
}

int main()
{
char x[40];
puts("Введи строку \n");
fgets(x, 39, stdin);
print_reverse(x);
return 0;
}

Вот весь код, который работает. Однако понимания не прибавило лол
#298 #622152
>>622141
Я не внимательно прочитал сначала.
https://ideone.com/98CYJE
Расставил комментарии.
#299 #622159
>>622152
Спасибо, анон. Кажется начинаю вникать. И еще вопрос: где найти задачи на большее усвоение тем указателей и строк?
#300 #622161
>>622159
Книжки почитай. K&R или Прата. У них и задачи есть.
#301 #622163
>>622161
Вдогонку, почему мои программы неадекватно работают с кириллицей? Либо толпы вопросов, либо ошибка.
#302 #622165
>>622163
Поднимался вопрос в треде.
Читай отсюда:
>>621138
20 Кб, 689x270
#303 #622169
ПОСОНЫ НА СКРИНЕ БЛЯТЬ ПРОБЛЕМА ВЕКА,
ЧО ДЕЛАТЬ НАХУЙ ПИЗДЕЦ СРОЧНО

после while( chunksize > 0 ) присваевается ноль

я перегрелся?
и не нашел где плюсотред.
#304 #622171
>>622169
У тебя БЛОКСАЙЗ не равен нулю случаем?
#305 #622173
>>622171
нет, const int BLOCKSIZE = 1024;
на скрине, шаг1 высвечивает нормальное значение
#306 #622180
>>622173
а оффсет 1024м?
44 Кб, 558x411
#307 #622185
Я ТАК НЕ ИГРАЮ НАХУЙ
чо делать то?
#308 #622187
>>622180
офсет нулю равен, это не важно
второй скрин смотри
#309 #622191
>>622185
не, тут все верно вылетает
#310 #622195
все решил, это я перегрелся.

на этом скрине >>622169 видно что chanksize внутри while не подсвечивается.
компилятор его считал другой переменной.

объявлена была в самом конце цикла, то есть после использования.
#311 #622219
Хм. Это нормально, что для массива структур, состоящей из ~70 указателей на char + несколько массивов char хватает только 75 плюс-минус 1 элемент? Дальше программно тоже нельзя для такой структуры выделять память... Система Debian, сборка с помощью CMake, если что.
#312 #622223
>>622219
Покажи код структуры. Я лично, не понял что ты имеешь ввиду.
#313 #622228
>>622223
http://pastebin.com/dEmybkBY

Ну вот. Потом идёт
Record Table[RNUM];
Где RNUM - количество читаемых строк из некоего файла, это число нельзя поставить больше 75. Может, нужно выделять память через malloc?
#314 #622303
Как преобразовать id потока в int? На строчку:"int a = (uint64_t) phil4.get_id;" жалуется компилятор
#315 #622335
>>622303
Не уверен, что тебе нужно, но попробуй int a = @(uint64_t@)&phil4.get_id; где @ - *
#316 #622367
>>622303
uint64_t на int замени.
>>622335
Тогда уж int a = ∗(int∗)(uint64_t∗)&phil4.get_id;
#317 #622392
>>622303
Мне показалось, или ты ошибся тредом? У нас тут няшная сишечка, а не плюсы. Алсо, get_id - метод, почему ты его не вызываешь?

>>622367
Никогда больше так не делай. К тому же, подобный двойной каст указателя - абсолютно бессмысленная вещь.
#318 #622452
Почему IDE Pelles C часто выдает ошибку "Отказано в доступе", которая лечится только перезапуском IDE? Заебывает.
#319 #622471
>>622452
google://ide pelles c access violation
#320 #622650
>>622471
В гугле пиздят, #pragma optimize(none) не помогает от этой ошибки.
#321 #622652
>>622471
Вообще там обо всем пиздят. Отключение оптимизации в настройках не помогает.
http://forum.pellesc.de/index.php?topic=2862.15
#322 #622665
>>622652
Давай больше технической инфы. Адрес ошибки, код исключения, имя модуля, какая винда?
22 Кб, 517x330
#323 #622789
Я снова тут. Теперь туплю при написании программы по задаче. АВТОБУС ОШИБКА
ЧЯДНТ?
https://ideone.com/ICuvSY
>>622131
#324 #622791
>>622789
Если дебаггер не завезли, хотя бы с помощью printf("1");fflush(stdout); ошибку локализуй.
#325 #622793
>>622789
https://ideone.com/xixkIN
У тебя ошибка на ошибки, ошибка через ошибку...
54 Кб, 354x367
#326 #622794
>>622793
Да что же это такое... Буду перепиливать. Спасибо
#327 #622795
>>622793

>Бред. Ты сравниваешь адрес с числом


Арифметические операции с указателями разве не так реализуются?
#328 #622796
>>622795
Адрес имеет значение вида 0x0c4233dd. Число, которое сравнивается с указателем в том цикле является длинной строки. Сам подумай, есть ли в этом смысл.
#329 #622797
>>622796
Уточнение:
Было бы правильно, если бы сравнивался указатель на начало строки с указателем на начало строки + длинна строки. Тогда было бы нормально.
#330 #622799
>>622797
Но как тогда "передвинуть" указатель первого символа строки на Nый символ оной? Видимо я недопонял саму концепцию операций над указателями, лол
#331 #622802
>>622799
Ты передал первый элемент массива через аргумент. Создай в той же функции указатель, который будет указывать на то, что ты передал (начало строки), Это для того, чтобы не потерять саму строку. Затем, ты можешь делать со строкой все что угодно. Для того чтобы передвинуть указатель, тебе нужно добавить целое число. Допустим есть у тебя указатель на char. Прибавляя единицу, ты сдвинешься на один байт. Если указатель будет на double, добавив единицу, ты сдвинешься на 8 байт, так как double = 8 байтам. Естественно, размеры char, int , double - не фиксированы и зависят от платформы. Но я взял к примеру amd64.
#332 #622803
>>622802
Спасибо за объяснения Вчера ли не ты мне помог?, приму к сведению, пойду перечитывать главу с указателями.
#333 #622804
>>622803
Да. Перечитай и попрактикуйся. Указатели лишь поначалу кажутся сложными и непонятными, но если приловчится, начинаешь без проблем работать даже с самыми сложными конструкциями.
Ага. Если ты про книги, юникод и комментарии.
#334 #622861
>>622802

>char, int , double - не фиксированы и зависят от платформы


nope, char везде 1 байт
#335 #622865
>>622861
будь чар 1 байт, то тогда не придумывали бы uint8_t
#337 #622891
>>622876
>>622865
>>622861
Да какая разница. Будто кто-нибудь здесь пишет под очень редкие и необычные платформы.
#338 #623079
как понять формальные и фактические параметры?
#339 #623081
>>623079
Формальные — это тот, который ты задаешь при определении функции. Фактический — тот который используется при вызове.
#340 #623088
>>623081
типа int huy (int govno) - huy это формальный, govno - фактически - правильно поняЛ?
#341 #623090
>>623088
Нет. Возьмем этот https://ideone.com/xixkIN пример (не обращай внимание, что код в не абсолютно не правильный).
Здесь на строке 17 и 33 у нас определения функций. Аргументы, которые они принимают — формальные. То есть на не обязательно, передавать аргументы с теми именами, которые указаны. Главное чтобы тип совпадал.
А вот вызовы этих функций, на строке 39 и 49 — принимают фактические аргументы.
#342 #623095
>>623090
А, ясно короче, блин. Лол. а так описано ФОРМАЛЬНЫЕ ФАКТИЧЕСКИЕ, лол, я думал там сложно А это оказывается принимаемые параметры и объявляемые в фцункции, спасибо.

Короче
где-то в программе int huy_pizda;

int huy (int govno)//формальный
{..}

huy(huy_pizda) - фактически
#343 #623097
>>623090
Забыл сказать - спасибо.
#344 #623099
>>623095
Небольшое уточнение.Это параметры объявляемой и вызываемой функции.

>int huy (int govno)//формальный {..}


Здесь именно int govno - формальный параметр

>huy(huy_pizda) - фактически


huy_pizda - фактический параметр.
#345 #623118
>>622219
Опять я выхожу на связь. Портирую свою программу на виндовс. Через тот же Qt и CMake. И тут вылезает такая segmentation fault в следующем участке:

char buf=((char)malloc(sizeof(char)10BUF_SIZE)); <- если использовать такую конструкцию, то для буфера хватит аж целых 10 кБ, и никакой ошибки не возникает

char buf; <- если использовать такое объявление и прикрутить проверку на выделение памяти, вылезает segmentation fault и пишет Out of memory: not enough space (причём здесь выделяется всего лишь 1кБ.
if ((buf=((char
)malloc(sizeof(char)*BUF_SIZE)))==NULL){ \t \t
perror("Out of memory");
system("pause");
exit (-1);
}
#346 #623124
>>623118
Ну блин. Всё время забываю про звёзды.
http://pastebin.com/LYnKn6HK
#347 #623132
>>623124
BUF_SIZE покажи как определен.
#348 #623135
>>623132
через #define

Но вот щас интересная магия происходит: убираю отладочный printf - программа крашится...
#349 #623137
>>623132
0x7fffffff
#350 #623144
>>623137
А тебе двух гигов не многовато будет?
#351 #623155
>>623144
А я по твоему должен думать о нищебродах, у которых меньше 8Гб ОЗУ?
Да я не он. Просто вспомнил многопоточный сканер портов, который был сотней постами ранее.
#352 #623158
Что скажите о GTK? Он где то применяется кроме open source проектов?
#353 #623166
>>623155
Видел коммерческий русский софт на PyGTK.
#354 #623172
>>623135
Ты всю функцию покажи.
#356 #623184
>>623177

> memset(buf,0,sizeof(buf));


http://www.viva64.com/ru/b/0360/

Покажи дефайн с BUF_SIZE. Или проблема в нём, или ты кучу распидорашиваешь где-то в другой части программы.
#357 #623188
>>623184
Хм. Возможно, стоит отказаться от использования этой функции.
Дефайн вот:
#define BUF_SIZE 500
Если поставить, к примеру, 1000, то программа не выдерживает.
Пробовал объявить и глобальную
size_t BUF_SIZE=1000;
Проблема та же.
#358 #623195
>>623188
А у тебя точно считывается не больше BUF_SIZE - 1 байт?
#359 #623197
>>623188
Не надо отказываться, надо после malloc кормить в memset то, что кормил в malloc, а не sizeof указателя. А вообще, у нас calloc есть.
#360 #623200
>>623195
Точно. Самая большая строка - первая, в ней 460 символов всего.
#361 #623204
>>623197
Ок, тогда буду юзать calloc.
#362 #623205
>>623197
Не нужен ему memset, он всё равно буфер заполняет из файла.
>>623200
Не поленился и проверил твою функцию. Как и ожидалось, всё нормально выполняется. Ошибка не в ней.
#363 #623207
>>623205
Спасибо. А через что проверял? Я и через Qt и через Dev-C++ запускал.
#364 #623211
>>623205
Я проверял первое, что он выложил. Тоже работает.

>>623204
Разницы не будет.
И вообще. В чем проблема взять отладчик? Отладка при помощи принтов не самый оптимальный способ.
97 Кб, 1280x800
#365 #623212
>>623207
Через конпелятор VS2005.
#366 #623214
>>623212
Ты там браузер пишешь?
#367 #623215
>>623212
А, тогда норм.
QtCreator ещё почему-то не завершает программу, которая запустилась нормально и завершилась нормально, и если не убить её вручную, то следующий запуск будет с фейлом.
#368 #623216
>>623212
А вкладки замазать забыл, ананимас блин.
>>623214
Нет, кэширующий https-прокси. Это как mitm-прокси, только кэширующий.
#369 #623217
>>623216
https://msdn.microsoft.com/en-us/library/974tc9t1.aspx посмотри там в конце, как включить отладку кучи (не помню, можно ли где-то галочкой поставить).
#370 #623223
Как в Си сделать ассемблерную вставку?
#371 #623226
#372 #623266
>>623264
>>623265

помогите совладать нубу с лабой плз :(
#373 #623299
>>623266
Не совсем понятно, зачем там add esi,24 и прочие shr до dec. В остальном все ок же. Я бы сделал fldz и цикл из нужного количества fadd. Как-нибудь так: http://pastebin.com/LUPasL1Z
18 Кб, 876x69
#374 #623309
Я не могу понять чистый си, вот почему он отказывается выводить матрицу и выдает

for (int i=0; i<5; i++) {

for (int j=0; j<5; j++) {
printf("%d\t", kk[j] );
printf("\n");
}
}

Какой у меня дабл, наркоманы
#375 #623310
>>623309
блядь половину знаков сьела вакаба
printf("%d\t", kk[j]);
конечно же
#376 #623311
>>623309

>printf("%d\t", kk[j] );


>printf("%lf\t", kk[j] );


Для float - %а, для double - %lf.
#377 #623312
>>623311

>Для float - %а


>Для float - %f


фикс
#378 #623313
>>623309
Покажи как kk[][] объявлял.
#379 #623359
программач, вот я, допустим, угорел по С и подучив немного теорию захотел реализовать свои новоприобритенные навыки - стоит лезть на гитхаб в относительно простые проекты со своими предложениями? свои велосипеды писать не хочется тк быстро надоедает написание программ бесцельно, а тут какая-никакая польза вред для сообщества. Или есть места более для этого подходящие? Или вообще стоит порешать задачи университетские (методички и прочее)?
#380 #623366
>>623359
Стоит лезть с пулл-реквестами, но постарайся делать это не так:
https://lkml.org/lkml/2015/11/19/466
#381 #623372
>>623366
А есть другие площадки, где, например, низкий порог вхождения?
#382 #623386
В чём подводные камни использования fclose ?
#383 #623428
>>623386
Чего-о-о? Нет никаких камней, обязательно используй.
#384 #623433
>>623372
Гитхаб норм же. Можешь какого-нибудь инди-разработчика найти с проектом, который тебе интересен - и он будет рад внезапным помощникам, и тебе опыт.
problem #385 #624489
Программисты, у меня проблема.

Кто нибудь кодит в XCode ?

Начал свой небольшой проект на чистом С. И столкнулся с такой хуйней.
Есть 3 файла.

//main.c
#include "cpu.h"
//код программы

//cpu.c
#include "cpu.h"
//тут реализация пары функций из cpu.h

//cpu.h
#ifndef cpu_h
#define cpu_h
// тут объявлены 11 глобальных переменных, используемых
// и в main.c и в cpu.c
#endif / cpu_h /

Так вот я не могу скомпилировать это дерьмо. Потому что на линковке выдает ошибку - 11 duplicate symbols for arhitecture bla bla.

Что за хуйня? такой же код и файлы в Visual Studio компилируются нормально.
#386 #624705
>>624489
если глобальные переменные extern, их значения надо присваивать в cpu.c, а не cpu.h

extern yoba_t YOBA; // cpu.h
yoba_t YOBA = {Kruzhok, Zhelty}; // cpu.c

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

еще можно в cpu.h просто пометить переменные как static, тогда на самом деле main.c и cpu.c будут использовать разные копии.
#387 #625237
>>623386
Например вот: только после fclose в успешную, ты имеешь гарантию что данные записались на диск - иначе нет.
#388 #625239
>>623223
В с нет такого понятия как ассемблерные вставки. Такое понятие есть на уровне компиляторов - у каждого свои.
#389 #625241
>>625237
Во-первых, это всего лишь потому, что fclose делает fflush, а во-вторых, ОС может с тобой не согласиться, а накопитель тем более может не согласиться.
#390 #625242
>>625241

> например, узнать что такое стан


> ОС может


А вот и олени подкатили. Ты действительно еблан?
#391 #625243
Ну какой может, да лишь потому. Есть описание - по нему и нужно думать. А как там внутри - сёдня так, завтра сяк - и только линус будет возникать в защиту говнокодеров.
#392 #625244
Есть вменяемые библиотеки для работы с текстом?
#393 #625245
>>625244

> для работы с текстом


Давно хочу знаит, а что это значит? Нужно соединять строчки красиво?
#394 #625246
Или там парсить с регулярными выражениями?
#395 #625247
>>625245
Ну всякие part of speech tagger (проставлялка частей речи, допустим в английском), какие-нибудь библиотеки для автоматизации рутинной ебли с указателями на массив символов.
Регекспы устраивают, но не совсем. Да и медленновато ими.
#396 #625248
>>625247
Ну это уже совсем новый уровень не слышал про такое никогда лол, вряд-ли это к "программированию" прям вопрос, хотя я и других библиотек не знаю, более приземлённых.
#397 #625249
Можно попробовать погуглить "C библиотека распознавания частей предложений" Забавно, если добавить в запрос "C" то часто по теме ищет... Хотя 1 символ то. - но наверно ты это сделал уже, и спросил за опыт пользования.
#399 #625256
>>625255
https://stackoverflow.com/questions/1805099/c-c-nlp-library
Даже что-то нагуглил, есть тут кто с опытом использования?
#400 #625475
Посоветуйте годной литературы по работе с потоками.
#401 #625885
>>625475
Ну как бы это сказать, треды ты же про них?, сильно платформо-зависимы. Например, под линь можно почитать боровского - коротенькие статейки с примерами.
#402 #625910
>>613506

>size_t на unsigned int


Лол, вы тут все такие ебанутые?
#403 #625912
>>613522

>так и больше размера size_t


Карнавал продолжается. Хотя с числовыми эквивалентами указателей дикий наёб (вспомнить хоть ptrdiff_t к тому), тут только строго c99 (со своими модными intptr_t и uintptr_t) иначе не как .
#404 #625918
>>619834
В чём проблема то? Бери да кастуй, не нравится - определяй юнион, если там есть массивы переменной длины - объявляй структуру прям внутри функции, где укажешь какой размер массивов в данный момент. А вообще, я не понял что хочешь ты.
#405 #625921
>>620081

>Стандарт запрещает


Стандарт определяет тебе за щеку. Какая хуйня разница на порядок байт, если это не внешние данные, например Или с чего ты взял что это не так?
#406 #625923
Ой всё, не могу больше читать вас.
#407 #625931
>>625923
да, пиздуй отсюда, хуесос
#408 #626146
>>620297
Мелкомягие тоже могут, оказывается ))
C:\TEMP\1>cl /GS- 2.c /link /NODEFAULTLIB /ENTRY:mainCRTStartup /SUBSYSTEM:CONSOLE /IGNORE:4254 kernel32.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

2.c
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.

/out:2.exe
/NODEFAULTLIB
/ENTRY:mainCRTStartup
/SUBSYSTEM:CONSOLE
/IGNORE:4254
kernel32.lib
2.obj

C:\TEMP\1>2
Hello, World!

C:\TEMP\1>dir 2.exe|findstr 2.exe
15.01.2016 14:40 1 024 2.exe

C:\TEMP\1>type 2.c
#include <windows.h>
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma optimize("gsy", on)

int mainCRTStartup()
{
DWORD dwCharsWritten = 0;
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
char sMsg[] = "Hello, World!\n";
WriteConsole(hStdout, sMsg, lstrlen(sMsg), &dwCharsWritten, NULL);
return 0;
}
#408 #626146
>>620297
Мелкомягие тоже могут, оказывается ))
C:\TEMP\1>cl /GS- 2.c /link /NODEFAULTLIB /ENTRY:mainCRTStartup /SUBSYSTEM:CONSOLE /IGNORE:4254 kernel32.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

2.c
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.

/out:2.exe
/NODEFAULTLIB
/ENTRY:mainCRTStartup
/SUBSYSTEM:CONSOLE
/IGNORE:4254
kernel32.lib
2.obj

C:\TEMP\1>2
Hello, World!

C:\TEMP\1>dir 2.exe|findstr 2.exe
15.01.2016 14:40 1 024 2.exe

C:\TEMP\1>type 2.c
#include <windows.h>
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma optimize("gsy", on)

int mainCRTStartup()
{
DWORD dwCharsWritten = 0;
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
char sMsg[] = "Hello, World!\n";
WriteConsole(hStdout, sMsg, lstrlen(sMsg), &dwCharsWritten, NULL);
return 0;
}
#409 #626263
Есть два массива c[j ... q-1] и a[k ... p + q - 1]. Как скопировать c в a проще всего? Есть какая-нибудь функция?
Индексы могут быть любыми, т.е. мы отрезок одного массива копируем в отрезок другого массива.
#410 #626278
>>626263
Очевидные memcpy/memmove.
#411 #626286
>>626278
Я уже погуглил memcpy. Как его правильно использовать, если массив C создан на куче? Есть указатель на его начало. Как с его помощью копировать диапазон элементов из данного массива в другой?
#412 #626314
>>626286
Считаешь, сколько тебе элементов нужно скопировать. Копируешь:
memcpy(&dest_array[dest_index], &source_array[source_index], sizeof(source_array[0]) ∗ num_elemets);
Где созданы массивы, значения не имеет. Разве что, если диапазоны хотя бы частично перекрывают друг друга, нужно использовать memmove.
Выражение &array[index] можно заменить на array + index, это вопрос личных предпочтений. Я считаю, что с & и индексом нагляднее.
112 Кб, 848x833
73 Кб, 821x868
#413 #626407
>>626314
Я вот что пишу. Видимо, я неправильно использую memset, потому что даже спижженное откуда-то копирование при помощи двух циклов дает мне некоторое подобие отсортированного списка. У меня же получается просто мусор.

Как можно исправить алгоритм?

https://ideone.com/b5Slww

У меня все компилируется и запускается. Про free я забыл, но сейчас допишу.
#414 #626408
>>626407
Блджад, а при добавлении free вне if'а или внутри программа падает при запуске.
#415 #626410
>>626407
Еще одну ошибку увидел: при выделении памяти не домножаю на размер типа данных.
#416 #626412
>>626407
Лел, исправил эту ошибку, и сразу заработало. Тогда просто подскажите, как из этого говна сделать хороший код. Что я делаю не так?
#417 #626449
>>626407
Вот моя окончательная реализация, господа. https://ideone.com/quzyJ8
В процедуре mergesort выделяется память для двух массивов даже когда не выполняется условие n > 1, то есть будет утечка памяти. Как это исправить? Можно освобождать память внутри mergesort, но ведь логичнее это делать после слияния, когда массивы стали больше не нужны.
#418 #626473
>>626449
Например free перенести из merge в mergesort?
#419 #626554
>>626314

>Разве что, если диапазоны хотя бы частично перекрывают друг друга, нужно использовать memmove


Против линуса попереть решил? Не стыдно?
#420 #626585
>>626554
Почему? Он как раз всё по Линусу предлагает:
[CODE]
The memcpy() function copies n bytes from memory area src to memory
area dest. The memory areas must not overlap. Use memmove(3) if the
memory areas do overlap.[/CODE]
#421 #626793
>>626585
нуфаг не вкурсе за memcpy срач
#422 #626937
Анон поможи.
[code]
printing_str = int_data % 10 + '0';
[/code]
Каким образом это работает? Остаток от деления int на int будет int и к нему прибавляют char '0'. Ничего не понятно. Тут какое-то хитрое преобразования типов?
#423 #626963
>>626937
char - беззнаковый целочисленный 1-байтный тип данных. То есть [0; 255]. В стандартной кодировке числа идут по порядку, поэтому можно из '0' сделать '1', прибавив единицу. Или из 'a' сделать 'b'.
#424 #627019
>>626793
Ну так просвети, ёбана. Я могу также сказать, что ты не читал мануал к функции memcpy().
#425 #627170
>>626937
Про типы данных в выражениях тебе нужно знать одно: если они меньше чем int они неявно кастуються в int, если больше, например безнаковый int, то кастуются в большое, понятно, по приоритетам операций. Всё, например, просто.
#426 #627171
>>627019
Да я чист лах, забей)
#427 #627172
>>626963

>char - беззнаковый целочисленный 1-байтный тип данных. То есть [0; 255].


Блять, вы же тралите так? Как вас земля носит. Знаковость он определил, ещё и диапазон вместимости чара, ну ахуеть.
#429 #627178
Лол, нашёл писанину, что я писал когда вкатывался, тогда я в це++ залез, и потом быстро вылез на ц.

class os_vzai
....
DWORD, WORD я писал на винапи... какой шквар
....
Методы заебись:
void fu_cp_001(u_char bb) { //Просто пишим символ
bool fu_cp_002(WORD beck,WORD fore) { //Устанавлеваем цвет от 0-15
void fu_cp_002(WORD beck) { //Устанавлеваем цвет от 0-15
void fu_cp_003(u_sint xz,u_sint yz) { //Размер консоли
....

Потом я видимо на структуру и функции переписал:
struct OSVZAIM
....

OSVZAIM O1488=OSVZAIM(); - Что это в спп значит, помнит кто?
#define CRE_ALL_CON_SHIT(); \
({ \
O1488.CON_HAN_VIVO=GetStdHandle(STD_OUTPUT_HANDLE); \
O1488.CON_HAN_VVOD=GetStdHandle(STD_INPUT_HANDLE); \
....

Короче это обёртка для вывода на виндавс консоль....
#430 #627183
Хотел откопать как я делал вычисления на макросах, а нашёл такой хуйни...

/
> Функция умножения ДЦПТ на ДЦПТ.
> Во всех операндах(1) части по 32бит. 2 - не больше 31
иначе я неебу чё произойдёт. ОСТОРОЖНО БЛЯТЬ например
неучтино что навыход число вдва раза больше.
> [1-Слагаемое] [2-Сдвиг на] [3-Байт колличесто]
/// 8 12 16 20
void bnFU_UDVx32_Mul(void Var_1, u_int Var_2, void Out_3, u_int Byt_4) { //ЭТО ПОЛНАЯ ХУЙНЯ, ПЕРЕПИСАТЬ
asm volatile (
STRING_LITERAL(
/
~~ПУПОВИНА~~ /
movl 8(%esp) , %edi ;
movl 12(%esp) , %esi ;
movl 16(%esp) , %ecx ;

addl 20(%esp) , %esi ; //Смещь. умножитель на младьшее
movl 20(%esp) , %ebp ;
xorl %edx , %edx ;
/
~~ТЕЛО~~ */
LAB_0301:
subl $4 , %ebp ;

movl 20(%esp) , %ebx ; //

addl %ebx , %edi ; //Смещь. умножаемое на младьшее

subl $4 , %ecx ; //Смещь. результ на доб смещь
subl $4 , %esi ; //Смещь. умножитель

LAB_0302: //ЗДЕСЬ умножаем 1 часть умножителя на умножаемое
#430 #627183
Хотел откопать как я делал вычисления на макросах, а нашёл такой хуйни...

/
> Функция умножения ДЦПТ на ДЦПТ.
> Во всех операндах(1) части по 32бит. 2 - не больше 31
иначе я неебу чё произойдёт. ОСТОРОЖНО БЛЯТЬ например
неучтино что навыход число вдва раза больше.
> [1-Слагаемое] [2-Сдвиг на] [3-Байт колличесто]
/// 8 12 16 20
void bnFU_UDVx32_Mul(void Var_1, u_int Var_2, void Out_3, u_int Byt_4) { //ЭТО ПОЛНАЯ ХУЙНЯ, ПЕРЕПИСАТЬ
asm volatile (
STRING_LITERAL(
/
~~ПУПОВИНА~~ /
movl 8(%esp) , %edi ;
movl 12(%esp) , %esi ;
movl 16(%esp) , %ecx ;

addl 20(%esp) , %esi ; //Смещь. умножитель на младьшее
movl 20(%esp) , %ebp ;
xorl %edx , %edx ;
/
~~ТЕЛО~~ */
LAB_0301:
subl $4 , %ebp ;

movl 20(%esp) , %ebx ; //

addl %ebx , %edi ; //Смещь. умножаемое на младьшее

subl $4 , %ecx ; //Смещь. результ на доб смещь
subl $4 , %esi ; //Смещь. умножитель

LAB_0302: //ЗДЕСЬ умножаем 1 часть умножителя на умножаемое
#431 #627184
Всё засрал, теперь можно и уходить, не благодарите.
#432 #627278
>>627174
Энивей, не понятно, почему против Линуса, если он по ссылке пиздит про то что надо memmove() юзать.
>>627171
Хотя это многое объясняет.
#433 #627280
>>627278

> если он по ссылке пиздит про то что надо memmove


> Хотя это многое объясняет


жопой читал, но ему много объясняет - так и запишем.
#434 #627423
>>627280
просто иди нахуй

>memcpy acts randomly (and differently) with overlapping areas


>It's a common bug to use memcpy() instead of memmove()


>So from a pure Quality-of-Implementation standpoint, just make glibc implement memcpy() as memmove()


>However, I still don't understand why you guys can't just admit that you might as well just do memmove() and be done with it.

#435 #627432
Я тут хотел задать вопрос по поводу буфера. Правильно ли я делаю:
1) Задаю начальный размер буфера;
2) Выделяю память при помощи malloc;
3) Делаю цикл для считывания введенных символов с клавиатуры до тех пор, пока символом не станет '\n';
4) В цикле есть счетчик, с помощью которого узнаю, не превышаю ли размера буфера;
5) В случае, если запись текущего символа превысит размер буфера будет превышен, удваиваю размер буфера при помощи realloc;
6) После цикла, выставляю '\0' в качестве значения для последнего элемента строки;
7) Если буфер заполнен не полностью, усекаю размер буфера до размера строки при помощи realloc.
Все правильно делаю? Или можно как-то иначе и лучше сделать это?
#436 #627508
>>627423
Ты внатуре ебанько, он пишет за баг в либс, хотя его там нет, заебись так сделать memcpy как memmove. Короче о чём с тобой говорить....
#437 #627515
>>627432

> В случае, если запись текущего символа превысит размер буфера будет превышен,


посылаю нахуй пользователя, потому что 1кб на строчку должно хватать.

> realloc


Не пользуйся этим говном. Память не нужно реалацировать, память нужно выделять и связывать.
#438 #627522
>>627515

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


>память нужно выделять и связывать.


А если вместо пользователя файл? 1KB не хватит. А заранее выделить необходимое количество не выйдет.

>Не пользуйся этим говном.


А вот здесь по-подробней. Что не так с этой функцией?
#439 #627579
>>627522

> А если вместо пользователя файл


И что, там будут строки больше 1кб? Вот ты прочитал строку, дальше ты с ней что делаешь?

> Что не так с этой функцией?


Всё так, я просто боевой школьник, и иметь кучу вызовов алока/реалока - странно, суть всегда в том, чтобы сразу выделить много и этим пользоваться. Усекать уж точно не нужно, как и давать возможность пользователи запросить бесконечно много памяти.
33 Кб, 453x323
18 Кб, 421x90
#440 #627677
Поясните, почему при вводе кириллицы он показывает 4-байтный хекс, но 1-байтный sizeof?
#441 #627686
>>627677
Потому что ты дебил и не понимаешь смысла оператора sizeof.
#442 #627691
Язык с++ Одну из ниже перечисленных ПРОШУ, ПОМОГИТЕ. ЗАВТРА ВЫЕБУТ
1. Программа, подсчитывающая, в какой день недели родились. Входные данные - дата рождения.
2. Программа, считающая количество полных дней с даты рождения. Входные данные - дата рождения и текущая дата.
3. Программа, определяющая, високосный ли год. Входные данные - год.
#443 #627692
>>627686
Нет, это ты даун, раз сразу не понял, в чем здесь проблема.
Это тупое переполнение char, надо делать unsigned.
#444 #627713
>>627691
Это не С++ тред. Но кажется, эти задания я видел у старины Бьерна. Там в главе про классы кажись.
#445 #627719
>>627677
Просто char в функциях с переменным числом аргументов автоматически преобразуется к int. Спецификатор %x предназначен как раз для вывода int, и этот самый int он и выводит. Но размер типа char от этого, конечно же, не меняется, поэтому второй спецификатор выводит 1.
#446 #627731
>>627719

>int


Собственно говоря потому, что при вызове функции в С, на стек аргументы так и кладутся, интами, ну, кратно.
#447 #627752
>>627731
Если функция принимает char (есть формальный параметр), то на x86 компилятор может сделать push eax, не обнуляя старшие биты eax. Если функция с переменным числом аргументов, компилятор обязан будет сначала сделать movsx.
#448 #627759
>>627508
Он пишет про workaround для решения проблем, вызванных некорректным использованием memcpy() разработчиками софта.

>заебись так сделать memcpy как memmove


По факту там хуйнули патч для x86 архитектуры, что заместо memcpy() вызывался memmove(), т.к. он работает нормально с overlapped буферами. Каким макаром замечание, что

>если диапазоны хотя бы частично перекрывают друг друга, нужно использовать memmove


противоречит Линусу, я не понимаю. Хотя о чём с тобой говорить.............
#449 #627787
>>627759
Проиворечит линусу то, что он допускает неправильное использование memcpy, при перекрывающихся (и пошёл хуярить именно на либу), а ты предлагаешь человеку делать "как надо" - но ты нихуя не улавливаешь ни связи, не смысла - уёбок, что с тобой сделать................................
#450 #627800
>>627787
>>627759
Вы уже надоели! Читаю вас и не могу понять, о чем вы спорите. Какие-то последователи Линуса или что-то еще. Просто объясните мне. Читаю я значит в мане, что рекомендуется использовать вместо memcpy, memmove в случае, если одна область (в которую копируем) накладывается на другую. Что не так?
#451 #627821
Не напомните, GTK3 имеет обратную совместимость с GTK2. Или они все сломали? Просто думаю вкатиться по этому протухшему мануалу https://developer.gnome.org/gtk-tutorial/2.90/ , так как других не вижу.
#452 #627829
>>627821

>думаю вкатиться


>GTK


Бросай эту протухшую затею.
#453 #627835
>>627829
Но почему? Что в нем плохого?
#454 #627841
>>627835
Он умирает
#455 #627850
>>627800
Тоже не могу понять, о чем спор. То, что в каких-то линуксах реализация memmove практически идентична по быстродействию memcpy, не означает, что так будет в других реализациях на других платформах. Поэтому правила остаются теми же:
1) memmove, если области перекрываются или есть сомнения.
2) memcpy в остальных случаях.
#456 #627851
>>627841
Понятно. Очередной Qt фанатик. А я надеялся ты аргументируешь как-то. На линуксах оно живее всех живых ведь. GNOME 3 хоть и утратил популярность, но держится на плаву. А крыса и вовсе сейчас процветает (вероятно скоро самой популярной станет), так как у нее многие пользователи — это беженцы с тех же KDE и GNOME, в которых от релиза к релизу все ломают. Также есть множество людей, которые предпочитают чистый Си, а не кресты (я не из таких). Впрочем, это уже тема для срача.
#457 #627852
>>627851
Я не фанатик, я просто реалист. Когда даже такие крупные проекты как, например, Wireshark валят с гтк (или скорее валят на qt), это о чем-то говорит.
#458 #627858
>>627850
У меня складывается такое впечатление, что они начитаются статей от васянов на какой-то хабре или прочем ресурсе и принимают сказанное за истину, вместо того, чтобы самостоятельно разобраться в теме.

>>627852
https://en.wikipedia.org/wiki/List_of_GTK%2B_applications
https://en.wikipedia.org/wiki/Category:Software_that_uses_GTK%2B
Ну да. Действительно умирает. Кстати, я почему-то думал, что хромиум на Qt. А оказывается вот оно как. Два единственных браузера и то зависят от мертвого тулкита.
#460 #627883
>>627880
Внимание не обращайте, делайте как написано в мане, а не как васяны-хакеры могут, и не будет такой хуйни по итогу.
#461 #628002
>>627851

>GTK


>чистый C


насмешил
#462 #628047
>>627852
Должен заметить, что ваешарк на кт редкостное глюкавое неузабельное говно получилось пока.
#463 #628236
>>628047
Они еще тестируют его. И пока у них две версии (Qt, GTK), рано еще говорить о чем-либо говорить. Есть вероятность, что они и в Qt найдут какой-нибудь фатальный недостаток, коих у обоих тулкитов достаточно.
#464 #628240
Я правильно понимаю, что если у GTK лицензия LGPL, то его можно использовать для создания проприетари?
#465 #628244
>>609376 (OP)
Теку от этой шапки.
#466 #628249
>>628244
Ты бы и от собаки тек.
203 Кб, 960x960
#467 #628618
Сканер портов то скиньте обратно, глянуть хочу чёт, будьте же вы людьми.
#468 #628622
>>628618
Что тебе нужно? Ты так коряво сказал, что я подумал, что ты хочешь чтобы тебе запили сканер портов.
#469 #628627
#470 #628628
>>628627
Если ты удалил это у себя, то уже не вернуть. Он никому не нужен, чтобы его хранить. А за твои ошибки тебе уже поянили.
#471 #628629
>>628628
Да это не я, просто тредами как-то не баловался ещё, буду базу данных писать, запилю её на тредах, чтоль, один обработчик ввода, другие - выполнение. Ввод/вывод - пайпы, или сокеты, хмм....
164 Кб, 963x1340
#472 #628634
>>609376 (OP)
Ребят, кстати, почему в рекомендациях нет "Искусства Эксплойта" второго издания Эриксона? Там же охуенное введение, как в С, так и сразу же на наглядных примерах его применение. Там даже с отладчиком сразу показывают, как работать надо.
http://www.ozon.ru/context/detail/id/4833854/
хотя по любому уже и так в сети есть
#473 #628637
>>628629
Почитай про мнопоточность лучше. В случае с серваками, если я не ошибаюсь применяют две модели: 1) поток на соединение; 2) поток управляемый событием (то есть потоки используются по мере надобности);
Не расходуй ресурсы процессора впустую. На ввод/вывод требуется очень мало ресурсов процессора. Оно там не нужно.

>>628634
Не стоит. Ты видишь какой здесь контингент? Лучше пусть изучают принципы программирования, а не то каждый ньюфаг сразу будет хватать это и задавать глупые вопросы.
#474 #628644
>>628637

> Почитай про


Я и так вкурсе вопроса.

>Оно там не нужно


Что значит не нужно, а кто будет рождать потоки на выполнение? Я хочу чтобы можно было, например параллельно вести поиск чего-то по базе. Да и её саму (базу) в отдельный процесс.
#475 #628648
>>628637
Хз, я по нему 6 лет назад на Си кодить учился.
#476 #628649
>>628634
Там говняный синтаксис асма.
#477 #628652
>>628644

>Я и так вкурсе вопроса.


Сомневаюсь, если ты собрался на I/O выделять отдельные потоки. Или может я тебя не правильно понял, В любом случае, то что ты просил уже нет. Да и не нужно оно, так как не было сделано нормально (массив потоков в 4Гб).

>>628648
Ширусы писал?
#478 #628656
>>628652

>если ты собрался на I/O


Это же база в отдельно процессе, её I - это приказы на выполнение чего-то. Да хуй с ним.

>>628634
Есть же модное импорто-замещение, касперски.
#479 #628657
>>628656

> касперски


В общем-то, в очередном треде, советую почитать его писанину, про оптимизацию.
#480 #628659
>>628649
Интеловский жи. Чем он так плох?
#481 #628660
>>628657
Очень давно его не читал. Но честно говоря год назад наткнулся на его вью и как-то он имхо, как человек, дико испортился. Видимо после визита ФБР.
#482 #628662
>>628659
Здесь вечный срач. Интелловский самый распространенный, так как интел его продвигает. AT&T многие считают очень удобным и более логичным. Но он настолько мало распространен.
#483 #628664
>>628662

> AT&T


Он правильный, но не красивый. Как тут сравнивать.
#484 #628666
>>628659
Он там как раз AT&T.
#485 #628668
>>628666
Как можно зная один синтаксис, не осилить другой. Они же все равно похожи очень.
#486 #628670
>>628666
А, нет, там, вроде, интеловский. Зря я сиранул на синтаксис.
Посоветуйте, как проще всего смотреть код сишных функций в дизассемблере, и я пойду обмазываться. До этого изучал в отладчике только проги на чистом асм.
#487 #628672
>>628668
AT & T неприятный.
#488 #628673
>>628672
Чем? Он скорее не привычный.
#489 #628678
>>628673
% % % % % %
#490 #628682
>>628678
Сложно запомнить, что регистры начинаются с % (%eax, %ebx или %rax %rbx) и значения с $ ($0x80, $40 и т.д)?
#491 #628684
>>628670

>как проще всего смотреть код сишных функций в дизассемблере


Как это вообще понимать? Может глазами, там.
#492 #628688
>>628682
Это не сложность, это некрасивость.
#493 #628691
>>628688
Тебе смотреть на него или писать? В любом случае, код на нем более самодокументируемый.
#494 #628697
>>628684
Например, мне нужно узнать, во что скомпилилась конкретная функция. Как ее найти в кратчайшее время?
#495 #628703
>>628697
Скомпилить с флагом -S и прочитать вывод в текстовом файле?
#497 #628749
>>628736
Ну ладно, ладно, убедили, скачаю. пойду memcpy использовать как memmove - хакирь же. Напишу плагин к браузерам, что-бы можно было красивую и мелковесную рекламу вешать - вот будет заебись
#498 #628752
>>628736
С одной стороны, если учить Си и сразу смотреть, что творится на ассемблерном уровне, все становится простым и понятным. С другой стороны, потом нужно будет потратить много времени, чтобы избавиться от плохих привычек и начать писать кроссплатформенный код.
#499 #628768
>>628752

> начать писать кроссплатформенный код


Я бы хотел добавить, платформы и их популярность меняются достаточно часто, относительно того, что у новичка да и у других бывает в голове. Вот перешли все на 86-64, и охуели c того, что int может быть не равен размеру void*, да и стандарты до, были не полны, щас с11 - это реально глыба, и самое правильное на чём нужно писать в С. И так-то правильно понимать что ты пишешь, но не забывай что стандарт - это то в чём пересекаешься ты и те кто реализуют этому коду работу. Остальное - чёрная дыра.
#500 #628982
Такая задача в ЕГЭ.
Опи­ши­те на рус­ском языке или одном из язы­ков про­грам­ми­ро­ва­ния ал­го­ритм под­сче­та мак­си­маль­но­го ко­ли­че­ства под­ряд иду­щих чет­ных эле­мен­тов в це­ло­чис­лен­ном мас­си­ве длины 30.
Вот мое решение. Правильно?
алсо, как сделать проверку на пустой элемент массива?
http://pastebin.com/xJGMMST1
#501 #628990
>>628982
Тебе разве здесь не нужно найти максимальное количество подряд идущих элементов? У тебя сейчас ищется общее количество подряд идущих. А по поводу пустого элемента — никак. В элементах, которые у тебя есть, могут быть любые числа. Даже если ты инициализируешь их каким-то числом, это может быть неправильно, так как придется зарезервировать одно число для этого.
По поводу кода. Зачем тебе sdafx, iostream и locale? Они не нужны. locale может пригодится, разве чтобы на кириллице писать. Зачем тебе system? Это тоже излишне.
#502 #628993
>>628990
sdafx стандарт в vs
iostream и locale, локале забыл убрать, иострим для остановки программы.
А точно, сейчас переделаю.
#504 #629001
>>628993
Ты еблан даже не знаешь зачем sdafx нужен. Это блядь файл с прекомпилированными блядь заголовками, для проекта уровня laba2 они не нужны, потому что он и так за пару секунд компилиться.
#505 #629004
>>629001
Я же даун, что ты доебался, просто проверь правильность решения и иди нахуй.
#506 #629007
>>629004
Ты сам не можешь проверить? Записал программу, скомпилировал, запустил, смотришь на результаты. В чем проблема?
#507 #629008
>>629007
Там еще тип эффективность смотрится.
Я вот хз.
#508 #629011
>>629008
Лично мне, лень рассматривать внимательно твой быдлокод. У меня есть и другие дела. Думаю у других, здесь находящихся, все так же. У тебя простейшая задача. Сделал? Работает? Иди сдавай! Эффективно сделаешь когда ума наберешься.

>>629008

>хз


Ясно)))))
#509 #629021
>>629011
Ну ясно тогда, удачи в делах
#510 #629091
Только что узнал, что размер bool - 1 байт, охуеть.
Зачем он тогда нужен?
#511 #629136
>>628736
>>628634
Так ли хороша эта книга? На одном книжном сайте писали, что программы там суперхуевы, а другой каментатар ответил, что реальные программы пишутся так же, и поэтому изучение говна дает понимание того, как говно хекать.
#512 #629139
>>628634
Пиздец, стоит ли читать блевоту в начале, если я осилил всего Кернигана и Ричи? Будет ли польза? Я думаю, нет.
#513 #629140
>>629139
Лучше стандарт прочти. Гораздо полезнее.
#514 #629257
Почему в си до сих пор нельзя объявлять переменные в заголовке for? Что в этом сложного?
#515 #629264
>>629257
Повторюсь для тебя: "Стандарт прочти."
В С11 уже можно объявлять локальные переменные в любых блоках, в том числе и в заголовке фора.
#516 #629335
>>629091

>bool


Сам без понятия нахуя оно нужно, вот еслиб он конвертировал возврат из функции (из стандартных) как "получилось", "не получилось" - это другое дело, только это не С. Но а так то - прост)
#517 #629338
Да и размер bool, хуй его знает я не знаю имеет ли спецификацию. Тут же всё просто, 0 - false, всё остальное - true.

Я обычно пользуюсь 1 - true, 0 - что-то специальное, <= -1 ошибка, её тип.
#518 #629354
>>629335
В Си есть _Bool

>>629338

> <= -1 ошибка, её тип.


> 0 - что-то специальное


Что-то странная система.
#519 #629361
>>629354

> bool


> _Bool


Одно и тоже.

> Что-то странная система


Она логичная, есть диапазоны положительного исхода, есть отрицательного. Выявить принадлежность просто, >0 или <0. Что тут странного?
#520 #629395
>>629136
Достаточно хороша. Там очень наглядно разжевывают всю еблю с указателями, памятью, переполнениями буферов и, например, сетевая стекоебля.
#521 #629409
>>629361

>Одно и тоже.


И я о том же.

>Что тут странного?


Все нормально. Просто я не выспался и перемешалось все в голове.

>>629395

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


Это в K&R есть.

> сетевая стекоебля.


А это, уже не имеет прямого отношения к самой Си, но есть в различных источниках. Точкой входа можно взять "Компьютерные сети" Таненбаума.
#522 #629410
Кстати, по Си ведь еще книга С. Прата есть. Вроде тоже достаточно не плохая.
#523 #629412
>>628995
Я, конечно, сам в Си новичок, но я правильно понял, что ты делаешь массив без объявления элементов этого самого массива?
#524 #629417
>>629412
Я так понял он просто алгоритм описал, чтобы проверили, правильно или нет.
#525 #629423
>>629409

> "Компьютерные сети" Таненбаума


А чё не снайдер? Чтобы вкатится сходу, можно накатить статейку шаргина на рсдн Программирование сокетов в Linux.
#526 #629424
>>629410

>Stephen Prata "C Primer Plus, 6th Edition" (2014)


Уже есть.

>>629395

>Это в K&R есть.


Только там все с крайне наглядными примерами в отличие от K&R

>А это, уже не имеет прямого отношения к самой Си


с чего это не имеет?

В общем, мое дело предложить. Елси ты уже такой охуенный парень, что освоил C по K&R, то только успехов тебе на поприще остается пожелать.
#527 #629425
>>629424

>с чего это не имеет?


Ну тип потому что)
#528 #629430
>>629417
Как-то криво, имхо, идет работа с max и submax, мне почему-то кажется, что это можно соорудить с использованием всего одной переменной.
#529 #629436
>>629430
Павильно. В случае, если где-то в середине массива условие не будет соблюдаться, submax'y опять присвоится 0, и дальше твой if if(max<submax) будет False, в следствие чего и max будет считаться не правильно.
#530 #629440
>>629423
Может лучше сначала изучить как работает сеть, перед тем, как йписать приложения для работы с ней? Таненбаум дает фундаментальные знания просто.

>>629424

>Только там все с крайне наглядными примерами в отличие от K&R


Не осилил примеры из K&R?

>с чего это не имеет?


Потому, что это сторонние API, а не стандарт Си.

> Елси ты уже такой охуенный парень, что освоил C по K&R


Ну охуеть теперь.
#531 #629447
>>629440

>Может лучше сначала изучить как работает сеть


Лучше, всё-же, сходу иметь работающий код, а потом сидеть понимать как он работает, модифицирую его там, переписывая на более низкий уровень, итп. Хотя это всё, например, дискуссионно.
#532 #629450
>>629447

>Хотя это всё, например, дискуссионно.


Это спор о том, сверху или снизу начинать.
#533 #629482
Платиновый вопрос: как программы на сишке взаимодействуют с другими (внешними) программами на ней же, допустим из ГНУшных утилит?
То есть, допустим, я могу вызвать grep из сишки? Могу скормить вывод ls?
#534 #629494
>>629482

>Платиновый вопрос: как программы на сишке взаимодействуют с другими (внешними) программами на ней же


Посредством:
1) Перенаправление вывода другой программы;
2) FIFO;
3) Сигналы.
#535 #629496
>>629494

>То есть, допустим, я могу вызвать grep из сишки? Могу скормить вывод ls?


Перенаправление потоков. То есть stdout одной программы (ls) перенаправляется на stdin grep.
В качестве теста, можешь в цикле, прогнать getchar.
#536 #629499
Запуск: ls | твоя программа.
#537 #629500
>>629496
Он наверно про system()
#538 #629501
>>629500
Не внимательно прочитал.
#540 #629511
>>629506
>>625885

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

259 Кб, 1280x1024
#541 #629516
Интересно, откуда здесь взялся pop ecx? Ведь мы ecx до этого не сохраняли, а сохраняли ebp, который здесь вытаскиваем. Зачем? Эта инструкция повторяется десять раз, хотя мы ничего не кладем на стек кроме адреса возврата, который после выполнения call сам оттуда извлекается.
#542 #629518
>>629516
Блджад, хуево обрезал заголовки, где обмазывался на лурке пастами 600-куна.
#543 #629519
>>629518
Про пизду то смешно?
#544 #629520
>>629519
Нет, пасты про лисперов и хаскелистов смешнее.
#545 #629525
>>629516
Это достали из стека адрес аргумента printf, зря поторопился спрашивать.
#546 #629551
#547 #629687
У кого сурс шапки? Го перекатывать.
ПЕРЕКАТ #548 #629718
Запилил по-быстрому перекат со старой шапкой.

>>629715 (OP)
>>629715 (OP)
Тред утонул или удален.
Это копия, сохраненная 28 января 2016 года.

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

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