2016-03-01 71 views
1

我尝试追踪调用C++程序的R脚本中的错误。 R告诉我,我的C++返回了NA - 但是当我浏览这个程序时似乎并不是这样。在R中没有任何调用会导致NA。因此,我的问题是,如果R可能永远不会捕获C++程序的输出,因为在将所有输出写入控制台之前调用return 0在所有的cout被写入CONSOL之前,main()是否可以返回?

我的程序确实写了一些数字到控制台。每行一个数字,最后一行以endl结尾。

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

我的R-脚本做这样的东西:

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

它可以,就是R不从程序获得COUT输出? 这个问题是关系到相应的R-问题: DEOptim keeps telling: NaN value of objective function

+2

的'endl'应已经刷新,如果没有'cout'应该在程序退出时刷新。也就是说,你的例子是不可编译的,暗示这可能是一个过度缩减的MCVE,并且可能会有更多的事情在这里发生。 – user4581301

+1

提供的示例适用于我。确保您的MCVE在发布之前实际上重现了问题。 – nrussell

回答

0

一般而言,是的,这将是可能的主结束之前具有输出的一部分尚未刷新()。但是,在程序结束时,无论如何都应该刷新所有内容。

更多细节,main只是一个函数,对于程序员来说这是程序的入口点,但实际上运行时会在此调用之前/之后执行一些部分。这包括加载共享对象,调用全局变量的析构函数以及其他一些你实际上不应该作为普通程序员知道的东西。

由于std :: cout是一个全局对象,它将使用它的析构函数来刷新正确的数据。虽然大多数的实现在“\ n”字符上刷新(不要认为它是必须的),std :: endl和std :: flush(我认为这是必需的),但这个例子应该没​​问题。

我会尝试拆分这个问题,并尝试推C++程序文件然后需要读取它(无论是从同一个R-程序),尝试控制台输入输出...

相关问题