C++ и указатели
От: huntex http://troyashka.ru/
Дата: 24.01.11 14:20
Оценка:
Всем привет! Есть следующий РАБОЧИЙ код:

void foo1()
{
   CvMat _h = cvMat(3, 3, CV_64F); // инициализация;
   
   ... работа с _h ... 
   
   foo3(*_h); // верный результат!
}


Теперь пытаюсь разделить код на 2 функции

void foo1()
{
   CvMat _h;
   
   foo2(& _h);
   
   foo3(*_h); // ошибка!
}

void foo2(CvMat * _h)
{
   * _h = cvMat(3, 3, CV_64F); // инициализация
   
   ... работа с _h ...   
}
Re: C++ и указатели
От: Lorenzo_LAMAS  
Дата: 24.01.11 14:24
Оценка:
Сообщение об ошибке? Объявления функций? Приведенного кода недостаточно.
Of course, the code must be complete enough to compile and link.
Re[2]: C++ и указатели
От: huntex http://troyashka.ru/
Дата: 24.01.11 14:39
Оценка: :)
у меня ошибочка вышла ... вот как выглядит код:

void foo1()
{
   CvMat _h = cvMat(3, 3, CV_64F); // инициализация;
   
   ... работа с _h ... 
   
   foo3(& _h); // верный результат!
}


Теперь пытаюсь разделить код на 2 функции

void foo1()
{
   CvMat _h;
   
   foo2(& _h);
   
   foo3(& _h); // ошибка!
}

void foo2(CvMat * _h)
{
   * _h = cvMat(3, 3, CV_64F); // инициализация
   
   ... работа с _h ...   
}


Вообщем на C# это выглядело бы так (без всяких указателей, мать их):

void foo1()
{
   CvMat _h; // создаем объект
   
   foo2(out _h); // передаем его в функцию, которая изменяет этот объект
   
   foo3(_h); // измененный объект передаем сюда
}

void foo2(out CvMat _h)
{
   _h = cvMat(3, 3, CV_64F); // инициализация
   
   ... работа с _h ...   
}


Моя задача — это просто разделить имеющийся код одной функции на две функции
Re[3]: C++ и указатели
От: wander  
Дата: 24.01.11 15:00
Оценка:
Здравствуйте, huntex, Вы писали:

Так сообщение об ошибке ты опубликуешь или нет? И что за функция foo3 тоже не понятно. Пока на первый взгляд в приведенном тобой коде все нормально или ты все-таки чего-то недоговариваешь.

Ну так что, телепату знакомому звонить?
Re[4]: C++ и указатели
От: dilmah США  
Дата: 24.01.11 15:06
Оценка: +1
W>Так сообщение об ошибке ты опубликуешь или нет? И что за функция foo3 тоже не понятно. Пока на первый взгляд в приведенном тобой коде все нормально или ты все-таки чего-то недоговариваешь.

здесь очень подозрительно:

 CvMat _h = cvMat(3, 3, CV_64F); // инициализация;


в opencv оперируют с CvMat*




_h = cvMat(3, 3, CV_64F); // инициализация


это присваивание, а не инициализация..
Re[5]: C++ и указатели
От: wander  
Дата: 24.01.11 15:20
Оценка:
Здравствуйте, dilmah, Вы писали:

D>здесь очень подозрительно:


D>
 CvMat _h = cvMat(3, 3, CV_64F); // инициализация;


D>в opencv оперируют с CvMat*


Не знаю, не знаю. Вот строка кода из документации.
CvMat normalValueMat = cvMat(bufferSize, 1, CVg32F, normalValueBuffer);


D>
_h = cvMat(3, 3, CV_64F); // инициализация

D>это присваивание, а не инициализация..

Это так, только если это Си. Я вот с этой библиотекой не знаком и даже не подумал гуглить имя функции.
Если про все это не знать — тут вполне можно подумать и на неexplicit конструктор. В заголовке темы С++, однако...

В любом случае слишком мало данных дал ТС, чтобы однозначно заявлять в чем он ошибся.
Re: C++ и указатели
От: stbzh  
Дата: 24.01.11 15:33
Оценка:
Здравствуйте, huntex, Вы писали:

H>Всем привет! Есть следующий РАБОЧИЙ код:


H>
H>void foo1()
H>{
H>   CvMat _h = cvMat(3, 3, CV_64F); // вызывается конструктор, а затем еще и конструктор копии
   
H>   ... работа с _h ... 
   
H>   foo3(*_h); // верный результат!
H>}
H>


H>Теперь пытаюсь разделить код на 2 функции


H>
H>void foo1()
H>{
H>   CvMat _h;
   
H>   foo2(& _h);
   
H>   foo3(*_h); // ошибка!
H>}

H>void foo2(CvMat * _h)
H>{
H>   * _h = cvMat(3, 3, CV_64F); // а здесь assignment - вызывается operator=
   
H>   ... работа с _h ...   
H>}
H>


Ищи разницу в реализациях конструктора копии и оператора пристваивания.
Re[6]: C++ и указатели
От: huntex http://troyashka.ru/
Дата: 24.01.11 15:43
Оценка:
Я только начинаю учить С++. Не обращайте внимания, что используются объекты OpenCV ...
Вообщем ошибку дает функция foo3(). Это функция OpenCV, но это не имеет значения, так как она работает, если я не разделяю код, данная функция требует указатель на объект _h.

Вообщем у меня есть некий код, который работает таким образом:

void foo1()
{
   CvMat _h = cvMat(3, 3, CV_64F); // присваивание
   
   ... работа с _h ... 
   
   foo3(& _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 ...   
}
Re[7]: C++ и указатели
От: wander  
Дата: 24.01.11 16:06
Оценка:
Здравствуйте, huntex, Вы писали:

H>Не обращайте внимания, что используются объекты OpenCV ...

Это как раз имеет значение, потому что проблема возможно кроется в особенностях данной библиотеки.

Попробуй так:
void foo1()
{
   CvMat _h = cvMat(3, 3, CV_64F);
   
   foo2(& _h);
   
   foo3(& _h);
}

void foo2(CvMat * _h)
{
   ... работа с _h ...   
}
Re[7]: C++ и указатели
От: wander  
Дата: 24.01.11 16:08
Оценка:
Здравствуйте, huntex.

Еще было бы здорово (если это возможно) посмотреть оригинальный код с проблемой, а не выжимку. Было бы проще понять кто тут виноват и что делать.
Re[7]: C++ и указатели
От: stbzh  
Дата: 24.01.11 16:08
Оценка:
Здравствуйте, huntex, Вы писали:

H>Я только начинаю учить С++. Не обращайте внимания, что используются объекты OpenCV ...


Дык тебе же говорят: в таком виде как ты приводишь код — это должно работать правильно.
Возможно, что проблема в том, что твой объект имеет неоднозначно определенные конструкторы, операторы присваивания, операторы взятия адреса наконец...
Попробуй написать минимальную полную программу которая демонстрирует твою ошибку.
Re[2]: C++ и указатели
От: huntex http://troyashka.ru/
Дата: 24.01.11 17:27
Оценка:
Вообщем просто скажите как будет выглядеть на С++ такой код (на C#):

void foo1()
{
   object obj;
   
   foo2(out obj);
   
   foo3(obj);
}

void foo2(out object obj)
{
   obj = new object();   
}
Re[6]: C++ и указатели
От: dilmah США  
Дата: 24.01.11 17:34
Оценка:
W>Это так, только если это Си. Я вот с этой библиотекой не знаком и даже не подумал гуглить имя функции.
W>Если про все это не знать — тут вполне можно подумать и на неexplicit конструктор. В заголовке темы С++, однако...

CvMat и cvMat это разные идентификаторы. В opencv классы начинаются с префикса Cv, функции начинаются с префикса cv.
Re[3]: C++ и указатели
От: DesertDragon Россия  
Дата: 25.01.11 04:05
Оценка:
Здравствуйте, huntex, Вы писали:

H>Вообщем просто скажите как будет выглядеть на С++ такой код (на C#):

H>
void foo1()
{
   object obj;
   
   foo2(out obj);
   
   foo3(obj);
}

void foo2(out object obj)
{
   obj = new object();   
}


Вот так :
void foo1()
{
   object* obj;  

   foo2(obj);   

   foo3(obj);
}

void foo2(object*& obj)
{
   obj = new object();   
}
Re[4]: C++ и указатели
От: DesertDragon Россия  
Дата: 25.01.11 05:29
Оценка:
Потому что переменные в C# по умолчанию это ссылки на объекты. Это сделано для оптимизации передачи объектов и сборщика мусора.
А в С++ нужно всегда явно указывать тип переменной: указатель, ссылка или значение(по умолчанию) и вручную контролировать тип размещения в памяти: авто/стек(по умолчанию в функциях), статик или куча.
Ну и в данном пример нужно указатель на obj потом еще вернуть из функции или удалить(delete obj) в конце нее, иначе будет утечка памяти. Встроенного сборщика мусора в С++ пока нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.