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

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
8 Кб, 270x187
C Programming Language. 2nd thread. #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)
#2 #579761
>>573595
как верно заметил >>573638 , у тебя бесконечный цикл.
При каждой итерации ты присваиваешь k = 0

while (k<=n)
{
k=0;
38 Кб, 607x480
#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, ибо там найду многие ответы, но я совершенно не понимаю для чего так накручивать было, неужели нельзя корочи и понятнее для мимодилов?
#4 #580131
>>580127
char argv и char* argv[] это одно и тоже. Двумерный динамический массив - это массив из указателей на указатели. Сначала ты выделяешь память на массив из указателей на указатели, и это будет твоим числом строк, затем ты идёшь по этим строкам и запихиваешь в них твои динамические массивы, которые и будут этими строками, а их длины будут кол-вом столбцов.
#5 #580132
>>580127

>эти переносы


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

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

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

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

> set_program_name (argv[0]); ЗАЧЕМ?


> Они же в самом начале написали


> #define PROGRAM_NAME = "yes"


В дефайне "официальное" имя приложения. А вот если ты сделаешь симлинк oui для yes, это имя попадет в argv[0], и будет использоваться в usage() глобальная переменная program_name (или это макрос?) вроде оно и где-то там еще, чтобы юзер не охуел, как это, он запускал oui, а ему предлагают yes вызывать.
#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;

Кто-нибудь?
#8 #580456
>>580179 бамп
#9 #580713
>>580131
>>580132
>>580171
Спасибо за пояснение, аноны.

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

Кстати, посоветуйте дебилу какую-нибудь хорошую книжку по документированию программного обеспечения (как правильно оставлять комментарии, как написать простенький man), можно на английском.
#10 #580715
>>580713
Копай в сторону doxygen.
#11 #580720
>>580713
Steve McConnell, Code Complete
#12 #580789
>>579550 (OP)

> Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html


А есть что-нибудь более современное?
#13 #581593
>>580789
sqlite3, но сейчас набегут разные личности, которые не считают это хорошим стилем на самом деле код неплох
#14 #584538
Есть ли в Ц что-нибудь типа dictionary питона?
#15 #584575
>>584538
Нету. Но ты можешь сам запилить всё, что тебе нужно, с помощью массивов, enum'ов и вспомогательных функций/макросов.
#16 #584706
>>584575
Хуево, потому что я как раз таки не могу.
#17 #584947
Как запилить свою библиотеку? Есть какие-нибудь гайды годные? Я конечно парочку наковырял, но мало ли.
#18 #585318
>>584706
Тогда возьми либу.
#19 #585344
>>581593

>sqlite3


ВерБлюДоСтайл ниНуЖеН
#20 #585345
>>584947

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

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

динамическую либу не забуть подгрузить в ходе исполнения программы
статическую просто укажи компилятору когда ее надо использовать
#24 #585369
>>585350
>>585355
Спасибо
#25 #585421
>>585355

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


ой ни пизди, динаму нуно подгружать хитровыебонами в коде, статика впердоливаеца в архив по желанию, можно и не архивить
#26 #585423
пользуясь случаем, абасал динамические библиотеки как ненужное уебанство
нюфаг #27 #585450
Что делают всякие моденые стрелочки в коде? Типа 'value ->default = 0'? Это что же такое делается, сорт оф словари путона?
#28 #585452
>>585450

>модные


скорофикс
#29 #585455
>>585450
value->default это (*value).default
#30 #585459
>>585455
Спасибо
#31 #585528
>>585455
Это ведь равнозначно написаному тобой?
struct value val;
val.default = 0;
#32 #585529
>>585528
Тьфу блядь, отбой. Просто запутался.
#33 #585553
>>585528
Нет. Это равнозначно к обращению поля не структуры, а указателя на структуру. Такой простенький синтаксический сахарок.
15 Кб, 326x241
#34 #585602
В общем у меня вопрос уровня просто интересно.
Пускай есть 2 интовые переменные, которые имеют максимально допустимое значение для интовых переменных, берем их, складываем и через указатель запихиваем в память. Что произойдет?
1) Нихуя, вернет ошибку переполнения еще на моменте складывания
2) Нихуя, вернет ошибку на моменте попытки запихнуть в память
3) Запихнет в память первую половину разрядов 2 представления нового числа
4) Запихнет в память вторую половину разрядов 2 представления нового числа
Честно говоря склоняюсь к первому, но все же
#35 #585652
>>580127
Нужно сюда смотреть:
http://git.suckless.org/sbase/tree/yes.c

А еще в OpenBSD весь код хороший.
GNU-код почти весь жирный.
45 Кб, 396x208
нюфаг #36 #585656
Вот теперь я официально нихуя не понел.
Как это вообще работает? Вайл вообще не разу не сработает, т.к. уже после первой итерации s!=-128, в итоге она прекращает выполнение только из-за того, что чар тупо заканчивается на 127 что ли?
#37 #585699
>>585602
Не знаю как у вас там в Сях, но у нас в крестах:

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

int overflow == Undefined behaviour
КРОВЬ ГОВНО КИШКИ ПО СТЕНАМ
#38 #585722
>>585656
https://ideone.com/cdWzab
Теперь понятно?
#39 #585742
>>585602
Вообще undefined behavior, но обычно ещё на этапе сложения у тебя результат должен поместится в int и поэтому старшие биты, не влезающие в int просто отбросятся.
https://ideone.com/NVLaHx
#40 #585750
>>585722
После 127 вернется к -128?
#41 #585808
Пытались ли создать в Си аналог крестовой STL? Чтобы не городить каждый раз велосипед для распространенных структур данных. Алсо, были ли попытки реализовать обобщенное программирование до C11?
#42 #585810
>>585808
Ну вот тебе аналог крестовых шаблонов.
https://github.com/ampl/gsl/blob/1a819c2daab24f5ff53b145f02cb3dd308dd10d6/cblas/dgemm.c
#43 #585938
Можно ли как то получить знак всего выражения с помощью функции? Или только на fabs делить придется?
#44 #585940
Сравнить с нулем? Проверить старший бит?
#45 #585941
>>585938
Можно.
int sign = {твое_выражение} < 0;
Если {твое выражение} выродится в отрицательное число, то sign будет равен единице.
#46 #585944
>>585941
Спасибо. А если не выродится?
#47 #585948
>>585944
Будет 0.
Можешь проверить:
int sign1 = 10-15 < 0;
int sign2 = 15-10 < 0;
printf("sign1 = %d, sign2 = %d\n", sign1, sign2);
#48 #585954
>>585948
Спасибо, онон
#49 #586182
>>584575
А map тебе чем не dictionary?
#50 #586202
#51 #586221
>>586182
std::map? Тут тред про C.
36 Кб, 675x340
#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;
}
36 Кб, 675x340
#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;
}
#53 #586499
>>586492
>>586492
У тебя конец строки в st не записывается, вот он и выводит всякий мусор
#54 #586503
>>586499
Спасибо анон.
#55 #586574
>>586492

>gets


Не надо так.
#56 #586675
>>586574
Почему?
#57 #586684
>>586675
Небезопасная хуита.
Юзай get_s
#58 #586685
>>586684
gets_s
*фикс
#59 #586726
>>586684
Зато рабочая, кроссплатформенная и не подлежащая удалению из стандарта.
https://www.opennet.ru/opennews/art.shtml?num=43062
#60 #586867
>>584575

> enum


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



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

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

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