Autor Beitrag
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Fr 03.05.13 23:56 
Guten Tag,
ich habe letztens mal über folgendes nachgedacht:

Beispiel 1: Unterschied Pointer / Var
ausblenden 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;

//Aufruf:
  Halbiere(RealVariable)

//Type PReal = ^Real;
procedure Halbiere(Zahl: PReal);
begin
Zahl^ := Zahl^ / 2;
end;

//Aufruf:
  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..

ausblenden 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;

//Was ist der Unterschied zwischen dem oben und:
type
 TBeispielTyp = class
  private
   //nichts
  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 :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: 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 user profile iconjfheins 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:
ausblenden 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; //hier die eigentliche Zuweisung
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: 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 !
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var Pointer1, Pointer2: ^Integer;
    Variable: Integer;
begin
Pointer1 := @Variable; // funktioniert
Pointer2 := Pointer1; //funktioniert nicht !
Pointer2 := @Ponter1; //funkioniert, aber jetzt ist pointer 2 ein pointer auf pointer 1 ! wird also pointer 1 auf Nil gesetzt, ist pointer 2 auch = Nil !
Pointer2 := @Pointer1^; //so wird die Speicheradresse vom Pointer1 an Pointer 2 übergeben
//genauer: Pointer 1 wird in Integer umgewandelt (^) und danach wird die speicheradresse wieder ausgelesen (@)
//es ist also dasselbe wie
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?
ausblenden Delphi-Quelltext
1:
2:
Pointer2 := Pointer( Pointer1 ); //klappt wie Pointer2 := @Pointer1^; 
Pointer2 := Pointer( Integer(Pointer1) ); //wie das hierdrüber

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
while LaufDurch do
 begin
 //mach was
 end;

//oder:
repeat
  //mach was
 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 :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: So 05.05.13 17:10 
user profile iconMeierZwoo hat folgendes geschrieben Zum zitierten Posting springen:
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 :D


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 :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Mo 06.05.13 15:02 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
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

ausblenden 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