Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
ВнизПортирование из сишного файла, проверьте правильность Найти похожие ветки
← →
trubin © (2008-01-27 20:26) [0]typedef enum _STORAGE_MEDIA_TYPE {
DDS_4mm = 0x20, // Tape - DAT DDS1,2,... (all vendors)
CD_ROM, // Opt_Disk - CD
CD_R, // Opt_Disk - CD-Recordable (Write Once)
CD_RW, // Opt_Disk - CD-Rewriteable
DVD_ROM, // Opt_Disk - DVD-ROM
DVD_R, // Opt_Disk - DVD-Recordable (Write Once)
DVD_RW // Opt_Disk - DVD-Rewriteable
} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
typedef enum _STORAGE_BUS_TYPE {
BusTypeUnknown = 0x00,
BusTypeScsi,
BusTypeAtapi,
BusTypeAta,
BusType1394,
BusTypeSsa,
BusTypeFibre,
BusTypeUsb,
BusTypeRAID,
BusTypeMaxReserved = 0x7F
} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
typedef struct _DEVICE_MEDIA_INFO {
union {
struct {
LARGE_INTEGER Cylinders;
STORAGE_MEDIA_TYPE MediaType;
DWORD TracksPerCylinder;
DWORD SectorsPerTrack;
DWORD BytesPerSector;
DWORD NumberMediaSides;
DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values.
} DiskInfo;
struct {
LARGE_INTEGER Cylinders;
STORAGE_MEDIA_TYPE MediaType;
DWORD TracksPerCylinder;
DWORD SectorsPerTrack;
DWORD BytesPerSector;
DWORD NumberMediaSides;
DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values.
} RemovableDiskInfo;
struct {
STORAGE_MEDIA_TYPE MediaType;
DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values.
DWORD CurrentBlockSize;
STORAGE_BUS_TYPE BusType;
union {
struct {
BYTE MediumType;
BYTE DensityCode;
} ScsiInformation;
} BusSpecificData;
} TapeInfo;
} DeviceSpecific;
} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
////////////////////////////////////////////////////////////////////////////
PSTORAGE_MEDIA_TYPE = ^STORAGE_MEDIA_TYPE;
STORAGE_MEDIA_TYPE = (
DDS_4mm = $20, // Tape - DAT DDS1,2,... (all vendors)
CD_ROM, // Opt_Disk - CD
CD_R, // Opt_Disk - CD-Recordable (Write Once)
CD_RW, // Opt_Disk - CD-Rewriteable
DVD_ROM, // Opt_Disk - DVD-ROM
DVD_R, // Opt_Disk - DVD-Recordable (Write Once)
DVD_RW // Opt_Disk - DVD-Rewriteable
);
PSTORAGE_BUS_TYPE = ^STORAGE_BUS_TYPE;
STORAGE_BUS_TYPE = (
BusTypeUnknown = $00,
BusTypeScsi,
BusTypeAtapi,
BusTypeAta,
BusType1394,
BusTypeSsa,
BusTypeFibre,
BusTypeUsb,
BusTypeRAID,
BusTypeMaxReserved = $7F
);
Common_Disk_Info = record
Cylinders: LARGE_INTEGER;
MediaType: STORAGE_MEDIA_TYPE;
TracksPerCylinder: DWORD;
SectorsPerTrack: DWORD;
BytesPerSector: DWORD;
NumberMediaSides: DWORD;
MediaCharacteristics: DWORD; // Bitmask of MEDIA_XXX values.
end;
Scsi_Information = record
MediumType: BYTE;
DensityCode: BYTE;
end;
Bus_Specific_Data = record
ScsiInformation: Scsi_Information;
end;
Tape_Info = record
MediaType: STORAGE_MEDIA_TYPE;
MediaCharacteristics: DWORD; // Bitmask of MEDIA_XXX values.
CurrentBlockSize: DWORD;
BusType: STORAGE_BUS_TYPE;
BusSpecificData: Bus_Specific_Data;
end;
Device_Specific = record
DiskInfo: Common_Disk_Info;
RemovableDiskInfo: Common_Disk_Info;
TapeInfo: Tape_Info;
end;
Device_Media_Info = record
DeviceSpecific: Device_Specific;
end;
PGET_MEDIA_TYPES = ^GET_MEDIA_TYPES;
GET_MEDIA_TYPES = record
DeviceType: DWORD;
MediaInfoCount: DWORD;
MediaInfo: array [0..0] of Device_Media_Info;
end;
Можно видимо обойтись без типов Bus_Specific_Data и Device_Specific
← →
trubin © (2008-01-27 20:27) [1]Забыл:
typedef struct _GET_MEDIA_TYPES {
DWORD DeviceType;
DWORD MediaInfoCount;
DEVICE_MEDIA_INFO MediaInfo[1];
} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;
← →
Рамиль © (2008-01-27 20:54) [2]packed record
иначе, если это будет передаваться в функции dll неизвестного происхождения, могут быть проблемы.
← →
Riply © (2008-01-27 22:03) [3]> [2] Рамиль © (27.01.08 20:54)
> packed record
Ой не факт. Столько раз нарывалась с этим выравниванием, и не сосчитаешь :)
> иначе, если это будет передаваться в функции dll неизвестного происхождения, могут быть проблемы.
Проблеммы могут быть и с packed record. IMHO, в каждом случае надо подходить индивидуально,
с оглядкой на "функции dll неизвестного происхождения" в которых будет использоваться.
← →
Игорь Шевченко © (2008-01-27 22:07) [4]
> Проблеммы могут быть и с packed record. IMHO, в каждом случае
> надо подходить индивидуально,
> с оглядкой на "функции dll неизвестного происхождения" в
> которых будет использоваться.
Именно так. Я обычно сначала везде ставлю packed, потом при ошибках начинаю вставлять байты-заполнители.
← →
Anatoly Podgoretsky © (2008-01-27 22:14) [5]> Игорь Шевченко (27.01.2008 22:07:04) [4]
Неизвестного, читай не соблюдающего каноны ДЛЛ происхождения.
← →
Игорь Шевченко © (2008-01-28 00:45) [6]Anatoly Podgoretsky © (27.01.08 22:14) [5]
Даже известные, MS-овские и те грешат несоблюдением канонов.
← →
Германн © (2008-01-28 00:58) [7]
> Игорь Шевченко © (28.01.08 00:45) [6]
Теперь понятно почему три разных сишника мне прошлым летом дали три разных ответа о выравнивании в struct. Пришлось ждать появления автора ТЗ, чтобы узнать нужное. :)
← →
Riply © (2008-01-28 09:29) [8]> [5] Anatoly Podgoretsky © (27.01.08 22:14)
> Неизвестного, читай не соблюдающего каноны ДЛЛ происхождения.
> [6] Игорь Шевченко © (28.01.08 00:45)
> Даже известные, MS-овские и те грешат несоблюдением канонов.
А что это за "каноны", о которых идет речь
и в каких заповедях они описаны ?
← →
ketmar © (2008-01-28 09:36) [9]>[8] Riply©(28.01.08 09:29)
неявно. из традиции следует, что packed.
← →
Игорь Шевченко © (2008-01-28 09:52) [10]Riply © (28.01.08 09:29) [8]
Каконы просты - описания структур не зависят от языка программирования.
← →
Riply © (2008-01-28 11:16) [11]> [9] ketmar © (28.01.08 09:36)
> [10] Игорь Шевченко © (28.01.08 09:52)
> Каконы просты - описания структур не зависят от языка программирования.
Спасибо.
← →
trubin © (2008-01-28 19:20) [12]Кроме packed ничего не смущает?
← →
clickmaker © (2008-01-28 19:24) [13]
> [3] Riply © (27.01.08 22:03)
> > [2] Рамиль © (27.01.08 20:54)
> > packed record
>
> Ой не факт. Столько раз нарывалась с этим выравниванием,
> и не сосчитаешь :)
это, наверно, в случаях:
struct SomeCStruct {
DWORD Field1;
BYTE Field2: 4;
BYTE Field3: 3;
BYTE Field4: 1;
}
? :)
← →
guav © (2008-01-28 19:26) [14]> Device_Specific = record
> DiskInfo: Common_Disk_Info;
> RemovableDiskInfo: Common_Disk_Info;
> TapeInfo: Tape_Info;
> end;
Неверно, там не struct а union
Device_Specific = record
case Integer of
...
end;
← →
guav © (2008-01-28 19:31) [15]И вообще не мучайся, ищи готовые структуры тут http://jedi-apilib.sourceforge.net/
← →
trubin © (2008-01-28 19:53) [16]
> guav © (28.01.08 19:31) [15]
> И вообще не мучайся, ищи готовые структуры тут http://jedi-
> apilib.sourceforge.net/
Вот спасибо, нашел то что нужно.
> Неверно, там не struct а union
> Device_Specific = record
> case Integer of
> ...
> end;
ты прав разобрался
← →
Riply © (2008-01-28 21:50) [17]> [13] clickmaker © (28.01.08 19:24)
> это, наверно, в случаях:
> struct SomeCStruct {
Нет, не в этих. Или Вы изволите издеваться ? :))
← →
Игорь Шевченко © (2008-01-28 22:18) [18]Кстати, для перечислимых типов хорошо бы явно указывать их размер
{$Z+} приводит к тому, что перечислимые типы занимают 4 байта (как в С для Win32 по умолчанию), вне зависимости от количества элементов типа.
← →
guav © (2008-01-29 00:47) [19]> [18] Игорь Шевченко © (28.01.08 22:18)
Кстати, как задать размер для перечислимых типов в С (или хотя бы в С++) ? Есть ли переносимый (портабельный) вариант ?
← →
Германн © (2008-01-29 00:51) [20]
> Игорь Шевченко © (28.01.08 22:18) [18]
>
> Кстати, для перечислимых типов хорошо бы явно указывать
> их размер
> {$Z+} приводит к тому, что перечислимые типы занимают 4
> байта
Взял на заметку, поскольку с СИ-шником я теперь часто буду взаимодействовать. А он таких тонкостей не знает.
← →
Игорь Шевченко © (2008-01-29 09:45) [21]guav © (29.01.08 00:47) [19]
> Кстати, как задать размер для перечислимых типов в С (или
> хотя бы в С++) ? Есть ли переносимый (портабельный) вариант
> ?
Размер перечислимых типов в С это sizeof(int)
А дальше уже от компилятора зависит, какие гайки он умеет
← →
clickmaker © (2008-01-29 10:55) [22]
> [17] Riply © (28.01.08 21:50)
>
> Нет, не в этих. Или Вы изволите издеваться ? :))
Да ну что Вы, Александра, как можно!
туповатый мужской юмор, не более )
← →
guav © (2008-01-29 11:18) [23]> [20] Германн © (29.01.08 00:51)
Для MS Visual C++ можно задавать размер так:typedef enum _STORAGE_MEDIA_TYPE : WORD {
...
} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
Мне это не понравилось варнингом warning C4480: nonstandard extension used: specifying underlying type for enum, но если это не проблема, почему бы не воспользоватся.
> [21] Игорь Шевченко © (29.01.08 09:45)
Спасибо. Получается, не стоит использовать enum в структурах, которые должны сохраниться и при другом размере int (т.е. сохраняемых в бинарный файл).
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.046 c