Se sta parlando sempre di quella funzione potresti dare alla struct data 3 valori diversi di codicetipo, in modo tale che con 3 accede ad un campo, con 4 ad un altro e con 5 ad un altro ancora. Oppure potresti scegliere di usare solo un campo. In ogni caso viene tipo:
codice:
blablabla
case x: r = (va_arg(p, data).giorno - va_arg(p, int).giorno); break;
case y: r = (va_arg(p, data).mese - va_arg(p, int).mese); break;
case z: r = (va_arg(p, data).anno- va_arg(p, int).anno); break;
blablabla
Oppure potresti fare una funzione che confronta tutti i campi dal più significativo al meno significativo:
codice:
blablabla
case x:
data a = va_arg(p, data), b = va_arg(p, data);
r = a.anno - b.anno;
if (!r) r = a.mese - b.mese;
if (!r) r = a.giorno - b.giorno;
break;
blablabla
Bisogna creare due strutture data all'inizio perchè ogni interrogazione di va_arg va a cercare il dato successivo, quindi usandolo 6 volte (2 per ogni confronto) arriveresti ad un inesistente 6° dato, con conseguente errore.