Segmentation Fault, po zbudowaniu programu
Ostatnio zmodyfikowano 2015-11-27 12:29
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: #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 ); figura(); figura( double k ); int licznik = 0; void setBoki(); void getBoki(); figura * fig = new figura[ ileObiektow ]; ~figura(); };
int main() { int pomidor; cout << "podaj ilosc bokow: "; cin >> pomidor; figura nowa( pomidor ); figura nowa1(); figura nowa2( 3.42 ); nowa.setBoki(); nowa.getBoki(); cout << endl << "Ilosc stworzonych obiektow to: " << figura::ileObiektow; 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; } 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; } 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--; }
|
|
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. |
|
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. |
|
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. |
|
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? |
|
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. |
|
« 1 » |