Правильный способ вернуть матрицу из функции - PullRequest
1 голос
/ 03 августа 2011

У меня есть функция, которая вычисляет и «создает» матрицу.Моя функция работает хорошо, когда она встроена, но когда я пытаюсь поместить код в функцию, у меня возникают проблемы с возвратом матрицы результатов.

Я хочу, чтобы мой вызов функции был таким:

CvMat projectionResult;
project_on_subspace(&projectionResult);
cvShowImage("test", &projectionResult );

(в конечном итоге используя *CvMat вместо `CvMat)

Я сделал следующее:

void project_on_subspace(CvMat * source)
{
source = cvCreateMat( feature_positions[feature_number].height, feature_positions[feature_number].width, CV_32FC1 );    

//some more code
}

Но функция cvCreateMa t изменяет значениеуказатель источника, поэтому, когда я возвращаюсь из функции, матрица projectionResult не инициализируется.

Я знаю, что это действительно простой вопрос, но я не совсем понимаю, как заставить это работать?Возможно ли это сделать без изменения прототипа функции или мне нужно изменить его на **CvMat вместо *CvMat?

Редактировать: я предпочел бы вернуть свой результат, используя вуказатель на аргумент, вместо использования оператора return, но оба в порядке.

Ответы [ 2 ]

0 голосов
/ 03 августа 2011

Сделайте это вместо этого (при условии, что cvCreateMat не возвращает указатель на cvCreateMat):

void project_on_subspace(cvMat **source)
{
    *source = cvCreateMat(etc...);
    // etc...

И назовите его следующим образом:

CvMat *projectionResult;
project_on_surface(&projectionResult);

Не забудьте освободить projectionResultв свое время.

0 голосов
/ 03 августа 2011

CvMat * source означает, что вы не можете изменить адрес, на который указывает source, но можете изменить содержимое source.(Обратите внимание, что вы можете изменить его, он просто не изменится для вызывающего абонента).Если вам нужно изменить то, куда указывает source, вам нужно добавить еще один уровень косвенности, создающий CvMat ** source, который позволит вам изменить *source и повлиять на вызывающий метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...