On Wednesday, 25 October 2017 at 03:12:56 UTC, Oleg B wrote:
Hello. I have DLL written on Pascal and "headers" for use it
(types and functions signatures definitions). How I can port
"headers" to D?
Calling convention is `stdcall` (`extern (Windows)` for D),
arguments of some functions is structs of structs and etc with
static array fields:
```Pascal
type
TOneHarmonic = record
Koef: Single;
Angle: Single;
end;
THarmonicsArray = array[2..50] of TOneHarmonic;
TInterharmonicsArray = array[1..49] of TOneHarmonic;
TVoltageCurrentOneFaza = record
KalibKoef: Single;
IncludeMainFreq: Boolean;
MainFreqVoltCur: TOneHarmonic;
Harmonics: THarmonicsArray;
Interharmonics: TInterharmonicsArray;
end;
TVoltageCurrent = record
Enable: Boolean;
NominalID: Byte;
Faza_A: TVoltageCurrentOneFaza;
Faza_B: TVoltageCurrentOneFaza;
Faza_C: TVoltageCurrentOneFaza;
end;
TSignal = record
HasInterharmonics: Boolean;
Voltage: TVoltageCurrent;
Current: TVoltageCurrent;
...
end;
...
```
in other file
```Pascal
function CheckSignalData(SignalData: PUserSignalData): Word;
stdcall; external SIGNALK2MDLL;
```
PUserSignalData is pointer to TUserSignalData, first field of
TUserSignalData is Signal, other fields is pointers to other
types
If I understand correctly
1. `Single` is `float` in D, `Byte` is `byte`, `Boolean` is
`bool`, `Word` is `ushort`
No Pascal's "Byte" is D's "ubyte". But unless NominalID goes over
127 this is not the source of the problem.
2. `array[A..B] of TFoo` is `TFoo[B-A+1]` (static array)
No A-B. In Pascal the upper bound of a range (like here but i'm
not sure this i called like that in the grammar) or of a slice is
inclusive.
Can I rewrite records to structs like this?
```d
alias Word = short;
alias Single = float;
alias Byte = byte;
alias Boolean = bool;
struct OneHarmonic
{
Single coef;
Single angle;
}
alias HarmonicArray = OneHarmonic[49];
48 !
// TVoltageCurrentOneFaza
struct PhaseInfo
{
// Must I align fields and/or structs?
No, unless the record is packed.
Single calibCoef;
Boolean includeMainFreq;
OneHarmonic mainFreqVoltCur;
HarmonicArray harmonics; // Can I replace Pascal static
arrays with D static arrays?
HarmonicArray interharmonics;
}
// TVoltageCurrent
struct ChannelInfo
{
Boolean enable;
Byte nominalID;
PhaseInfo[3] phase; // Can I replace 3 fields to static
array?
yes
}
struct Signal
{
Boolean hasInterharmonics;
ChannelInfo voltage;
ChannelInfo current; // #1
...
}
```
In this case I have error about current values (#1) and I think
I badly rewrite Pascal records to D structs (ChannelInfo,
PhaseInfo, OneHarmonic) and lose alignments and/or something
else.
PS original pascal naming is very bad, I know
Most likely the problem is the array length.