-
Интересует такая строка: LPPROFILEINTS lpProfileInts; Вот описание типа:
typedef enum PFDATATYPE;
typedef struct _PROFILEINTS PROFILEINTS, FAR *LPPROFILEINTS;
-
Блин, ещё и в теме ошибся :)
С PFDATATYPE всё понятно, это будет так:
type PFDATATYPE = (PFDT_INT, PFDT_DWORD, PFDT_STRING, PFDT_INTARRAY, PFDT_dwBITS, PFDT_SHORT, PFDT_BYTE);
единственный вопрос каждое значение имеет четырёхбайтовый размер?
type LPROFILEINTS = ^PROFILEINTS; PROFILEINTS = packed record offset: DWORD; defint: Integer; ids:DWORD; dt: PFDATATYPE; dwDefault: DWORD; end;
var lpProfileInts: LPROFILEINTS;
примерно так?
учитывая что я читаю lpProfileInts из файла, как эта переменная заполнится?
-
> EgorovAlex © (27.03.12 08:16) [1]
> единственный вопрос каждое значение имеет четырёхбайтовый размер?
В Delphi размер переменной перечислимого типа зависит от числа его элементов и директивы компилятора $Z (она же $MINENUMSIZE). По умолчанию используется $Z1, что соответствует минимальному выделению памяти под такие переменные. Так, если число элементов меньше 256 (как у Вас), то будет выделен 1 байт, если не указано $Z2 или $Z4. В C++, насколько я помню (но не уверен), под такие переменные отводится 4 байта. Так что перед объявлением типа я бы добавил {$MINENUMSIZE 4}.
Типы PROFILEINTS и LPROFILEINTS описаны верно.
> учитывая что я читаю lpProfileInts из файла, как эта переменная заполнится? Этот вопрос неясен.
-
А почему PROFILEINTS packed record?, там есть #pragma pack? Или они теперь все структуры packed?
-
нет, #pragma pack я не вижу, но моя переменная не сама по себе, а в другой структуре, такого вида:
typedef struct _SD SD, FAR *LPSD;
Так вот в файле BOOL занимает 4 байта
-
> нет, #pragma pack я не вижу, но моя переменная не сама по > себе, а в другой структуре, такого вида > Так вот в файле BOOL занимает 4 байта И какое отношение одно к другому имеет?
-
Ну это я так, для информации :), но спасибо за замечание, возможно packed лишнее
-
BOOL и должен занимать 4 байта, в отличие от Boolean.
-
Там ещё есть одна структура, которая объявлена перед моей, в ней есть BYTE и DWORD поля, так в файле BYTE занимает 1 байт, значит packed нужен?
-
-
> В C++, насколько я помню (но не уверен), под такие переменные отводится 4 байта.
- по умолчанию short(т.е. 2) > #pragma pack я не вижу
- самое веселое, когда эта прагма вдруг проявляется в каком нибудь левом заголовочнике, закопанном на несколько уровней включения - и перед включением целевого-интерфейсного, или тупо в опциях меняется - и все накрывается медным тазом... Поэтому как минимум #pragma pack( show ) - должно быть всегда. > так в файле BYTE занимает 1 байт
- ну дык - зависит от контекста
- при включенном выравнивании: b1 и b2 - будут "занимать" по 1-му байту b3 - 2 байта b4 - 4 байта(/Zp4) b5 - страшно сказать - 8 байт(при /Zp8, /Zp16)
-
> [2] begin...end © (27.03.12 09:00) > В C++, насколько я помню (но не уверен), под такие переменные > отводится 4 байта.
Выделяется размером с int.
-
> [10] han_malign (27.03.12 10:44) > по умолчанию short(т.е. 2)
Разве не int? Стандарта нет под рукой.
-
> Выделяется размером с int.
- int - для x86/64 - для обратной совместимости зафиксирован на 32-битном размере: "Type int is an integral type that is larger than or equal to the size of type short int, and shorter than or equal to the size of type long." Microsoft Specific int, unsigned int - 4 bytes
Т.е., для распространенных на текущий момент платформ - может быть только 2 и 4 байта(хотя не исключены эксклюзивы на 6, 8 и 12-бит)
-
В Windows.pas делают {$MINENUMSIZE 4}.
-
> Разве не int?
- а ну да, в ANSI С - enum это int...
Попутал... - это в DCE 1.1 (RPC): NDR represents enumerated types as signed short integers (2 octets).
-
Для UINT лучше использовать Longword, все таки fundamental type, в отличии от dword
|