Обычный способ отобразить целые числа на функции - это просто массив указателей на функции
typedef void (*Fun_ptr)(int id, void *current_byte);
Fun_ptr fun_ptr[0xFFFF+1] = { funcA, funcB, ...};
Если бы идентификаторы были только одним байтом, я бы отобразил все 256 (если это можно ограничить).
Даже со всеми 16-битными идентификаторами, это не много места для хранения.
Я бы указывал неиспользуемые идентификаторы на функцию «перехвата ошибок».
Использование:
next_buffer_position = fun_ptr[id](id, current_buffer_position);
Тогда функция знает, для какого идентификатора она была вызвана, что облегчает написание функции error_catch, вам нужен только один.
Вы уверены, что это AVAType * values;
и void * data;
?
values
или data
должно быть смещением в пакете?
Это не невозможно и может быть правильным. В настоящее время AVAType и AttributeList имеют фиксированный размер.
Поля AVAType * values;
и void * data;
- это размер принимающих компьютеров для указателя. Это может быть что угодно, но, скорее всего, 32 или 64 бит. Это потенциальная проблема, если вы перемещаете программное обеспечение на разные машины, и именно поэтому я спрашиваю. Они не содержат данных, они являются указателями на данные, но их размер варьируется в зависимости от принимающей машины. Suspicous. Дважды проверьте, какой размер они определены.
Распространенным способом обработки пакетов по сетевому протоколу является использование пустого массива в качестве последнего поля в структуре, например,
typdef struct {
uint16 id;
uint16 length;
unsigned char data[];
} AVAType;
В этом подходе обычно есть длина пакета в фиксированной позиции около начала пакета, и это дает фактический размер оставшейся части пакета. Таким образом, протокол определяет, является ли весь пакет или data[]
байтами длины. Это немного "хакерский", но он прост в использовании. (NB IIRC unsigned char data[];
не является законным C ++)
Резюме: Скорее всего, структуры в памяти - это именно те определения типов, которые вы показали, но протокол на проводе немного странный из-за переменного размера указателя.