Uebergeben mehrdimensionaler Felder an Funktionen

Hallo,

ich brauche dringen schnell einen Tipp dazu.
Ich habe folgendes versucht, aber da meckert der Compiler

FUNCTION name (matrix : ARRAY [1…5,1…5] of INTEGER)

Ich sitze gerade im Rechenzentrum und versuche meine Programmierungsaufgabe zu loesen. Leider ist mein Wissen ueber Pascal sehr beschraenkt. In C++ koennte ich euch das herunterbeten, aber an der Uni foltert man uns mit Pascal :smile:
Fuer eure Hilfe waere ich sehr dankbar!

Gruss Ben

Type TMatrix = ARRAY [1…5,1…5] of INTEGER;

FUNCTION name (matrix : TMatrix):ERGEBNISTYP; //!!! Funktionen müssen einen Ergebnistyp haben

So sollte es klappen.

Array undefinierter Größe und Dimension kannst du so übergeben (nur ein doofes Beispiel):

Type 
 TVektor: Array[1..5] of Integer;
 TMatrix: Array[1..5,1..5] of Integer;
 TTensor: Array[1..5,1..5,1..5] of Integer;

FUNCTION name (VAR data; Dim:Byte):Integer;
begin
 case Dim of
 1: Result := TVektor(data)[1];
 2: Result := TMatrix(data)[3,2];
 3: Result := TTensor(data)[2,5,3];
 end;
end;

Gruß
Jochen

Hallo Jochen,

Besten Dank, so kann ich jetzt meine Aufgaben loesen. Ich finde es zwar etwas umstaendlich, dass man immer einen Typ definieren muss, aber was solls. Eigentlich ist es doch nur ein syntaktisches Problem. Finde ich ein etwas merkwuerdiges Verhalten.

Type TMatrix = ARRAY [1…5,1…5] of INTEGER;

FUNCTION name (matrix : TMatrix):ERGEBNISTYP; //!!! Funktionen
müssen einen Ergebnistyp haben

Klar, hatte ich vergessen

FUNCTION name (VAR data; Dim:Byte):Integer;

Aha, also kann man unbesimmte Daten (void) auch uebergeben, ohne einen Typ anzugeben. Die muss man nachher dann aber immer casten. Geht das nur wenn die Daten als VAR uebergeben werden, oder auch sonst?

begin
case Dim of
1: Result := TVektor(data)[1];
2: Result := TMatrix(data)[3,2];
3: Result := TTensor(data)[2,5,3];
end;
end;

Gruss Ben

Hallo Ben!

Aha, also kann man unbesimmte Daten (void) auch uebergeben,
ohne einen Typ anzugeben. Die muss man nachher dann aber immer
casten. Geht das nur wenn die Daten als VAR uebergeben werden,
oder auch sonst?

Ja und Nein.
Die Angabe „VAR“ zwingt den Compiler, nicht die Variable zu übergeben, sondern einen Zeiger auf den Speicherbereich. Es ist so einfacher Lesbar, als direkt einen Zeiger zu übergeben. Eine gleichwertige Lösung wäre z.B. auch diese:

Function Name(Parameter:stuck\_out\_tongue:ointer):Integer;
begin
 With TIgrendeinTyp(Parameter^) Do
 ...
end; 

...

Text := 'Hallo';
Value := Name(PChar(Text));

Zahl := 123;
Value := Name(@Zahl);

Objekt := TObject.Create;
Value := Name(Objekt);

Das war’s.
Gruß, Jochen

Hallo Jochen,

Ja und Nein.
Die Angabe „VAR“ zwingt den Compiler, nicht die Variable zu
übergeben, sondern einen Zeiger auf den Speicherbereich. Es
ist so einfacher Lesbar, als direkt einen Zeiger zu übergeben.

Natuerlich, das macht Sinn. Zeiger, das klingt wieder vertraut :smile:

Vielen Dank nochmal.

Gruss Ben