массив переменной длины в структуре с TI-компилятором в C (программирование сокетов) - PullRequest
0 голосов
/ 22 декабря 2018

Я пишу код, который работает с данными, полученными от udp на прикладном уровне.

Это прототип функции, используемый для получения данных от udp

int my_recv_UDP(int s,
                void* mem,
                int len,
                struct sockaddr* from,
                int fromlen);

, в котором он использует s как сокет, помещает данные в mem с длиной len и возвращает длину данных, значение которой может быть меньше len.

Например,

frameLen = my_recv_UDP(socket, rxBuf, 100, &ra, sizeof(ra));

, в которой оноиспользует socket в качестве сокета, помещает данные в rxBuf с длиной 100 и возвращает длину данных в frameLen.

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

Я намеревался создать тип данных с помощью структуры и позволить ptr этого типа структуры указывать наrxBuf. * ​​1023 *

т.е.:

typedef struct{
    int cmd;
    int data[?];    //you don't know the data length until you receive data
    int len;
}rxBuf_s;

Итак, я могу сделать это следующим образом.

rxBuf_s* rxBuf_p = rxBuf; 

С этим я могу легко "манипулировать" данными в rxBuf, дляНапример, если я хочу прочитать cmd в буфер:

int Cmd = rxBuf_p->cmd;

Но я будуЯ не знаю длину данных до тех пор, пока я ее не получу, я также не знаю, какое смещение это len, поэтому решил вычислить длину в «времени выполнения» и поместить ее в массив, например:

typedef struct{
    int cmd;
    int data[length];    //length is calculated in run time.
    int len;
}rxBuf_s;

Но VLA в структуре не допускается в C99.
Как я могу это сделать?Есть какой-нибудь умный способ сделать это?

1 Ответ

0 голосов
/ 22 декабря 2018

Таким образом, вы получаете cmd, data [length], len в указанном порядке в кадре.Как вы уже отметили, невозможно поймать это 1: 1, используя структуру C.По крайней мере, поле len должно быть извлечено другим способом, например

length = ...; // calculate length

int cmd = *(int*)rxBuf;
int *data = (int*)rxBuf + 1;
int len = *(data + length);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...