gpt4 book ai didi

c - 从 C 程序到 Gnuplot 的管道数据问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:27 24 4
gpt4 key购买 nike

下午好。我是一名物理化学本科生,几乎没有编程经验。我正在尝试编写一个程序来使用蒙特卡罗方法获得玻尔兹曼分布。总之,对于“for”循环的每次迭代,我的程序都会生成一个矩阵,其中包含能量的量化值和占据每个级别的粒子数,然后将这些值写入名为“plot.dat”的文件中,其中第一列上的能量(绘制为“x”)和第二列上的粒子数(绘制为“y”)。写入文件时,程序请求 gnuplot 使用新值重新绘制图形(之前在开始时分别使用 10 和 999 作为 'x' 和 'y' 的初始值绘制),因此我可以获得图形输出每次迭代完成时的物理系统状态(也就是说,“plot.dat”的“实时绘图”,每次文件更改时都会更新)。该程序几乎按预期工作,但大约每 20-30 次迭代,gnuplot 挂起约 10 秒,并在命令提示符中出现:

gnuplot> plot "auxiliar.dat"
^
line 0: x range is invalid

line 0: warning: Skipping data file with no valid points

然后,程序继续正常运行,gnuplot 更新每次迭代的绘图,直到它再次挂起。我不知道到底发生了什么,但我怀疑 gnuplot 试图在程序更新 plot.dat 文件时读取它,结果失败了。这是令人不安的代码的一部分:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
FILE *plot;
FILE *pipe = popen("gnuplot -persist" , "wt");
plot=fopen("plot.dat", "wt");
fprintf(plot, "10 999\n");
fclose (plot);
fprintf(pipe, "plot %plot.dat%c\n", '"', '"');

int iteration, part1, part2, iteration_msg;
for (iteration = 0; iteration < 110000; iteration++)
{
/* Code of Monte Carlo method here */

/* Update plot.dat with the new values */
fprintf(plot, "%d %d\n", plotdata[fila][1],plotdata[fila][0]);
fclose (plot);

/*Replot plot.dat in gnu after it's updated*/
fprintf(pipe, "replot\n");

}

fclose(pipe);
return 0;
}

你能帮我解决这个问题吗?先感谢您。注意:我在 Windows 中工作。

最佳答案

我已经设法解决了每次迭代后清除管道缓冲区的问题:

fflush(pipe);

关于c - 从 C 程序到 Gnuplot 的管道数据问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58052127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com