Puisque vous utilisez info->error
pour dire si la fonction a échoué ou non, vous pouvez retourner ce que vous voulez, puisque l'appelant doit ignorer la valeur de retour. Vous pouvez donc taire l'avertissement avec return -1
, return 0
, return MAGIC_NUMBER
... ...
En général, les fonctions sont codées de la manière inverse : la valeur de retour indique si la fonction a réussi ou non. Si toutes les valeurs de retour int sont bonnes, vous pouvez écrire la fonction de manière à ce qu'elle renvoie un échec ou un succès, et en cas de succès, vous remplissez les données. Dans votre cas, votre structure d'information pourrait contenir un int data
ou vous pouvez ajouter une autre arg au func.
De cette façon, l'appelant peut faire quelque chose comme
if ( pop(stack, info) == SUCCESS ) {
// ...
printf("%d\n", info->data);
} else { /* failure */
// info->data holds no data, but info->error could be an error code, e.g.
fprintf(stderr, "can't pop: %s\n", error_msg[info->error]);
}
L'utilisation dans votre cas est moins intuitive :
data = pop(stack, info);
if (info->error != ERROR) {
// data is valid
} else {
// data is garbage and we have to say an error occurred.
}
BTW, vous ne mettez pas info->error
à quelque chose de différent par 0, donc votre code est potentiellement bogué ; par exemple
info->error = 0;
data = pop(stack, info);
déclencherait toujours une erreur, même si la pile est effectivement correcte et que les données sont donc valides.