Mit Schleife auf Arrays verweisen

mikoborn

Level-1
Beiträge
56
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,

wie ist es möglich mit Schleifen auf verschiedene 1D- Arrays zu verweisen? Ich hatte erst an ein Struct gedacht, in das ich die Arrays einfüge, aber auch hier bleiben ja dann die Namen enthalten und ich habe eigentlich nichts gewonnen. Irgendwie muss ich ja die Namen der Arrays durchlaufen können. Ich würde ungerne aus den verschiedenen 1D-Arrays ein 2D-Array erstellen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
keine Ahnung auf was du hier hinaus möchtest - gib mal ein konkreteres Beispiel ...
Code:
                IF GVL.xDruck1Einblenden THEN
                    FOR iLoop7:= 1 TO GVL.AnzahlVerlauf DO
                        GVL.rDruck1Graph[iLoop7]:= GVL.rDruck1Array[iLoop7];
                    END_FOR
                END_IF
            
                IF GVL.xDruck2Einblenden THEN
                    FOR iLoop8:= 1 TO GVL.AnzahlVerlauf DO
                        GVL.rDruck2Graph[iLoop8]:= GVL.rDruck2Array[iLoop8];
                    END_FOR
                END_IF
            
                IF GVL.xTemperaturOel1Einblenden THEN
                    FOR iLoop9:= 1 TO GVL.AnzahlVerlauf DO
                        GVL.rTemperaturOel1Graph[iLoop9]:= GVL.rTemperaturOel1Array[iLoop9];
                    END_FOR
                END_IF
Denke mein Problem ist hier schon recht offensichtlich. Ich hatte gerne eine Schleife, die durch GVL.xDruck1Einblenden, GVL.xDruck2Einblenden usw. läuft, damit ich nicht ständig den selben Code Copy/Pasten muss
 
Wenn es dir um eine Art bedingtes Initialisieren geht, wie dargestellt, dann ist es auch nur so sinnvoll machbar wie du es ge-coded hast ...

Allerdings bräuchtest du nicht für jede Schleife eine andere Schleifen-Variable zu nehmen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst nicht so einfach "variable Variablennamen" haben...
In dem Falle müßtest Du das tatsächlich in ein 2D-Array überführen und auf die erste Dimension dann (außerhalb Deiner Schleifen) mit sprechenden Konstanten zugreifen:


Code:
AllElements[rDruck1Graph][x] := true;

FOR Element := 1 TO MaxElements DO
    FOR x := 1 TO MaxAnzahl DO
        AllElements[Element][x] := ... tu was;
    END_FOR;
END_FOR;
 
Du kannst nicht so einfach "variable Variablennamen" haben...
Naja ... er könnte eine Funktion erstellen, der er die beiden Array's übergibt.
Das wäre zwar möglicherweise eine gewisse optische Vereinfachung - wenn der Code-Umsetzung dahinter bzw. der daraus resultioerende Laufzeit aber ein Unding ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn es dir um eine Art bedingtes Initialisieren geht, wie dargestellt, dann ist es auch nur so sinnvoll machbar wie du es ge-coded hast ...

Allerdings bräuchtest du nicht für jede Schleife eine andere Schleifen-Variable zu nehmen ...
Kann man für jede Schleife sie selbe Schleifen-Variable nehmen oder gibt es einschränkungen?
 
Ich bin mir jetzt gerade nicht sicher - ist schon zu lange her und ich kann es auch aktuell nicht testen ...
aber konnte man nicht bei gleichgroßen Arrays des gleichen Typs auch so schreiben ;
Code:
GVL.rDruck1Graph := GVL.rDruck1Array ;
 
Du kannst nicht so einfach "variable Variablennamen" haben...
In dem Falle müßtest Du das tatsächlich in ein 2D-Array überführen und auf die erste Dimension dann (außerhalb Deiner Schleifen) mit sprechenden Konstanten zugreifen:


Code:
AllElements[rDruck1Graph][x] := true;

FOR Element := 1 TO MaxElements DO
    FOR x := 1 TO MaxAnzahl DO
        AllElements[Element][x] := ... tu was;
    END_FOR;
END_FOR;
Kann ich das so verstehen, dass ich die Indizes der Spalten mit meinen 1D-Array Namen tausche?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin mir jetzt gerade nicht sicher - ist schon zu lange her und ich kann es auch aktuell nicht testen ...
aber konnte man nicht bei gleichgroßen Arrays des gleichen Typs auch so schreiben ;
Code:
GVL.rDruck1Graph := GVL.rDruck1Array ;
Bei gleichen Typen sollte das in ST funktionieren.
 
Kann man für jede Schleife sie selbe Schleifen-Variable nehmen oder gibt es einschränkungen?
Du kannst grundsätzlich immer dieselbe Schleifenvariable nehmen so sie von der Größe her passt (INT , DINT).
Bei einer Schleife wir ja diese Variable durch die Schleife immer initialisiert.
Die Schleifenvariable kann (und sollte) sogar eine TEMP sein ...
 
Bei gleichen Typen sollte das in ST funktionieren.
Dann wäre das doch in diesem Fall ein Ansatz für @mikoborn

Dann sähe der Code dann ja so aus :
Code:
           IF GVL.xDruck1Einblenden THEN
                    GVL.rDruck1Graph := GVL.rDruck1Array ;
           END_IF;
            
           IF GVL.xDruck2Einblenden THEN
                    GVL.rDruck2Graph := GVL.rDruck2Array ;
           END_IF;
            
           IF GVL.xTemperaturOel1Einblenden THEN
                    GVL.rTemperaturOel1Graph := GVL.rTemperaturOel1Array ;
           END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
                IF GVL.xDruck1Einblenden THEN
                    FOR iLoop7:= 1 TO GVL.AnzahlVerlauf DO
                        GVL.rDruck1Graph[iLoop7]:= GVL.rDruck1Array[iLoop7];
                    END_FOR
                END_IF
           
                IF GVL.xDruck2Einblenden THEN
                    FOR iLoop8:= 1 TO GVL.AnzahlVerlauf DO
                        GVL.rDruck2Graph[iLoop8]:= GVL.rDruck2Array[iLoop8];
                    END_FOR
                END_IF
           
                IF GVL.xTemperaturOel1Einblenden THEN
                    FOR iLoop9:= 1 TO GVL.AnzahlVerlauf DO
                        GVL.rTemperaturOel1Graph[iLoop9]:= GVL.rTemperaturOel1Array[iLoop9];
                    END_FOR
                END_IF
Denke mein Problem ist hier schon recht offensichtlich. Ich hatte gerne eine Schleife, die durch GVL.xDruck1Einblenden, GVL.xDruck2Einblenden usw. läuft, damit ich nicht ständig den selben Code Copy/Pasten muss

Code:
FOR iLoop:= 0 TO Anzahl DO

IF DruckEinblenden THEN
DruckGraph[iLoop]:= DruckArray[iLoop];
ELSIF OelEinblenden THEN
OelGraph[iLoop]:= OelArray[iLoop];
..
..
END_IF;
END_FOR;

Wäre jetzt meine Variante gewesen..?

Arrays immer bei Null beginnen, zumindest in der Deklaration.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@DCDCDC :
dieser Code würde aber immer durchlaufen (also die Schleife) und nicht nur dann, wenn die Bedingung erfüllt ist ...
Das stimmt, ist die kompakte Variante.. Falls er dennoch das als Schleife möchte kann er das ja nochmal in eine IF packen.. dann ist es bedingt.

Dann wäre das doch in diesem Fall ein Ansatz für @mikoborn

Dann sähe der Code dann ja so aus :
Code:
           IF GVL.xDruck1Einblenden THEN
                    GVL.rDruck1Graph := GVL.rDruck1Array ;
           END_IF;
           
           IF GVL.xDruck2Einblenden THEN
                    GVL.rDruck2Graph := GVL.rDruck2Array ;
           END_IF;
           
           IF GVL.xTemperaturOel1Einblenden THEN
                    GVL.rTemperaturOel1Graph := GVL.rTemperaturOel1Array ;
           END_IF;
Finde ich gut.
 
Zurück
Oben