0

doubleの配列があり、その配列で計算を実行してから、その計算の結果である最小値と最大値を見つける必要があります。これが基本的に私が持っているものです:

double * array;
double result;
double myMin;
double myMax;

// Assume array is initialized properly...
for (int i = 0; i < sizeOfArray; ++i) {
    result = transmogrify(array[i]);
    if (i == 0) {
        myMin = result;
        myMax = result;
    }
    else if (result < myMin) {
        myMin = result;
    }
    else if (result > myMax) {
        myMax = result;
    }
}

計算された値resultが使用されないという警告が表示されます。すべての警告をエラーとして扱うため、これはコンパイルされません。警告を回避するためにこのコードを修正するにはどうすればよいですか?コンパイラにg++を使用しています。

警告テキストは次のとおりです。

cc1plus: warnings being treated as errors
foo.cc:<lineno of transmogrify call>: error: value computed is not used

編集:私は反対票を理解していませんが、私は今物事が機能しています。時間を割いて私を助けてくれたみんなに感謝します。

4

9 に答える 9

4

ループの外側は必要ないと仮定すると、ループの内側を次のようにresult宣言できます。result

for( int i=0; i < sizeOfArray; ++i ) {
    double result = transmogrify( array[i] );
    ...
}
于 2009-04-27T16:26:49.697 に答える
4

result(理論的には)if / elseブランチが選択されない可能性があるため、計算された値が使用されないという警告が表示されます。

resultif条件でも使用されるため、これが警告の理由になることはありません。どのブランチも取得されない場合でも、取得resultされるべきではないことを決定するために使用されます。

于 2009-04-27T16:31:59.653 に答える
2

myMinとmyMaxをそれぞれDBL_MAXとDBL_MINで初期化し、ループチェックを最初に実行します。

于 2009-04-27T16:31:31.167 に答える
1

コンパイラが驚異的なフロー分析を行っていない限り、投稿されたコードでエラーが発生することはないと思います。それは確かにg++でOKにコンパイルされますが、g++があなたが受けている警告さえサポートするかどうかはわかりません。

構造を保持する次のコードの適応では、g++でエラーは発生しません。

int main() {
double * array;
double result;
double myMin;
double myMax;

double t(double);

// Assume array is initialized properly...
for (int i = 0; i < 10; ++i) {
    result = t(array[i]);
    if (i == 0) {
        myMin = result;
        myMax = result;
    }
    else if (result < myMin) {
        myMin = result;
    }
    else if (result > myMax) {
        myMax = result;
    }
}

}

于 2009-04-27T16:28:55.417 に答える
1
result = [...]
if (i == 0) {
    [... do something with result ...]
}
else if (result < myMin) {

if()の両方のブランチで、resultが使用されます。最初のケースでは変数に割り当てられ、2番目のケースでは比較に使用されます。したがって、コンパイラは警告するべきではありません。

問題を誤診したのではないかと思います。エラーメッセージが何であるかを正確に言うことができます(コピーして貼り付けてください)。また、実際にコンパイルして警告を出すことができる最小のコードを投稿してみてください。(単にそれを行おうとすると、おそらく問題を見つけることができます)

編集:transmogrify()がresult内部で使用するマクロである可能性はありますか?

于 2009-04-27T16:30:49.750 に答える
1

「if」ステートメントの前:

result = 0.0;

または他の値。変数を使用する前に、変数をある値に設定することは常に良い形式です。

于 2009-04-27T16:32:20.230 に答える
1

(理論的には)if / elseブランチが選択されない可能性があり、すべての警告をエラーとして扱うため、これはコンパイルされないため、結果に対して計算された値が使用されないという警告が表示されます。警告を回避するためにこのコードを修正するにはどうすればよいですか?コンパイラにg++を使用しています

結果に使用される値が常に使用されます。割り当てられていない場合は、コンパレータで使用されます。したがって、コンパイラに障害があります。

于 2009-04-27T16:34:21.537 に答える
0

簡単な解決策は、次のように最初の反復を展開することです。

double * array;
double result = transmogrify(array[0]);
double myMin = result;
double myMax = result;
int i;

for (i = 1; i < sizeOfArray; ++i) {
    result = transmogrify(array[i]);

    if (result < myMin) {
        myMin = result;
    }

    if (result > myMax) {
        myMax = result;
    }
}

編集:これについて少し詳しく説明します。sizeOfArrayの詳細については説明していませんが、符号付き整数型だと思います。

警告の原因を誤解していると思います。ループ内のif..else句ではなく、sizeOfArrayがゼロ以下である可能性があるため、結果が使用されていない可能性があります。上記のコードでは、大文字と小文字を注意深く処理する必要がある理由が少し明確になっている可能性があります(sizeOfArray <= 0)が、元のコードスニペットでも同様に重要です。

于 2009-04-27T16:41:34.933 に答える
-1

最初のelseを削除すると、ループを最初に実行する実行時間にのみ影響します。私はむしろそれを排除したいと思います。

if (i == 0) {
    myMin = result;
    myMax = result;
}
if (result < myMin) 
    myMin = result;
else if (result > myMax) 
    myMax = result;
于 2009-04-27T16:29:46.977 に答える