AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

array in pointer einbinden

Ein Thema von kaddy · begonnen am 15. Apr 2003 · letzter Beitrag vom 22. Apr 2003
Antwort Antwort
Seite 1 von 2  1 2      
kaddy

Registriert seit: 8. Apr 2003
Ort: Clausthal
39 Beiträge
 
Delphi 6 Personal
 
#1

array in pointer einbinden

  Alt 15. Apr 2003, 11:18
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2
  Alt 15. Apr 2003, 13:39
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
  Mit Zitat antworten Zitat
kaddy

Registriert seit: 8. Apr 2003
Ort: Clausthal
39 Beiträge
 
Delphi 6 Personal
 
#3
  Alt 15. Apr 2003, 15:30
Hi,
danke für den Tipp. Geht bei mir so aber nicht. Gibt es nicht noch eine andere Möglichkeit?
Gruß
Kaddy
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4
  Alt 15. Apr 2003, 16:54
Hi,

gib mal die Methode in C-Deklaration sowie deine Definition in Delphi rüber.

Gruß oki
  Mit Zitat antworten Zitat
kaddy

Registriert seit: 8. Apr 2003
Ort: Clausthal
39 Beiträge
 
Delphi 6 Personal
 
#5
  Alt 16. Apr 2003, 10:58
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:
function CPXaddrows(env:CPXEnvptr; LP: CPXLPptr;ccnt,rcnt,nzcnt:integer;
        rhs,sense,rmatbeg,rmatind,rmatval,colname,rowname:
        pointer):integer;stdcall; external cplex name 'CPXaddrows';
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.

Die Typen Definition ist folgendermaßen:

Delphi-Quellcode:
Tvarc= array[0..2] of char;
ptrTvarc=^Tvarc;
Die Variablen definiere ich folgendermaßen:

Delphi-Quellcode:
colname: ptrTvarc;
rowname: ptrTvarc;
Dann reserviere ich Speicher:

Delphi-Quellcode:
GetMem(rowname,3*SizeOf(Char));
GetMem(colname,3*SizeOf(Char));
Ich weise den Variablen die Werte zu:

Delphi-Quellcode:
        colname[0]:='y';
        colname[1]:='x';
        colname[2]:='z';

        rowname[0]:='a';
        rowname[1]:='b';
        rowname[2]:='c';
Die Funktion rufe ich dann folgendermaßen auf:

status:=CPXaddrows(env,lp,3,2,6,rhs,sense,rmatbeg,rmatind,rmatval,colname,rowname); Und schleißlich gebr ich den Speicher wieder frei:

Delphi-Quellcode:
FreeMem(rowname,3*SizeOf(Char));
FreeMem(colname,3*SizeOf(Char));
Wenn ich es laufen lasse kommt dann die Felhermeldung:

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]
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6
  Alt 16. Apr 2003, 13:31
Also,

probiere mal anstatt Stdcall cdecl.

Der Aufwand mit den Pointern tut nicht not. definiere einfach folgendes:

Delphi-Quellcode:
function CPXaddrows(env:CPXEnvptr; LP: CPXLPptr;ccnt,rcnt,nzcnt:integer;
rhs,sense,rmatbeg,rmatind,rmatval,colname,rowname:
pointer):integer;cdecl; external cplex name 'CPXaddrows';
und für die Variablen sowie den Aufruf:

Delphi-Quellcode:

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]);
es geht auch folgendes:
Delphi-Quellcode:

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]);
Probier das mal.

Gruß oki
  Mit Zitat antworten Zitat
kaddy

Registriert seit: 8. Apr 2003
Ort: Clausthal
39 Beiträge
 
Delphi 6 Personal
 
#7
  Alt 16. Apr 2003, 15:26
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8
  Alt 17. Apr 2003, 09:11
Hi,

Hast du eine Beschreibung der Methode oder eine C-Deklaration da? Gib mal rüber.

Gruß oki
  Mit Zitat antworten Zitat
kaddy

Registriert seit: 8. Apr 2003
Ort: Clausthal
39 Beiträge
 
Delphi 6 Personal
 
#9
  Alt 17. Apr 2003, 14:17
Hi,
danke Dir fürs Angebot. Werde ich nächste Woche herraussuchen, was ich habe. Schöne Ostern!
Gruß
Kaddy
  Mit Zitat antworten Zitat
kaddy

Registriert seit: 8. Apr 2003
Ort: Clausthal
39 Beiträge
 
Delphi 6 Personal
 
#10
  Alt 22. Apr 2003, 14:39
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz