AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schleifenvariable beschreiben, ...

Ein Thema von Corpsman · begonnen am 19. Jul 2009 · letzter Beitrag vom 20. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#1

Schleifenvariable beschreiben, ...

  Alt 19. Jul 2009, 10:59
Guten Morgen,

Ich höre ja gerade eine Vorlesung über Konzepte von Programmiersprachen.

Und unser Prof zeigt uns immer mal wieder echt "Überraschende" dinge.

Das Konstanten keine Konstanten sind hatte ich ja auch schon mal geschrieben.

Heute zeige ich euch wie man Schleifenvariablen werte zuweisen kann.

Ja richtig gelesen, das geht. Obwohl es eigentlich nicht erlaubt ist.

Und wie auch schon bei den Konstanten lautet der Trick hier wieder , POINTER.

Es scheint als habe Delphi ( zumindest D5Pro ) keinerlei Pointer Optimierung, bzw. Pointer Prüfungen.

Folgender Code ist in D5 Legal und sorgt für eine Endlosschleife.

Testet doch bitte in euren D5 versionen ob der Code Legal ist und ob das selbe passiert .

Delphi-Quellcode:

Procedure TForm1.Button1Click(Sender: TObject);
Var
  x: Integer;
  p: ^integer;
Begin
  p := @x;
  For x := 0 To 3 Do Begin
    showmessage(inttostr(x));
    p^ := 1;
  End;
End;
Also aufgepasst. Jeder der sich ein Programm schreibt das Pointer benutzt. Eure schleifen könnten evtl. ewig laufen *g*
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Schleifenvariable beschreiben, ...

  Alt 19. Jul 2009, 11:00
Wenn du mit Pointern herumspielst, dann musst du auch wissen was du tust. Wenn nicht, dann hast du eben Pech.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.035 Beiträge
 
Delphi 12 Athens
 
#3

Re: Schleifenvariable beschreiben, ...

  Alt 19. Jul 2009, 11:05
Zitat:
Das Konstanten keine Konstanten sind hatte ich ja auch schon mal geschrieben.
nicht alle

Zitat:
Heute zeige ich euch wie man Schleifenvariablen werte zuweisen kann.
Ja richtig gelesen, das geht. Obwohl es eigentlich nicht erlaubt ist.
und das weiß ich schon lange, aber sowas macht man nicht, denn ein kleiner Fehler und die Abbruchbedingung der Schleife wird nicht mehr erfüllt.

Hatte ich mal, als ich eine Schleife in 3er-Schritten zählen lassen wollte

quasi:
Delphi-Quellcode:
For x := 0 to 10 step 3 do
  ...
also
Delphi-Quellcode:
For x := 0 to 10 do Begin
  ...
  Inc(PInteger(@x), 3);
End;
und wer richtig hinsieht, wird schnell erkennen, daß die 10 nie nicht getroffen wird und es somit zum Überlauf kommt - 0, 3, 6, 9, 12, 15... - nachdem der Integer-Wertebereich dann zum drittenmal durchlaufen wurde, dann trifft er hier zufällig mal die 10

Und ja, Delphi (alle Versionen) hat da keine Pointer-Prüfung drin.

[edit]
jatzt mach ich schon statt Quote-Tags überall Delphi-Tags
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Schleifenvariable beschreiben, ...

  Alt 19. Jul 2009, 11:06
Saubere Programmierung scheint mir sowieso out zu sein
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.035 Beiträge
 
Delphi 12 Athens
 
#5

Re: Schleifenvariable beschreiben, ...

  Alt 19. Jul 2009, 11:09
Zitat von mkinzler:
Saubere Programmierung scheint mir sowieso out zu sein
sagen wir es mal so, ich bin vor 4 oder 5 Jahren mal auf diesen "Trick" gekommen und ich nutze es in keinem aktiven Programm mehr.

Auch wenn ich in anderen Dingen wohl auch nicht sooooo braf bin und den offiziellen Weg geh.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Schleifenvariable beschreiben, ...

  Alt 19. Jul 2009, 11:14
Hallo Frank, du hast dich einfach so dazwischen geschoben, die Aussage war nicht an dich gerichtet.
Es gibt wohl Probleme, die "dreckig" gelöst werden wollen, bzw bei denen eine solche Lösung im Moment besser (erscheint) oder hilft scnhell weiterzukommen. in den meisten Fällen ist es aber besser eine saubere Lösung zu finden.
Dazu sollte man aber genau wissen, was man macht und im Hinterkopf behalten, dass bei einer neuen version des Compilers oder sogar nach einem Patch die ganze Sache nicht mehr funktionieren könnte.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Schleifenvariable beschreiben, ...

  Alt 19. Jul 2009, 13:34
@jaenicke

Irgendwie hab ich das Gefühl, das ich misverstanden wurde.

Mir ist schon klar was Pointer können, und was sie anrichten. Dieser Thread galt mehr als !Achtung! Pointer können auch viel Blödsinn anstellen.

Gerade in der Theorie ist es wichtig das man weis, das eine Schleife immer Terminiert. Und das hier gezeigte Beispiel sollte lediglich zeigen, das dies in Delphi per se nicht der Fall ist.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Schleifenvariable beschreiben, ...

  Alt 19. Jul 2009, 14:40
Zitat von Corpsman:
das eine Schleife immer Terminiert. Und das hier gezeigte Beispiel sollte lediglich zeigen, das dies in Delphi per se nicht der Fall ist.
Wie kommst du darauf, dass eine Schleife immer terminiert? bei einer while-Schleife muss nur die Abbruchbedingung nicht stimmen und die Schleife wird nicht terminieren.

Davon mal abgesehen, war dein Beispiel wohl schon allgemein bekannt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#9

Re: Schleifenvariable beschreiben, ...

  Alt 20. Jul 2009, 02:34
Zitat von himitsu:
[
Delphi-Quellcode:
For x := 0 to 10 do Begin
  ...
  Inc(PInteger(@x), 3);
End;
und wer richtig hinsieht, wird schnell erkennen, daß die 10 nie nicht getroffen wird und es somit zum Überlauf kommt - 0, 3, 6, 9, 12, 15... - nachdem der Integer-Wertebereich dann zum drittenmal durchlaufen wurde, dann trifft er hier zufällig mal die 10 :angel2:
Hallo,

das ist aber unsaubere Programmierung durch den Compiler selbst: jeder Anfänger weiss oder merkt es mal, dass man Abbruchbedingungen möglichst nicht mit =, sondern mit < oder > machen sollte, Grund siehe oben. Ich nenne das defensives Programmieren.

Aber wie schon bemerkt, sowas ist ja out.

Gruss Reinhard
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.035 Beiträge
 
Delphi 12 Athens
 
#10

Re: Schleifenvariable beschreiben, ...

  Alt 20. Jul 2009, 05:44
For hat aber anscheinend ein = als Abbruchbedingung ud als Startbedingung ein >= bzw. <=

und jupp eine kleines While-Schleifchen und alles ist Gut
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz