AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Funktionsrückgabewert: Array

Ein Thema von violinenspieler1000 · begonnen am 24. Sep 2008 · letzter Beitrag vom 25. Sep 2008
Antwort Antwort
Seite 2 von 2     12
Roachford
(Gast)

n/a Beiträge
 
#11

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 15:12
Zitat von oki:
Damit ergibt sich aber automatisch, dass Delphi intern die Parameterübergabe für unterschiedliche Typen auch unterschiedlich händelt. Oder wird bei der Übergabe einer Objectinstanz auch intern kopiert?
Nein, kann er gar nicht, weil dann müsste er einen Copy Constructor haben bzw. eine feste und automatisch erweiterte Funktion wie Assign() haben. Soviel Compilermagic hat Delphi nicht und es würde durch die vielen Zeigertypen (ob versteckt oder offensichtlich) in der Delphi Sprache nicht viel bringen, weil die wären auch mit einem Copy Constructor nil danach. Da hätte er dann noch mehr Probleme zu wissen ob du bei einem Zeigertyp den gleichen Zeiger oder eine neuen Zeiger auf eine Kopie haben willst. Aus dem gleichen Grund handhabt es C++ genauso, wobei es dort mit den reinen Objekten eh nötig ist.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 16:14
Dann versteh ich aber nicht, warum Delphi ein dynamisches Array als Parameter kopieren soll.

Gruß
42
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#13

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 16:40
Dein Objektinstanzenzeiger wird intern kopiert, nur das Objekt kann er nicht kopieren. Beispiel:

Delphi-Quellcode:
procedure Test(AObject: TObject);
begin
  AObject := nil;
end;

procedure Anderes;
var
  lInstance: TObject;
begin
  lInstance := TObject.Create;
  try
    Test(lInstance);
    
    if lInstance = nil then
      WriteLn('nicht kopiert')
    else
      WriteLn('Instanzenzeiger wurde kopiert & Kopie wurde zurück gesetzt');

  finally
    lInstance.Free;
  end;
end;
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 16:47
Ja klar, wenn ich den Parameter nicht als var übergebe, dann bleibt der Zeiger nach außen natürlich "konstant". Ich kann den Inhalt eines Objektes in der Procedure ändern, weil ich auf die enthaltenen Daten zugreife auf dessen Struktur der Zeiger der Instanz zeigt.
Ich dachte nur, dass Delphi das mit allen Zeigern so macht und ein dynamisches Array ist halt ein Zeiger auf den Speicher.

Gruß oki
42
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#15

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 16:52
Zitat von oki:
Ich dachte nur, dass Delphi das mit allen Zeigern so macht und ein dynamisches Array ist halt ein Zeiger auf den Speicher.
Macht er doch auch. Die TObject Deklaration impliziert ja schon einen Zeiger. Somit kannst du das Beispiel zuvor auch so umbauen, dass du TObject z.B. durch PByte ersetzt, das Verhalten wäre das gleiche.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 16:58
oh, ich glaub, jetzt reden wir aneinander vorbei. Ich wiederhol noch mal, was ich verstanden habe.

Wird ein dyn. Array in einer Procedure nicht als var-Parameter übergeben, so kopiert Delphi intern alle Daten des Arrays bei der Übergabe, was zu einer erheblichen Anzahl an Operationen führen kann.

Und genau das versteh ich nicht. Die Übergabe der Adresse sollte doch reichen, wie bei der Objectinstanz.
Mir gehts hier also ausschließlich um das Array, nicht um die Objekte.

Gruß
42
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#17

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 17:25
Zitat von oki:
Wird ein dyn. Array in einer Procedure nicht als var-Parameter übergeben, so kopiert Delphi intern alle Daten des Arrays bei der Übergabe, was zu einer erheblichen Anzahl an Operationen führen kann.
Nein, tut es nicht.

Roachford
Wenn du var weglässt, erstellt dir Delphi vor Änderungen eine Kopie des Arrays und somit setzt du höchstens die Kopie auf 0.


Das "vor Änderungen" bezieht sich nicht auf den Array Inhalt sondern auf das Array selbst.

Roachford
Ich müsste hier vllt. nochmal explizit darauf hinweisen, dass ich die Veränderung des Arrays meine - also von NIL setzen bist SetLength(). Ein Veränderung der Arrayinhalte ohne Grössenänderung ist natürlich ohne var möglich, da er die Daten an der Stelle direkt editiert, welche der Zeiger bestimmt.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#18

Re: Funktionsrückgabewert: Array

  Alt 25. Sep 2008, 18:56
Ja, dann haben wir wirklich aneinander vorbei gesprochen. Ich meinte eigentlich die Inhalte.

Dann sollte das jetzt geklärt sein.

Gruß oki
42
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf