Ответы пользователя по тегу C++
  • В чем может быть проблема сборки исходников?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    windres lib/glut/glut.rc lib/glut/resources.o
    : Invalid argumentresources.o

    в чем может быть дело

    windres не нравится второй аргумент командной строки. Похоже на то, что он ожидает '\' в качестве разделителя элементов пути к файлу вместо '/'.
    Можно начать с проверки того, в этом ли дело, запустив windres так: windres lib\glut\glut.rc lib\glut\resources.o
    Ещё стоит проверить, что используется windres из того же набора, что и остальные инструменты сборки, а не какой-нибудь левый.
    Ответ написан
    Комментировать
  • Почему тут undefined reference?

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

    Потому что порядок перечисления библиотек важен: в списке библиотек a b c символы, которые нужны библиотеке b будут искаться только в библиотеке c, но не в a. Если между библиотеками нет циклических зависимостей (т.е. нет такого, что a определяет символ, нужный b, а b определяет символ, нужный a), то их можно упорядочить так, что линковка будет успешной (см. топологическая сортировка). Если циклические зависимости есть, или сортировать лень, можно перечислить нужные библиотеки несколько раз или взять их в группу:
    g++ main.cpp -Wl,--start-group -lglfw3 -lgdi32 -lopengl32 -lglew32s -Wl,--end-group
    Ответ написан
    Комментировать
  • Как получить результат функции в main при работе с матрицами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    sum_of = sum(matrix[][]);

    должно стать
    sum_of = sum(n, matrix);

    int sum (int n, int matrix[n][n]) {
        int sum = 0;
        for (int j = 0; j < n; ++j){
            for (int i = 0; i < n; ++i){
                if (j == i){
                    sum += matrix[j][i];
                }
            }
        }
        return sum;
    }

    Это, конечно, работает, но лучше написать так:
    int sum (int n, int matrix[n][n])
    {
        int sum = 0;
        for (int i = 0; i < n; ++i) {
            sum += matrix[i][i];
        }
        return sum;
    }
    Ответ написан
    Комментировать
  • Нужно ли сокращать код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Стоит ли сокращать код? И как?

    Можно сделать так:
    struct
    {	
      bool btn_state;
      bool btn_flag;
      bool hold_flag;
      bool counter_flag;
      bool isHolded_f;
      bool isRelease_f;
      bool isPress_f;
      bool step_flag;
      bool oneClick_f;
      bool isOne_f;
    
    } fl;
    fl flags;
    // ........ 
    
    boolean GButton::isFlag(bool& flag) {
      if (_tickMode) GButton::tick();
      if (flag) {
        flag = false;
        return true;
      } else return false;
    }
    
    boolean GButton::isPress() {
      return isFlag(flags.isPress_f);
    }
    boolean GButton::isRelease() {
      return isFlag(flags.isRelease_f);
    }
    boolean GButton::isClick() {	
      return isFlag(flags.isOne_f);
    }
    boolean GButton::isHolded() {
      return isFlag(flags.isHolded_f);
    }
    Ответ написан
    Комментировать
  • Как сделать так чтобы консольное приложение "вернуло" некий текст?

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

    popen например.
    Ответ написан
    Комментировать
  • Почему нельзя инициализировать в 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.
    Ответ написан
    Комментировать
  • Как преобразовать 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.
    Ответ написан
    Комментировать
  • Почему не инициализировать int (*)[][]?

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

    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 комментарий
  • Я правильно понял связь указатель на указатель и двумерный массив?

    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 комментарий
  • Почему во втором случае нет указателя?

    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
    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 комментария
  • Как работает остаток от деления (%) с переменными типа int?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    int pin = (ms / 120) % 10;
    Как работает данный код с переменными int?

    Делит ms на 120 (так что результат равен 0 в период [0..120[ мс, 1 в период [120..240[ мс. итд), а потом берёт остаток от деления результата на 10 (так, что результат меняется циклически в пределах [0..10[ ).

    Как будет отличаться от работы с другим типом переменных (к примеру нецелочисленных)?

    Никак. Встроенный оператор % работает только с целыми числами.
    Ответ написан
  • "Нечитаемый" код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);

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

    for(; *pchar; ++length, ++pchar);

    Делать так (писать цикл с пустым телом и точкой с запятой на той же строке) не стоит, потому что легко не заметить эту точку с запятой или её отсутствие.

    for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);

    Так делать (писать тело цикла в его поле для условия выхода, равно как и писать его в последнем поле) не стоит, потому что всему своё место, а ошибку в этом цикле ты уже допустил.
    Ответ написан
    7 комментариев
  • Как сравнить 2 введенных слова?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    if (strcmp(name1, name2) == 1)

    man strcmp
    The strcmp() and strncmp() functions return an integer less than,
           equal to, or greater than zero if s1 (or the first n bytes thereof)
           is found, respectively, to be less than, to match, or be greater than
           s2.

    Для проверки на равенство должно быть
    if (strcmp(name1.c_str(), name2.c_str()) == 0)
    Ответ написан
    2 комментария