2009-03-04 147 views
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. 

下面是调试器的相关截图:

我调试在微软我的编译程序时的Visual C++ 6.0得到如下。

显示ostream.h:

http://img237.imageshack.us/my.php?image=accessviolation.png'>http://img237.imageshack.us/img237/1116/accessviolation。 th.png”边界= '0'/>

显示main.ccp:

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

我试图冲刷我的代码为空指针,也试图igno没有运气的情况下重新例外。下面是我的脚本的三个主要组成部分:

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; 
} 

任何援助将大大appriciated 。我自己都没有想法。

+0

这编译和在VS2008上运行良好。除非是VC6编译器错误,否则不要认为问题出现在代码中。 – drby 2009-03-04 09:28:36

+0

您能否提供发生碰撞时使用的输入值? – 2009-03-04 10:06:56

+0

你确定你没有编译一个模块和另一个编译器吗?做一个干净的,看看错误消失。也看起来你没有检查输入范围(如果T_current = 0,T_Initial> 0和T_abs <0可能会很糟糕)。 – johnny 2009-03-04 18:36:32

回答

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; 

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

0

它看起来并不像你在代码中做的任何事情都是致命的,我可以看到,你是否试过删除代码行?

2

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

+0

但我小于15 - 1,这是小于14.因此,我不能高于13. – 2009-03-04 05:07:13

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

0

可以随时把try {}赶上(...){}周围代码块和编译/ EHA

找出问题所在