newton
26-10-2005, 14:40
Hi,
das folgende Programm produziert einen Speicherzugriffsfehlr, fuer N>723.
//21.10.05
//
using namespace std;
#define N 724 //Matrix Groesse
//N=724 giebt segemtaion fault, N=723 geht noch
#define MAX_SHOWN_LINES 12
#include <iostream>
#include <cmath>
int main(void){
//bilden einer positiven symetrischen Matrix
double aa[N*N];
double aa_sym[N*N];
//matrix zufaellig fuellen
//
double length=N*N;
for(int i=0;i<length;i++){
aa[i]=(double)i;
}
//matrix symmetrisieren
/* for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
double sum=0;
for(int k=0;k<N;k++){
sum+= *(aa+i+k*N) * (*(aa+j+k*N));
//cout<<"sum="<<sum<<endl;
}
*(aa_sym+j + N*i)=sum;
}
} */
}
und zwar mit g++ 3.3.5. (hab das auf 3 verschiedenen Rechnern getestet). Komischerweise passiert das nicht mit g++ 3.3.4 (auf 2 Rechnern getestet).
Kompiliert jeweils mit $g++ -g haupt_programm.cpp
Der Speicherzugriffsfehler passiert auch nicht, wenn ich die zweite Array deklaration ausklammere oder die Groesse auf N beschraenke (double aa_sym[N*N]; ).
gdb giebt mir folgendes:
Breakpoint 1, main () at haupt_programm.cpp:21
21 double length=N*N;
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x080485cd in main () at haupt_programm.cpp:21
21 double length=N*N;
(gdb) n
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
Was mich wundert, ist das der Fehler von der Groesse abhaengt. Und so besonders gross ist das ja nicht (~4MB), das sollte in 1GB Speicher reinpassen ;)
Sieht jemand den Fehler? Oder ist das ein Bug vom gcc?
Ich hab das Programm mal angehaengt, zum ausprobieren. Die Kommentare sind teilweise nicht mehr ganz richtig, es ist ein Ausschnitt aus einem Programm zum loesen linearer Gleichungssysteme.
Gruss,
newton
das folgende Programm produziert einen Speicherzugriffsfehlr, fuer N>723.
//21.10.05
//
using namespace std;
#define N 724 //Matrix Groesse
//N=724 giebt segemtaion fault, N=723 geht noch
#define MAX_SHOWN_LINES 12
#include <iostream>
#include <cmath>
int main(void){
//bilden einer positiven symetrischen Matrix
double aa[N*N];
double aa_sym[N*N];
//matrix zufaellig fuellen
//
double length=N*N;
for(int i=0;i<length;i++){
aa[i]=(double)i;
}
//matrix symmetrisieren
/* for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
double sum=0;
for(int k=0;k<N;k++){
sum+= *(aa+i+k*N) * (*(aa+j+k*N));
//cout<<"sum="<<sum<<endl;
}
*(aa_sym+j + N*i)=sum;
}
} */
}
und zwar mit g++ 3.3.5. (hab das auf 3 verschiedenen Rechnern getestet). Komischerweise passiert das nicht mit g++ 3.3.4 (auf 2 Rechnern getestet).
Kompiliert jeweils mit $g++ -g haupt_programm.cpp
Der Speicherzugriffsfehler passiert auch nicht, wenn ich die zweite Array deklaration ausklammere oder die Groesse auf N beschraenke (double aa_sym[N*N]; ).
gdb giebt mir folgendes:
Breakpoint 1, main () at haupt_programm.cpp:21
21 double length=N*N;
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x080485cd in main () at haupt_programm.cpp:21
21 double length=N*N;
(gdb) n
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
Was mich wundert, ist das der Fehler von der Groesse abhaengt. Und so besonders gross ist das ja nicht (~4MB), das sollte in 1GB Speicher reinpassen ;)
Sieht jemand den Fehler? Oder ist das ein Bug vom gcc?
Ich hab das Programm mal angehaengt, zum ausprobieren. Die Kommentare sind teilweise nicht mehr ganz richtig, es ist ein Ausschnitt aus einem Programm zum loesen linearer Gleichungssysteme.
Gruss,
newton