2012-02-14 5 views
0

私はCCMenuクラスを使っています。このクラスでメニューを作成するには、initWithItemsというメソッドを呼び出す必要があります。このメソッドはva_listをとります。私は実行時にこのリストを生成する必要があり、C配列を作成し、それを渡すことは、va_listがカバーの下にあるように機能することを読むだけで、失敗するだけです。Cocos2D CCMenu menuWithItemsの実行時に、どのようにva_listを動的に正しく作成しますか?

私はva_listに必要なアイテムのNSArrayを持っています。これらのアイテムは、menuWithItemsがva_listで期待しているCCMenuItemのSUBCLASSです。コンパイル時にこのリストをハードコーディングするとうまくいきますが、このリストを動的に作成しようとする試みは機能しません。これには何が問題なのですか? MenuItemButtonはCCMenuItemサブクラスです。

NSArray *menuItems = [self getMenuItemsArray]; // Returns an NSArray of MenuItemButtons 
MenuItemButton *argList = (MenuItemButton *)malloc(sizeof(MenuItemButton *) * [menuItems count]); 
[menuItems getObjects:(id *)argList]; 
CCMenuAdvanced* menu = [CCMenuAdvanced menuWithItems:argList]; 

これはBAD_ACCESS、実行時にクラッシュします。私は、va_listがnullで終了するはずであることを知っています。getObjectsを呼び出した後、ここに自分のコードがあるかどうか、あるいはそれが問題であるかどうかはわかりません。

答えて

0

va_listは必ずしも配列ではありません。 32ビットgccでは、64ビットではありません。それに頼らないでください。

va_list可変個の引数を取得する機能によって生成された:あなたは単にnilを使用してメニューを初期化することができ

#include <stdarg.h> 
void f(int x, ...) { 
    va_list va; 
    va_start(va, x); 
    function_that_wants_va(va); 
    va_end(va); 
} 
void g(void) { 
    f(1,2,3,4); 
} 
+0

コードはiPhoneのみのためです....してみてください、あなたは、実行時にロードされた文字列の動的なリストを持っていると言います。あなたが書いたことから、私が尋ねた質問は、コンパイル時に引数の数が分からないときに、関数fをRUNTIMEでどのように呼び出すかということでした。私が質問する方法を変更する必要がありますか? –

+0

iPhone固有のものがあるかどうかわかりません。一般的にCとは、私は良い方法を知らない。あなたは常に最大数を渡すことができます(余分な引数は関係ありません)。また、この醜い事のために行くことができます: 'switch(n){case 1:f(1、a [0]); break;ケース2:f(2、a [0]、a [1]);ブレーク; ...} ' – ugoren

+0

実際には私はそれを行うことはできません。その件数は不明です。ディレクトリファイルの正規表現と一致するファイルの数に基づいています。人を試してくれてありがとう、ありがとう! –

2

。例えば、

CCMenu * myMenu = [CCMenuAdvanced menuWithItems:nil]; 

はその後

// replace this with a dynamically loaded array of items... 
NSArray* dynamicArray = [NSArray arrayWithObjects:@"red", @"blue", @"green", nil]; 


for (NSString* item in dynamicArray) 
{ 
    CCMenuItem *menuItem = [CCMenuItemFont itemFromString: item target: self  selector:@selector(menuCallback:)]; 
    [myMenu addChild:menuItem]; 
}