2011-09-10 85 views
1
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
using namespace std; 

int width = 100; 
int height = 100; 

float cam[] = {-1.1,-1.0,1.2}; 
float D[] = {0.2,0.2,-0.2}; 
float U[] = {0.0,1.0,0.0}; 

float* cross(float* v1,float* v2) 
{ 
    float el1[] = {(v1[1]*v2[2]-v1[2]*v2[1]),(v1[2]*v2[0]-v1[0]*v2[2]),(v1[0]*v2[1]-v1[1]*v2[0])}; 
    return el1; 
} 

float* neg3(float* v) 
{ 
    float arr[3]; 
    for(int i=0;i<3;i++) 
    arr[i] = 0.0-(v[i]); 

    return arr; 
} 

/* 

float* cam_space(float* p) 
{ 
    float* e1 = cross(D,U); 
    float* e2 = cross(D,cross(U,D)); 
    float* e3_n = D; 

    float ar[4]; 
    ar[0] = e1[0]*p[0]+e1[1]*p[1]+e1[2]*p[2]; 
    ar[1] = e2[0]*p[0]+e2[1]*p[1]+e2[2]*p[2]; 
    ar[2] = -(e3_n[0]*p[0]+e3_n[1]*p[1]+e3_n[2]*p[2]); 
    ar[3] = p[3]; 
    return ar; 
} 

*/ 
float* translate(float* p,float* v) 
{ 

    float arr1[3]; 
    for(int i=0;i<=2;i++) 
    arr1[i] = p[i] + v[i]; 

    return arr1; 
} 


int main() 
{ 
    float* poi; 
    poi = cam; //undo later 

    float* nc; 
    nc = neg3(cam); 
    cout<<" "<<nc[0]<<" "<<nc[1]<<" "<<nc[2]<<endl; 


    float arbit[3] = {0.1,0.1,0.1}; 

    float* temp1; 
    temp1 = translate(poi,arbit); 
    //float* temp2; 
    //temp2 = cam_space(temp); 

    cout<<" "<<nc[0]<<" "<<nc[1]<<" "<<nc[2]<<endl; 
    cout<<" "<<poi[0]<<" "<<poi[1]<<" "<<poi[2]<<endl; 


    cout<<" "<<temp1[0]<<" "<<temp1[1]<<" "<<temp1[2]<<endl; 
    return 0; 
} 

正如你所看到的,我輸出了兩次nc。但是這兩個值不同。第二次顯示nc,它實際上顯示的值爲temp1,而temp1實際上顯示的是垃圾值。 有什麼幫助嗎?C++指針與數組

+0

您沒有使用STDLIB或標準輸入輸出功能,從而擺脫了頭。同樣在未來您可能想使用cstdlib和cstdio來代替,因爲這裏提到的推理http://stackoverflow.com/questions/2847729/whats-the-main-difference-between-stdlib-h-and-cstdlib-in- 2847753#2847753 此外,如果這些全局變量是全球常數 - 將它們標記爲這樣。 –

+0

其他人都說過(所有人都+1)以及[陣列是邪惡的](http://www.parashift.com/c++-faq-lite/containers.html)。 –

回答

5
float* translate(float* p,float* v) 
{ 

    float arr1[3]; 
    for(int i=0;i<=2;i++) 
    arr1[i] = p[i] + v[i]; 

    return arr1; 
}// arr1 ceases to exist from this point. 

您正在返回局部變量的參考arr1。它駐留在堆棧上,並在函數調用返回時解除分配。但是你持有對它的引用,它會產生垃圾值。而是newnew[] arr1並返回它。當你完成後記得delete[]

+1

Mashesh是對的。您在'translate(float *,float *)'函數的_scope_(花括號)內創建了float [] arr1'變量,因此該變量僅在該函數運行時才存在。之後,您仍然指向同一塊內存,但是'arr1'不再存儲在那裏。有關更多信息,請參閱http://en.wikipedia.org/wiki/Scope_(programming)。 – wchargin

+2

你在用什麼編譯器,@Arpit? 'g ++'會幫助你: '函數'float * cross(float *,float *)': 警告:返回的局部變量'el1'的地址, 等 –

1

translate()返回一個本地指針(從數組類型轉換而來)。那麼temp1是指什麼,在函數translate()返回後不存在。

neg3()一樣也是如此。

如果您使用C++,則std::vector<float>將解決所有此類問題。

你可以這樣寫:

std::vector<float> translate(const std::vector<float> & p, const std::vector<float> & v) 
{ 
    std::vector<float> vf(3); 
    for(int i=0;i <3;i++) 
     vf[i] = p[i] + v[i]; 
    return vf; //semantically, it returns a copy of the local object. 
} 

同樣,徘徊無論你使用float[3]使用std::vector。並且不要使用全局變量。

1

您正在返回指向左側和右側局部變量的指針。這些變量在函數體的末尾超出範圍,結果是未定義的行爲。

處理陣列修飾功能的好方法是將數組作爲參數傳遞:

void modify_me(float arr[]) // or `modify_me(float * arr)`, same thing 
{ 
    arr[0] = 0.5; 
    arr[1] = -2.25; 
} 

int main() 
{ 
    float myarray[2]; 
    modify_me(myarray); // now myarray[0] == 0.5, etc. 

    // ... 
} 

既然你用C是++,你甚至可以使用模板魔法:

template <unsigned int N> 
void modify_me(float (&arr)[N]) 
{ 
    static_assert(N == 3, "You're doing it wrong!"); // C++11 feature 
    arr[0] = /* ... */ 
} 

現在,如果您嘗試使用任何不是大小爲3的自動數組的方式調用此函數,則會出現編譯時錯誤。

1

而不是返回指向局部變量的指針,您應該返回值。

考慮一下:

struct V3 { float data[3]; } 

V3 neg3(V3 v) 
{ 
    for(int i=0;i<3;i++) 
     v.data[i] = -v.data[i]; 
    return v; 
}