Ваша программа имеет неопределенное поведение из-за следующей строки:
printf("PM R : %d, C: %d Val: %f \n", r, c, matr[r,c]);
matr[r,c]
не имеет доступа к элементу матрицы.Из-за оператора запятой это просто matr[c]
, который оценивает указатель.Вы печатаете указатель, используя %f
.Это неопределенная часть поведения.Вам нужно использовать matr[r][c]
для доступа к элементу матрицы.
printf("PM R : %d, C: %d Val: %f \n", r, c, matr[r][c]);
Использование matr[r, c]
не правильно.
См. документацию оператора запятой для получения дополнительной информации.
Обновление
Благодаря острым глазам @PeteBecker, проблемаотличается от того, что я первоначально думал.
Оказывается, matr
имеет тип double*
.Следовательно, matr[c]
оценивается как удвоение.Следовательно, программа не имеет неопределенного поведения.Он просто обращается к c
-элементу matr
все время, независимо от значения r
.
Проблема начинается с:
matr = new double[a, b];
Это должно быть
matr = new double[a * b];
Везде, где к элементу матрицы обращаются с помощью matr[r, c]
, оно должно быть matr[r*cols + c]
.
В at
необходимо использовать:
return matr[pos1 * cols + pos2];
В setPos
, вам нужно использовать:
matr[pos1 * cols + pos2] = value;
В randomize
, вам нужно использовать:
printf("New value R: %d C: %d Val: %f \n", r, c, matr[r*cols + c]);
В print_matrix
, вам нужноиспользовать:
printf("PM R : %d, C: %d Val: %f \n", r, c, matr[r*cols + c]);
Вы можете упростить код для доступа к элементам, обеспечив перегрузку at
для const
не- const
объектов.
double& at(int r, int c) { return matr[r*cols + c]; }
double at(int r, int c) const { return matr[r*cols + c]; }
Тогда, setPos
может быть реализовано как:
void setPos(int pos1, int pos2, double value) {
at(pos1, pos2) = value;
};
Строки printf
могут быть обновлены до:
printf("New value R: %d C: %d Val: %f \n", r, c, at(r, c));
printf("PM R : %d, C: %d Val: %f \n", r, c, at(r, c));