Segmentation Fault (core dumped)

2013-02-11 15:40
0

Witam wszystkich bardzo serdecznie. Znów mam problem z jednym z programów. Liczy on wyznacznik. Bez klas działa on dobrze, jednak gdy podzielę go na klasy, wyskakuje błąd segmentation fault(core dumped) 139(0x8B). Wiem, że odwołuję się poza tablicę, kieruję się na nieistniejący wskaźnik, jednak nie wiem w którym miejscu jest ten wskaźnik.
Wszystko wrzucam do jednego pliku

#include <iostream>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include<gmpxx.h>
#include<gmp.h>

using namespace std;
class metody{

public:
float** tab;
int N;
void losowanie(int);
void macierz_trojkatna(float**, int);

};

void metody::losowanie(int N){
    float** tab;

 int i,j;
  cout<<"podaj rozmiar macierzy ";
  cin>>N;
  time_t t;
  srand((unsigned) time(&t));
tab=new float *[N];
  cout<<"zawartosc macierzy"<<endl<<endl;

for(i=0;i<N;i++) tab[i]=new float[N];

for(i=0;i<N;i++)
for(j=0;j<N;j++)
  {
    tab[i][j]=rand()%100;
    cout<<tab[i][j]<<" ";
    if(j==N-1)cout<<endl;
  }
}

void metody::macierz_trojkatna(float **tab, int N){
// tworzenie macierzy trojkatnej
int i,j,k;
for (k=0; k<N-1; k++)
{
  for (i=k+1; i<N; i++)
  for (j=N-1; j>=k; j--)
  tab[i][j] = tab[i][j] - tab[i][k]*tab[k][j]/tab[k][k];
}

 if (N<=3) {
float det = 1.0;

//tu wyliczamy wyznacznik po przekątnej
for (i=0; i<N; i++)  det = det * tab[i][i];
   cout<<endl<<"wyznacznik wynosi  "<<det<<endl;
   cout<<"aby zakonczyc nacisnij dowolny klawisz ";
}

else if (N>=4 and N<=100){
mpz_class det = 1.0;

for (i=0; i<N; i++)  det = det * tab[i][i];
   cout<<endl<<"wyznacznik wynosi  "<<det<<endl;
   cout<<"aby zakonczyc nacisnij dowolny klawisz ";}

else if (N>100){
mpq_class det = 1.0;

for (i=0; i<N; i++)  det = det * tab[i][i];
   cout<<endl<<"wyznacznik wynosi  "<<det<<endl;
   cout<<"aby zakonczyc nacisnij dowolny klawisz ";

}
for (int i = 0; i < N; i++) delete [] tab[i];
delete tab;
}

int main()
{
float** tab;
int N;
int x;
metody wyznacznik;
wyznacznik.losowanie(x);
wyznacznik.macierz_trojkatna(tab,x);

cin.sync();
cin.get();
return 0;
} 

Dziękuję za pomoc i proszę o wyrozumiałość.

edytowany 2x, ostatnio: furious programming, 2013-02-11 17:51
Badź taki dobry i następnym razem przed wrzuceniem kodu pousuwaj niepotrzebne puste linie - skrócisz kod a tym samym post o połowę; - furious programming 2013-02-11 17:52

Pozostało 580 znaków

2013-02-11 15:48
0

jednak nie wiem w którym miejscu jest ten wskaźnik.

Użyj debuggera?


Pozostało 580 znaków

2013-02-11 15:56
0

o_O
Ty nie trzeba debuggera tylko mózgu.

float** tab;
//
wyznacznik.macierz_trojkatna(tab,x);

a pamięć dla tab to sie sama przydzieliła? o_o


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2013-02-11 16:07
0

jednak program nadal nie działa. Najwidoczniej nie mam mózgu.

Pozostało 580 znaków

2013-02-11 16:10
0

Pokaż aktualny, porządnie sformatowany kod.
Błąd pozostał ten sam? Może alokujesz zbyt mały rozmiar or something.


Pozostało 580 znaków

2013-02-11 16:14
0
 #include <iostream>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include<gmpxx.h>
#include<gmp.h>

using namespace std;
class metody{

public:
float** tab;
int N;
void losowanie(int);
void macierz_trojkatna(float**, int);

};

void metody::losowanie(int N){
    float** tab;

 int i,j;
  cout<<"podaj rozmiar macierzy ";
  cin>>N;
  time_t t;
  srand((unsigned) time(&t));
tab=new float *[N];
  cout<<"zawartosc macierzy"<<endl<<endl;

for(i=0;i<N;i++) tab[i]=new float[N];

for(i=0;i<N;i++)
for(j=0;j<N;j++)
  {
    tab[i][j]=rand()%100;
    cout<<tab[i][j]<<" ";
    if(j==N-1)cout<<endl;
  }
}

void metody::macierz_trojkatna(float** tab, int N){
// tworzenie macierzy trojkatnej
int i,j,k;
for (k=0; k<N-1; k++)
{
  for (i=k+1; i<N; i++)
  for (j=N-1; j>=k; j--)
  tab[i][j] = tab[i][j] - tab[i][k]*tab[k][j]/tab[k][k];
}

 if (N<=3) {
float det = 1.0;

//tu wyliczamy wyznacznik po przekątnej
for (i=0; i<N; i++)  det = det * tab[i][i];
   cout<<endl<<"wyznacznik wynosi  "<<det<<endl;
   cout<<"aby zakonczyc nacisnij dowolny klawisz ";
}

else if (N>=4 and N<=100){
mpz_class det = 1.0;

for (i=0; i<N; i++)  det = det * tab[i][i];
   cout<<endl<<"wyznacznik wynosi  "<<det<<endl;
   cout<<"aby zakonczyc nacisnij dowolny klawisz ";}

else if (N>100){
mpq_class det = 1.0;

for (i=0; i<N; i++)  det = det * tab[i][i];
   cout<<endl<<"wyznacznik wynosi  "<<det<<endl;
   cout<<"aby zakonczyc nacisnij dowolny klawisz ";
}
for (int i = 0; i < N; i++) delete [] tab[i];
delete tab;
}

int main()
{
float** tab;
int x;
metody wyznacznik;
wyznacznik.losowanie(x);
wyznacznik.macierz_trojkatna(tab,x);

cin.sync();
cin.get();
return 0;
}

Wiem, że nie usprawiedliwia mnie to,że jestem początkujący

edytowany 2x, ostatnio: furious programming, 2013-02-11 17:54

Pozostało 580 znaków

2013-02-11 16:21

1.Nie rozumiesz obiektowości.
2.Jeżeli masz zmienną lokalną o takiej samej nazwie, jak pole klasy - odwołując się do tego identyfikatora w metodzie, odwołujesz się do zmiennej lokalnej, a nie pola klasy.
Innymi słowy:

void metody::losowanie(int N){
float* tab;
(...)
tab=new float
[N];

Przypisując tutaj dane do tab, alokujesz jedynie tę zmienną lokalną, która przestaje istnieć po opuszczeniu funkcji.
Pole klasy o nazwie tab wciąż jest wskaźnikiem na nic (tj.na NULL albo na jakieś 'śmieci' w pamięci).


edytowany 1x, ostatnio: Patryk27, 2013-02-11 16:22
Gorzej bo tworzy tez zmienna lokalną w main() która się tak nazywa, nie alokuje jej pamięci a potem po niej mazia... - Shalom 2013-02-11 17:43

Pozostało 580 znaków

2013-02-11 18:19
0

musisz stworzyć dynamiczną dwuwymiarową tablicę tzn stworzyć dynamiczną tablicę wskaźników za pomocą operatora new i przypisać każdemu tak jakby 2 wymiar tablicy.

float ** tab = new int*[10];
for(int i = 0; i < 10; i++) {
   tab[i] = new int[10];
}
  • jeszcze wypełnić to jakimiś sensownymi wartościami

Nie odpowiadam na PW z prośbą o pomoc programistyczną.

Pozostało 580 znaków

2013-02-12 16:02
0

Dziękuję wszystkim za odpowiedzi, problem rozwiązany :) program działa jak należy

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0