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";
}
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. –
Wie finde ich die Größe des Arrays nach dem Lesen aller Werte in Daten [] ?? Dann denke ich, dass ich diesen Wert weitergeben kann. –
@zO_ok Sie lesen die Größe in 'size' kurz vor dem Zuordnen des Arrays, aber dann überschreiben Sie' size' aus irgendeinem Grund. – molbdnilo