3

_popen を使用してパイプ、つまり gnuplot ウィンドウを正常に開いています。ただし、fprintf を使用してストリームに書き込むことはできません。ファイル ポインタの値を確認しましたが、null ではありません。多くのソースを検索して fflush を使用しましたが、機能していません。解決策が見つかりませんでした。

実際、パイプを介したgnuplot c ++インターフェースの前に同様の質問をしました -wgnuplotをいくつか変更して再投稿できません。

どんな提案も役に立ちます..

FILE* gp;
  string command = "set style data lines\n" ;
  char *path = "\"C:\\Program Files\\gnuplot\\bin\\wgnuplot\" -persist";

  gp = _popen(path , "wt");

  if (gp == NULL)
    return -1;

 fprintf(gp,command );
 fflush(gp);
 _pclose(gp);

パイプを使用せずにこのコードを使用し、createprocess を使用しています。ここでも同じ状況で、gnuplot.exe が開きますが、出力プロットはありません。

int _tmain (int argc, LPTSTR argv [])

{
    DWORD i;
    HANDLE hReadPipe, hWritePipe;

    SECURITY_ATTRIBUTES PipeSA = {sizeof (SECURITY_ATTRIBUTES), NULL, TRUE};
            /* Init for inheritable handles. */
    TCHAR outBuf[ ] = TEXT("a=2; plot sin(a*x)/x; pause mouse; plot exp(-a*x); pause mouse") ;  
    TCHAR inBuf[80];
    DWORD dwWritten, dwRead ;
    BOOL  bSuccess = FALSE;
    PROCESS_INFORMATION  ProcInfo2;
    STARTUPINFO StartInfoCh2;


    /* Startup info for the Gnuplot process. */

    GetStartupInfo (&StartInfoCh2);

    /* Create an anonymous pipe with default size.
        The handles are inheritable. */

    bSuccess = CreatePipe (&hReadPipe, &hWritePipe, &PipeSA, 0);
    if (bSuccess == TRUE) printf("pipe created\n");

    WriteFile(hWritePipe, outBuf, sizeof(outBuf), &dwWritten, NULL) ;   
    printf("Wrote %d bytes to Gnuplot\n", dwWritten) ;

    CloseHandle (hWritePipe);

    /* Repeat (symmetrically) for the child process. */

    StartInfoCh2.hStdInput  = hReadPipe;
    StartInfoCh2.hStdError  = GetStdHandle (STD_ERROR_HANDLE);
    StartInfoCh2.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
    StartInfoCh2.dwFlags = STARTF_USESTDHANDLES;
    bSuccess = FALSE ;
    bSuccess = CreateProcess ("C:\\Program Files\\gnuplot\\bin\\wgnuplot.exe", NULL, NULL, NULL,
            TRUE,0, NULL, NULL, &StartInfoCh2, &ProcInfo2);
    if (bSuccess == TRUE)
      printf("Created Gnuplot Process\n" ) ;

    WaitForSingleObject (ProcInfo2.hProcess, INFINITE);
    CloseHandle (ProcInfo2.hThread); 
    CloseHandle (hReadPipe);

    /* Wait for Gnuplot process to complete.*/

    CloseHandle (ProcInfo2.hProcess);
    return 0;
}
4

2 に答える 2

0

問題はあなたのコードではないと思いますが、-persist は Windows では何もしません。つまり、グラフが一瞬以上表示されることはありません。gnuplot ウィンドウを表示する代わりに、次のような画像を生成できます。

#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE* gp;
  gp = _popen("gnuplot", "w");

  if (gp == NULL)
    return -1;

  fprintf(gp, "set terminal png\nset output 'tmp.png'\n");
  fprintf(gp, "set isosample 100\n");
  fprintf(gp, "min=-1\n");
  fprintf(gp, "max=1\n");
  fprintf(gp, "pi=3.141592\n");
  fprintf(gp, "set hidden3d\n");
  fprintf(gp, "set pm3d\n");
  fprintf(gp, "set contour\n");
  fprintf(gp, "splot [min:max] [min:max] x*x+2*y*y-0.3*cos(3*pi*x)-0.4*cos(4*pi*y)+0.7\n");
  fflush(gp);
  pclose(gp);

  return 0;
}

または、ある種の待機を導入することもできます。

#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE* gp;
  gp = _popen("gnuplot", "w");

  if (gp == NULL)
    return -1;

  fprintf(gp, "set isosample 100\n");
  fprintf(gp, "min=-1\n");
  fprintf(gp, "max=1\n");
  fprintf(gp, "pi=3.141592\n");
  fprintf(gp, "set hidden3d\n");
  fprintf(gp, "set pm3d\n");
  fprintf(gp, "set contour\n");
  fprintf(gp, "splot [min:max] [min:max] x*x+2*y*y-0.3*cos(3*pi*x)-0.4*cos(4*pi*y)+0.7\n");
  fflush(gp);
  for (;;) { }

  return 0;
}
于 2012-04-11T05:35:53.540 に答える
0

fprintf の構文使用法が間違っています。これは

fprintf(FILE,"[string literals] [format place holder]",[arguments corresponding to each place holder]);

プレースホルダーの構文は次のとおりです。

%[format type]

フォーマットタイプについては、

i or d = int
e = double shown in exponential form
f = double shown in floating point notation
g = double shown in best format
s = char * (a string literal)
c = char

例として:

int i=5;
fprintf("i is equal to: %i\n",i);

出力します:

i is equal to 5

\n は改行を表示するためのエスケープ シーケンスです。

于 2012-04-11T05:41:01.123 に答える