Я пытаюсь построить программу на C ++, которая много работает с матрицами и функциями матриц. Мой код компилируется нормально, но когда я пытаюсь выполнить его, я получаю сообщение:
Ошибка сегментации (ядро сброшено)
Мой код имеет много функций, которые выглядят так:
void function(double **matrix, ...) {
//Operations with the matrix
}
И я называю функции так:
double **M;
function(M,...);
Исследуя сообщение, я обнаружил, что мне нужно динамически распределять матрицы, которые я собираюсь использовать, поэтому написал следующие функции, которые должны выполнять это распределение:
void allocMatrix(double **M, int nl, int nc) {
M = new double*[nl];
for(int i = 0; i < nl; ++i)
M[i] = new double[nc];
}
void freeMatrix(double **M, int nl) {
for(int i = 0; i < nl; ++i)
delete [] M[i];
delete [] M;
}
Теперь с этими функциями я попытался вызвать другие мои функции следующим образом:
double **M;
allocMatrix(M, numberOfLines, numberOfColumns);
function(M,...);
freeMatrix(M, numberOfLines);
Однако даже с этим изменением я получаю сообщение «Ошибка сегментации (ядро сброшено)».
Я даже пытался выделить матрицу внутри функций следующим образом:
void function(double **matrix, ...) {
allocMatrix(M, numberOfLines, numberOfColumns);
//Operations with the matrix
freeMatrix(M, numberOfLines);
}
Но это не сработало.
Кто-нибудь знает, где я не правильно понимаю?
Вам нужно пройти double ***
в списке параметров и отправить &M
(адрес M
) в вызове. Без этого ваш M
не имеет матрицы, и вы получаете ошибку сегмента в другой функции.
Вы в настоящее время передаете копию M
в allocMatrix
, Память, которую вы выделяете здесь, просачивается, когда функция возвращается. Вам нужно передать указатель на M
если вы хотите, чтобы переменная вызывающего была изменена
double **M;
allocMatrix(&M, numberOfLines, numberOfColumns);
function(M,...);
freeMatrix(M, numberOfLines);
void allocMatrix(double ***M, int nl, int nc) {
*M = new double*[nl];
for(int i = 0; i < nl; ++i)
(*M)[i] = new double[nc];
}
Поскольку вы пишете C ++, почему бы не использовать vector
?
#include <vector>
int main()
{
// This does what your "allocMatrix" does.
std::vector< std::vector<double> > M(numberOfLines, numberOfColumns);
// Look Ma! No need for a "freeMatrix"!
}