[Delphi] For Anweisung spinnt
spacer
Autor Nachricht
juelin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31

Win XP, Linux
D7 K3
BeitragVerfasst: Do 02.09.10 11:08 
Verwendete Sprache: Delphi
ich glaube ich spinne!!??

ich habe eine FOR Anweinsung im Programm (DELPHI 7)

for l:=1 to 99 do
l ist vom Typ integer

Nun mach die Scleife folgendes:
l fängt bei 99 an und wird bei jedem Durchlauf vermindert (99, 98, 97......1)
wie bei DOWNTO

Nun stehe ich da und kann nicht weiter.
Hat da jemand eine Idee??

Gruss
Jürgen


Moderiert von user profile iconNarses: Topic aus Programmierwerkzeuge verschoben am Fr 03.09.2010 um 00:26


Zuletzt bearbeitet von juelin am Fr 03.09.10 06:34, insgesamt 1-mal bearbeitet
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1695
Erhaltene Danke: 49

Win 7, Ubuntu
Delphi 2009 Pro, C# (VS2010), C/C++ (Eclipse)
BeitragVerfasst: Do 02.09.10 11:19 
user profile iconjuelin hat folgendes geschrieben Zum zitierten Posting springen:
for l:=1 to 99 do
l ist vom Typ integer

Nun mach die Scleife folgendes:
l fängt bei 99 an und wird bei jedem Durchlauf vermindert (99, 98, 97......1)
wie bei DOWNTO

Hast Du noch etwas mehr Code? Verwechselst Du vielleicht I(i) mit l(L)?

Intern zählt Delphi allerdings bei For-Schleifen idT. nach unten. :P

_________________
Wer nichts weiß, muss alles glauben.


Zuletzt bearbeitet von Marc. am Do 02.09.10 11:22, insgesamt 2-mal bearbeitet
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1083
Erhaltene Danke: 53

Win XP, Win7
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 02.09.10 11:20 
user profile iconjuelin hat folgendes geschrieben Zum zitierten Posting springen:
Nun stehe ich da und kann nicht weiter.
Hat da jemand eine Idee??
Wo kommst Du denn nicht weiter?
Du hast doch die 2 Möglichkeiten:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
For i:= 1 to 99 do
begin
//i wird addiert
//mach irgend was in der Schleife
end;

For i:= 99 downto 1 do
begin
//i wird subdrahiert
//mach irgend was in der Schleife
end;

Wo liegt das Problem?

Gruss Alf

mh.. zu langsam :P

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 3739
Erhaltene Danke: 118

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 02.09.10 11:22 
Naja, nicht ganz. Intern wird die Schleife umgekehrt durchlaufen (Compileroptimierung). Sollte aber für dich als Programmierer nichts ändern.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 852
Erhaltene Danke: 62


Delphi 2010 Enterprise
BeitragVerfasst: Do 02.09.10 11:45 
Aber nur, wenn man nicht auf i zugreift. Daher ist es egal. Sobald man auf i zugreift, läuft die Schleife "richtig rum".

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var i : integer;
begin

for i := 1 to 5 do
showMessage('Hallo');

for i := 1 to 5 do
ShowMessage(intToStr(i));

end;

Einfach mal die beiden Schleifen im Debugger durchsteppen und dabei den Wert von i beobachten.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 3739
Erhaltene Danke: 118

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 02.09.10 11:57 
Lazarus optimiert das anscheinend gar nicht? Zumindest wird bei diesem Quelltext die Schleife richtig rum durchlaufen:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
var i: integer;
p: pointer;
begin
p := @i;
for i := 0 to 99 do begin
Showmessage(IntToStr(Integer(p^)));
end;
end;


lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 852
Erhaltene Danke: 62


Delphi 2010 Enterprise
BeitragVerfasst: Do 02.09.10 12:07 
Delphi (2010) durchläuft sie auch richtig rum.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 677
Erhaltene Danke: 11

Win XP
D6,D2010,C#,PHP
BeitragVerfasst: Do 02.09.10 12:18 
Delphi 6 durchläuft sie auch richtig rum (selber Code wie bei Elundril).
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Luckie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 11792
Erhaltene Danke: 138

WindowsXP Professional SP2
BDS2006, VS C++ Express, Eclipse (Java), Flex (Flash, AS)
BeitragVerfasst: Do 02.09.10 12:19 
www.michael-puff.de/...ifeRueckwaerts.shtml

So wie ihr das kontrolliert, in dem ihr eine Nachricht ausgebt, wird sie immer "richtigrum" laufen. Wäre ja schlimm, wenn bei der ersten Ausgabe der Endwert der Zählvariablen stehen würde.

_________________
Gruß Michael
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 3739
Erhaltene Danke: 118

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 02.09.10 12:22 
Also checkt der compiler auch wenn n Pointer auf die Laufvariable zeigt und läuft dann richtig rum? Oder wie wird entschieden wann optimiert wird?

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Dude566
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1466
Erhaltene Danke: 71

W7, Vista, XP, Ubuntu
Delphi XE2 Pro, Turbo Delphi, Java/Eclipse, Notepad++
BeitragVerfasst: Do 02.09.10 12:35 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Lazarus optimiert das anscheinend gar nicht? Zumindest wird bei diesem Quelltext die Schleife richtig rum durchlaufen:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
var i: integer;
p: pointer;
begin
p := @i;
for i := 0 to 99 do begin
Showmessage(IntToStr(Integer(p^)));
end;
end;


lg elundril


Warum der Pointer, man kann doch auch direkt i ausgeben.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 3739
Erhaltene Danke: 118

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 02.09.10 12:39 
weil ich mir dachte das der Compiler so nicht checkt das ich auf i zugreife und dann eher geneigt ist die schleife zu optimieren.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 852
Erhaltene Danke: 62


Delphi 2010 Enterprise
BeitragVerfasst: Do 02.09.10 12:39 
Die Idee von Elundril war wohl, den Compiler damit zu überlisten, dass der die Schleife trotz dem Zugriff auf i optimiert.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Dude566
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1466
Erhaltene Danke: 71

W7, Vista, XP, Ubuntu
Delphi XE2 Pro, Turbo Delphi, Java/Eclipse, Notepad++
BeitragVerfasst: Do 02.09.10 12:43 
Nach welchem Schema und wieso sollte der Compiler denn eine solche Schleife optimieren, wird sie dadurch schneller?

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 852
Erhaltene Danke: 62


Delphi 2010 Enterprise
BeitragVerfasst: Do 02.09.10 12:44 
Lies doch mal den Link von Luckie. Da ist es erklärt, warum und wieso.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Luckie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 11792
Erhaltene Danke: 138

WindowsXP Professional SP2
BDS2006, VS C++ Express, Eclipse (Java), Flex (Flash, AS)
BeitragVerfasst: Do 02.09.10 12:44 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Also checkt der compiler auch wenn n Pointer auf die Laufvariable zeigt und läuft dann richtig rum? Oder wie wird entschieden wann optimiert wird?

Kann ich dir leider nicht sagen. Aber nimm mal meinen sinnlosen Code aus meinem Artikel und lass den mal unter Lazarus compilieren und gucke, was passiert. Und achte darauf, dass die Optimierung aktiviert ist.

_________________
Gruß Michael
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 3739
Erhaltene Danke: 118

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 02.09.10 12:47 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Nach welchem Schema und wieso sollte der Compiler denn eine solche Schleife optimieren, wird sie dadurch schneller?

Wie in user profile iconLuckie seinem Link schon erklärt wird, wird bei einer Optimierten schleife im assamblercode nicht mittels cmp sonder mittels jnz die schleifenbedingung überprüft. Dadurch spart man sich einige Taktzyklen weil man ja dann nicht erst das ergebnis von cmp auswerten muss sondern gleich springt. Ich glaub in der DP wurde mal gesagt das man bei einer normalen schleife 6 Zyklen braucht, wobei eine optimierte schleife nur 4 braucht.

@user profile iconLuckie: Ne, Im asm-Code keine Spur von einem jnz. Jedoch könnte Lazarus jl verwenden, hab ich leider nicht sogut erkennen können (einerseits wegen mangelnder ASM erfahrung, andererseits weil das asm-fenster auch anders ist als bei delphi)

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.


Zuletzt bearbeitet von elundril am Do 02.09.10 13:28, insgesamt 1-mal bearbeitet
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 116
Erhaltene Danke: 9



BeitragVerfasst: Do 02.09.10 13:06 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaub in der DP wurde mal gesagt das man bei einer normalen schleife 6 Zyklen braucht, wobei eine optimierte schleife nur 4 braucht.
Na ja, auf Geschwindiglkeit ist das nicht gerade optimiert. Wie Agner Fog schreibt:
Zitat:
16.2 INC and DEC (all Intel processors)

The INC and DEC instructions do not modify the carry flag but they do modify the other arithmetic flags. Writing to only part of the flags register costs an extra µop on P4 and P4E. It can cause a partial flags stalls on other Intel processors if a subsequent instruction reads the carry flag or all the flag bits. On all processors, it can cause a false dependence on the carry flag from a previous instruction.

Use ADD and SUB when optimizing for speed.

Use INC and DEC when optimizing for size or when no penalty is expected.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Luckie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 11792
Erhaltene Danke: 138

WindowsXP Professional SP2
BDS2006, VS C++ Express, Eclipse (Java), Flex (Flash, AS)
BeitragVerfasst: Do 02.09.10 13:26 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Wie in Lucky

Zitat:
@Lucky

Wer ist dieser Lucky? Ich glaube, mit dem muss ich mich mal näher befassen. :mrgreen:

_________________
Gruß Michael
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 3739
Erhaltene Danke: 118

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 02.09.10 13:30 
Na der Typ der schneller schießt als sein schatten, Lucky Luke. Da es jetzt keine Cowboys mehr gibt hat er vom Arbeitsamt ne umschulung zum Programmierer bekommen. :mrgreen:

Sorry. :oops:

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home