Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Segmentation Fault, po zbudowaniu programu

Ostatnio zmodyfikowano 2015-11-27 12:29
Autor Wiadomość
piotrmaceluch
Temat założony przez niniejszego użytkownika
Segmentation Fault, po zbudowaniu programu
» 2015-11-25 17:31:16
Po zbudowaniu programu uruchamia się, wypisuje "podaj ilość boków" a następnie (po wpisaniu ich liczby) pokazuje się segmentation fault. Co mogę dodatkowo udoskonalić w kodzie?

mój kod:
C/C++
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

class figura
{
    double pole = 0;
    double obwod = 0;
    double * tablica = new double[ ile ];
public:
    static int ileObiektow;
    int ile;
    figura( int ); //konstruktor z argumentem calkowitym
    figura(); //bezargumentowy konstruktor
    figura( double k );
    int licznik = 0; //z argumentem typu double
    void setBoki();
    void getBoki();
    figura * fig = new figura[ ileObiektow ]; //tablica zliczajaca ilosc stworzonych obiektow
    ~figura();
};

int main()
{
    int pomidor;
    cout << "podaj ilosc bokow: ";
    cin >> pomidor;
    figura nowa( pomidor ); //stworzenie obiektu klasy, argumentem jest ilosc bokow
    figura nowa1();
    figura nowa2( 3.42 );
    nowa.setBoki();
    nowa.getBoki();
    cout << endl << "Ilosc stworzonych obiektow to: " << figura::ileObiektow; //licznik stworzonych obiektow
    return 0;
}

int figura::ileObiektow = 0;

figura::figura( int i )
{
    ile = i;
    ileObiektow++;
}
figura::figura()
{
    pole = 1;
    obwod = 4;
    ile = 4;
    tablica[ 0 ] = 1;
    tablica[ 1 ] = 1;
    tablica[ 2 ] = 1;
    tablica[ 3 ] = 1;
    ileObiektow++;
}
figura::figura( double promien )
{
    promien = tablica[ 0 ];
    pole = 3.14 * promien * promien;
    obwod = 2 * 3.14 * promien;
    ile = 1;
   
    ileObiektow++;
}
void figura::setBoki()
{
    int dlugosc;
    double pol = 0;
   
    for( licznik = 0; licznik < ile; licznik++ )
    {
        cout << "Podaj dlugosc boku nr " << licznik + 1 << ": ";
        cin >> dlugosc;
        tablica[ licznik ] = dlugosc;
        obwod += dlugosc;
    }
    // dlugosci bokow pozwalaja na skonstruowanie trojkata ->
    if( ile == 3 &&( tablica[ 0 ] + tablica[ 1 ] > tablica[ 2 ] && tablica[ 0 ] + tablica[ 2 ] > tablica[ 1 ] && tablica[ 1 ] + tablica[ 2 ] > tablica[ 0 ] ) )
    {
        cout << "Dlugosci bokow spelniaja warunek" << endl;
        pol =(( tablica[ 0 ] + tablica[ 1 ] + tablica[ 2 ] ) / 2 );
        pole = sqrt( pol *( pol - tablica[ 0 ] ) *( pol - tablica[ 1 ] ) *( pol - tablica[ 2 ] ) );
        cout << endl << "Obwod=" << obwod;
        cout << endl << "Pole=" << pole;
    } // jezeli dlugosci bokow NIE pozwalaja na skonstruowanie trojkata ->
    if( ile == 3 &&( tablica[ 0 ] + tablica[ 1 ] < tablica[ 2 ] || tablica[ 0 ] + tablica[ 2 ] < tablica[ 1 ] || tablica[ 1 ] + tablica[ 2 ] < tablica[ 0 ] ) )
    {
        cout << endl << "Dlugosci bokow nieprawidlowe (W kazdym trojkacie suma dlugosci dwoch dowolnych bokow jest wieksza od dlugossci trzeciego boku.)";
    }
}
void figura::getBoki()
{
    licznik = 0;
    cout << endl << "Dlugosci podanych bokow to odpowiednio: ";
    for( licznik = 0; licznik < ile; licznik++ )
    {
        cout << tablica[ licznik ] << " ";
    }
}
figura::~figura()
{
    ileObiektow--;
}
P-140789
Monika90
» 2015-11-25 17:44:04
Niestety, w momencie w którym to
double * tablica = new double[ ile ];
 zostanie wykonane, składowa ile nie jest jeszcze zainicjalizowana, to znaczy zawiera śmieci.

Podobnie z tym
figura * fig = new figura[ ileObiektow ];
, tylko że tutaj ileObiektow będzie równe 0 za pierwszym razem - nie wiem po co w ogóle ta tablica.
P-140790
piotrmaceluch
Temat założony przez niniejszego użytkownika
Jak to poprawić?
» 2015-11-25 18:16:14
Moim celem jest, aby w zależności od ilości boków(podane przez użytkownika w MAIN), konstruktor wypełniał odpowiednio tablicę.
konstruktor bezparametrowy- ma wypełnić tak, by stworzyć kwadrat jednostkowy
konstruktor double ma stworzyć okrąg/koło
konstruktor z jednym parametrem ma po prostu stworzyć obiekt o podanej przez użytkownika ilości boków.
Nie chcę, by ktoś za mnie to zrobił. Proszę po prostu o wskazówki :)

Rozumiem oczywiście o co chodzi z wypełnieniem tablicy/zainicjowaniem i ustaleniem jej wartości ale chyba już się pogubiłem jeżeli chodzi o zakres widoczności zmiennych między main-klasą-konstruktorami.
P-140793
Monika90
» 2015-11-25 18:57:47
Chyba najprostsze do zrozumienia będzie przeniesienie alokacji do ciała konstruktora, czyli zaraz po przypisaniu do ile dajesz
tablica = new double[ ile ];
 w każdym konstruktorze.

P-140798
piotrmaceluch
Temat założony przez niniejszego użytkownika
Dziękuję :)
» 2015-11-26 23:14:27
Wczoraj dałem sobie spokój.
Dzisiaj ze świeżym podejściem i przeanalizowaniem problemu zrozumiałem metodę którą mi zaproponowałaś :)

Czy jest jakiś jeszcze sposób sterowania, który konstruktor ma wypełnić mi pola klasy?
P-140887
carlosmay
» 2015-11-27 12:29:00
Konstruktory wywołują się na podstawie listy argumentów (przeciążanie).
Dla dynamicznej alokacji pamięci może być konieczne napisanie
konstruktora kopiującego.
P-140904
« 1 »
  Strona 1 z 1