Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Variablen in einer Schleifen ansprechen? (https://www.delphipraxis.net/161916-variablen-einer-schleifen-ansprechen.html)

runningsoft 27. Jul 2011 11:04

Variablen in einer Schleifen ansprechen?
 
Hallo,

habe ein Syntaxproblem mit dem Ansprechen von Variablen.

Ich habe folgenden Record definiert:

Code:
TZwischenZeiten = record
      Startnr : integer;
      Disziplin : String[41];
      Charakter : integer;
      ZwischenZeiten : integer;
      MaxZwischenZeiten : integer;
      LaufZeit1 : TTime;
      LaufZeit2 : TTime;
      LaufZeit3 : TTime;
      LaufZeit4 : TTime;
      LaufZeit5 : TTime;
      LaufZeit6 : TTime;
      LaufZeit7 : TTime;
      LaufZeit8 : TTime;
      LaufZeit9 : TTime;
      LaufZeit10 : TTime;
      Laufzeit11 : TTime;
      Uhrzeit : TDateTime;
      Status : String[6];
Um nun die Laufzeiten 1 - 11 zu überprüfen, nutze ich bisher den unschönen Code

Code:
if Laeufer^.Laufzeit1 <> 0 then
        begin
        Laeufer^.LaufZeit1 := NettoZeit;
        Break;
        end;
      if Laeufer^.Laufzeit2 <> 0 then
        begin
        Laeufer^.LaufZeit3 := NettoZeit;
        Break;
        end;
      if Laeufer^.Laufzeit3 <> 0 then
        begin
        Laeufer^.LaufZeit3 := NettoZeit;
        Break;
        end;

      usw. usw.
Kann ich den Code optimieren, in dem ich das ganze in einer Schleife durchlaufe?

Code:
for i := 1 to 11 do
begin
if Laeufer^.Laufzeit[i] <> 0 then     <--- Hier sagt der Compiler "Undefinierte Bezeichner Laufzeit", was ja auch logisch ist, da der Bezeichner ja Laufzeit1, Laufzeit2 usw. heißt
        begin
        Laeufer^.LaufZeit[i] := NettoZeit;
        Break;
        end;
end;
Hab leider noch keine Variante gefunden, im Quelltext Teile der Variablenbezeichnung durch Variablen zu ersetzen.

Vielen Dank für Eure Hilfe

Steffen

Klaus01 27. Jul 2011 11:06

AW: Variablen in einer Schleifen ansprechen?
 
Hallo,

wenn Du indiziert auf laufzeit zugreifen willst,
solltest Du zumindest die LAufzeit als Array definieren.

Delphi-Quellcode:
TZwischenZeiten = record
      Startnr : integer;
      Disziplin : String[41];
      Charakter : integer;
      ZwischenZeiten : integer;
      MaxZwischenZeiten : integer;
      LaufZeit : Array[1..11] of TTime;
      Uhrzeit : TDateTime;
      Status : String[6];
Grüße
Klaus

Memnarch 27. Jul 2011 11:11

AW: Variablen in einer Schleifen ansprechen?
 
@Klaus: 6 setzen und schämen. Arrays doch bitte mit 0 (also [0..10]) anfangen lassen ;).
Der array verhält sich sonst "anders" als andere arrays, wie man sie sonst so in Delphi findet und in einer ForSchleife nutzt.

edit @Runningsoft: heißt natürlich dass deine schleife auch von 0-10 gehen muss ;).


MFG
Memnarch

runningsoft 27. Jul 2011 11:21

AW: Variablen in einer Schleifen ansprechen?
 
Danke für den Tipp mit dem Array, ich glaub, das ist die Lösung.

Grüße

Steffen

Flips 27. Jul 2011 11:23

AW: Variablen in einer Schleifen ansprechen?
 
Zitat:

Der array verhält sich sonst "anders" als andere arrays, wie man sie sonst so in Delphi findet und in einer ForSchleife nutzt.
Hi, nur mal aus Interesse, wie "anders"?
Ich lasse meine Arrays zwar auch immer bei 0 starten, aber mein Info-Lehrer von früher hat den anderen Schülern immer gesagt, man sollte das besser bei 1 starten lassen, dann wäre das Zählen auch einfacher (...). Auf meinen Einwand, es sei "korrekter" es bei 0 starten zu lassen meinte er das mache intern keinen Unterschied.
Also ich könnte mir vorstellen, dass es einen Unterschied macht. Nur welchen?^^

schlecki 27. Jul 2011 11:25

AW: Variablen in einer Schleifen ansprechen?
 
Zitat:

Zitat von runningsoft (Beitrag 1113780)
Code:
for i := 1 to 11 do
begin
if Laeufer^.Laufzeit[i] <> 0 then     <--- Hier sagt der Compiler "Undefinierte Bezeichner Laufzeit", was ja auch logisch ist, da der Bezeichner ja Laufzeit1, Laufzeit2 usw. heißt
        begin
        Laeufer^.LaufZeit[i] := NettoZeit;
        Break;
        end;
end;

Wenn du ein Array verwendest, solltest du auch entsprechend die Arraygrenzen abfragen:

Delphi-Quellcode:
for i := Low(Laeufer^.Laufzeit) to High(Laeufer^.Laufzeit) do
begin
  {...}
end;
Dann ists auch egal, ob das Array bei 0 oder 1 anfängt ;)

runningsoft 27. Jul 2011 11:32

AW: Variablen in einer Schleifen ansprechen?
 
@schlecki

Danke für den Tipp. Wenn ich das richtig sehe, kann ich so problemlos mein Array erweitern und muss dann hinterher nicht an tausend Stellen im Programm die Schleifen auf die neue Arraygröße umbauen.

Memnarch 27. Jul 2011 11:33

AW: Variablen in einer Schleifen ansprechen?
 
@Flips: nein intern macht es keinen unterschied, es irritiert allerdings den programmierer. Außer dem Wochentag array in Delphi beginnt alles bei 0. Eine ForSchleife kann dan schnell so "falsch" umgesetzt werden.

Delphi-Quellcode:
for i := 0 to Max - 1 do
Hat mir bei dem wochentag array schön ne AV geschmissen weil der bei 1 anfängt.
Mit Falsch meinte ich halt nur den von dir dem Lehrer gegenüber genannten Korrekten anwendungsfall.


MFG
Memnarch

himitsu 27. Jul 2011 11:34

AW: Variablen in einer Schleifen ansprechen?
 
Solange man
Delphi-Quellcode:
for idx := Low(MyArr) to High(MyArr) do
verwendet, dann kann man verwenden, was man will.

Klar ist es besser bei 0 zu beginnen, wärend ich gewisse Char-Arrays auch gerne mal mit 1 beginne, wegen der Analogie zum String.
Und sonst nutze ich auch manchmal andere Startindize, wenn dieses dann eine bessere "logische" Zuweisung gewährleistet.



PS: Nicht vergessen, aber der ShortString, also auch der Typ String[x], ist und bleibt ANSI.

p80286 27. Jul 2011 11:49

AW: Variablen in einer Schleifen ansprechen?
 
Zitat:

Zitat von Memnarch (Beitrag 1113790)
@Flips: nein intern macht es keinen unterschied, es irritiert allerdings den programmierer. Außer dem Wochentag array in Delphi beginnt alles bei 0. Eine ForSchleife kann dan schnell so "falsch" umgesetzt werden.

Der Programmierer sollte eigentlich wissen was er treibt!
und "alles" ist ja auch ein wenig kurz gegriffen (shortstring)
Einer der großen Vorteile von Delphi ist ja daß ich problemlos solche Arrays definieren kann
Code:
SecAdress : array [20..125] of ansichar;
Das ist vor allem bei der "Übersetzung" von Fremdstrukturen sinnvoll, oder wie himitsu anmerkte:
Zitat:

Zitat von himitsu (Beitrag 1113791)
wenn dieses dann eine bessere "logische" Zuweisung gewährleistet.


Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf