我有这个 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
。
那么:是否可以获取对数组元素的引用?
最佳答案
问题是 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)
关于arrays - 如何获取 D 中数组元素的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14818697/