2011-12-31 13 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ですか?アドバイスhere

EDIT

私は私の機能を変更し、ポインタを渡すことになりました正常に動作します。問題は、長い間留めていなかったローカル変数へのポインタを返すことでした。代わりに、私は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

しかし、これは配列が機能する理由を説明しますが、ポインタはそうではありませんか? –

関連する問題