我有同样的一般问题,快速的谷歌搜索让我找到了以下应用程序,它似乎使用了 gnuplot。
https://apps.apple.com/us/app/icas-workstation-class-scientific/id394637176 https://apps.apple.com/us/app/icas-workstation-class-scientific/id394637176
我顺着线索来到了他们的网站:
http://alsoftiphone.com/iCAS/ http://alsoftiphone.com/iCAS/
我就此联系了他们,如果/当我得到回复时,我会跟进。
响应:
Hello,
正如您恰当地指出的那样,在应用程序中嵌入 gnuplot 时会出现一些复杂情况,特别是如果您打算动态创建和处置它。也就是说,gnuplot(从我使用的 v4.4.0 开始)不会显式释放它分配的一些内存,大概是因为它假设它在退出时会被释放,当它被用作一个独立的应用程序。这当然会导致内存泄漏。类似地,gnuplot 不会显式关闭其输出文件描述符(设置为stdout
据我所知)。当主函数退出时,它也不会清除多重绘图模式,这是有问题的,因为下次您在嵌入式情况下调用 gnuplot 时,如果此后调用,某些全局变量将反映多重绘图模式。
对你来说幸运的是,我已经识别了他们,所以你不必像我一样追捕他们。但不幸的是,我没有为我的项目创建库,但以下是您需要对 gnuplot 源代码进行的相关更改。
plot.c
第 #615 行,位于 else 块的末尾"if (interactive && term != 0)"
的条件块main()
函数(您还需要将其更改为适当的入口函数名称):
// Free replot_line
if (replot_line != NULL)
{
free(replot_line);
replot_line = NULL;
}
plot.c
第 #680 行,在末尾的“return exit_status”之前main()
功能:
// Free replot_line if it was allocated
if (replot_line != NULL)
free(replot_line);
// Clear multiplot mode, if it was active
if (multiplot)
term_end_multiplot();
// Close current file
if (gpoutfile)
fclose(gpoutfile);
另一个问题是 gnuplot 被编写为使用 stdin 和 stdout,因此对于我的应用程序,我将它们替换为我自己的适当文件描述符,作为 gnuplot 的接口。这将是特定于实现的,所以我不会列出我自己的特定更改,但您基本上需要查看 gnuplot 源代码中的 stdin 和 stdout 实例,并根据您的需要替换它们。
你也会想要#define NO_GIH
in config.h
.
除此之外,您可能需要为您的应用程序硬编码适当的 gnuplot 终端类型(我在应用程序中使用了 SVG)。
我希望这有帮助。
此致,
安东尼奥·拉加纳