stderr dans code C d'un package

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

stderr dans code C d'un package

Messagepar Stéphane Laurent » 07 Juil 2018, 14:44

Bonjour,

J'ai fait un package qui intègre du C : https://github.com/stla/cxhull

Ce package calcule l'enveloppe convexe d'un ensemble de points à l'aide la librarie C qhull. Ceci est déjà fait dans le package geometry mais mon package donne une sortie plus complète et il utilise une version plus récente de qhull.

Il marche très bien. Même quand il y a une erreur générée par qhull, celle-ci s'affiche dans la console, sans qu'il n'y ait de crash. Très bien.

Maintenant, voilà le problème. Quand je fais un R CMD CHECK, j'obtiens un warning avec ce message:

Compile code should not call entry points which might terminate R nor write to stderr/stdout instead of to the console.


Autrement dit, R CMD CHECK n'aime pas stderr. Ce n'est pas grave car le package marche bien, mais ça peut poser problème si je veux le soumettre à CRAN.

Je ne connais pas grand-chose en C et je ne sais pas comment gérer ça. Puis-je remplacer les stderr par quelque chose d'acceptable pour R ?

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: stderr dans code C d'un package

Messagepar François Bonnot » 10 Juil 2018, 06:16

Bonjour,
Une suggestion (sans garantie):
- ouvrir un fichier de sortie : FILE *fp=fopen("sortie.txt","w+");
- remplacer tous les printf(...) par fprintf(fp,...)
- remplacer tous les fprintf(stderr,...) par fprintf(fp,...)
François

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Re: stderr dans code C d'un package

Messagepar Stéphane Laurent » 12 Juil 2018, 11:58

Merci François. C'est bien ce qu'il me semblait après d'autres recherches, et il n'y a pas d'autres solutions me semble-t-il. Il y a aussi REprintf (ou un truc du genre) pour afficher les erreurs.

Malheureusement ce n'est pas si facile avec la librairie qhull. Il n'y a pas de fprintf(stderr, ...), du moins pas directement. Il y a des machins comme ça par exemple :

Code : Tout sélectionner

qh_fprintf(qh, stderr, 6186, "qhull error (qh_new_qhull): start qhull_cmd argument with \"qhull \"\n");


Là ça irait encore si je remplaçais stderr par un fichier, je pense. Mais il y a encore d'autres trucs plus compliqués que je ne sais pas comment gérer.

Sinon tant pis, c'est dommage de ne pas publier sur CRAN mais je laisserai mon package uniquement sur Github.

Dans la version précédente de qhull, celle utilisée par le package geometry, c'était plus simple à gérer.

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Re: stderr dans code C d'un package

Messagepar Stéphane Laurent » 23 Juil 2018, 09:37

C'est bon je m'en suis sorti :)

Je crée un fichier temporaire dans R, et je passe cette chaîne de caractères à la fonction C.

En résumé. Je fais effectivement :

Code : Tout sélectionner

FILE* errfile   = fopen(errfilename, "w+");


Ne pas oublier de faire fclose(errfile) quand il n'y a plus besoin de ça !

J'ai remplacé les stderr par errfile, et les fprintf(stderr, "blabla") par REprintf("blabla").

Pour réappatrier les erreurs dans R, je lis et affiche le fichier temporaire.

RCM Check: 0 error, 0 warning, 0 note !

Sauf autre complication, mon package sera donc sur CRAN.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité