Greetings everyone, going to need some help in clearing this exception.
I get the following when debugging my compiled program in 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.
Here are the relevant screenshots from the debugger.
Showing ostream.h:
http://img237.imageshack.us/my.php?image=accessviolation.png'>http://img237.imageshack.us/img237/1116/accessviolation.th.png' border='0'/>
Showing main.ccp:
http://img509.imageshack.us/my.php?image=accessviolation2.png'>http://img509.imageshack.us/img509/3619/accessviolation2.th.png' border='0'/>
I've tried to scour my code for null pointers and have also tried to ignore the exception with no luck. Here are the three main components of my script:
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;
}
Any Assistance would be much appriciated. I'm all out of ideas myself.