2016-06-15 75 views
0

我需要做兩個向量的點積然後顯示結果。從我所瞭解到的情況來看,我能用C++做的最好的是返回結果向量的地址(指針)。我目前做的是與此代碼:在另一個函數中使用返回的數組指針

// Dot product. 
double * dot(double u[3], double v[3]) { 
    double result[3]; 
    result[0] = u[0] * v[0]; 
    result[1] = u[1] * v[1]; 
    result[2] = u[2] * v[2]; 
    return result; 

然後我需要打印的結果,所以我有一個接受指針的另一個功能:

void pvec(double * ptr) { 
    cout << "[" << *(ptr + 0) <<", " << *(ptr + 1) << ", " << *(ptr + 2) << "]\n"; 
} 

這是行不通的。結果值都是垃圾。

我該如何做這項工作?來自python,我真的覺得無法通過函數傳遞數組就像沒有手臂或腿,我不能設法玩指針遊戲的權利。

+2

函數'dot'返回一個指向本地對象的指針。解除引用時,行爲是不確定的。 –

+2

此外,**不玩遊戲**。請用C++方式做事。 –

+1

您可以將結果設爲靜態的'static double result [3];'或將其分配爲動態的(更好的)'double * result = new double [3];'如果不需要'delete [] ptr'則釋放它。請參閱https://ideone.com/FU8L0I進行現場演示。 – kwarnke

回答

1

最簡單的方式,在我看來,是改變dot原型如下所示:

void dot(double u[3], double v[3], double result[3]) 

和調整代碼的其餘部分給它。

+2

不。最簡單的方法是使用適當的容器類型,比如'std :: vector'。 –

+0

@NickyC我懇求不同。容器增加了許多開銷和複雜性。特別是對於新手來說。 – GMichael

+1

否。標準庫容器遵循零開銷原則。將容器當作普通對象是很容易的,有Python背景。當它涉及複雜性時,包括但不限於從數組到指針的衰減,從函數參數中的數組到指針的調整,對象/數組的生存期和懸空指針,數組大小跟蹤等等,學習更加困難。 –