Witam
Mam programik który przechodzi kompilacje elegancko, ale przy uruchomieniu wyskakuje błąd ochrony pamięci.
Program ładuje plik zewnętrzny dane.dat który zawiera liczbę generatorów i przedziały.
Kod programu:
#include <fstream>
#include <iostream>
#include <iomanip>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <omp.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <math.h>
using namespace std;
void show( struct timeval *ti ) {
struct timeval tf;
static struct timeval tl = { 0,0 };
gettimeofday( &tf, NULL );
cout << "- - - - -Od startu programu: - - " << ( tf.tv_sec - ti->tv_sec + ( tf.tv_usec - ti->tv_usec ) * 0.000001 ) << " s - - - " ;
cout << endl;
}
unsigned int generatorCount; // liczba_generatorow
unsigned int rangeCount; // liczba przedziałów
class Range {
private:
float const begin;
float const end;
public:
Range(float begin, float end) :
begin(begin), end(end) {
}
void print() {
cout << "Range: [" << begin << "; " << end << "]" << endl;
}
bool isInRange(double d) {
return d >= begin && d <= end;
}
float getBegin() const {
return begin;
}
float getEnd() const {
return end;
}
};
class GaussianGenerator {
private:
const float mean;
const float stdDev;
const int numberCount;
bool hasNext;
double next;
public:
GaussianGenerator(float average, float variance, int numberCount) :
mean(average), stdDev(sqrt(variance)), numberCount(numberCount) {
this->hasNext = false;
this->next = 0.;
}
~GaussianGenerator() {
}
void print() {
cout << "Generator: " << mean << " " << stdDev << " " << numberCount
<< endl;
}
double getGaussian() {
if (hasNext) {
hasNext = false;
return next * stdDev + mean;
} else {
double u, v, s;
do {
u = ((double) rand() / (double) RAND_MAX) * 2 - 1;
v = ((double) rand() / (double) RAND_MAX) * 2 - 1;
s = u * u + v * v;
} while (s >= 1 || s == 0);
double mul = sqrt(-2.0 * log(s) / s);
next = v * mul;
hasNext = true;
return mean + stdDev * u * mul;
}
}
const int getNumberCount() const {
return numberCount;
}
};
vector<GaussianGenerator*> generatorVector;
vector<Range*> rangeVector;
int* createRangeHits(GaussianGenerator *g, vector<Range*>& rangeVector) {
int* result = new int[rangeVector.size()];
for (unsigned int j = 0; j < rangeVector.size(); j++) {
result[j] = 0;
}
double d;
for (int i = 0; i < g->getNumberCount(); i++) {
d = g->getGaussian();
// cout << "d = " << d << endl;
for (unsigned int j = 0; j < rangeVector.size(); j++) {
if (rangeVector.at(j)->isInRange(d)) {
result[j]++;
}
}
}
return result;
}
int main() {
cout<<"----------------------------------------"<<endl;
cout<<"Start"<<endl;
cout<<"----------------------------------------"<<endl;
struct timeval ti;
gettimeofday( &ti, NULL );
srand(time(NULL));
ifstream inFile("dane.dat");
if (!inFile || !inFile.good()) {
cout << endl << "Invalid input data!";
return 1;
}
else{cout <<"Loading data from file - - > OK!"<<endl;
cout<<"----------------------------------------"<<endl;}
float f1; // srednia, poczatek przedzialu;
float f2; // wariancja, koniec przedzialu;
int numberCount; // numberCount numberCount
inFile >> generatorCount;
for (unsigned int i = 0; i < generatorCount; i++) {
inFile >> f1;
inFile >> f2;
inFile >> numberCount;
GaussianGenerator *g = new GaussianGenerator(f1, f2, numberCount);
generatorVector.push_back(g);
}
for (unsigned int i = 0; i < generatorVector.size(); i++)generatorVector.at(i)->print();
int totalRangeHits[rangeCount];
inFile >> rangeCount;
for (unsigned int i = 0; i < rangeCount; i++) {
inFile >> f1;
inFile >> f2;
Range* r = new Range(f1, f2);
rangeVector.push_back(r);
totalRangeHits[i] = 0;
}
for (unsigned int i = 0; i < rangeVector.size(); i++)rangeVector.at(i)->print();
for (unsigned int i = 0; i < generatorVector.size(); i++) {
generatorVector.at(i);
int* rangeHits = createRangeHits(generatorVector.at(i), rangeVector);
for (unsigned int i = 0; i < rangeCount; i++) {
totalRangeHits[i] += rangeHits[i];
}
}
for (unsigned int i = 0; i < rangeCount; i++) {
cout << (i + 1) << " " << rangeVector.at(i)->getBegin() << " "
<< rangeVector.at(i)->getEnd() << " " << totalRangeHits[i]
<< endl;
}
cout << endl;
show( &ti );
cout << endl;
cout << endl;
cout<<"---------------------------------------------------------------------------------------------"<<endl;
// system("pause");
return 0;
}
Kod dla pliku dane.dat:
30
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
10.0 5.0 1000000
50.0 2.0 1000000
-8.0 1.0 1000000
25
8.881966011250105 11.118033988749895
7.76393202250021 12.23606797749979
6.645898033750315 13.354101966249685
5.52786404500042 14.47213595499958
4.4098300562505255 15.590169943749475
3.2917960675006306 16.70820393249937
1.0557280900008408 18.94427190999916
-1.180339887498949 21.18033988749895
49.292893218813454 50.707106781186546
48.58578643762691 51.41421356237309
47.878679656440355 52.121320343559645
47.17157287525381 52.82842712474619
46.46446609406726 53.53553390593274
45.757359312880716 54.242640687119284
44.34314575050762 55.65685424949238
42.928932188134524 57.071067811865476
-8.5 -7.5
-9.0 -7.0
-9.5 -6.5
-10.0 -6.0
-10.5 -5.5
-11.0 -5.0
-12.0 -4.0
-13.0 -3.0
-1000.0 1000.0
Gdzie jest ewentulany błąd zapisu do pamięci?
Z góry dziękuję za pomoc.