Передать указатель на первый пакет между методами (Obj-C) - PullRequest
0 голосов
/ 05 января 2012

Я что-то здесь упускаю, но я не уверен, как это исправить.Первая версия этого работает:

- (void) sendBytes:(const UInt8*)bytes size:(UInt32)size
{
    Byte packetBuffer[size+100];
    MIDIPacketList *packetList = (MIDIPacketList*)packetBuffer;
    MIDIPacket     *packet     = MIDIPacketListInit(packetList);
    MIDIPacketListAdd(packetList, sizeof(packetBuffer), packet, 0, size, bytes);
    [self sendPacketList:packetList];
}

Для DRYness я пытаюсь создать метод создания списка пакетов:

- (MIDIPacketList*) makePacketList:(const UInt8*)data size:(UInt32)size
{
    Byte packetBuffer[size+100];
    MIDIPacketList *packetList = (MIDIPacketList*)packetBuffer;
    MIDIPacket     *packet     = MIDIPacketListInit(packetList);
    MIDIPacketListAdd(packetList, sizeof(packetBuffer), packet, 0, size, data);
    return packetList;
}


- (void) sendBytes:(const UInt8*)bytes size:(UInt32)size
{
    MIDIPacketList *packetList = [self makePacketList:bytes size:size];
    [self sendPacketList:packetList];
}

И теперь метод sendPacketList завершается неудачноEXC_BAD_ACCESS.Используя GDB, packetList все еще выглядит хорошо даже в пределах sendPacketList ...

Глядя на документы , кажется, что то, что я передаю, это просто указатель напервый пакет в списке.Итак ... как я могу это сделать?

1 Ответ

2 голосов
/ 06 января 2012

Проблема в том, что Byte packetBuffer[size+100] объявляет локальный массив, к которому нельзя обращаться после выхода из этого метода.У вас есть два варианта (которые я напишу как функции):

Вариант 1:

MIDIPacketList *makePacketList(const UInt8 *data, UInt32 size) {
    Byte *packetBuffer = malloc(size + 100);
    MIDIPacketList *packetList = (MIDIPacketList*)packetBuffer;
    MIDIPacket     *packet     = MIDIPacketListInit(packetList);
    MIDIPacketListAdd(packetList, sizeof(packetBuffer), packet, 0, size, data);
    return packetList;
}

Если вы сделаете это таким образом, вам придется free() буфер позжеon, что является своего рода болью.

Вариант 2:

MIDIPacketList *makePacketList(Byte *packetBuffer, const UInt8 *data, UInt32 size) {
    MIDIPacketList *packetList = (MIDIPacketList*)packetBuffer;
    MIDIPacket     *packet     = MIDIPacketListInit(packetList);
    MIDIPacketListAdd(packetList, size + 100, packet, 0, size, data);
    return packetList;
}

В этом случае вам придется объявить Byte packetBuffer[size + 100] вне функции и передать его какпервый аргумент, который также несколько неудобен.

...