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 1 von 2  1 2      
egal

Registriert seit: 14. Jul 2004
190 Beiträge
 
Delphi XE4 Professional
 
#1

Pointer auf Array of record

  Alt 26. Okt 2004, 10:53
Hallo, mit einfachenem record funktioniert alles gut, aber wenn ich einen Array of record benutzen möchte, dann bekomme ich später in der Funktion eine Fehlemeldung:" Zeigetyp erwartet".
Die Deklaration:
Delphi-Quellcode:
type
    TRPerson = record
    Vorname: string;
    Name: string;
    Adresse: string;
    Plz: string;
    Ort: string;
  end;
  TPRPerson = array of TRPerson;

var PRPerson : ^TPRPerson;

Und dann in der Funktion:

Delphi-Quellcode:
 function myFunc(PRPerson: TPRPerson);
  var
    Vorname1 : array of String[10];
  begin
       Vorname1[1] := PRPerson[1]^.Vorname;
  .......................
  end;
Was mache ich hier falsch, danke.
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

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

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 10:57
Erstmal ist die Fehlermeldung immer hilfreich. Zudem dürfte das ^ überflüssig sein, da [x] bereits eine Dereferenzierung ist. Ist das gleiche wie bei Pointern auf Records. Dort brauchst du auch kein ^ anzugeben.

Ausserdem brauchst du bei dynamischen Arrays nicht unbedingt mit Pointer zu arbeiten. Da an Funktionen sowieso nur die Adresse übergeben wird ohne das komplette Array zu kopieren.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#3

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:08
Hmm, also bei mir kommt da der Syntaxfehler "Array type required" und nicht "Pointer type required"...
Wie dem auch sei, folgende Syntax funktioniert bei mir: PRPerson^[1].Vorname; Lässt man das ^ weg, meckert der D6-Parser ebenfalls, daß man einen Array-Typ braucht (ist halt nicht alles so einfach wie C...). Der Pointer wird also erst dereferenziert, man erhält ein Array, und kann dann auf die Werte zugreifen.

Ansonsten hat Christian allerdings Recht, bei einem dynamischen Array, wo die Variable nicht direkt auf das erste Element zeigt, sondern einen Zeiger der auf das erste Element enthält, ist ein Zeiger auf dieses Array ein wenig doppelt gemoppelt.
Außerdem solltest du dran denken, daß dynamische Arrays allesamt null-indiziert sind, d.h. mit myarray[1] erhälst du schon den zweiten Wert im Array.


@Christian: Die Fehlermeldung hat er gepostet
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

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

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:13
Zitat von tommie-lie:
@Christian: Die Fehlermeldung hat er gepostet
Mit der Zeit wird man einfach Blind für sowas

Ich glaube in seinem Beispiel war einfach der Fehler, dass er im Funktionskopf TPRPerson geschrieben hat und somit doch wieder das Array ohne Pointer übergibt. Deshalb hat er natürlich bei PRPerson[1] nicht gemeckert, sondern erst bei dem ^, da ja PRPerson[1] ein gültiger Record ist.

Okay. Jetzt haben wir ihn genug verwirrt.

@egal: Mach einfach die Sache mit den Pointern weg. Dann sollte es klappen.
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
190 Beiträge
 
Delphi XE4 Professional
 
#5

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:14
Zitat von jim_raynor:
Erstmal ist die Fehlermeldung immer hilfreich. Zudem dürfte das ^ überflüssig sein, da [x] bereits eine Dereferenzierung ist. Ist das gleiche wie bei Pointern auf Records. Dort brauchst du auch kein ^ anzugeben.

Ausserdem brauchst du bei dynamischen Arrays nicht unbedingt mit Pointer zu arbeiten. Da an Funktionen sowieso nur die Adresse übergeben wird ohne das komplette Array zu kopieren.
Die Funktion muss ich später in eine Dll einbinden und da kann man solche Arrays nur mit der Hilfe von Pointer realisieren oder?
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

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

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:18
Zitat von egal:
Die Funktion muss ich später in eine Dll einbinden und da kann man solche Arrays nur mit der Hilfe von Pointer realisieren oder?
Da wird es natürlich schwierig. Erstmal ist glaube wichtig, dass das Programm, was die DLL nutzt auch in Delphi geschrieben wird, da zum Beispiel in C++ der Umgang mit dynamischen Arrays komplett anders geregelt ist.

Bin mir jetzt nicht sicher, aber theoretisch sind Dynamische Arrays genau wie Strings zu benutzen. Bei Strings musst du die Unit Sharemem (oder ein gleichwertiger Ersatz) sowohl in dem Programm als auch in der DLL einbinden. Dann sollte es klappen. Hab sowas allerdings noch nie gemacht.
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
190 Beiträge
 
Delphi XE4 Professional
 
#7

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:19
Zitat von tommie-lie:
Hmm, also bei mir kommt da der Syntaxfehler "Array type required" und nicht "Pointer type required"...
@Christian: Die Fehlermeldung hat er gepostet
Ich arbeite schon in einem Dll-Projekt, deswegen habe ich wahrscheinlich andere Fehlermeldung. Wenn ich ohne Pointer arbeite, dann bleibt mein record einfach leer, deshalb habe ich gedacht, dass ich Pointer benutze, aber es klappt doch nicht ganz.
  Mit Zitat antworten Zitat
egal

Registriert seit: 14. Jul 2004
190 Beiträge
 
Delphi XE4 Professional
 
#8

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:25
Zitat von jim_raynor:
Zitat von egal:
Die Funktion muss ich später in eine Dll einbinden und da kann man solche Arrays nur mit der Hilfe von Pointer realisieren oder?
Da wird es natürlich schwierig. Erstmal ist glaube wichtig, dass das Programm, was die DLL nutzt auch in Delphi geschrieben wird, da zum Beispiel in C++ der Umgang mit dynamischen Arrays komplett anders geregelt ist.
Ja es gibt natürlich eine Möglichkeit alles in ein String speichern und dann mit Hilfe von Pointer(PChar) meine Elemente einzeln rausschneiden, aber ich will eigentlich eine elegante Lösung finden, irgendwie muss es doch funktionieren. ShareMem kann ich leider nicht benutzen, auf diese Dll muss ich in Fortran zugreifen.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#9

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:29
Zitat von jim_raynor:
Bin mir jetzt nicht sicher, aber theoretisch sind Dynamische Arrays genau wie Strings zu benutzen. Bei Strings musst du die Unit Sharemem (oder ein gleichwertiger Ersatz) sowohl in dem Programm als auch in der DLL einbinden.
Jupp, so ist es nicht nur mit Strings, sondern auch mit dynamischen Arrays. Zusätzlich muss die DL BorlandMM.dll mit dem Projekt ausgeliefert werden, sonst versucht ShareMem vergeblich die DLL zu laden.

In C werden dynamische Arrays als einfacher Pointer deklariert. Dieser zeigt auf das erste Element, mit malloc schnappt man sich dann seinen Speicher und gut iss. Das geht wunderbar, weil man in C Pointer genauso dereferenzieren kann wie ein Array, und der Compiler sorgt gleich dafür, daß die OFfsets stimmen, sollte es mal kein "array of Byte" sein. Dynamische Arrays (und alle dynamischen Sachen) sind unter Delphi allerdings eine Sache für sich und sind ohne Weiteres nicht mit dem Rest der Welt kompatibel, es sei denn man fummelt sich selbst durch die RTL und schaut, wo man denn seine Referenzzähler erhöht und erniedrigt.

@egal: Wenn es also eine DLL sein soll, die auch mit C und anderen Sprachen benutzbar sein soll:
- verzichte auf Strings und dynamische Arrays! PChar und Pointer auf den jeweiligen Datentyp sind zwar unter Delphi ein wenig umständlicher zu bedienen ("ein wenig" meine ich aber wirklich so, denn so sehr viel komplizierter wird's nicht), dafür funktioniert es aber mit jeder anderen Sprache auch.
- deklariere exportierte Funktionen unbedingt als stdcall oder als cdecl (letzteres ist die normale Calling Convention von C, möglicherweise wird sie aber von anderen Sprachen nicht unterstützt (VisualBasic? ), erstere sollte mit allen Sprachen funktionieren, die die Windows-API benutzen können)
  Mit Zitat antworten Zitat
egal

Registriert seit: 14. Jul 2004
190 Beiträge
 
Delphi XE4 Professional
 
#10

Re: Pointer auf Array of record

  Alt 26. Okt 2004, 11:44
Zitat von tommie-lie:
@egal: Wenn es also eine DLL sein soll, die auch mit C und anderen Sprachen benutzbar sein soll:
- verzichte auf Strings und dynamische Arrays! PChar und Pointer auf den jeweiligen Datentyp sind zwar unter Delphi ein wenig umständlicher zu bedienen ("ein wenig" meine ich aber wirklich so, denn so sehr viel komplizierter wird's nicht), dafür funktioniert es aber mit jeder anderen Sprache auch.
- deklariere exportierte Funktionen unbedingt als stdcall oder als cdecl (letzteres ist die normale Calling Convention von C, möglicherweise wird sie aber von anderen Sprachen nicht unterstützt (VisualBasic? ), erstere sollte mit allen Sprachen funktionieren, die die Windows-API benutzen können)
Ist klar, deswegen will ich einen Pointer auf meinen array benutzen. Ich habe schon Beispiele gesehen, wo Pointer auf dynamische Array oder auf record in einer Dll realisiert wurden, aber mit Array of record könnte ich leider nichts finden. Aber ich experementiere gerade, vielleicht klappt es doch.
  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 16:21 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