[c++] czym przystopować program w linuxie

addagnieszka
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 21 lis 2007, o 21:06
Płeć: Kobieta
Lokalizacja: Kraków

[c++] czym przystopować program w linuxie

Post autor: addagnieszka »

na przykład co istnieje w zamian za brak system("PAUSE"); albo getchar(); ?
Awatar użytkownika
Calasilyar
Użytkownik
Użytkownik
Posty: 2656
Rejestracja: 2 maja 2006, o 21:42
Płeć: Mężczyzna
Lokalizacja: Wrocław/Sieradz
Podziękował: 29 razy
Pomógł: 410 razy

[c++] czym przystopować program w linuxie

Post autor: Calasilyar »

getchar() wystarcza po co szukać dalej? A tak na serio to nie warto opierać się na wywołaniach systemowych, bo wtedy cierpi przenośność programu...
addagnieszka
Użytkownik
Użytkownik
Posty: 5
Rejestracja: 21 lis 2007, o 21:06
Płeć: Kobieta
Lokalizacja: Kraków

[c++] czym przystopować program w linuxie

Post autor: addagnieszka »

Kod: Zaznacz cały

// 
// File:   newmain.cc
// Author: 
//
// Created on 10 styczeń 2008, 
//

#include <iostream> 
#include <stdlib.h>
#include <string>
#include <fstream>
#include <cstdlib>

//biblioteki

using namespace std;
typedef string TDana;
typedef long int lgi;

class KlasaDrzewo
{
private:
   KlasaDrzewo *wskl,*wskp;   //wskazniki na lewego i prawego syna
   KlasaDrzewo *pop;          //wskaznik na ojca 
public:    
   TDana wartosc;             //wartosc w wezle
   lgi ilosc;              //ilosc elementow tych samych
   lgi index;              //index kolejnych elementow

typedef KlasaDrzewo* drzewo;
 
drzewo korzen;   //wskaznik na korzen
drzewo wezel;    //nowy wezel
void buduj (TDana wartosc, drzewo korzen, lgi index);
void preorder(KlasaDrzewo *wezel, TDana &zmienna, lgi &ile);
void wypisz_max();
friend KlasaDrzewo * inicjalizuj_korzen(KlasaDrzewo *wezel);
};            

TDana zmienna;
lgi ile = 0;

int menu(KlasaDrzewo *wezel);
void stop();

int main(int argc, char** argv) 
{
   KlasaDrzewo *korzen = new KlasaDrzewo;
   KlasaDrzewo *wezel = new KlasaDrzewo;
   korzen = inicjalizuj_korzen(wezel); 
   menu(korzen);
   return (EXIT_SUCCESS);
}//main

int menu(KlasaDrzewo *korzen)
{
   char opzione;
   while(true)
   {
      cout <<"***Menu***\n1) dodaj\n2) wypisz preorder\n0) exit\n"; 
      cin >>opzione;
      switch(opzione)
      {
          case '1':{
              ifstream strum;
              string nazwa_pliku,p;
              cout <<"Podaj sciezke pliku wejsciowego ('0' -> plik domyslny) ";
              cin >>nazwa_pliku;
              if (nazwa_pliku=="0") nazwa_pliku = "plik.txt";
              cout <<nazwa_pliku <<endl;
              strum.open(nazwa_pliku.c_str(), ios::in );
          
             
              if(!strum)
              {
                  cout <<"Nie moge otworzyc takiego pliku\n";
                  system("clr");
                  menu(korzen);
              }
              //----------------------------------------------------------------
              string w;
              //cout <<"wpisz ciag wartosci i '.' aby zakonczyc\n" <<flush;
              while (true)
              {        
                 strum >>w;
                 if(strum.eof()){break;}
                 korzen->index++;
                 korzen->buduj(w, korzen, korzen->index);
              }//while
              stop();
              system("clr");
              break;}
          case '2':{
               korzen->preorder(korzen,zmienna,ile);    
               cout <<"Najczesciej wystapil element\"" 
                       <<zmienna <<"\" " <<ile <<" razy.\n";
               stop();
               system("clr");
               break;}
          case '0':{
              exit(1);}
          default: {system("clr");menu(korzen);}
      }//switch
   }//while
}//menu

void KlasaDrzewo::buduj(TDana wartosc, drzewo korzen, lgi index)
{
   KlasaDrzewo *pop = new KlasaDrzewo;
   KlasaDrzewo *tmp = new KlasaDrzewo;
   KlasaDrzewo *wezel = new KlasaDrzewo;

   tmp=korzen;

   while (tmp!=NULL)
   {
      if (wartosc==tmp->wartosc) 
      {
         tmp=NULL;
         tmp->ilosc++;
      }
      else if (wartosc<tmp->wartosc)
      {
         pop=tmp;
         tmp=tmp->wskl;
         if (tmp==NULL)//dodaj element do drzewa
         {
            wezel = new KlasaDrzewo;//utworz nowy wezel 
            pop->wskl=wezel;//daj na niego wskaznik z poprzednika
            wezel->pop=pop;//daj wskaznik z niego do poprzednika
            wezel->wartosc=wartosc;//wstaw wartosc
            wezel->index=index;
            wezel->wskl=NULL; wezel->wskp=NULL;//ustaw wskazniki na synow
            wezel->ilosc=1;
         }
      }//jesli mniejsza wartosc niz wezel
      else
      {
         pop=tmp;
         tmp=tmp->wskp;
         if (tmp==NULL) //dodaj element do drzewa 
         {
            wezel = new KlasaDrzewo;//utworz nowy wezel
            pop->wskp=wezel;//daj na niego wskaznik z poprzednika
            wezel->pop=pop;//daj wskaznik z niego do poprzednika
            wezel->wartosc=wartosc;//wstaw wartosc
            wezel->index=index;
            wezel->wskl=NULL; wezel->wskp=NULL;//ustaw wskazniki na synow
            wezel->ilosc=1;
         }
      }
   }//while tmp<>0
}//buduj 

void KlasaDrzewo::preorder(KlasaDrzewo *wezel, TDana &zmienna, lgi &ile)
//wypisywanie drzewa w kolejności preorder
{
   KlasaDrzewo *tmp = new KlasaDrzewo;
   tmp=wezel;
   
   if (tmp->wskl!=NULL)//idz do lewego syna 
      preorder(tmp->wskl,zmienna,ile);
   
   if(ile<tmp->ilosc)
       zmienna = tmp->wartosc; 
   
   if (tmp->wskp!=NULL)//idz do prawego syna
      preorder(tmp->wskp,zmienna,ile); 
}//preorder

KlasaDrzewo *inicjalizuj_korzen(KlasaDrzewo *wezel)
//ustaw korzen
{
   wezel->wartosc="";
   wezel->pop=NULL;
   wezel->wskl=NULL; wezel->wskp=NULL;
   wezel->index=0;
   wezel->ilosc = 1;
   return wezel;
}//inicjalizuj_korzen

void stop()
{
    cout <<"Nacisnij dowolny klawisz, aby kontynuowac...\n";
    getchar();
}
program mi się wywala przy

Kod: Zaznacz cały

           while (true)
              {        
                 strum >>w;
                 if(strum.eof()){break;}
                 korzen->index++;
                 korzen->buduj(w, korzen, korzen->index);
              }//while
tym fragmencie - wypisuje komunikat:
Segmentation fault (core dumped)


prosze o pomoc.
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

[c++] czym przystopować program w linuxie

Post autor: Undre »

A sprawdzalas recznie czy metody tej klasy nie generuja jakichs bledow ? Segmentation fault pojawia sie bodajze przy blednym odnoszeniu sie do pamieci ( typu wyjechanie poza tablice indeksem )
ODPOWIEDZ