Grüße alle, die Hilfe beim Löschen dieser Ausnahme benötigen.Zugriffsverletzung
ich die folgende, wenn meine kompilierte Programm in Microsoft Debugging 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.
Hier sind die entsprechenden Screenshots aus dem Debugger.
Zeige ostream.h:
http://img237.imageshack.us/my.php?image=accessviolation.png'>http://img237.imageshack.us/img237/1116/accessviolation. th.png‘border = '0' />
Zeige main.ccp:
http://img509.imageshack.us/my.php?image=accessviolation2.png'>http://img509 .imageshack.us/img509/3619/accessviolation2.th.png 'border =' 0 '/>
Ich habe versucht, meinen Code für Nullzeiger durchzusuchen und habe auch versucht zu ignorieren die Ausnahme ohne Glück. Hier sind die drei Hauptkomponenten mein Skript:
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;
}
Jede mögliche Unterstützung viel appriciated . Ich habe selbst keine Ideen.
Dies kompiliert und läuft gut auf VS2008. Denken Sie nicht, dass das Problem mit dem Code ist, es sei denn, es ist ein VC6-Compiler-Fehler. – drby
Können Sie bitte die Eingabewerte angeben, die Sie bei einem Absturz verwenden? –
Sind Sie sicher, dass Sie nicht ein Modul mit einem Compiler und ein anderes mit dem anderen kompiliert haben? Machen Sie eine Reinigung und sehen Sie, ob der Fehler verschwindet. Es sieht auch so aus, als würden Sie keine Eingabebereiche prüfen (T_Initial> 0 und T_abs <0 könnte schlecht sein, wenn T_current = 0). – johnny