2017-03-25 3 views
-3

このコードでは、このスコープで宣言されていないエラー「x」が発生しています。私はコンピュータがKrow> 2とKrow == 3の両方のステートメントを実行すると思っていたでしょう。C++:コンパイラがこのスコープで宣言されていないエラーを与える理由について混乱しました

void GaussianElimination::JacobianFiller(){ 

    if(Krow > 2){ 
     double x = Y(0); 
    } 
    if(Krow == 0){ 
    //............. stuff 
    } 
    else if(Krow == 3){ 
     double a = x 
    } 
} 
+2

ではありませんか?最初の 'if'のスコープに' x'を宣​​言します - それは 'if'ステートメントの外側では見えません - 参照のスコープで読むことができます:http://en.cppreference.com/w/cpp/言語/スコープ – UnholySheep

+2

各中括弧で囲まれた各ブロックに新しいスコープが導入されています。ブロック内の変数は、そのブロックのみに属します(そして、*入れ子*内部ブロック)。外側または並列ブロックは範囲または変数を共有しません。 –

+0

ありがとう、私の問題は、 "double x = Y(0);"を書き換えたくないということです。これは実際には3つのelse if文の5行です。私はそれをクラスのメンバーデータにすることができましたが、メンバーデータオブジェクトの量はすでに巨大です。スコープを拡張する別の方法はありますか? – Toby

答えて

1

変数にアクセスすることができ宣言のスコープC++を決定するためにlexical block scopingを使用することである理由:要するに、これは唯一の変数は、彼らが宣言されている範囲で、かつ内の任意のネストされたスコープでアクセスできるようになりそのスコープ(宣言の後)。

xは、if(Krow > 2)に続くブロックで宣言されているため、そのスコープの外側には表示されません。

これは、親スコープに単に宣言xによって解決することができます。代わりに上記の

double x; // declare x 

if (Krow > 2) { 
    x = Y(0); // don't declare new x, refer to existing x 
} 
if (Krow == 0) { 
    // stuff 
} 
else if(Krow == 3) { 
    double a = x; // x is visible here, because this is a child scope of the scope where x is declared in. 
} 

、あなたもそうのようなあなたのifの順序を変更できます。

if(Krow > 2) { 
    double x = Y(0); 

    if(Krow == 3) { 
     double a = x; // x is visible here 
    } 
} 
else if (Krow == 0) { 
    // stuff 
} 

をこの構造は持っています元のものと全く同じ制御フロー。

0

最も単純なアプローチです。これを行う:

void GaussianElimination::JacobianFiller() 
{ 
double a,x; 
If(Krow >= 4) 
{ 
x=Y(0); 
} 
if(Krow == 0) 
{ 
// .......... Stuff 
} 
else if(Krow == 3) 
{ 
a = x; 
} 
} 
1

あなたのコードには異なるスコープがあります。関数は次のとおりです。

void GaussianElimination::JacobianFiller(){ 
    /* Scope of the function */ 
    // This includes all other blocks of code in the function 
    if(Krow > 2){ 
     // Still in the scope of the function 
    } 
    // More code... 
} 

次に、関数内に異なるステートメントがあります。私はこれらのブロックがお互いまたは機能を見ないので、機能を除外することを選択しました。彼らは自分のスコープの内部だけを見ています。

if(Krow > 2){ 
    // You've created a local double in this scope 
    // Accessing a function with an even larger scope 
    double x = Y(0); 
} 

同じことは、この声明のために行く:

else if(Krow == 3){ 
    // Local double trying to access a variable outside of its scope 
    double a = x; 
} 

は今、以前の機能に述べたように、より大きな範囲を持っています。問題を解決するには、ブロックがdouble xにアクセスできることを確認します。関数のスコープまで移動することで、ダブルにアクセスできます。

void GaussianElimination::JacobianFiller(){ 
    // Create local double in the scope of the function 
    double x; 
    if(Krow > 2){ 
     // Since we're still in the scope access the double 
     x = Y(0); 
    } 
    // More code... 
} 
関連する問題