Вообщем на C# это выглядело бы так (без всяких указателей, мать их):
void foo1()
{
CvMat _h; // создаем объект
foo2(out _h); // передаем его в функцию, которая изменяет этот объект
foo3(_h); // измененный объект передаем сюда
}
void foo2(out CvMat _h)
{
_h = cvMat(3, 3, CV_64F); // инициализация
... работа с _h ...
}
Моя задача — это просто разделить имеющийся код одной функции на две функции
Так сообщение об ошибке ты опубликуешь или нет? И что за функция foo3 тоже не понятно. Пока на первый взгляд в приведенном тобой коде все нормально или ты все-таки чего-то недоговариваешь.
W>Так сообщение об ошибке ты опубликуешь или нет? И что за функция foo3 тоже не понятно. Пока на первый взгляд в приведенном тобой коде все нормально или ты все-таки чего-то недоговариваешь.
Это так, только если это Си. Я вот с этой библиотекой не знаком и даже не подумал гуглить имя функции.
Если про все это не знать — тут вполне можно подумать и на неexplicit конструктор. В заголовке темы С++, однако...
В любом случае слишком мало данных дал ТС, чтобы однозначно заявлять в чем он ошибся.
Я только начинаю учить С++. Не обращайте внимания, что используются объекты OpenCV ...
Вообщем ошибку дает функция foo3(). Это функция OpenCV, но это не имеет значения, так как она работает, если я не разделяю код, данная функция требует указатель на объект _h.
Вообщем у меня есть некий код, который работает таким образом:
Теперь, я хочу разделить работу программы на две функции:
void foo1()
{
CvMat _h; // создание объекта
foo2(& _h); // передача указателя в функцию
foo3(& _h); // И ВОТ тут возникает ошибка (то есть получается, что входные параметры неверные)
}
void foo2(CvMat * _h)
{
* _h = cvMat(3, 3, CV_64F); // инициализация
... работа с _h ...
}
На языке C#, который я более-менее знаю, разделение на 2 функции выглядело бы так:
void foo1()
{
CvMat _h; // создаем объект
foo2(out _h); // передаем его в функцию, которая изменяет этот объект
foo3(_h); // измененный объект передаем сюда
// вообщето, как я уже говорил foo3() требует указатель, но у меня вопрос другой - КАК разделить код на 2 функции - КАК правильно передать параметр
}
void foo2(out CvMat _h)
{
_h = cvMat(3, 3, CV_64F); // инициализация
... работа с _h ...
}
Здравствуйте, huntex, Вы писали:
H>Не обращайте внимания, что используются объекты OpenCV ...
Это как раз имеет значение, потому что проблема возможно кроется в особенностях данной библиотеки.
Здравствуйте, huntex, Вы писали:
H>Я только начинаю учить С++. Не обращайте внимания, что используются объекты OpenCV ...
Дык тебе же говорят: в таком виде как ты приводишь код — это должно работать правильно.
Возможно, что проблема в том, что твой объект имеет неоднозначно определенные конструкторы, операторы присваивания, операторы взятия адреса наконец...
Попробуй написать минимальную полную программу которая демонстрирует твою ошибку.
W>Это так, только если это Си. Я вот с этой библиотекой не знаком и даже не подумал гуглить имя функции. W>Если про все это не знать — тут вполне можно подумать и на неexplicit конструктор. В заголовке темы С++, однако...
CvMat и cvMat это разные идентификаторы. В opencv классы начинаются с префикса Cv, функции начинаются с префикса cv.
Потому что переменные в C# по умолчанию это ссылки на объекты. Это сделано для оптимизации передачи объектов и сборщика мусора.
А в С++ нужно всегда явно указывать тип переменной: указатель, ссылка или значение(по умолчанию) и вручную контролировать тип размещения в памяти: авто/стек(по умолчанию в функциях), статик или куча.
Ну и в данном пример нужно указатель на obj потом еще вернуть из функции или удалить(delete obj) в конце нее, иначе будет утечка памяти. Встроенного сборщика мусора в С++ пока нет.