0

問題が発生しました。2 つの異なる値のセットを送信すると、2 点間の距離を計算できる dll を作成しようとしています。ただし、2 番目の値のセットを送信すると、最初の値のセットが配列で欠落していることに気付きます (配列は値を格納するために使用されます)。

以下は私のコードです:

int click = 0;   //click is used to measure the number of times i have clicked, ie to say the number of times im injecting new (a,b) points into the function below.

double MeasureDistance(double a, double b)
{
    /******* Create Array to Store The Points ********/

    /** Initializing the array **/
    double xDistance =0;
    double yDistance =0;
    double TDistance = 0;
    static double **Array;
    int column = 0; //used to toggle the column number
    int width = 100;
    int height = 100;
    Array = new double *[width];
    for (int i=0; i <width; i++)
    {
        Array [i] = new double [height];
    }

    /*** Now a and b are stored inside the Array[0][0] ***/

    for (column =0; column <2; column ++)
    {
        if ((column % 2)==0)
        {
            Array [click][column] = a; //storing at [0,0]
        }
        else 
        {   
            Array [click][column] = b; //storing at [0,1]
        }
    }
                for (int row = 2; row < click; row ++)
    {
        for (column = 0; column <2; column ++)
        {   
            if ((column % 2) == 0)
            {
                xDistance = Array [0][column] - Array [row][column];
            }
            else
            {
                yDistance = Array [0][column] - Array [row][column];
            }
        }

        TDistance = sqrt((xDistance * xDistance) + (yDistance * yDistance));
    }

/*** Clearing up of array ***/
    for (int i = 0; i < width; i++)
    {
        delete[] Array[i];
    }
    delete[] Array;


click++;
    return TDistance ;
}

a と b の値の 2 番目のセットを挿入すると、配列 [0][0] と [0][1] の値が失われますが、2 番目の値のセットは [1][0] に格納されます。そして[1][1]。以前の値を失わずにこのスクリプトを実行する方法はありますか? 事前に感謝します。いくつかのクエリをクリアするために編集されたコード。

4

1 に答える 1

2

この行Array = new double *[width];では、すべての関数呼び出しで配列を初期化しています。値を保存する必要がある場合 (私は非常に疑問です)、静的に初期化されたベクトルを使用することをお勧めします。しかし、一般に、関数の結果を以前の呼び出しに依存させることは非常に悪い考えです。本当に状態を蓄積する必要がある場合は、この目的のために関数オブジェクトを作成することを検討してください。

編集:

関数オブジェクトを使用すると、アルゴリズムの動作を変更してデータ構造を変更operator()し、メンバー変数を介してデータを保持できます。

2番目の編集: おそらく次のようなものが必要です:

struct MeasureDistance {
  double last_x;
  double last_y;

  MeasureDistance() : last_x(0), last_y(0) {}
  double operator()(double new_x, double new_y) {
    double diff_x=last_x-new_x;
    double diff_y=last_y-new_y;
    double result=sqrt(diff_x*diff_x,diff_y*_diff_y);

    last_x=new_x;
    last_y=new_y;

    return result;
};

MeasureDistance md;
cout 
  << md(0.0, 1.0) << '\n' //prints 1
  << md(2.0, 1.0) << '\n' //prints 2
  ;
于 2013-06-19T08:28:22.487 に答える