Задать вопрос
  • Обратимы ли функции S0, S1, E0, E1 из алгоритма SHA-256?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Обратимы ли функции S0, S1, E0, E1 из алгоритма SHA-256?


    Σ0 ( A ) = ( A ⋙ 2 ) ⊕ ( A ⋙ 13 ) ⊕ ( A ⋙ 22 ) -- обратима.
    Σ1 ( E ) = ( E ⋙ 6 ) ⊕ ( E ⋙ 11 ) ⊕ ( E ⋙ 25 ) -- тоже обратима.
    Что такое E0 и E1 я не нашёл.

    Таблицу всех значений S0 и S1 можно построить за несколько минут, если есть свободных 16Г памяти. Все они различны, т.е. обратное преобразование однозначно.
    Можно ли найти простую обратную функцию -- непонятно.
    Ответ написан
  • Как правильно вызвать функцию другого класса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В другом классе я создаю указатель для этой функции.
    void(InventoryContainer::*fnDelete)(unsigned int);
    Но при попытке вызвать эту функцию,
    this->fnDelete(this->IFrom);
    студия показывает мне что this в данном случае не корректен.

    1. Как правильно вызвать функцию?

    Правильно показывает. fnDelete должен быть вызван для объекта класса InventoryContainer, и синтаксис разыменования указателя на функцию-член малость другой:

    InventoryContainer *that;
    ...
    (that->*fnDelete)(IFrom);


    2. Где то на StackOverflow видел,что для вызова такой функции нужен ещё объект.Не лучше ли тогда просто передать ссылку на объект и через него и вызвать функцию?

    Смысл указателя на функцию-член в том, что он даёт возможность вызывать любую функцию с такой сигнатурой в данном объекте. Т.е. для динамического выбора:
    class A {
    public:
      void f1();
      void f2();
    };
    
    void (A::*f)();
    if (???)
      f = &A::f1;
    else
      f = &A::f2;
    
    ...
    A *pa;
    ...
    (pa->*f)(); // вызывает f1 или f2
    Ответ написан
    Комментировать
  • Почему это моветон?

    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
    что такое звук

    Начало здесь.

    картинка это набор пикселей расположенных по координатам и состоящих из RGB (255,255,255 это белый )

    1 секунда двухканального звука оцифрованного на 48000 Гц с 16-битной точностью это, например, 48000 пар знаковых 16-битных целых чисел. Если все эти числа равны, то это одна секунда тишины. А если первое число в i-й паре равно 32767 * sin(440 * 2 * Pi * i / 48000), а второе -- 0, то это одна секунда ноты ля первой октавы в левом канале.

    Превратить звуковую дорожку в график , научиться работать со звуком , чистить его

    Продолжать поиски здесь.
    Ответ написан
    9 комментариев
  • Как залить данные на GITHUB после изменений коммита (amend)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    git push origin +post
    Ответ написан
    Комментировать
  • Бэкап и восстановление Debian 7.8 Ошибка Error is not recoverable: exiting now Как правильно сделать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    tar --same-owner -xvpf /usb/backup.tgz - C /mnt/

    Между - и C не должно быть пробела. С пробелом получается, что вы хотите распаковать /usb/backup.tgz, а следом за ним -- стандартный ввод, на что вам gzip вызванный из tar и отвечает "gzip: stdin: unexpected end of file".
    Ответ написан
  • Как вычислить расстояние CD?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    DC = r - sqrt(BC * (2 * r - BC))
    Ответ написан
    Комментировать
  • Нужен нормальный форум по buildroot?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответ написан
    Комментировать
  • В какие игры вы играете на Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    nexuiz
    Ответ написан
    Комментировать
  • В чём разница между операндом и литералом?

    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
    name specifier 'Vector3<V>::' for declaration does not refer into a class

    Компилятор прав. У тебя нет такого типа. Есть тип Vector3<V,T>, с двумя параметрами в шаблоне.
    Можно написать так:
    template <class V, typename T>
    Vector3<V> &Vector3<V, T>::operator+=(const Vector3<V> &addVector) {
        this->x += addVector.x;
        this->y += addVector.y;
        this->z += addVector.z;
        return *this;
    }
    Ответ написан
    2 комментария
  • Поможете найти ошибку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ты потерял int 10h перед jmp text прямо над меткой backpace:
    Ответ написан
    Комментировать
  • Как составить рекурсию по возрастанию?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как составить рекурсию из массива

    Рекурсия -- это метод решения задачи, использующий сам себя для решения подзадач. Массив -- это массив. Нельзя составить рекурсию из массива. Можно вывести массив на экран рекурсивной функцией.

    значения по возрастанию
    ...
    1 2
    1 3
    1 2 3

    Но это же не по возрастанию. По возрастанию (лексикографическому) было бы
    1 2
    1 2 3
    1 3
    Ответ написан
  • Не могу создать образ с ядром и загрузчиком...?

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    сделал merge. И даже разрулил 100500 конфликтов. Очень уж не хочется делать merge с самого начала.

    Для решения конкретно этой проблемы можно включить git rerere (Reuse recorded resolution) добавив секцию
    [rerere]
    enabled = true

    в config репозитория или в свой .gitconfig
    Ответ написан
    Комментировать
  • Как загрузить код с диска в оперативную память в реальном режиме ассемблера?

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Возможно серветный сокет закрывается нормально, а recv возвращает 0. Из man recv:
    These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly shutdown.

    Вообще вы очень лихо печатаете результат из буфера заполненного recv: нет никакой гарантии, что принято будет ровно столько, сколько отправит send, и завершающего символа с кодом 0 может не оказаться в буфере. Правильнее было бы сделать хотя бы так:
    ssize_t recvd = recv(ClientSocket, buffer, MESSAGE_MAXLEN, 0);
      if (recvd != SOCKET_ERROR)
      {
        // recv не возвращает ошибку
        printf("server response: %.*s\n", recvd, buffer);  // напечатает только то, что было принято
      }
      else
      {
        error = WSAGetLastError();
        printf("recv failed: %d\n", error);
      }
    Ответ написан
  • Существует ли отладчик, который позволяет делать брекпоинт с условиями?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я хочу произвести отладку и остановить программу когда будет соблюдаться определенное условие. Допустим сумма регистров eax+ebx будет равна 65463.

    Для совсем уж произвольного условия, типа того, что вы написали, готовых средств скорее всего нет.
    Если вам нужно остановиться, когда программная переменная в памяти принимает определённое значение -- искать в вашем отладчике по слову watchpoint. В gdb, например, можно поставить watchpoint на переменную, а в commands вписать код, который будет продолжать выполнение, если значение переменной не то, что вам нужно, например:
    $ cat > main.c
    int v;
    
    static void f(int *p)
    {
            int i;
    
            for (i = 0; i < 20; ++i)
                    *p = (i - 10) * (i - 10);
    }
    
    int main()
    {
            f(&v);
            return 0;
    }
    $ gcc -g2 -o watch main.c     
    $ gdb ./watch              
    ...
    Reading symbols from ./watch...done.
    (gdb) start
    Temporary breakpoint 1 at 0x4004ec: file main.c, line 13.
    Starting program: /home/jcmvbkbc/tmp/toster/watch/watch 
    
    Temporary breakpoint 1, main () at main.c:13
    13              f(&v);
    (gdb) watch v
    Hardware watchpoint 2: v
    (gdb) commands 
    Type commands for breakpoint(s) 2, one per line.
    End with a line saying just "end".
    >if (v != 4)
     >continue
     >end
    >end
    (gdb) c
    Continuing.
    ...
    Hardware watchpoint 2: v
    
    Old value = 9
    New value = 4
    f (p=0x600904 <v>) at main.c:7
    7               for (i = 0; i < 20; ++i)
    (gdb)
    Ответ написан
    Комментировать
  • Как послать набор символов в qemu, если там нет ОС?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можно научить интерпретатор читать из последовательного порта, присоединить последовательный порт QEMU к stdio опцией -serial и писать туда например так:
    echo '++++++' | qemu-system-... -nographic -monitor none -serial stdio
    Ответ написан
    Комментировать
  • Какой алгоритм использовать для определения минимального числа перестановок карт в колоде?

    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;
    }
    Ответ написан
    Комментировать