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

Problem z dynamiczna tablica danych.

Ostatnio zmodyfikowano 2013-01-12 22:55
Autor Wiadomość
maze
Temat założony przez niniejszego użytkownika
Problem z dynamiczna tablica danych.
» 2013-01-12 22:13:50
Witam,


Napisalem prosta baze danych z uzyciem statycznej tablicy i tu sobie poradzilem, jednak kiedy proboje teraz napiac go z wykorzystaniem dynamicznej tablicy, ktorej wielkosc jest okreslana przez ilosc elementow jakie uzytkownik chce dodac do bazy.
I tu mam jakis problem, gdyz program mimo ze sie kompiluje to wyrzuca blad podczas proby dodania nowego elementu do bazy.

Z uwagi na fakt, ze chcialem aby baza po otwarciu miala juz kilka predefiniowanych elementow, ktore mozemy wyswietlic, zapisalem kilka do statycznej tablicy. A kiedy uzytkownik chce dodac nowe elementy, to wtedy alokuje pamiec dla tablicy dynamicznej, jednoczenie kopiujac do niej zawartos tej statycznej.  Do osblugi tego uzylem zmienna 'pamiec', ktora przy wartosci =1 informuje ze mamy korzystac juz z nowo utworzonej tablicy dynamicznej.


Bede bardzo wdzieczny, jezeli ktos pomoze mi zlokalizowac blad jaki robie.


*) Cala operacja przypisania pamieci oraz kopiowania jest wykonywana w "CASE 1" petli switch.


C/C++
//Przypisanie struktur------------------------------
#include <iostream>
#include <string>
using namespace std;

//struktura bazy samochodow autokomisu

struct DDT
{
    short id;
    string marka;
    string model;
    int rocznik;
    double cena;
   
};



void wczytaj_dane( DDT * tablica, int n, int poz );
void wyswietl( DDT * tablica, int n, bool pozycja );
int szukaj( DDT * tablica, int * wyniki, int ilosc );
void edytuj( DDT * tablica, int n );

int main()
{
    int ilosc = NULL, zmiana = NULL, poz = 3, pamiec = 0;
    //DDT *tablica = new DDT[30];
    //if (tablica==NULL) cout << "Blad przypisania pamieci"<<endl;
   
    //Wstepna Baza
   
    DDT * tablica = { 0 };
    DDT baza[ 3 ] = { { 1, "Ford", "Mondeo", 2001, 16000 },
        { 2, "Toyota", "Camry", 1998, 9000 },
        { 3, "Opel", "Astra", 2003, 18000 } };
   
   
   
    int wyniki[ 10 ] = { 0 };
   
    do {
        cout << endl << "Witaj w Auto Komisie" << endl << endl;
        cout << "Obecnie w bazie " << poz << " pozycji" << endl << endl;
        cout << "Wybierz opcje:" << endl << endl;
        cout << "1)  Dodaj pojazdy do bazy" << endl;
        cout << "2)  Wyswiel zawartosc bazy" << endl;
        cout << "3)  Znajdz samochod" << endl;
        cout << "4)  Edytuj baze" << endl << endl;
        cout << "5)  Zakoncz program" << endl << endl;
        cin >> zmiana;
       
        if( zmiana == 5 ) break;
       
        if(( zmiana == 1 ) ||( zmiana == 2 ) ||( zmiana == 3 ) ||( zmiana == 4 ) )
        {
           
           
            switch( zmiana )
            {
            case 1:
                do
                {
                    cout << "Ile pojazdow chcesz wprowadzic do bazy?" << endl;
                    cin >> ilosc;
                    if(( ilosc + poz ) > 30 ) { cout << "Zbyt duza ilosc elementow"; ilosc = NULL; }
                    int rozmiar = ilosc + poz;
                   
                    if( DDT * tablica = new DDT[ rozmiar ] ) cout << "Przydzielono pamiec"; pamiec = 1;
                    //if (tablica==NULL) cout << "Blad przypisania pamieci"<<endl;
                   
                    for( int i = 0; i < poz; i++ )
                    {
                        tablica[ i ].marka = baza[ i ].marka;
                        tablica[ i ].model = baza[ i ].model;
                        tablica[ i ].rocznik = baza[ i ].rocznik;
                        tablica[ i ].cena = baza[ i ].cena;
                    }
                   
                } while( ilosc == 0 );
               
               
                //wczytaj_dane(tablica, ilosc, poz);
                //poz = poz + ilosc;
               
                break;
               
               
               
               
            case 2: if( poz == 0 ) { cout << "Najpierw wprowadz dane pojazdow" << endl; break; }
                if( pamiec == 0 ) wyswietl( baza, poz, 0 );
                else wyswietl( tablica, poz, 0 );
               
                break;
               
               
               
            case 3: { if( ilosc == 0 ) { cout << "Najpierw wprowadz dane pojazdow" << endl; break; }
                    int buf = NULL, temp = NULL;
                    temp = szukaj( tablica, wyniki, poz );
                    for( int i = 0; i < temp; i++ )
                    {
                        buf = wyniki[ i ];
                        cout << endl << "###########Wyniki Wyszukiwania###########" << endl;
                        cout << tablica[ buf ].marka << "::" << tablica[ buf ].model << "::" << tablica[ buf ].rocznik << "::" << tablica[ buf ].cena << endl;
                        cout << "###########*******************###########" << endl;
                    }
                    break; }
               
            case 4: //if(pamiec==0) edytuj(baza, poz);
                edytuj( tablica, poz );
                break;
               
            }
        }
    } while( zmiana != 5 );
   
    cin.get();
    return 0;
}
//****************************************************************

void wczytaj_dane( DDT * tablica, int n, int poz )
{
    for( int i = poz; i < n + poz; i++ )
    {
        cout << endl << "Wprowadz dane " << i + 1 << "-go samochodu";
        cout << endl << "Marka: "; cin >> tablica[ i ].marka;
        cout << endl << "Model: "; cin >> tablica[ i ].model;
        cout << endl << "Rocznik: "; cin >> tablica[ i ].rocznik;
        cout << endl << "Cena: "; cin >> tablica[ i ].cena;
       
    }
    ;
}

void wyswietl( DDT * tablica, int n, bool pozycja ) //jesli argument 'pozycja' rowna sie jeden, wyswietlamy tylko element z pozycji n, w przeciwnym razie wyswietlamy cala tablice
{
    cout << endl << "###############BAZA###############" << endl;
   
    if( pozycja == 1 ) { cout << tablica[ n ].id << "::" << tablica[ n ].marka << "::" << tablica[ n ].model << "::";
        cout << tablica[ n ].rocznik << "r.::" << tablica[ n ].cena << " zl" << endl; }
   
    else
    for( int i = 0; i < n; i++ )
   
    {
        cout << tablica[ i ].id << "::" << tablica[ i ].marka << "::" << tablica[ i ].model << "::";
        cout << tablica[ i ].rocznik << "r.::" << tablica[ i ].cena << " zl" << endl;
    }
    cout << "##################################" << endl;
   
}

void edytuj( DDT * tablica, int n )
{
    int edit;
    wyswietl( tablica, n, 0 );
    cout << endl << "Ktora pozycje chcesz wyedytowac?";
    cin >> edit;
    cout << endl << "Podaj marke: "; cin >> tablica[ edit ].marka;
    cout << endl << "Podaj model: "; cin >> tablica[ edit ].model;
    cout << endl << "Podaj rocznik: "; cin >> tablica[ edit ].rocznik;
    cout << endl << "Podaj cene: "; cin >> tablica[ edit ].cena;
    wyswietl( tablica, n, 0 );
}

int szukaj( DDT * tablica, int * wyniki, int n )
{
    string klucz; double kwota; int poz = NULL;
    cout << "Wprowadz szukane kryteria:" << endl;
    cout << "Jakiej marki poszukujesz?: ";
    cin >> klucz;
    cout << endl << "Podaj cene maksymalna: ";
    cin >> kwota;
   
    for( int i = 0; i < n; i++ )
    {
        if(( tablica[ i ].marka == klucz ) &&( tablica[ i ].cena <= kwota ) ) { wyniki[ poz ] = i; poz++; };
       
    }
    return( poz );
}
P-73742
Savail
» 2013-01-12 22:38:02
Tutaj:
if( DDT * tablica = new DDT[ rozmiar ] ) cout << "Przydzielono pamiec";
 zauważ że wskaźnik tworzysz w instrukcji warunkowej a więc po wyjściu z niej nie masz już dostępu do niego a używasz wyżej zadeklarowanej zmiennej o tej samej nazwie. Chociaż wydaje mi się, że omyłkowo tworzysz tu nową zmienną zamiast przydzielić pamięć do tej wyżej.
P-73744
maze
Temat założony przez niniejszego użytkownika
» 2013-01-12 22:55:29
faktycznie nie dosc, ze wewnatrz funkcji, to jescze to nie bylo przypisanie tylko ponowna definicja.  Dzieki teraz dziala!
P-73750
« 1 »
  Strona 1 z 1