Oppure

Loading
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.
19/01/21 11:50
Carlo
Postato originariamente da AldoBaldo:
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.

Mi sembra che una volta ci avevo dato un'occhiata, comunque al tuo link mi appare una pagina vuota.

Continuo con le domande, la seconda *p++ già mi hai risposto, lo shift ci ero arrivato e ti permette anche di gestire numeri con più di due cifre.

terza domanda: memset( p, '0', DIM_BUFF-(((char*)p)-buff) ); /* completa con tutti '0' */
capisco quello che fa, ma non come lo fa....

p vabbè è stato incrementato e punta alla prima locazione non ancora scritta, ma il resto capisco che calcola la lunghezza del buffer restante, ma una spiegazione di come fa mi fa comodo: DIM_BUFF-(((char*)p)-buff
Ultima modifica effettuata da Carlo 19/01/21 17:42
in programmazione tutto è permesso