Segmentation Fault (core dumped)

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ść.

0

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

Użyj debuggera?

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

0

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

0

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

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

0

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).

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
0

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

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