Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hilfe bei Array (https://www.delphipraxis.net/42148-hilfe-bei-array.html)

El Mati 14. Mär 2005 16:08


Hilfe bei Array
 
Hi,

Ich programmiere momentan einen Formatkonverter. Eigentlich nichts Umwerfendes, wenn auch für meine beschränkten Kenntnisse von Delphi nah an meiner Grenze. Vielleicht zum besseren Verständnis: Das Programm ließt Daten verschiedener Tabellen aus einer Datei in Arrays und soll diese in eine andere Datei schreiben (natürlich nachdem diese neu kombiniert und/oder berechnet worden sind). Das Einlesen war kein Problem :-D . Allerdings das Umformen schon. Der rote Bereich in der Prozedur macht mir Kummer. Wenn ich das ganze debugge, erzählt man mir an der Stelle
Subcatchment[si].Outlet:= ConduitQ[ci].Oben;
, dass auf die Variable xi wegen Optimierung nicht zugegriffen werden kann :? dabei will ich doch auf die Variable si zugreifen. Der Rest scheint erstmal zu funzen. Bitte sagt mir, dass da irgendwo ein ganz simpler Anfängerfehler drin steckt, der leicht zu beheben ist :wink:

Danke im Voraus
El Mati





Code:
procedure SubcatchmentErstellen;

     var NeuerOutlet: Boolean;
         ci, si, ai, xi: Integer;

       begin
       si:=0;
       for ci:=0 to ConduitQEn-ConduitQAn+1 do
       begin
         setlength(subcatchment,si+1);
         NeuerOutlet:=True;
         
       [color=#ff0000] for xi:=0 to si do if Subcatchment[xi].outlet = ConduitQ[ci].oben then NeuerOutlet:=False;
         if NeuerOutlet then
         begin
           Subcatchment[si].Outlet:= ConduitQ[ci].Oben;[/color]
         
           Subcatchment[si].Bezeichnung:=IntToStr(si+2);
           for ai:=0 to AreaEn-AreaAn+1 do begin
             if Area[ai].Haltung = ConduitQ[ci].Bezeichnung then begin
                 Subcatchment[si].Flaeche:=Area[ai].Flaeche;
                 case area[ai].Neigungsklasse of
                    1: Subcatchment[si].Neigung:='0.5';
                    2: Subcatchment[si].Neigung:='2.5';
                    3: Subcatchment[si].Neigung:='7.0';
                    4: Subcatchment[si].Neigung:='12 ';
                    5: Subcatchment[si].Neigung:='15 ';
                 end; {case}
                 case area[ai].flaechenart of
                    1: Subcatchment[si].versiegelung:=0;
                    2..3: Subcatchment[si].versiegelung:=100;
                 end; {case}
             end; {of if Area[ai].Bezeichnung = ConduitQ[ci].Bezeichnung then}
           end; {for ai}
         end
         else
         begin
            for ai:=0 to AreaEn-AreaAn+1 do begin
             if Area[ai].Haltung = ConduitQ[ci].Bezeichnung then
             begin
               case area[ai].flaechenart of
                  1: Subcatchment[si].versiegelung:= Subcatchment[si].versiegelung * Subcatchment[si].flaeche / (Subcatchment[si].flaeche+area[ai].flaeche);
                  2..3: Subcatchment[si].versiegelung:=(Subcatchment[si].versiegelung * Subcatchment[si].flaeche + Area[ai].Flaeche) / (Subcatchment[si].flaeche+area[ai].flaeche);
               end;
               Subcatchment[si].Flaeche:=Area[ai].Flaeche+Subcatchment[si].Flaeche;
             end;
            end;
          end; {else}

          inc(si);
        end;


     end;

Treffnix 14. Mär 2005 17:11

Re: Hilfe bei Array
 
So wie ich das sehe, wird das xi rauoptimiert, weil du es nie benutzt. Du setzt si auf 0 und lässt mit dem xi eine Schleife von 0 bis si laufen. Also von 0 bis 0.
0 weniger 0 = 0 Schleifendurchläufe. Delphi -schlau wie es ist- erkennt, dass die Schleife niemals nicht durchlaufen wird und schmeisst es aus dem Compilat gleich raus. Das dürfte allerdings eigentlich nur einen Hinweis beim, aber keine Fehler geben.

El Mati 14. Mär 2005 21:19

Re: Hilfe bei Array
 
Danke Treffnix, hast natürlich recht. War wohl vorhin zu lang vorm Puter oder ich bin einfach.... :stupid:
Gruß Mati

Binärbaum 15. Mär 2005 00:22

Re: Hilfe bei Array
 
Zitat:

Zitat von Treffnix
So wie ich das sehe, wird das xi rauoptimiert, weil du es nie benutzt. Du setzt si auf 0 und lässt mit dem xi eine Schleife von 0 bis si laufen. Also von 0 bis 0.
0 weniger 0 = 0 Schleifendurchläufe. Delphi -schlau wie es ist- erkennt, dass die Schleife niemals nicht durchlaufen wird und schmeisst es aus dem Compilat gleich raus. Das dürfte allerdings eigentlich nur einen Hinweis beim, aber keine Fehler geben.

Hmm, das ist so nicht ganz richtig. Wenn eine for-Schleife von 0 bis 0 läuft, oder allgemein gesagt wenn Start- und Endwert des Zählers gleich sind, wird die Schleife genau einmal durchlaufen, nicht null mal. :zwinker:

MfG
Binärbaum


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.

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