2013-02-11 40 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

相關問題