Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Dynamisches Array in Prozeduraufrufen 2


Smithers - Di 19.08.03 14:10
Titel: Dynamisches Array in Prozeduraufrufen 2
Hallo,

ich möchte aus einem Hauptprogramm einer Prozedur/Funktion, die sich in einer extra Unit befindet, ein zweidimensionales dynamisches Array zum Bearbeiten übergeben. Habe mit 1000 Varianten nur Fehlermeldungen produziert...

Wie kann ich das Problem lösen (zB einen Typ aus dem aufrufenden Programm der Unit zur Verfügung stellen, zweidimensionales Array in Prozeduraufruf einbinden...)?

Liebe Grüße,

Smithers


derDoc - Di 19.08.03 14:20

Wie übergibst du dein Array denn der Prozedur?

Ein wenig Quellcode wäre hilfreich.


Smithers - Di 19.08.03 14:59
Titel: Varianten
Habe (wie oben geschrieben) schon verschiedene Varianten probiert:

In der Unit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure Daten(var Matrix : array of orray of byte); //geht gar nicht, da "array of" doppelt

//oder
procedure Daten(var Matrix : array of integer); //Versuch eines offenen Arrays

//oder
type
  TDaten = array of array of Byte;
...
procedure Daten(var Matrix : TDaten); //Kollidiert beim Aufruf aus dem Hauptprogramm

//oder
function Daten(...): array of array of byte; // 2x "array of" (siehe oben)

// eigentliche Zuweisung in der Prozedur/Funktion

Matrix[i,j]:=Hilf; //wobei Hilf vom Typ Byte ist

im Hauptprogramm:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var BildDaten : array of array of Byte;

...
setlength(BildDaten,X,Y);
Daten(BildDaten);

//oder

type
   TDaten = array of array of Byte;  //Typdef. in Unit analog (s.o.)
...
var BildDaten : TDaten;
...
setlength(BildDaten,X,Y);
Daten(BildDaten);

//oder als Funktion

var BildDaten : array of array of Byte;

...
setlength(BildDaten,X,Y);
BildDaten:=Daten(...);

Es waren wohl ein paar mehr, aber die fallen mir nicht mehr spontan ein...

Gibt es eine Möglichkeit, einen Typen im Hauptprogramm so festzulegen, das die aufgerufene Unit auf diesen zurückgreifen kann??? Vielleicht löst das ja mein Problem...

Liebe Grüße,
Smithers

PS: Die eigentliche Zuweisung (Indizes i,j) ist sauber, es treten nur Typenkonflikte auf.

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Tryer - Di 19.08.03 21:23

Da merkt man wieder das die beste Hilfe nichts wert ist wenn man sie nicht benutzt :roll:

Zum Thema "Array-Parameter" findet man:
Zitat:
Bei der Deklaration von Routinen, die Array-Parameter entgegennehmen, können Sie in den Parameterdeklarationen keinen Indextyp angeben. Ein Beispiel:

procedure Sort(A: array[1..10] of Integer); // Syntaxfehler

Diese Deklaration führt zu einem Kompilierungsfehler.

type TDigits = array[1..10] of Integer;

procedure Sort(A: TDigits);

Diese Deklaration ist dagegen gültig. In den meisten Fällen ist der Einsatz offene Array-Parameter jedoch die bessere Lösung.


MfG,
Tryer


Tino - Mi 20.08.03 08:50

Tryer hat folgendes geschrieben:
Da merkt man wieder das die beste Hilfe nichts wert ist wenn man sie nicht benutzt :roll:

Man muss diese Infos auch finden. Das ist meistens das Problem!

Gruß
Tino


Smithers - Mi 20.08.03 09:58
Titel: Lösung!!!
:D Heureka! :D

@ Tryer: Auf die Idee, einen Typen zu definieren bin ich ja auch gekommen! (siehe zitierte Quelltextvarianten)

Ich habe allerdings den Typen doppelt definiert, im Hauptprogramm und in der aufgerufenen Unit, klar das der Compiler damit nichts anfangen kann. *ÜberMichSelbstÄrger*

Es reicht den Typen brav im Interface-Teil der Unit zu definieren und er steht damit auch aufrufenden Programmen zur Verfügung!

Danke Eurer Mühe,

Smithers

PS: Manche Probleme sollte man überschlafen...