Witek Witek - 2 months ago 27
C++ Question

C++ 2D array and boost random number generator

I put in my program two loops - one fills 2D array with one value N0, and next loop is generating random number. And my program does not work when I have loop for array. I get "Unhandled exception... (parameters: 0x00000003)". But without first loop it works correctly. Thanks for help.

#include <iostream>
#include <vector>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
using namespace std;


const double czas = 1E9;

int main()
{
//Declaration of variables
const int k = 20;
const int L = 30;
double N0 = 7.9E9;
int t,i,j, WalkerAmount;
double excitation, ExcitationAmount;

double slab[30][600];

//Random number generator
boost::random::mt19937 gen;
boost::random::uniform_int_distribution<> numberGenerator(1, 4);



//Filling slab with excitation
for (int i = 0; i <= L; i++)
{
for (int j = 0; j <= k*L; j++) { slab[i][j] = N0; }
}

//Time loop
for (t = 0; t < czas; t++) {
WalkerAmount = 0;
ExcitationAmount = 0;

for (int i = 0; i <= L; i++)
{
for (int j = 0; j <= k*L; j++)
{
int r = numberGenerator(gen);
cout << r << endl;
}
}
}
system("pause");
return 0;
}

Answer

Arrays in C++ are indexed from 0 to n-1 where n is the capacity of the array. Then, the code following code is wrong.

int main()
{
    //Declaration of variables
    const int k = 20;
    const int L = 30;   
    double N0 = 7.9E9;

    double slab[30][600];

    // [...]

    for (int i = 0; i <= L; i++)
    {
        for (int j = 0; j <= k*L; j++) { slab[i][j] = N0; }
    }
}

When you initialize your array, you always go one steep too far. As you consider the case where i == L and j == k*L you reach an area in the memory that out of your array.

The loop you want to execute is

for (int i = 0; i < L; i++)
    for (int j = 0; j < k*L; j++)
        // Initialize