Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.039 c
2-1201644172
Свой
2008-01-30 01:02
2008.02.24
Как получить список поддиректорий в каталоге?


15-1201017444
sauron
2008-01-22 18:57
2008.02.24
BIOS?


2-1201342202
Sairex
2008-01-26 13:10
2008.02.24
Склеивание несколько файлов в один


2-1201756905
Kolan
2008-01-31 08:21
2008.02.24
Как можно связать ячейки StringGrid с объектами.


2-1201764728
lead-in
2008-01-31 10:32
2008.02.24
трабла с кодировкой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский