Нарушение доступа - PullRequest
       10

Нарушение доступа

0 голосов
/ 04 марта 2009

Приветствую всех, нужна помощь в устранении этого исключения.

При отладке моей скомпилированной программы в Microsoft Visual C ++ 6.0 я получаю следующее:

Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\tsappcmp.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcrt.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\advapi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\rpcrt4.dll', no matching symbolic information found.
First-chance exception in SA.exe: 0xC0000005: Access Violation.

Вот соответствующие скриншоты из отладчика.

Отображение ostream.h:

http://img237.imageshack.us/my.php?image=accessviolation.png'>http://img237.imageshack.us/img237/1116/accessviolation.th.png' border = '0' />

Отображение main.ccp:

http://img509.imageshack.us/my.php?image=accessviolation2.png'>http://img509.imageshack.us/img509/3619/accessviolation2.th.png' border = '0' />

Я пытался найти в своем коде нулевые указатели, а также безуспешно пытался игнорировать исключение. Вот три основных компонента моего сценария:

main.ccp

#include <iostream>

#include "SA.h" 

using namespace std; // For the use of text generation in application


int main() 
{
    SimAnneal Go;

    cout << "Quadratic Function" << endl
         << "Solving method: Simulated Annealing" << endl;

    cout << "\nSelect desired Initial Temperature:" << endl
         << "> ";
    cin >> Go.T_initial;

    cout << "\nSelect desired number of Temperature Iterations:" << endl
         << "> ";
    cin >> Go.N_max;

    cout << "\nSelect desired number of step Iterations:" << endl
         << "> ";
    cin >> Go.N_step;

    cout << "\nSelect desired Absolute Temperature:" << endl
         << "> ";
    cin >> Go.T_abs;

    Go.LoadCities();

    Go.Initialize();

    Go.SA();

    system ("PAUSE");

    return 0;
}

SA.h

    #ifndef SA_H
    #define SA_H


class SimAnneal {

        double S_order [15];        
        double S_trial [15];        

        int SwapNum1;
        int SwapNum2;

        double CityArray [15][15];

        double E_initial;
        double E_current;

        double T;

        void Metropolis (double, int, int);
        void Next_State (double, int);
        double Schedule (double, int);
        double ObjFunction (double CityOrder []);

        void EquateArray ();
        void OrderInt ();
        void OrderTrial ();
        void OrderList (double array[]);

        void WriteResults (double, double, double, double, double);

      public:
        int N_step;
        int N_max; 
        double T_initial;
        double T_abs;

        void SA ();
        void Initialize ();
        void LoadCities ();
    };


    double Random_Number_Generator(double nHigh, double nLow);


#endif  

SA.cpp

#include <math.h>
#include <iostream>
#include <fstream>          
#include <iterator>
#include <iomanip>
#include <time.h>           
#include <cstdlib>          

#include "SA.h"

using namespace std;


void SimAnneal::SA() 
{
    T = T_initial;
    E_current = E_initial;


        for ( int N_temperatures = 1 ; N_temperatures <= N_max ; N_temperatures++ )
        {
            Metropolis(T, N_step, N_temperatures);
            T = Schedule(T, N_temperatures);

        if (T <= T_abs)
            break;
        }

    cout << "\nResults:" << endl
    << "Distance> " << E_current << endl
    << "Temperature> " << T << endl;

    OrderList(S_order);
}

void SimAnneal::Metropolis(double T_current, int N_Steps, int N_temperatures)
{
    for ( int i=1; i <= N_step; i++ )           
        Next_State(T_current, N_temperatures);      
}

void SimAnneal::Next_State (double T_current, int i) 
{
    OrderTrial();

    double EXP = 2.718281828;

    double E_t = ObjFunction(S_trial);
    double E_c = ObjFunction(S_order);

    double deltaE = E_t - E_c;                              
        if ( deltaE <= 0 )
        {    
        EquateArray();
        E_current = E_t;
    }
        else
        {
        double R = Random_Number_Generator(1,0);
        double Ratio = 1-(float)i/(float)N_max;         
        double ctrl_pram = pow(EXP, (-deltaE / T_current));

            if (R < ctrl_pram*Ratio)                        
            {   
            EquateArray();
            E_current = E_t;
        }
        else 
            E_current = E_c;
    }
}

double SimAnneal::Schedule (double Temp, int i) 
{
    double CoolingRate = 0.9999;

    return Temp *= CoolingRate; 
}

double SimAnneal::ObjFunction (double CityOrder []) 
{
    int a, b;

    double distance = 0;

    for (int i = 0; i < 15 - 1; i++)
    {
        a =  CityOrder [i];
        b =  CityOrder [i + 1];

        distance += CityArray [a][b];
    }

    return distance;
}

void SimAnneal::Initialize () 
{
    int a, b;

    double distance = 0;

    OrderInt();

    for (int i = 0; i < 15 -1; i++)
    {
        a =  S_order [i];
        b =  S_order [i + 1];

        distance += CityArray [a][b];
    }

    E_initial = distance;
}

void SimAnneal::EquateArray () 
{
    for (int i = 0; i < 15; i++)
    {
        S_order [i] = S_trial [i];
    }
}

void SimAnneal::OrderInt () 
{
    for (int i = 0; i <15; i++)
    {
        S_order [i] = i;
    }
}

void SimAnneal::OrderTrial () 
{
    for (int i = 0; i < 15; i++)
    {
        S_trial [i] = S_order [i];
    }

    SwapNum1 = (int)Random_Number_Generator(15, 0);         
    SwapNum2 = (int)Random_Number_Generator(15, 0);

    for (int n = 0; n <= 100000; n++)                       
    {
        SwapNum2 = (int)Random_Number_Generator(15, 0); 

        if ( SwapNum1 != SwapNum2 )
            break;
    }

    S_trial [SwapNum1] = S_order [SwapNum2];
    S_trial [SwapNum2] = S_order [SwapNum1];
}

void SimAnneal::OrderList (double array[]) 
{
    cout << "Array List : " << endl;
    for (int i = 0; i < 15; i++)
    {
        cout << " > " << array[i] << endl;
    }

    cout << "End of array" << endl;
}

void SimAnneal::LoadCities () 
{
    int x, y;

    for (y = 0; y < 15; y++)                    
    {    
        for (x = 0; x < 15; x++)            
        {      
            if (x == y)
            {   CityArray[x][y] = 0.0;  
            }
            else if (x != y)
            {   CityArray[x][y] = Random_Number_Generator(7, 1); 
            }
        }  
    }  

    for (y = 0; y < 15; y++) 
    {    
        for (x = 0; x < 15; x++) 
        {      
            if (y > x)
                CityArray[y][x] = CityArray[x][y];
        }  
    }  
}

double Random_Number_Generator(double nHigh, double nLow)
{
    double fr = ((rand() % ((int)nHigh*1000 - (int)nLow*1000 + 1)) + nLow) / 1000;

    return fr;
}

Любая помощь будет очень ценной. Я сам вне идей.

Ответы [ 6 ]

2 голосов
/ 04 марта 2009

a = S_order [i];
b = S_order [i + 1];
расстояние + = CityArray [a] [b]; <--- Это выглядит подозрительно. Когда я = 14, b = 15 ... явно вне диапазона ... мои 2 цента </p>

1 голос
/ 04 марта 2009

Код, который вы разместили, даже не скомпилируется:

1)

cin >> Go.Write;

В классе SimAnneal такой переменной нет.

2)

Go.SA(Go.Write)

Ваш SA метод не принимает никаких параметров.

Другое дело, почему вы не запускаете свой проект в режиме отладки непосредственно в VC ++ 6.0? VS на скриншотах явно 200 * X *.

Согласно скриншотам, вы рушитесь на линии:

cout << "Quadratic Function" << endl
     << "Solving method: Simulated Annealing" << endl;

Что не имеет особого смысла, если только ваш выходной поток не искажен каким-либо образом. Вы пытались наблюдать за консолью до того, как произойдет сбой?

0 голосов
/ 04 марта 2009

вы всегда можете поместить блоки try {} catch (...) {} вокруг кода и скомпилировать с / EHa

для выявления проблемных зон

0 голосов
/ 04 марта 2009
for (int i = 0; i < 15; i++)
{
    S_trial [i] = S_order [i];
}

// ....
for (int i = 0; i <15; i++)
{
    S_order [i] = i;
}

Обе петли идут слишком высоко. Измените их на 14 вместо 15.

0 голосов
/ 04 марта 2009

попробуйте это:

http://bytes.com/groups/net-vc/535224-whats-first-chance-exception-how-do-i-fix

Но я думаю, что ответ - то, что сказал кто-то еще - расстояние = линия

0 голосов
/ 04 марта 2009

Не похоже, что вы делаете что-то слишком фатальное в своем коде, что я вижу, вы пытались удалить строки кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...