2016-03-01 2 views
1

Je tente de traquer une erreur dans un script R qui appelle un programme C++. Le R me dit que mon C++ a renvoyé NA - mais cela ne semble pas être le cas quand je regarde le programme. Il n'y a rien appelé qui aboutirait à NA dans R. D'où ma question, si R ne peut jamais capturer la sortie du programme C++, parce que return 0 est appelé avant que toute sortie ait été écrite sur la console.Un retour main() avant que tout cout a été écrit dans la console?

Mon programme écrit certains nombres sur la console. Un nombre par ligne, la dernière ligne se termine par endl.

main() 
{ 
cout<<33.12<<"\n"; //print a couple of number to cout 
cout<<9711.3<<"\n"<<5699.14<<endl; 
return 0; 
} 

Mon R-Script fait des choses comme ceci:

x <- as.numeric(system("./myProgram", intern=T)) 
if(any(is.na(x))) { 
    stop("Wooppp, x is NA: ", x) 
} 

Peut-il, que R ne soit pas la Cout-sortie par le programme? Cette question est liée à la R-question correspondante: DEOptim keeps telling: NaN value of objective function

+2

Le 'endl' devrait ont rincé, et sinon 'cout' aurait du rougir à la sortie du programme. Cela dit, votre exemple est non compilable, ce qui laisse entendre que cela pourrait être un MCVE trop réduit et qu'il pourrait y en avoir plus ici. – user4581301

+1

L'exemple fourni fonctionne correctement pour moi. Assurez-vous que vos MCVE reproduisent réellement le problème avant de les poster. – nrussell

Répondre

0

En général, oui, il serait possible d'avoir une partie de la production non encore rincée avant la fin de main(). Cependant, à la fin du programme, tout devrait être rincé de toute façon.

Un peu plus de détails, le principal est juste une fonction, pour le programmeur c'est le point d'entrée du programme, même si en fait l'exécution fait certaines parties avant/après cet appel. Cela inclut le chargement d'objets partagés, l'appel de destructeurs de variables globales et d'autres choses dont vous ne devriez rien savoir en tant que programmeur habituel. Comme std :: cout est un objet global, il utilisera son destructeur pour vider les bonnes données.

Bien que la plupart des implémentations affleurent le caractère "\ n" (ne pense pas que cela soit nécessaire), std :: endl et std :: flush (je pensais que c'était nécessaire), cet exemple devrait être bon de toute façon.

Je voudrais essayer diviser cette question, et essayez de pousser la sortie du programme C++ dans un fichier pour le lire plus tard (à la fois du même programme R), essayez d'entrée de la console ...