![]() |
Mehrdimensionales dynamisches Array an Prozedur übergeben
Hallo zusammen,
folgende Situation: Ich brauche ein globales zweidimensionales array. Die Länge muß aus einem file ausgelesen werden, also kann est erst zur Laufzeit mit setlength definiert werden. Wenn ich das aber folgendermaßen in einem Prozeduraufruf tun will:
Delphi-Quellcode:
(wobei laenge und breite funktionen sind, die die benötigten Daten aus der Datei auslesen)
procedure Felderzeugen (var tabelle : array of array of boolean);
var Zeile:string; i,j:integer; begin setlength (tabelle,laenge,breite); ... beschwert er sich: "Fehler] chiquadrat.pas(114): Bezeichner erwartet, aber 'ARRAY' gefunden", anscheinend mag er die mehrdimensionalität meines arrays also nicht. Die Hilfe ist dazu auch eher kryptisch: "Hinweis: In einigen Funktions- und Prozedurdeklarationen werden Array-Parameter in der Form array of Basistyp ohne festgelegten Indextyp angegeben:
Delphi-Quellcode:
In diesem Fall kann die Funktion auf alle Arrays des angegebenen Basistyps angewendet werden, unabhängig von der Größe der Arrays und der Art ihrer Indizierung. Es spielt auch keine Rolle, ob den Arrays der Speicherplatz statisch oder dynamisch zugewiesen wird. Weitere Informationen hierzu finden Sie im Abschnitt Offene Array-Parameter."
function CheckStrings(A: array of string): Boolean;
kann mir irgendwer helfen? wie kann man das umgehen? vielen Dank im vorraus Manuel [edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit] |
Re: Mehrdimensionales dynamisches Array an Prozedur übergebe
Du musst das Array als Type deklarieren und dann den Type als Parameter übegeben ....
|
Re: Mehrdimensionales dynamisches Array an Prozedur übergebe
Willkommen im Forum !!
Um so Sachen zu umgehen kannst du dir einen eigenen Typ definieren:
Delphi-Quellcode:
type
MyArray = Array of Array of Boolean; //Diesen Typ kannst du dann übergeben: procedure Felderzeugen (var tabelle : Myarray); |
Re: Mehrdimensionales dynamisches Array an Prozedur übergebe
Danke vielmals für die promte Antwort, jetzt klappt es.
ciao Manuel |
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Hallo,
ich hätte dazu mal noch eine weiterführende Frage: wie funktioniert das "Unit-übergreifend"? Beispielsweise habe ich in einer Unit (Unit1) eine Klasse deklariert. Diese besitzt eine Prozedur um eine Berechnung auszuführen. Dazu benötige u.a. ich ein zweidimensionales Feld. In einer anderen Unit (Unit2) wird ein Objekt dieser Klasse erstellt und die Prozedur aufgerufen. Wenn ich das Programm kompilieren will bekomme ich nun immer die Fehlermeldung: "[DCC Fehler] Unit2.pas(1723): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen" Einen eigenen Typ habe ich schon deklariert:
Delphi-Quellcode:
type TArray2D = array[0..5] of array[0..2] of Double;
Bin mir allerdings unsicher, wo ich das genau hinschreiben muss. Hab auch einfach stumpf den Typ in beiden Units gleichermaßen deklariert, in der Hoffnung, dass das irgendwie funktioniert. Tat es aber leider nicht. Edit: Die jeweiligen Units sind im Implementation Bereich unter Uses "ineinander eingebunden" |
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Wenn Du den Typ in beiden Units deklarierst, sind das für den Compiler wieder 2 verschiedene Typen und somit nicht kompatibel. Ich würde den Typen entweder in einer eigenen Unit oder in der Unit mit der verarbeitenden Klasse deklarieren und in der anderen Unit einfach nur verwenden.
|
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Zitat:
|
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Zitat:
Leider funktioniert das nicht. Habe die Typdeklaration aus der Unit2 (in der das Object der Klasse erstellt und die Prozedur aufgerufen wird) entfernt. Jetzt erhalte ich folgende Fehlermeldung: "[DCC Fehler] Unit2.pas(46): E2003 Undeklarierter Bezeichner: 'TArray2D'" An welcher stelle in der Unit sollte ich den Typen eigentlich deklarieren? In der Klasse selbst oder allgemein? Derzeit ist der Typ allgemein deklariert. Zitat:
|
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Hast Du die Deklaration des Typs im implementation-Teil untergebracht? Dann verschieb sie mal in den interface-Teil.
|
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Steht in Unit1 direkt unter Interface
Unit1:
Delphi-Quellcode:
unit Unit1;
interface uses SysUtils, Types, Classes, Variants, Math, Dialogs; type TArray2D = array[0..5] of array[0..2] of Double; |
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Zitat:
Ich bekomme jetzt die Fehlermeldung: "F2047 Zirkuläre Unit-Referenz auf Unit1" was muss ich machen...? Daher vorab...
Delphi-Quellcode:
Unit Definitionen;
Interface type TArray2D = array[0..5] of array[0..2] of Double; // Oder TArray2D = Array[0..5,0..2] of Double;
Delphi-Quellcode:
Unit Unit1;
Interface Uses Definitionen...
Delphi-Quellcode:
Mavarik
Unit Unit2;
Interface Uses Definitionen... |
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Das ist ja genau das, was ich als erste Möglichkeit vorgeschlagen hatte. Die nächste Frage ist aber: wieso müssen sich die Units gegenseitig einbinden?
|
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Zitat:
Zitat:
Zitat:
|
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Ich muss dazu sagen, dass ich das Programm nicht allein geschrieben habe, sondern ein bestehendes Programm erweitere. Da ich ein Anfänger auf dem Gebiet der (Delphi)-Programmierung bin habe ich mir einiges von meinem Vorgänger abgeschaut, unter anderem das gegenseitige Einbinden der Units.
Irgendwo habe ich mal gehört, dass globale Variablen (dementsprechend auch Typen?) wohl verpöhnt sind. Oder wäre das eine Lösungsmöglichkeit. Mit globalen Variablen/Typen kenne ich mich aber leider auch nicht aus. |
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Nochmal ganz langsam: wenn die Typdeklaration der einzige Grund dafür ist, dann wie gesagt entweder in eine eigene Unit packen oder alternativ dort, wo damit gearbeitet wird (IMO also dort, wo die Klasse deklariert ist).
Delphi-Quellcode:
Typ und Klasse sind nun in allen Units verfügbar, die Work einbinden.
unit Work;
interface uses ...; type TMyType = ...; TMyClass = class ... procedure DoSomething(Foo: TMyType); end;
Delphi-Quellcode:
Ist aber in Use etwas deklariert, worauf Work zugreifen soll, müssen sie sich (zunächst) gegenseitig einbinden. Das ist kein gutes Design, daher sollte man sich überlegen, wie man das vermeiden kann.
unit Use;
interface uses ..., Work; |
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Zitat:
![]() |
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Zitat:
Aha, da lag der Fehlerteufel. Die Unit work war in der Unit Use im Implementation- und nicht im Interface-Bereich eingebunden. Hatte das irgendwo mal gelesen, dass man das eigentlich so machen sollte :gruebel: Vielen Dank! |
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Zitat:
PS: Wie erreiche ich, dass der Thread nichtmehr als offene Frage angezeigt wird? |
AW: Mehrdimensionales dynamisches Array an Prozedur übergeben
Du kannst sie auch im implementation-Abschnitt einbinden, allerdings darf dann im interface-Abschnitt auf keinen Typen und keine Routine zugegriffen werden, der/die in der eingebundenen Unit steht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 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