Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Array Frage

  1. #1
    Registriert seit
    12.06.2007
    Beiträge
    10
    Danke
    17
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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!!!
    Zitieren Zitieren Array Frage  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    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
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    dr.colossos (22.08.2007)

  4. #3
    dr.colossos ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.06.2007
    Beiträge
    10
    Danke
    17
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Dankeschön.

    Jetzt wo ich es lese, leuchtet es sogar ein

    Fühle mich auch gleich mit Deiner Signatur angesprochen

  5. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Zitat Zitat von dr.colossos Beitrag anzeigen
    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.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #5
    dr.colossos ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.06.2007
    Beiträge
    10
    Danke
    17
    Erhielt 2 Danke für 2 Beiträge

    Standard

    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

  7. #6
    dr.colossos ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.06.2007
    Beiträge
    10
    Danke
    17
    Erhielt 2 Danke für 2 Beiträge

    Standard

    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

  8. #7
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Zitat Zitat von dr.colossos Beitrag anzeigen
    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
    Eine Schleife kannst du einsparen, denke ich.
    Außerdem kannst du die 1. Schleife nach einem True mit Exit verlassen.

    Code:
     
    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.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  9. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    dr.colossos (23.08.2007)

  10. #8
    dr.colossos ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.06.2007
    Beiträge
    10
    Danke
    17
    Erhielt 2 Danke für 2 Beiträge

    Standard

    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!

  11. #9
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    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.

    Code:
    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 *)
    If you open your Mind too much, your Brain will fall out.

  12. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    dr.colossos (23.08.2007)

  13. #10
    dr.colossos ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.06.2007
    Beiträge
    10
    Danke
    17
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 21.12.2016, 17:03
  2. Antworten: 15
    Letzter Beitrag: 09.04.2009, 20:57
  3. Frage zu Elau Problem, ein Array in 2 Strings
    Von Trashman im Forum CODESYS und IEC61131
    Antworten: 14
    Letzter Beitrag: 21.09.2007, 17:54
  4. Bool-Array in Byte-Array
    Von Techniker im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 13.01.2006, 19:12
  5. Antworten: 4
    Letzter Beitrag: 18.05.2005, 18:49

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •