Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Stellt man bei einem Objekt ein VAR davor oder nicht


Anonymous - Fr 09.08.02 00:32
Titel: Stellt man bei einem Objekt ein VAR davor oder nicht
Hallo zusammen,

leider hab ich hier noch nicht den Durchblick, weshalb ich nicht weiss ob das Thema hier ok ist oder doch unter Sonstiges. Leider hab ich hier keine Object Pascal Sparte gefunden. Aber zurück zu Frage:

Ich brauch von euch eine Antwort was richtig ist. In einem anderen Forum hab ich etwas behauptet und ... naja, ich meine ich hab Recht, der andere glaubt er hat Recht und wenn ich weitermache wird Streit draus. Deshalb frage ich hier mal. Ein Beispiel:


Quelltext
1:
2:
3:
4:
procedure Test(sl: TStringList);
begin
  //hier etwas mit sl machen aber kein Create und kein Free
end;


TSringList ist ein Objekt. Ich behaupte, daß man hier kein VAR vor sl stellen muß, da es nur ein Zeiger ist. Der Zeiger wird sich nicht in der Prozedur ändern wenn mit Create vorher für sl eine Instanz erstellt worden ist. Der einzige Grund ein VAR davorzustellen wäre, wenn das Objekt noch nicht initialisiert ist, also z.B. hier:


Quelltext
1:
2:
3:
4:
5:
procedure Test(var sl: TStringList);
begin
  sl := TStringList.Create;
  //hier etwas mit sl machen 
end;


Nur hier würde sl einen anderen Wert zurückliefern als das mit dem es reingekommen ist.

Ich weiss, daß es Befehe gibt mit dem man Zeiger verändern kann (wieso auch immer). Würde man aber, nach dem für sl eine Instanz erstellt worden ist, an dem Zeiger manipulieren? Sollte man also vor das Objekt ein VAR vorstellen? Oder ist es Blödsinn.

Kann mir einer sagen wann man den Zeiger einer Instanz ändern würde.


lemming - Fr 09.08.02 09:49

Hallo!

Es ist schlicht Blödsinn. Richtig ist das man KEIN Var, kein Create und kein Free braucht. In diesem Fall wäre "sl" nur ein pointer auf ein anderes Objekt.
Z.B. TMemo1.Lines

Schliesslich ruft man die Prozedur mit Test(Memo1.Lines) auf. Würde man versuchen danach ein Create (oder free) in Test zu versuchen bin ich mir ziemlich sicher das dies eine Exception hervor rufen würden.

Das mit dem Var hab ich ehrlich gesagt noch nie so gesehen.

Gruss lemming


cbs - Fr 09.08.02 10:00

ich bin auch der meinung von dir und lemming

du brauchst kein var, aber ob dus brauchst wenn du es innerhalb deiner procedure/function erst erstellen oder freigeben willst weiß ich nicht


Renegade - Fr 09.08.02 11:00

Moin erstmal!

lemming hat folgendes geschrieben:
Es ist schlicht Blödsinn. Richtig ist das man KEIN Var, kein Create und kein Free braucht. In diesem Fall wäre "sl" nur ein pointer auf ein anderes Objekt.
Z.B. TMemo1.Lines


Hat er meines erachtens nach recht.

cbs hat folgendes geschrieben:
, aber ob dus brauchst wenn du es innerhalb deiner procedure/function erst erstellen oder freigeben willst weiß ich nicht


Natürlich mußt du das.


Quelltext
1:
var test:tObject;                    


Woher soll der Kompiler sonst wissen, was bei deinen Befehlen angesprochen wird.

Gruß

Renegade


cbs - Fr 09.08.02 11:04

@Renegade: ne, das mit var war so gemeint

Popov hat folgendes geschrieben:
TSringList ist ein Objekt. Ich behaupte, daß man hier kein VAR vor sl stellen muß, da es nur ein Zeiger ist. Der Zeiger wird sich nicht in der Prozedur ändern wenn mit Create vorher für sl eine Instanz erstellt worden ist. Der einzige Grund ein VAR davorzustellen wäre, wenn das Objekt noch nicht initialisiert ist, also z.B. hier:


Quelltext
1:
2:
3:
4:
5:
procedure Test(var sl: TStringList); 
begin 
  sl := TStringList.Create; 
  //hier etwas mit sl machen 
end;


ob das var in diesem fall da sein muss oder nicht

das ich eine variable mit var deklarieren muss is mir sonnenklar

außerdem solltest du in meinem posting das beachten
cbs hat folgendes geschrieben:
...innerhalb deiner procedure/function...


Renegade - Fr 09.08.02 11:38

@CBS

cbs hat folgendes geschrieben:
außerdem solltest du in meinem posting das beachten
cbs hat folgendes geschrieben:
...innerhalb deiner procedure/function...


Sorry hatte dein posting falsch verstanden. Du meintes die Definition im Procedure / Function-Header.

Ok alles klar.

cu.


Anonymous - Fr 09.08.02 13:08

Ich danke euch. Anscheinend hab ich recht. Ich hab zwar auch noch nie ein Var vor einem Objekt gesehen, aber ich bin so leicht zu verunsichern (kleiner Scherz).

Allerdings hab ich die ganze Zeit gegrübelt, wann man mitten im Betrieb einem initialisiertem Objekt eine neue Adresse geben würde. Wie gesagt, ich bin nicht der große Objekt Kenner der absolut alle Möglichkeiten kennt. Für mich war es also Unsinn, aber ich bereit immer was neues zu lernen.


:twisted: :twisted: :twisted:

Hmm, tolle Smylis hab Ihr hier.


Alfons-G - Fr 09.08.02 23:09

Hi,
einem Objekt eine willkürliche andere Adresse zuweisen, das kann für nette Überaschungen sorgen - besser auf einem Rechner testen, auf dem sich nichts Wichtiges befindet ;)
Vor Allem, wenn es in diesem Speicherbereich andere Objekte gibt, welche dem herumvagabundierenden Objekt ähnlich sind, kann es sein dass das Programm sogar ohne Absturz oder Fehlermeldungen läuft - allerdings dürfte das Ergebniss nicht das Erwartete sein ...

Einen Vorgeschmack darauf bekommst Du, wenn Du mehrere Arrays hintereinander definierst, und (bei abgeschalteter Überlaufprüfung) Indizes ansprichst, wecle höher sind, als der bei der Definition festgelegte Maximalwert.

8)


Anonymous - Sa 10.08.02 14:46

Das ist der Teil der Diskusion:

Zitat:
> Ich hab zumindes noch nie was gehört,
> daß der Zeiger mitten im Betrieb verändert wird

ReallocMem, Setlength ...


Natürlich wurde die ganze Zeit über einen Objektzeiger gesprochen, auch wenn ich hier nur Zeiger schrieb. Auch wurde hier die ganze Zeit über TStringList gesprochen und wie man es als Parameter übergibt und was mit dem Zeiger in der anderen Prozedur passieren kann. Wenn also der Kollege mit solchen Befehlen reinkommt, dann muß er öfters zwischendurcht mit RealocMem seinen Objekten neue Adressen verpassen. Sonst weiss ich nicht was ich mit seiner Antwort anfangen soll.

:twisted:


aogwaba - Sa 17.08.02 17:32

Objectreferenzen in Delphi sind Zeiger auf Objecte, deshalb kann
das VAR wegfallen.(Call by Reference)


Quelltext
1:
2:
3:
4:
5:
procedure Test(var sl: TStringList);
begin
 sl := TStringList.Create;
 //hier etwas mit sl machen 
end;

Hier wird eine neue Instanz von TStringList erzeugt, das alte Object
wird nicht berührt.
Ist in diesem Fall aber eine Speicherleiche, da ausserhalb der Procedure keine Referenz existiert.

cu
waba