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,因此您传递给的指针是指向临时值的指针。

您在这里有两个选择,您可以使用指针:

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 回答