Autor |
Beitrag |
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Fr 09.08.02 00:32
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
Beiträge: 470
Mac OS 10.3.1
Delphi 6 Pro, Kylix 3
|
Verfasst: 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
Beiträge: 207
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 358
Win XP Pro, Win 7 Beta
BDS 2006
|
Verfasst: 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
Woher soll der Kompiler sonst wissen, was bei deinen Befehlen angesprochen wird.
Gruß
Renegade
_________________ Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
|
|
cbs
Beiträge: 207
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 358
Win XP Pro, Win 7 Beta
BDS 2006
|
Verfasst: 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.
_________________ Sokrates (468 v.Chr. - 399 v.Chr.)
"Es ist keine Schande, nichts zu wissen, wohl aber, nichts lernen zu wollen."
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: 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.
Hmm, tolle Smylis hab Ihr hier.
|
|
Alfons-G
Beiträge: 307
Win XP Prof, Linux, Win 7
D5 Prof, D7 Architect, D2005 Architect, D2007 Architect
|
Verfasst: 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.
_________________ Alfons Grünewald
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: 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.
|
|
aogwaba
Beiträge: 109
|
Verfasst: 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
|
|