• Контринтуитивный синтаксис объявления нескольких переменных одного типа?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    можно подумать, что при объявлении указателя, символ * относится к имени(не как часть, а как что-то зависящее от него), а не к типу.

    Если взять стандарт языка (например C99) и почитать главы Declarations, Type Specifiers и Declarators, то можно увидеть, что он разделяет declaration-specifiers, в который входят только слова и declarators, в который входят скобочки и звёздочки. Т.е. твой вывод по сути верный.

    Там же можно увидеть, что часть называемую declarator всегда можно обернуть в скобки, из чего можно извлечь следующий вывод: часть объявления вокруг которой можно поставить скобки самым широким образом относится к конкретному идентификатору, оставшаяся часть -- ко всему списку. Т.е. const char *a, b; можно превратить в const char (*a), b, но нельзя превратить в const (char *a), b или в char (const *a), b.

    Ну и напоследок стоит добавить, что такая интерпретация объявления не следует ни из чего с необходимостью, это просто решение которое было принято разработчиками языка. Они могли принять это решение по-другому и тогда уже другие конструкции вызывали бы наше удивление.
    Ответ написан
    2 комментария
  • Скомпилированный в GCC exe файл вылетает досрочно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Но в режиме отладки всё, как я уже писал выше, работает.

    Да не, это только видимость. Смотри:

    $ gcc -std=c99 -O2 -g3 -fsanitize=address main.c acp.c md5.c -o main
    $ ./main
    Base64('Hello') = "SGVsbG8="
    MD5('Hello') = "8b1a9953c4611296a827abf8c47804d7"
    =================================================================
    ==1045705==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x604000000071 at pc 0x7fb0d46486f8 bp 0x7ffd0affb580 sp 0x7ffd0affad30
    WRITE of size 33 at 0x604000000071 thread T0
        #0 0x7fb0d46486f7 in __interceptor_strcat ../../../../src/libsanitizer/asan/asan_interceptors.cpp:377
        #1 0x564b2388c0de in prepareKeys /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:263
        #2 0x564b2388cac4 in acraw /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:319
        #3 0x564b2388d8c2 in acraws /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:401
        #4 0x564b2388d8c2 in acraws_basic /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:409
        #5 0x564b2388a62e in testSimpleEncryption /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main.c:20
        #6 0x564b2388a368 in main /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main.c:111
        #7 0x7fb0d44461c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
        #8 0x7fb0d4446284 in __libc_start_main_impl ../csu/libc-start.c:360
        #9 0x564b2388a440 in _start (/home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main+0x3440)
    
    0x604000000071 is located 0 bytes to the right of 33-byte region [0x604000000050,0x604000000071)
    allocated by thread T0 here:
        #0 0x7fb0d46b89cf in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
        #1 0x564b2388fee7 in md5StringHash /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/md5.c:227
    Ответ написан
  • Что не так с кодом, работающим с графом?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Тебе не нужен dfs или bfs. Просто обойди циклом все вершины по массиву вершин, и для положительных увеличивай все соседние
    Ответ написан
    8 комментариев
  • Как хранится struct в памяти?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Зависит от компилятора и заданных при компиляции опций. Например, при плотной упаковке (#pragma pack(1)) каждый элемент структуры занимает ровно столько, сколько ему необходимо. А при выравнивании на 64 бита (#pragma pack(8)) под каждый элемент выделится память, кратная 8 байтам и достаточная для размещения элемента. Для разных архитектур процессоров могут быть доступны разные настройки выравнивания.
    Ответ написан
    Комментировать
  • Где могла закрасться ошибка?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Если взять турнирную сетку на 2^N человек (или N раундов), то можно ещё составить рекуррентную формулу вероятности встречи P(N)

    P(1) = 1
    P(N) = 1/(2^N - 1) + (2^N - 2) /(2^N - 1) * 1/4 * P(N-1)

    2^N - это 2 в степени N

    здесь первое слагаемое для случая, когда второй игрок в самом ближайшем раунде встречается с первым
    второе слагаемое - все остальные случаи, для которых с вероятностью 1/4 оба игрока выиграют раунд и далее встретятся с вероятностью P(N-1)

    теперь по индукции можно доказать, что P(N) = 1/2^(N-1)
    Ответ написан
    Комментировать
  • Какой есть учебник или книги по схемотехнике?

    @vanyamba-electronics
    Гуглите "теория электрических цепей учебник".
    Например вот.
    Ответ написан
    1 комментарий
  • Как из первых N натуральных чисел составить максимальное количество пар, суммы которых являются простыми?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Для начала можно построить таблицу простых чисел от 1 до 2N, например с помощью решета Эратосфена. Теперь ты сможешь проверять, что число (или, например, сумма двух чисел) простое, за O(1), то есть быстро.

    Далее, как известно, простое число больше 2 всегда нечетное, т.е. оно есть сумма четного и нечетного. Соответственно, все четные числа - в одну кучку, нечетные - в другую. И в каждую пару брать из разных кучек. Вот так и получается, что у тебя тут двудольный граф, в котором числа - вершины, и есть ребро, если сумма двух вершин простая. Задача называется вроде бы "о максимальном паросочетании" или что-то вроде того.
    Ответ написан
    1 комментарий
  • Какой есть учебник или книги по схемотехнике?

    @chnav
    Я недавно наткнулся на ролики Major Tom Workshop, у него целая серия роликов про чтение схем. Я вроде знаком с электроникой (пусть и не очень глубоко) не первый десяток лет, но у человека просто дар объяснения - всё грамотно и по-военному чётко. Для примера посмотрите устройство компьютерного БП, а оттуда по ссылкам на более простые вещи. А потом можно браться и за учебник Хоровица и Хилла ))
    Ответ написан
    Комментировать
  • Какой есть учебник или книги по схемотехнике?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    Первым напрашивается Хоровиц и Хилл "Искусство схемотехники" , но не самые последние переиздания. Поскольку в них были обнаружены кучи ошибок, люди рекомендуют трехтомник 1993 года.
    В моё время был популярен справочник В. Шило "Линейные интегральные схемы" - но это для тех, кто хочет освоить аналоговую схемотехнику на ИС. Под его же авторством есть и справочник "Популярные цифровые микросхемы", для желающих освоить цифровую схемотехнику.
    А для совсем начинающих, разумеется, всяческие "Справочники юного радиолюбителя" (особенно выпуски Массовой радиобиблиотеки - МРБ), например, известная книга Р. Свореня "Электроника шаг за шагом" или книжки В. Борисова.
    Разумеется, этим список рекомендаций не ограничивается, по запросу "справочники по схемотехнике" Гугл выдаёт более 200 тысяч ссылок.
    Ответ написан
    Комментировать
  • Почему метод push_front() работает неправильно?

    axifive
    @axifive
    Software Engineer
    Опечатка, посмотри на конструктор узла повнимательнее.
    ...
    Node(T data = T(), Node* (pnext) = nullptr) {
          this->pNext = (pNext);
    ...
    Ответ написан
    Комментировать
  • Как узнать могут ли 2 квадратных уравнения иметь общие корни?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Находите решения (корни) обоих уравнений в общем виде, получаете две пары решений, приравниваете их попарно, получаете четыре уравнения, решаете их относительно m, получаете значения m при которых корни совпадают.
    По количеству - для каждого уравнения записываете дискриминант, определяете его знак в зависимости от m, получаете диапазоны с нулём, одним и двумя действительными корнями. Затем смотрите пересечения диапазонов разных уравнений и выделяете точки с совпадающими корнями, полученные в первой части решения, находите области с разным количеством корней.
    P.S. Общие корни есть при m = 1 и m = -3
    x2 + x - 6 = 0, x1 = 2, x2 = -3
    x2 -3x + 2 = 0, x1 = 2, x2 = 1
    Общий корень x = 2.
    При m = -3 уравнения становятся тождественными.
    Ответ написан
    Комментировать
  • Какие темы самые важные для олимпиадного программировании в книге Кормена «Алгоритмы. Построение и анализ»?

    Alexandroppolus
    @Alexandroppolus
    кодир
    к ответу выше ещё можно добавить Часть IV.
    этих штук (особенно ДП) будет завались.
    Ответ написан
    3 комментария
  • Как преобразовать std::function в указатель на функцию?

    @sergiodev
    Как вариант можно так сделать:

    1. Запомнить указатель на объект (this) в какую-то глобальную переменную
    2. Создать обычную функции в соответствии с параметром WlanRegisterNotification и передать её туда
    3. В теле функции достать указатель на экземпляр из глобальной переменной и далее работать с ним

    Возможно, ещё нужно учесть синхронизацию, если callback вызывается в другом потоке.

    Если вы работаете с функцией https://learn.microsoft.com/en-us/windows/win32/ap... из Windows API, то там есть параметр context как раз для передачи контекста в callback. Можно положить туда this и позже достать из контекста внутри вашей callback-функции.
    Ответ написан
    2 комментария
  • Как сделать поиск папки у которой будет промежуточный каталог?

    Vindicar
    @Vindicar
    RTFM!
    Рекурсивно перебирать все каталоги, для каждого каталога проверять совпадение пути с шаблоном.
    Ответ написан
    Комментировать
  • Как ускорить поиск нескольких подстрок в строке в го?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Скорее всего, нужен "алгоритм Ахо-Корасик".
    Если его нет из коробки в Go, то можно запилить самостоятельно: ссылка, ссылка, ссылка
    Ответ написан
    2 комментария
  • Как оформить код?

    @dima20155
    you don't choose c++. It chooses you
    самое простое - используйте typedef или using
    А также можно написать свой класс-обертку для удобства.
    Ответ написан
    3 комментария
  • Какие виды функций есть в C++, и как их различать?

    @code_panik
    В c++ есть бинарный оператор <<, который для целых чисел является оператором сдвига битов числа влево на заданное количество позиций (то же, что и повторное умножение на два). Например, программа напечатает 2 << 1 == 4,
    #include <iostream>
    using namespace std;
    
    int main() {
        cout << "2 << 1 == " << (0b010 << 1); // 0b100
        return 0;
    }

    Одна из основных возможностей языка - перегрузка функций, в частности встроенных операторов (не всех). То есть мы можем определить свой тип данных со своей реализацией оператора <<.
    #include <iostream>
    using namespace std;
    
    struct Foo {
        Foo& operator<<(int x) {
            cout << "Integer: " << x << '\n';
            return *this;
        }
    
        Foo& operator<<(const char* str) {
            cout << "String: " << str << '\n';
            return *this;
        }
    };
    
    int main() {
        Foo foo;
        foo << 3; // Integer: 3
        foo.operator<<("Hello world"); // String: Hello world
        return 0;
    }

    Для компилятора запись foo << 3; значит именно вызов функции foo.operator<<(3). Аналогично в случае cout, объекта типа std::ostream, который представляет поток вывода (character output).
    https://en.cppreference.com/w/cpp/io/basic_ostream...
    Ответ написан
    Комментировать
  • Как упростить выражение с факториалами?

    Lynn
    @Lynn
    nginx, js, css
    Не очень понятно что вы имеете в виду под «упростить».

    Если обозначить данное выражение как Sn, то несложно получить рекурсивную формулу:

    Sn+1 = 1 + Sn/(n+1)
    S1 = 1

    Что делать с этой формулой дальше вам решать.
    Ответ написан
    3 комментария
  • Как вычислить значение x mod 2 на машине Тьюринга?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В унарном виде - это как цепочка единичек. Например число 5 будет.

    _11111_

    Справа и слева должен стоять blank sysmbol. Типа признак конца ленты чтоб было что проверять.

    Тогда (5 mod 2) = 1

    И мы должны получить на ленточке просто единичку.

    _1_

    Это можно сделать поглощая пары соседних единичек. А для четного числа будет пустая лента. Тоесть остаток от деления равен нулю.

    Ну вот такой алгоритм. Дальше надо делать конечный автомат который ищет пары единичек.
    Ответ написан
    Комментировать