• Как задать поведение препроцессора C в GCC?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.

    Таким образом этого сделать нельзя. Потому что в месте где написано #define temp func значение макроса func не подставляется. В temp попадает буквально слово func. После #undef func содержимое макроса func будет потеряно. Это поведение предписано стандартом, мне неизветсны опции компилятора, которыми его можно было бы изменить. См. eelis.net/c++draft/cpp.replace#10 и eelis.net/c++draft/cpp.rescan

    Но если внести ещё один уровень косвенности, то можно сделать чтобы это работало. Например:
    #define foo bar
    #define func foo
    ...
    #undef func
    ...
    #define func foo
    Ответ написан
    3 комментария
  • Шипит pulseaudio, как исправить?

    Уже много лет ничего не шипит. В кедах так точно. Есть настройка, включена по умолчанию обычно, "использовать режим без помех". И вот уже много лет у меня ничего и не шипит, как не шипело при чистом alsa.
    Истинная причина может быть разной, и в арчевики много чего есть уже дельного, а моё мнение - тупо многие звуковушки (или железо, или драйверы такие) при отсутствии обращений от ОС переводят выход в высокоимпедансное состояние (Z-состояние), т.е. с высоким сопротивлением. Ну и получается полный аналог будто провод просто вытащили из разъёма звуковой карты, только вот беда - там на материнке/звуковушке ещё проводники есть, и они ловят кучу помех, которые не имеют значения при низкоимпедансном состоянии (когда сопротивление по выходу довольно мало). Из-за этого, например, при запущенных процессах, которые мониторят состояние или посылают что-то на выход звука, или просто периодически опрашивают звуковой кодек - шипение прекращается.
    Ответ написан
    3 комментария
  • Как отключить авторизацию по private key (ssh)?

    sabramovskikh
    @sabramovskikh
    Так же как включить, только наоборот.
    Ответ написан
    3 комментария
  • Как в WinSCP отображать права в человеческом виде (755, 644 и т. д.)?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Это не менее человеческий вид. Хотите странного - переписывайте софтину, что сказать...
    Ответ написан
    Комментировать
  • Передача массива в функцию?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    printMAS (&MAS);//будет ошибкой! Почему?

    Будет ошибкой только с точки зрения соответствия типов, потому что тип выражения &MAS -- int (*)[5]. Значение же адреса будет одним и тем же.

    Вот такие инструкции же работают...

    Потому что значение адреса передаётся в них через ... и интерпретируется внутри как void *, т.е. тип исходного адреса больше не имеет значения.
    Ответ написан
    4 комментария
  • Регулярное выражение dd.mm.yyyy на С?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Максимально упрощённый пример с использованием библиотеки PCRE
    #include <stdio.h>
    #include <string.h>
    #include <pcre.h>
    
    #define DATE_SIZE 11
    
    int main(int argc, char* argv[]) {
      pcre *pattern;
      const char *error_str;
      int error_offset;
      int matches[1];
    
      pattern = pcre_compile("^\\d{2}\\.\\d{2}\\.\\d{4}$", 0, &error_str, &error_offset, NULL);
    
      if(pattern == NULL) {
        printf("Could not compile: %s\n", error_str);
        return 1;
      }
    
      char str[DATE_SIZE];
      fgets(str, DATE_SIZE, stdin);
    
      int r = pcre_exec(pattern, NULL, str,  strlen(str), 0, 0, matches, 1);
    
      pcre_free(pattern);
    
      if (r < 0)
        puts("Invalid date");
      else
        puts("Valid date");
    
      return EXIT_SUCCESS;
    }
    Ответ написан
    Комментировать
  • Как в bash для strace программы аргументы в строке разделять?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Лучшее известное мне решение -- с помощью массива:

    args=("--param1=value1" "--param2=value with spaces")
    "$cmd" "${args[@]}"


    Каждый элемент массива будет передан одним параметром.
    Ответ написан
    Комментировать
  • Как переименовать кучу файлов по маске?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    rename 's/(.*?)-.*\.png/$1.png/' *.png
    Ответ написан
    1 комментарий
  • Нужна ли олимпиадная подготовка, чтобы стать программистом?

    Jump
    @Jump
    Системный администратор со стажем.
    Нет.
    Чтобы стать грузчиком не обязательно ездить на соревнования по тяжелой атлетике.
    Ответ написан
    1 комментарий
  • Нужна ли олимпиадная подготовка, чтобы стать программистом?

    Moskus
    @Moskus
    Олимпиадная подготовка вредна.
    Потому что олимпиады - это "трюковое" программирование с требованиями, которые порождают говнокод и подгонку под искомый результат, что наиболее далеко от реальных. Неокрепшие молодые умы к этому привыкают и получают вредные привычки.
    Также, соревнования по программированию многих приучают к тому, что а) все задачи должны быть интересны, б) за решение всегда полагается приз. В реальности - наоборот: работа программиста - рутина, работает он за зарплату.
    Однако, есть компании (и очень даже успешные) где любят инфантильных гениев-олимпиадников, и нанимают их. Но успехи этих компаний происходят не от этого, а от эффективного маркетинга. Гении прекрасно щёлкают сложные задачи сами, но вот как участники большой команды, работающей над проектом, они слишком капризны и плохо социализированы.
    Ответ написан
    2 комментария
  • Чем отличается обявление int* a от int *a в Си?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Ни чем не отличается. Пробельные символы допустимо ставить в любом месте, где они не разрывают ключевое слово, идентификатор или константу. Все варианты ниже полностью эквивалентны:
    int*a;
    int* a;
    int *a;
    int * a;

    Но есть некоторая тонкость. Если посмотреть на синтаксис объявления нескольких переменных:
    int * a, * b, c, * d, e; // a, b и d - указатели, c и e - числа

    то будет видно, что "звездочка" является скорее модификатором переменной, чем модификатором типа. Чтобы подчеркнуть этот факт, рекомендуется всегда писать "звездочку" около переменной. Такая привычка позволяет избежать глупых ошибок:
    int *a, *b; // нормально
    int* a, b;  // Ошибка: b кажется указателем, но на самом деле - число.

    А синтаксис у C простой.
    5c77e725c3f4a317612433.jpeg
    Ответ написан
    1 комментарий
  • Как назвать функцию, которая печатает приветствие?

    usdglander
    @usdglander
    Yipee-ki-yay
    sayHello
    Ответ написан
    Комментировать
  • Как посчитать количество обычных файлов в каталоге, у которых БОЛЕЕ 1 жёсткой ссылки (Linux)?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Поиск файлов (-type f) с хардлинками больше й (-links +1)

    find . -links +1 -type f
    Ответ написан
    Комментировать
  • И снова clang: Почему (при оптимизации) реализация на указателях получилась хуже чем с использованием оператора [ ]?

    @potan
    Функциональный программист
    Компилятор не может понять, что переменные с указателем больше ни где не используются (например, что одна из них не указывает на вторую) и поддерживает их актуальное значение, что мешает оптимизации.
    Ответ написан
    Комментировать
  • Почему && не работает в Screen?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему так, не подскажете?

    Потому что && разбивает команду следующим образом:
    ( screen -dmS unpack unzip -o arhiv.zip ) && ( rm arhiv.zip )

    т.е. "запустить screen и удалить файл". Чтобы удалить файл внутри screen надо написать
    screen -dmS unpack bash -c 'unzip -o arhiv.zip && rm arhiv.zip'
    Ответ написан
    1 комментарий
  • Как оптимизировать скорость записи множества больших файлов в linux?

    @rPman
    Используя fallocate создать файл нужного размера, если файловая система не поддерживает sparse files (дырявые файлы, не занимающие место на диске) то эта операция мгновенна а файл будет заполнен мусором (данными, которые лежали в секторах).

    К сожалению (а точнее к счастью, ибо безопасность важнее) все современные файловые системы поддерживают дыры (они будут возвращать нули), т.е. физически файл не будет занимать место, и вам нужно будет либо самим заполнить файл нулями либо использовать опцию fallocate - FALLOC_FL_ZERO_RANGE, это физически записывает данные на диск, так что операция тратит время.

    p.s. файловые системы со сжатием или online deduplication (типа zfs) тем более не позволят вам управлять процессом создания, точнее это нужно будет делать утилитами файловой системы.

    upd. забыл еще напомнить, на файловых системах Copy On Write (типа zfs/btrfs/...) предварительное размещение файла бессмысленно, даже вредно, так как любая запись будет проходить в новое место на диске.
    Ответ написан
    Комментировать