Отправка строк C, содержащихся в структурах, через игровой центр - PullRequest
0 голосов
/ 03 августа 2011

Я пытаюсь отправить сообщение с игровым центром, которое содержит структуру, примерно следуя руководству Рея Рэя Вендерлиха. В общем, отправка и получение сообщений не было проблемой, но когда я что-то добавляю с указателем, я немного запутался. Цель состоит в том, чтобы отправить несколько строк и BOOL как одно сообщение. Соответствующий код следует:

//myfile.h
typedef enum {
    kMessageTypeRandomNumber = 0,
    kMessageTypeInterstitial
} MessageType;
typedef struct {
    MessageType messageType;
} Message;
typedef struct {
    Message message;
    char *playerName;
    char *scores;
    BOOL correct;
    char *stat;
} MessageInterstitial;


//myfile.m
- (void)sendData:(NSData *)data {
    NSError *error;
    BOOL success = [[GCHelper sharedInstance].match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error];
    if (!success) {
        NSLog(@"Error sending init packet:\n%@",error);
    }
}
-(void)send{
    MessageInterstitial message;
    message.message.messageType = kMessageTypeInterstitial;
    message.playerName="test";
    NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageInterstitial)];    
    [self sendData:data]; 
    MessageInterstitial * myMessage = (MessageInterstitial *) [data bytes];
    printf("player: %s\n",myMessage->playerName); // prints 'player: test' as expected
}
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
    Message *message = (Message *) [data bytes];
    if(message->messageType == kMessageTypeInterstitial)
    {
        MessageInterstitial * myMessage = (MessageInterstitial *) [data bytes];
        printf("player: %s\n",myMessage->playerName); //prints 'player: ' not expected
    }
}

Похоже, что данные сохраняются правильно, так как я могу распечатать их сразу же без проблем, но я думаю, что данные указывают на адрес в памяти, что делает его таким, чтобы он печатал правильная вещь на отправляющем устройстве, но не на принимающем устройстве. При этом я понятия не имею, как это исправить или как мне следует отправлять строки в структуре, если это действительно так.

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Действительно, это похоже на проблему, адреса - это адреса в отправляющем устройстве, а не в принимающем устройстве.Вместо этого вы можете использовать массивы символов и просто выделить достаточно места с самого начала.Таким образом, они будут частью структуры:

// those are just examples of course...
typedef struct {
    Message message;
    char playerName[30];
    char scores[30];
    BOOL correct;
    char stat[15];
} MessageInterstitial;
1 голос
/ 20 октября 2013

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

0 голосов
/ 02 июня 2014

Немного стар, но я добавлю свои 2 цента.

Когда я перешел с char * на char string[30], мне пришлось увеличить длину, когда я инициализировал свой NSData.Кроме того, прямое назначение массива символов невозможно.Вы должны либо перебрать строку и вставить символы один за другим, либо использовать strcpy, как я делал ниже.

Вот как это наконец выглядело для меня:

- (void)sendRandomWord:(NSString*)randomWord{
    MessageRandomWord message;
    message.message.messageType = kMessageTypeRandomWord;

    strcpy( message.randomWord, randomWord.UTF8String );

    NSData *data = [NSData dataWithBytes:&message length:sizeof(kMessageTypeRandomWord) + strlen(message.randomWord)*sizeof(char)];
    [self sendData:data];
}
...