2013-05-19 74 views
0

我是新來的c + +指針,我有一個從指針獲取值的問題。獲取指針值

我有一個指針verticesPosBegin指向用於保存頂點位置的數組的開頭。每個頂點都存儲爲3分量浮點矢量(xyz)。

我需要從中獲取每個頂點並訪問它的x,y,z值。

我做到了以下方式:

NxVec3* positions = (NxVec3*)data.verticesPosBegin; 

for(int i=0;i<nrVertices;i++) 
{ 

    NxVec3* p1 = (NxVec3*)positions; 
    printf("Vertex coordinates x: %d, y: %d, z: %d\n", p1->x, p1->y, p1->z); 
    positions++; 
} 

(NxVec3被juat通過我使用物理引擎中定義的類型,它基本上是形式(浮動的x,浮子y的結構,浮動ž ))

但是,這並沒有得到我座標的值,但我想,因爲它們代表了非常大的數字。任何幫助將不勝感激。

+3

你蘇重新演員是必要的? 'p1 - > [x,y,z]'的類型是什麼? – 0x499602D2

+0

另外,這是C++人,學會使用'std :: cout'。不得不說;) – mwerschy

+0

@ 0x499602D2:根據代碼後的句子,他們是浮動的。 –

回答

6

按照你的說法,p1->xp1->yp1->z是鍵入float,對嗎?如果是這樣,你傳遞一個不正確的格式字符串到printf。 %d標誌用於整數。您可能需要%f標誌。你得到的巨大數字不是地址,而是浮點值,轉換爲雙精度值,然後將它們的位模式解釋爲整數,雖然它在技術上是未定義的行爲。

http://en.cppreference.com/w/cpp/io/c/fprintf

如果使用COUT相反,你不必擔心這樣的事情,因爲它是類型安全的。

P.S.

停止鑄造。它只會隱藏編譯時間,並將它們轉換爲運行時錯誤,這會顯着更糟糕。

0

如果我得到了NxVec3正確的,這裏的定義是,NxVec3,因此,根據頭文件,下面應該工作:

NxVec3* positions = (NxVec3*)data.verticesPosBegin; 

for(int i = 0;i < nrVertices; ++i) 
{ 
    float *p = positions[i].get(); 
    cout << p[0] << ' ' << p[1] << ' ' << p[2] << endl; 
} 
+0

謝謝,它工作。問題確實是printf函數中的類型。 – user2399378

1
  • 如果你真的想使用指針(我建議只實踐的目的)和
  • 如果data.verticesPosBegin點NX3的連續塊漂浮
  • 如果NxVec3是類/結構只三個數據成員float x, y, z;

下面應該工作:

NxVec3 *positions = (NxVec3*)data.verticesPosBegin, *p(positions); 

for(unsigned int i=0;i<nrVertices;i++) 
{ 
    cout << "Vertex coordinates "; 
    cout << "x: " << p->x << ", "; 
    cout << "y: " << p->y << ", "; 
    cout << "z: " << p->z << endl; 
    ++p; 
} 
+1

評估前三個浮標是否全部打印錯誤。 'p1'被設置爲剛剛增加的'位置'指針的值,它在循環中不會重置,並且只在每次迭代時遞增。因此,在這個答案中,開頭陳述是錯誤的*(儘管代碼會起作用,但僅僅是因爲它隱含地迴避了真正的問題:使用'%d'打印一個uncast'float')。 – WhozCraig

+0

我的懶散閱讀 - Upvote爲你。我會編輯這個。 (儘管我不會稱之爲迴避,但用正確的版本替換錯誤的輸出是一個正確的解決方案,無論使用更正後的printf()還是cout)。 – Pixelchemist