AGB  ·  Datenschutz  ·  Impressum  







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

for-Schleife gegen über while-Schleife

Ein Thema von Luckie · begonnen am 21. Mär 2009 · letzter Beitrag vom 23. Mär 2009
Antwort Antwort
Seite 2 von 9     12 34     Letzte »    
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#11

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 13:01
Vielleicht sollte man auch den Wert von i nach Beendigung der Schleife in Betracht ziehen.

Bei der While Methode wird i inkrementiert, unabhängig davon, ob danach abgebrochen wird oder nicht.
Bei der for-schleife könnte man i direkt als Position des gefundenen Objekts benutzen.

wenn's um Lesbarkeit und minimale Geschwindigkeitsgewinne geht: wie wäre es mit
Delphi-Quellcode:
  for I := 0 to length(SonnenStundenListe) - 1 do
  begin
    if SonnenStundenListe[i, 0] = PLZ then
        return true;
  end;
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 13:09
Zitat von jaenicke:
Sinnvoller wäre aber ja wohl eine Betrachtung des nächstkleineren Arrayeintrags statt alle Postleitzahlen durchzuprobieren.
Dafür müsstest du nur einmal dein Array durchgehen und alle vorhandenen Postleitzahlen betrachten. Das geht selbst bei einem unsortierten Array vermutlich schneller. Schließlich werden in deinem Array ja nicht so viele Postleitzahlen sein.
Manchmal sieht man den Wald vor lauter Bäumen nicht.


Zitat von Meflin:
Luckie, erlich gesagt habe ich keine Ahnung, was du für ein Problem mit derartigen Abbruchbedingungen in while-Schleifen hast

Das ist ein absolutes Standardkonstrukt...
Das ist es wohl, aber wie man sieht habe ich es mir unnötig schwer gemacht. Ich hatte also schon ein Gefühl, dass da was nicht gut ist.

Zitat von DJ-SPM:
Zitat von Luckie:
Unser Lehrer hat heute gemeint, [...]
Morgen,

darf ich fragen, was du machst? Machst du eine Fortbildung oder sowas in der Art? Bei deinem Wissen, Deine Tuts und deine Non-VCL-Programme fällt mir es schwer zu glauben, dass du hier

a) von einem Lehrer im klassischen Sinne redest und
Ich mache eine Ausbildung zum Fachinformatiker anwendungsentwicklung. Also schon ein Lehrer im klassischen Sinne.

Zitat:
b) Dich ernsthaft mit den "Grundlagen" von Pascal beschäftigst.
Auch nach Jahren kann man sich noch mit den Grundlagn beschäftigen, dazu ist es nie zu spät.

Zitat:
Versteh mich nicht falsch, wenn dich deine Frage - zurecht - interessiert ist das ok. Mir ging es nur darum, dass du sagtest, dass dein Lehrer das meinte.
[..]
und wofür du einen Lehrer hast, der dir Delphi erklärt
Das mit den Schleifen ist ja nicht Delphi spezifisch.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#13

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 13:09
Zitat von jaenicke:
[...]Am optimalsten sieht das Ergebnis aus, wenn man direkt High benutzt, dann spart man auch noch das -1 [...]
Das ist nur die halbe Warheit, denn eigentlich sieht das ganze dann so aus:

Code:
00453340 8B45FC          mov eax,[ebp-$04]
00453343 E8E421FBFF      call @DynArrayHigh
   @DynArrayHigh:
   00404E88 E8F3FFFFFF      call @DynArrayLength
   00404E8D 48               dec eax ; Da ist dein -1 wieder ;)
   00404E8E C3               ret
   00404E8F 90               nop
00453348 85C0             test eax,eax

Edith: Die man koennte length() noch optimieren:


length():
Delphi internes length()
Code:
length():
Ticks: ~9
MS: 3.35*10^-5

length__()
Wie das delphi interne length() nur ohne nil check

Delphi-Quellcode:
function Length__(var Obj):Integer;
asm
  mov eax, [eax - 4]
end;
Code:
length__():
Ticks: ~8
MS: 3.38*10^-5

length_()
Als inline variante

Delphi-Quellcode:
function Length_(var Obj):Integer; inline;
begin
  result := pDWord(DWord(Obj) - 4)^;
end;
Code:
length_():
Ticks: ~1
MS: 2.94*10^-5
  Mit Zitat antworten Zitat
omata

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

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 13:24
Zitat von Luckie:
Unser Lehrer hat heute gemeint, dass man es möglichst vermeiden sollte aus Schleifen zu springen. Und wenn es nötig sein sollte, sollte man es im Schleifenkopf machen, also eine while-Schleife nehmen.
Da habt ihr ja einen sehr guten Lehrer
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#15

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 13:53
Ich würde ich der For-Schleife sogar ein Exit anstelle eines Break verwenden (Natürlich nur wenn möglich).
Damit erreiche ich, dass das Register für Result möglichst lange dem Compiler für anderweitige
Benutzung zur Verfügung steht.
Delphi-Quellcode:
function IsPLZInArray(SonnenStundenListe: TSonnenStunden; PLZ: Integer): Boolean;
var
  i: Integer;
  CurrentPLZ: Integer;
begin
  for i := 0 to length(SonnenStundenListe) - 1 do
  begin
    CurrentPLZ := SonnenStundenListe[i, 0];
    if CurrentPLZ = PLZ then
    begin
      Result := True;
      Exit;
    end;
  end;
  Result := False; // nichts gefunden
end;
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#16

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 14:03
Zitat von sx2008:
Ich würde ich der For-Schleife sogar ein Exit anstelle eines Break verwenden (Natürlich nur wenn möglich).
Damit erreiche ich, dass das Register für Result möglichst lange dem Compiler für anderweitige
Benutzung zur Verfügung steht.
Delphi-Quellcode:
function IsPLZInArray(SonnenStundenListe: TSonnenStunden; PLZ: Integer): Boolean;
var
  i: Integer;
  CurrentPLZ: Integer;
begin
  for i := 0 to length(SonnenStundenListe) - 1 do
  begin
    CurrentPLZ := SonnenStundenListe[i, 0];
    if CurrentPLZ = PLZ then
    begin
      Result := True;
      Exit;
    end;
  end;
  Result := False; // nichts gefunden
end;
Wenn Du Dein Result := False vor die FOR-Schleife setzt, brauchst Du auch kein Exit und kannst das Preak drinlassen.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#17

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 14:48
Zitat von Luckie:
Unser Lehrer hat heute gemeint, dass man es möglichst vermeiden sollte aus Schleifen zu springen. Und wenn es nötig sein sollte, sollte man es im Schleifenkopf machen, also eine while-Schleife nehmen.
es gehört jetzt zwar nicht ganz zum Thema , aber ich finde es deprimierend, wenn sich ein Lehrer über die Verwendung einer for oder while-schleife Gedanken macht.
Auf der anderen Seite aber heute noch zuläßt, das eine PLZ als integer deklariert wird

Gruß Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#18

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 14:57
Zitat von RWarnecke:
Wenn Du Dein Result := False vor die FOR-Schleife setzt, brauchst Du auch kein Exit und kannst das Preak drinlassen.
Das Result wird doch im Register EAX gehalten.
Indem man das Result so spät wie möglich zuweist, gibt man dem Compiler die Möglichkeit das Register frei zu verwenden.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 15:07
Zitat von Keldorn:
Auf der anderen Seite aber heute noch zuläßt, das eine PLZ als integer deklariert wird
Naja, die Architektur ist 32-Bit, insofern ist es durchaus sinnvoll auch eine 32-Bit Zahl zu benutzen.

Ich glaube dazu stand auch etwas entsprechendes in der Delphi-Hilfe.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#20

Re: for-Schleife gegen über while-Schleife

  Alt 21. Mär 2009, 15:08
Zitat von jaenicke:
Naja, die Architektur ist 32-Bit, insofern ist es durchaus sinnvoll auch eine 32-Bit Zahl zu benutzen.
Die negative Zahlen als PLZ zulässt? Hm... nein, eigentlich nicht
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 9     12 34     Letzte »    


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 16:57 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