2011-12-31 3 views
1

Я пытаюсь упростить свой код с помощью функции, которая генерирует массив 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; 
} 

ответ

3

Вы используете локальную переменную за пределами ее объема.

Вместо того, чтобы выделить массив на стеке, как и вы:

CGPoint vertexArray[] = ... 

Вы должны использовать функцию malloc и создать динамически выделенный массив. Не забывайте, конечно, free.

(Это действительно C?)

+0

В этом случае это должно быть 'malloc' и' free'. C, а не C++ :) – Sulthan

+0

Lol, это было слишком долго, мне было интересно, куда будет входить управление памятью. Благодаря! –

+0

Но как это объясняет, почему массив работает, но указатель этого не делает? –