2014-11-04 91 views
0

我正在用链创建一个简单的哈希程序,编译器没有给我任何错误,但程序本身在执行时崩溃。程序将搜索函数所花费的时间差记录到一个文件中(数据集是1000个随机生成的数字哈希的x%)(我不知道它是否与逻辑本身有关,或者是某种技术错误,我使用pocketcpp作为,err..ide)。代码:从所述未初始化startArray [I],其中仅包含NULL指针执行简单哈希程序时运行时错误

#include <fstream> 
#include <iostream> 
#include <chrono> 
#include <ctime> 
#include <cstdlib> 
#include <cstring> 

/*Code by RN:121503 * Date: 04-11-2014*/ 

using namespace std; 

typedef struct storagelist 
{ 
    int value; 
    storagelist *next; 
}; 

storagelist *startArray[100]; 

int simplehash(int n) 
{ 
    int index; 
    index=n%1000; 
    return index; 
} 

int simplesearch(int n) 
{ 
    int index; 
    int i=0; 
    storagelist *tempPointer=startArray[n]->next; 
    index=simplehash(n); 
    //Base address of array, i.e. array index will be null. 
    if(startArray[n]->next==NULL) 
    { 
     //cout<<"No such key/value exist \n"; 
    } 
    else 
    { 
     do 
     { 
      if(tempPointer->value==n) 
      { 
       //cout<<"Key found \n"; 
       break; 
      } 
      else 
      { 
       tempPointer=tempPointer->next; 
      } 
     }while(tempPointer->next!=NULL); 
    } 
} 

void simpleinsert(int n) 
{ 
    int tempIndex; 
    storagelist *tempPointer; 
    storagelist *tempPointertwo; 
    tempIndex=simplehash(n); 
    if(startArray[tempIndex]->next==NULL) 
    { 
     tempPointer=new storagelist; 
     tempPointer->value=n; 
     startArray[tempIndex]->next=tempPointer; 
     tempPointer->next=NULL; 
    } 
    else 
    { 
     while(tempPointer->next!=NULL) 
     { 
      tempPointer=tempPointer->next; 
     } 
     tempPointertwo=new storagelist; 
     tempPointertwo->value=n; 
     tempPointer->next=tempPointertwo; 
     tempPointertwo->next=NULL; 
    } 
} 

int main() 
{ 
    int tempRandom; 
    int loopHelp; 
    int randomBackup[100]; 
    //File handeling 
    ofstream myfile; 
    //Clock elements 
    clock_t start, end; 
    //Populating starting indices with NULL 
    for(int i=0;i<100;i++) 
    { 
     startArray[i]->next=NULL; 
    } 
    /*generating 1000 random numbers between 1 to 10000 
    and storing+hashing them*/ 
    srand (time(NULL)); 
    for (int k=0;k<100;k++) 
    { 
     tempRandom=rand()%10000+1; 
     randomBackup[k]=tempRandom; 
     simpleinsert(tempRandom); 
    } 
    //following are search cases with time logging 
    for(int m=1;m<10;m++) 
    { 
     switch(m) 
     { 
     case 1: 
      myfile.open ("10per.txt"); 
      for(loopHelp=0;loopHelp<(100*(10/100));loopHelp++) 
      { 
       start = clock(); 
       simplesearch(randomBackup[loopHelp]); 
       end = clock(); 
       myfile<<loopHelp<<"\t"<<(double)(end-start)<<"\n"; 
      } 
      break; 
     case 2: 
      myfile.open ("20per.txt"); 
      for(loopHelp=0;loopHelp<(100*(20/100));loopHelp++) 
      { 
       start = clock(); 
       simplesearch(randomBackup[loopHelp]); 
       end = clock(); 
       myfile<<loopHelp<<"\t"<<(double)(end-start)<<"\n"; 
      } 
      break; 
     case 3: 
      myfile.open ("30per.txt"); 
      for(loopHelp=0;loopHelp<(100*(30/100));loopHelp++) 
      { 
       start = clock(); 
       simplesearch(randomBackup[loopHelp]); 
       end = clock(); 
       myfile<<loopHelp<<"\t"<<(double)(end-start)<<"\n"; 
      } 
      break; 
     case 4: 
      myfile.open ("40per.txt"); 
      for(loopHelp=0;loopHelp<(100*(40/100));loopHelp++) 
      { 
       start = clock(); 
       simplesearch(randomBackup[loopHelp]); 
       end = clock(); 
       myfile<<loopHelp<<"\t"<<(double)(end-start)<<"\n"; 
      } 
      break; 
     case 5: 
      myfile.open ("50per.txt"); 
      for(loopHelp=0;loopHelp<(100*(50/100));loopHelp++) 
      { 
       start = clock(); 
       simplesearch(randomBackup[loopHelp]); 
       end = clock(); 
       myfile<<loopHelp<<"\t"<<(double)(end-start)<<"\n"; 
      } 
      break; 
     case 6: 
      myfile.open ("60per.txt"); 
      for(loopHelp=0;loopHelp<(100*(60/100));loopHelp++) 
      { 
       start = clock(); 
       simplesearch(randomBackup[loopHelp]); 
       end = clock(); 
       myfile<<loopHelp<<"\t"<<(double)(end-start)<<"\n"; 
      } 
      break; 
     } 
    } 
    return 0; 
} 
+0

如果这是Visual Studio中启用调试异常的访问冲突断裂,当它停止行走了调用堆栈,以你的代码。 – drescherjm 2014-11-04 14:03:58

+0

更正了这一点,至于ide,我实际上是使用记事本+ + gcc和minigw – Siddharth 2014-11-04 14:08:27

+0

你应该首先研究分配'startArray'指向的指针的代码。 – molbdnilo 2014-11-04 14:21:33

回答

1
storagelist *startArray[1000]; 
[...] 
int main() 
{ 
[...] 
    for(inti=0;i<1000;i++) 
    { 
     startArray[i]->next=NULL; 

运行时错误的结果。我猜NULL指针在运行时没有'next'成员,这会导致Segmentation错误。

所以,你错过了什么是创建实际的项目,并将其存储在您的startArray:

for(inti=0;i<1000;i++) 
    { 
     storagelist *item = new storagelist; 
     item->value = 0; 
     item->next = NULL; 
     //startArray[i]->next=NULL; 
+0

这就是问题所在,我只是将指针数组当成了对象数组。我想知道为什么没有编译器给我任何错误或如此。谢谢! – Siddharth 2014-11-04 15:54:22