0
class BPP
{
    unsigned            n;                  /* nº de instancias */
    vector<string>      nombre_instancia;   /* nombre de la instancia*/

コンストラクターでは、次の場合にセグメンテーション違反(コアダンプ)が発生します。

file1.open(fich1);
    if (file1.is_open()){
        file1 >> (unsigned &) n;
        for (unsigned k = 0 ; k < n ; ++k){
            getline(file1, nombre_instancia[k]); #gives the segmentation fault

fich1の最初の2行は次のとおりです。

10
 P_0
4

3 に答える 3

2

を介して要素にアクセスする前に、ベクトルに要素を入力する必要がありますvector::operator[]。次のコードでは、ベクトルは空です。

for (unsigned k = 0 ; k < n ; ++k){
    getline(file1, nombre_instancia[k]);

したがって、への呼び出しnombre_instancia[k]は範囲外です。vector::resize()要素を作成するために使用できます。

if (file >> n) // Ensure 'n' correctly assigned.
{
    nombre_instancia.resize(n);
    for (unsigned k = 0 ; k < n ; ++k){
        getline(file1, nombre_instancia[k]);
}

vector::push_back()別の方法は、要素の数を事前に知らずに使用することです。

于 2012-10-22T19:48:26.860 に答える
2

nombre_instanciaのサイズを元のサイズの0を超えて変更していないと思います。代わりにこれを試してください。

  file1 >>  n;
  nombre_instancia.resize(n);     
    for (unsigned k = 0 ; k < n ; ++k){
        getline(file1, nombre_instancia[k]); #gives the segmentation fault
于 2012-10-22T19:48:54.890 に答える
0

getlineを使用する場合は、ベクトル内のスペースを予約する必要があると思います。nombre_instancia [k]を与えることにより、プログラムは初期化されていないベクトルを持ちます。予約を使用するか、push_back(null)

于 2012-10-22T19:51:54.923 に答える