2016-04-01 5 views
1

Ich habe versucht, ein Programm zu schreiben, wo ich eine Binärdatei lesen muss, die rund 30 Millionen lange Werte hat und wir herausfinden müssen die Modi habe ich erfolgreich mit einer kleineren Anzahl von Werten gemacht, aber wenn ich mit der Datei versuche, gibt es mir immer den Fehler-exc_bad_access (code = 1 Adresse = 0x100500000), ich versuche es in Xcode auf meinem MAC und in C++ implementieren . Der Code ist wie unten, kann mir jemand helfen? Versuch C++ auf Xcode auf Mac- ERROR-exc_bad_access (code = 1 Adresse = 0x100500000)

#include <iostream> 
#include<fstream> 
#include<string> 
#include<vector> 

using namespace std; 

void mode(long data[], long size, long &num_modes, long modeNums[], long &maxFrequency); 

int main() 
{ 




long *data,*modeNums, size; 

ifstream binaryin("TestData.bin", ios::binary); 
binaryin.read(reinterpret_cast<char *>(&size), 4); 



data = new(nothrow)long[size]; 




if(!data) 
{ cout<<"Memory allocation error for data array, program will terminate\n"; 
    system("pause"); 
    exit(0); } 

binaryin.read(reinterpret_cast<char *>(data),size*sizeof(long)); 

//cout<<"SIZE "<<size<<endl; 

long num_modes;long maxFrequency; 
modeNums=new(nothrow)long[size]; 

size=3000000; 

    mode(data,size,num_modes,modeNums,maxFrequency); 

    /* for(int i=0;i<20;i++) 
    cout<<"data[i]"<<data[i]<<endl;*/ 



    // cout<<"maxFrequency= "<<maxFrequency; 
    // cout<<"\nnum_modes= "<<num_modes<<endl; 

     // for(int i=0;i<num_modes;i++) 
     // cout<<"modeNums[]= "<<modeNums[i]<<endl; 

} 


void mode(long data[], long size, long &num_modes, long modeNums[], long &maxFrequency) 
{ 
    // size=300000; 

// cout<<"SIZE "<<size<<endl; 

int cnt=0,val=0;// long *arr,*arr1; 

vector<long> arr; 
vector<long> arr1; 

//arr=new(nothrow)long[size/2]; 
//arr1=new(nothrow)long[size/2]; 

// cout<<"INSIDE THE FUNCTION\n"; 
//cout<<"SIZE "<<size<<endl; 
long k; 
//cout<<"SIZE "<<size<<endl; 

cout<<"\nstarting for loop\n"; 

for(int i=0;i<size;i++) 
{ cout<<"Inside for loop\n"; 
    cnt=0; k=(size-1); 

    long num=data[i]; 

    int flag=0; 

    int temp=val; 

    while(temp!=0) 
    { cout<<"inside while loop\n"; 
     if(arr[temp]==num) 
     { flag=1;} 
     temp--; 
    } 

    if(flag==0){ 
     int count=0; 
     for(int j=0;j<(size/2);j++) 
     {// cout<<"Inside for which is inside while\n"; 
      cout<<"data[j] "<<data[j]<<" "<<"data[k] "<<data[k]<<endl; 
      cout<<"COUNT "<<count++<<endl; 
      if(num==data[j] && num==data[k]) 
      { cnt+=2; } 

      else if(num==data[j]||num==data[k]) 
      { cnt++; } 
      k--; 
     } 
     arr.push_back(num);arr1.push_back(cnt); 
     val++; 
    } 
    else 
     flag=2; 
} 

cout<<"\nend of for loop\n"; 
// for(int i=0;i<val;i++) 
// cout<<"NUM "<<arr[val]<<"Mode "<<arr1[val]<<endl; 

maxFrequency=0; 
for(int i=0;i<val;i++) 
{ 
    if(arr1[i]>maxFrequency) 
     maxFrequency=arr1[i]; 
} 

num_modes=0; int value=0; 
for(int i=0;i<val;i++) 
{ 
    if(arr1[i]==maxFrequency) 
    { num_modes++; 
    modeNums[value]=arr[i]; 
     value++; } 
} 

/* int value=0; 
for(int i=0;i<val;i++) 
{ 
    if(maxFrequency==arr1[i]) 
    { modeNums[value]=arr[i]; 
     value++;} 
} */ 

// for(int i=0;i<val;i++) 
// cout<<"Value "<<arr[i]<<"     Mode "<<arr1[i]<<endl; 

// cout<<"maxFrequency= "<<maxFrequency<<endl; 
// cout<<"\nnum_modes= "<<num_modes<<endl; 
cout<<"\nend of function\n"; 

} 

enter image description here

Antwort

1

Diese Zeile:

size=3000000; 

bedeutet, dass Sie Ihre Arrays mit einer bestimmten Größe zuweisen (was auch immer Sie aus der Datei gelesen), dann sagen Sie Ihre mode Funktion, dass diese Arrays sind eigentlich 3000000 longs in der Größe. Dies könnte zu einem Pufferüberlauf führen.

Ich kann keinen Grund sehen, dass diese Linie da ist.

Auch wenn Sie new(nothrow) verwenden, sollten Sie den Rückgabewert überprüfen.

+0

Diese Zeile wurde von mir hinzugefügt, um zu prüfen, ob es funktioniert. Das Programm läuft, wenn ich den Wert der Größe bis 390000 initialisiere, aber wenn ich 400000 gebe, gibt es mir diesen Fehler. Auch wenn ich den Wert der Größe in der main() nicht initialisiere, wird es als Null genommen und 0 wird an die Funktion übergeben. –

+0

Wie finde ich die Größe des Arrays nach dem Lesen aller Werte in Daten [] ?? Dann denke ich, dass ich diesen Wert weitergeben kann. –

+0

@zO_ok Sie lesen die Größe in 'size' kurz vor dem Zuordnen des Arrays, aber dann überschreiben Sie' size' aus irgendeinem Grund. – molbdnilo

Verwandte Themen