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');
    }
}
4

2 に答える 2

1

set_valuesCoord()どこかでリソースを解放しない限り、関数を2回呼び出すと、関数にリークが発生します。それは問題ではありませんが、問題です。を使用します。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";
    // ...
}
于 2010-12-14T18:26:21.567 に答える
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');
    }
}
于 2010-12-14T19:34:40.450 に答える