Проблема с оператором Switch Case

Я использую оператор switch case, чтобы определить, какие данные я получаю в многопользовательской игре Game Center.

Я не понимаю, что с этим не так, но при добавлении второго оператора case он перестает работать.

Я заявил это:

typedef enum
{
    kPacketTypeScore,
    kPacketTypeReady,
} EPacketTypes;

typedef struct
{
    EPacketTypes type;
    size_t size;
} SPacketInfo;

typedef struct
{
    SPacketInfo packetInfo;

    int score;
} SScorePacket;

typedef struct
{
    SPacketInfo packetInfo;

    bool ready;
} SReadyPacket;

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
{
    // first, assume it's the general SPacketInfo, that way we can access type and size
    packet = (SPacketInfo*)[data bytes];

    scoreData *scoreDat = [scoreData sharedData];
    BOOL rdyReceived;

    switch (packet->type)
    {
        case kPacketTypeScore:
        {
            SScorePacket* scorePacket = (SScorePacket*)packet;

            [scoreLabel setString:[NSString stringWithFormat:@"You: %d Challenger: %d", scoreDat.score, scorePacket->score]];

            break;
        }

        case kPacketTypeReady:
        {
            SReadyPacket* readyPacket = (SReadyPacket*)packet;

            rdyReceived = readyPacket->ready;

            if (rdyReceived == FALSE && scoreDat.mpRdy == TRUE) {
                [rdyLabel setString:@"Waiting for challenger..."];
            }

            if (rdyReceived == TRUE && scoreDat.mpRdy == FALSE) {
                [rdyLabel setString:@"Challenger is waiting... Ready?"];
            }

            if (rdyReceived == TRUE && scoreDat.mpRdy == TRUE) {
                [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:1.0 scene:[mpView node] withColor:ccWHITE]];
            }
            break;
        }

        default:
            CCLOG(@"received unknown packet type %i (size: %u)", packet->type, packet->size);
            break;
    }
}

person Josh Kahane    schedule 17.01.2011    source источник
comment
Вызывает сбой приложения с EXC_BAD_ACCESS.   -  person Josh Kahane    schedule 17.01.2011
comment
Вы обращаетесь к объекту, который был освобожден или больше не находится в памяти. Пожалуйста, используйте инструменты с включенным NSZombie, чтобы определить, что это за объект.   -  person Jesus Ramos    schedule 17.01.2011


Ответы (2)


Вы уверены, что data это SReadyPacket*? Это может быть nil или какой-либо другой тип.

person Ciprian L.    schedule 17.01.2011

Вам нужно уточнить, какие именно данные приходят. Сначала вы обрабатываете его как SPacketInfo, чтобы получить тип. Затем приведите его к одной из двух других структур, которые содержат SPacketInfo, но сами определенно не являются SPacketInfo. Затем, когда вы пытаетесь получить доступ к членам указанной структуры, вы получаете доступ к совершенно неопределенным местоположениям.

Либо packet на самом деле является структурой пакета, и в этом случае вы должны изменить свой переключатель на:

switch (packet->packetInfo->type)

Или это SPacketInfo, и в этом случае вам нужно будет получить фактический «пакет» каким-либо другим способом.

person bobDevil    schedule 17.01.2011