Ошибка сегментации (дамп ядра) в Ubuntu с матричными функциями в переполнении стека

Я пытаюсь построить программу на 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);
}

Но это не сработало.

Кто-нибудь знает, где я не правильно понимаю?

0

Решение

Вам нужно пройти double *** в списке параметров и отправить &M (адрес M) в вызове. Без этого ваш M не имеет матрицы, и вы получаете ошибку сегмента в другой функции.

2

Другие решения

Вы в настоящее время передаете копию 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];
}
2

Поскольку вы пишете 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"!
}
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector