3

説明的または簡潔な名前を選択しなかった場合は申し訳ありません。多くの質問が似ているように聞こえますが、探しているものを見つけることができませんでした。私がしたいのは、ポインターの2D配列をどこかに保存し、その配列にオブジェクトの変数を割り当てて、それにアクセスできるようにすることです。

これは、より大きなプロジェクトで発生したのと同じコンパイル エラーが発生するコードの例です。

#include <iostream>
using namespace std;
struct X{
    float n, * b[8][8];
    X(){
        n = 1;
        b[1][5] = &n;
        cout << *(b[1][5]) << endl;
    }
    void Set(float * c[8][8]){
        b = c;
        cout << *(b[1][5]) << endl;
    }
};
main(){
    float m, * a[8][8];
    m = 2;
    a[1][5] = &m;
    X obj;
    obj.Set(a);
}

このコードで実現したいことは、X オブジェクトが独自の 2D 配列で始まり、b[1][5] が指す値が "1" として出力されるようにすることです。次に、メイン メソッドの 2D 配列 a がオブジェクトの Set() メソッドに渡され、その配列変数に割り当てられます。b[1][5] が指す値は、「2」として出力されます。

ただし、Set() パラメーター c がどの型であるべきかわかりません。私は得る

error: incompatible types in assignment of ‘float* (*)[8]’ to ‘float* [8][8]’

コンパイルしようとすると。なぜこれをしたいのかというと、フロートではなくオブジェクトへのポインターの配列を使用しようとしていますが、同じエラーです。

4

3 に答える 3

1

これを試して:

#include <iostream>
using namespace std;
struct X{
    float n;
    float* (*b)[8];
    X(){
        n = 1;
        b = new float*[8][8];
        b[1][5] = &n;
        cout << *(b[1][5]) << endl;
    }
    void Set(float * c[8][8]){
        delete[] b;
        b = c;
        cout << *(b[1][5]) << endl;
    }
};
main(){
    float m, * a[8][8];
    m = 2;
    a[1][5] = &m;
    X obj;
    obj.Set(a);
}

ここではX、1D 配列へのポインターを格納します。これは、2D 配列の最初の要素へのポインターとして、つまり単なる 2D 配列として扱っています。

Xのコンストラクターで、 でX独自の配列を割り当て、それnewを指すようにポインターを設定します。を呼び出すとSet()X自身の配列が削除され、ポインタが呼び出し元から提供された配列を指すように設定されます。

注意すべき唯一のことは、Set()もう一度呼び出すと、その配列が削除されることです (この場合のように、その配列がスタック配列である場合は爆発します)。delete[] bそのため、do を実行する行を独自のメンバー関数に分けて、必要な場合にのみ呼び出すことをお勧めします。

于 2012-06-07T05:48:37.793 に答える
0

いくつかのバグがあると思います。まず、Set()関数で配列名を割り当てました。ただし、配列名を変数として使用しないでください。これを解決するには、float *(* b)[8] ..のように、ポインターbの2D配列をポインターの1D配列へのポインターとして作成します。

次に、Set()関数の引数としてポインターの2D配列を送信すると、ポインターの1D配列へのポインター、つまりこのfloat *(* a)[8]のようなものに減衰します。したがって、Set()関数の仮引数をvoid Set(float *(* c)[8])..のようなポインターの1D配列へのポインターにする必要があります。

そして最後に、main内のfloat変数mがmainに対してローカルであることがあります。したがって、Set()関数への制御パスの場合、コンパイラーはm内の値(割り当てが解除される可能性があります)を見つけることができないと思います...したがって、未定義を出力しますまたは実行時エラーを与える..ma静的バージョンを作成することでこれを解決できます。つまり、静的フロートm..を宣言します。

全体として、次のようにコードを作成します。

#include <iostream>
using namespace std;
struct X{
    float n, *(*b)[8];
    X(){
        n = 1;
        b[1][5] = &n;
        cout << *(b[1][5]) << endl;
    }
    void Set(float * (*c)[8]){
        b = c;
        cout << *(b[1][5]) << endl;
    }
};
main(){
    float * a[8][8];
    static float m;
    m = 2;
    a[1][5] = &m;
    X obj;
    obj.Set(a);
}

これは正しく出力されます:)

于 2012-06-07T05:50:25.080 に答える
0

set の問題は、配列の内容をコピーする必要があることです。実行するだけでb=cは、やりたいことができません。

void Set(float * c[8][8]){
    for(unsigned int i=0; i<8; ++i) {
      for(unsigned int j=0; j<8; ++j) {
        b[i][j] = c[i][j];
      }
    }
    cout << *(b[1][5]) << endl;
}
于 2012-06-07T04:36:35.930 に答える