Я получаю эту ошибку «Необработанное исключение в 0x009437bd в Hash functions.exe: 0xC0000005: Место чтения нарушения доступа 0x00000001» - PullRequest
1 голос
/ 16 декабря 2011

Я получаю эту ошибку снова и снова, когда я запускаю свой проект. Не знаю, где проблема. Я знаю, что это какая-то свободная память, которую я использовал снова, или нулевой указатель или доступ к несуществующей памяти, но на самом деле я проверил все указатели, и они объявлены такими, какими они должны быть.

Вот код:

#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;
 }

Нет ошибок здания, только эти, когда точка останова

Исключение первого шанса в 0x009437bd в Hash functions.exe: 0xC0000005: Место чтения нарушения доступа 0x00000001. Неизвестное исключение в 0x009437bd в хэш-функции.exe: 0xC0000005: доступ нарушение чтения местоположения 0x00000001. Исключение первого шанса в 0x009437bd в Hash functions.exe: 0xC0000005: чтение о нарушении доступа расположение 0x00000001. Поток 'Win32 Thread' (0x1e40) вышел с кодом -1073741510 (0xc000013a). Программа '[788] Хэш functions.exe: Нативный 'вышел с кодом -1073741510 (0xc000013a).

Ответы [ 3 ]

4 голосов
/ 16 декабря 2011

Мне удалось легко воспроизвести ошибку, с которой вы столкнулись.У вас есть конструктор для HF, который принимает такие параметры:

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

Как видите, имена параметров a и b точно совпадают с именами переменных-членов.Следовательно, HF :: a и HF :: b никогда не назначаются значения.Следовательно они всегда неинициализированы и содержат мусор.Следовательно, вы получаете только случайные значения, и все то, что вы пытаетесь сделать, не работает в результате.

Вам следует изменить имена параметров на что-то другое.Скажите, возможно, заглавными буквами:

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

Как только я это сделаю, он решает все ошибки повреждения памяти и прекрасно доходит до завершения.

2 голосов
/ 16 декабря 2011

Научитесь использовать, а затем применять, std::vector<T>, std::string, std::shared_ptr<T>, std::unique_ptr<T>. Тогда возвращайся, если проблема не исчезнет.

0 голосов
/ 16 декабря 2011

Это, безусловно, пустой указатель.Вы получаете доступ к ячейке памяти 1 (0x00000001), которая смещена на 1 байт от NULL (она также равна 0x00000000).Размещенный вами код является многословным и немного беспорядочным, и без номера строки, к которой вы обращаетесь к указателю, трудно сказать, где именно вы обращаетесь к пустому указателю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...