Я пытаюсь упростить свой код с помощью функции, которая генерирует массив CGPoints и возвращает указатель на первый элемент в этом массиве.Передача CGPoint * вместо CGPoint [] недопустима?
CGPoint* getVerticesFromRect(const CGRect rect) {
CGPoint vertexArray[] =
{ ccp(rect.origin.x, rect.origin.y),
ccp(rect.origin.x + rect.size.width, rect.origin.y),
ccp(rect.origin.x + rect.size.width, rect.origin.y - rect.size.height),
ccp(rect.origin.x, rect.origin.y - rect.size.height) };
CGPoint *vertices = &vertexArray[0];
return vertices;
}
Эта работа правильно, но проблема возникает, когда я пытаюсь использовать этот CGPoint * в:
void ccDrawPoly(const CGPoint *poli, NSUInteger numberOfPoints, BOOL closePolygon)
Как так:
void ccDrawRect(const CGRect rect) {
CGPoint *vertices = getVerticesFromRect(rect);
// Makes an array from the pointed CGPoints
CGPoint vertexArray[] = {vertices[0], vertices[1], vertices[2], vertices[3]};
ccDrawPoly(vertexArray, 4, YES); // This works
ccDrawPoly(vertices, 4, YES); // This doesn't
}
Я обнаружил, что попытка прочитать *vertices
переменная в ccDrawRect
дает правильные значения, но я получаю значения мусора на другой стороне, передавая их в ccDrawPoly
. В чем причина этого? Из того, что я знаю, CGPoint * poli и CGPoint poli [] должны быть идентичными. Это проблема const
?
EDIT
Следуя советам here я изменил свою функцию, и теперь отлично передавая указатель работает. Проблема заключалась в возвращении указателя на локальную переменную, которая долго не задерживалась. Вместо этого я использовал malloc, и я освобождаю память в функции вызывающего абонента, когда она больше не нужна.
CGPoint* getVerticesFromRect(const CGRect rect) {
CGPoint *vertices = (CGPoint*) malloc(sizeof(CGPoint) * 4);
assert(vertices);
vertices[0] = ccp(rect.origin.x, rect.origin.y);
vertices[1] = ccp(rect.origin.x + rect.size.width, rect.origin.y);
vertices[2] = ccp(rect.origin.x + rect.size.width, rect.origin.y - rect.size.height);
vertices[3] = ccp(rect.origin.x, rect.origin.y - rect.size.height);
return vertices;
}
void ccDrawRect(const CGRect rect) {
CGPoint *vertices = getVerticesFromRect(rect);
ccDrawPoly(&vertices[0], 4, YES);
free(vertices);
vertices = NULL;
}
В этом случае это должно быть 'malloc' и' free'. C, а не C++ :) – Sulthan
Lol, это было слишком долго, мне было интересно, куда будет входить управление памятью. Благодаря! –
Но как это объясняет, почему массив работает, но указатель этого не делает? –