Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Перевод структуры с С в Delphi

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

velk



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Есть структура файла
Подробнее...
Как перевести в струтуру на синтаксис Delphi

Всего записей: 362 | Зарегистр. 18-11-2002 | Отправлено: 12:06 20-04-2004 | Исправлено: ShIvADeSt, 01:52 17-02-2006
Mamay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ИМХО неиначе как record-ами...

----------
Даже самый дурацкий замысел можно выполнить мастерски

Всего записей: 1352 | Зарегистр. 03-09-2002 | Отправлено: 13:40 20-04-2004
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну да... особенно если это структура именно файла...

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 14:09 20-04-2004
velk



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Это струтура файла..
Но я нифига не знаю Си  
Подскажите хоть что на что менять то....Пожалуйста

Всего записей: 362 | Зарегистр. 18-11-2002 | Отправлено: 14:17 20-04-2004
Kernel Panic



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
поищи в инете таблицу соответствия типов C++ и Delphi (я такую видел, но урл не помню) и потихоньку конверти.

Всего записей: 122 | Зарегистр. 21-03-2003 | Отправлено: 14:39 20-04-2004
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
- unsigned long point_next_rec;
longword
 - unsigned  rec_num : 8;
byte (в данном случае, т.к. 8 бит. и все подобные штуки - это, я так понимаю, битовые маски)
- char spare5;  
char
- unsigned equipment_nr;  
здесь пойдет boolean
- int dial_info;
integer
- char call_subs_info[3];        // 20-22  
string[3]
- unsigned  states   : 4; //28  
- unsigned  lang_pos : 4; //28  
вот эти поля по 4 бита... хз, можно в byte объединить, иначе никак вроде...  
или отдельную запись на 4 бита.
 
struct  
{  
unsigned eos_data_valid     : 1;  
unsigned reanswer_allowes   : 1;  
unsigned no_answer_expected : 1;  
unsigned incoming_trunk     : 1;  
unsigned manual_trunk       : 1;  
unsigned talked_on_answer   : 1;  
unsigned verify_active      : 1;  
unsigned swctrl_failed      : 1;  
} b29;

насчитал 8, следовательно - byte
 
{unsigned zero1 : 4;  
unsigned dcon  : 1;  
unsigned chrg  : 1;  
unsigned mast  : 1;  
unsigned uni   : 1;  
unsigned master: 5;  
unsigned zero2 : 3;  
} cnf_control_A;

два по 8, word.
 
struct  
{  
unsigned long id;  
unsigned sotrace_nr  : 4;  
unsigned subsystem_id: 4;  
} ticket_identity;

два по 4 - byte
 
ну и другие структуры - по аналогии. можно делать точно так же  
xxx=record
  xxx1:boolean;
  xxx2:boolean;
  ...
  xxx8:boolean;
end;
а можно все в один байт, но потом тебе самому смотреть надо, где чего...
 
struct  
{  
unsigned call_cat            : 2; // Є ⥣®аЁп ўл§®ў  
// 00 undefined  
// 01 originat   Ёб室пйЁ©  
// 10 terminat   ўе®¤пйЁ©  
// 11 transit    ва ­§Ёв  
unsigned circuit_type        : 2; // вЁЇ «Ё­ЁЁ  
// 00 undefined  
// 01 line           Ў®­Ґ­вбЄ п «Ё­Ёп  
// 10 autom trunk   ᮥ¤Ё­ЁвҐ«м­ п «Ё­Ёп  
// 11 manual trunk  агз­®© Є ­ «  
unsigned conversat_with      : 2; // ᮥ¤Ё­Ґ­ЁҐ з/§ ®ЇҐа в®а  Ё«Ё ­Ґв  
// 00 undefined  
// 01 A_subscr  ­®¬Ґа  Ў®­Ґ­в  
// 10 A_operat  ­®¬Ґа ®ЇҐа в®а  
// 11 spare  
unsigned direction_of_seizure: 2; // бЇ®б®Ў ᮥ¤Ё­Ґ­Ёп  
// 00 undefined  
// 01 incoming  ўе®¤пйЁҐ 楯Ё  
// 10 outgoing  Ёб室пйЁҐ 楯Ё  
// 11 spare  
} data_of_A;

в целом 8 бит, можно опять же в один байт, а вот как разбить на двухбитные поля - это я ХЗ...  
 
- char nr_sub_A[24];        
string[24]
- struct digit AON_sub_A[10];  
array[1..10] of (чего-то, че такое digit - не знаю)
 
ну и далее по аналогии... смысл понятен?
а еще вариант: возьми типы в сях (это не сложно найти) и типа в Делфях... и поехал...


----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 16:47 20-04-2004
velk



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Спасибо буду разбираться

Всего записей: 362 | Зарегистр. 18-11-2002 | Отправлено: 16:54 20-04-2004
redp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2Sleepwalker
я кстати не уверен что вот такое

Код:
 
xxx=record  
xxx1:boolean;  
xxx2:boolean;  
...  
xxx8:boolean;  
end;  
 

будет работать
boolean разве всегда 1 бит занимает ? а еще с alignment могут быть проблемы...

Всего записей: 514 | Зарегистр. 16-06-2003 | Отправлено: 17:13 20-04-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Посмотри на vvv.astonshell.com/rus там есть утилита которая переводит с С на Дельфи, достаточно качесвтенно

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:50 21-04-2004
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
redp
нда уж... действительно... в файле boolean занимает 1 байт... тогда надо брать целочисленный и ручками конвертить...

----------
...или я ничего не понимаю в этой жизни... или понимаю слишком хорошо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 10:18 21-04-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нашел вот такую запись для уменьшния размера файла
на Дельфи таких комманд не нашел, мож кто знает

Цитата:
 
#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:New_WinMain")
#pragma comment(linker,"/NODEFAULTLIB")
// в итоге можно получить exe-файл размером примерно в 4 Кб
 



----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:11 05-11-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
ОСновной выйгрыш идет здесь:
Цитата:
#pragma comment(linker,"/NODEFAULTLIB")  
-это отключение использования crt библиотеки, думаю что-то похожее есть и в delphi
----
А тема точно правильная?

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 11:13 05-11-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
-это отключение использования crt библиотеки, думаю что-то похожее есть и в delphi  

Это я знаю

Цитата:
А тема точно правильная?  

Вообще то, это не структура, но чтобы не создавать новый топик, я поместил в этом, тем более, что здесь тоже требуется перевести с одного языка на другой. А вообще надо наверное создать общмй топик, о переводе кода с одного языка на другой.  


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:59 06-11-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть структура

Цитата:
 
struct
        {  
int _settings_struct_size;
int _mark_version;
UCHAR bitStorage[NumStorage];
WINDOWPLACEMENT m_wndpl;
UCHAR _guiLanguage; // interface language 0 - RU, 1 - Eng, ...
DWORD _BkGrColor; // цвет фона документа
DWORD _FontColor; // цвет шрифта
RECT _printMargins; // отступы (поля) при печати
CHARFORMAT _DOSfont; // фонт DOS
CHARFORMAT _WINfont; // фонт Win
CHARFORMAT _KOIfont; // фонт KOI
int _lastTimeDateChoice;
char _szAssociatedTypes[128];
UCHAR _changedAccels; // есть ли измененные хоткеи и сколько
POINT _FindDlgPos;
} appSettings;
 

я перевел это на дельфи следующим образом

Цитата:
 
  TCharFormat = record
    cbSize: UINT;
    dwMask: Longint;
    dwEffects: Longint;
    yHeight: Longint;
    yOffset: Longint;
    crTextColor: TColorRef;
    bCharSet: Byte;
    bPitchAndFamily: Byte;
    szFaceName: array[0..LF_FACESIZE-1] of WideChar;
  end;
 
  TAppSettings=record
   SetStructSize:integer;
   MarkVersion:integer;
   BitStorage:array[0..8] of Byte;
   WndPlmt:TWINDOWPLACEMENT;
   GuiLanguage:Byte;
   BkGrColor:DWORD;
   FontColor:DWORD;
   PrintMargins:TRect;
   DosFont:TCharFormat;
   WinFont:TCharFormat;
   KOIFont:TCharFormat;
   LastTimeDateChoice:integer;
   AssocTypes:array[0..127] of char;
   ChangedAccles:Byte;
   FindDlgPos:TPoint;
  end;
 

В итоге, даже при указании того, что используется WideChar и вроде все правильно прописал размер первой структуры 512 байт, размер второй 508. В результате я читаю эту структуру из реестра и получаю в строках мусор. Читаю все правильно, проблема в переводе структуры. Где то я потерял 4 байта. Причем надо точно знать где.
 
Добавлено:
Разобрался в чем проблема в дельфи  

Цитата:
 
typedef struct _WINDOWPLACEMENT {     // wndpl  
    UINT  length;  
    UINT  flags;  
    UINT  showCmd;  
    POINT ptMinPosition;  
    POINT ptMaxPosition;  
    RECT  rcNormalPosition;  
} WINDOWPLACEMENT;  
 

объявлена так

Цитата:
 
  PWindowPlacement = ^TWindowPlacement;
  {$EXTERNALSYM tagWINDOWPLACEMENT}
  tagWINDOWPLACEMENT = packed record
    length: UINT;
    flags: UINT;
    showCmd: UINT;
    ptMinPosition: TPoint;
    ptMaxPosition: TPoint;
    rcNormalPosition: TRect;
  end;
  TWindowPlacement = tagWINDOWPLACEMENT;
  {$EXTERNALSYM WINDOWPLACEMENT}
  WINDOWPLACEMENT = tagWINDOWPLACEMENT;
 

и из-за того, что использовался packed record 4 байта терялись, в итоге мусор. Переопределил структуру и все ок.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:44 24-06-2005
eMASTER



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Кто знает как перевести такую строку из С++ в Delphi???

Код:
 
PRINTER_INFO_2*    pi2;
...
UDC_DEVMODE_NT* dm_nt = (UDC_DEVMODE_NT*)( pi2->pDevMode );
 

Просто так не хочет:

Код:
 
pi2: ^PRINTER_INFO_2;
...
dm_nt:=pi2.pDevMode;
 

Типы-то разные....  
UDC_DEVMODE_NT и PDeviceModeA
 
Всякие проги-конвертеры не могут справиться...
Как решить проблему?
Может через копирование памяти?

Всего записей: 94 | Зарегистр. 07-01-2006 | Отправлено: 11:28 16-02-2006
bandyn



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Это конечно все хорошо из C++ в Delphi....
 
Но у меня вопрос всё наоборот...
Я пишу на BCB С++ 6
Часто приходится переводить именно с Delphi на C++
Может есть какие-нибудь конвертеры?
Где найти таблицы соответствий?

Всего записей: 394 | Зарегистр. 18-11-2004 | Отправлено: 22:49 16-02-2006
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
eMASTER

Цитата:
UDC_DEVMODE_NT и PDeviceModeA

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

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:03 17-02-2006
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bandyn

Цитата:
Может есть какие-нибудь конвертеры?

Вот первое, что выдал google. А вот  здесь схожий софт еще и продают

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 10:51 17-02-2006 | Исправлено: WiseAlex, 10:52 17-02-2006
eMASTER



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt
Вот смотри...
Вот так она выглядела в С++:

Код:
 
typedef struct _devicemode_nt {  
  BCHAR  dmDeviceName[CCHDEVICENAME];  
  WORD   dmSpecVersion;  
  WORD   dmDriverVersion;  
  WORD   dmSize;  
  WORD   dmDriverExtra;  
  DWORD  dmFields;  
  union {
    struct {
      short dmOrientation;
      short dmPaperSize;
      short dmPaperLength;
      short dmPaperWidth;
    };
    POINTL dmPosition;
  };
  short  dmScale;  
  short  dmCopies;  
  short  dmDefaultSource;  
  short  dmPrintQuality;  
  short  dmColor;  
  short  dmDuplex;  
  short  dmYResolution;  
  short  dmTTOption;  
  short  dmCollate;  
  BCHAR  dmFormName[CCHFORMNAME];  
  WORD  dmLogPixels;  
  DWORD  dmBitsPerPel;  
  DWORD  dmPelsWidth;  
  DWORD  dmPelsHeight;  
  union {
    DWORD  dmDisplayFlags;  
    DWORD  dmNup;
  };
  DWORD  dmDisplayFrequency;  
 
  DWORD  dmICMMethod;
  DWORD  dmICMIntent;
  DWORD  dmMediaType;
  DWORD  dmDitherType;
  DWORD  dmReserved1;
  DWORD  dmReserved2;
 
  DWORD  dmPanningWidth;
  DWORD  dmPanningHeight;
 
} DEVMODE_NT;  
 
 
 
typedef struct tagUDC_DEVMODE_NT
{
    DEVMODE_NT         dm;
    //
    DWORD       reserved_1; // internally used, do not change
    DWORD       reserved_2; // internally used, do not change
    DWORD        reserved_3; // internally used, do not change
    DWORD        reserved_4; // internally used, do not change
    DWORD        reserved_5; // internally used, do not change
    BOOL        reserved_6; // internally used, do not change
    BOOL        reserved_7; // internally used, do not change
    DWORD        reserved_8; // internally used, do not change
    DWORD        reserved_9; // internally used, do not change
    DWORD        reserved_10; // internally used, do not change
    
    DWORD            m_nFormat; // output file format code (see enum eFormats)
    // settings for each format
    FORMAT_BMP        m_fBMP;  
    FORMAT_GIF        m_fGIF;
    FORMAT_JPG        m_fJPG;
    FORMAT_TIFF        m_fTIFF;
    FORMAT_PCX        m_fPCX;
    FORMAT_DCX        m_fDCX;
    //
    BOOL            m_bRunApp;     // TRUE if an application is to be run when finishing printing,
                        // FALSE otherwise
    BOOL            m_bRunCustom;     // if TRUE, a custom application specified
                        //    with fields m_sAppName and m_sAppParams is to be run,
                        //    FALSE yields default application (associated with the image file type) running
    WCHAR            m_sImagePath[MAX_PATH]; // path to create image file
    WCHAR            m_sImageName[MAX_PATH]; // Image file name masks for image created by Universal Document Converter
                            // while printing documents
    WCHAR            m_sAppName[MAX_PATH];    // specifies custom application filename (with full path),
                            // actual only if m_bRunCustom is TRUE
    WCHAR            m_sAppParams[MAX_PATH]; // custom application command line parameters
    WCHAR            m_sProfComment[512];    // internally used, should not be changed
} UDC_DEVMODE_NT, FAR *PUDC_DEVMODE_NT;
 

 
и вот как я его перевел:

Код:
 
  DEVMODE_NT = record
    dmDeviceName: String[CCHDEVICENAME];
 
    dmSpecVersion: Integer;
    dmDriverVersion: Integer;
    dmSize: Integer;
    dmDriverExtra: Integer;
    dmFields: longint;
 
    dmOrientation: Integer;
    dmPaperSize: Integer;
    dmPaperLength: Integer;
    dmPaperWidth: Integer;
 
    dmScale: Integer;
    dmCopies: Integer;
    dmDefaultSource: Integer;
    dmPrintQuality: Integer;
    dmColor: Integer;
    dmDuplex: Integer;
    dmYResolution: Integer;
    dmTTOption: Integer;
    dmCollate: Integer;
    dmFormName: String[CCHFORMNAME];
 
    dmLogPixels: Integer;
    dmBitsPerPel: longint;
    dmPelsWidth: longint;
    dmPelsHeight: longint;
 
    dmDisplayFlags: longint;
    dmDisplayFrequency: longint;
 
    dmICMMethod: longint;
    dmICMIntent: longint;
    dmMediaType: longint;
    dmDitherType: longint;
    dmReserved1 : longint;
    dmReserved2 : longint;
 
    dmPanningWidth: longint;
    dmPanningHeight : longint;
  End;
 
  UDC_DEVMODE_NT = record
    dm: DEVMODE_NT;
    reserved_1: longint;
    reserved_2: longint;
    reserved_3: longint;
    reserved_4: longint;
    reserved_5: longint;
    reserved_6: longint;
    reserved_7: longint;
    reserved_8: longint;
    reserved_9: longint;
    reserved_10: longint;
    m_nFormat: longint;
    m_fBMP: FORMAT_BMP;
    m_fGIF: FORMAT_GIF;
    m_fJPG: FORMAT_JPG;
    m_fTIFF: FORMAT_TIFF;
    m_fPCX: FORMAT_PCX;
    m_fDCX: FORMAT_DCX;
 
    m_bRunApp: longint;
    m_bRunCustom: longint;
    m_sImagePath: array [1..MAX_PATH] of WCHAR;
    m_sImageName: array [1..MAX_PATH] of WCHAR;
    m_sAppName: array [1..MAX_PATH] of WCHAR;
    m_sAppParams: array [1..MAX_PATH] of WCHAR;
    m_sProfComment: array [1..512] of WCHAR;
  End;
 

 
FORMAT_BMP и остальные - еще несколько небольших структур...

Всего записей: 94 | Зарегистр. 07-01-2006 | Отправлено: 11:25 17-02-2006
ItsJustMe

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так. Первое.
BCHAR  dmDeviceName[CCHDEVICENAME];
нельзя делать
dmDeviceName: String[CCHDEVICENAME];
надо
dmDeviceName: array [0..CCHDEVICENAME-1] of WideChar;
 
WORD = short = ShortInt, not Interger. WORD, вообще-то unsigned, на для тебя это несущественно.
 
В UDC_DEVMODE_NT ты со строками правильно разделался В первой так же сделай. Я, правда не уверен, что BCHAR=WCHAR, а не CHAR. Если он CHAR, то соответственно заменишь WideChar на Char

Всего записей: 2028 | Зарегистр. 02-09-2005 | Отправлено: 11:42 17-02-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Перевод структуры с С в Delphi


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru