2012-03-26 10 views
0
int Celda :: look(int dni) 
{ 
    bool found = false; 
    int i = 0; int pos = -1; 
    //tam_ sometimes have a strange value, but I only 
    while(i < tam_ && !found){ 
     //touch tam_ in the constructor, is the size of Celda 
     if(dni == bloques_[i]){  
      found = true; 
      pos = i; 
     } 
     ++i; 
    } 
    return pos; 
} 

mainでは、ここでコピーしたlookメソッドを使用するotherを呼び出す別のクラスのメソッドを呼び出します。いくつかのケースでは機能しますが、プログラムがセグメンテーション違反を与えるのを止める場合もあります。C++奇妙なセグメンテーションエラー

私はデバッガを使用するとき、tam_値(tam_はint型)を格納するための別の変数を作成しました。そして、その行またはwhileループ(tam_の条件付き)に到達すると、

Celdaのコンストラクタは次のとおりです。

Celda :: Celda(int tamanio) 
{ 
bloques_ = new int[tamanio]; 
bloq_ocupados_ = 0; 
tam_ = tamanio; 
for(int i = 0 ; i < tam_ ; ++i){ 
    bloques_[i] = 0; 
} 

}

Tabla :: Tabla(int numcel, int tambloq) 
{ 
    nceldas_ = numcel; 
    tam_bloque_ = tambloq; 
    tabla_ = new Celda*[nceldas_]; 
    for(int i = 0 ; i < nceldas_ ; ++i){ 
     tabla_[i] = new Celda(tam_bloque_); 
    } 
    ocupadas_ = 0; 
} 

class Celda 
{ 
    private: 
     int* bloques_; 
     int bloq_ocupados_; 
     int tam_; 

そして、 "私は++" はずのは、それが公共のセクション

int Tabla :: busq_lineal(int dni) //si pos_dentro acaba valiendo -1, no se encontró 
{ 
    bool encontrado = false; 
    int pos = hash(dni), comparaciones = 0, pos_dentro, pos_fuera; 
    int tamaniotab = nceldas_ * tabla_[0]->gettam(); 
    while(!encontrado && comparaciones < tamaniotab){ 
     pos_dentro = tabla_[pos]->buscar(dni); 
     if(pos_dentro != -1){ //si lo encuentro... 
      encontrado = true; 
      pos_fuera = pos; 
      comparaciones += pos_dentro + 1; 
     }else if(pos < nceldas_ - 1){ //mientras no nos salgamos de la tabla, avanzamos 
      ++pos; 
      comparaciones += tabla_[0]->gettam(); 
     }else { 
      pos = 0; //si nos salimos, volvemos al principio 
      comparaciones += tabla_[0]->gettam(); 
     } 
    } 
    return comparaciones; 
} 
+0

英語の識別子を使用することをお勧めします。ちょうどofftopicノート。そして、より多くのオントロジー:テストケースを持つことができますか? http://sscce.org/ – Griwes

+0

'Celda'クラスのデストラクタ、コピーコンストラクタ、代入演算子を投稿できますか? – hmjd

+0

この状態でsegfaultが発生するには、不正な 'this'ポインタが必要です。クラッシュした時点で「これ」が意味をなさないかどうか確認できますか? – Arkadiy

答えて

1

エラーは、このラインにおそらくある:

int pos = hash(dni); 

あなたが言ったように、あなたのhash機能だけdni % 199を返します。これは大丈夫ですが、ハッシュテーブルに少なくとも200個のアイテムがある場合にのみ有効です。

+0

ありがとうございますが、私は決してハッシュ法を見ていませんxDDD – freinn

+0

それは起こることができます:D – mfontanini

-2

ダウン?

for(int i = 0 ; i < tam_ ; i++){ 
    bloques_[i] = 0; 
} 
+0

私は++よりも遅いです++、私は++で私のすべてのループを行います少しパフォーマンスを向上させるために – freinn

+3

接頭辞と接尾辞**はありません**ここでの犯人です – chrisaycock

+0

接頭辞(++ i)と接尾辞 – tmpearce