Ако искам да декларирам указател към буфер и буферът съдържа множество различни типове (int, char и т.н.), тогава какъв тип трябва да направя указателя към буфера? празен *?
тип указател за буфер, който съдържа множество различни типове
Отговори (4)
От описанието ви изглежда, че се опитвате да проектирате своя собствена сериализация на различни типове в буфер (в реалния живот това по преносим начин е трудно и в повечето случаи е добре дефинирана библиотека за сериализация като протоколни буфери решава проблема).
В миналото в случаите, когато използвах персонализирано управление на буфери, видях три начина, по които хората управляват своите буфери
- void* и внимателно управлявайте компенсациите във вашия код
- char* и използвайте факта, че char* ще бъде байт.
- uint8_t* като преносим начин за четене на байт данни от буфера.
Не забравяйте, че ако разпределяте буфер за управление на различни типове данни, в крайна сметка ще прочетете внимателно байтовете и ще ги прехвърлите към подходящи типове. Харесвам третия подход като чист начин за четене на байтове от буфера и поддържане на подравняването на байтовете в буфера в процеса.
Под windows можете да използвате ВАРИАНТ. Под Linux можете да копирате relate
struct tagVARIANT
{
union
{
struct __tagVARIANT
{
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union
{
LONGLONG llVal;
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
_VARIANT_BOOL bool;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
LONGLONG *pllVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
_VARIANT_BOOL *pbool;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
ULONGLONG ullVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
ULONGLONG *pullVal;
INT *pintVal;
UINT *puintVal;
struct __tagBRECORD
{
PVOID pvRecord;
IRecordInfo *pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
} ;
Използвайте го като променлива като променливата в скриптовия език.
Ако искате един указател към колекция от различни типове, трябва да използвате структура:
struct T {
char C;
int I;
...
}
Бихте го използвали така:
T* ptr = &T();
ptr->C = "d";
ptr->I = 1337;