访问违规

时间:2009-03-04 04:36:16

标签: c++ debugging memory

问候每个人,在清除此例外时需要一些帮助。

在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 个答案:

答案 0 :(得分:2)

a = S_order [i];
b = S_order [i + 1];
距离+ = CityArray [a] [b]; &lt; ---这看起来很可疑。当i = 14时,b = 15 ......明显超出范围...... 我的2美分

答案 1 :(得分:1)

您发布的代码甚至无法编译:

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;

除非您的输出流以某种方式被肢解,否则这没有多大意义。您是否在发生崩溃之前尝试过观看控制台?

答案 2 :(得分:0)

看起来你在我的代码中做的任何东西看起来都太致命了,你试过删除代码吗?

答案 3 :(得分:0)

试试这个:

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

但我认为答案是别人说的 - 距离=行

答案 4 :(得分:0)

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。

答案 5 :(得分:0)

你总是可以在代码周围加上try {} catch(...){}块并用/ EHa编译

确定问题区域