Как правильно создать динамический список va_list во время выполнения для Cocos2D CCMenu menuWithItems? - PullRequest
0 голосов
/ 15 февраля 2012

У меня чертовски много времени с классом CCMenu.Чтобы создать меню с этим классом, он заставляет вас вызывать метод initWithItems, который принимает va_list.Мне нужно сгенерировать этот список во время выполнения, и я прочитал, что создание массива C и передача, которая может функционировать так же, как va_list, работает под прикрытием, только это не удается.

У меня есть NSArray элементов, которые я хочу вva_list, и эти элементы являются ПОДКЛАССОМ CCMenuItem, класса, который menuWithItems ожидает в va_list.Если вы жестко закодировали этот список во время компиляции, он работает нормально, но моя попытка создать этот список динамически не работает.Что не так с этим?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 должен завершаться нулем, я не знаю, так ли это с моим кодом после вызова getObjects, или это даже проблема.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Вы можете просто инициализировать меню, используя ноль. Например,

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];
}
0 голосов
/ 15 февраля 2012

va_list не всегда массив. С 32-битным gcc это так, с 64-битным - нет. Не надейся на это.

va_list генерируется функцией, которая получает переменное число аргументов:

#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);
}
...