2013-02-11 61 views
2

我有用于从文件中读取数据该d码:如何获得对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

所以:是否有可能获得对数组元素的引用?

回答

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) 
+1

AFAIK“alias elem = somestruct_array [i]”也应该起作用,不是吗? – 2013-02-11 19:35:26

+0

作品! @МихаилСтрашун:这似乎并不奏效。编译器说, '别名elem不能别名表达式somestruct_array [i]' – steffen 2013-02-11 19:51:59

+0

@steffen是的,我检查了http://dlang.org/declaration.html#AliasDeclaration,它似乎只接受现在的类型。奇怪的是,我记得使用它来表达,并认为它是一个整洁的功能。是一个整洁的错误最有可能:) – 2013-02-11 20:11:28

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)); 
} 

你处理实际数组元素的参考,而不是参考当地的自动变量这种方式。

+0

然后我看到这个问题是'D'。我现在要等一下,看看这个答案是否是远程正确的。 – PQuinn 2013-02-11 19:02:24

+0

呵呵......我之前试过,因为我是从C++中猜出它的。它不起作用。编译错误是'Error:expression expected,not'>''in each line,' - >'出现。 – steffen 2013-02-11 19:05:09