М.Двач / Программирование

Этого треда уже нет.
Это копия, сохраненная 9 июня в 14:00.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

8 Кб, 270x187

C Programming Language. 2nd thread. 13 Ноя, 03:02 #579550 В конец треда | Веб

Второй тред, посвященный прародителю всех С-подобных языков и по совместительству единственным идеальным и всесторонне годным средством программирования как на системном, так и на прикладном уровне.

С чего начинать:
Классика от Отцов: 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

Предыдущий тред тонет по следующему адресу: >>518562 (OP)

13 Ноя, 15:06 #2 #579761

>>573595
как верно заметил >>573638 , у тебя бесконечный цикл.
При каждой итерации ты присваиваешь k = 0

while (k<=n)
{
k=0;

38 Кб, 607x480

14 Ноя, 02:58 #3 #580127

>>579550 (OP)
Доброго времени суток, помогач, надеюсь ты достаточно ночной.

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

Склонировал репозиторий с Savannah, открыл и офигел от непонимания. Спрашиваю советов мудрых.

Вот смотри на исходник: http://pastebin.com/riccXnsa

59 main (int argc, char argv)
Во всех учебниках я видел *argv[] вместо argv. Второй вариант это синтаксический сахар? Или это указатель-на-указатель, но почему?

66 set_program_name (argv[0]);
ЗАЧЕМ?
Они же в самом начале написали
#define PROGRAM_NAME = "yes"

Дальше вообще пошла какая-то свистопляска с буферами (!?) и т.д. Я, конечно, попиздовал учить основы UNIX, ибо там найду многие ответы, но я совершенно не понимаю для чего так накручивать было, неужели нельзя корочи и понятнее для мимодилов?

Ответы: >>580131, >>580132, >>580171, >>585652

14 Ноя, 03:20 #4 #580131

>>580127
char argv и char* argv[] это одно и тоже. Двумерный динамический массив - это массив из указателей на указатели. Сначала ты выделяешь память на массив из указателей на указатели, и это будет твоим числом строк, затем ты идёшь по этим строкам и запихиваешь в них твои динамические массивы, которые и будут этими строками, а их длины будут кол-вом столбцов.

Ответы: >>580713

14 Ноя, 03:21 #5 #580132

>>580127
>эти переносы
Ядро-то Маяковский писал, не иначе.

59: при передаче в функцию массив преобразуется к указателю на тип элементов массива в крестах это называется std::decay, поэтому разницы между такими записями в данном случае нет.

66: это разные вещи. Если я не ошибаюсь, это какая-то системная функция, которая вызывается для порядка, чтобы обеспечить корректное окружение для программы.

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

Ответы: >>580713

14 Ноя, 09:33 #6 #580171

>>580127
> set_program_name (argv[0]); ЗАЧЕМ?
> Они же в самом начале написали
> #define PROGRAM_NAME = "yes"
В дефайне "официальное" имя приложения. А вот если ты сделаешь симлинк oui для yes, это имя попадет в argv[0], и будет использоваться в usage() глобальная переменная program_name (или это макрос?) вроде оно и где-то там еще, чтобы юзер не охуел, как это, он запускал oui, а ему предлагают yes вызывать.

Ответы: >>580713

14 Ноя, 09:59 #7 #580179

Сап. Можно ли как-нибудь из x-macro вытащить первый элемент? В моём проекте используется такая его разновидность:

#define FOO(V) \
V(Sandstorm) \
V(Stencil) \
V(Mower) \
V(Restroom)

Эти имена попадают в enum, в объявления функций, в строковые константы и т.д.

Мне нужно вытащить первый элемент и длину. Длину просто:

#define PLUS_ONE(foo) +1
int length = FOO(PLUS_ONE);
#undef PLUS_ONE

С первым элементом не знаю как. Надо сгенерить что-то вроде

int first = kSandstorm;

Кто-нибудь?

Ответы: >>580456

14 Ноя, 19:18 #8 #580456

>>580179 бамп

15 Ноя, 01:30 #9 #580713

>>580131
>>580132
>>580171
Спасибо за пояснение, аноны.

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

Кстати, посоветуйте дебилу какую-нибудь хорошую книжку по документированию программного обеспечения (как правильно оставлять комментарии, как написать простенький man), можно на английском.

Ответы: >>580715, >>580720

15 Ноя, 01:34 #10 #580715

>>580713
Копай в сторону doxygen.

15 Ноя, 02:01 #11 #580720

>>580713
Steve McConnell, Code Complete

15 Ноя, 10:01 #12 #580789

>>579550 (OP)
> Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
А есть что-нибудь более современное?

Ответы: >>581593

16 Ноя, 22:35 #13 #581593

>>580789
sqlite3, но сейчас набегут разные личности, которые не считают это хорошим стилем на самом деле код неплох

Ответы: >>585344

20 Ноя, 07:33 #14 #584538

Есть ли в Ц что-нибудь типа dictionary питона?

Ответы: >>584575

20 Ноя, 10:43 #15 #584575

>>584538
Нету. Но ты можешь сам запилить всё, что тебе нужно, с помощью массивов, enum'ов и вспомогательных функций/макросов.

Ответы: >>584706, >>586182, >>586867

20 Ноя, 15:16 #16 #584706

>>584575
Хуево, потому что я как раз таки не могу.

Ответы: >>585318

20 Ноя, 18:18 #17 #584947

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

Ответы: >>585345

21 Ноя, 03:29 #18 #585318

>>584706
Тогда возьми либу.

21 Ноя, 07:02 #19 #585344

>>581593
>sqlite3
ВерБлюДоСтайл ниНуЖеН

21 Ноя, 07:27 #20 #585345

>>584947

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

Ответы: >>585349

21 Ноя, 09:06 #21 #585349

>>585345
Нет, просто как в формат либы запаковать не знаю. Содержимое либы я в целом напридумывал (она мне для личного пользования все-равно нужна, да и в целях обучения). Разве что один вопрос: внутри либы нужно подключать другие нужные для неё либы?

Ответы: >>585350, >>585355

21 Ноя, 09:10 #22 #585350

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

Ответы: >>585369

21 Ноя, 09:33 #23 #585355

>>585349

формат динамической либы указывается в опциях компилятора
если либа статическая - она пакуется вв линуксе утилитой ar в виндоусе утилитой lib

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

Ответы: >>585369, >>585421

21 Ноя, 10:29 #24 #585369

>>585350
>>585355
Спасибо

21 Ноя, 13:37 #25 #585421

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

21 Ноя, 13:45 #26 #585423

пользуясь случаем, абасал динамические библиотеки как ненужное уебанство

Ответы: >>587235

нюфаг 21 Ноя, 14:51 #27 #585450

Что делают всякие моденые стрелочки в коде? Типа 'value ->default = 0'? Это что же такое делается, сорт оф словари путона?

Ответы: >>585452, >>585455

21 Ноя, 14:51 #28 #585452

>>585450
>модные
скорофикс

21 Ноя, 14:54 #29 #585455

>>585450
value->default это (*value).default

Ответы: >>585459, >>585528

21 Ноя, 14:56 #30 #585459

>>585455
Спасибо

21 Ноя, 16:17 #31 #585528

>>585455
Это ведь равнозначно написаному тобой?
struct value val;
val.default = 0;

Ответы: >>585529, >>585553

21 Ноя, 16:18 #32 #585529

>>585528
Тьфу блядь, отбой. Просто запутался.

21 Ноя, 16:48 #33 #585553

>>585528
Нет. Это равнозначно к обращению поля не структуры, а указателя на структуру. Такой простенький синтаксический сахарок.

15 Кб, 326x241

21 Ноя, 17:36 #34 #585602

В общем у меня вопрос уровня просто интересно.
Пускай есть 2 интовые переменные, которые имеют максимально допустимое значение для интовых переменных, берем их, складываем и через указатель запихиваем в память. Что произойдет?
1) Нихуя, вернет ошибку переполнения еще на моменте складывания
2) Нихуя, вернет ошибку на моменте попытки запихнуть в память
3) Запихнет в память первую половину разрядов 2 представления нового числа
4) Запихнет в память вторую половину разрядов 2 представления нового числа
Честно говоря склоняюсь к первому, но все же

Ответы: >>585699, >>585742

21 Ноя, 18:16 #35 #585652

>>580127
Нужно сюда смотреть:
http://git.suckless.org/sbase/tree/yes.c

А еще в OpenBSD весь код хороший.
GNU-код почти весь жирный.

Ответы: >>603324

45 Кб, 396x208

нюфаг 21 Ноя, 18:20 #36 #585656

Вот теперь я официально нихуя не понел.
Как это вообще работает? Вайл вообще не разу не сработает, т.к. уже после первой итерации s!=-128, в итоге она прекращает выполнение только из-за того, что чар тупо заканчивается на 127 что ли?

Ответы: >>585722

21 Ноя, 19:16 #37 #585699

>>585602
Не знаю как у вас там в Сях, но у нас в крестах:

unsigned int overflow == WELL defined:
результат == остаток по разрядности типа
например, uint_max + 7U == 6U

int overflow == Undefined behaviour
КРОВЬ ГОВНО КИШКИ ПО СТЕНАМ

21 Ноя, 19:31 #38 #585722

>>585656
https://ideone.com/cdWzab
Теперь понятно?

Ответы: >>585750

21 Ноя, 19:51 #39 #585742

>>585602
Вообще undefined behavior, но обычно ещё на этапе сложения у тебя результат должен поместится в int и поэтому старшие биты, не влезающие в int просто отбросятся.
https://ideone.com/NVLaHx

21 Ноя, 20:05 #40 #585750

>>585722
После 127 вернется к -128?

Ответы: >>586202

21 Ноя, 21:16 #41 #585808

Пытались ли создать в Си аналог крестовой STL? Чтобы не городить каждый раз велосипед для распространенных структур данных. Алсо, были ли попытки реализовать обобщенное программирование до C11?

Ответы: >>585810, >>587245, >>587723

21 Ноя, 21:19 #42 #585810

>>585808
Ну вот тебе аналог крестовых шаблонов.
https://github.com/ampl/gsl/blob/1a819c2daab24f5ff53b145f02cb3dd308dd10d6/cblas/dgemm.c

Ответы: >>587293

21 Ноя, 23:39 #43 #585938

Можно ли как то получить знак всего выражения с помощью функции? Или только на fabs делить придется?

Ответы: >>585941

21 Ноя, 23:41 #44 #585940

Сравнить с нулем? Проверить старший бит?

21 Ноя, 23:43 #45 #585941

>>585938
Можно.
int sign = {твое_выражение} < 0;
Если {твое выражение} выродится в отрицательное число, то sign будет равен единице.

Ответы: >>585944

21 Ноя, 23:49 #46 #585944

>>585941
Спасибо. А если не выродится?

Ответы: >>585948

21 Ноя, 23:52 #47 #585948

>>585944
Будет 0.
Можешь проверить:
int sign1 = 10-15 < 0;
int sign2 = 15-10 < 0;
printf("sign1 = %d, sign2 = %d\n", sign1, sign2);

Ответы: >>585954

22 Ноя, 00:02 #48 #585954

>>585948
Спасибо, онон

22 Ноя, 13:55 #49 #586182

>>584575
А map тебе чем не dictionary?

Ответы: >>586221

22 Ноя, 14:20 #50 #586202

>>585750
Да.

22 Ноя, 14:53 #51 #586221

>>586182
std::map? Тут тред про C.

36 Кб, 675x340

22 Ноя, 19:33 #52 #586492

Двач у меня есть один нубский вопрос. Что за мусор выводится вместе с результатом в этой проге?

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAS 150
#define STR 30

int main(void)
{
\tchar txt[MAS], st[STR];
\tint num_st = 0, num_ch = 0, num_zero = 0;
\tprintf("Text for processing:\n");
\tgets(txt);
\twhile (txt[num_st]!= '\0') {
\t\tfor (; txt[num_st] != ','; num_st++) {
\t\t\tif (txt[num_st] == '.') break;
\t\t\tst[num_ch] = txt[num_st];
\t\t\tnum_ch++;
\t\t}
\t\tif ((st[num_ch - 1] == 'W') || (st[num_ch - 1] == 'w')) puts(st);
\t\telse {
\t\t\tfor (num_zero = 0; num_zero != STR; num_zero++) {
\t\t\t\tst[num_zero] = ' ';
\t\t\t}
\t\t}
\t\tnum_ch = 0;
\t\tnum_st++;
\t}
\treturn 0;
}

Ответы: >>586499, >>586574, >>586926

22 Ноя, 19:40 #53 #586499

>>586492
>>586492
У тебя конец строки в st не записывается, вот он и выводит всякий мусор

Ответы: >>586503

22 Ноя, 19:45 #54 #586503

>>586499
Спасибо анон.

22 Ноя, 21:10 #55 #586574

>>586492
>gets
Не надо так.

Ответы: >>586675

22 Ноя, 23:00 #56 #586675

>>586574
Почему?

Ответы: >>586684

22 Ноя, 23:18 #57 #586684

>>586675
Небезопасная хуита.
Юзай get_s

Ответы: >>586685, >>586726

22 Ноя, 23:19 #58 #586685

>>586684
gets_s
*фикс

Ответы: >>586926

23 Ноя, 00:12 #59 #586726

>>586684
Зато рабочая, кроссплатформенная и не подлежащая удалению из стандарта.
https://www.opennet.ru/opennews/art.shtml?num=43062

23 Ноя, 09:30 #60 #586867

>>584575
> enum
> функции-макросы

Да ты знаток няшной и алгоритмов, я посмотрю

23 Ноя, 11:33 #61 #586926

>>586685
Майкрософтовские говнофункции не нужны, они создают больше проблем, чем решают. Алсо, они стали необязательными в C11, т.е., их использование - это еще и геморрой с переносимостью ко всему прочему. А >>586492
лучше использовать fgets(..., stdin), в которую можно передать лимит.

Ответы: >>587226

23 Ноя, 12:18
Тред утонул или удален.
Это копия, сохраненная 9 июня в 14:00.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

« /pr/В начало тредаВеб-версияНастройки/a//b//mu//s//vg/Все доски

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion