Этого треда уже нет.
Это копия, сохраненная 19 декабря 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это копия, сохраненная 19 декабря 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
8 Кб, 270x187
Второй тред, посвященный прародителю всех С-подобных языков и по совместительству единственным идеальным и всесторонне годным средством программирования как на системном, так и на прикладном уровне.
С чего начинать:
Классика от Отцов: 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)
С чего начинать:
Классика от Отцов: 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)
38 Кб, 607x480
>>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, ибо там найду многие ответы, но я совершенно не понимаю для чего так накручивать было, неужели нельзя корочи и понятнее для мимодилов?
Доброго времени суток, помогач, надеюсь ты достаточно ночной.
Суть такова - потихоньку учусь основам 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, ибо там найду многие ответы, но я совершенно не понимаю для чего так накручивать было, неужели нельзя корочи и понятнее для мимодилов?
>>580127
char argv и char* argv[] это одно и тоже. Двумерный динамический массив - это массив из указателей на указатели. Сначала ты выделяешь память на массив из указателей на указатели, и это будет твоим числом строк, затем ты идёшь по этим строкам и запихиваешь в них твои динамические массивы, которые и будут этими строками, а их длины будут кол-вом столбцов.
char argv и char* argv[] это одно и тоже. Двумерный динамический массив - это массив из указателей на указатели. Сначала ты выделяешь память на массив из указателей на указатели, и это будет твоим числом строк, затем ты идёшь по этим строкам и запихиваешь в них твои динамические массивы, которые и будут этими строками, а их длины будут кол-вом столбцов.
>>580127
Ядро-то Маяковский писал, не иначе.
59: при передаче в функцию массив преобразуется к указателю на тип элементов массива в крестах это называется std::decay, поэтому разницы между такими записями в данном случае нет.
66: это разные вещи. Если я не ошибаюсь, это какая-то системная функция, которая вызывается для порядка, чтобы обеспечить корректное окружение для программы.
Вообще, большая часть этого кода потому и присутствует как ритуалы, направленные на выполнение многочисленных соглашений, которым должны следовать утилиты.
>эти переносы
Ядро-то Маяковский писал, не иначе.
59: при передаче в функцию массив преобразуется к указателю на тип элементов массива в крестах это называется std::decay, поэтому разницы между такими записями в данном случае нет.
66: это разные вещи. Если я не ошибаюсь, это какая-то системная функция, которая вызывается для порядка, чтобы обеспечить корректное окружение для программы.
Вообще, большая часть этого кода потому и присутствует как ритуалы, направленные на выполнение многочисленных соглашений, которым должны следовать утилиты.
>>580127
В дефайне "официальное" имя приложения. А вот если ты сделаешь симлинк oui для yes, это имя попадет в argv[0], и будет использоваться в usage() глобальная переменная program_name (или это макрос?) вроде оно и где-то там еще, чтобы юзер не охуел, как это, он запускал oui, а ему предлагают yes вызывать.
> set_program_name (argv[0]); ЗАЧЕМ?
> Они же в самом начале написали
> #define PROGRAM_NAME = "yes"
В дефайне "официальное" имя приложения. А вот если ты сделаешь симлинк oui для yes, это имя попадет в argv[0], и будет использоваться в usage() глобальная переменная program_name (или это макрос?) вроде оно и где-то там еще, чтобы юзер не охуел, как это, он запускал oui, а ему предлагают yes вызывать.
Сап. Можно ли как-нибудь из 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;
Кто-нибудь?
#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;
Кто-нибудь?
>>580179 бамп
>>580131
>>580132
>>580171
Спасибо за пояснение, аноны.
Буду искать для анализа какой-нибудь проект не так замороченный на конвенции.
Кстати, посоветуйте дебилу какую-нибудь хорошую книжку по документированию программного обеспечения (как правильно оставлять комментарии, как написать простенький man), можно на английском.
>>580132
>>580171
Спасибо за пояснение, аноны.
Буду искать для анализа какой-нибудь проект не так замороченный на конвенции.
Кстати, посоветуйте дебилу какую-нибудь хорошую книжку по документированию программного обеспечения (как правильно оставлять комментарии, как написать простенький man), можно на английском.
>>580713
Копай в сторону doxygen.
Копай в сторону doxygen.
>>580713
Steve McConnell, Code Complete
Steve McConnell, Code Complete
>>579550 (OP)
А есть что-нибудь более современное?
> Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
А есть что-нибудь более современное?
>>580789
sqlite3, но сейчас набегут разные личности, которые не считают это хорошим стилем на самом деле код неплох
sqlite3, но сейчас набегут разные личности, которые не считают это хорошим стилем на самом деле код неплох
>>584538
Нету. Но ты можешь сам запилить всё, что тебе нужно, с помощью массивов, enum'ов и вспомогательных функций/макросов.
Нету. Но ты можешь сам запилить всё, что тебе нужно, с помощью массивов, enum'ов и вспомогательных функций/макросов.
Как запилить свою библиотеку? Есть какие-нибудь гайды годные? Я конечно парочку наковырял, но мало ли.
>>584706
Тогда возьми либу.
Тогда возьми либу.
>>584947
пишешь исходный код функций, компилишь его в обжект файл, пакуешь в формат либы, кладешь в директорию поиска
какого хуя тебе еще требуется ?
гайд как написать полезную и нужную либу что ли ?
пишешь исходный код функций, компилишь его в обжект файл, пакуешь в формат либы, кладешь в директорию поиска
какого хуя тебе еще требуется ?
гайд как написать полезную и нужную либу что ли ?
>>585345
Нет, просто как в формат либы запаковать не знаю. Содержимое либы я в целом напридумывал (она мне для личного пользования все-равно нужна, да и в целях обучения). Разве что один вопрос: внутри либы нужно подключать другие нужные для неё либы?
Нет, просто как в формат либы запаковать не знаю. Содержимое либы я в целом напридумывал (она мне для личного пользования все-равно нужна, да и в целях обучения). Разве что один вопрос: внутри либы нужно подключать другие нужные для неё либы?
>>585349
укурись опциями компилятора и линковщика, в коде твоей ебучий либы ссылки на другие либы ненужны
укурись опциями компилятора и линковщика, в коде твоей ебучий либы ссылки на другие либы ненужны
>>585349
формат динамической либы указывается в опциях компилятора
если либа статическая - она пакуется вв линуксе утилитой ar в виндоусе утилитой lib
динамическую либу не забуть подгрузить в ходе исполнения программы
статическую просто укажи компилятору когда ее надо использовать
формат динамической либы указывается в опциях компилятора
если либа статическая - она пакуется вв линуксе утилитой ar в виндоусе утилитой lib
динамическую либу не забуть подгрузить в ходе исполнения программы
статическую просто укажи компилятору когда ее надо использовать
>>585355
ой ни пизди, динаму нуно подгружать хитровыебонами в коде, статика впердоливаеца в архив по желанию, можно и не архивить
>формат динамической либы указывается в опциях компилятора
ой ни пизди, динаму нуно подгружать хитровыебонами в коде, статика впердоливаеца в архив по желанию, можно и не архивить
Что делают всякие моденые стрелочки в коде? Типа 'value ->default = 0'? Это что же такое делается, сорт оф словари путона?
>>585455
Спасибо
Спасибо
>>585528
Тьфу блядь, отбой. Просто запутался.
Тьфу блядь, отбой. Просто запутался.
>>585528
Нет. Это равнозначно к обращению поля не структуры, а указателя на структуру. Такой простенький синтаксический сахарок.
Нет. Это равнозначно к обращению поля не структуры, а указателя на структуру. Такой простенький синтаксический сахарок.
15 Кб, 326x241
В общем у меня вопрос уровня просто интересно.
Пускай есть 2 интовые переменные, которые имеют максимально допустимое значение для интовых переменных, берем их, складываем и через указатель запихиваем в память. Что произойдет?
1) Нихуя, вернет ошибку переполнения еще на моменте складывания
2) Нихуя, вернет ошибку на моменте попытки запихнуть в память
3) Запихнет в память первую половину разрядов 2 представления нового числа
4) Запихнет в память вторую половину разрядов 2 представления нового числа
Честно говоря склоняюсь к первому, но все же
Пускай есть 2 интовые переменные, которые имеют максимально допустимое значение для интовых переменных, берем их, складываем и через указатель запихиваем в память. Что произойдет?
1) Нихуя, вернет ошибку переполнения еще на моменте складывания
2) Нихуя, вернет ошибку на моменте попытки запихнуть в память
3) Запихнет в память первую половину разрядов 2 представления нового числа
4) Запихнет в память вторую половину разрядов 2 представления нового числа
Честно говоря склоняюсь к первому, но все же
>>580127
Нужно сюда смотреть:
http://git.suckless.org/sbase/tree/yes.c
А еще в OpenBSD весь код хороший.
GNU-код почти весь жирный.
Нужно сюда смотреть:
http://git.suckless.org/sbase/tree/yes.c
А еще в OpenBSD весь код хороший.
GNU-код почти весь жирный.
45 Кб, 396x208
Вот теперь я официально нихуя не понел.
Как это вообще работает? Вайл вообще не разу не сработает, т.к. уже после первой итерации s!=-128, в итоге она прекращает выполнение только из-за того, что чар тупо заканчивается на 127 что ли?
Как это вообще работает? Вайл вообще не разу не сработает, т.к. уже после первой итерации s!=-128, в итоге она прекращает выполнение только из-за того, что чар тупо заканчивается на 127 что ли?
>>585602
Не знаю как у вас там в Сях, но у нас в крестах:
unsigned int overflow == WELL defined:
результат == остаток по разрядности типа
например, uint_max + 7U == 6U
int overflow == Undefined behaviour
КРОВЬ ГОВНО КИШКИ ПО СТЕНАМ
Не знаю как у вас там в Сях, но у нас в крестах:
unsigned int overflow == WELL defined:
результат == остаток по разрядности типа
например, uint_max + 7U == 6U
int overflow == Undefined behaviour
КРОВЬ ГОВНО КИШКИ ПО СТЕНАМ
>>585602
Вообще undefined behavior, но обычно ещё на этапе сложения у тебя результат должен поместится в int и поэтому старшие биты, не влезающие в int просто отбросятся.
https://ideone.com/NVLaHx
Вообще undefined behavior, но обычно ещё на этапе сложения у тебя результат должен поместится в int и поэтому старшие биты, не влезающие в int просто отбросятся.
https://ideone.com/NVLaHx
Пытались ли создать в Си аналог крестовой STL? Чтобы не городить каждый раз велосипед для распространенных структур данных. Алсо, были ли попытки реализовать обобщенное программирование до C11?
>>585808
Ну вот тебе аналог крестовых шаблонов.
https://github.com/ampl/gsl/blob/1a819c2daab24f5ff53b145f02cb3dd308dd10d6/cblas/dgemm.c
Ну вот тебе аналог крестовых шаблонов.
https://github.com/ampl/gsl/blob/1a819c2daab24f5ff53b145f02cb3dd308dd10d6/cblas/dgemm.c
Можно ли как то получить знак всего выражения с помощью функции? Или только на fabs делить придется?
Сравнить с нулем? Проверить старший бит?
>>585938
Можно.
int sign = {твое_выражение} < 0;
Если {твое выражение} выродится в отрицательное число, то sign будет равен единице.
Можно.
int sign = {твое_выражение} < 0;
Если {твое выражение} выродится в отрицательное число, то sign будет равен единице.
>>585944
Будет 0.
Можешь проверить:
int sign1 = 10-15 < 0;
int sign2 = 15-10 < 0;
printf("sign1 = %d, sign2 = %d\n", sign1, sign2);
Будет 0.
Можешь проверить:
int sign1 = 10-15 < 0;
int sign2 = 15-10 < 0;
printf("sign1 = %d, sign2 = %d\n", sign1, sign2);
>>585948
Спасибо, онон
Спасибо, онон
>>585750
Да.
Да.
>>586182
std::map? Тут тред про C.
std::map? Тут тред про C.
36 Кб, 675x340
Двач у меня есть один нубский вопрос. Что за мусор выводится вместе с результатом в этой проге?
#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;
}
#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
Двач у меня есть один нубский вопрос. Что за мусор выводится вместе с результатом в этой проге?
#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;
}
#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
Спасибо анон.
Спасибо анон.
>>586684
Зато рабочая, кроссплатформенная и не подлежащая удалению из стандарта.
https://www.opennet.ru/opennews/art.shtml?num=43062
Зато рабочая, кроссплатформенная и не подлежащая удалению из стандарта.
https://www.opennet.ru/opennews/art.shtml?num=43062