PeppePLC16 Inserito: 21 febbraio 2024 Segnala Inserito: 21 febbraio 2024 Salve non è molto che programmo ma sto studiando, ho creato un programma che fa l' automazione di 2 nastri trasportatori simulando con un sensore il peso dei pacchi ogni volta che vengono posati, ho creato 2 vettori che contengono i pesi dei pacchi sul nastro che li shifta con un TON e un For ogni secondo creando cosi una FIFO automatica. Ora il mio problema è che vorrei contare i pacchi uguali fra i due vettori ... sto provando così ma incrementa sempre il conteggio dei pacchi uguali e ovviamente escludendo quelli pari a 0 : FOR i := 0 TO 9 DO FOR j := 0 TO 9 DO IF (posto [i] = posto1 [j]) AND (posto [j] AND posto[i]) >0 THEN count := count+1 ; ELSE count := count ; END_IF END_FOR END_FOR cosa sbagli?
Mattia Spoldi Inserita: 21 febbraio 2024 Segnala Inserita: 21 febbraio 2024 fai un esempio dei pesi nei 2 vettori e che risultati vuoi ottenere, poi cerchiamo di capire dove sbagli
drn5 Inserita: 21 febbraio 2024 Segnala Inserita: 21 febbraio 2024 (modificato) Te la racconto, perchè di scriverla non ho voglia.... Quando cerchi delle uguaglianze in quel modo , nel secondo FOR ogni volta che ne trovi una devi azzerare nel secondo vettore l'elemento trovato. Sennò sovraconteggi. Inoltre devi contare le uguaglianze anche tra gli elementi del primo vettore.. Se per esempio nel primo vettore hai 2 volte il peso 500 e nel secondo lo hai 3 volte, nel tuo sistema attuale ne conti 6, quando invece sono 5. Modificato: 21 febbraio 2024 da drn5
PeppePLC16 Inserita: 22 febbraio 2024 Autore Segnala Inserita: 22 febbraio 2024 12 ore fa, Mattia Spoldi ha scritto: fai un esempio dei pesi nei 2 vettori e che risultati vuoi ottenere, poi cerchiamo di capire dove sbagli fai conto che io abbia due array di 30 real, io voglio contare quanti numeri uguali ci sono tra i due array (nel mio caso i valori all' interno dell' array shiftano da soli ogni secondo) . I pesi nel programma vengono caricati all ' interno dell' array con un sensore di peso .
PeppePLC16 Inserita: 22 febbraio 2024 Autore Segnala Inserita: 22 febbraio 2024 11 ore fa, drn5 ha scritto: Te la racconto, perchè di scriverla non ho voglia.... Quando cerchi delle uguaglianze in quel modo , nel secondo FOR ogni volta che ne trovi una devi azzerare nel secondo vettore l'elemento trovato. Sennò sovraconteggi. Inoltre devi contare le uguaglianze anche tra gli elementi del primo vettore.. Se per esempio nel primo vettore hai 2 volte il peso 500 e nel secondo lo hai 3 volte, nel tuo sistema attuale ne conti 6, quando invece sono 5. Ciao buongiorno , non posso azzerare i pacchi sul nastro perche lo fa in automatico quando diciamo esce dal nastro e cade su di una bilancia, quindi mi occorre sapere quanti pacchi uguali ci sono sui due nastri ( visualizzati con due array) senza poter azzerare nulla perchè andrei poi a forzare ciò che è la realtà non avendo più una panoramica corretta di cosa ho attualmente sui due nastri..puoi aiutarmi?
drn5 Inserita: 22 febbraio 2024 Segnala Inserita: 22 febbraio 2024 Dato che devi solo far di conto, copiati gli elementi dei 2 vettori originali in altri 2 vettori temporanei e su quelli poi fai il conteggio.
PeppePLC16 Inserita: 22 febbraio 2024 Autore Segnala Inserita: 22 febbraio 2024 26 minuti fa, drn5 ha scritto: Dato che devi solo far di conto, copiati gli elementi dei 2 vettori originali in altri 2 vettori temporanei e su quelli poi fai il conteggio. ciao grazie ho fatto come hai detto e funziona ma solo quando i pacchi si trovano nella stessa posizione ex: se in array1[5] = 5 e anche array2[5] =5 incrementa, azzera e funziona ma se non si trovano nella stessa posizione non va
Roberto Gioachin Inserita: 22 febbraio 2024 Segnala Inserita: 22 febbraio 2024 (modificato) 18 ore fa, PeppePLC16 ha scritto: (posto [j] AND posto[i]) >0 Intanto verifica meglio questa istruzione, come è fatta viene fatto un AND fra due interi e poi il risultato viene comparato con zero, funziona lo stesso ma formalmente è sbagliato, dovresti fare un AND fra i risultati di due comparazioni. Poi per quale motivo hai fatto due cicli FOR ? uno non ti bastava visto che i vettori hanno la stessa dimensione? Modificato: 22 febbraio 2024 da Roberto Gioachin
drn5 Inserita: 22 febbraio 2024 Segnala Inserita: 22 febbraio 2024 rimetti qui il codice attuale che ci diamo un occhiata.
PeppePLC16 Inserita: 22 febbraio 2024 Autore Segnala Inserita: 22 febbraio 2024 1 minuto fa, drn5 ha scritto: rimetti qui il codice attuale che ci diamo un occhiata. FOR i := 0 TO 9 DO FOR j := 0 TO 9 DO IF (posto [i] = posto1 [j]) AND (posto [j] AND posto[i]) >0 THEN count := count+1 ; posto [i] := 0 ; ELSE count := count ; END_IF END_FOR END_FOR
PeppePLC16 Inserita: 22 febbraio 2024 Autore Segnala Inserita: 22 febbraio 2024 29 minuti fa, Roberto Gioachin ha scritto: Intanto verifica meglio questa istruzione, come è fatta viene fatto un AND fra due interi e poi il risultato viene comparato con zero, funziona lo stesso ma formalmente è sbagliato, dovresti fare un AND fra i risultati di due comparazioni. Poi per quale motivo hai fatto due cicli FOR ? uno non ti bastava visto che i vettori hanno la stessa dimensione? perchè mi occorre sapere i pacchi uguali anche se non si trovano nella stessa posizione
Roberto Gioachin Inserita: 22 febbraio 2024 Segnala Inserita: 22 febbraio 2024 FOR i := 0 TO 9 DO IF (posto [i] = posto1 [i]) AND posto [i] >0 AND posto1[i] >0 THEN count := count+1 ; END_IF END_FOR Se non ho capito male il tuo problema, secondo me sarebbe sufficiente così!
drn5 Inserita: 22 febbraio 2024 Segnala Inserita: 22 febbraio 2024 (modificato) for a = 0 to 9 do for b =0 to 9 do if posto[a] <>0 and posto1[b] <>0 then if posto[a] = posto1[b] then count := count + 1; posto1[b] := 0; end_if end_if end_for end_for Modificato: 22 febbraio 2024 da drn5
Roberto Gioachin Inserita: 22 febbraio 2024 Segnala Inserita: 22 febbraio 2024 46 minuti fa, PeppePLC16 ha scritto: perchè mi occorre sapere i pacchi uguali anche se non si trovano nella stessa posizione Ok, allora il discorso è diverso, devi effettivamente fare 100 verifiche. Verifica bene questa parte " (posto [j] AND posto[i]) " hai inserito due volte lo stesso nome variabile con puntatore diverso
PeppePLC16 Inserita: 22 febbraio 2024 Autore Segnala Inserita: 22 febbraio 2024 2 ore fa, drn5 ha scritto: for a = 0 to 9 do for b =0 to 9 do if posto[a] <>0 and posto1[b] <>0 then if posto[a] = posto1[b] then count := count + 1; posto1[b] := 0; end_if end_if end_for end_for grazie
batta Inserita: 22 febbraio 2024 Segnala Inserita: 22 febbraio 2024 (modificato) Una cosa ancora non mi è chiara: vuoi contare quanti pacchi uguali ci sono, ma "uguali" a cosa? Mi spiego meglio con un esempio, con array, per praticità, ridotto a 5 elementi. Supponiamo di trovare uan situazione di questo tipo: Buffer A Buffer B 0 25 30 1 30 40 2 28 25 3 25 28 4 40 20 Ti troverai con 3 pacchi con peso 25, 2 con peso 30, 2 con peso 28, due con peso 40, 1 con peso 20. Come fai a contarli con un solo contatore? Butto lì un'idea, forse strampalata (ci dovrei ragionare con calma). Crea un buffer temporaneo della dimensione di entrambi i buffer, e metti tutti i pesi in questo unico buffer. Fai un ordinamento di tutti i pesi (per queste dimensioni di array penso che l'algoritmo più adatto per l'ordinamento sia "Bubble sort"). Poi gestisci un altro array con i contatori dei pacchi uguali. A partire dal primo elemento dell'array con tutti i pesi incrementi il primo contatore (e magari memorizzi anche il peso) fino a quando troverai pesi uguali (escludento il peso 0). Quando cambia il peso, cominci a contare sul contatore successivo. Per rimanere all'esempio di prima, ti ritroveresti con una cosa simile: Peso Nr.Pacchi 20 1 25 3 28 2 30 2 40 2 Condivido poi le osservazioni di @Roberto Gioachin relative alla condizione logica "IF (posto [i] = posto1 [j]) AND (posto [j] AND posto[i]) >0 THEN ". E non servere mettere "ELSE Count := Count" per non incrementare. Modificato: 22 febbraio 2024 da batta
batta Inserita: 27 febbraio 2024 Segnala Inserita: 27 febbraio 2024 Pare che il diretto interessato non sia più interessato.
Livio Orsini Inserita: 28 febbraio 2024 Segnala Inserita: 28 febbraio 2024 11 ore fa, batta ha scritto: Pare che il diretto interessato non sia più interessato. Già, purtroppo capita che, una volta trovata la soluzione al problema, chi ha aperto la discussione sparisca senza dare ulteriori notizie.☹️
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