Ошибка STATUS_ACCESS_VIOLATION 2D матрицы

#c #exception #parallel-processing

#c #исключение #параллельная обработка

Вопрос:

У меня проблема с моим банкоматом кода, и я не уверен, в чем проблема, поскольку я получаю исключение нарушения доступа к статусу, когда я манипулирую массивом в функции startFire. Я почти уверен, что не происходит ошибок, выходящих за пределы массива, но, возможно, я этого не вижу: / или это ошибка указателя / ссылки, которую я не вижу. Надеюсь, другая пара глаз сможет взглянуть.

Вот мой код:

 #include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

using namespace std;

string cfile, ccommand;
int cnum1,cnum2,cnum3,cnum4,cx;
//bool fired = false;
bool flag = true;
const double h = .2;

/*
 * 
 */

void printMatrix(double **x, int n)
{
    int size = n;
    for(int i=0; i<size; i  )
    {
        for(int j=0; j<size; j  )
        {
            std:: cout << x[i][j] << " " ;
        }
        std:: cout << std::endl;
    }


}


void readFile(string file,double **x, int n)
{
    const char* filename = file.c_str();
    std::ifstream inFile(filename);

    int size = n;

    if(!inFile)
    {
        cout<<endl<<"Failed to open file " << filename;
    }

    for(int i=0; i<size; i  )
    {
        for(int j=0; j<size; j  )
        {
            inFile >> x[i][j];
        }
    }
}

void startFire(double **x, int n, int it)
{
    int size = n;
    int iteration = it;

    /* Initialize 2D Array */
    double **matrix;

    matrix = new double*[n];
    for(int i = 0; i<n; i  )
        matrix[i] = new double[n];

    for(int j=0; j<n; j  )
        for(int i=0; i<n;i  )
            matrix[i][j] = 0;

    for()

    for(int iter=1; iter<=iteration; iter  )
    {
        cout<<"Iteration #: "<<iter<<endl;
        for(int i=1; i<size;   i)
        {
            for(int j=1; j<size;   j)
            {
                matrix[i][j] = .25 *(x[i-1][j] x[i 1][j] x[i][j-1] x[i][j 1]);

            }
        }
        printMatrix(matrix,size);
    }
}



void GetCommandLineArguments(int argc, char **argv,string amp;file, int amp;n, int amp;k, int amp;m, int amp;i)
{
    if(argc = 6)
    {
        cfile = argv[1];
        cnum1 = atoi(argv[2]);
        cnum2 = atoi(argv[3]);
        cnum3 = atoi(argv[4]);
        cnum4 = atoi(argv[5]);
    }
    file = cfile;
    n = cnum1;
    k = cnum2;
    m = cnum3;
    i = cnum4;

}



int main(int argc, char** argv) {

    int k;  //Factor of n
    int m;  //Innner matrix size
    int i;  //Iteration
    int n;  //Matrix Size
    string file;
    int input;


    /*Takes in the initial cmd line values*/
    GetCommandLineArguments(argc, argv, file, n, k, m, i);


    /* Initialize 2D Array */
    double **matrix;

    matrix = new double*[n];
    for(int i = 0; i<n; i  )
        matrix[i] = new double[n];

    for(int j=0; j<n; j  )
        for(int i=0; i<n;i  )
            matrix[i][j] = 0;


    /*Reads a file with numbers to make matrix*/
    readFile(file,matrix,n);

    /*Prints array displaying a matrix*/
    printMatrix(matrix,n);



    /*To call the fire command that will access the middle matrix*/
    while(flag != false)
    {
        cout<<endl
        <<"MENU:n"
        <<"1 - Start Fire.n"
        <<"2 - Stop Fire.n"
        <<"3 - QUIT.n"
        <<" Enter your choice and press return: ";
        cin >> input;

        switch(input)
        {
            case 1:
                cout<<"Starting fire.n";
                startFire(matrix, n,i);
                //fired = true;

                break;
            case 2:
                cout<<"Stop fire.n";
                //fired = false;
                break;
            case 3:
                cout<<"Ending program.n";
                flag = false;
                break;
            default:
                cout<<"Not a valid choice.n";
                cout<<"Choose again.n";
                cin>>input;
                break;
        }
    }




    return 0;
}
  

Мой файл ввода, называемый sample.input, принимает следующие числа

 20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
200.0 
200.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
200.0 
200.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
20.0 
  

Вот ошибка, которую я получаю через строку cmd.

http://i53.tinypic.com/2qu4078.jpg

Ответ №1:

Вы обращаетесь к массиву, размер которого не соответствует выделенному:

 matrix[i][j] = .25 *(x[i-1][j] x[i 1][j] x[i][j-1] x[i][j 1]);
  

Для операций ядра вам действительно следует выделить матрицы на одну большую для каждого ребра (всего 2) и либо обнулить, либо скопировать значения ребер (в зависимости от вашей операции с матрицей). Вам нужно будет скорректировать свои индексы, чтобы учесть это смещение.

(В качестве альтернативы, вы можете ограничить свои индексы, чтобы они всегда находились внутри матрицы.)

Ответ №2:

 for(int i=1; i<size;   i)
{
    for(int j=1; j<size;   j)
    {
        matrix[i][j] = .25 *(x[i-1][j] x[i 1][j] x[i][j-1] x[i][j 1]);

    }
}
  

обратите внимание на часть

 x[i][j 1]
  

на самой последней итерации, т.е. i = size-1, j = size-1, которая выйдет за пределы матрицы