Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
Добрый день. Сразу прошу прощения за видимо наивный вопрос (с этим никогда не сталкивался) пишу проект на делфи и есть у меня один модуль на С++ и его надо преобразовать в дельфийский, С++ знаю весьма удаленно

есть там процедура

void *ModelCreate(int Nn,
                                 UCHAR Type,
                                 DATA_HANDLER DataHandler,
                                 void *PCon,
                                struct SpecialParametrs *PSpecialParametrs);

по первым 2 параметрам всё ясно, насколько я понимаю 3-й указатель на функцию (возвращает integer), 4 - указатель на переменную и 5 - указатель на структуру

Вот вопрос, как это будет выглядеть на делфи, особенно непонятен 3 параметр. Заранее спасибо
25 май 18, 14:00    [21440218]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45698

patrick1968
Вот вопрос, как это будет выглядеть на делфи, особенно непонятен 3 параметр.

Третий параметр - надо смотреть как объявлено DATA_HANDLER.
Четвёртый параметр - Pointer.
Пятый параметр - ^SpecialParameters.

Posted via ActualForum NNTP Server 1.5

25 май 18, 14:04    [21440237]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6035
patrick1968,

Псевдокод:
Type
  TMyIntFunction=function : integer;

Procedure DoSome(..., Handler:TMyIntFunction,....);
var I:integer;
begin

  if Assigned(Handler) then I:=Handler;

end;
25 май 18, 14:08    [21440264]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6035
DarkMaster,

Тьфу ты... Невнимательно прочел, подумал, что тебе функцию как параметр нужно передать.
25 май 18, 14:09    [21440275]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
int __stdcall DataHandler(int Type,void *PZapis,void *PCon)
25 май 18, 14:47    [21440493]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
alekcvp
Member

Откуда:
Сообщений: 1090
patrick1968,

type
  TDataHandler = function(aType: Integer; PZapis, PCon: Pointer): integer; stdcall;

  PSpecialParametrs = ^TSpecialParametrs;
  TSpecialParametrs = [packed? - требует уточнения] record
    ....
  end;

function ModelCreate(Nn: Integer; 
                     aType: Byte; // что за тип UCHAR - не нашёл, unsigned char? 
                     DataHandler: TDataHandler;
                     pCon: Pointer;
                     SpecialParametrs: PSpecialParametrs): Pointer; cdecl;
Если ничего не напутал, то как-то так.
25 май 18, 15:08    [21440586]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
спасибо и еще скажите пожалуйста

char *ServerType как перевести
25 май 18, 15:18    [21440650]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
а UCHAR это видимо ansichar
25 май 18, 15:19    [21440659]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45698

patrick1968
а UCHAR это видимо ansichar

Нет, это Byte, всё правильно.

Posted via ActualForum NNTP Server 1.5

25 май 18, 16:41    [21441062]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
alekcvp
Member

Откуда:
Сообщений: 1090
patrick1968
char *ServerType как перевести

PByte?
25 май 18, 17:46    [21441329]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
alekcvp
Member

Откуда:
Сообщений: 1090
alekcvp,

Или PAnsiChar, в зависимости от контекста.
25 май 18, 17:47    [21441332]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
Что-то совсем я в этих типах С++ запутался подскажите плиз какого типа должна быть дельфийская структура и какие значения должны быть присвоены чтобы было как в С++ на картинке

К сообщению приложен файл. Размер - 21Kb
27 май 18, 16:39    [21444164]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
вот описание структуры С++

struct _SpecialParametrs {
  DWORD FilterType;              // Тип фильтра
  float Popravka[MAX_SENSOR_NUMBER];
  DWORD SpeedMeasurementPeriod;  // Период измерения частоты вращения 
  unsigned short int AveragingFactor; // Коэффициент усреднения 
  bool  VneshnDatchSkor;         // Есть внешний датчик скорости
  bool  ServerMode;              // Режим сервера 
  int   OwnServerBasePortNumber; // Собственный базовый номер порта
  struct _ParamComPort *PParamComPort; 
  char *ServerAddress;
  int   AnotherServerBasePortNumber;
  UCHAR ServerChannelNumber;
  UCHAR ComPortNumber;
  UCHAR MODBUS_DeviceAddress;
};
#ifndef __DLL__
//--------------------- Структура параметров Сом-порта
struct _ParamComPort {
 int  BaudRate;   // скорость передачи данных
 char BiteSize;   // число битов данных
 char Parity;     // схема контроля четности
 char StopBits;   // число стоповых бит
};


а вот моя структура (в ней видно что-то не верно)

  TSpecialParametrs = ^SpecialParameters;

  TParamComPort = record
     BaudRate : integer;   // скорость передачи данных
     BiteSize : integer;   // число битов данных
     Parity : integer;     // схема контроля четности
     StopBits : integer;   // число стоповых бит
  end;


  SpecialParameters = record
    FilterType : dword;              // Тип фильтра
    Popravka : array[1..MAX_SENSOR_NUMBER] of fixed;
    SpeedMeasurementPeriod : dword;  // Период измерения частоты вращения
    AveragingFactor : integer; // Коэффициент усреднения
    VneshnDatchSkor : boolean;         // Есть внешний датчик скорости
    ServerMode : boolean;              // Режим сервера
    OwnServerBasePortNumber : integer; // Собственный базовый номер порта
    PParamComPort : ^TParamComPort;
    ServerAddress : PChar;
    AnotherServerBasePortNumber : integer;
    ServerChannelNumber : integer;
    ComPortNumber : integer;
    MODBUS_DeviceAddress : integer;

  end;
27 май 18, 17:30    [21444214]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
gssbox
Member

Откуда:
Сообщений: 64
Наверно это как то так должно быть:

+
//--------------------- Структура параметров Сом-порта
type
 TParamComPort = packed record
  BaudRate: Integer; // скорость передачи данных
  BiteSize: Byte; // число битов данных
  Parity: Byte; // схема контроля четности
  StopBits: Byte; // число стоповых бит
end;

PParamComPort = ^TParamComPort;

type
  SpecialParametrs = packed record
    FilterType: DWORD; // Тип фильтра
    Popravka: array[0..MAX_SENSOR_NUMBER - 1] of Single;
    SpeedMeasurementPeriod: DWORD; // Период измерения частоты вращения
    AveragingFactor: Word; // Коэффициент усреднения
    VneshnDatchSkor: Boolean; // Есть внешний датчик скорости
    ServerMode: Boolean; // Режим сервера
    OwnServerBasePortNumber: Integer; // Собственный базовый номер порта
    ParamComPort: PParamComPort;
    ServerAddress: PByte;
    AnotherServerBasePortNumber: Integer;
    ServerChannelNumber: Byte;
    ComPortNumber: Byte;
    MODBUS_DeviceAddress: Byte;
end;
27 май 18, 19:08    [21444375]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
gssbox
Member

Откуда:
Сообщений: 64
Поправочка скорее всего

ServerAddress : PAnsiChar;

Это указатель на массив байт, неизвестной длины(должно быть в документации). В этом Си все через жопу.
27 май 18, 19:17    [21444394]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
на С++ float Popravka[6]; как будет на делфи?
27 май 18, 20:37    [21444536]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
alekcvp
Member

Откуда:
Сообщений: 1090
patrick1968
на С++ float Popravka[6]; как будет на делфи?

Popravka: array [0..5] of Single;
27 май 18, 20:59    [21444580]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
а как в делфи будет выглядеть код

char ServerAddress[300];
AnsiString AS;

AS = EServerAddress->Text;
strcpy(ServerAddress,AS.c_str());

похоже так?

var
ServerAddress : PAnsiChar;
AS : AnsiString;
begin
AS := EServerAddress.Text;
StrCopy(ServerAddress, AS);
end;
28 май 18, 10:11    [21445394]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
alekcvp
Member

Откуда:
Сообщений: 1090
patrick1968
а как в делфи будет выглядеть код

char ServerAddress[300];
AnsiString AS;

AS = EServerAddress->Text;
strcpy(ServerAddress,AS.c_str());

Не всё так просто. Исходный код - это C++ Builder?.. Просто AnsiString вроде не стандартный тип для C++, а в билдере - это класс-обёртка над PAnsiChar, как я понял.
Близко-смысловой перевод будет вот таким:
var
  ServerAddress: array [0..299] of Char;
  SA: AnsiString; // AS - зарезервированное слово и не может использоваться как имя переменной
begin
  SA := EServerAddress.Text; // Что такое "EServerAddress" - поле ввода?
  StrCopy(ServerAddress, PAnsiChar(SA));

Однако что-то мне подсказывает, что в Delphi это можно сделать эффективнее, но для этого надо понимать весь код.
28 май 18, 11:39    [21445814]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
alekcvp
Member

Откуда:
Сообщений: 1090
И как обычно - говнокод, т.к. никто не контролирует что AS влезет в отведённые 300 байт для ServerAddres...
28 май 18, 11:40    [21445820]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
vavan
Member

Откуда: Казань
Сообщений: 3106
alekcvp
AnsiString вроде не стандартный тип для C++
совершенно верно
alekcvp
в билдере - это класс-обёртка над PAnsiChar
не, над дельфовым стрингом
28 май 18, 11:47    [21445859]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
Есть код на С++
struct _SK {
  unsigned char ID_Datchik[3];
  UCHAR Temperature;
  UCHAR Korrect;
  unsigned short int K_Zub;
  UCHAR MaxSkorVr;
  UCHAR Date_Poverki[3];
  UCHAR Slug_Inf[49];
};
…..
DLL_EI int DecoderReadTranducerParametrs(void *PDecoder,struct _SK *PTranducerParametrs,char *StrokaDatchikID);  
……
Kod = DecoderReadTranducerParametrs(PDecoder,&SK, StrokaDatchikID);


Нужно воплотить в Делфи
Type
…
T_SK = record
     ID_Datchik : PAnsiChar;
     Temperature : PChar;
     Korrect : PChar;
     K_Zub : integer;
     MaxSkorVr : PChar;
     Date_Poverki : PChar;
     Slug_Inf : PChar;
   end;
…
Var PT_SK : ^T_SK;
...
Kod := DecoderReadTranducerParametrs(…, ???? ,….);
Что ложно быть тут? Заранее спасибо.
31 май 18, 17:50    [21458462]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
patrick1968
Что ложно быть тут?


всё почти. В гугле, кстати, полно ответов, ну ладно, один раз.

unsigned char -> Byte // 100%
UCHAR -> Byte // 99.99%
unsigned short int -> Word // 100%

Массивы в структуре ты вообще не объявил. Ладно, пример.
ID_Datchik: Array[ 0 .. 2 ] of Byte;

И еще должны совпадать выравнивание размеров полей (в настройках компилятора, плюс возможны прагмы).
31 май 18, 18:01    [21458505]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3528
Вызов функции (например):
var
  PT_SK: T_SK;
  Kod: Integer;
begin
  //...
  Kod := DecoderReadTranducerParametrs( ..., @PT_SK, ... );
  //...
end;
31 май 18, 18:05    [21458518]     Ответить | Цитировать Сообщить модератору
 Re: Сопоставление Delphi и C++  [new]
patrick1968
Member

Откуда:
Сообщений: 359
Мне бы понять как здесь должен выглядеть второй параметр?

Kod := DecoderReadTranducerParametrs(…, ???? ,….);
31 май 18, 18:05    [21458522]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить