2013-06-16 4 views
4

Почему я не могу пройтиКак передать MyClass [] [] для MyClass **?

Point src[1][4] = { 
     { 
      Point(border,border), Point(border,h-border), Point(w-border,h-border), Point(w-border,h-border) 
     } 
    }; 

в

polylines(frame, src, ns, 1, true, CV_RGB(255,255,255), 2); 

где

полилинии имеет прототип

void polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0) 

UPDATE

Хорошо, ладно, я вспомнил этот материал :)

+1

Что ошибка вы получаете? – RageD

ответ

2

Потому что это не одно и то же. polylines запрашивает указатель указателей до Point, но вы даете ему указатель на массив [4] из Point.

Перефразированный: когда вы используете src как выражение, подобное этому, оно распадается из массива в указатель. В этом случае он будет спадать от Point[1][4] до Point(*)[4], то есть указателя на массив размером 4 типа Point. Это расположение памяти объектов 4 Point. polylines ожидает расположение памяти указатель до объекта Point.

4

Point[1][4] не может быть преобразован в Point** таким образом.
Посмотрите на этот вопрос: Converting multidimensional arrays to pointers in c++

Фактическое решение здесь состоит в использования STL контейнера вместо массива C-стиле, например, std::vector:

typedef std::vector<Point> Shape; 
std::vector<Shape> myShapes; 
... 

и передать его const ссылкой вместо const указателя:

void polylines(Mat& img, const std::vector<Shape>& shapes, ...) 

Также отметим, что src, ns, pts и т.д., не очень повезло имена для ваших переменных. Попытайтесь выбрать более значимые имена ... если не для вас самих, то сделайте это ради будущих читателей этого кода :)

1

Массивы массивов и указатели на указатели не подразумевают одинаковые макет памяти. Массив массива содержит все его элементы смежно, тогда как указатель на указатели требует массив смежных указателей, которые указывают на (возможно, несмежные) массивы смежных элементов.

Чтобы сделать это преобразование, вам нужно будет выделить массив указателей и указать их на правильные записи в массиве массивов. В вашем случае, поскольку у вас есть один набор значений, это еще проще:

Point * pointer = &src[0][0]; 
int npts = 4; 
polylines(img, &pointer, &npts, 1, ...); 

Предполагая ncontours это число указателей на которых указатель на указатель точки и npts это количество точек, к которым индивидуальные указатели.

Смежные вопросы