Completo l'intervento, visto che nel thread ho partecipato in modo attivo, solo aggiungendo un avvertimento.
Sono sato abbastanza pesante nell'ultimo mio esempio postanto. Pesante, andando a pescare ed impiegare l'uso dei puntatori. Non voglio scrivere ora di non usarli, ma, forse non siamo più abituati causa i molti controlli di altri compilatori moderni. In CoDeSys i puntatori sono abbastanza grezzi e poco controllati in fase di compilazione. Vanno usati con cautela. Non omessi, ma occorre usare prudenza, codice di controllo ulteriore e, quindi usarli con criterio per non scrivere programmi tropo prolissi. Perché?
L'esempio che ho fatto in precedenza è corretto da un punto di vista logico, ma errato da un punto di vista informatico. Nella funzione "F_SecretKnowHow" ho utilizzato i puntatori senza MAI controllare se questi erano stati dichiarati. E' un errore gravissimo, perché, nel caso di un puntatore non dichiarato, come minimo si manda in STOP il PLC, (ammattendo poi a cercare l'origine del problema), peggio, si possono andare a toccare e sporcare altri dati, in modo pericolosissimo.
Quando si passa un puntatore ad una funzione, ancor più in una libreria che finirà nelle mani di chissa chi, per ogni puntatore, prima di usarlo, si deve controllare che esista, (non sia nullo), e che magari rientri entro talune condizioni. Il codice della funzione diventa quindi più corposo. Sia aggiungono istruzioni per controlalre un puntatore. Se si voleva risparmiare risorse usando i puntatori per variabili "piccole", se ne sprecano poi di più, per controllare il puntatore stesso.
Ma, ancora peggio: (prendo come esempio sempre il mio lavoro al post [13], notiamo la figura 2.png. verso il c'è la seguente riga:
- Codice: Seleziona tutto
F_SecretKnowHow := l.pElink1^ * c;
Se tutto quello che ho scritto prima ha un senso, allora questa riga è gravemente sbagliata. Non solo non si verifica che il puntatore l.pElink1 sia valido, ma, qualora non lo fosse, non ci sarebbe modo di risolvere il calcolo, utile poi per la return della funzione. Quindi, semmai, il risultato memorizzato in l.pElink1^ andava memorizzato in una variabile locale, per essere riutilizzato localmente, e poi copiato anche sulla variabile esterna, puntata.
Tutto questo per dire, infine, che di fronte a programmi PLC semplici, che non facciano uso di buffer dati voluminosi, l'uso dei puntatori può essere scoraggiante e inutilmente perisoloso o pesante.
Non mi dilungo oltre. Spero solo di avere arricchito meglio il thread che mi sembrava incompleto senza questo approfondimento.