2011-12-15 12 views
1

プロジェクトを実行するとこのエラーが繰り返されます。問題がどこにあるか分かりません。私はそれが私が再び使用されるいくつかの空きメモリについて知っている、または非へのNULLポインタまたはアクセスがメモリを存在するが、実際に私はすべてのポインタをチェックし、彼らは彼らがすることが必要として宣言されています。ここで このエラーが発生しました。「ハッシュ関数の0x009437bdで処理されない例外:0xC0000005:0x00000001のアクセス違反」

はコードです:

#include <iostream> 
using namespace std ; 

typedef struct ND { 
    int ID; 
    char* Name; 
    char* Address; 
    int Age; 
    double GPA; 
    ND * next; 
} NODE; 

class HF { 
private : 
    int count; 
    int size ; 
    int prime; 
    int a ,b; 
    NODE ** HT; 
public: 
    HF(); 
    HF (int n , int p , int a, int b); 
    ~ HF(); 
    int findindex(int key); 
    bool insert (int ID,char* Name,char* Address,int Age,double GPA); 
    bool retrieve (int & ID,char* & Name,char* & Address,int & Age,double & GPA); 
    bool remove(int key); 
    double GetLoadFactor(); 
}; 

HF :: HF() 
{ 
    size = 100; 
    prime = 997; 
    a = 23 ; 
    b = 88; 
    count =0; 
    HT = new NODE* [size]; 
    for (int i=0; i< size ; i++) 
     HT[i] = NULL; 
    } 

HF :: HF (int n , int p , int a, int b) 
{ 
    size = n; 
    prime = p; 
    a = a; 
    b = b; 
    count = 0; 
    HT = new NODE* [size]; 
    for (int i=0; i< size ; i++) 
     HT[i] = NULL; 
} 

HF :: ~ HF() 
{ 
    NODE *p; 
    for (int i=0 ; i<size ; i++) 
    { 
     while (HT[i] != NULL) 
     { 
      p = HT[i]; 
      HT[i] = HT[i] -> next ; 
       delete p; 
     } 
    } 
    delete [] HT ; 
} 

int HF :: findindex(int key) 
{ 
    int index ; 
    index = (((a*(key)+b) % prime) % size) ; 
    index = index % size ; 
    return index; 
} 

bool HF :: insert (int ID,char* Name,char* Address,int Age,double GPA) 
{ 
    int i ; 
    NODE * n; 
    n = new NODE; 
    n -> ID = ID; 
    n -> Address = Address; 
    n -> Name = Name; 
    n -> Age = Age; 
    n -> GPA = GPA; 
    n -> next = NULL; 
    i = findindex(ID); 
    if (HT[i] == NULL) 
    { 
     HT[i] = n; 
    } 
    else 
    { 
     n -> next = HT[i]; 
     HT[i] = n; 
    } 
    count ++ ; 
    return true; 
} 

    bool HF ::retrieve (int & key,char* & Name,char * &Address,int & Age,double & GPA) 
    { 
    int i ; 
    NODE *p; 
    i = findindex(key); 
    if (HT[i] == NULL) 
    { 
     return false; 
    } 
    else 
    { 
     p = HT[i]; 
     if (HT[i] -> ID == key)// here is the break point 
     { 
      key = p-> ID ; 
      Name = p-> Name ; 
      Address = p-> Address ; 
      Age = p-> Age; 
      GPA = p-> GPA ; 
      return true ; 
     } 
     while (p != NULL) 
     { 
      if (p-> ID == key) 
      { 
       key = p-> ID ; 
       Name = p-> Name ; 
       Address = p-> Address ; 
       Age = p-> Age; 
       GPA = p-> GPA ; 
       return true ; 
      } 
      else 
       p = p-> next ; 
      } 
    } 
    return false; 
    } 
bool HF :: remove (int key) 
{ 

int i ; 
NODE *p1 , *p2; 
i = findindex(key); 
if (HT[i] == NULL) 
{ 
    return false; 
} 

else 
{ 
    p1 =p2 = HT[i]; 
    if(HT[i] -> ID == key) 
    { 
     HT[i] = HT[i] -> next; 
     delete p2; 
     return true; 
    } 


    while (p2 != NULL) 
    { 
     if (p2 -> ID == key) 
     { 
      p1 -> next = p2 -> next ; 
      delete p2; 

      count --; 
      return true; 
     } 
     else 
     { 

      p1 =p2; 
      p2 = p2 -> next; 

     } 
    } 


} 
return false; 

} 

double HF :: GetLoadFactor() 
{ 
double L; 

L = (double) count/size ; 
return L; 
} 

int main() 
{ 
double L; 
int x,age; 
char * name , *address; 
double GPA; 
HF UHashFunc1; 
HF UHashFunc2(11 , 7 , 3 , 0); 

UHashFunc1.insert(6 , "Ahmed" , "Jenin" , 20 , 3.5); 
UHashFunc1.insert(1 , "Sarah" , "Jenin" , 18 , 3.2); 
UHashFunc1.insert(40 , "Mohammad" , "Tolkrem", 19 , 3.0); 
UHashFunc1.insert(2 , "Ala'a" , "Jerusalem", 19 , 2.6); 
UHashFunc1.insert(41 , "Raghad" , "Tolkrem", 19 , 1.6); 
UHashFunc1.insert(80 , "Mohammad" , "Jenin", 22 , 2.7); 
UHashFunc1.insert(83 , "Murad" , "Nablus", 18 , 3.7); 
UHashFunc1.insert(44 , "Reem" , "Hebron", 19 , 2.9); 
UHashFunc1.insert(50 , "Wajde" , "Qalqelya", 20, 1.7); 
UHashFunc1.insert(42 , "Belal" , "Hebron", 20 , 3.4); 
UHashFunc1.insert(3 , "Ahmed" , "Nablus", 21 , 1.9); 
UHashFunc1.insert(84 , "Haitham" , "Nablus", 21 , 3.1); 


cout <<"enter the ID you want to retrieve"<<endl; 
cin>>x; 
if(UHashFunc1.retrieve(x,name,address,age,GPA)) 
{ 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 
} 
else 
    cout<<"NOT FOUND"<<endl; 

cout <<"enter the ID you want to retrieve"<<endl; 
cin>>x; 
if(UHashFunc1.retrieve(x,name,address,age,GPA)) 
{ 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 
} 
else 
    cout<<"NOT FOUND"<<endl; 
L=UHashFunc1.GetLoadFactor(); 
cout << "The current load factor is : " << L <<endl; 
UHashFunc1.remove(42); 
L=UHashFunc1.GetLoadFactor(); 
cout << "The current load factor is : " << L <<endl; 
x=84; 
UHashFunc1.retrieve(x,name,address,age,GPA); 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 
x=1; 
UHashFunc1.retrieve(x,name,address,age,GPA); 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 
x=50; 
UHashFunc1.retrieve(x,name,address,age,GPA); 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 

cout << "Enter The ID you want to remove"<<endl; 
cin>>x; 
if(UHashFunc1.remove(x)) 
    { 
    L=UHashFunc1.GetLoadFactor(); 
    cout << "The current load factor after removing a record is : " << L <<endl; 
} 
else 
{ cout << "NOT Exist"<<endl;} 

if(UHashFunc1.remove(2)) 
    { 
    L=UHashFunc1.GetLoadFactor(); 
    cout << "The current load factor after removing a record is : " << L <<endl; 
} 
else 
{ cout << "NOT Exist"<<endl;} 
UHashFunc1.insert(45 , "Amjad" , "Nablus" , 19 , 2.0); 
L=UHashFunc1.GetLoadFactor(); 
cout << "The current load factor after adding a record is : " << L <<endl; 
if(UHashFunc1.remove(80)) 
    { 
    L=UHashFunc1.GetLoadFactor(); 
    cout << "The current load factor after removing the record is : " << L <<endl; 
} 
else 
{ cout << "NOT Exist"<<endl;} 
if(UHashFunc1.remove(50)) 
    { 
    L=UHashFunc1.GetLoadFactor(); 
    cout << "The current load factor after removing the record is : " << L <<endl; 
} 
else 
{ cout << "NOT Exist"<<endl;} 

    UHashFunc2.insert(5 , "Ahmed" , "Jenin" , 20 , 3.5); 
UHashFunc2.insert(1 , "Sarah" , "Jenin" , 18 , 3.2); 
UHashFunc2.insert(9 , "Mohammad" , "Tolkrem", 19 , 3.0); 
UHashFunc2.insert(2 , "Ala'a" , "Jerusalem", 19 , 2.6); 
UHashFunc2.insert(8 , "Raghad" , "Tolkrem", 19 , 1.6); 
UHashFunc2.insert(100 , "Mohammad" , "Jenin", 22 , 2.7); 
UHashFunc2.insert(50 , "Murad" , "Nablus", 18 , 3.7); 
UHashFunc2.insert(23 , "Reem" , "Hebron", 19 , 2.9); 
UHashFunc2.insert(40 , "Wajde" , "Qalqelya", 20, 1.7); 
UHashFunc2.insert(17 , "Belal" , "Hebron", 20 , 3.4); 
UHashFunc2.insert(3 , "Ahmed" , "Nablus", 21 , 1.9); 
UHashFunc2.insert(7 , "Haitham" , "Nablus", 21 , 3.1); 

cout <<"enter the ID you want to retrieve from the 2nd Func"<<endl; 
cin>>x; 
if(UHashFunc2.retrieve(x,name,address,age,GPA)) 
{ 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 
} 
else 
    cout<<"NOT FOUND"<<endl; 

cout <<"enter the ID you want to retrieve from the 2nd Func"<<endl; 
cin>>x; 
if(UHashFunc2.retrieve(x,name,address,age,GPA)) 
{ 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 
} 
else 
    cout<<"NOT FOUND"<<endl; 

L=UHashFunc2.GetLoadFactor(); 
cout << "The current load factor is : " << L <<endl; 
UHashFunc2.remove(2); 
L=UHashFunc2.GetLoadFactor(); 
cout << "The current load factor is : " << L <<endl; 
x=5; 
UHashFunc2.retrieve(x,name,address,age,GPA); 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 
x=1; 
UHashFunc2.retrieve(x,name,address,age,GPA); 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 
x=50; 
UHashFunc2.retrieve(x,name,address,age,GPA); 
cout << "ID:"<<x<<endl; 
cout << "Name:"<<name<<endl; 
cout << "Address:"<<address<<endl; 
cout << "Age:"<<age<<endl; 
cout << "GPA:"<<GPA<<endl; 

cout << "Enter The ID you want to remove from the 2nd Func"<<endl; 
cin>>x; 
if(UHashFunc2.remove(x)) 
    { 
    L=UHashFunc2.GetLoadFactor(); 
    cout << "The current load factor after removing a record is : " << L <<endl; 
} 
else 
{ cout << "NOT Exist"<<endl;} 

if(UHashFunc2.remove(2)) 
    { 
    L=UHashFunc2.GetLoadFactor(); 
    cout << "The current load factor after removing a record is : " << L <<endl; 
} 
else 
{ cout << "NOT Exist"<<endl;} 
UHashFunc2.insert(45 , "Amjad" , "Nablus" , 19 , 2.0); 
L=UHashFunc2.GetLoadFactor(); 
cout << "The current load factor after adding a record is : " << L <<endl; 
if(UHashFunc2.remove(100)) 
    { 
    L=UHashFunc2.GetLoadFactor(); 
    cout << "The current load factor after removing the record is : " << L <<endl; 
} 
else 
{ cout << "NOT Exist"<<endl;} 
if(UHashFunc2.remove(9)) 
    { 
    L=UHashFunc2.GetLoadFactor(); 
    cout << "The current load factor after removing the record is : " << L <<endl; 
} 
else 
{ cout << "NOT Exist"<<endl;} 


cin>>x; 



return 0; 
} 

が無い建物エラーがちょうどこれらのものがあるとき、ハッシュfunctions.exeで0x009437bdにブレークポイント

初回例外: 0xc0000005で:アクセス違反読み取り場所0x00000001。処理されていない ハッシュ関数の0x009437bdでの例外:0xC0000005:アクセス 違反の読み取り場所0x00000001。ファンクション違反で 0x009437bdに最初の例外が発生しました。0xC0000005: の場所0x00000001を読み取るアクセス違反。スレッドのWin32のスレッド '(0x1e40)は、コード-1073741510(0xc000013a)と を終了しました。プログラム '[788] Hash functions.exe:Native'がコード-1073741510(0xc000013a)で終了しました。

+4

コンパイラのすべての警告を有効にする方法、コンパイラがデバッグ可能な実行可能ファイル内にデバッグ情報を生成する方法、およびデバッガの使用方法を学習する必要があります。 –

+0

NULLを指し示すものにアクセスしようとすると、Isntアクセス違反がスローされますか? – mslot

+0

@mslot - または、マップされていないものを読み書きするときは、 – Flexo

答えて

3

私はあなたが遭遇したエラーを簡単に再現することができました。 あなたはこのようなパラメータを取るHFのコンストラクタがあります:あなたは、パラメータ名のAとBのを見ることができるように

HF :: HF (int n , int p , int a, int b) 
{ 
    size = n; 
    prime = p; 
    a = a; 
    b = b; 

は正確にメンバ変数の名前と同じです。したがって、HF :: aとHF :: bは決して値を割り当てられません。したがって、それらは常に初期化されず、ゴミを含んでいます。したがって、あなたは無作為の値だけを得ることになり、あなたがしようとしているハッシュのすべてが結果として機能しません。

パラメータ名を別のものに変更する必要があります。私はそれを行うたら

HF :: HF (int n , int p , int A, int B) 
{ 
    size = n; 
    prime = p; 
    a = A; 
    b = B; 

が、それはすべてのメモリ破損エラーを解決し、それがうまく完了するまで実行されます。おそらく、大文字と言います。

+0

これの結果として私が与えることもできるヒントは、メンバ変数に常に一意の名前を付けることです。例えば、メンバ変数に 'm'や 'm_'のような接頭辞を付けるのが標準的な方法です。したがって、あなたは 'mCount'、 'mA'、 'mB'のようにHFのメンバー変数に名前を付けることができます。それはあなたのすべての頭痛を非常に早く解決しました。 –

+0

それから私の答えに投票してください。ありがとう。 –

0

これは確かにNULLポインタです。メモリ位置1(0x00000001)にアクセスしています。これは、NULL(別名0x00000000)から1バイトオフセットです。あなたが投稿したコードは冗長で少し混乱しています。ポインタにアクセスしている行番号がなければ、正確にどこにNULLポインタにアクセスしているのかは分かりません。

+0

私はその時点で 'HT [i]'がNULLでないことを確認します。 –

+0

また、whileポインタ(p2!= NULL)が与えられているかどうかはわかりませんが、NULLポインタのように聞こえます。デバッガでこれらのポインタ値を調べる必要があります。 –

2

std::vector<T>std::stringstd::shared_ptr<T>std::unique_ptr<T>を使用する方法を学び、適用します。それでも問題が解決しない場合は、元に戻ります。

+0

@ビーガン:私は効果が好きです。 – Puppy

+1

私は@ DeadMGのコメントが失礼かもしれないと知っていますが、彼は一種の権利です。 'std :: vector'、' std :: string'、 'std :: shared_ptr'、' std :: unique_ptr'を使うことで、コードを単純化し、より頑強にすることができます。 C++プログラマー。 – Drahakar

関連する問題