Autor Beitrag
maxda
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mi 01.07.09 19:08 
Hallo,
es ist das erste mal das ich eine ((mehr oder weniger) nennenswerte) DLL schreibe. Nun bin ich aber auf das Problem gestoßen, dass ich Polygone verwende, die in Arrays gespeichert werden und beim Funktionsaufruf übergeben werden sollen. Wie initialisiere ich die Funktion, wenn ich die Anzahl der Punkten vorher nicht weiß? Und kann es mit den Arrays zu Problemen kommen, wenn ich die DLL in einer anderen Programmiersprache benutze, weil diese andere Programmiersprache die Arrays anderst speichert, oder werden die eigentlich immer gleich gespeichert?

Mir ist dann die Idee gekommen, dass man die Koordinaten der Punkte dann ja als String übergeben könnte, aber das ist ja auch nur ein Array, und außerdem eine eher 'schlechte' Variante, da sich leicht Fehler einschleichen (der Nutzer der DLL irgendeinen Blödsinn als String übergibt).

Ich hoffe ihr könnt mir helfen,
Viele Grüße, maxda


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 03.07.2009 um 12:11
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 01.07.09 19:14 
Die WinAPI übergibt bei sowas im allgemeinen die Anzahl der Elemente sowie einen Zeiger auf das erste Element. Von da aus kann man ja alle anderen ausrechnen (bzw. Einen PArray-Typ. Siehe PByteArray, PWordArray etc.)

user profile iconmaxda hat folgendes geschrieben Zum zitierten Posting springen:
Und kann es mit den Arrays zu Problemen kommen, wenn ich die DLL in einer anderen Programmiersprache benutze, weil diese andere Programmiersprache die Arrays anderst speichert, oder werden die eigentlich immer gleich gespeichert?

Das wird dein geringstes Problem sein. Als Stichworte möchte ich mal Aufrufkonventionen, Strings und Export-Namen einwerfen.
Grade letztere können interessant wertden, weil C-Compiler gern noch Informationen über die Parameter an den Namen dran hängen. Zu Strings steht in dem Kommentar was, den der DLL-Experte erstellt, zusammengefasst: "don't."
Aufrufkonventionen und die Implikationen gibts in der Delphi-Hilfe recht gut beschrieben.

Da fällt mir ein: wie Records kann/muss man hier Arrays als packed deklarieren, wenn man keine Überraschungen erleben will.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
maxda Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mi 01.07.09 20:02 
Ja, schonmal danke für deine Antwort, aber wie mach ich, dass der Benutzer der DLL eine beliebige Anzahl an Elementen ins Arrax schreiben kann und das Array dann übergeben kann?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 01.07.09 20:10 
Nichts weiter. Du deklarierst als Parameter eben einen Pointer auf ein Element des Typs im Array und einen Integerwert mit der Anzahl der Elemente. :nixweiss:
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 02.07.09 12:18 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
library Foo;

uses {...};

type
    TBazType = packaed record end;
    PBazType = ^TBazType;
    TBazArray = packed array[0..0] of TBazType;
    PBazArray = ^TBazArray;

function Bar(const a: PBazType; const a_count: Integer; stdcall;
var
    a_arr: PBuzArray;
begin
    a_arr := PBuzArray(a); //Bedenkenlos möglich, da die Daten des Arrays linear im Speicher liegen
    //Work with a_arr^[0..a_count-1] ...
    //Speicher sollte vom Aufrufer bereitgestellt werden!
end;

exports 
    Bar;

end.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.