问候每个人,在清除此例外时需要一些帮助。
在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;
}
任何援助都会受到很大关注。我自己都是出于想法。
答案 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编译
确定问题区域