тип указателя для буфера, который содержит несколько различных типов

0

Если я хочу объявить указатель на буфер, а буфер содержит несколько разных типов (int, char и т.д.), Тогда какой тип я должен сделать указателем на буфер? void *?

  • 1
    Как хранятся данные? двоичная? Вы когда-нибудь слышали о TLV ?
  • 0
    Я не думаю, что у нас достаточно информации, чтобы ответить. Как вы определяете тип содержимого при использовании буфера, например? В любом случае, на первый взгляд кажется, что дизайн может быть в порядке.
Показать ещё 2 комментария
Теги:
pointers
buffer

4 ответа

2
Лучший ответ

Да void * - общий указатель. Но вы должны использовать его с осторожностью. Если вы хотите использовать библиотеку, то любой тип библиотеки boost - это безопасный общий контейнер

1

Из вашего описания это похоже на то, что вы пытаетесь создать свою собственную сериализацию различных типов в буфер (в реальной жизни это сделать переносимым способом сложно, и в большинстве случаев хорошо определенная библиотека сериализации, такая как протокольные буферы, решает проблему).

В прошлом, когда я использовал пользовательское управление буфером, я видел три способа управления своими буферами

  1. void * и тщательно управлять смещениями в вашем коде
  2. char * и использовать тот факт, что char * будет байтом.
  3. uint8_t * в качестве переносного способа чтения байта данных из буфера.

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

0

Под окнами вы можете использовать VARIANT. В Linux вы можете скопировать ссылку

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;
    } ;

Используйте его как переменную, как переменную в языке скриптов.

  • 0
    Я понятия не имею, как это помогает в любом случае.
-1

Если вам нужен один указатель на коллекцию разных типов, вы должны использовать struct:

struct T {
  char C;
  int I;
  ...
}

Вы бы использовали его так:

T* ptr = &T();
ptr->C = "d";
ptr->I = 1337;
  • 0
    Последний раздел не скомпилируется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню