sarcastic low-level freak.

Recommended reading:
59cd56fbd8d30284768237.jpeg

Fuck you, I won't do what you tell me. (C)

Достижения

Все достижения (72)

Наибольший вклад в теги

Все теги (292)

Лучшие ответы пользователя

Все ответы (1351)
  • Как засунуть n - мерный массив в аргумент функции?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Ну вот, опять знатоки советуют добавить звёздочек и указателей на указатели ):

    Все примеры дальше передают в функцию трёхмерный массив и присваивают v значение его элемента p[1][2][3].

    Если функция принимает массив фиксированных размерностей, то прямо так можно и написать:
    int f(int p[][20][30])
    {
        int i = 1, j = 2, k = 3;
        int v = p[i][j][k];
    }
    ...
    int p[10][20][30];
    f(p);

    Первую размерность (самую старшую) можно опустить.

    Если же нет, то перед вами следующий выбор:

    - у вас старый стандарт С (до С99) -- передавайте указатель на самый первый элемент и значения размерностей. Внутри функции пересчитывайте набор индексов многомерного массива в линейный индекс:
    int f(int *p, int n2, int n3) // p[][n2][n3]
    {
        int i = 1, j= 2, k = 3;
        int v = p[(((i * n2) + j) * n3) + k]; // v = p[i][j][k];
    }
    ...
    int p[10][20][30];
    f(&p[0][0][0], 20, 30);


    - у вас С99 или новее: воспользуйтесь поддержкой языка:
    int f(int n2, int n3, int p[][n2][n3])
    {
        int i = 1, j = 2, k = 3;
        int v = p[i][j][k];
    }
    ...
    int p[10][20][30];
    f(20, 30, p);
    Ответ написан
  • Как увидеть входные параметры ассемблер?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Есть исходный код на Си, который вызывает функцию на ассемблере, но передаваемые аргументы как получить,

    Гуглить словосочетание "имя целевой процессорной архитектуры" + ABI.
    Например: x86_64 abi, x86 abi, arm64 abi...
    В найденном документе искать раздел "parameter passing".
    Ответ написан
  • Зачем нужен fakeroot, при сборке deb-пакета?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    fakeroot делает так, что приложение, которое не имеет прав рута, но ожидающее, что оно имеет эти права, не завершается с ошибкой из-за недостатка прав, при выполнении некоторых функций, а продолжает работать. Т.е. он "проглатывает" ошибки вызванные недостатком привилегий.

    Например, обычный пользователь не может сделать chowh root:root для файла, которым он владеет:
    $ chown root:root test ; echo $?
    chown: changing ownership of 'test': Operation not permitted
    1

    fakeroot даёт приложению видимость того, что ошибки не происходит. Владелец файла при этом, конечно, не меняется:
    $ fakeroot chown root:root test ; echo $?
    0
    $ ls -la test
    -rw-rw-r--. 1 jcmvbkbc jcmvbkbc 1709 Jun  1  2011 test

    Всё.

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

    Почему в мануалах пишут так:
    fakeroot dpkg-deb --build ./path
    а вот так тоже работает:
    dpkg-deb --build ./path

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

    Андрей Буров, pfg21 всякие "песочницы", "не пускает во внешний мир", "скрипт может раскидать бинарники по системе, песочница его не выпустит" применительно к fakeroot -- это фантазия. Сборка пакетов может и должна производиться под обычным пользователем. Штатная система привилегий заботится о том, что приложение, запускаемое под непривилегированным пользователем ничего не сломало.
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (2)