Задать вопрос
  • Почему нельзя инициализировать в case?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert

    switch(1){
    case 1:
        double d = 1; //ошибка
    }

    Почему нельзя инициализировать в case?

    С этим кодом всё в порядке с точки зрения стандарта. Проблемы начнутся, если добавить меток case в switch после определения переменной d. Переход на эти метки входит в область видимости переменной d, но минует её инициализацию. Это запрещено стандартом (с++98, 6.7:3):

    It is possible to transfer into a block, but not in a way that bypasses declarations
    with initialization. A program that jumps from a point where a local variable with
    automatic storage duration is not in scope to a point where it is in scope is ill-formed
    unless the variable has POD type (3.9) and is declared without an initializer.
    Ответ написан
    Комментировать
  • Как передать управление сопрограмме?

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

    Можете подсказать в чём проблема?

    В реализации, похоже на то.
    Ответ написан
    Комментировать
  • Как преобразовать char массив в int С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подскажите, а можно ли по такому же принципу преобразовать char массив в int?

    unsigned char a[4] = {...};
    int b = ...;
    memcpy(a, &b, sizeof(a)); // -- int в char
    memcpy(&b, a, sizeof(a)); // -- char в int
    Ответ написан
  • Как правильно объявить функцию, использующую переменную из класса, и класс включающий в себя использование этой функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как объявить их так, чтобы избежать подобных ошибок?

    Очень странная конструкция в коде:
    - если это такой уж univeralTool, то зачем он завязывается на поле какого-то конкретного объекта какого-то класса?
    - если уж надо завязаться на поле объекта, то почему эта функция -- не член этого класса?
    - если надо обработать какое-то значение, то почему не передать это значение как аргумент функции?

    Ну и если и ни то и ни сё, и действительно надо как написано в коде -- то раздели всё на части и используй объявления или упорядочи определения функций как следует, например так:
    class someClass {
    public:
      void someClassTool();
      int variableInClass = 5;
    };
    
    Someclass someclass;
    
    void someUniversalTool()
    {
      int variable1 = someClass.variableInClass ;
      //some additional code
    }
    
    void SomeClass::someClassTool()
    {
       someUniversalTool();
       //some additional code
    }
    Ответ написан
    Комментировать
  • Преобразование типов и арифметика указателей?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    double * func(double *p, int a, int b) {
        double **p1 = &p;
        *(int*)p = a;
        *(int*)p++ = b;
        return *p1;
    }

    Почти правильно, не считая странных игр с p1.
    По заданию наверно должно быть так:
    void func(double *p, int a, int b)
    {
        *(int*)p = a;
        *((int*)p + 1) = b;
    }


    Если быть совсем строгим и избегать языковых проблем (а в коде выше как минимум type-punning), то так:
    void func(double *p, int a, int b)
    {
        memcpy(p, &a, 4);
        memcpy((char *)p + 4, b, 4);
    }
    Ответ написан
    Комментировать
  • Для чего нужен return?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    float del (float a, float b)
    {
        float res;
        ...
        res = ...;
        ....
        return res;
    }
    ....
    float result = del (num1, num2);

    что делает "return res" во втором куске кода? То есть в переменную res записывается деление числа А и Б. А потом оно куда-то там возвращается..

    Это значение, которое вернётся из функции в точку вызова. В примере выше оно будет присвоено переменной result.
    Ответ написан
    Комментировать
  • Какое влияние полинома на конечный результат в CRC32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    1. Как влияет полином на CRC?

    CRC -- это остаток от деления входных данных на полином.

    2. Существует ли возможность скорректировать алгоритм или полином так что бы результаты crc были определенном диапазоне? например от 0x0 - 0xafffffff.

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

    3. Скорректируйте алгоритм так что бы результаты были всегда внутри диапазона 0x0-0xeffffffff

    Это задание а не вопрос. Делай свою домашку сам.
    Ответ написан
    3 комментария
  • Почему не инициализировать int (*)[][]?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Потому что С++. gcc это принимает (без ключа -pedantic) просто потому что это совместимо с с99. Но это не стандартный с++.
    Ответ написан
    3 комментария
  • Как программно реализовать текстовый протокол SCPI на микроконтроллере?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подскажите как можно реализовать программно текстовый протокол SCPI?
    Есть синонимы команд, есть не обязательные параметры, параметры могут быть, могут не быть, может быть сразу несколько. Как это всё обрабатывать и проверять не пытается ли пользовать ввести несуществующую команду?

    На мой взгляд, проще всего воспользоваться связкой генератор парсеров + лексический анализатор, bison + flex. Описать грамматику языка на языке bison, описать допустимые лексемы на языке flex, скомпилировать и получить парсер для этого языка на C.
    Ответ написан
    Комментировать
  • Как исправить ошибку сегментирования?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    gdb выдает следующее

    Остаётся узнать как работают команды gdb bt, up, down и frame, и можно будет ответить на свой вопрос самостоятельно.

    Но в данном случае всё очевидно:
    char* command;		
      while(strcmp(command, "exit") == 1);

    Три ошибки в двух строках: во-первых, command не инициализирована на момент вызова strcmp, и это вызывает SEGFAULT.
    Во-вторых strcmp возвращает 0 при равенстве, <0 или >0 (не обязательно 1) при неравенстве строк.
    В-третьих ';' после while () явно лишняя.
    Ответ написан
    1 комментарий
  • Почему && не работает в Screen?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему так, не подскажете?

    Потому что && разбивает команду следующим образом:
    ( screen -dmS unpack unzip -o arhiv.zip ) && ( rm arhiv.zip )

    т.е. "запустить screen и удалить файл". Чтобы удалить файл внутри screen надо написать
    screen -dmS unpack bash -c 'unzip -o arhiv.zip && rm arhiv.zip'
    Ответ написан
    1 комментарий
  • Я правильно понял связь указатель на указатель и двумерный массив?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нет, понял неправильно. int[2][2] != int **.
    Но расположение элементов нарисовал правильное.
    Идея в том, что двумерный массив -- это массив массивов. Т.е. int [2][2] == int ([2])[2].
    Указатель на указатель -- совсем другая песня.
    Ответ написан
  • Как описать указатель на двумерный массив?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int i[2][2] = {{1, 2}, {3, 4}};
    int (*ii)[2] = i;
    ii[0][0];
    Ответ написан
    Комментировать
  • Как быстро найти остаток от суммы цифр?

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

    А если вместо суммирования чисел воспользоваться формулой суммы арифметической прогрессии n * (n + 1) / 2 ?
    Насколько велико "большое число"?
    Ответ написан
    1 комментарий
  • Как сравнить 2 числа введенных пользователем?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    read $value

    read value же, имя переменной там должно быть.
    Ответ написан
    Комментировать
  • Почему во втором случае нет указателя?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    typedef int (*SIG_TYP)(int); 
    typedef void (SIG_ARG_TYP)(int);
    SIG_TYP signal1(int, SIG_ARG_TYP){};

    как вторую конструкцию понять? это указатель?

    Нет, этот тип -- это тип функции (а не указателя на функцию).
    Т.е. можно написать так:
    SIG_ARG_TYP foo;
    и это будет объявлением функции foo.
    Ответ написан
    3 комментария
  • Почему сменяется группа при изменении содержимого файла?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему сменяется группа при изменении содержимого файла?

    Потому что изменение данных выполнено так, что меняет группу. Возможно файл был удалён и создан заново. Запуск процесса изменения данных под strace может дать ответ на этот вопрос.
    Просто открытие файла и запись данных в него не меняет группу.
    Ответ написан
    2 комментария
  • Как решить задачу с двумерным массивом?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int k = n / 2;
      int l = c / 2;
      for (int i = 0; i <= k; i++)
      {
        for (int j = 0; j <= l; j++)
        {
          int temp = a[i][j];
          a[i][j] = a[i + k][j + l];
          a[i + k][j + l] = temp;
          cout << temp << " ";
        }
      }

    должно стать
    int k = (n + 1) / 2;
      int l = (c + 1) / 2;
      for (int i = 0; i < n / 2; i++)
      {
        for (int j = 0; j < c / 2; j++)
        {
          int temp = a[i][j];
          a[i][j] = a[i + k][j + l];
          a[i + k][j + l] = temp;
          cout << temp << " ";
        }
      }
    Ответ написан
    2 комментария
  • Почему "The max CPUs supported by machine 'versatilepb' is 1"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Машина versatilepb -- это же антиквариат. Какой-нибудь vexpress-a15 хотя бы нужен для многоядерности.
    Ответ написан
  • Команды COSMAC ELF 1802?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Сначала идёт команда 7A - погасить лампочку. Команда загружает в регистр R0 число 2. Почему?

    Поскольку у тебя P = 0, то R(0) используется как program counter. Инструкция 7А должна его увеличить на 1, т.е. после неё в R(0) должно быть 1.

    Далее идёт команда F8 Описание этой команды M(R(P)) → D; R(P) + 1 → R(P)
    Команда F8 загружает в регистр F8 число 3, хотя команда, судя по описанию, должна прибавлять к регистру R0 число 1 и сохранять результат в R0, значит в R0 должно оказаться число 1.

    Нет, не так. Сначала команда загружается в регистры I и N, а R(0) увеличивается на 1. После этого достаётся байт из памяти по адресу R(0) и помещается в D, а R(0) увеличивается ещё на 1.

    Дизассемблированная программа:
    0: 7A -- reset Q (Q = 0)
    1: F8 -- ldi 10 (D = 10)
    2: 10
    3: B1 -- phi 1 (R(1).1 = D, т.е. R(1) = 1000)
    4: 21 -- dec 1 (R(1) = R(1) - 1, т.е. R(1) = fff)
    5: 91 -- ghi 1 (D = R(1).1, т.е. D = f)
    6: 3A -- bnz 4 (переход к адресу 4, пока D != 0)
    7: 04
    8: 31 -- bq 0 (переход к адресу 0 если Q == 1)
    9: 00
    a: 7B -- set Q (Q = 1)
    b: 30 -- br 1 (переход к адресу 1)
    с: 01
    d: 00 -- idle (никогда не попадаем сюда).


    В середине просто цикл задержки на счётчике.
    Ответ написан
    Комментировать