9

私は自分のプログラムにそのような行列を持っています:

double m[3][4] = 
    {
        {2, 4, 5, 7},
        {4, 5, 1, 12},
        {9, 12, 13, -4}
    };

double**そして、それを型にキャストしたいと思います。

すでに simpledouble** a = (double**)m;を試しましたが、機能しません (値を読み取ろうとすると、「アクセス違反読み取り場所 0x00000000.」が表示されます。これは、アドレスから読み取ろうとしていることを意味しますNULL

私はほとんどうまくいく解決策を見つけました:

double *b = &m[0][0];
double **c = &b;

field を読み取ると機能しc[0][any] ますが、 field から値を読み取ろうとすると、同じ NULL アドレス読み取りの問題が発生しますc[1][0]

double m[3][4]配列を typeにキャストする適切な方法は何double**ですか?

編集:それは不可能だとあなたは言います。そこで、問題を少し変更します。2 次元 double 配列をパラメーターとして関数に渡すにはどうすればよいですか? 私の関数にはプロトタイプがあります:

void calculate(double **matrix, int n); //where matrix size is always n by n+1 

そして、動的に割り当てられた配列でうまく機能しています。それを機能させる唯一の方法は、新しい動的配列を割り当て、元の静的配列を要素ごとにコピーすることだとは思いません...

4

6 に答える 6

14

できません。

この表記double**は、ポインターの配列を参照します。ポインターの配列はありません。double の配列の配列があります。

于 2013-04-02T14:16:18.560 に答える
9

配列をキャストすることはできません。次のようなものを作成する必要があります。

double m[3][4] = 
    {
        {2, 4, 5, 7},
        {4, 5, 1, 12},
        {9, 12, 13, -4}
    };

double *marray[3] = {m[0],m[1],m[2]};
calculate(marray,3);

または、ループを使用できます。

const size_t n = 3;
double *marray[n];
for (size_t i=0; i!=n; ++i) {
    marray[i] = m[i];
}
calculate(marray,n);
于 2013-04-02T14:20:24.650 に答える
2

初期化に常に配列 (ポインターなし) を使用しており、計算関数でポインターを使用することを回避できる場合は、テンプレートによるサイズ推定を使用する次のオプションを検討してください。

template<int m, int n>
void doubleFunc(double (&mat)[m][n])
{
    for (auto i = 0; i < m; i++)
    {
        for (auto j = 0; j < n; j++)
        {
            std::cout << mat[i][j] << std::endl;
        }
    }
}

クイックテスト中に機能しました。

double m[3][4] = 
{
    {2, 4, 5, 7},
    {4, 5, 1, 12},
    {9, 12, 13, -4}
};

doubleFunc(m);
于 2013-04-02T14:59:58.413 に答える
0

可変長配列が C++ 標準に含まれるまでは、次の選択肢があります。

  • コンパイラが拡張機能として可変長配列をサポートしている場合は、 などの関数宣言でそれらを渡すことができますvoid foo(std::size_t n, double a[][n+1])。コンパイラは、特別な構文nを使用または必要とするパラメーター宣言の前に渡す必要がある可能性が高いことに注意してください。n
  • 関数でa を渡し、double *インデックス演算を手動で行うことができます。void foo(std::size_t n, double *a) { … a[row*(n+1) + column] … }
  • アクセサー関数でインデックス演算を行うことにより、可変長配列を実装するクラスを作成できます。
  • nへのポインターにスペースを割り当てdouble、それらのポインターに配列の各行へのポインターを入力し、スペースのアドレスを渡すことができます。
于 2013-04-02T14:54:31.760 に答える
0

関数パラメーターとして 2 次元配列を渡すことができます。

void calculate(double matrix[][y], int n);

于 2013-04-02T14:32:29.433 に答える