С ++ странная ошибка сегментации - PullRequest
0 голосов
/ 26 марта 2012
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;
}

В основном я вызываю метод другого класса, который вызывает другой, который использует скопированный здесь метод look.В некоторых случаях это работает, но в других случаях программа перестает выдавать ошибку сегментации.

Когда я использую отладчик, я создал другую переменную для хранения значения tam_ (tam_ is int type), и когда яиногда достигают этой строки или цикла 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;
}

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Скорее всего, ошибка в этой строке:

int pos = hash(dni);

Как вы сказали, ваша hash функция просто возвращает dni % 199.Это будет работать нормально, только если у вас есть как минимум 200 элементов в вашей хэш-таблице.

0 голосов
/ 26 марта 2012

Разве это не должно быть "i ++"?

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