Передача CGPoint * вместо CGPoint [] недействительна? - PullRequest
1 голос
/ 31 декабря 2011

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

1 Ответ

3 голосов
/ 31 декабря 2011

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

Вместо выделения массива в стеке, как вы это делаете:

CGPoint vertexArray[] = ...

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...