私は、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;
}
この場合は、 'malloc'と' free'である必要があります。 Cではなく、C++ :) – Sulthan
Lol、それは長すぎる、私はメモリ管理がこれに入ると思っていた。ありがとう! –
しかし、これは配列が機能する理由を説明しますが、ポインタはそうではありませんか? –