|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
[C] - Liste e elementi successivi.
Data la seguente struttura:
Codice:
typedef struct MemHead {
struct MemHead * next, * prev;
} MemHead;
Ebbene, cosa vi porta a pensare, secondo voi, che la seguente macro di preprocessore possa restituire il puntatore al nodo successivo prendendo in input un nodo di questo tipo? Codice:
#define MEMNEXT(x) ((MemHead *)(((char *) x) - ((char *) & (((MemHead *)0)->next)))) Ultima modifica di mjordan : 22-10-2007 alle 23:51. |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
questo pezzo di codice:
Codice:
((char *) & (((MemHead *)0)->next)) |
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
A me sfugge completamente la logica che ci sta dietro. Al calcolo dell'offset ci avevo pensato anche io, tuttavia non riesco a capire due cose:
a) Perchè usare nello specifico un casting a "char *". b) Effettivamente non mi è chiara la sintassi della seconda parte della sottrazione, per la precisione il primo membro dell'&. Quanto alla correttezza, ho implementato un programma di prova, tempo fa, e questo codice funzionava. Se lo trovo lo posto, devo averlo da qualche parte sparso per l'hard disk... Tu per caso hai qualche manuale come si deve sul preprocessore e le macro? EDIT: Perfetto, il programma che avevo fatto l'ho cancellato Il GNU cpp Reference Manual non aiuta purtroppo, c'è scritto tutto tranne che insegnare la sintassi avanzata delle macro di preprocessore... EDIT2: Muoio dalla voglia di vedere quanto è più efficiente fare cosi per restituire il prossimo nodo di una lista al posto del classico controllo del puntatore next. Perchè altrimenti questo è masochismo.
Ultima modifica di mjordan : 23-10-2007 alle 18:39. |
|
|
|
|
|
#4 | ||||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
per castarlo ad un tipo che abbia la dimensione di un byte suppongo, altrimenti l'aritmetica dei puntatori sottrarrebbe N * sizeof anziché N.
Quote:
forse volevi scrivere "operando"? ma guarda che non è mica un and Quote:
![]() cioè non sarebbe possibile ridefinire quella macro come Codice:
((x)->next) da dove l'hai preso sto codice? Quote:
Quote:
), quindi per forza di cose queste strutture MemHead devono essere disposte in memoria secondo un certo layout che fa si' che il calcolo effettuato dalla macro restituisca il puntatore alla struttura successiva.
|
||||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:45.












forse volevi scrivere "operando"? ma guarda che non è mica un and 








