0

メンバー関数に渡された文字列名に従って、動的に割り当てられた配列を出力したいクラスのメンバー関数を作成しています。次のコードでは、何らかの理由でコンパイル エラーが発生します。

error: 'tmp' was not declared in this scope

コーディングはどうすればいいですか?私のコードの問題は何ですか?

void backgrnd::print(const char m[]){                                                                                      
    if (m == "interior")                                                       
        int* tmp = this->interior;                                             
    else if (m == "fB")                                                        
        float* tmp = this->fB;                                                 
    for (int i=0;i<this->n_vox;++i)                                         
        cout << tmp[i] << ' ';                                                 
}         
4

3 に答える 3

2

プログラミングに慣れていない場合は、中括弧を使用してください。これらの変数はローカル スコープにあります。

if (m == "interior")         
{                                              
        int* tmp = this->interior;
}
....
tmp is out of scope..
于 2013-01-29T01:49:20.850 に答える
2

tmpvariable は if/else スコープのみにあり、 では使用できませんfor loop

ただし、より良い印刷機能をお勧めします。

void backgrnd::print(const std::string& m)
{                                                                                      
    if (m == "interior")          
    {                                             
        std::cout << *interior << std::endl;                                             
    }
    else if (m == "fB")                                                        
    {
        std::cout <<fB << std::endl;                                                 
    }
}        
于 2013-01-29T01:51:21.293 に答える
2

コードにはいくつかの問題があります。

ポインタで文字列を渡しています(書き込みconst char []は書き込みとまったく同じですconst char *–ところで、const連想のままでchar const *、同様に書くこともできます)。

void backgrnd::print(const char m[]){

mとにかく、次の行では、このポインターを文字列リテラル定数を参照するポインターと比較しています"interior"

    if (m == "interior")

そして、これはあなたが考えていた可能性が最も高いものではありません。この操作は、文字列ではなくポインターの値を比較します! 関数に渡したポインターが同じ文字列リテラルのポインターである場合、ポインターは等しいとのみ比較されますが"interior"、これはほとんどありません。それが他の文字列である場合、文字シーケンスも含まれていたとしても、interior同等とは比較されません。また、コンパイラやリンカーが冗長な文字列リテラルを単一のポインター定数に編集しなかった場合にも発生します。

そしてもちろん、他のポインタ - 文字列リテラルの比較も同じ問題に悩まされています。

次の問題は、tmp同じ型のインスタンス クラス メンバ ポインタ変数で初期化するスコープ ポインタ変数を作成することです。しかし、スコープが離れるとすぐに、その変数は表示されなくなります...

        int* tmp = this->interior;                                             
    else if (m == "fB")                                                        
        float* tmp = this->fB;

...そして、この for ループはもはやそれを見ることができません。このループ自体が問題です。なぜなら、それが何n_voxを意味するのか不明だからです。

    for (int i=0; i < this->n_vox; ++i)

以下のコードの重複を避けるために上記を書いたと思います。tmp問題は次のとおりです。C++ は静的に型付けされた言語であるため、次のステートメントは変数の型に「動的に」型付けできません。

        cout << tmp[i] << ' ';                                                 
}

以下にいくつかの提案を示します。

C++ を使用する場合は、ネイキッド char 配列の代わりにstd::stringを使用する必要があります。これにより、等値演算子==は単純に期待したことも実行できます。C スタイルの char 配列をどうしても使用したい場合は、 のような文字列比較関数を使用してstrncmpください。

cout<<とにかく静的に型付けされたステートメントを記述する必要があるため、そのループをif句に移動します。中括弧を使用してそれらを囲みます。.

于 2013-01-29T02:10:22.667 に答える