0

どうすれば次のことができますか?

double layer1[][3] = {
    {0.1,0.1,0.8},
    {0.1,0.1,0.8},
    {0.1,0.1,0.8},
    {0.1,0.1,0.8}
};
double layer2[][5] = {
    {0.1,0.1,0.1,0.1,0.8}
};
double *upper[] = {layer1, layer2};

さまざまなアイデアを試した後、以下を読みました。無駄に。 ジャグ配列は C/C++ に存在しますか?

私はそれを理解しています(私は願っています)

double **upper[] = {layer1, layer2};

私が望むものに似ていますが、レイヤーがポインターの配列ではないため、機能しません。私は意図的にCを使用しています。


私はこれをやめようとしています(これはうまくいきます)。

double l10[] = {0.1,0.1,0.8};
//l11 etc
double *l1[] = {l10,l11,l12,l13};
double l20[] = {0.1,0.1,0.1,0.1,0.8};
double *l2[] = {l20};

double **both[] = {l1, l2};
4

3 に答える 3

3

最新の C では、複合リテラルを呼び出すツールがあり、必要に応じて少なくとも部分的に実現できます。

double (*(layer1[])) = {
  (double[]){0.1,0.1,0.8},
  (double[]){0.1,0.1,0.8},
  (double[]){0.1,0.1,0.8},
  (double[]){0.1,0.1,0.8}
};
double (*(layer2[])) = {
    (double[]){0.1,0.1,0.1,0.1,0.8}
};
double (*(*(upper[]))) = {layer1, layer2};

()型のバインディングのルールを示すために、型に入れました。ただし、このタイプのプログラミングでは、常に自分で配列の境界を覚えておく必要があることに注意してください。

編集:コンストラクト(double[]){ 0.0 }は複合リテラルと呼ばれ、2 番目のバージョンで宣言した一時配列と同じ効果があります。利点は、それらの命名規則を考案する必要がなく、これらの一時変数にアクセスする唯一の方法は、より大きな配列を使用することです。const誤ってポインターを変更しないように、これらすべてに入れておく方がよいかもしれません。

double (*const(layer1[])) = {
  (double[]){0.1,0.1,0.8},
  (double[]){0.1,0.1,0.8},
  (double[]){0.1,0.1,0.8},
  (double[]){0.1,0.1,0.8}
};
double (*const(layer2[])) = {
    (double[]){0.1,0.1,0.1,0.1,0.8}
};
double (*const(*const(upper[]))) = {layer1, layer2};

これにより、コンテンツ (すべて) を変更できますがdoubles、ポインターは変更できません。doublesプログラム全体で自分自身が変わらないことがわかっている場合は、どこでも変更doubledouble constます。

于 2011-01-17T07:48:34.087 に答える
1
struct {
  size_t length;
  size_t stride;
  double *data;
} upper = {
  {
    sizeof(layer1) / sizeof(layer1[0]),
    sizeof(layer1[0]) / sizeof(layer1[0][0]),
    (double *)layer1,
  },
  {
    sizeof(layer2) / sizeof(layer2[0]),
    sizeof(layer2[0]) / sizeof(layer2[0][0]),
    (double *)layer2,
  },
};

int i, j, k;
for (i = 0; i < sizeof(upper) / sizeof(upper[0]); i++) {
  for (j = 0; j < upper[i].length; j++) {
    for (k = 0; i < upper[i].stride; k++)
      printf(" %d" + !k, upper[i].data[upper[i].stride * j + k]);
    printf("\n");
  }
  printf("\n");
}

C の多次元配列は、線形のストレージに行優先でパックされているだけであることを認識しておく必要があります。実際の次元は、コンパイル時の型によってのみ認識されます。実行時にデータ内で見つかる場所はどこにもありません。

于 2011-01-17T07:42:00.493 に答える
0

Layer1とLayer2は、ジャグ配列の定義によると、ポインターの配列です。理由はありません

double ** upper[] = {layer1, layer2}

動作しません。そうでない場合は、エラーメッセージを投稿してください。

唯一の問題は、配列がポインタに減衰することです。それが問題になる場合は、C99を使用して、すでに述べたスレッドでこの投稿を読む必要があります。

于 2011-01-17T07:26:47.553 に答える