bele Inserito: 14 luglio 2020 Segnala Share Inserito: 14 luglio 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 Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 15 luglio 2020 Segnala Share Inserita: 15 luglio 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 Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 17 luglio 2020 Segnala Share Inserita: 17 luglio 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. Link al commento Condividi su altri siti More sharing options...
bele Inserita: 17 luglio 2020 Autore Segnala Share Inserita: 17 luglio 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! Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 18 luglio 2020 Segnala Share Inserita: 18 luglio 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). Link al commento Condividi su altri siti More sharing options...
bele Inserita: 18 luglio 2020 Autore Segnala Share Inserita: 18 luglio 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 Link al commento Condividi su altri siti More sharing options...
batta Inserita: 18 luglio 2020 Segnala Share Inserita: 18 luglio 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. Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 18 luglio 2020 Segnala Share Inserita: 18 luglio 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) Link al commento Condividi su altri siti More sharing options...
pcontini Inserita: 18 luglio 2020 Segnala Share Inserita: 18 luglio 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 Link al commento Condividi su altri siti More sharing options...
bele Inserita: 18 luglio 2020 Autore Segnala Share Inserita: 18 luglio 2020 (modificato) 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 Modificato: 18 luglio 2020 da bele Link al commento Condividi su altri siti More sharing options...
batta Inserita: 18 luglio 2020 Segnala Share Inserita: 18 luglio 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. Link al commento Condividi su altri siti More sharing options...
bele Inserita: 20 luglio 2020 Autore Segnala Share Inserita: 20 luglio 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 Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora