2010-12-14 64 views
0

我是新來的C++編程,這可能是一個微不足道的問題,但我需要在一個類中構造一個可變大小的數組,並將文本文件數據傳輸到它,見下文。這裏HISTORYFile >> ClusterCoord[i];似乎採取的信息很好,但是當我試圖讓通過訪問信息在主程序中,在類中初始化一個動態存儲器陣列

cout << CoordClassExample.ClusterCoord[1] << "\n"; 

我得到一個總線錯誤。如果可以的話請幫忙!

class CoordClass{ 
public: 
    int Entries; 
    double * ClusterCoord; 
    void set_valuesCoord(ifstream &HISTORYFile,int MolAtomNum, int MolNum); 
}; 

void CoordClass::set_valuesCoord(ifstream& HISTORYFile,int MolAtomNum, int MolNum) { 
    Entries=MolAtomNum*MolNum; 
    double *ClusterCoord = new double [Entries]; 

    for (int i=0;i<Entries;i++) { 
     HISTORYFile.ignore(1000,'\n');  
      HISTORYFile >> ClusterCoord[i]; 
     cout << ClusterCoord[i] << "\n"; 
      HISTORYFile.ignore(1000,'\n'); 
    } 
} 
+1

如果你是新的C++,請[收拾好C++的書(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)並通讀它。你應該使用'std :: vector '而不是原始數組;我已經可以在'set_valuesCoord()'函數中看到內存泄漏。 – 2010-12-14 18:17:29

+0

你的代碼有很多錯誤。請參考書籍鏈接@In silico給你。 – 2010-12-14 18:19:14

+0

是的,也許我應該試着重新編寫一個我在飛行中用fortran編寫的程序。即使你可以給我什麼搜索,這將是有益的。也許突出內存泄漏線。 – 2010-12-14 18:24:03

回答

1

你必須在set_valuesCoord()功能的泄漏,如果你調用該函數兩次,除非你的地方釋放資源。這不是問題,但它的一個的問題。使用std::vector<>

class CoordClass { 
    // ... 
    std::vector<double> ClusterCoord; // instead of double *ClusterCoord 
    // ... 
}; 

可能是什麼問題是你不檢查是否double正確解析。如果沒有,那麼你正在訪問未初始化的內存,並導致未定義的行爲。

void CoordClass::set_valuesCoord(...) 
{ 
    // ... 
    double cluster_coord = 0; 
    if(HISTORYFile >> cluster_coord) 
     ClusterCoord.push_back(cluster_coord); 
    else 
     std::cerr << "Error parsing cluster coord.\n"; 
    // ... 
} 
+0

感謝您的提示。雙重definately做了解析正確,我已經運行這只是預先固定數組的大小。 – 2010-12-14 18:39:43

+0

在函數中分配動態數組大小有什麼根本性的錯誤嗎? – 2010-12-14 18:41:44

+0

好吧,我是一個dum dum,對不起因爲浪費你的時間才意識到它應該是:ClusterCoord = new double [Entries]; – 2010-12-14 18:43:59

1

正如表明將不除其他事項外泄漏vector方式練習:

進一步變化將刪除條目,並使用ClusterCoord.size()

class CoordClass{ 
public: 
    int Entries; 
    std::vector<double> ClusterCoord; 
    void set_valuesCoord(ifstream &HISTORYFile,int MolAtomNum, int MolNum); 
}; 

void CoordClass::set_valuesCoord(ifstream& HISTORYFile,int MolAtomNum, int MolNum) { 
    Entries=MolAtomNum*MolNum; 
    ClusterCoord.resize(Entries); 

    for (int i=0;i<Entries;i++) { 
     HISTORYFile.ignore(1000,'\n');  
      HISTORYFile >> ClusterCoord[i]; 
     cout << ClusterCoord[i] << "\n"; 
      HISTORYFile.ignore(1000,'\n'); 
    } 
} 
+0

這是比以前更好的答案,因爲它預先調整了向量的大小(+1)。所以,避免了前面例子中對內存分配和複製的懲罰。除了內存泄漏之外,如果在類的析構函數中沒有刪除ClusterCoord,我不會看到總線錯誤的原因。令人驚訝的是我沒有看到這個答覆。任何接受者。謝謝 – cppcoder 2011-09-05 23:31:54