|
|
|
![]() |
|
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 22: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 17: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:
![]() ![]() Quote:
![]() cioè non sarebbe possibile ridefinire quella macro come Codice:
((x)->next) da dove l'hai preso sto codice? Quote:
Quote:
![]() |
||||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:14.