Autor Beitrag
antonc
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 13.02.07 23:22 
Hallo,

wie übergibt man ein 2 Dimensionales Array an eine Funktion?
(Beispiel erwünscht)

Danke im voraus.

MFG Anton


Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Di 13.02.2007 um 23:38
DrRzf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: Di 13.02.07 23:25 
du musst das array als typ deklarieren und dann den Typen übergeben

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Type
  TmyArray : array[1..5,1..10] of integer;

function(MyArray: TMyArray): TMyArray;
begin
  //für die rückgabe
  result[1,1] := MyArray[1,2] + MyArray[1,3];
end;

_________________
rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
antonc Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 13.02.07 23:28 
perfekt, es geht

danke
basti_1984
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 104

Linux, Win Xp, Win 2000
Delphi, C, C++, PHP,
BeitragVerfasst: Mi 14.02.07 08:22 
Guten Morgen, bin zufällig über deinen Beitrag gestolpert. Die Lösung funktioniert aber sie ist nicht optimal. Du musst dir vorstellen das der Rechner für dei Array Speicher belegt.
Wenn du nun das Array an eine Funktion übergibts wird nochmals Speicher benötigt, obwohl die Daten doch schon im Speicher sind. Also besser ist es der Funktion die Adresse mit zuteilen an der das Arry im speicher steht. bei einem zweidimensionalen array sind die unterschiede vielleicht noch nicht so gravierent aber stell dir mal das ganze mit größeren array vor.
ich bi in delphi leider nicht so fit mit zeigern . deshalb kann ich dir auch kein beispiel zeigen.

_________________
Wissen ist Macht. Nichts zu Wissen macht auch nichts
Corpsman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228

KUbuntu 10.4
Lazarus
BeitragVerfasst: Mi 14.02.07 09:02 
Meines erachtens müsste es schon reichen wenn er ein Var Parameter draus macht. Dann wird nur noch die Reverenz ( also der Zeiger ) übergeben.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Type
  TmyArray : array[1..5,1..10] of integer;

function(var MyArray: TMyArray): TMyArray;
begin
  //für die rückgabe
  result[1,1] := MyArray[1,2] + MyArray[1,3];
end;


Allerdings ist Klar das du dann ein Schreibrecht auf das Array mit übergibst !!

_________________
--
Just Try it.
basti_1984
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 104

Linux, Win Xp, Win 2000
Delphi, C, C++, PHP,
BeitragVerfasst: Mi 14.02.07 09:17 
Genau und nun nimm mal an, das er keinen Integer nimmt, sondern vielleicht eine Typ datensatz mit einer sehr verschachtelten struktur aus strings, intergern usw...
Ich denke das Problem wird dann klar.
Also er muss unbedingt einen zeiger verwenden, da er sonst gefahr läuft einen stackoverflow(ist schon etwas schwierig zu erreichen unter windows und mit delphi). zu erreeichen

_________________
Wissen ist Macht. Nichts zu Wissen macht auch nichts
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 14.02.07 09:32 
Also für einen Stackoverflow müssten schon seeehr viele Rekursionsschritte gemacht werden (passiert normalerweise ja nur bei durch falsche Abbruchbedingungen). Aber da ist es egal, ob die Daten als var-Parameter übergeben werden, denn auf dem Stack landet so oder so wenn überhaupt dann nur ein Pointer. Und das ist auch nur nötig, wenn mehr als 3 Parameter übergeben werden. Die ersten drei landen in den Registern eax, edx und ecx (in dieser Reihenfolge).
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mi 14.02.07 09:37 
so egal finde ich es nicht:
Beispiel: quadratisches Array und man will Spalten und Zeilen tauschen -> hier gibt es bei var sicherlich ein falsches Ergebnis, während man ohne bzw. mit const sicherlich zu richtigen Ergebnis kommt!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 14.02.07 09:46 
Naja, man muss eben wissen, was man in einem speziellen Fall machen möchte. Will man mit den Daten arbeiten und die Variable auch als Zwischenspeicher nutzen, dann muss man eine Kopie der Daten übergeben. Will man die Variable nur zum Lesen nutzen, dann reicht ein Pointer (var-Parameter). Und wenn man sogar die ursprünglichen Daten verändern will, dann muss es ein Pointer sein.

Aber es kommt eben wirklich auf den Anwendungsfall an.
Deshalb hab ich eben dazu auch nix gesagt sondern nur richtiggestellt, dass das Problem hier nicht der Stack ist.
Das Problem ist höchstens der verfügbare Arbeitsspeicher, aber bei heitigen PCs müsste man da ja schon seeehr viele Aufrufe starten oder seeehr große Daten benutzen, damit das spürbar würde.
basti_1984
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 104

Linux, Win Xp, Win 2000
Delphi, C, C++, PHP,
BeitragVerfasst: Mi 14.02.07 09:50 
JA du ahst natürlich recht der Arbeitsspeicher war wohl eben etwas verwirrt. Aber trotzdem er sollte sich gleich an die Zeigerarithmetik gewöhnen. es ist doch egal ob ich die daten lesen oder schreibenn möchte. Ein Zeiger ist aber nicht ganz ungefährlich stichwort wilde zeiger. naja ich würde auf jeden fall zu einem zeiger raten ist die bessere variante

_________________
Wissen ist Macht. Nichts zu Wissen macht auch nichts
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 14.02.07 09:58 
user profile iconbasti_1984 hat folgendes geschrieben:
"Aber trotzdem er sollte sich gleich an die Zeigerarithmetik gewöhnen.

tja, aber mit zeigerarithmetik, hat das ganze denn auch schon gar nix zu tun...
:mahn:


Zuletzt bearbeitet von Grenzgaenger am Mi 14.02.07 10:05, insgesamt 2-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 14.02.07 09:59 
Immer sind Zeiger eben nicht sinnvoll. Beispiel: Backtracking. Die einfachste Möglichkeit ist erstmal einfach immer eine Kopie der Daten weiterzugeben. Dass das nicht immer die optimalste Lösung ist, ist ne andere Sache. Aber irgendwie muss man ja die aktuellen Schritte jeweils beim Zurückgehen wieder rückgängig machen, wenn man nur einen Pointer auf die ursprünglichen Daten hat.
1. muss man da sehr aufpassen, was man tut (das sollte allerdings nicht das Problem sein)
2. braucht das jedesmal Rechenzeit

Daher dürfte das dann langsamer werden als etwas mehr Seicher zu benutzen...

// EDIT:
user profile iconGrenzgaenger hat folgendes geschrieben:
tja, aber mit zeigerarithmetik, hat das ganze denn auch schon gar nix zu tun...
Das außerdem... Hab ich gar nicht drauf geachtet.
basti_1984
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 104

Linux, Win Xp, Win 2000
Delphi, C, C++, PHP,
BeitragVerfasst: Mi 14.02.07 10:25 
Nun legt doch nicht jedes Wort auf dioe Goldwage. Sicher ihr beide irgendwo recht es kommt auf den Anwednugnsfall an. da dieser gar nicht bekannt ist, brauchen wir uns auch nicht weiuter zu streiten,

_________________
Wissen ist Macht. Nichts zu Wissen macht auch nichts