# Array Frage



## dr.colossos (22 August 2007)

Hi.

Habe ein Problem, habe aber irgendwie ein Brett vorm Kopp.

VAR
Count: INT;
BitArray: ARRAY[0..Arraygröße] OF BOOL;
MinEinBitTrue: BOOL;
END_VAR


Meine erste Idee war:

FOR Count:= 0 TO ARRAYgröße DO
IF BitArray[Count] THEN
MinEinBitTrue:=TRUE;
ELSE
MinEinBitTrue:=FALSE;
END_IF
END_FOR

...kann aber nicht klappen.

MinEinBitTrue soll True sein, wenn halt mindestens ein Bit im Array True ist.
Hab mich jetzt irgendwie verhaspelt und komme irgendwie nicht weiter  


Danke schonmal für alle Denkanstöße!!!


----------



## Ralle (22 August 2007)

Den Else-Zweig mit MinBitTrue := False läßt du weg, dafür schreibst du vor der Schleife MinBitTrue := False.

MinEinBitTrue:=FALSE;
FOR Count:= 0 TO ARRAYgröße DO
IF BitArray[Count] THEN
MinEinBitTrue:=TRUE;
END_IF
END_FOR


----------



## dr.colossos (22 August 2007)

Dankeschön.

Jetzt wo ich es lese, leuchtet es sogar ein  

Fühle mich auch gleich mit Deiner Signatur angesprochen


----------



## Ralle (22 August 2007)

dr.colossos schrieb:


> Dankeschön.
> 
> Jetzt wo ich es lese, leuchtet es sogar ein
> 
> Fühle mich auch gleich mit Deiner Signatur angesprochen



Aber nicht doch, ich hoffe, das merkt man , daß es nicht auf solche Fragen zugeschnitten ist. Es geht da mehr um Trolltum.


----------



## dr.colossos (22 August 2007)

Jau....ist schon klar!!
 Aber manchmal fragt man sich, ist man einfach zu blöd, oder sieht man den Wald vor lauter Bäumen nicht mehr.

Aber passt schon, Dein Kommentar. Bis jetzt konnte ich durch die Suchfunktion immer die passende Antwort finden. Wenn man dann allerdings manchmal Fragen sieht, die schon x-mal beantwortet wurden, dann zweifel ich auch an der Intelligenz mancher Teilnehmer des Forums. Aber ich glaube das Thema wurde schon oft genug erfolglos diskutiert :twisted:


----------



## dr.colossos (23 August 2007)

Moin nochmal.

Ich möchte nun, wenn ein Bit im ArrayToCheck auf TRUE ist, das gesamte ArrayToFill aud TRUE setzen. So wie es unten aufgeführt ist, klappt es, aber irgendwie gefällt mir der Weg über die drei Loops nicht. 
Hat jemand eine Idee wie ich das eleganter lösen könnte?



GX_MinOneBitTrue:=FALSE;
FOR LW_LoopCount:=0 TO GW_ARRAYGROESSE DO
ArrayToFill[LW_LoopCount] :=FALSE;
END_FOR

FOR LW_LoopCount:=0 TO GW_ARRAYGROESSE DO
IF ArrayToCheck[LW_LoopCount] THEN
GX_MinOneBitTrue:= TRUE;
END_IF
END_FOR

FOR LW_LoopCount:=0 TO GW_ARRAYGROESSE DO
IF GX_MinOneBitTrue THEN
ArrayToFill[LW_LoopCount]:= TRUE;
END_IF
END_FOR


----------



## Ralle (23 August 2007)

dr.colossos schrieb:


> Moin nochmal.
> 
> Ich möchte nun, wenn ein Bit im ArrayToCheck auf TRUE ist, das gesamte ArrayToFill aud TRUE setzen. So wie es unten aufgeführt ist, klappt es, aber irgendwie gefällt mir der Weg über die drei Loops nicht.
> Hat jemand eine Idee wie ich das eleganter lösen könnte?
> ...



Eine Schleife kannst du einsparen, denke ich.
Außerdem kannst du die 1. Schleife nach einem True mit Exit verlassen.


```
GX_MinOneBitTrue:=FALSE;
FOR LW_LoopCount:=0 TO GW_ARRAYGROESSE DO
  IF ArrayToCheck[LW_LoopCount] THEN
    GX_MinOneBitTrue:= TRUE;
    Exit;
  END_IF
END_FOR
 
FOR LW_LoopCount:=0 TO GW_ARRAYGROESSE DO
  IF GX_MinOneBitTrue THEN
    ArrayToFill[LW_LoopCount]:= TRUE;
  ELSE
    ArrayToFill[LW_LoopCount]:= FALSE;
  END_IF
END_FOR
```
Evtl. könnte man mal mit dem AT- Befehl eine andere Sicht auf das Bool-Array definieren (mit DWORD), falls das überhaupt geht. Dann könnte man die DWord mit 0hex oder FFFFFFFFhex füllen und fertig. Aber das mußt du mal testen, ob das geht.


----------



## dr.colossos (23 August 2007)

Mit dem AT Befehl habe ich mich auch kurzzeitig befasst, aber leider ist die Doku im CoDeSys recht spärlich, was diesen Befehl angeht und die Tipps hier im Forum betreffend des Befehls scheinen sich weitestgehend auf SCL zu beziehen. 

Werde ich heute Abend mal intensiver probieren, wie ich mit Hilfe Deiner Tipps etwas mehr Eleganz reinbekomme.

Danke erstmal!


----------



## zotos (23 August 2007)

Ich finde die Lösung von Ralle an sich gut und würde das wohl auch so realisieren.

Der AT Befehl bezieht sich in CoDeSys auf eine absolute Adresse. Was bei Step7 ja immer der Fall ist da es dort ja nichts anderes gibt.

Wenn man nun in CoDeSys mit dem AT Befehl arbeiten will muss man einen absolut adressierbaren Variablenbereich nutzen also %MDxy.

Es gibt aber noch andere Wege ein Array auf einmal zu beschreiben. 
In dem man das Array mit einem Anderen Array überschreibt. Das geht dann auch mit allen Variablen Grundtypen.

Der folgende Code zeigt nur das beschreiben eines BoolArray mit einem anderen BoolArray das mit TRUE Initialisiert wurde. 


```
VAR CONSTANT
 maxArray : INT := 32;
END_VAR

VAR
    myBA      : ARRAY[1..maxArray] OF BOOL;
    myBA_True : ARRAY[1..maxArray] OF BOOL := 32(1);  (* Array mit 32 TRUE Werten *)
END_VAR

myBA := myBA_true; (* Überschreiben *)
```


----------



## dr.colossos (23 August 2007)

Ich denke, Du meinst es ungefähr so?? Habs so mit nur einer Schleife probiert. Ich brauche aber zwei Arrays? Eines zum True füllen und eines zum False füllen, oder??


GX_MinOneBitTrue:=FALSE;
FOR LW_LoopCount:=0 TO GW_ARRAYGROESSE DO
  IF ArrayToCheck[LW_LoopCount] THEN
    GX_MinOneBitTrue:= TRUE;
    EXIT;
  END_IF
END_FOR
IF GX_MinOneBitTrue THEN
 ArrayToFill:= ArrayWhichFillsTrue;
ELSE
 ArrayToFill:= ArrayWhichFillsFalse;
END_IF


----------



## zotos (23 August 2007)

1. Habe ich bereits geschrieben das ich die Lösung mit den Füllschleifen wie Ralle sie geschrieben hat nehmen würde.


zotos schrieb:


> Ich finde die Lösung von Ralle an sich gut und würde das wohl auch so realisieren.
> ...



2. Ja Du bräuchtest bei dem Array gedöönns 3 Arrays


----------

