Autor |
Beitrag |
IhopeonlyReader
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Fr 03.05.13 23:56
Guten Tag,
ich habe letztens mal über folgendes nachgedacht:
Beispiel 1: Unterschied Pointer / Var
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure Halbiere(var Zahl: Real); begin Zahl := Zahl / 2; end;
Halbiere(RealVariable)
procedure Halbiere(Zahl: PReal); begin Zahl^ := Zahl^ / 2; end;
Halbiere(@RealVariable) |
außer dem Aufruf kenn ich kein Unterschied !
auch von der Schnelligkeit kaum ein Unterschied
gibt's Tips wann man was benutzen sollte? oder ist die 2te variante unnötig, da eh immer bei var die speicheradresse übergeben wird?
Beispiel 2:
properties bei denen sowohl read als auch write bei einer variablen übergeben wird..
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type TBeispielTyp = class private EineVariable: Integer; public property DieVariable: Integer read EineVariable write EineVariable; end;
type TBeispielTyp = class private public DieVariable: Integer; end; |
Ok, bei der oberen Variante habe ich 2 Möglichkeiten die Variable zu setzten/zu lesen
aber das ist finde ich nicht sehr nutzvoll
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Sa 04.05.13 01:37
Im ersten Fall: Nimm var Parameter. Pointer können viel Schaden anruchten wenn amn die falsch benutzt, var Parameter nicht.
Zu zwei: Die nach außen hin sichtbare Schnittstelle ändert sich wenn du ein Feld in eine Property umwandelst.
Zuletzt bearbeitet von jfheins am Sa 04.05.13 13:06, insgesamt 1-mal bearbeitet
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Sa 04.05.13 09:29
Zur ersten Frage:
Da Delphi var-Parameter erlaubt, sollte man die auch nutzen, da der Code wesentlich übersichtlicher ist. Pointer braucht man in Delphi eher selten. Wie jfheins schon sagte, bei Pointern muss man genau wissen, was man tut. Vergisst zu z.B. mal das ^, dann halbierst du den Pointer...nicht gut! (ok, evtl. lässt Delphi sowas erst garnicht zu)
Zur Frage 2:
In deinem Beispiel ist es in der Tat erstmal egal, ob du nun eine property benutzt oder nicht. Oftmals will man aber nicht, dass der Nutzer der Klasse einfach in eine Variable reinschreiben darf, da man z.B. bei der Veränderung der Variablen reagieren will. Wenn du z.B. das Caption eines Labels änderst, dann willst du natürlich nicht nur die Variable ändern, sondern auch, dass die neue Caption dargestellt wird.
Das geht in etwa so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| type TLabel=class private vCaption: String; procedure SetCaption(V: String); public property Caption: String read vCaption write SetCaption; end;
procedure TLabel.SetCaption(V: String); begin vCaption := V; Redraw; end; |
Benutzt du von Anfang an eine property, dann überlegst du dir gleich, ob der Nutzer wirklich einfach so die Variable lesen und schreiben darf. Bei einer public Variablen, übersiehst du das vielleicht.
Das property-Konzept ist eine sehr schöne Art Getter und Setter zu verwalten. Wenn ich mal wieder gezwungen werde C++ zu benutzen, ist das eins der Dinge, die ich wirklich vermisse.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Sa 04.05.13 12:28
Also: Bei Frage 2 geht es mir ausschließlich um diesen "Sonderfall" bei dem sowohl beim read als auch beim write dieselbe variable "übergeben" wird..
die frage hat xion mir beantwortet "Übersichtlichkeit".. wobei ich da public variablen bevorzuge als unötige propertys.. aber es stimmt propertys sind wenn man sie z.B. als setter/getter setzt sehr nützlich !
Zum 1. Delphi fängt eigentlich alle ungültige Typenumwandlungen ab und somit entstehen dadurch keine fehler..
Delphi ist sogar bei der Speicheradressenübergabe SEHR vorsichtig !
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var Pointer1, Pointer2: ^Integer; Variable: Integer; begin Pointer1 := @Variable; Pointer2 := Pointer1; Pointer2 := @Ponter1; Pointer2 := @Pointer1^; Pointer2 := @Variable; |
Somit wäre es mit Pointern zu arbeiten doch sage ich mal "übersichtlicher" da ich weiß, dass ist wirklich die übergebene variable ! oder?
Delphi-Quelltext 1: 2:
| Pointer2 := Pointer( Pointer1 ); Pointer2 := Pointer( Integer(Pointer1) ); |
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
MeierZwoo
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: So 05.05.13 15:15
Viele Anwendungsentwickler benutzen DESHALB Pascal und nicht C, weil in Pascal im Gegensatz zu C normalerweise NICHT mit Zeigern gearbeitet wird und deshalb fast alles von der IDE angemeckert werden kann. Also man sich auf die Programm-LOGIK konzentrieren kann und auch mal etwas "schlampig" sein darf.
Deshalb verstehe ich die Frage nicht, weil, wenn Du unbedingt mit Zeigern arbeiten willst, weshalb dann Pascal und nicht C?
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: So 05.05.13 15:58
weil C# für mich zu "unordentlich" ist...
außerdem bin ich mit Delphi sehr zufrieden  ich hinterfrage nur in diesem Thread einfach den Unterscheid zwischen dem Gleichem^^
eine andere Frage wäre:
gibt es ein "Programm"/Unit oder sonst was, was, das die tackte für eine procedure/function zählt? dann muss man nicht mehrere Durchführungen machen und dann zeit messen^^
Als Beispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| while LaufDurch do begin end;
repeat until not LaufDurch; |
was ist schneller? (solche Doppelmöglichkeiten gefallen mir, da sie die Programmiervielfältigkeit unterstützten, aber sind sie "gleichgut" ?
Wegen solchen Fragen habe ich mal diesen Thread eröffnet)
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
MeierZwoo
      
Beiträge: 94
Erhaltene Danke: 11
Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
|
Verfasst: So 05.05.13 16:18
WHILE und REPEAT/UNTIL nehmen sich nichts, sind aber (grade beim schnellen Tippseln für einen Zeittest) kritisch, weil die Abbruchbedingung unbedingt erreicht werden muß (Die man ja auch meist nicht hat und nachher nicht weiss, wie oft durchlaufen - es sei denn, man schreibt dies noch zusätzich mit).
Eine FOR Schleife wäre schneller, weil dort nur ein Wert erhöht werden und keine Abbruchbedingung ermittelt werden muß. Außerdem hat man bei FOR gleich den Teiler für die Zeitmessung.
Was bedeuten eigentlich die beiden Versalakzente hinter "...zwischen dem Gleichem^^" ?
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: So 05.05.13 17:10
MeierZwoo hat folgendes geschrieben : | Was bedeuten eigentlich die beiden Versalakzente hinter "...zwischen dem Gleichem^^" ? |
^^ = chinesisches/japanisches Emoticon, welches die Augen darstellt.. im japanischen wird bei Smileys sehr viel Wert auf die Augen gelegt... (Bsp. °_°) im deutschen wird vor Allem Wert auf den Mund gelegt ( Bsp.  oder :/ ), oft wird sogar die Nase weggelassen... (Bsp.  )
^^ sollen hochgezogene Augen/Augenbrauen sein -> lachen
Aber das wäre ein anders Thema
Zurück zum Thema: Das For schleifen schneller sind weiß ich.. Aber der "Schleifen-Vergleich" soll auch nur den "Sinn dieses Themas" unterstützen und allgemein mal meine Bildung über Schnelligkeit und Einsetzung von bestimmen Befehlen, die so wie ich dachte dasselbe machen, aber scheinbar nur das gleiche machen und das in unterschiedlicher zeit oder so, erweitern.
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
guinnes
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Mo 06.05.13 15:02
IhopeonlyReader hat folgendes geschrieben : | solche Doppelmöglichkeiten gefallen mir, da sie die Programmiervielfältigkeit unterstützten, aber sind sie "gleichgut" ?
Wegen solchen Fragen habe ich mal diesen Thread eröffnet) |
Gleichgut lässt sich nicht so ohne weiteres beantworten, die Funktion ist eine andere.
While prüft die Bedingung, bevor das innere der Schleife ausgeführt wird, Repeat prüft erst am Ende und macht demnach mindestens einen Durchgang.
z.B. Datenbank
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| While not Datenmenge.EOF do begin TrageDatenEin Datenmenge.Next end;
Repeat TrageDatenEin Datenmenge.Next until Datenmenge.EOF |
Diese beiden Methoden arbeiten grundsätzlich verschieden, bei einer leeren Datenmenge ist die 2. Funktion fehlerhaft, weil sie einen leeren Datensatz einträgt
|
|
|