2009-03-04 7 views
0

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.

+0

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

+0

Können Sie bitte die Eingabewerte angeben, die Sie bei einem Absturz verwenden? –

+0

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

Antwort

1

Der Code, den Sie nicht einmal kompilieren geschrieben würden:

1)

cin >> Go.Write; 

Es gibt keine solche Variable in der Klasse SimAnneal.

2)

Go.SA(Go.Write) 

Ihre SA Methode akzeptiert keine Parameter.

Eine andere Sache ist, warum führen Sie Ihr Projekt im Debug-Modus nicht direkt in VC++ 6.0?Der VS auf den Screenshots ist eindeutig 200 * X *.

Nach den Screenshots, die Sie Absturz auf der Linie:

cout << "Quadratic Function" << endl 
    << "Solving method: Simulated Annealing" << endl; 

die nicht viel Sinn macht, es sei denn, Ihr Ausgabestrom in irgendeiner Weise verstümmelt. Haben Sie versucht, die Konsole zu beobachten, bevor der Absturz auftritt?

+0

Anwendungen. Das war eine alte Version der Datei main.cpp. Es wurde so aktualisiert, wie es sein sollte. Ich fand es merkwürdig, auch in diesen Zeilen zu stürzen. Ich habe versucht, sie zu entfernen, und es wird nur auf dem nächsten Satz von Cout-Ausgaben abstürzen. Alles entfernen führt zu einer Zugriffsverletzung (NTDLL.DLL) – Raugnar

0

Es sieht nicht wirklich so aus, als würden Sie in Ihrem Code etwas zu fatal machen, das ich sehen kann. Haben Sie versucht, Codezeilen zu entfernen?

2

a = S_Ordnung [i];
b = S_Ordnung [i + 1];
Entfernung + = CityArray [a] [b]; < --- Das sieht verdächtig aus. Wenn ich 14 =, b = 15 ... deutlich außerhalb des Bereichs ... my 2 cents

+0

Aber ich ist weniger als 15 - 1, die weniger als 14 ist. Daher kann ich nicht höher als 13 sein. –

+0

Das war das Problem beim letzten Mal hatte ich diesen Fehler, bevor ich das gesamte Programm mit Klassen neu geschrieben habe. Aber ich werde immer nur 13 erreichen, wenn die Bedingung besagt: für (int i = 0; i <15 - 1; i ++). also Maximum i = 13 und Maximum b = S_order [14], was bis heute vollkommen legitim war: S – Raugnar

+0

Das Problem ist nicht die 14 hier, ist der Wert, der aus S_order [14] kommt. –

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

Beide Schleifen gehen zu hoch. Ändern Sie sie auf 14 statt 15.

+0

Nicht wirklich, seit: double S_order [15]; double S_trial [15]; – arul

0

Sie können immer setzen try {} catch (...) {} Blöcke um Code und kompilieren mit/EHa

die Problembereiche zu identifizieren