![]() |
array in pointer einbinden
Hallo Netz,
ich habe in meinem Programm eine externe dll eingebunden, die in c geschrieben ist. Einige Varablen sind vom c-Typ void, dass heißt, sie sind in Delphi pointer. Diesen pointer möchte ich nun ein array zuweisen und in das array Zahlen bzw. Buchstaben eingeben. Geht das? Wie muß ich es machen? Muß ich wie bei typisierten pointern auch getmem und freemem benutzen. Danke Euch! Gruß Kaddy :hi: |
Hi,
bei mir ging auch immer New und Dispose. Der einfachste Pointer ist PChar für diesen Fall (Zeichen). Den mußt du aber mit GetMem reservieren. Gruß oki |
Hi,
danke für den Tipp. Geht bei mir so aber nicht. Gibt es nicht noch eine andere Möglichkeit? Gruß Kaddy :dancer2: |
Hi,
gib mal die Methode in C-Deklaration sowie deine Definition in Delphi rüber. Gruß oki |
moin,
gut, ich gebe dir mal meinen Code. Den C-Code habe ich nicht, aber laut Handbuch muß meine Funktion in Delphi folgendemaßen eingebunden werden:
Delphi-Quellcode:
Jetzt geht es um die pointer colname und rowname. Die anderen funktionieren mit integer und double auf die identische Weise wie ich es mit colname und rowname mit char versucht habe.
function CPXaddrows(env:CPXEnvptr; LP: CPXLPptr;ccnt,rcnt,nzcnt:integer;
rhs,sense,rmatbeg,rmatind,rmatval,colname,rowname: pointer):integer;stdcall; external cplex name 'CPXaddrows'; Die Typen Definition ist folgendermaßen:
Delphi-Quellcode:
Die Variablen definiere ich folgendermaßen:
Tvarc= array[0..2] of char;
ptrTvarc=^Tvarc;
Delphi-Quellcode:
Dann reserviere ich Speicher:
colname: ptrTvarc;
rowname: ptrTvarc;
Delphi-Quellcode:
Ich weise den Variablen die Werte zu:
GetMem(rowname,3*SizeOf(Char));
GetMem(colname,3*SizeOf(Char));
Delphi-Quellcode:
Die Funktion rufe ich dann folgendermaßen auf:
colname[0]:='y';
colname[1]:='x'; colname[2]:='z'; rowname[0]:='a'; rowname[1]:='b'; rowname[2]:='c';
Delphi-Quellcode:
Und schleißlich gebr ich den Speicher wieder frei:
status:=CPXaddrows(env,lp,3,2,6,rhs,sense,rmatbeg,rmatind,rmatval,colname,rowname);
Delphi-Quellcode:
Wenn ich es laufen lasse kommt dann die Felhermeldung:
FreeMem(rowname,3*SizeOf(Char));
FreeMem(colname,3*SizeOf(Char)); Project P2.exe raised exception class EAccessViolation with message 'Access violation at address 10108907 in module 'cplex65.dll' read of address 007A7879' Process stopped. Use Step orRun to continue. Wenn ich bei den Variablen rowname und colname in der Funktion nil schreibe, läuft das Programm fehlerfrei. Was mache ich falsch? Danke! Gruß Kaddy :) [edit=Delphi-Tags ergänzt. MfG Daniel B.[/edit] |
Also,
probiere mal anstatt Stdcall cdecl. Der Aufwand mit den Pointern tut nicht not. definiere einfach folgendes:
Delphi-Quellcode:
und für die Variablen sowie den Aufruf:
function CPXaddrows(env:CPXEnvptr; LP: CPXLPptr;ccnt,rcnt,nzcnt:integer;
rhs,sense,rmatbeg,rmatind,rmatval,colname,rowname: pointer):integer;cdecl; external cplex name 'CPXaddrows';
Delphi-Quellcode:
es geht auch folgendes:var rowname, colname : PChar; begin GetMem(rowname, 4); GetMem(colname, 4); FillChar(rowname, sizeof(rowname), #0); FillChar(colname, sizeof(rowname), #0); Rowname := 'xyz'; Colname := 'abc'; status:=CPXaddrows(env,lp,3,2,6,rhs,sense,rmatbeg,rmatind,rmatval,@colname[0],rowname[0]);
Delphi-Quellcode:
Probier das mal.var rowname, colname : Array[0..3] of Char; begin FillChar(rowname, sizeof(rowname), #0); FillChar(colname, sizeof(rowname), #0); Rowname := 'xyz'; Colname := 'abc'; status:=CPXaddrows(env,lp,3,2,6,rhs,sense,rmatbeg,rmatind,rmatval,@colname[0],rowname[0]); Gruß oki |
Hi Oki,
danke dir. Hat leider nicht geklappt, gab wieder die identsiche Fehlermeldung. Wenn Du noch eine Idee hast, wäre ich dir dankbar. Sonst ist auch nicht so schlimm. Viele Grüße Kaddy |
Hi,
Hast du eine Beschreibung der Methode oder eine C-Deklaration da? Gib mal rüber. Gruß oki |
Hi,
danke Dir fürs Angebot. Werde ich nächste Woche herraussuchen, was ich habe. Schöne Ostern! Gruß Kaddy :dancer: |
Hallo,
viel habe ich leider nicht gefunden. Im Handbuch steht, dass ich die Funktion wie oben beschireben in Delphi definieren soll. Ich habe dann noch die Dekleration in c gefunden und die ist folgendermaßen. char *colname[NUMCOLS]; colname[0] = "x1"; colname[1] = "x2"; colname[2] = "x3"; Vielleicht hast du ja eine Ahnung wie man die am besten in delphi darstellt. Danke! Gruß Kaddy |
Hi Kaddy,
das was ich sehe ist folgendes: Du sollst in dieser Methode die Anzahl der Spalten für die du Werte möchtest übergeben und erhältst als Rückgabewert einen nullterminierten String. Hierbei ist jedem Byte ein Spaltenwert zugeordnet (was immer auch diese Spaltenwerte sind, sie können die Größe eines Byte nicht überschreiten [Char ist naheliegend]). das komische ist, dass für den Parameter NUMCOLS kein Typ angegeben ist, sowie für die Deklaration []-Klammern verwendet werden. das kenne ich so nicht. C ist aber auch nicht so recht mein Ding. Ich würde jetzt aber folgendes deklarieren
Delphi-Quellcode:
Damit müßtest du einen Zeiger auf einen nullterminierten String bekommen, den du wie beschrieben auslesen kannst.
Function ColName(ColCount : Integer): PChar; cdecl; .....
Gruß oki |
Hi Oki,
danke Dir, werde ich mal ausprobieren. Gruß Kaddy |
Hi kaddy,
ich glaube, ich war jetzt auf dem falschen weg. Was du mir gegeben hast ist nicht die Methode, sondern die Beschreibung des Parameters. Hier must du die weiter vorn beschriebene Methode aufrufen und einen Zeiger für ColName übergeben. Such noch mal nach einer Beschreibung für die eigentliche Methode. Gruß oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz