2013-09-24 61 views
0

這是我的一段代碼,它解決了微分方程組。'無效使用void表達式'傳遞函數的參數

Vector dydx(Neq); 
void DiffEq(Vector x, Vector &dydx) 
{ 
    dydx(0) = x(1); 
    dydx(1) = -x(0); 
} 

double MidPoint(int n, Vector x) 
{ 
    double h=H/n; 
    Matrix z(n+1,n+1); 
    z.fillRow(0,x); 
    DiffEq(x, dydx); 
    z.fillRow(1,AddVec(x, dydx*h));  //Error: Invalid use of void expression 
    for (int j=1; j<n; j++) 
    { 
     DiffEq(z.getRow(j), dydx); 
     z.fillRow(j+1, AddVec(z.getRow(j-1), dydx*h*2));  //error: void value not ignored as it ought to be 
    } 
    DiffEq(z.getRow(n), dydx); 
    return 0.5*AddVec(z.getRow(n), z.getRow(n-1), dydx*h);  //Error: Invalid use of void expression 
} 

類Vector和Matrix是自定義的。這是矢量

class Vector 
{ 
    public: 
    Vector(size_t size): vSize(size), vData(size){} 
    int getSize(){return vSize;} 
    double& operator()(size_t i){return vData[i];} 
    double operator()(size_t i) const {return vData[i];} 
    void operator+(double d)      // These only overload the Vector + int operator 
    { 
     for (int i=0; i<vSize; i++) {vData[i]=vData[i]+d;} 
    } 

    void operator*(double d) 
    { 
     for (int i=0; i<vSize; i++) {vData[i]=vData[i]*d;} 
    } 


    size_t vSize; 
    vector<double> vData; 
}; 

與函數

Vector AddVec(Vector v1, Vector v2) 
{ 
    Vector totVec(v1.getSize()); 
    for (int i=0; i<v1.getSize(); i++) {totVec(i) = v1(i) + v2(i);} 
    return totVec; 
} 

而對於3個載體相同的功能。

現在我意識到錯誤意味着我將void傳遞給某個函數,但我無法弄清楚事情出錯的地方。當我嘗試編寫測試程序時,一切似乎都正常。

+0

對不起,dydx是一個全球性的載體。我會編輯它。還有一些常數我會忽略,以便使問題縮短一些。 – RobVerheyen

+0

我不這麼認爲。 Vector的聲明位於包含的頭文件中。我應該可能顯示我的完整代碼: http://pastebin.com/sanKD2XJ < - 主程序 http://pastebin.com/qdZeVRQg < - containers.h – RobVerheyen

+1

問題是你的'operator +'和'operator *'return' void' –

回答

3

你的運營商返回void

void operator+(double d)      // These only overload the Vector + int 
{ 
    for (int i=0; i<vSize; i++) {vData[i]=vData[i]+d;} 
} 

void operator*(double d) 
{ 
    for (int i=0; i<vSize; i++) {vData[i]=vData[i]*d;} 
} 

所以,當你調用AddVec(x, dydx*h)它調用AddVec(x, void)

+1

當然這是非常明顯的。謝謝! – RobVerheyen

+0

它通常總是:) – 2013-09-24 18:05:32

1

你超載不行爲類似於以往的運營商,不這樣做! !這樣做會給C++一個不好的名字。

 void operator*(double d) 
      { 
      for (int i=0; i<vSize; i++) {vData[i]=vData[i]*d;} 
      } 

這不返回任何東西,所以你不能這樣使用它:

z.fillRow(1,AddVec(x, dydx*h)); 
         ^^^^^^ 

operator*應該返回一個新的對象,而不是修改其左操作數。如果你想修改左操作數,使用operator*=,但你仍應該返回一些東西。

 Vector& operator*=(double d) 
     { 
      for (int i=0; i<vSize; i++) 
       vData[i] *= d; 
      return *this; 
     } 

     Vector operator*(double d) 
     { 
      Vector v(*this); 
      v *= d; 
      return v; 
     } 

operator*將作爲非成員更好,並應通過引用採取它的參數:

 Vector operator*(const Vector& v, double d) 
     { 
      Vector v2(v); 
      v2 *= d; 
      return v2; 
     } 
相關問題