#c #console #pipe #gnuplot #popen
#c #консоль #канал #gnuplot #popen
Вопрос:
Я изучаю тему численного анализа и пытаюсь создать код с использованием c .
Сначала я хочу вызвать программу gnuplot и построить график функции. Но я сделал это с помощью функции popen.
И затем я вижу график и помещаю значение для одновременного вычисления решения проблемы.(Я потерпел неудачу.)
Проблема в том, что программа не продолжает работать после открытия программы gnuplot.
Как я могу продолжать запускать код c после использования popen?
Это код, который я сделал
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <assert.h>
#include <cstring>
using namespace std;
//const char func1[30] = "(10*x)*sin(x*100)";
void plotFunction(char function[50], double x_min, double x_max);
char func1[30] = "sin(3*x)";
char func2[50] = "sinh(x)";
int main()
{
plotFunction(func1, 0.0, 6.3);
plotFunction(func2, -3, 3);
cout << "process finished" << endl;
return 0;
}
void plotFunction(char function[50], double x_min, double x_max)
{
char range[100];
char min[10]; char max[10];
sprintf(min, "%f", x_min);
sprintf(max, "%f", x_max);
strcpy(range, "set xrange [");
strcat(range, min);
strcat(range, ":");
strcat(range, max);
strcat(range, "]n");
char plot[200];
strcpy(plot, "plot ");
strcat(plot, function);
strcat(plot, "n");
FILE* plotHandle = NULL;
if (plotHandle == NULL) {
plotHandle = _popen("C:\Program" "Files\gnuplot\bin\gnuplot.exe -continue", "w");
assert(plotHandle != NULL);
}
fprintf(plotHandle, "set terminal wxtn");
fprintf(plotHandle, "set xlabel "X"n");
fprintf(plotHandle, "set ylabel "Y"n");
fprintf(plotHandle, range);
fprintf(plotHandle, "set gridn");
fprintf(plotHandle, "plot (10*x)*sin(x*100)n");
fprintf(plotHandle, plot);
//fflush(plotHandle);
//_pclose(plotHandle);
}
Комментарии:
1. Я думаю, что ваша программа блокируется и ожидает завершения запущенного вами подпроцесса. Попробуйте что-нибудь более простое, что, как вы знаете, завершится. pubs.opengroup.org/onlinepubs/007904975/functions/popen.html чтобы проверить.
2. Что произойдет, если вы измените ‘-continue’ на ‘-persist’?