проверить, если матрица симметрична, и я всегда получаю один и тот же результат

Учитывая, там, кажется, не быть хороший, чистый, простой способ ответить на этот - решение Антона I думать является правильным, но его определенно спорно, если лучший ответ не приходит, я бы рекомендовал положить такой класс в куче и ухаживать за ним через std::unique_ptr:

auto a = std::make_unique<A>();

Теперь он полностью перемещаемый, и любой, у кого есть блокировка внутреннего мьютекса, в то время как происходит движение, по-прежнему безопасен, даже если его обсуждать, хорошо ли это делать

. Если вам нужна семантика копирования, просто используйте

auto a2 = std::make_shared<A>();
2
задан gsamaras 16 January 2019 в 09:09
поделиться

5 ответов

Измените это:

x= Symmetrie(square_matrix[4][4]);

на следующее:

x = Symmetrie(square_matrix);

, поскольку ваш метод ожидает всю матрицу в качестве параметра, а не только элемент.

square_matrix[4][4] - это отдельный элемент матрицы, то есть элемент в 5-й строке и 5-м столбце. Конечно, это вызывает неопределенное поведение (UB) , так как ваша матрица имеет 4 строки.

Что еще более важно, не игнорируйте сгенерированные предупреждения. Например, в GCC вы получите что-то вроде этого:

prog.c: In function 'main':
prog.c:24:32: warning: passing argument 1 of 'Symmetrie' makes pointer from integer without a cast [-Wint-conversion]
   24 |   x= Symmetrie(square_matrix[4][4]);
      |                ~~~~~~~~~~~~~~~~^~~
      |                                |
      |                                int
prog.c:5:20: note: expected 'int (*)[100]' but argument is of type 'int'
    5 | int Symmetrie (int matrix[][max]) {
      |                ~~~~^~~~~~~~~~~~~

, как вы можете видеть в Live Demo .

0
ответ дан gsamaras 16 January 2019 в 09:09
поделиться

Другие ответы уже показывают проблему, но я хотел бы отметить, что, используя синтаксис VLA, можно передать фактический размер массива функции. Также стоит отметить, что циклы могут быть ограничены только одной половиной «матрицы»:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool is_symmetric(size_t n, int matrix[n][n])
{
  for(size_t i = 0; i < n; ++i) {
    for(size_t j = 0; j < i; ++j) {
      //              ^^^^^
      if (matrix[i][j] != matrix[j][i]) {
        return false;
      }
    }
  }
  return true;
}

int main(void) {
  int  square_matrix[][4] = {
     {1,2,3,4}
    ,{2,2,5,6}
    ,{3,5,3,7}
    ,{4,6,7,4}
  };

  if( is_symmetric(4, square_matrix) ) {
    puts("The matrix is symmetric");
  } else {
    puts("The matrix is not symmetric");
  }
  return 0;
}
0
ответ дан Bob__ 16 January 2019 в 09:09
поделиться

Нижеследующее утверждение должно быть изменено

x= Symmetrie(square_matrix[4][4]);

на

x= Symmetrie(square_matrix);

square_matrix[4][4] - это всего лишь один элемент при условии индексов. Вместо этого передайте адрес.

0
ответ дан Sunil Bojanapally 16 January 2019 в 09:09
поделиться

Измените ваш звонок

x= Symmetrie(square_matrix[4][4]);

на

x= Symmetrie(&square_matrix[0][0]);

0
ответ дан Vagish 16 January 2019 в 09:09
поделиться

Как говорили другие, вы должны изменить:

x = Symmetrie(square_matrix[4][4]);

на это:

x = Symmetrie(square_matrix);

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

Простое printf("%d =?= %d", matrix[i][j], matrix[j][i]) прямо над if показало бы вам, что все цифры - бред.

Или , как предложила @DanielH, некоторые компиляторы рассматривают это как предупреждение, и вы не должны их игнорировать. Для других компиляторов добавление -Wall в качестве флага компиляции также помогло бы вам это уловить.

0
ответ дан Daniel Trugman 16 January 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: