2013-03-02 59 views
0

好吧,我正試圖實現一個簡單的2D矩陣類。這是什麼樣子至今:實現動態矩陣類的錯誤

template <typename Type> 
class dyMatrix { 
    private: 
     Type *mat; 

     int width, height; 
     int length; 

    public: 
     dyMatrix (int _width, int _height) 
      : width(_width), height(_height), mat(0) 
     { 
      length = width * height; 
      mat = new Type[length]; 
     }; 

     // --- 

     int getWidth() { 
      return width; 
     }; 

     int getHeight() { 
      return height; 
     }; 

     int getLength() { 
      return length; 
     } 

     // --- 

     Type& operator() (int i, int j) { 
      return mat[j * width + i]; 
     }; 

     Type& operator() (int i) { 
      return mat[i]; 
     }; 

     // --- 

     ~dyMatrix() { 
      delete[] mat; 
     }; 
}; 

爲了測試它,並與靜態多維數組比較,我寫了下面的代碼片段:

#include <iostream> 
using namespace std; 

/* matrix class goes here */ 

struct Coord { 
    int x, y; 

    Coord() 
     : x(0), y(0) 
    {}; 

    Coord (int _x, int _y) 
     : x(_x), y(_y) 
    {}; 

    void print() { 
     cout << x << ", " << y; 
    }; 
}; 

int main() { 
    dyMatrix<Coord> adabo(5, 7); 
    Coord inakos[5][7]; 

    int i = 5, j = 0; 

    adabo(i, j) = *(new Coord(i, j)); 
    inakos[i][j] = *(new Coord(i, j)); 

    inakos[i][j].print(); 
    adabo(i, j).print(); 

    return 0; 
} 

「Adabo」和「Inakos 「是任意選擇的名字。執行後,inakos將打印其內容,但程序在adabo可以執行任何操作之前崩潰。另一個有趣的事情是,如果我分別給出ij以外的值5和0,分別如5和1,它可以正常工作。

我不知道確切的數字是什麼工作,哪些使得程序出現故障,我只知道這裏存在不規則性。我可能做錯了什麼?我是C++的業餘愛好者,所以我可能會或不會在任何結構中濫用某些東西。

如果有人也有時間,我非常想知道在我的矩陣類中是否有任何其他通知錯誤。任何不可能與問題有關的事情,但卻是一個謬論。

我也用下面的main()來測試它,但是它在inakos打印[5] [1]中的內容後仍然崩潰。也許它不必與dyMatrix,但鬆散實施的Coord?

int main() { 
    dyMatrix<Coord> adabo(5, 7); 
    Coord inakos[5][7]; 

    for (int i = 0; i < adabo.getHeight(); i++) { 
     for (int j = 0; j < adabo.getWidth(); j++) { 
      adabo(i, j) = *(new Coord(i, j)); 
      inakos[i][j] = *(new Coord(i, j)); 

      inakos[i][j].print(); 
      cout << "; "; 
     } 
     cout << "\n\n"; 
    } 
    cout << "\n\n\n"; 

    Coord temp; 
    for (int i = 0; i < 7; i++) { 
     for (int j = 0; j < 5; j++) { 
      temp = adabo(i, j); 

      temp.print(); 
      cout << "; "; 
     } 
     cout << "\n\n"; 
    } 

    return 0; 
} 

編輯:它與Coord沒有關係。剛剛用一個int型的dyMatrix和一個int型靜態矩陣進行了測試,然後在[5] [0]之後崩潰了。

+0

我鼓勵你花時間學習使用調試器。這將爲自己付出很多。 – NPE 2013-03-02 15:18:01

+0

@NPE是的,我可以試試。 Code :: Blocks的調試器不是很直觀,但是,嘿它在那裏。 – Mutoh 2013-03-02 15:21:57

回答

1

在第一個示例中,您聲明inakos[5][7],因此索引範圍爲0到4,0到6之間。因此,inakos[5][0]inakos[5][1]可能會崩潰。

在你的第二個例子中,你再次聲明inakos[5][7],但你讓第一個索引循環從0到6.再次inakos[i][j]可以崩潰。一種修復方法是切換索引(即更改爲i<adabo.getWidth()j<adabo.getHeight())。

+0

嗯,的確如此。第一,列第二。 – Mutoh 2013-03-02 15:23:55