Задать вопрос
  • Как нарисовать направление?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У меня есть мои координаты и координаты здания. Нужно чтобы я шел по улице и в активити рисовалась стрелка в направлении к этому зданию.

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответ написан
    Комментировать
  • Компенсация погрешностей при операциях с числами с плавающей запятой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как не сложно заметить при большой точности, мой результат отличается от результата библиотечного printf.

    Как не сложно заметить, long double имеет 19 значащих цифр, т.е. 0,0000000000000012300000000000000679 -- это всё что имеет смысл печатать, и эта часть одинакова в выводе printf и ft_printf. Всё что идёт дальше -- это мусор, который не содержится в исходном числе.

    long double tt = 0.00000000000000123;

    Число справа от знака = имеет тип double. См.
    Ответ написан
    4 комментария
  • Точность типов переменных с плавающей точкой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    long double a = 1.4142135623730950488;
    double b = 1.4142135623730950488;

    почему переменная типа long double хранит данные с такой же точностью, как и переменная типа double?

    Потому что ты инициализировал их одинаковыми значениями типа double. Попробуй сделать так:
    long double a = 1.4142135623730950488L;
    См:
    The type of a floating literal is double unless explicitly specified by a suffix.
    Ответ написан
    6 комментариев
  • Запись в переменную литерала не его типа?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Запись в переменную литерала

    Выглядит так: int a = 1; 1 -- это литерал. Ввод из потока к литералам отношения не имеет.

    почему если попытаться записать в переименую типа int символ, то не выдается ошибки

    Выдаётся, только ты её не проверяешь. Меняется failbit потока. Попробуй:

    #include <iostream>
    
    int main()
    {
      int a;
      
      std::cin >> a;
      std::cout << "a  = " << a << ", cin.fail() = " << std::cin.fail() << std::endl;
    }
    Ответ написан
  • Почему grep regex не работает без экранирования?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему grep regex не работает без экранирования?

    Из-за разницы между basic и extended синтаксисом grep. См. info grep:

    3.6 Basic vs Extended Regular Expressions
    =========================================
    
    In basic regular expressions the meta-characters ‘?’, ‘+’, ‘{’, ‘|’,
    ‘(’, and ‘)’ lose their special meaning; instead use the backslashed
    versions ‘\?’, ‘\+’, ‘\{’, ‘\|’, ‘\(’, and ‘\)’.


    Используйте grep -E или egrep чтобы получить extended синтаксис по умолчанию.
    Ответ написан
    Комментировать
  • На каких правилах основана шестнадцатеричная нотация в printf для вещественных чисел?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Где можно почитать почему так происходит, почему такие разные вариации записи одно числа в шестнадцатеричной системе исчисления?

    Разве что в спецификации использованной библиотеки языка C. Потому что в стандарте явно сказано, что первая цифра в таком представлении -- unspecified:
    A double argument representing a floating-point number is converted in the
    style [−]0xh.hhhh p±d, where there is one hexadecimal digit (which is
    nonzero if the argument is a normalized floating-point number and is
    otherwise unspecified) before the decimal-point character...
    Ответ написан
    Комментировать
  • Как пользователя присвоить к группе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как мне другого пользователя добавить к _www группу?

    usermod -a -G _www <user>
    См. man usermod.
    Ответ написан
    Комментировать
  • Как из суммы md5 получить содержимое обратно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    шифруется не более 9 цифр (артикул)

    Хешируется. Можно тупо решить в лоб, 9 цифр -- это миллиард вариантов. Можно их все посчитать, отсортировать и положить в файл, в текстовом виде займёт ~50 гигов, поиск будет почти мгновенный.
    Ответ написан
    Комментировать
  • Как правильно собрать gRPC?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Выдает ошибку:

    src/core/lib/iomgr/tcp_posix.cc:534:61: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]

    Сделай sed -i 's/-Werror//g' Makefile перед сборкой, чтобы она не валилась от предупреждений.
    Ответ написан
  • Почему fgets не работает второй раз?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    char str1[5];
      char str2[3];
    
      fgets(str1,5,stdin);
      fgets(str2,3,stdin);

    Я ожидаю, что при запуске введу слово из 5 букв, потом слово из 3

    Чтение man fgets легко отвечает на этот вопрос:
    fgets() reads in at most one less than size characters from stream
    and stores them into the buffer pointed to by s.
    Reading stops after an EOF or a newline.
    If a newline is read, it is stored into the buffer.

    Т.е. чтобы прочитать ровно 5 и ровно 3 символа, нужно вызывать fgets с аргументом размера 6 и 4 соответственно. Кроме того, когда первая строка заканчивается символом конца строки, этот символ тоже должен быть считан. Т.е. 7 и 5.
    Ответ написан
    1 комментарий
  • Почему нельзя сквошить все коммиты?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    git rebase -i --root если нужно внести изменения в первый коммит.
    Ответ написан
    Комментировать
  • Почему при передаче произволного количества аргументов в функцию появляются лишние аргументы?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Написал такую функцию:
    void privet(char* name ...) {
      char** ptr = &name;
      va_list ap;
      va_start(ap,name);
      int i = 0;
      for (;;) {
        char* p = va_arg(ap,char*);
        if (p == 0) break;
        cout << ptr[i] << " " << i << endl;
        i++;
      }
      va_end(ap);
    }

    Плохо написал. Если уж ты передаёшь параметры через многоточие и получаешь их через p = va_arg(ap,char*), то и используй p, который получил, а не ptr.

    При ее вызове с тремя аргументами privet("Nagib", "Habib", "Gena")

    А NULL в конец кто добавит за тебя, раз уж ты его в функции проверяешь?
    Ответ написан
    Комментировать
  • Сколько pci-e устройств можно подключить к компьютеру?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Во что pci-e упрется?

    В адресное пространство: с ARI можно адресовать по 256 функций на 256 шинах, без неё -- по 32 устройства на 256 шинах.
    Ответ написан
    4 комментария
  • Что не так в этой рекурсии?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что не так в этой рекурсии?

    Она выглядит непонятно. Её можно переписать понятно так:
    int mul(const int *x, int n)
    {
        assert(n > 0);
        if (n == 1)
            return x[0];
        if (n == 2)
            return x[0] * x[1];
        return mul(x, n / 2) * mul(x + n / 2, n - n / 2);
    }
    Ответ написан
    1 комментарий
  • Почему не выводится матрица?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    void readm(int N, int* X, FILE * dat)
    ... 
      int *X = nullptr;
      readm(N, X, dat);
    ...
      writem(N, X, res);

    Потому что ни N ни X внутри main не меняются, потому что их новое значения не возвращаются из функции readm.
    Минимальное изменение с которым всё заработает:
    void readm(int& N, int*& X, FILE * dat)
    Ответ написан
    2 комментария
  • Как правильно прервать поток в Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Общее правило при работе с потоками, не специфичное для С или pthreads: состояние резделяемое между потоками должно быть или атомарным или должно быть защищено примитивом синхронизации.
    Код функции thread_process никак не гарантирует, что компилятор не выкинет проверку !quit, потому что quit не меняется в этой функции и в функциях вызываемых из неё.

    Учитывая, что атомарность и потоки вошли в стандарт С11 имеет смысл смотреть туда.
    Если С11 недоступен, смотреть в pthread_mutex_*, pthread_cond_*, ...

    Может стоит вынести флаг в параметры потока

    По-хорошему -- да, стоит. Это, однако, ортогонально к синхронизации доступа.

    while(!quit) {
            if(difftime(time(NULL), last_cycle) > 30) {
                last_cycle = time(NULL);
                // Тут мои грязные дела
            }
        }

    Вместо busy wait лучше использовать sleep или что-нибудь типа pthread_mutex_timedlock/pthread_cond_timedwait.

    Я бы оформил код этого примера так:
    #include <sys/time.h>
    #include <pthread.h>
    #include <stdbool.h>
    #include <string.h>
    #include <stdio.h>
    
    struct thread1 {
        pthread_mutex_t lock;
        pthread_cond_t cond;
        bool quit;
    };
    
    static void* thread_process(void *p) {
        struct thread1 *arg = p;
    
        for (;;) {
            bool quit;
    
            pthread_mutex_lock(&arg->lock);
            if (!arg->quit) {
                struct timeval now;
                struct timespec ts;
    
                gettimeofday(&now, NULL);
                ts.tv_sec = now.tv_sec + 30;
                ts.tv_nsec = now.tv_usec * 1000;
                pthread_cond_timedwait(&arg->cond, &arg->lock, &ts);
            }
            quit = arg->quit;
            pthread_mutex_unlock(&arg->lock);
            if (quit)
                return NULL;
    
            // Тут мои грязные дела
        }
        return NULL;
    }
    
    int main() {
        pthread_t th;
        struct thread1 arg = {
            .lock = PTHREAD_MUTEX_INITIALIZER,
            .cond = PTHREAD_COND_INITIALIZER,
            .quit = false,
        };
        pthread_create(&th, NULL, thread_process, &arg);
    
        char cmd[16];
        while(true) {
            scanf("%s", cmd);
            if(!strcmp(cmd, "quit")) {
                pthread_mutex_lock(&arg.lock);
                arg.quit = true;
                pthread_cond_broadcast(&arg.cond);
                pthread_mutex_unlock(&arg.lock);
                break;
            }
            // остальные команды
        }
    
        pthread_join(th, NULL);
        return 0;
    }
    Ответ написан
    1 комментарий
  • Как обработать это сокетом?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как сделать чтобы...разделялись сообщения для клиента?

    Самому организовывать фрейминг в потоке данных. TCP работает с непрерывным потоком данных, в нём нет встроенного механизма формирования сообщений.

    как нам понимать что клиент вдруг отключился

    Обмениваться сообщениями по таймеру и регистрировать таймауты.
    Ответ написан
    Комментировать
  • Wifi сеть отображается как проводная в Kali Linux на virtualbox, Как исправить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подключаюсь к WIFI сети через адаптер, windows видит сеть как беспроводную. Запускаю Kali сеть отображается как проводная (eth0)
    Как можно поправить?

    Только отдав wifi целиком гостевой системе. Разделять его с хостовой системой и одновременно видеть как беспроводной адаптер в гостевой не получится.
    Ответ написан
  • Почему не работает проверка IF в arduino?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    if (p180T != (p180T_if,10))

    В этом месте наверняка имелось в виду что-то другое. Сейчас тут написано if (p180T != 10).
    Ответ написан
    Комментировать