AGB  ·  Datenschutz  ·  Impressum  







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

for to do: 0 to -1

Ein Thema von Nogge · begonnen am 4. Dez 2005 · letzter Beitrag vom 8. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#1

for to do: 0 to -1

  Alt 4. Dez 2005, 23:09
Hallo Community,
Ich habe ein sehr merkwürdiges Verhalten in einer meiner for-Schleife gefunden (s. Anhang). Nach meinen Informationen sollte die Schleife überhaupt nicht ausgeführt werden:
Zitat von Delphi-Hilfe:
If initialValue is greater than finalValue in a for...to statement, or less than finalValue in a for...downto statement, then statement is never executed.
Kann mir jemand sagen, warum die Schleife trotzdem ausgeführt wird?

mfg Nogge
Miniaturansicht angehängter Grafiken
delphi_bug_104.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2

Re: for to do: 0 to -1

  Alt 4. Dez 2005, 23:13
Von was für einem Typ ist V?

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#3

Re: for to do: 0 to -1

  Alt 4. Dez 2005, 23:15
Ah, ok. *schäm*
"v" ist vom Typ Byte, der natürlich gar keine negativen Werte annehmen kann...

Vielen Dank, sakura.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#4

Re: for to do: 0 to -1

  Alt 4. Dez 2005, 23:16
Zitat von Nogge:
Ah, ok. *schäm*
"v" ist vom Typ Byte, der natürlich gar keine negativen Werte annehmen kann...

Vielen Dank, sakura.
Gut erkannt und bitte

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: for to do: 0 to -1

  Alt 4. Dez 2005, 23:22
Glückwunsch,

das ist der älteste Fehler.

Ich vermute mal, du hast natürlich nicht die Bereichsprüfung an, oder?
Dann würde dir der Compiler auch mehr helfen.

Naja, wie dem auch sei.
Deine Variable REMPILLAR = 0 und da du noch einen abziehst, würde dort eigentlich -1 rauskommen. Da im Datentyp Byte die -1 als 255 dargstellt wird, läufte deine Schleife von 0 bis 255.

Wie gesagt mit einer Bereichsprüfung wird diese Geschichte auch geprüft!

Also entweder immer Integer für die Laufvariable benutzen (was blödsinn ist) oder nie den Endbereich mit -1 verändern, sondern in der Schleife bei der Verwendung der Laufvariablen einen abziehen.

MfG
Thorsten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: for to do: 0 to -1

  Alt 5. Dez 2005, 01:13
Zitat von omata:
Ich vermute mal, du hast natürlich nicht die Bereichsprüfung an, oder?
Was aber keine wirklich Lösung ist, dann dadurch wird zusätzlicher Code (nämlich die Fehlerprüfung) in das Programm eingebaut wird, was erstens das Programm größer und natürlich auch etwas langsamer macht.
Und wenn ein Programm richtig/fehlerlos programmiert ist, dann ist dieses auch total sinnlos.

Zitat von omata:
Also entweder immer Integer für die Laufvariable benutzen (was blödsinn ist) oder nie den Endbereich mit -1 verändern, sondern in der Schleife bei der Verwendung der Laufvariablen einen abziehen.
Ist ja noch schlimmer.
also statt nur einmal im Rumpf der Schleife etwas abzuziehen, soll man das jetzt also (unter Umständen) mehrmals innerhalb der Schleife machen?


Es ist doch viel besser gleich die Ursache zu beheben?
Also entweder die Datentypen anpassen, oder nur eine winzige Prüfung selber einzufügen

Delphi-Quellcode:
if REMPILLAR > 0 then
  for v := 0 to (REMPILLAR - 1) do
    ...
Hier wird auf größer 0 geprüft, da es einen optimaleren Code erzeugt.
eigentlich natürlich if REMPILLAR >= 1 then, also größer/gleich der Wert, welcher Abgezogen wird.
$2B or not $2B
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: for to do: 0 to -1

  Alt 5. Dez 2005, 01:43
Zitat von himitsu:
Was aber keine wirklich Lösung ist, dann dadurch wird zusätzlicher Code (nämlich die Fehlerprüfung) in das Programm eingebaut wird, was erstens das Programm größer und natürlich auch etwas langsamer macht.
Und wenn ein Programm richtig/fehlerlos programmiert ist, dann ist dieses auch total sinnlos.
Es geht hier ums Entwickeln, dann sollte die Prüfung an sein. Ausserdem ist es heutzutage mit grossen Platten und schnellen Rechnern nicht mehr so wichtig, dass die Anwendung klein und super schnell ist. Da kommt es auf die paar KB auch nicht an. Es ist viel mehr wichtig, dass die Anwendung richtig funktioniert und eine ordentliche Fehlersuche möglich ist.

Zitat von himitsu:
Zitat von omata:
Also entweder immer Integer für die Laufvariable benutzen (was blödsinn ist) oder nie den Endbereich mit -1 verändern, sondern in der Schleife bei der Verwendung der Laufvariablen einen abziehen.
Ist ja noch schlimmer.
also statt nur einmal im Rumpf der Schleife etwas abzuziehen, soll man das jetzt also (unter Umständen) mehrmals innerhalb der Schleife machen?
Wie du selber schreibst, "unter umständen" richtig. Wenn du mal Compilerbau hörst, wirst du erfahren, dass man absichtlich den Quellcode nicht optimieren soll. Die heutigen Compiler übernehmen die Optimierung des Codes. Man selbst soll übersichtlich und sicher programmieren.

Zitat von himitsu:
Es ist doch viel besser gleich die Ursache zu beheben?
Also entweder die Datentypen anpassen, oder nur eine winzige Prüfung selber einzufügen

Delphi-Quellcode:
if REMPILLAR > 0 then
  for v := 0 to (REMPILLAR - 1) do
    ...
Hier wird auf größer 0 geprüft, da es einen optimaleren Code erzeugt.
eigentlich natürlich if REMPILLAR >= 1 then, also größer/gleich der Wert, welcher Abgezogen wird.
Das mit dem Typ hatte ich schon geschrieben. Und die IF-Anweisung davor, ist genau folgendes
for v := 0 to REMPILLAR do wenn man die -1 weglässt.

Man kann das sehen, wie man will.
Und nun könnt ihr (z.B. Luckie) mich wieder in der Luft zerreissen...
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#8

Re: for to do: 0 to -1

  Alt 5. Dez 2005, 01:50
Zitat von omata:
. Und die IF-Anweisung davor, ist genau folgendes:for v := 0 to REMPILLAR do wenn man die -1 weglässt.
Unsinn.
Einmal die andere Schleife zum Vergleich:
Delphi-Quellcode:
if REMPILLAR > 0 then
  for v := 0 to (REMPILLAR - 1) do
Nehmen wir an REMPILLAR ist 0. Dann würde bei die Schleife mit dem IF am Anfang gar nicht erst starten. Die andere aber schon.

Nehmen wir jetzt mal an REMPILLAR ist 5. Dann würde bei oberer Schleife (ohne IF) folgendes passieren:
for v := 0 to 5 do Bei der anderen (die mit der Abfrage am Anfang) folgendes:
for v := 0 to 4 do Man sieht, die Unterschiede sind schon vorhanden.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: for to do: 0 to -1

  Alt 5. Dez 2005, 02:04
Ja, du hast natürlich rechts, sorry.

Ist wohl doch schon zu spät.

Stimmt, es müsste dann natürlich
for v:=1 to REMPILLAR do sein.

Danke für den Hinweis.
  Mit Zitat antworten Zitat
kalmi01
(Gast)

n/a Beiträge
 
#10

Re: for to do: 0 to -1

  Alt 5. Dez 2005, 08:05
Moin, moin, himitsu,

Zitat:
Was aber keine wirklich Lösung ist, dann dadurch wird zusätzlicher Code (nämlich die Fehlerprüfung) in das Programm eingebaut wird, was erstens das Programm größer und natürlich auch etwas langsamer macht.
Bei mir macht es definitiv keinen Unterschied ob Bereichsprüfung+I/O-Prüfung an hab oder nicht, die Exe, mit der ich getestet habe, ist in beiden Fällen 1366016 Bytes.

Das ist mir schon früher aufgefallen, dass es bei Delphi 7 anscheinend keinen Einfluss auf die Programmgrösse hat, welche Prüfungen man aktiviert.
  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 09:13 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