← All posts tagged C

lovesan

Кстати, какой у вас coding standard для сишечки?

Я например дико котирую такой вот, и использую везде где можно:
( пример отсюда: http://en.wikipedia.org/wiki/GNU_coding_standards#Code_formatting )

INT main(INT argCount, CHAR *args[])
{
    ERROR_CODE err = ERROR_NO_ERROR;
    INT returnCode = 0;
    GIZMO foo = {0};
    err = GetGizmo(&foo, args[1]);
    if(ERROR_FAILURE(err)) goto displayError;
check:
    if(GIZMO_MOOMIN == foo.type)
        DisplayMessage("It's a moomin.");
    else if(foo.bar < (GIZMO_SNUFKIN_THRESHOLD / 2)
            || (0 == StringCompare(foo.className, "snufkin")
                && foo.bar < GIZMO_SNUFKIN_THRESHOLD))
        DisplayMessage("It's a snufkin.");
    else
    {
        CHAR *barney; // Pointer to the first character after
                      //   the last slash in the file name.
        INT wilma; // Approximate size of the universe.
        INT fred;  // Max value of the `bar' field.
        do
        {
            err = GizmoFrobnicate(
                      &foo,
                      GIZMO_SNUFKIN_THRESHOLD,
                      &barney,
                      &wilma,
                      &fred);
            if(ERROR_FAILURE(err)) goto displayError;
            err = GizmoTwiddle(
                      &foo,
                      barney,
                      wilma + fred);
            if(ERROR_FAILURE(err)) goto displayError;
        } while(foo.bar >= GIZMO_SNUFKIN_THRESHOLD);
        if(ERROR_FAILURE(err)) goto displayError;
        err = GizmoStoreSize(&foo, wilma);
        goto check;
    }
cleanup:
    CleanGizmo(&foo);
    return returnCode;
displayError:
    DisplayError(err);
    returnCode = 1;
    goto cleanup;
}

lovesan

[ Про управление памятью, ответ на #1762666/9 ]

Полюбому — одни неосиляторы вокруг. В майкрософте неосиляторы на какой-то хуй в COM ввели всю эту поебень с управлением памятью, в GObject там что-то, про извращения из буста и Qt я даже не говорю. А самые самые неосилившие неосиляторы придумали такую хрень как сборщики мусора — пиздец ведь, да? Ну надо же какие неосиляторы то блять, вообще нихуя не осилили — дрочат там какие-то оптимизирующие эвристики автоматического управления памятью, выдумывают алгоритмы для автоматизированного менеджмента ресурсов в многопоточной среде, а какие-то malloc/new/free/delete в нужных местах расставлять — не осилили. Вот лохи то тупые, ебта!



Блядь, когда у тебя программа состоит из чего-то крупнее трех статических массивов с интами и двух динамических с флоатами, которые тебе надо перемножить и вывести на stdout чтобы сдать лабораторку в твоем ПТУ — хуюшки ты уследишь за всем ручками. Это я еще не говорю про коллбеки-интерфейсы, про интеграцию с чужим кодом, про интеграцию с разными языками программирования, с разными рантаймами и прочее. И не надо пиздеть что это все от неосиляторства. "Неосиляторство" это отмазка малолетних долбоебов, даже на тех самых C++ то толком не писавших.

lovesan

Написал тут недавно — библиотека-звонилка для винды. Обертка над RAS API, пока что может просто поднимать соединение по имени, закрывать, и сообщать о том, существует ли оно уже. Для VPN, диалапа, и пр.

Может кому надо:
github.com

lovesan

С пятой попытки собрал, наконец, gcc-4.6.2

Не знаю, что точно там не работало, но пришлось убрать компиляторы Ады и Go, сделать все рантайм-либы кроме libstdc++ статическими и откатиться на cloog-ppl-0.15.11(вместо 0.16.3 и isl).

Вроде конпилирует.
Сейчас пересобираю им GMP.

lovesan

И это еще че.
Я блядь такую мелочь как MPC-0.9 уже полгода собрать не могу.
Ну просто нихуя никак, блядь.
Какой-то пиздец внутри толи libtool, толи внутри какого еще автоконфного говна, толи внутри ld. Символы нихуя не находит, хотя они есть, да.
И причем это вот не только я. На оффсайте mingw в релизах до сих пор висит mpc-0.8.2
Пидарасы блядь криворукие.
Уебать!
Просто блядь уебать.

lovesan

Кэши NTFS и диска это просто невыносимая победа.

Я тут попробовал, от нехер делать, mmap'ить, а потом декодировать в строки(вообще, с помощью модуля для работы с текстом из программы для моего стартапа, но думаю, что например cffi+babel дадут те же результаты) все более-менее текстовые файлы из сорцов SBCL(считая что они все в utf-8), каких около 20 мегабайт, рекурсивно обходя директорию с сорцами.

Так первый раз это заняло 32 секунды(из них времени на перекодирование — 1 секунда, примерно), а второй и последующие — в районе 2 секунд(даже после перезапуска процесса). Я предполагал улучшение показателей, конечно, но все-равно охуел.

Чуваки, если у вас в программе что-то якобы тормозит, то 95% что это I/O. Дисковое I/O — в первую очередь; хотя и другие виды I/O, типа загрузки ресурсов на видеокарту, сокетов, и прочего — тоже нихуевый источник тормозов.

Поэтому я всегда уже давно считаю, что ни Си, ни C++, нигде в прикладном программировании не нужны. C++, впрочем, даже в системном то нахуй не сдался, но это уже другой вопрос. Брать сишечку или кресты "для производительности" это просто задротство, и неумение эту самую производительность замерять.

lovesan

Вот за что ненавижу сишечку, среди прочего, так это за подобное говно:

int (*(*foo)(void ))[3]

Хуй разберешь, блядь, что это за хуйня. А если уж в отрыве от контекста, то вообще вещайся.

Но еще больше я ненавижу воннаби-хэцкеров и воннаби-системщиков, которые любят писать подобный код(наряду с говном типа *a++ = *b++).

Я когда-то давно тоже думал, что это ебать охуеть как круто, так писать на сишечке, типа, сразу видно что ты тру хэцкер. Но потом, блять, начал понимать соглашения именования MS, и все эти ихние тайпдефы, от CHAR до каких-нибудь LPOVERLAPPED_COMPLETION_ROUTINE.

btw: http://cdecl.org/

А еще я, кстати, поэтому же терпеть не могу уебанские именования фукций в POSIX и вообще в юниксах, и мне приятны именования винды, хоть они и длинные. Всякие там `mmap', `fcntl' и прочие `creat', `brk' и `getpgrp'(классный рандомный набор букв! в сисколлах линукса есть имена и круче!) мало того, что уебанско "по-хэккерски" выглядят, так их еще и хуй вспомнишь как они называются, когда они нужны, а уж вычислить по названию функции о ее назначении - про это я вообще не говорю даже;

В противоположность, на винде - CreateFileMapping, MapViewOfFile, CreateFile и DeviceIoControl и пр. - все понятно сразу, и запоминается легко.

Кстати, стиль именования функций в винапи на самом деле похож на лисповый, за исключением того, что `CamelCase', а не `lisp-case'.

lovesan

А есть какой-нибудь язык, который собой представляет что-то среднее между Си и хаскелем/ML? Т.е. низкоуровневый, автоматическое управление только памятью на стеке, указатели(но типизированные). И в то же время статика направо и налево, адско злая типизация, ADT, паттерн-матчинг и пр.

lovesan

была бы моя воля — я бы в сях оставил четыре целочисленных типа:
byte — минимально адресуемая единица для конкретного процессора
signed byte — он же, знаковый
word — машинное слово, тип с шириной в sizeof(void*)
signed word — знаковый word

а всех любителей попользовать типы с "размытыми" размерами, типа int и long, пересажал бы на колы