0

私はswitchcaseステートメントを使用して、GameCenterマルチプレイヤーで受信しているデータを判別しています。

何が悪いのかわかりませんが、2番目の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;
    }
}
4

2 に答える 2

0

dataそれは確かSReadyPacket*ですか?nilまたは他のタイプである可能性があります。

于 2011-01-17T18:13:45.063 に答える
0

入ってくるデータが正確に何であるかを明確にする必要があります。SPacketInfoタイプを取得するために、最初は , として扱います。次に、 を含む他の 2 つの構造体の 1 つにキャストしますが、それ自体でSPacketInfoはありません。SPacketInfo次に、上記の構造体のメンバーにアクセスしようとすると、完全に未定義の場所にアクセスしています。

どちらpacketも実際にはパケット構造体です。その場合、スイッチを次のように変更する必要があります。

switch (packet->packetInfo->type)

または、それはSPacketInfoです。この場合、実際の「パケット」を別の方法で取得する必要があります。

于 2011-01-17T18:15:25.987 に答える