2

ファイルからデータを読み取るための次の D コードがあります。

int foo (SomeStruct[] somestruct_array)
{
  // get file_handle...
  for (uint i = 0; i < 1000; i++) {
    file_handle.readf ("%e %e %e %e %e %e\n",
            &(somestruct_array[i].pos_x), &(somestruct_array[i].pos_y),
            &(somestruct_array[i].pos_z), &(somestruct_array[i].vel_x),
            &(somestruct_array[i].vel_y), &(somestruct_array[i].vel_z));
  }
  return 0;
}

ご覧のとおり、列は長く静かになり、繰り返し続けますsomestruct_array[i]。大したことではありませんが、それを短くして書いてみました:

int foo (SomeStruct[] somestruct_array)
{
  // get file_handle...
  for (uint i = 0; i < 1000; i++) {
    auto elem = somestruct_array[i];
    file_handle.readf ("%e %e %e %e %e %e\n",
            &(elem.pos_x), &(elem.pos_y),
            &(elem.pos_z), &(elem.vel_x),
            &(elem.vel_y), &(elem.vel_z));
  }
  return 0;
}

これにより、すべての要素メンバーが になりnanます。

だから:配列要素への参照を取得することは可能ですか?

4

2 に答える 2

2

問題は、配列要素elemコピーreadfであるため、渡すポインターが一時値へのポインターであることです。

ここには 2 つのオプションがあり、ポインターを使用できます。

for (uint i = 0; i < 1000; i++) {
    auto elem = &somestruct_array[i];
    file_handle.readf ("%e %e %e %e %e %e\n",
        &(elem.pos_x), &(elem.pos_y),
        &(elem.pos_z), &(elem.vel_x),
        &(elem.vel_y), &(elem.vel_z));
}

または、参照によって配列を反復処理できます。

foreach (ref elem; somestruct_array[0..1000]) {
    file_handle.readf ("%e %e %e %e %e %e\n",
        &(elem.pos_x), &(elem.pos_y),
        &(elem.pos_z), &(elem.vel_x),
        &(elem.vel_y), &(elem.vel_z));
}

配列の長さが 1000 要素の場合は、次のように記述できます。

foreach (ref elem; somestruct_array)
于 2013-02-11T19:28:55.763 に答える
0

あなたが欲しい:

for (uint i = 0; i < 1000; i++) {
auto elem = &somestruct_array[i];
file_handle.readf ("%e %e %e %e %e %e\n",
        &(elem->pos_x), &(elem->pos_y),
        &(elem->pos_z), &(elem->vel_x),
        &(elem->vel_y), &(elem->vel_z));
}

このようにして、ローカルの自動変数への参照ではなく、実際の配列要素の参照を処理します。

于 2013-02-11T18:59:17.147 に答える