Я пытаюсь упростить мой код с помощью функции, которая генерирует массив CGPoints и возвращает указатель на первый элемент в этом массиве.
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
вызывает эту проблему?
РЕДАКТИРОВАТЬ
Следуя совету здесь Я изменил свою функцию, и передача указателя работает нормальносейчас.Проблема заключалась в возврате указателя на локальную переменную, которая не задерживалась долго.Вместо этого я использовал 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;
}