тип указател за буфер, който съдържа множество различни типове

Ако искам да декларирам указател към буфер и буферът съдържа множество различни типове (int, char и т.н.), тогава какъв тип трябва да направя указателя към буфера? празен *?


person user3800036    schedule 25.08.2014    source източник
comment
Как се съхраняват данните? двоичен? чувал ли си някога за TLV?   -  person PaperBirdMaster    schedule 25.08.2014
comment
Не мисля, че разполагаме с достатъчно информация, за да отговорим. Как определяте типа на съдържанието, когато използвате буфера, например? Както и да е, на пръв поглед изглежда, че преосмислянето на дизайна може да е наред.   -  person Angew is no longer proud of SO    schedule 25.08.2014
comment
Добавям съдържание към буфера с помощта на програма, наречена Game Maker Studio. Използвам GML (Game Maker Language) функция, наречена buffer_write за съхраняване на данни. Получавам адреса на буфера, като използвам buffer_get_address и предавам адреса в DLL, така че да имам достъп до буфера от DLL.   -  person user3800036    schedule 25.08.2014
comment
GM Studio използва само два типа: низ и реален. Вярвам, че те се превеждат съответно в char и double.   -  person user3800036    schedule 25.08.2014


Отговори (4)


Да void * е общият указател. Но трябва да го използвате с повишено внимание. Ако искате да използвате библиотека, тогава типът всеки на библиотеката boost е безопасен общ контейнер

person webNeat    schedule 25.08.2014

От описанието ви изглежда, че се опитвате да проектирате своя собствена сериализация на различни типове в буфер (в реалния живот това по преносим начин е трудно и в повечето случаи е добре дефинирана библиотека за сериализация като протоколни буфери решава проблема).

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

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

Не забравяйте, че ако разпределяте буфер за управление на различни типове данни, в крайна сметка ще прочетете внимателно байтовете и ще ги прехвърлите към подходящи типове. Харесвам третия подход като чист начин за четене на байтове от буфера и поддържане на подравняването на байтовете в буфера в процеса.

person jayadev    schedule 25.08.2014

Под 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;
    } ;

Използвайте го като променлива като променливата в скриптовия език.

person ravin.wang    schedule 25.08.2014
comment
Нямам представа как това помага по някакъв начин. - person devdot; 25.08.2014

Ако искате един указател към колекция от различни типове, трябва да използвате структура:

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

Бихте го използвали така:

T* ptr = &T();
ptr->C = "d";
ptr->I = 1337;
person devdot    schedule 25.08.2014
comment
Този последен раздел няма да се компилира. - person 0x499602D2; 25.08.2014