(btw Мне не разрешено malloc в этом, я пишу в c для c99) Я пытаюсь создать структуру-оболочку в c для массивов, чтобы держать вещи в порядке, поэтому Мне не нужно, чтобы сохранить прохождение указателя массива и длину вокруг, и может просто использовать:-структуруc array wrapper struct no malloc allowed
#define MAX_LEN 64
typedef struct {
uint8_t data[MAX_LEN];
size_t len;
} byteArray_t;
это хорошо, если max_len известно, но есть способ сделать переменную длину хотя и известны во время компиляции, так что, например, у меня могло бы быть что-то вроде:
typedef struct {
byteArray_t tag;
byteArray_t length;
byteArray_t value;
} tlv_t;
В котором массив соответствующий tag
будет иметь размер MAX_TAG_LEN
и т. д. для остальных - так что мне нужно было сказать компилятору, что это так ...
У кого-нибудь есть идеи? Благодаря!
Редактировать
Хорошо, извините за путаницу. Вот что я пытаюсь сделать. я в основном имеют следующие структуры в настоящее время:
// tag object
typedef struct {
uint8_t data[MAX_TAG_LENGTH_IN_BYTES];
uint32_t len;
} tlvTag_t;
// length object
typedef struct {
uint8_t data[MAX_LENGTH_OF_LENGTH_IN_BYTES];
uint32_t len;
} tlvLength_t;
typedef struct tlv tlv_t;
// value object definition
typedef struct {
// can consist of a byte array, or a list of sub TLVs
union {
uint8_t data[MAX_VALUE_LENGTH_IN_BYTES];
// data can be parsed into subTLVs
tlv_t* subTLVs;
};
// need to store the number of subTLVs
uint32_t numberOfSubTLVs;
// len is the total length of the data represented:
// the total length of the subTLVs placed end to end
// or the length of the data array.
uint32_t len;
} tlvValue_t;
// tlv object definition
struct tlv {
tlvTag_t tag;
tlvLength_t len;
tlvValue_t value;
// total length of entire tlv block (not value length)
// (if there are sub TLVs, place them end to end)
uint32_t totalLen;
};
Я думал, что дизайн был бы лучше, если бы я мог обернуть массивы в другой структуры, чтобы избежать всех дублирования кода и быть в состоянии пройти меньше аргументов вокруг, но я не может, потому что я не знаю, как сообщить компилятору о создании массивов байтов разного размера - возможно, это возможно с помощью макросов? Надеюсь, это имеет смысл.
Компиляторы принимают переключатель, определяющий макрос. Проверьте документацию для своего компилятора, которая разрешила бы это (например, '/ D' для MSVC). – hmjd
Как именно это _more_ аккуратно, чем просто прохождение простого указателя и переменной простого размера? Чего вы пытаетесь достичь? – Lundin