syraneus
Goto Top

Programm stürzt mit Speicherfehlermeldung ab

Das Programm soll eine Givensrotation an einer angegebenen Matrix durchführen. Stürzt jedoch zu unterschiedlichen Zeitpunkten ab ohne das ich herausfinden kann wieso

Hallo,

ich soll ein Programm erstellen das eine Givensrotation durchführt. Wie die Givensrotation funktioniert weiß ich, das Programm grundgerüst steht auch. Allerdings stürzt das Programm zu unterschiedlichen Zeiten ab und ich finde nicht heraus wieso es abstürzt wo der fehler liegt.
Mal wird 1 mal das komplette programm durchlaufen, dann kommt ein absturz. Mal wird das Programm 3 mal durchlaufen und dann kommt der Absturz. Das Programm sollte 5 mal laufen und dann die neu berechnete Matrix ausgeben.

Folgende Fehlermeldungen erhalte ich.

Die Anweisung in "0x7c920717" verweist auf Speicher in "0x003cbd25". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.
oder
Die Anweisung in "0x7c921689" verweist auf Speicher in "0x00300025". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.
oder
Die Anweisung in "0x7c9216c7" verweist auf Speicher in "0x00380d75" Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden.
Wenn das Programm einmal etwas weiter durchläuft, bekomme ich folgende Fehlermeldung.
Die Anweisung in "0x7c920717" verweist auf Speicher in "0x00000000". Der Vorgang "read konnte nicht auf dem Speicher durchgeführt werden.

Mein Betriebssystem ist windows XP. Ich habe das selbe verhalten allerdings auch auf meinem Laptop (Windows 7) und auf einem weiteren Laptop mit ebenfalls Windows 7 feststellen können.

Hier der Quellcode der verwendet wird. In dem Quellcode stehen feste Variablen drin, es wird also nichts eingegeben. Deswegen versteh ich auch nicht wieso er zu unterschiedlichen Fehlermeldungen kommt. Und wieso er mal beim Schreiben in den Speicher und beim Lesen vom Speicher Probleme hat, ohne das sich der Quellcode geändert hat. In dem Programm gibt es auch keine Zufallsgeneratoren oder ähnliches.

Das Programm besteht aus der main funktion und 2 weiteren Funktionen. Die beiden weiteren Funktionen heißen "givens" und "GivensRotation". Die Funktionier GivensRotation wird vom main aufgerufen. In der Funktion Givensrotation wird die Funktion givens aufgerufen. Wie im Quelltext zu ersehen. Folgende Ausgaben bekomme ich wenn ich das Programm laufen lassen.(Unter Quellcode)


#include <stdio.h>
#include <stdlib.h>                                                                 /{{comment_multi_line:0}}/
#include <math.h>  
#include <iostream>
using namespace std;                                                              //*für Logarithmus und Wurzeln*//

int GivensRotation (int n, int m, double** A, double* b);
double givens (double a, double x);


int main (void)
{
int n,m,k,j;
double** A;
double* b;



n=2;
m=4;
b=(double*)malloc(m*sizeof(double));                                                //*Speicherreservierung*//
A=(double**)malloc(m*sizeof(double*));                                              

for(k=0;k<m;k++)
{
A[k]=(double*)malloc (n*sizeof(double));}

for(k=0;k<m;k++)
{A[k]=1;}                                                                         //*Belegen der 1.Spalte*//

A[1]=1;
A[1][1]=3;
A[2][1]=5;
A[3][1]=7;

b=log(89);                                                                              //*Belegen von b*//
b[1]=log(65);
b[2]=log(45);
b[3]=log(38);

cout << "n= " << n << "\n" ;  
cout << "A =" << A<< "\n" ;  
cout << "A[1] =" << A[1]<< "\n" ;  
cout << "A[1] =" << A[1]<< "\n" ;  
cout << "A[1][1] =" << A[1][1]<< "\n" ;  
cout << "A[2] =" << A[2]<< "\n" ;  
cout << "A[2][1] =" << A[2][1]<< "\n" ;  
cout << "A[3] =" << A[3]<< "\n" ;  
cout << "A[3][1] =" << A[3][1]<< "\n" ;  

 

GivensRotation(n,m,A,b);

printf("Die Matrix ist R: \n");  
for(k=0;k<m;k++)
                {for(j=0;j<n;j++)
                                 {printf("[%d][%d]=%lf\n",k,j,A[k][j]);}}  

system ("Pause");  

for (k=0;k<n;k++)                                                                       //*Speicher wieder frei geben*//
{free (A[k]);}                                                                          //*Speicher in umgekehrter Reihenfolge freigeben*//
free (A);
free (b);


 
 return 0; 
   
}




int GivensRotation (int n, int m, double** A, double* b)      // Ausgelagerte Funktion Givens-Rotation

{    int i,j,k,h;
double c,s, roh,fu;
double* r;
r=(double*)malloc(n*sizeof(double));
for (j=0; j<n;j++)                                                     //*Äußere Schleife durchläuft die Spalten*//
{for (i=m-1;i>j;i--)                                                  //*Innere Schleife durchläuft die Zeilen unterhalb der Diagonale*//
{
     roh= givens(A[i-1][j],A[i][j]);                         //*im Eintrag, der durch die Givensrot null gesetzt wird, wird roh gespeichert*//
     if (roh ==1)
     {c=1;
     s=0;
       cout << "roh ist derzeit: " << roh << "\n";  
        A[i][j]=roh;                                         //Spare Speicherplatz und speichere roh ab, damit es nicht verloren geht 
     }                                                       //if-Schleife für roh=1 geschlossen
     
     if(fabs(roh) <1)
     {s=2*roh;
      c=sqrt(1-s*s);
      cout << "s = " << s << "\n";  
      cout << "c = " << c << "\n";  
        for(k=0;k<n-j;k++)                                   //*Berechne Hilfsvektor um zu frühe Überschreibung für Multi. zu vermeiden
           {r[k]=(-s)*A[i-1][k+1+j] + c*A[i][k+1+j];}             //*in r stehen die Einträge der neuen i-ten Zeile, bis auf den Nulleintrag
                                                              //r wird in jedem Schleifendurchlauf Überschrieben; alte Einträge spielen keine Rolle
                                                              //siehe weiter unten
                                                              
        for(k=j;k<n;k++)                                     //*Neue Einträge der i-1-ten Zeile werden direkt in Matrix A gespeichert
          { A[i-1][k]=c*A[i-1][k] +s*A[i][k];}
        cout << "roh ist derzeit: " << roh << "\n"; 
        A[i][j]=roh;                                         //Spare Speicherplatz und speichere roh ab, damit es nicht verloren geht
                                                             //Spätere Verwendung für b
        for(k=0;k<n-j;k++)                                   //Einträge des Hilfsvektors werden in die i-te Zeile der neuen Matrix geschrieben
        {A[i][j+1+k]=r[k];}                                  //Unsinnige Einträge aus vorhergehendem Schleifendurchlauf werden nicht beachtet,
                                                            //da k nur bis n-j läuft
        fu=c*b[i-1]+s*b[i];                                  //Hilfsvariable                 
        b[i]=-s*b[i-1]+c*b[i];
        b[i-1]=fu;
        }                                                    //Beendet if Schleife
         
     else
     {c=0.5*roh;
     s=sqrt(1-c*c);
             for(k=0;k<(n-j);k++)                                   //*Berechne Hilfsvektor um zu frühe Überschreibung für Multi. zu vermeiden
           {r[k]=(-s)*A[i-1][k+1+j] + c*A[i][k+1]+j;}             //*in r stehen die Einträge der neuen i-ten Zeile, bis auf den Nulleintrag
                                                              //r wird in jedem Schleifendurchlauf Überschrieben; alte Einträge spielen keine Rolle
                                                              //siehe weiter unten
                                                              
        for(k=j;k<n;k++)                                     //*Neue Einträge der i-1-ten Zeile werden direkt in Matrix A gespeichert
          { A[i-1][k]=c*A[i-1][k] +s*A[i][k];}
        cout << "roh ist derzeit: " << roh << "\n"; 
        A[i][j]=roh;                                         //Spare Speicherplatz und speichere roh ab, damit es nicht verloren geht
                                                             //Spätere Verwendung für b
        for(k=0;k<(n-j);k++)                                   //Einträge des Hilfsvektors werden in die i-te Zeile der neuen Matrix geschrieben
        {A[i][j+1+k]=r[k];}                                  //Unsinnige Einträge aus vorhergehendem Schleifendurchlauf werden nicht beachtet,
                                                             //da k nur bis n-j läuft
         
        fu=c*b[i-1]+s*b[i];                                  //Hilfsvariable                 
        b[i]=-s*b[i-1]+c*b[i];
        b[i-1]=fu;
            }                                                //else-Schleife wird geschlossen
         }                                                   //schließt innere for-Schleife
     }                                                    //schließt äußere for-Schleife
     
free (r);                                                 //Speicher für Hilfsvektor frei geben     
return 1;}                                                           //beendet Givens-Rotation


 
 
 
                                                             //Aus Main-programm ausgelagert
double givens (double a, double x)                        //* hier wird die Funktion die roh zurückgibt definiert*//

{        double s,c,tau,roh1;
       if (fabs(a)>fabs(x))                                                //*es wird enschieden ob ai-1,j oder ai,j betragsmäßig größer ist*//
     {tau=x/a;                                                         //*Es werden c und s gemäß Vorlesung berechnet*//
      s=1/(sqrt(1+tau*tau));
      c=s*tau;
      roh1 =(1/2)*c; 

      return roh1;}
      
      
      if (x==0)
      {
               roh1=1;
               return roh1;}
  else
      {
      cout << "a = " << a << "\n";  
      cout << "x = " << x << "\n";         
      tau=a/x;
      cout << "tau = " << tau << "\n";  
      c=1/(sqrt(1+tau*tau));
      cout << "c = " << c << "\n";  
      s=c*tau;
      cout  << "s = " << s << "\n";  
      roh1=0.5*s;
      cout << "roh1 = " << roh1 << "\n";  
      roh1=10*s/20;
      cout << "roh1 = " << roh1 << "\n";  
  return roh1;}
}                                                                      //schließt givens
  

       


1 Durchlauf:
n= 2
A =1
A[1] =1
A[1] =1
A[1][1] =3
A[2] =1
A[2][1] =5
A[3] =1
A[3][1] =7
a = 1
x = 1
tau = 1
c = 0.707107
s = 0.707107
roh1 = 0.353553
roh1 = 0.353553
s = 0.707107
c = 0.707107
roh ist derzeit: 0.353553
a =

oder

3 Durchläufe

n= 2
A =1
A[1] =1
A[1] =1
A[1][1] =3
A[2] =1
A[2][1] =5
A[3] =1
A[3][1] =7
a = 1
x = 1
tau = 1
c = 0.707107
s = 0.707107
roh1 = 0.353553
roh1 = 0.353553
s = 0.707107
c = 0.707107
roh ist derzeit: 0.353553
a = 1
x = 1.41421
tau = 0.707107
c = 0.816497
s = 0.57735
roh1 = 0.288675
roh1 = 0.288675
s = 0.57735
c = 0.816497
roh ist derzeit: 0.288675
a = 1
x = 1.63299
tau = 0.612372
c = 0.852803
s = 0.522233
roh1 = 0.261116
roh1 = 0.261116
s = 0.522233
c = 0.852803
roh ist derzeit: 0.261116
s = 0
c = 1
roh ist derzeit: 0
s = 0
c = 1
roh ist derzeit: 0



Ich hoffe ihr könnt mir helfen. Ich weiß derzeit nicht mehr wo ich suchen soll.
Der Einzige Hinweis den mir windows gibt zeigt auf den Speicher, aber ich weiß nicht was ich daran ändern sollte/könnte.

Vielen Dank für eure Hilfe

mfg DerChirurg

Content-ID: 177088

Url: https://administrator.de/contentid/177088

Ausgedruckt am: 15.11.2024 um 14:11 Uhr