19/01/21 0:16
AldoBaldo
Sono giochetti coi puntatori. In sostanza, come sai, un puntatore non è altro che un numero che rappresenta un indirizzo in memoria nel quale è collocata una variabile di un certo tipo. A seconda del tipo, lo spazio occupato dalla variabile può essere diverso. In C, incrementare un puntatore significa passare all'indirizzo dell'elemento successivo, ovvero aggiungere al puntatore iniziale la quantità di byte che corrisponde alle dimensioni dell'elemento puntato (che dipendono dal tipo).
Ecco quindi che dovendo agire su coppie di char ho pensato di definire un tipo WORD, che non è altro che l'equivalente di una coppia di char (16 bit) e di creare un puntatore ausiliario di quel tipo nel quale collocare l'indirizzo del punto iniziale della memoria occupata dal buffer (un array di char).
A questo punto, se immetto un valore numerico a 16 bit in *p, finisco per impostare contemporaneamente entrambi i char anziché uno solo. Inoltre, quando incremento p con p++ avanzo non di uno, ma di due byte in un colpo solo.
Ovviamente, prima dell'assegnamento devo "assemblare" il valore numerico a 16 bit accorpando due char in un solo WORD, e lo faccio con...
*p++ = (WORD)(A1[i][c]/10+'0') | (((WORD)(A1[i][c]%10+'0'))<<8);
Questa riga fa un sacco di cose.
(WORD)(A1[i][c]/10+'0'), per il compilatore, è una versione a 16 bit della cifra
delle decine; solo i primi 8 bit risultano utilizzati
((WORD)(A1[i][c]%10+'0')), per il compilatore, è una versione a 16 bit della
cifra delle unità; anche questo valore usa solo i primi 8 bit, ma...
<<8 con uno shift sposto quei bit per far spazio agli 8 del primo valore
| I due valori vengono "assemblati" con un or
Il valore a 16 bit (che equivale alle due cifre del numero convertito)
risultante viene collocato in *p
Incrementando p, l'indirizzo avanza di due byte in un colpo solo, preparando il
puntatore alla prossima impostazione
(WORD*)buff è semplicemente un cast per "convincere" il compilatore a usare senza lamentarsi l'indirizzo del buffer di char a 8 bit come se fosse l'indirizzo di un buffer di WORD a 16 bit.
P.S. Se vuoi intervenire sul codice ho provato a farne copia direttamente modificabile qui:
codeshare.io/…
Non ho mai usato quel servizio, quindi non so se e come funzioni. Se sei curioso, dacci un'occhiata.
Ultima modifica effettuata da AldoBaldo 19/01/21 7:21
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.