Tablice dynamiczne.

0

Wiele jest takich tematów , ale nie zauważyłem podobnego. Mianowicie skorzystałem z porad na internecie i napisałem taki kod :

cout<<"Podaj ilosc miejsc parkingu...:";
      cin>>a;
      cout<<endl;
      cout<<"Podaj ilosc rzedow parkingu...:";
      cin>>b;
      cout<<endl;
      tab = new int*[a];
      for ( int i = 0; i < a; i++ )
      {tab[i] = new int [b];}
      system("cls");

Lecz kompilator nie wskazuje błędu w kodzie , podczas gdy w czasie uruchomienia pliku wykonywalnego , po wpisaniu danych i wywołaniu funkcji obrazującej zawartość tablicy występuje crash aplikacji.
Co zrobiłem źle ?
Nadmienie jeszcze tylko , że korzystam z kompilatora Codeblocks 10.05 , a includowałem takie biblioteki :

#include "parking.h"
#include <iostream>
//#include <time.h>
#include <cstdlib>
#include <fstream>
0

3 sek w google:
int **tablica = new int * [n];
for (int j=0; j<n; j++){
tablica[j] = new int[n];
}
pokaż jak zdeklarowałeś zmienną tab, powinno być int **tab

0

Jest to funkcja w klasie więc plik definicji klasy wygląda tak :

#ifndef parking_h
#define parking_h

class parking
{private:
    int** tab;
    int a,b,c;
public:
 //  inline void losuj();
   inline void sprawdz();
   inline void rysuj();
   inline void sprawdz_miejsce();
   inline void stworz_bilet();
   inline void stworz_tablice();
   inline void zczytaj();
};
#endif
0

@Szaszor to pokaż tą funkcję "obrazującej zawartość tablicy".
Bo zachowujesz się jak pacjent z kawału, który skarży się na nogę zaś lekarzowi pokazuje rękę.

0
for (int i=0;i<a;i++)
         {for (int j=0;j<b;j++)
          {cout<<"Miejsce   "<<i+1<<" w rzedzie  "<<j+1<<"Jest :";
           if(tab[i][j]==1)
            cout<<"Zajete"<<endl;
             else
              cout<<"Wolne"<<endl;
              }
          }
0

Tu też nie widzę błędu.
Trzeba jednak pokazać całość.

0

Plik deklaracji :

#include "parking.h"
#include <iostream>
//#include <time.h>
#include <cstdlib>
#include <fstream>

using namespace std;



   void parking::sprawdz()
    {


        for (int i=0;i<a;i++)
         {for (int j=0;j<b;j++)
          {cout<<"Miejsce   "<<i+1<<" w rzedzie  "<<j+1<<"Jest :";
           if(tab[i][j]==1)
            cout<<"Zajete"<<endl;
             else
              cout<<"Wolne"<<endl;
              }
          }


    };
    void parking::rysuj()
    {
         int i,j;
         string tabX[a][b];
        { for (i=0;i<a;i++)
         {for (j=0;j<b;j++)
           if (tab[i][j]==1)
            tabX[i][j]="X";
            else
            tabX[i][j]="O";
            }
           }
        cout<<"Miejsce";
        for (i=0;i<a;i++)
         {
           cout<<" ["<<i+1<<"]";
         }
         cout<<endl;
              for (i=0;i<b;i++)
               {cout<<"Rzad_"<<i+1<<" ";
                 for (j=0;j<a;j++)
                  {cout<<" ["<<tabX[j][i]<<"]";}
                cout<<endl;}
        cout<<endl
            <<endl
            <<endl;
        cout<<"Legenda : X - zajete miejsce | O - wolne miejsce"<<endl;


    };
    void parking::sprawdz_miejsce()
    {   int x,y,;
        cout<<"Podaj numer rzedu"<<endl;
        cin>>y;
        cout<<"Podaj numer miejsca"<<endl;
        cin>>x;
        cout<<"Miejsce zapytania jest :";
        if (tab[x][y]==1)
        cout<<"Zajete"<<endl;
        else
        cout<<"Wolne"<<endl;
    };
    void parking::stworz_tablice()
    {
      cout<<"Podaj ilosc miejsc parkingu...:";
      cin>>a;
      cout<<endl;
      cout<<"Podaj ilosc rzedow parkingu...:";
      cin>>b;
      cout<<endl;
      tab = new int*[a];
      for ( int i = 0; i < a; i++ )
      {tab[i] = new int [b];}
      system("cls");

    };
    void parking::stworz_bilet()
    { int numer_klienta;
      string imie,nazwisko,odp,marka,kolor;
      double kwota,czas;
      int x,y,wpis;
      long long int pesel;
      cout<<"Witaj w kreatorze zakupu biletu!\n";
      cout<<"Podaj swoje Imie....";cin>>imie;cout<<"\n";
      cout<<"Podaj swoje Nazwisko....";cin>>nazwisko;cout<<"\n";
      cout<<"Witaj "<<imie<<"_"<<nazwisko;cout<<"\n";
      cout<<"Chcesz w pierwszej kolejnosci sprawdzic cennik czy jestes juz z nim zaznajomiony ?(T/N)\n";
      cin>>odp;
      if (odp=="t" || odp=="T")
    { system("cls");
      cout<<"CENNIK PARKINGOWY\n";
      cout<<"Godzina - 5zl\n";
      cout<<"Pol godziny - 3 zl\n";
      cout<<"UWAGA ! (Pol godziny oznaczamy jako 0,5|Nie da sie wziasc ponizej pol godziny i powyzej do godziny)\n";
      cout<<"\n";
      cout<<"\n";
      cout<<"Podaj ilosc czasu na jaka chcesz pozostawic swoj samochod u Nas...(W godzinach)\n";cin>>czas;
        if (czas==0.5)
        kwota=3;
        else
        kwota=czas*5;

      cout<<"Czy zgadasz sie na oplate w wysokosci :"<<kwota<<"zl\n";
      cin>>odp;
      if (odp=="t" || odp=="T")
      {cout<<"Nalezy wpisac kolejne dane gdyz mieszkamy w Rosji Radzieckiej i jestes monitorowany :)\n";
      cout<<"Podaj marke swojego samochodu\n";
      cin>>marka;
      cout<<"Podaj Kolor swojego samochodu\n";
      cin>>kolor;
      cout<<"Podaj PESEL\n";
      cin>>pesel;
      cout<<"W ktorym rzedzie zaparkujesz ?\n";
      cin>>y;
      cout<<"Na ktorym miejscu zaparkujesz ?\n";
      cin>>x;
      cout<<"DZIEKUJEMY ! Program zaksiegowal Cie \n";}
       else
       {cout<<"Oplata nie przyjeta program zakonczony";
       wpis=0;}
      }else
      system("cls");
      cout<<"UWAGA ! (Pol godziny oznaczamy jako 0,5|Nie da sie wziasc ponizej pol godziny i powyzej do godziny)\n";
      cout<<"Podaj ilosc czasu na jaka chcesz pozostawic swoj samochod u Nas...(W godzinach)\n";cin>>czas;
      if (czas==0.5)
        kwota=3;
        else
        kwota=czas*5;
      cout<<"Czy zgadasz sie na oplate w wysokosci :"<<kwota<<"zl\n";
      cin>>odp;
      if (odp=="t" || odp=="T")
      {cout<<"Nalezy wpisac kolejne dane gdyz mieszkamy w Rosji Radzieckiej i jestes monitorowany :)\n";
      cout<<"Podaj marke swojego samochodu\n";
      cin>>marka;
      cout<<"Podaj Kolor swojego samochodu\n";
      cin>>kolor;
      cout<<"Podaj PESEL\n";
      cin>>pesel;
      cout<<"W ktorym rzedzie zaparkujesz ?\n";
      cin>>y;
      cout<<"Na ktorym miejscu zaparkujesz ?\n";
      cin>>x;
      cout<<"DZIEKUJEMY ! Program zaksiegowal Cie \n";}
      else
       {cout<<"Oplata nie przyjeta program zakonczony";
       wpis=0;}
       if (wpis!=0)
      {numer_klienta+=1;
      tab[x][y]=1;
      fstream plik;
      plik.open("baza_danych.txt", ios::out);
      plik<<"Klient numer:["<<numer_klienta<<"]\n";
      plik<<"Imie i Nazwisko:["<<imie<<"|"<<nazwisko<<"]\n";
      plik<<"Kwota/czas:["<<kwota<<"]/["<<czas<<"]\n";
      plik<<"Marka :["<<marka<<"]\n";
      plik<<"Kolor :["<<kolor<<"]\n";
      plik<<"Pesel :["<<pesel<<"]\n";
      plik<<"Rzad :["<<y<<"]Miejsce:["<<x<<"]\n";
      plik<<"-----------------------------------------------";
      plik.close();}


    };
    void parking::zczytaj()
    {fstream plik1;
     string dane;
     plik1.open("baza_danych.txt",ios::in);
     do{

     getline(plik1,dane);
     cout<<dane;
     }while(!plik1.eof());
    };
   /* void parking::losuj()
    {srand(time(NULL));
     for (int a=0;a<10;a++)
          { for ( int b=0;b<2;b++)
             { for (int c=0;c<2;c++)
                 {tab[a][b][c]= rand () % 2;
                  }}}
   };*/

Plik główny (int main)

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <fstream>
using namespace std;
#include "parking.h"
#include "parking.cpp"
void menu()
   {//srand (time(NULL));
    //parking p;
    //a.losuj();
    //p.stworz_tablice();
    parking p;
    int wybor;
    string powr;
    cout<<" --------------------"<<endl;
    cout<<"["<< " WITAMY NA PARKINGU "<<"]"<<"             PROGRAM OPRACOWANY PRZEZ:"<<endl;
    cout<<" --------------------"<<"                       M.D|M.P|KRZYSIEK|BUKOS"<<endl;
    cout<<"Co chcialbys zrobic drogi kliencie? "<<endl
        <<"1.Sprawdzic wszystkie miejsca wyswietlajac liste miejsc z danego pietra."<<endl
        <<"2.Sprawdzic wszystkie miejsca wyswietlajac graficznie liste miejsc z danego pietra."<<endl
        <<"3.Sprawdzi konkretne miejsce."<<endl
        <<"4.Wyjscie z programu."<<endl
        <<"5.Zloz zamowienie."<<endl
        <<"6.Wczytaj baze danych klientow."<<endl;

    cin>>wybor;
    switch(wybor)
    {
        case 1: system("cls");
                p.sprawdz();

                cout<<"Powrot do menu ?(T-tak|N-nie)"<<endl;
                cin>>powr;
                    if (powr=="t")
                    {system("cls");
                     menu();}
                     else
                     break;
        case 2: system("cls");
                p.rysuj();
                cout<<"Powrot do menu ?(T-tak|N-nie)"<<endl;
                cin>>powr;
                    if (powr=="t")
                    {system("cls");
                     menu();}
                     else
                     break;
        case 3: system("cls");
                p.sprawdz_miejsce();
                    cout<<"Powrot do menu ?(T-tak|N-nie)"<<endl;
                    cin>>powr;
                    if (powr=="t")
                    {system("cls");
                     menu();}
                     else
                     break;
        case 4: system("cls");
                break;
        case 5: system("cls");
                p.stworz_bilet();
                    cout<<"Powrot do menu ?(T-tak|N-nie)"<<endl;
                    cin>>powr;
                    if (powr=="t")
                    {system("cls");
                     menu();}
                     else
                     break;
        case 6: system("cls");
                p.zczytaj();
                    cout<<"Powrot do menu ?(T-tak|N-nie)"<<endl;
                    cin>>powr;
                    if (powr=="t")
                    {system("cls");
                     menu();}
                     else
                     break;
        default:system("cls");
                cout<<"Niema takiej opcji ziomek."<<endl;
                break;
    };

   }
int main()
{   parking p;
    p.stworz_tablice();
    menu();
}
0

Problemem jest to że parking p; zadeklarowany w main nie jest tym samym parking p; zadeklarowanym w menu();
Więc ten w menu() nie jest stworzony.

  1. Wywal parking p; z main()
  2. Przenieś p.stworz_tablice(); do menu()

Generalnie, z tego co widzę, to nie zrozumiałeś idei klasy.
Ta klasa powinna wyglądać mniej więcej tak:

class parking
  {
   private:
   bool **zajetosc;
   unsigned dlugosc,szerokosc;
   public:
   parking(unsigned dlugosc,unsigned szerokosc); // tu tworzymy tablicę
   ~parking(); // tu zwalniamy tablicę
   bool sprawdz_miejsce(unsigned miejsce,unsigned rzad);
   bool rezerwuj_miejsce(unsigned miejsce,unsigned rzad);
   bool zwolnij_miejsce(unsigned miejsce,unsigned rzad);
  };

Wszystkie wczytywania z ekranu oraz wypisywania na ekran powinni się znaleźć w funkcji menu();
Ewentualnie dodajesz bilety oraz historie biletów

class bilet
  {
   private:
   char *nazwisko,*imie,*pesel,*marka; // oraz inne pola
   bilet *poprzedni_bilet;
   public:
   bilet(const char *nazwisko,const char*imie,const char*pesel,const char*marka); // tu tworzysz kopie napisów
   ~bilet(); //tu zwalniasz napisy
  };
class historia
  {
   private:
   bilet *ostatni_bilet;
   bool zajete;
   public:
   historia():ostatni_bilet(0),zajete(false) {}
   ~historia(); // tu zwalniasz listę biletów
  };

oraz w klasie parking zamieniasz bool na historia

0

Dziękuję za pomoc to rozwiązuje problem .. taki szczegół eh :) Teraz tylko muszę wykombinować jak to zrobić żeby tworzenie odbywało się pojedyńczo ;)

// Zastanawiałem się nad takim rozwiązaniem , tyle że po dziale "wskaźniki" 1 tomu "Symfonii" Grębosza jakoś ciężko jest mi tę wiedzę użyć . Poza tym to technikum inf. a zadanie myślę , że postawione dość wysoko , bo osoby przedstawione jako pomocnicy nic nie zrobiły , więc robiłem sam. Oddam tę moją wersję tam z drobnym ifem żeby mi się nie powtarzało bo nie mam już za bardzo czasu na zmiany , ale posiedzę jeszcze nad Twoją propozycją bo rzeczywiście w książce nie ma pokazanego użycia wskaźników w nieco bardziej rozbudowanych programach . Więc dziękuję po raz drugi bo chciałbym zostać programistą :)

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