PDA

View Full Version : [C] - una definizione


misterx
03-06-2009, 13:14
non mi è chiaro cosa definisce questa sotto:

EXTERN struct proc *pproc_addr[NR_TASKS + NR_PROCS];
#define NR_TASKS 4
#define proc_addr(n) (pproc_addr + NR_TASKS)[(n)]

e poi se questa assegna a xp il risultato della chiamata di una funzione oppure, se questo proc_addr(xp->p_sendto) è un assegnamento che non ho mai visto ?

xp = proc_addr(xp->p_sendto);

A me sembra più una chiamata di funzione

grazie

banryu79
03-06-2009, 13:59
No è una semplice (:rolleyes:) "function-like" macro.
Ovvero una macro con parametro, che sembra una chiamata a funzione ma che in realtà è una trappola per topi :D

Scherzi a parte, essendo una define, va interpretata così:

#define proc_addr(n) (pproc_addr + NR_TASKS)[(n)]
regola:
#define <identifier>(<parameter list>) <replacement token list>


Per cui il tuo codice:

xp = proc_addr(xp->p_sendto);

dopo che il preprocessore è passato a farsi il suo giretto, se la mia memoria del C non è del tutto arruginita, viene sostituito così:

xp = proc_addr + NR_TASKS[(xp->p_sendto)];



<DISCLAIMER MODE>
Si declina ogni responsabilità per le eventuali fantasticherie espresse in questo post (attendi lumi più precisi).
</DISCLAIMER MODE>

||ElChE||88
03-06-2009, 14:03
Edit: già corretto

misterx
03-06-2009, 22:14
Per cui il tuo codice:

xp = proc_addr(xp->p_sendto);

dopo che il preprocessore è passato a farsi il suo giretto, se la mia memoria del C non è del tutto arruginita, viene sostituito così:

xp = proc_addr + NR_TASKS[(xp->p_sendto)];



quindi NR_TASKS è un array :confused:
Quello che non mi suona è che [(xp->p_sendto)] quello tra parentesi è un ....... anzi mi coorreggo: non è un puntatore ma un intero che rappresenta il numero del processo

Quindi l'assegnamento xp = proc_addr + NR_TASKS[(xp->p_sendto)]; fa puntare xp a proc_addr + indirizzo del processo interessato :stordita:

misterx
06-06-2009, 11:21
up :stordita:

misterx
06-06-2009, 17:04
in questo scorcio di codice si dice che il wile verifica eventuale deadlock tra il chiamante e la destinazione ma anche tra gli altri processi: il punto è che non vedo nulla, parti di codice e solitamente '++' che incrementi alcun puntatore :confused:

07605 /* Check for deadlock by 'caller_ptr' and 'dst' sending to each other. */
07606 xp = dst_ptr;
07607 while (xp->p_rts_flags & SENDING) { /* check while sending */
07608 xp = proc_addr(xp->p_sendto); /* get xp's destination */
07609 if (xp == caller_ptr) return(ELOCKED); /* deadlock if cyclic */
07610 }

DanieleC88
06-06-2009, 17:15
il punto è che non vedo nulla, parti di codice e solitamente '++' che incrementi alcun puntatore :confused:

xp = proc_addr(xp->p_sendto);

misterx
06-06-2009, 17:48
xp = proc_addr(xp->p_sendto);

credo di non aver capito :stordita:

misterx
06-06-2009, 17:53
faccio un pò di ordine

EXTERN struct proc *pproc_addr[NR_TASKS + NR_PROCS];
#define NR_TASKS 4
#define proc_addr(n) (pproc_addr + NR_TASKS)[(n)]

xp = proc_addr(xp->p_sendto);

come si trasfrorma quindi xp ?
Cioè, cosa gli viene assegnato ?

misterx
07-06-2009, 10:08
scusate ma ci sono arrivato dopo un pochino :D