AGB  ·  Datenschutz  ·  Impressum  







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

Pointer auf Array of record

Ein Thema von egal · begonnen am 26. Okt 2004 · letzter Beitrag vom 28. Okt 2004
Antwort Antwort
Seite 2 von 2     12   
tommie-lie
(Gast)

n/a Beiträge
 
#11

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 10:54
Zitat von egal:
Ich habe schon Beispiele gesehen, wo Pointer auf dynamische Array oder auf record in einer Dll realisiert wurden
Auf Record okay, ist ja kein Kuststück, aber auf ein dynamisches Array? Das Beispiel würde ich auch gerne sehen, hast du einen Link dazu?
  Mit Zitat antworten Zitat
egal

Registriert seit: 14. Jul 2004
189 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:09
Zitat von tommie-lie:
Zitat von egal:
Ich habe schon Beispiele gesehen, wo Pointer auf dynamische Array oder auf record in einer Dll realisiert wurden
Auf Record okay, ist ja kein Kuststück, aber auf ein dynamisches Array? Das Beispiel würde ich auch gerne sehen, hast du einen Link dazu?
Z.B. so:
Delphi-Quellcode:
type
  PDynamicArray = ^TDynamicArray;

  TKlasse = class
  private
    FPArray: PDynamicArray;
  public
    constructor Create(AArray: TDynamicArray);
  end;

  constructor TKlasse.Create(AArray: TDynamicArray);
  begin
    FPArray := @AArray;
  end;
es waren auch andere Beispiele, wenn ich Zeit habe, finde ich noch was.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#13

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:53
Und das hat in einer DLL in Verbindung mit einer Hostanwendung in C und ohne ShareMem funktioniert?

/me trägt das mal in seine Liste der wissenswerten Dinge über Delphi-DLLs ein...
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#14

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:54
Das Problem ist nicht der Record ansich, sondern die Strings dadrin. Diese werden genau wie dynamische Arrays behandelt und somit hast du die gleichen Probleme.

Hier noch was um C++ artige Arrays zu verwenden:

Delphi-Quellcode:
type
  PStaticArray = ^TStaticArray;
  TStaticArray = Array[0..high(Integer)] of Integer;
Wenn du jetzt in der DLL einen Pointer vom Type PStaticArray übergibst, sollte es normal funktionieren:

Delphi-Quellcode:
procedure Test(DynArray: PStaticArray);
begin
  DynArray^[0] ...
end;
P.S: Natürlich darfst du keine Variable vom Typ TStaticArray anlegen, da dann der Arbeitsspeicher voll ist.

Jetzt bekommst du nur noch Probleme mit den Strings, aber wenn die in Fortran genauso gehandt werden wie in C++, dann versuche doch einfach mal im record statt String PChar.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
egal

Registriert seit: 14. Jul 2004
189 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:55
Zitat von tommie-lie:
Und das hat in einer DLL in Verbindung mit einer Hostanwendung in C und ohne ShareMem funktioniert?

/me trägt das mal in seine Liste der wissenswerten Dinge über Delphi-DLLs ein...
keine Ahnung, ich habe es nicht ausprobiert.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#16

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 12:05
Zitat von jim_raynor:
P.S: Natürlich darfst du keine Variable vom Typ TStaticArray anlegen, da dann der Arbeitsspeicher voll ist.
Naja, da das mindestens 4GB an Daten werden, wäre nicht nur der Arbeitsspeicher voll, sondern der gesamte Adressbereich, daß Anlegen der Variable dürfte also schon äußerst schwer fallen

Zitat von jim_raynor:
Jetzt bekommst du nur noch Probleme mit den Strings, aber wenn die in Fortran genauso gehandt werden wie in C++, dann versuche doch einfach mal im record statt String PChar.
Alle Programmiersprachen, die direkte Speicherzugriffe erlauben (über Pointer oder über Speicherzugriffsfunktionen), kommen auch mit PChar ohne Probleme zurecht.

Zitat von egal:
keine Ahnung, ich habe es nicht ausprobiert.
/me streicht es wieder aus seiner Liste der wissenswerten Dinge über Delphi-DLLs
  Mit Zitat antworten Zitat
egal

Registriert seit: 14. Jul 2004
189 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 12:10
Und noch eine Frage, wie soll ich diese Funktion in meinem Hauptprogramm aufrufen, zuerst versuche ich es in Delphi:

Delphi-Quellcode:
type
  TValue = record
    StrValue: String[6];
    IntValue: Integer;
  end;
  TValues = array of TValue;
var
  VDIINT: TValues;
  PVDIINT: ^TValues;
function VDIIWERT(PVDIINT: TValues; Feldnummer: integer): integer; external 'VDIDLL.dll'; stdcall;

my func;
begin
SetLength(VDIINT,Length(VDIINT)+1);
VDIINT[High(VDIINT)].StrValue := 'test';
VDIINT[High(VDIINT)].IntValue := 2;
cRet := IntToStr(VDIIWERT(PVDIINT, StrToInt(res1)));
end;
Wenn ich so mache, bekomme ich Fehlemeldung: "Inkompatible Typen TValues und Array", in der Zeile "cRet:=..". Soll man den Pointer irgenwie anders deklarieren?
  Mit Zitat antworten Zitat
egal

Registriert seit: 14. Jul 2004
189 Beiträge
 
Delphi 2006 Professional
 
#18

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 16:39
jetzt habe ich die Code bisschen geändert, aber ich kriege doch die falschen Werte und danach Zugriffsverletzung. Hier ist die Code:
Delphi-Quellcode:
type
  TValue = record
    StrValue: String[6];
    IntValue: Integer;
  end;
  TValues = array of TValue;
  PVDIINT: ^TValues;
var
  VDIINT: TValues;
  PVDIIN: PVDIINT;
  function VDIIWERT(PVDIIN: PVDIINT; Feldnummer: integer): integer; external 'VDIDLL.dll'; stdcall;

my func;
begin
SetLength(VDIINT,Length(VDIINT)+1);
VDIINT[High(VDIINT)].StrValue := 'test';
VDIINT[High(VDIINT)].IntValue := 2;
PVDIIN := @VDIINT;
cRet := IntToStr(VDIIWERT(PVDIIN, StrToInt(res1)));
end;
Und in der Dll:
Delphi-Quellcode:
type
  TValue = record
    StrValue: String[6];
    IntValue: Integer;
  end;
  TValues = array of TValue;
  PVDIINT: ^TValues;

function VDIIWERT(PVDIIN: PVDIINT; Feldnummer: integer): integer;
var
  j: Integer;
  arStri : array[1..10] of String;
  arInt : array[1..10] of Integer;
begin
  temp;
  j:= 0;
  VDIINT := @PVDIIN;
  arStri[1] := VDIINT[0].StrValue;
end;
Ich mache bestimmt was falsches, aber was? Vielleicht muss ich noch einen record machen und da mein TValues deklarieren und noch einen Pointer auf neuen record machen oder?
  Mit Zitat antworten Zitat
egal

Registriert seit: 14. Jul 2004
189 Beiträge
 
Delphi 2006 Professional
 
#19

Re: Pointer auf Array of record

  Alt 28. Okt 2004, 16:02
die Hilfe brauche ich immer noch?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 01:47 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