Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Programm stürzt mit Speicherfehlermeldung ab

Frage Entwicklung C und C++

Mitglied: Syraneus

Syraneus (Level 1) - Jetzt verbinden

30.11.2011, aktualisiert 14.11.2012, 3347 Aufrufe

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)


01.
#include <stdio.h> 
02.
#include <stdlib.h>                                                                 //*für malloc*// 
03.
#include <math.h>   
04.
#include <iostream> 
05.
using namespace std;                                                              //*für Logarithmus und Wurzeln*// 
06.
 
07.
int GivensRotation (int n, int m, double** A, double* b); 
08.
double givens (double a, double x); 
09.
 
10.
 
11.
int main (void) 
12.
13.
int n,m,k,j; 
14.
double** A; 
15.
double* b; 
16.
 
17.
 
18.
 
19.
n=2; 
20.
m=4; 
21.
b=(double*)malloc(m*sizeof(double));                                                //*Speicherreservierung*// 
22.
A=(double**)malloc(m*sizeof(double*));                                               
23.
 
24.
for(k=0;k<m;k++) 
25.
26.
A[k]=(double*)malloc (n*sizeof(double));} 
27.
 
28.
for(k=0;k<m;k++) 
29.
{A[k][0]=1;}                                                                         //*Belegen der 1.Spalte*// 
30.
 
31.
A[0][1]=1; 
32.
A[1][1]=3; 
33.
A[2][1]=5; 
34.
A[3][1]=7; 
35.
 
36.
b[0]=log(89);                                                                              //*Belegen von b*// 
37.
b[1]=log(65); 
38.
b[2]=log(45); 
39.
b[3]=log(38); 
40.
 
41.
cout << "n= " << n << "\n" ; 
42.
cout << "A[0][0] =" << A[0][0]<< "\n" ; 
43.
cout << "A[0][1] =" << A[0][1]<< "\n" ; 
44.
cout << "A[1][0] =" << A[1][0]<< "\n" ; 
45.
cout << "A[1][1] =" << A[1][1]<< "\n" ; 
46.
cout << "A[2][0] =" << A[2][0]<< "\n" ; 
47.
cout << "A[2][1] =" << A[2][1]<< "\n" ; 
48.
cout << "A[3][0] =" << A[3][0]<< "\n" ; 
49.
cout << "A[3][1] =" << A[3][1]<< "\n" ; 
50.
 
51.
  
52.
 
53.
GivensRotation(n,m,A,b); 
54.
 
55.
printf("Die Matrix ist R: \n"); 
56.
for(k=0;k<m;k++) 
57.
                {for(j=0;j<n;j++) 
58.
                                 {printf("[%d][%d]=%lf\n",k,j,A[k][j]);}} 
59.
 
60.
system ("Pause"); 
61.
 
62.
for (k=0;k<n;k++)                                                                       //*Speicher wieder frei geben*// 
63.
{free (A[k]);}                                                                          //*Speicher in umgekehrter Reihenfolge freigeben*// 
64.
free (A); 
65.
free (b); 
66.
 
67.
 
68.
  
69.
 return 0;  
70.
    
71.
72.
 
73.
 
74.
 
75.
 
76.
int GivensRotation (int n, int m, double** A, double* b)      // Ausgelagerte Funktion Givens-Rotation 
77.
 
78.
{    int i,j,k,h; 
79.
double c,s, roh,fu; 
80.
double* r; 
81.
r=(double*)malloc(n*sizeof(double)); 
82.
for (j=0; j<n;j++)                                                     //*Äußere Schleife durchläuft die Spalten*// 
83.
{for (i=m-1;i>j;i--)                                                  //*Innere Schleife durchläuft die Zeilen unterhalb der Diagonale*// 
84.
85.
     roh= givens(A[i-1][j],A[i][j]);                         //*im Eintrag, der durch die Givensrot null gesetzt wird, wird roh gespeichert*// 
86.
     if (roh ==1) 
87.
     {c=1; 
88.
     s=0; 
89.
       cout << "roh ist derzeit: " << roh << "\n"; 
90.
        A[i][j]=roh;                                         //Spare Speicherplatz und speichere roh ab, damit es nicht verloren geht  
91.
     }                                                       //if-Schleife für roh=1 geschlossen 
92.
      
93.
     if(fabs(roh) <1) 
94.
     {s=2*roh; 
95.
      c=sqrt(1-s*s); 
96.
      cout << "s = " << s << "\n"; 
97.
      cout << "c = " << c << "\n"; 
98.
        for(k=0;k<n-j;k++)                                   //*Berechne Hilfsvektor um zu frühe Überschreibung für Multi. zu vermeiden 
99.
           {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 
100.
                                                              //r wird in jedem Schleifendurchlauf Überschrieben; alte Einträge spielen keine Rolle 
101.
                                                              //siehe weiter unten 
102.
                                                               
103.
        for(k=j;k<n;k++)                                     //*Neue Einträge der i-1-ten Zeile werden direkt in Matrix A gespeichert 
104.
          { A[i-1][k]=c*A[i-1][k] +s*A[i][k];} 
105.
        cout << "roh ist derzeit: " << roh << "\n"; 
106.
        A[i][j]=roh;                                         //Spare Speicherplatz und speichere roh ab, damit es nicht verloren geht 
107.
                                                             //Spätere Verwendung für b 
108.
        for(k=0;k<n-j;k++)                                   //Einträge des Hilfsvektors werden in die i-te Zeile der neuen Matrix geschrieben 
109.
        {A[i][j+1+k]=r[k];}                                  //Unsinnige Einträge aus vorhergehendem Schleifendurchlauf werden nicht beachtet, 
110.
                                                            //da k nur bis n-j läuft 
111.
        fu=c*b[i-1]+s*b[i];                                  //Hilfsvariable                  
112.
        b[i]=-s*b[i-1]+c*b[i]; 
113.
        b[i-1]=fu; 
114.
        }                                                    //Beendet if Schleife 
115.
          
116.
     else 
117.
     {c=0.5*roh; 
118.
     s=sqrt(1-c*c); 
119.
             for(k=0;k<(n-j);k++)                                   //*Berechne Hilfsvektor um zu frühe Überschreibung für Multi. zu vermeiden 
120.
           {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 
121.
                                                              //r wird in jedem Schleifendurchlauf Überschrieben; alte Einträge spielen keine Rolle 
122.
                                                              //siehe weiter unten 
123.
                                                               
124.
        for(k=j;k<n;k++)                                     //*Neue Einträge der i-1-ten Zeile werden direkt in Matrix A gespeichert 
125.
          { A[i-1][k]=c*A[i-1][k] +s*A[i][k];} 
126.
        cout << "roh ist derzeit: " << roh << "\n"; 
127.
        A[i][j]=roh;                                         //Spare Speicherplatz und speichere roh ab, damit es nicht verloren geht 
128.
                                                             //Spätere Verwendung für b 
129.
        for(k=0;k<(n-j);k++)                                   //Einträge des Hilfsvektors werden in die i-te Zeile der neuen Matrix geschrieben 
130.
        {A[i][j+1+k]=r[k];}                                  //Unsinnige Einträge aus vorhergehendem Schleifendurchlauf werden nicht beachtet, 
131.
                                                             //da k nur bis n-j läuft 
132.
          
133.
        fu=c*b[i-1]+s*b[i];                                  //Hilfsvariable                  
134.
        b[i]=-s*b[i-1]+c*b[i]; 
135.
        b[i-1]=fu; 
136.
            }                                                //else-Schleife wird geschlossen 
137.
         }                                                   //schließt innere for-Schleife 
138.
     }                                                    //schließt äußere for-Schleife 
139.
      
140.
free (r);                                                 //Speicher für Hilfsvektor frei geben      
141.
return 1;}                                                           //beendet Givens-Rotation 
142.
 
143.
 
144.
  
145.
  
146.
  
147.
                                                             //Aus Main-programm ausgelagert 
148.
double givens (double a, double x)                        //* hier wird die Funktion die roh zurückgibt definiert*// 
149.
 
150.
{        double s,c,tau,roh1; 
151.
       if (fabs(a)>fabs(x))                                                //*es wird enschieden ob ai-1,j oder ai,j betragsmäßig größer ist*// 
152.
     {tau=x/a;                                                         //*Es werden c und s gemäß Vorlesung berechnet*// 
153.
      s=1/(sqrt(1+tau*tau)); 
154.
      c=s*tau; 
155.
      roh1 =(1/2)*c;  
156.
 
157.
      return roh1;} 
158.
       
159.
       
160.
      if (x==0) 
161.
162.
               roh1=1; 
163.
               return roh1;} 
164.
  else 
165.
166.
      cout << "a = " << a << "\n"; 
167.
      cout << "x = " << x << "\n";        
168.
      tau=a/x; 
169.
      cout << "tau = " << tau << "\n"; 
170.
      c=1/(sqrt(1+tau*tau)); 
171.
      cout << "c = " << c << "\n"; 
172.
      s=c*tau; 
173.
      cout  << "s = " << s << "\n"; 
174.
      roh1=0.5*s; 
175.
      cout << "roh1 = " << roh1 << "\n"; 
176.
      roh1=10*s/20; 
177.
      cout << "roh1 = " << roh1 << "\n"; 
178.
  return roh1;} 
179.
}                                                                      //schließt givens 
180.
   
181.
 
182.
       

1 Durchlauf:
01.
n= 2 
02.
A[0][0] =1 
03.
A[0][1] =1 
04.
A[1][0] =1 
05.
A[1][1] =3 
06.
A[2][0] =1 
07.
A[2][1] =5 
08.
A[3][0] =1 
09.
A[3][1] =7 
10.
a = 1 
11.
x = 1 
12.
tau = 1 
13.
c = 0.707107 
14.
s = 0.707107 
15.
roh1 = 0.353553 
16.
roh1 = 0.353553 
17.
s = 0.707107 
18.
c = 0.707107 
19.
roh ist derzeit: 0.353553 
20.
a =
oder

3 Durchläufe

01.
n= 2 
02.
A[0][0] =1 
03.
A[0][1] =1 
04.
A[1][0] =1 
05.
A[1][1] =3 
06.
A[2][0] =1 
07.
A[2][1] =5 
08.
A[3][0] =1 
09.
A[3][1] =7 
10.
a = 1 
11.
x = 1 
12.
tau = 1 
13.
c = 0.707107 
14.
s = 0.707107 
15.
roh1 = 0.353553 
16.
roh1 = 0.353553 
17.
s = 0.707107 
18.
c = 0.707107 
19.
roh ist derzeit: 0.353553 
20.
a = 1 
21.
x = 1.41421 
22.
tau = 0.707107 
23.
c = 0.816497 
24.
s = 0.57735 
25.
roh1 = 0.288675 
26.
roh1 = 0.288675 
27.
s = 0.57735 
28.
c = 0.816497 
29.
roh ist derzeit: 0.288675 
30.
a = 1 
31.
x = 1.63299 
32.
tau = 0.612372 
33.
c = 0.852803 
34.
s = 0.522233 
35.
roh1 = 0.261116 
36.
roh1 = 0.261116 
37.
s = 0.522233 
38.
c = 0.852803 
39.
roh ist derzeit: 0.261116 
40.
s = 0 
41.
c = 1 
42.
roh ist derzeit: 0 
43.
s = 0 
44.
c = 1 
45.
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
Ähnliche Inhalte
Windows Netzwerk
Spoolsv.exe stürzt ab
gelöst Frage von petereWindows Netzwerk4 Kommentare

Hallo zusammen, auf einem frisch installierten Windows 2012 R2 Server 64bit stürzt mein spoolsv.exe ab. Ich habe alle Drucker ...

Windows Netzwerk
Windows Netzwerk stürzt ab!
Frage von iWolf2015Windows Netzwerk9 Kommentare

Mein Problem ist folgendes: Ich erstelle mir ein eigenes Netzwerk: netsh wlan set hostednetwork mode=allow ssid=Testnetzwerk key=TestPass netsh wlan ...

Webbrowser
Und plötzlich stürzt der Firefox ab
gelöst Frage von KellogsFRWebbrowser6 Kommentare

Hallo zusammen, gestern rief mich ein Kunde an, der sagte, sein Firefox würde nicht mehr funktionieren und immer abstürzen. ...

Grafikkarten & Monitore
Windows stürzt dauernd ab
gelöst Frage von Motherboard33Grafikkarten & Monitore15 Kommentare

Hallo Habe mir für meinen PC eine neue Grafikkarte gekauft (VTX3D Radeon R9 290x) Auf dem karton steht das ...

Neue Wissensbeiträge
Windows 10

Windows 10 Hello-Anmeldung per Foto ausgehebelt

Tipp von kgborn vor 3 StundenWindows 10

Windows Hello ist eine Funktion, um sich per Fingerabdruck-, Gesichts- oder Iriserkennung bei Windows 10-Geräten anzumelden (siehe), setzt aber ...

Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 10 StundenPerl2 Kommentare

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 11 StundenSicherheit1 Kommentar

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 1012 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Heiß diskutierte Inhalte
Windows Server
SCCM 2016: PXE Boot des Clients schlägt fehl
Frage von gabeBUWindows Server23 Kommentare

Hallo Zusammen Ich habe eine Testumgebung erstellt um über SCCM 2016 einen virtuellen Client aufzusetzen. Folgende Maschinen habe ich ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
gelöst Frage von CenuzeNetzwerkgrundlagen19 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Exchange Server
Exchange empfängt Emails - Kann aber keine Senden
gelöst Frage von niklasschaeferExchange Server11 Kommentare

Hallo, ich stehe gerade bei mir zuhause vor folgender Problemstellung. Gegeben sind 2x Hyper-V Host mit Windows Server 2016 ...