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;
}
英語の識別子を使用することをお勧めします。ちょうどofftopicノート。そして、より多くのオントロジー:テストケースを持つことができますか? http://sscce.org/ – Griwes
'Celda'クラスのデストラクタ、コピーコンストラクタ、代入演算子を投稿できますか? – hmjd
この状態でsegfaultが発生するには、不正な 'this'ポインタが必要です。クラッシュした時点で「これ」が意味をなさないかどうか確認できますか? – Arkadiy