bele Posted July 14, 2020 Report Posted July 14, 2020 Ciao a tutti, è possibile sapere quando i bit di un array di bool sono tutti a zero ? ho provato a dare un occhio alle istruzioni AryCMP xxx ma non sono riuscito a capire se una di queste fa a caso mio
valvolina Posted July 15, 2020 Report Posted July 15, 2020 ciao ciao questo è un piccolo esempio con un ciclo For - Dichiarazione delle variabili Id : INT; Bool_Array : ARRAY[0..10] OF BOOL; ContaBool : INT; AlmenoUnBool_On : BOOL; TuttoAzero : BOOL; ================================================= codice (* azzeramento contatore *) ContaBool := 0; (* ciclo for per contare quanti bool sono a true *) FOR Id := 0 TO 10 DO IF Bool_Array[Id] THEN ContaBool := ContaBool +1; END_IF END_FOR (* verifica finale *) AlmenoUnBool_On := (ContaBool > 0); TuttoAzero := (ContaBool = 0); un saluto Valvolina
Ctec Posted July 17, 2020 Report Posted July 17, 2020 Un altro sistema è usare le Union (grande strumento...), in modo da definire una variabile accessibile come array di bit o word (o altro). In tal modo si risparmia tempo e programma.
bele Posted July 17, 2020 Author Report Posted July 17, 2020 Il 15/7/2020 alle 10:28 , valvolina ha scritto: ciao ciao questo è un piccolo esempio con un ciclo For - Dichiarazione delle variabili Id : INT; Bool_Array : ARRAY[0..10] OF BOOL; ContaBool : INT; AlmenoUnBool_On : BOOL; TuttoAzero : BOOL; ================================================= codice (* azzeramento contatore *) ContaBool := 0; (* ciclo for per contare quanti bool sono a true *) FOR Id := 0 TO 10 DO IF Bool_Array[Id] THEN ContaBool := ContaBool +1; END_IF END_FOR (* verifica finale *) AlmenoUnBool_On := (ContaBool > 0); TuttoAzero := (ContaBool = 0); un saluto Valvolina Grazie, per il codice! grazie a tutti per le risposte!
Ctec Posted July 18, 2020 Report Posted July 18, 2020 Questo è un esempio di uso delle Union. Qui si definiscono i tipi di dati Union: e qui due variabili definite come sopra A questo punto possiamo usare i bit singoli delle variabili come segue Dosa.O[2] := 1; // Attivo il terzo bit di Dosa (per esempio associato a una uscita) Pos.b[7] := 1; // Attivo l'ottavo bit di Pos (per esempio associato a una posizione di una tavola rotante) E qui posso controllare in un solo "colpo" se ci sono bit non a zero nel Byte o nella Word if Dosa.B == 0 then // Condizione vera se tutti i bit sono a 0 fai_qualcosa; // fai qualcosa se sono tutti a 0 end_if if Pos.W then // Condizione vera se almeno un bit a 1 fai_qualcosaltro; end_if Come si vede, è più compatto e soprattutto più veloce (nonché più elegante) rispetto al For-Next (immagina di doverne analizzare parecchi in tutto il programma).
bele Posted July 18, 2020 Author Report Posted July 18, 2020 7 ore fa, Ctec ha scritto: Questo è un esempio di uso delle Union. Qui si definiscono i tipi di dati Union: e qui due variabili definite come sopra A questo punto possiamo usare i bit singoli delle variabili come segue Dosa.O[2] := 1; // Attivo il terzo bit di Dosa (per esempio associato a una uscita) Pos.b[7] := 1; // Attivo l'ottavo bit di Pos (per esempio associato a una posizione di una tavola rotante) E qui posso controllare in un solo "colpo" se ci sono bit non a zero nel Byte o nella Word if Dosa.B == 0 then // Condizione vera se tutti i bit sono a 0 fai_qualcosa; // fai qualcosa se sono tutti a 0 end_if if Pos.W then // Condizione vera se almeno un bit a 1 fai_qualcosaltro; end_if Come si vede, è più compatto e soprattutto più veloce (nonché più elegante) rispetto al For-Next (immagina di doverne analizzare parecchi in tutto il programma). Non sono sicuro di avere capito bene, ma nel tuo modo utilizzi byte o word e poi li compari per vedere se sono a zero, quindi se io ho un array di 8 16 o 32 bool ok uso una byte word o DWord ma se ho un array di 500 bool e voglio verificare se sono tutti a zero? credo si debba utilizzare il ciclo For-next
batta Posted July 18, 2020 Report Posted July 18, 2020 È quello che in Siemens viene chiamato "sovrapposizione con AT". Le variabili sono sovrapposte, occupano la stessa area di memoria. Quindi, puoi accedere al singolo bit dell'array di 8 bool, oppure al byte. Lo stesso vale per l'esempio con array di 16 bool e la relativa word.
Ctec Posted July 18, 2020 Report Posted July 18, 2020 3 minuti fa, batta ha scritto: È quello che in Siemens viene chiamato "sovrapposizione con AT". Esatto, quello è l'altro trucco (che uso per esempio con Mitsubishi che non ha le Union). Essendo che programmo anche in C, per me è piuttosto normale usare le union pe accedere a dati in modo diverso a seconda dei casi. 14 minuti fa, bele ha scritto: ma se ho un array di 500 bool e voglio verificare se sono tutti a zero? credo si debba utilizzare il ciclo For-next Beh, non mi pare mi sia mai capitato qualcosa del genere. In tal caso temo che la scansione mediante for-next (o meglio ancora un while, almeno si interrompe prima)
pcontini Posted July 18, 2020 Report Posted July 18, 2020 C'è l'istruzione ArySearch che ti dice in quanti elementi di un array hai il valore che cerchi tu. Metti come chiave di ricerca "True" e nell'uscita "Num" dell'istruzione controlli che il risultato sia a 0 Ciao
bele Posted July 18, 2020 Author Report Posted July 18, 2020 (edited) 1 ora fa, pcontini ha scritto: C'è l'istruzione ArySearch che ti dice in quanti elementi di un array hai il valore che cerchi tu. Metti come chiave di ricerca "True" e nell'uscita "Num" dell'istruzione controlli che il risultato sia a 0 Ciao Grazie! funziona perfettamente Edited July 18, 2020 by bele
batta Posted July 18, 2020 Report Posted July 18, 2020 1 ora fa, bele ha scritto: ma se ho un array di 500 bool e voglio verificare se sono tutti a zero? credo si debba utilizzare il ciclo For-next Si, va bene utilizzare il ciclo FOR o, meglio, come suggerito da Ctec, un WHILE, ma lo potresti sempre fare su 16 DWord, o 32 Word, piuttosto che su 512 bool.
bele Posted July 20, 2020 Author Report Posted July 20, 2020 Il 18/7/2020 alle 19:46 , batta ha scritto: Si, va bene utilizzare il ciclo FOR o, meglio, come suggerito da Ctec, un WHILE, ma lo potresti sempre fare su 16 DWord, o 32 Word, piuttosto che su 512 bool. Si Certo! ma con la funzione ArySearch suggerita da pcontini si fa in un attimo e non devi scomodare le union, e comunque volendo utilizzare le union come suggerisci tu anzichè utilizzare un array di bool e meglio utilizzare un array di 8 LWORD
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now