-1

関数を呼び出すと、calculatePlaneEQ値を割り当てるときにアクセス違反がスローされます...ポインタが錆びていますが、これでうまくいくようです。

float *planeCoefA, *planeCoefB, *planeCoefC, *planeCoefD = NULL;

電話:

calculatePlaneEQ (<...>, &planeCoefA, &planeCoefB, &planeCoefC, &planeCoefD);

DEF:

void calculatePlaneEQ (<...>, float ** myXnorm, float ** myYnorm, float ** myZnorm, float** myD)
{
    float  xNorm = 1.3;
    float  yNorm = 1.4;
    float  zNorm = 1.5;
    float eqD = 1.6; 

    *(*myXnorm) = xNorm;
    *(*myYnorm) = yNorm;
    *(*myZnorm) = zNorm;
    *(*myD) = eqD;  
}
4

4 に答える 4

8

そのはず:

float planeCoefA, planeCoefB, planeCoefC, planeCoefD;

電話:

calculatePlaneEQ (<...>, &planeCoefA, &planeCoefB, &planeCoefC, &planeCoefD);

DEF:

void calculatePlaneEQ (<...>, float * myXnorm, float * myYnorm, float * myZnorm, float * myD)
{

    float  xNorm = 1.3;
    float  yNorm = 1.4;
    float  zNorm = 1.5;
    float eqD = 1.6; 

    *myXnorm = xNorm;
    *myYnorm = yNorm;
    *myZnorm = zNorm;
    *myD = eqD;
}

さらに良いことに、ポインタではなく参照を使用してください。

電話:

calculatePlaneEQ (<...>, planeCoefA, planeCoefB, planeCoefC, planeCoefD);

DEF:

void calculatePlaneEQ (<...>, float &myXnorm, float &myYnorm, float &myZnorm, float &myD)
{

    float  xNorm = 1.3;
    float  yNorm = 1.4;
    float  zNorm = 1.5;
    float eqD = 1.6; 

    myXnorm = xNorm;
    myYnorm = yNorm;
    myZnorm = zNorm;
    myD = eqD;
}

これは、Cスタイルのポインターの使用よりも慣用的なC ++であり、エラーが発生しにくくなっています。

于 2012-10-01T21:01:25.093 に答える
1
float *planeCoefA, *planeCoefB, *planeCoefC, *planeCoefD = NULL;

ポインタを初期化していません。 planeCoefA、、、planeCoefBおよびplaneCoefCはランダムな値になります。のみplaneCoefDが割り当てられNULLますが、どちらにも書き込むことはできません。

ただし、とにかくそれらのメモリ位置に値を割り当てるだけに進みます。これは未定義の動作です。ポインタは変数であり、その値はメモリアドレスです。ただし、有効なメモリを自動的に指すわけではありません。それらは初期化する必要があります。

float planeCoefA = 0, planeCoefB = 0, planeCoefC = 0, planeCoefD = 0;

// ...

void calculatePlaneEQ (<...>, float *myXnorm, float *myYnorm, float *myZnorm, float* myD)

別のレベルの間接参照(つまり、float**v )を追加する唯一の理由は、呼び出し元が認識できるように引数float*を変更する必要がある場合です(覚えておいてください。これらの引数は、値で渡されます)。ポインタが参照するメモリ位置に書き込む必要があるだけなので、単一のポインタで十分です。

于 2012-10-01T21:00:30.373 に答える
1

1レベルの間接参照をやりすぎているようです。

float planeCoefA, planeCoefB, planeCoefC, planeCoefD;

電話

calculatePlaneEQ (<...>, &planeCoefA, &planeCoefB, &planeCoefC, &planeCoefD);

void calculatePlaneEQ (<...>, float * myXnorm, float * myYnorm, float * myZnorm, float* myD)
{
 ...
  *myXnorm = 12.1f;
 ...
于 2012-10-01T21:04:48.710 に答える
0

いつでも本物のフロートとリファレンスを使用して、自分自身や他の人にとって物事を簡単にすることができます。

float planeCoefA = 0.0;
float planeCoefB = 0.0;
float planeCoefC = 0.0;
float planeCoefD = 0.0;

CALL:calculatePlaneEQ(<...>、planeCoefA、planeCoefB、planeCoefC、planeCoefD);

DEF:

void calculatePlaneEQ (<...>, float & myXnorm, float & myYnorm, float & myZnorm, float & myD)
{

    myXNorm = 1.3;
    myYNorm = 1.4;
    myZNorm = 1.5;
    myD = 1.6; 

}

何らかの理由でポインターを使用したい場合は、関数シグニチャーで浮動小数点ポインターを使用できます。

void calculatePlaneEQ (<...>, float * myXnorm, float * myYnorm, float * myZnorm, float * myD)

この場合、関数の本体で各変数名の前にアスタリスクを付けます。

*myXNorm = 1.3;

ただし、無効なポインタが渡されるリスクがあります。

于 2012-10-01T21:12:08.687 に答える