2

わかりました、これは簡単な質問だと思いますので、ノックを取りますが、Google や SO で必要なものが見つかりません。ある場所で配列を作成し、別の関数内に入力したいと思います。

関数を定義します。

void someFunction(double results[])
{
    for (int i = 0; i<100; ++i)
    {
       for (int n = 0; n<16; ++n) //note this iteration limit
       {
           results[n] += i * n;
       }
    }
}

これは私のコードが行っていることの近似値ですが、オーバーフローや範囲外の問題などに遭遇するべきではありません。私は配列を生成します:

double result[16];
for(int i = 0; i<16; i++)
{
    result[i] = -1;
}

それから私はそれを渡したいsomeFunction

someFunction(result);

ブレークポイントを設定してコードをステップ実行すると、入力時にsomeFunctionresultsと同じアドレスに設定されresult、値は予想どおり -1.000000 になります。ただし、ループの繰り返しを開始すると、またはresults[n]に解決されないようで、 に解決されるようです。最終的に、結果の配列にデータを入力する代わりに、値を 1 つ取得するだけです。私は何を間違っていますか?*(results+n)*(results+n*sizeof(double))*(results)

EDIT ああ楽しいです、タイプミスがあります:そうではありませんでしvoid someFunction(double results[])た。そうだった:

void someFunction(double result[])...

したがって、おそらくこれはスコーピングの問題に変わりつつあります。double result[16]配列が main.cpp でsomeFunction定義されていて、main.cpp に含まれる Utils.h ファイルで定義されている場合、変数resultはmain.cpp の配列にsomeFunction大混乱をもたらしますか?result

編集2:

@gf、新しいプロジェクトでこの問題を再現しようとしている過程で、元のプロジェクトが「魔法のように」機能し始めました。

何も変わっていないので、どう説明したらよいかわかりませんが、私が見たものにはかなり確信があります。この問題についての最初の説明はかなり明確だったので、幻覚だったとは思いません。時間と回答に感謝します...時間を無駄にして申し訳ありません。再発した場合はまた更新しますが、当面は問題ないと思います。再度、感謝します。

4

5 に答える 5

1

質問の変数スコープ部分についてのポイント-ここでは変数スコープの問題はありません。someFunction 定義の結果/結果はパラメーターです->渡された値を取ります。呼び出された関数の変数と呼び出し元の間に関係はありません->呼び出し元の関数の変数は、渡されない限り、呼び出された関数に認識されませんまた、ネストされたルーチンがないため、C++ のルーチン間で変数のスコープの問題は発生しません。次のコードは、スコープの問題を示しています。

int i = 0;  
{  
    int i = 0;  
    i = 5; //changes the second i, not the first. 
    //The first is aliased by the second i defined first.  
}  
i = 5; //now changes the first i; the inner block is gone and so is its local i

したがって、C++ にネストされたルーチンがあった場合、変数のスコープが発生します。

void main()  
{  
    double results[16];  
    double blah[16];  
    doSomething(blah);  
    void doSomething(double * results)  
    {  
         //blah doing something here uses our parameter results, 
         //which refers to blah, but not to the results in the higher scope. 
         //The results in the higher scope is hidden.  
     }  
}
于 2010-04-28T01:42:06.487 に答える
1
void someFunction(double results[])

と正確に同等でなければなりません

void someFunction(double *results)

別の宣言を使用してみて、問題が解決しないかどうかを確認してください。

于 2010-04-27T23:20:39.510 に答える
1

私には、あなたのコードは単純に機能するはずです。

これをg ++で試してみたところ、うまくいきました。あなたの問題は他の場所にあると思いますか?投稿した切り抜きを試しましたか?

#include <iostream>

void someFunction(double results[])
{
    for (int i = 0; i<100; ++i)
    {
       for (int n = 0; n<16; ++n) //note this iteration limit
       {
           results[n] += i * n;
       }
    }
}

int main() 
{
  double result[16];
  for(int i = 0; i<16; i++)
  {
    result[i] = -1;
  }
  someFunction(result);
  for(int i = 0; i<16; i++)
    std::cerr << result[i] << " ";
  std::cerr << std::endl;  
}
于 2010-04-27T23:31:29.953 に答える
1

この問題が発生しないようにするには、そのようなグローバル変数を使用しないでください。絶対に必要な場合は、わかりやすくするために名前空間に入れます。

于 2010-04-28T00:21:55.140 に答える
1

結果配列をいくつかの場所で二重に定義した後、ある場所で 1 つのコピーを参照し、別の場所で別のコピーを誤って参照したことがありますか? おそらく、2 つ目は配列ではなくポインタであり、それが原因でデバッガが混乱するのではないでしょうか?

于 2010-04-28T00:07:12.550 に答える