-1

オブジェクト「ダイアグラム」を作成し、それらにデータを入力するプログラムがあります。その後、これらのオブジェクトへのポインターをdiagram.exeに送信して、ダイアグラムを描画できるようにします。私は _spawnv を使用していますが、diagram.exe が取得するポインターは、私が送信するポインターとは異なります。私は何を間違っていますか?そして、これのためのより適切な方法はありますか? 前もって感謝します。

//diagram.exe を呼び出すプログラム

#include<conio.h>
#include<math.h>
#include<process.h>
#include<iostream>
using std::cout;
using std::endl;


int main()
{
    Diagram** diagrams = new Diagram*[2];
    diagrams[0] = new Diagram(1001, "sin(x)");
    diagrams[1] = new Diagram(150, "atan(x)");
    diagrams[2] = NULL;

    double x = -2.0;
    for(int i = 0; i < 1001; i++)
    {
        diagrams[0]->points[i].x = x;
        diagrams[0]->points[i].y = sin(x);
        diagrams[0]->points[i].flag = true;
        diagrams[0]->points[i].radius = 4;

        diagrams[1]->points[i].x = x;
        diagrams[1]->points[i].y = atan(x);
        diagrams[1]->points[i].flag = true;
        diagrams[1]->points[i].radius = 5;

        x += 0.004;
    }

    cout << "CallDiagram.exe: diagrams: " << (void*)diagrams << endl;

    char* args[3] = {"diagram.exe", (char*)diagrams, NULL};
    _spawnv(_P_WAIT, "..\\..\\diagram\\Debug\\diagram.exe", args);

    _getch();

    delete diagrams[0];
    delete diagrams[1];
    delete [] diagrams;

    return 0;
}

//diagram.cpp

#include "diagram.h"
#include "DrawDiagram.h"


int main(int argc, char* argv[])
{
    if(argc <= 1)
    {
        cout << "\ndiagram.exe: No arguments!" << endl;
        return 1;
    }

    Diagram** diagrams = (Diagram**)argv[1];//NULL;
    cout << "diagram.exe: diagrams: " << (void*)diagrams << endl;

ここに画像の説明を入力

4

1 に答える 1

2

あるプログラムから別のプログラムにポインターを送信することはできません。両方のアプリケーションで開く共有メモリを作成し、それを使用して共有したいデータを保存できます。

Windows では、CreateFileMappingこのような共有メモリを作成するために使用し、2 番目のアプリケーションはOpenFileMapping反対側でそれを取得するために使用します。

これは、ファイルでデータを送信するよりも簡単ではないことに注意してください。他の部分が使用しようとする前に、データが同期され、共有メモリに完全に書き込まれていることを確認する必要があるためです。

于 2013-02-21T20:55:03.977 に答える