Единичная матрица не выводится
Не могу понять почему не работает код. Должен печатать единичную матрицу.
#include <iostream>
class Matrix {
public:
int columns;
int rows;
int **containment;
void function_name_of_init_action(Matrix *matrix_pointer1) {
matrix_pointer1->containment = (int **) malloc(matrix_pointer1->columns * sizeof(int *)); //add space for cols
for (int i = 0; i < matrix_pointer1->columns; ++i) {
matrix_pointer1->containment[i] = (int*) malloc(matrix_pointer1->rows * sizeof(int)); // add space for rows
}
}
void fill_matrix(Matrix *matrix_pointer2) {
for (int i = 0; i < matrix_pointer2->columns; ++i) {
for (int j = 0; j < matrix_pointer2->rows; ++j) {
if (i == j) { // main diag
matrix_pointer2->containment[i][j] = 1; // fill with const == 1
}
}
}
}
void free_matrix(Matrix *matrix_pointer3) {
for (int i = 0; i < matrix_pointer3->columns; ++i) {
free(matrix_pointer3->containment[i]);
}
free(matrix_pointer3->containment);
}
void print_matrix(Matrix *matrix_pointer) {
for (int i = 0; i < matrix_pointer->columns; ++i) {
for (int j = 0; j < matrix_pointer->rows; ++j) {
printf("%d ", matrix_pointer->containment[i][j]);
}
printf("\n");
}
}
};
int main() {
Matrix matrix_variable_name = {10, 10};
matrix_variable_name.function_name_of_init_action(&matrix_variable_name);
matrix_variable_name.fill_matrix(&matrix_variable_name);
matrix_variable_name.free_matrix(&matrix_variable_name);
matrix_variable_name.print_matrix(&matrix_variable_name);
return 0;
}
Ответы (1 шт):
Ну, если брать конкретно ваш код, то проблемы две — вы не инициализируете не диагональные элементы, и освобождаете память, а потом выводите матрицу (после освобождения никто не гарантирует, что в памяти останется что-то, что там было).
Исправления:
if (i == j) { // main diag
matrix_pointer2->containment[i][j] = 1; // fill with const == 1
}
else matrix_pointer2->containment[i][j] = 0;
и
matrix_variable_name.fill_matrix(&matrix_variable_name);
matrix_variable_name.print_matrix(&matrix_variable_name);
matrix_variable_name.free_matrix(&matrix_variable_name);
сделают код рабочим.
Но это все мелочи... Потому что главное — это неверный код в принципе. И дело даже не в том, что матрица располагается построчно, а у вас — постолбцово (но при этом выводится неверно — столбцы у вас располагаются как строки). Беда в том, что вы не поняли, зачем вообще классы. И вы передаете в функции указатель на объект матрицы, который передан уже и так! В результате получается "масло масляное".
Стоит убрать только эту неприятность, как код уже станет существенно проще и понятнее... Да, я сразу же уберу ваши чисто С-шные malloc/free и заменю их С++'ными new/delete, и поменяю местами строки и столбцы.
class Matrix {
public:
int columns;
int rows;
int **containment;
void function_name_of_init_action() {
containment = new int*[rows];
for (int i = 0; i < rows; ++i)
containment[i] = new int[columns];
}
void fill_matrix() {
for (int i = 0; i < rows; ++i)
for (int j = 0; j < columns; ++j)
containment[i][j] = (i==j); // fill with const == 1
}
void free_matrix() {
for (int i = 0; i < rows; ++i)
delete[] containment[i];
delete[]containment;
}
void print_matrix() {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < columns; ++j)
printf("%d ", containment[i][j]);
printf("\n");
}
}
};
int main() {
Matrix matrix_variable_name = {10, 10};
matrix_variable_name.function_name_of_init_action();
matrix_variable_name.fill_matrix();
matrix_variable_name.print_matrix();
matrix_variable_name.free_matrix();
}
Согласитесь, уже красивее?
Но это не все. После создания матрицы
Matrix matrix_variable_name = {10, 10};
ее надо обязательно инициализировать, так как в этот момент containment указывает в никуда! Работать с такой матрицей нельзя. Так что имеет смысл инициализировать ее сразу же — в конструкторе.
Как и освобождать — в деструкторе (вы уже получили неприятности с освобождением матрицы не-вовремя). Не будем даже ничего особо переписывать, просто будем вызывать функции где нужно.
Заодно исправим полную открытость вашего класса, спрятав то, к чему не стоит пускать посторонних.
И вот теперь этот код уже становится похожим на нормальный С++:
class Matrix {
private:
int columns;
int rows;
int **containment;
void free_matrix() {
for (int i = 0; i < rows; ++i)
delete[] containment[i];
delete[]containment;
}
void function_name_of_init_action() {
containment = new int*[rows];
for (int i = 0; i < rows; ++i)
containment[i] = new int[columns];
}
public:
Matrix(int r, int c):rows(r),columns(c)
{
function_name_of_init_action();
}
~Matrix()
{
free_matrix();
}
void fill_matrix() {
for (int i = 0; i < rows; ++i)
for (int j = 0; j < columns; ++j)
containment[i][j] = (i==j); // fill with const == 1
}
void print_matrix() {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < columns; ++j)
printf("%d ", containment[i][j]);
printf("\n");
}
}
};
int main() {
Matrix matrix_variable_name = {10, 10};
matrix_variable_name.fill_matrix();
matrix_variable_name.print_matrix();
}