| Autor |
Beitrag |
antonc
Hält's aus hier
Beiträge: 7
|
Verfasst: 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 Christian S.: Topic aus VCL (Visual Component Library) verschoben am Di 13.02.2007 um 23:38
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Di 13.02.07 23:25
du musst das array als typ deklarieren und dann den Typen übergeben
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Type TmyArray : array[1..5,1..10] of integer;
function(MyArray: TMyArray): TMyArray; begin 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 13.02.07 23:28
|
|
basti_1984
      
Beiträge: 104
Linux, Win Xp, Win 2000
Delphi, C, C++, PHP,
|
Verfasst: 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
      
Beiträge: 228
KUbuntu 10.4
Lazarus
|
Verfasst: 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.
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 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
      
Beiträge: 104
Linux, Win Xp, Win 2000
Delphi, C, C++, PHP,
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 104
Linux, Win Xp, Win 2000
Delphi, C, C++, PHP,
|
Verfasst: 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
|
Verfasst: Mi 14.02.07 09:58
basti_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...

Zuletzt bearbeitet von Grenzgaenger am Mi 14.02.07 10:05, insgesamt 2-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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:
Grenzgaenger 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
      
Beiträge: 104
Linux, Win Xp, Win 2000
Delphi, C, C++, PHP,
|
Verfasst: 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
|
|