Ответы пользователя по тегу Программирование
  • Как указать версию динамической библиотеки?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В linux есть два варианта версионирования:
    - версионирование разделяемых библиотек (см. раз, два), позволяющее одновременно устанавливать и использовать несколько версий одной и той же библиотеки
    - версионирование символов (см. раз, два), позволяющее одной разделяемой библиотеке экспортировать несколько версий одного символа, с разным содержанием/поведением.
    Ответ написан
    Комментировать
  • Что такое Байт Бит и как это работает не много о звуке?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    По части звука недавно отвечал здесь, со ссылками и примерами: Работа со звуком С++ как?
    Ответ написан
    1 комментарий
  • Проверите программу вычисления среднего арифметического на Assembler?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    чисел, которые находятся в памяти данных.

    Где загрузка данных и памяти в регистры?
    Почему все brcc переходят на add_8?
    Почему в следующем фрагменте и из младшего и из старшего байта суммы вычитается counter?
    sub sum_l,counter
        sbc sum_h,counter

    Почему из цикла деления выход только при переносе в минус? Что если разделится нацело?
    Ответ написан
    Комментировать
  • Как пользоваться stdint.h?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    uint_fast64_t number = 184467440737095511615;

    В этом месте нужно написать
    uint_fast64_t number = UINT64_C(184467440737095511615);

    Даже присваиваться не хочет, как такое выводить тоже не понятно.

    В inttypes.h есть макросы для форматирования типов из stdint.h в printf, вам нужен PRIuFAST64:
    printf("%"PRIuFAST64"\n", number);

    Ну и да, для криптографии этих типов скорее всего будет мало. Порекламирую https://gmplib.org/ для разнообразия.
    Ответ написан
    Комментировать
  • Почему это моветон?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Алексей: Евгений Шатунов:
    Люди умеющие гуглить, но не понимающие, о чём речь, дают ответы! Каждый день на тостере!
    Они могут нагуглить статью, в которой говорится примерно о том же, о чём задан вопрос, но, увы, не вполне.
    И ни в статье, ни в ответах так и не появляется правильного ответа.
    А правильный ответ -- во второй, неочевидной части пункта стандарта, описывающего выражения (C89: 3.3:2, C99: 6.5:2):

    Between the previous and next sequence point an object shall have its stored value
    modified at most once by the evaluation of an expression. Furthermore, the prior value
    shall be read only to determine the value to be stored.


    Т.е. если объект модифицируется, то читать его можно с единственной целью -- для вычисления значения, которое будет в него записано. Код a[i] = i++; читает значение изменяемой переменной i с другой целью: доступ к элементу массива по индексу, результат которого не влияет на конечное значение i -- и этого достаточно, чтобы такой код попадал в категорию UB.
    Ответ написан
    7 комментариев
  • В чём разница между операндом и литералом?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Слово "литерал" переводится как "буквальный". Это объект, значение которого -- его буквальное значение. Например: "hello" -- это строковый литерал со значением "hello". Или 42 -- это целочисленный литерал со значением 42. Противоположностью литерала, в некотором смысле, является переменная. Переменная -- это объект, значение которого -- последнее присвоенное ему значение. Например: char a[] = "hello world"; a -- это строковая переменная, со значением "hello world". Или int answer = 40 + 2; answer -- целочисленная переменная со значением 42.

    Операнд -- это аргумент операции. Во многих контекстах литералы и переменные могут быть операндами. Например: a[0]; операция здесь -- [], взятие элемента массива, операнды -- a и 0, один из них -- переменная, другой -- литерал.
    Ответ написан
    Комментировать
  • Не могу создать образ с ядром и загрузчиком...?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    MegaCraZy6 смотри, вот вопрос похожий на твой: Как загрузить код с диска в оперативную память в реальном режиме ассемблера?
    Прочувствуй отличие в том, как он был задан.
    Ответ написан
    Комментировать
  • Как загрузить код с диска в оперативную память в реальном режиме ассемблера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Головки нумеруются с 0. Поправь в первом примере mov dh, 1 на mov dh, 0 и увидишь свои &.&.&.
    Ответ написан
    1 комментарий
  • Какой алгоритм использовать для определения минимального числа перестановок карт в колоде?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мои мысли на тему и получившийся алгоритм:
    - обозначим для простоты карты их порядковыми номерами в отсортированной колоде, Ai;
    - каждой карте сопоставим расстояние до её конечной желаемой позиции, равное i - Ai;
    - перестановка карты с позиции i на позицию j меняет её расстояние на j - i, и одновременно на sign(i - j) меняет расстояния карт между i и j;
    - перестановка выгодна если она уменьшает суммарное расстояние, которое потребуется пройти картам после неё;
    - для текущей позиции существует по меньшей мере одна наиболее выгодная перестановка -- такая, которая максимально уменьшает оставшееся расстояние; найти её можно тупым перебором исходной и конечной позиции переставляемой карты (но, может быть, можно и быстрее);
    - совершая на каждом шаге наиболее выгодную перестановку мы, скорее всего, упорядочим карты за минимальное число перестановок.

    Код на c:
    #include <limits.h>
    #include <stdio.h>
    #include <string.h>
    
    #define N (sizeof(a) / sizeof(a[0]))
    
    inline int sign(int d)
    {
            if (d == 0)
                    return 0;
            return d < 0 ? -1 : 1;
    }
    
    inline int abs(int v)
    {
            return v < 0 ? -v : v;
    }
    
    int main()
    {
            int a[] = {2, 1, 3, 4, 0};
            int q[N];
    
            for (;;) {
                    int best_profit = INT_MIN;
                    int best_src = -1;
                    int best_dst = -1;
                    int i, src, dst, tmp;
    
                    for (i = 0; i < N; ++i)
                            q[i] = i - a[i];
    
                    for (src = 0; src < N; ++src)
                            for (dst = 0; dst < N; ++dst) {
                                    int d = sign(dst - src);
                                    int profit = abs(q[src]) - abs(q[src] + dst - src);
    
                                    //printf("...%d -> %d: profit = %d", src, dst, profit);
    
                                    for (i = src + d; i != dst + d; i += d) {
                                            if (sign(q[i]) == d) {
                                                    ++profit;
                                                    //printf(" + 1");
                                            } else {
                                                    --profit;
                                                    //printf(" - 1");
                                            }
                                    }
                                    //printf(" = %d\n", profit);
                                    if (profit > best_profit) {
                                            best_src = src;
                                            best_dst = dst;
                                            best_profit = profit;
                                            //printf("... -- new best!\n");
                                    }
                            }
                    printf("%d -> %d (profit = %d)\n", best_src, best_dst, best_profit);
                    if (best_profit == 0)
                            break;
                    tmp = a[best_src];
                    if (best_dst < best_src)
                            memmove(a + best_dst + 1, a + best_dst, (best_src - best_dst) * sizeof(int));
                    else
                            memmove(a + best_src, a + best_src + 1, (best_dst - best_src) * sizeof(int));
                    a[best_dst] = tmp;
    
                    for (i = 0; i < N; ++i)
                            printf("%d ", a[i]);
                    printf("\n");
            }
            return 0;
    }
    Ответ написан
    Комментировать
  • Как выбрать направление обхода облака точек?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как выбрать или как определить?
    Если точки даны в порядке обхода границы региона и нужно понять, в каком направлении выполняется обход -- см. ориентированная площадь многоугольника.
    Ответ написан
  • Как избавиться от переполнения?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    где-то читал, что переполнения беззнаковых целых быть не должно.

    Нет никакой магии в беззнаковых целых, максимальное представимое число -- 2^(количество бит)-1, от больших чисел остаётся остаток по модулю 2^(количество бит). Это поведение описано стандартами языка C.
    Ответ написан
    Комментировать
  • В чем суть maillist'ов и по какому принципу они работают?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чем суть?

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

    Удобнее было бы сделать в виде форума или хотя бы на одной странице в древовидном формате, а то переключаться между каждым письмом туда-сюда, как-то не очень

    В веб-интерфейсе mailman тоже есть кнопочки "messages sorted by...date/thread/subject/author".
    И часто одну и туже рассылку архивирует несколько веб-архивов, например, для сообщения по вашей ссылке:
    marc.info/?l=strongswan-users&m=145439518814054&w=4
    blog.gmane.org/gmane.network.vpn.strongswan.user/d...

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

    Как подписаться/задать вопрос в подобный maillist?

    Там снизу ссылочка на страницу с инструкциями: https://lists.strongswan.org/mailman/listinfo/users
    Ответ написан
    3 комментария
  • Pure C. Где исходные коды стандартной библиотеки Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Неужели СТАНДАРТНАЯ БИБЛИОТЕКА (которая почти часть языка) это какой-то секрет?

    Вовсе нет:
    glibc: https://sourceware.org/git/?p=glibc.git;a=tree
    musl: git.musl-libc.org/cgit/musl/tree
    uclibc-ng: repo.or.cz/uclibc-ng.git/tree
    newlib: https://sourceware.org/git/gitweb.cgi?p=newlib-cyg...

    Просто обычному человеку эти исходники почти никогда не нужны.
    Ответ написан
    1 комментарий
  • Можно ли считать константный указатель аналогом ссылки в С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нет, но разница более существенная, чем возможность присвоить nullptr. Константной ссылкой можно удлинить время жизни временного объекта, а указателем -- никаким нельзя.
    Например так можно:
    T f();
    ...
    const T& obj = f();
    obj.foo();

    -- объект вернувшийся из функции f не будет разрушен до выхода obj из области видимости.

    А так -- нельзя:
    T f();
    ...
    const T* const obj = &(f());
    obj->foo();

    -- этот код даже не скомпилируется, поскольку тут берётся адрес временного объекта.
    Ответ написан
    Комментировать
  • Как вводится двоичное число в консоль в TASM Ассемблер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Прочитать строку из стандартного ввода функцией 3fh, поместить в результат 0, а дальше идя по прочитанной строке слева направо сдвигать результат влево на 1 бит, а в младший бит класть 0 или 1, в зависимости от текущего символа в строке.
    Ответ написан
    Комментировать
  • Не работает деление в ассемблере. Что я сделал не так?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    mov edx, [arr16] ; заносим в edx первый элемент массива
    mov eax, [arr16+4] ; заносим в eax второй элемент массива

    Начнём с того, что в edx нужно поместить старшую часть делимого, а в eax -- младшую, а на x86 слова в память записываются младшей частью вперёд (little endian).

    Если результат деления не помещается в eax вы получите исключение #DE, а при делении числа 0x0000000100000000 (а именно его вы делите, загрузив в eax 0 а в edx 1) на 1 результат определённо в 32 бита не влезет.

    Вообще, глядя на ваши вопросы создаётся впечатление, что вы хотите реализовать на ассемблере длинную арифметику. Но длинное деление таким образом, как вы пытаетесь сделать, точно не работает. Вам надо либо побитово делить "в столбик", либо аппроксимировать каким-то рядом (либо ещё как-то, как мне не пришло в голову).
    Ответ написан
    1 комментарий
  • Вопрос о сегментных регистрах и процессе загрузки регистра DS?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    откуда программа может знать где окажутся ее данные чтобы самой указать это значение?

    Она не может знать до загрузки, поэтому все сегментные части адресов записаны как смещения относительно начала программы, т.е. как будто программа будет загружена по адресу 0. EXE-файл содержит таблицу релокаций, это массив смещений относительно начала программы, по которым находятся сегментные части адресов. Загрузчик EXE-файла проходит по этому массиву и прибавляет к словам в памяти фактический сегментный адрес, по которому программа загружена.
    Ответ написан
    2 комментария
  • Ошибка std::bad_alloc - из-за чего?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ну а я повторю свой оригинальный ответ: без полного исходного текста можно сказать только то, что ошибка, скорее всего, где-то в другом месте. И замена объектов ссылками просто замаскировала проблему на время.

    Хотя у меня есть одно предположение: возможно вы неправильно строите дерево и некоторые его узлы являются своими собственными детьми.
    Ответ написан
    Комментировать
  • Ошибка сегментирования - из-за чего?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему вектор из объектов с одним строковым полем создаётся, а с двумя - уже нет? Что здесь не так?

    Без полного исходного текста можно сказать только то, что ошибка, скорее всего, где-то в другом месте.
    Ответ написан
    Комментировать
  • Есть ли в области системного программирования такие задачи, для которых целесообразно только использование ассемблера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В области системного программирования гораздо чаще приходится читать ассемблер, чем писать на нём.
    Ответ написан
    Комментировать