Учитывая, там, кажется, не быть хороший, чистый, простой способ ответить на этот - решение Антона I думать является правильным, но его определенно спорно, если лучший ответ не приходит, я бы рекомендовал положить такой класс в куче и ухаживать за ним через std::unique_ptr
:
auto a = std::make_unique<A>();
Теперь он полностью перемещаемый, и любой, у кого есть блокировка внутреннего мьютекса, в то время как происходит движение, по-прежнему безопасен, даже если его обсуждать, хорошо ли это делать
. Если вам нужна семантика копирования, просто используйте
auto a2 = std::make_shared<A>();
Измените это:
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 kbd>.
Другие ответы уже показывают проблему, но я хотел бы отметить, что, используя синтаксис 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;
}
Нижеследующее утверждение должно быть изменено
x= Symmetrie(square_matrix[4][4]);
на
x= Symmetrie(square_matrix);
square_matrix[4][4]
- это всего лишь один элемент при условии индексов. Вместо этого передайте адрес.
Измените ваш звонок
x= Symmetrie(square_matrix[4][4]);
на
x= Symmetrie(&square_matrix[0][0]);
Как говорили другие, вы должны изменить:
x = Symmetrie(square_matrix[4][4]);
на это:
x = Symmetrie(square_matrix);
Но я хотел бы добавить и сказать, что вы могли бы Вы нашли это очень легко самостоятельно, просто добавив мелкий шрифт.
Простое printf("%d =?= %d", matrix[i][j], matrix[j][i])
прямо над if
показало бы вам, что все цифры - бред.
Или , как предложила @DanielH, некоторые компиляторы рассматривают это как предупреждение, и вы не должны их игнорировать. Для других компиляторов добавление -Wall
в качестве флага компиляции также помогло бы вам это уловить.