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

Dynamiczna alokacja pamięci i struktury.

Ostatnio zmodyfikowano 2008-06-18 23:41
Autor Wiadomość
takano
Temat założony przez niniejszego użytkownika
Dynamiczna alokacja pamięci i struktury.
» 2008-06-18 21:41:08
Na początek chcę przywitać się ze wszystkimi użytkownikami forum, przeglądam forum już jakiś czas ucząc się również i na Waszych błędach. Problem którego jednak nie znalazłem, chciałbym przedstawić i prosić o pomoc w jego rozwiązaniu/wyjaśnieniu.
Otóż jestem w trakcie kursu na etapie, wskaźników i dynamicznej alokacji pamięci.
Zamierzam przerobić program napisany w trakcie lekcji z strukturami, używając dynamicznej alokacji pamięci, znaczące fragmenty kody wyglądają następująco:
C/C++
struct rekord
{
    string tytul;
    string autor_imie;
    string autor_nazw;
    string wydawn;
    float cena_pol;
};
A, tu definicja tablicy dynamicznej:
C/C++
int ilosc = 0;
rekord * baza = NULL;
baza = new rekord[ ilosc ];
ilosc++;
baza[ i ].tytul = "potop";
getch();
Kompiler nie zgłasza żadnych błędów, a jednak po uruchomieniu, program wywala się.Z moich spostrzeżeń wynika ,że rozmiar tablicy nie zmienia się.Co ciekawe, gdy zmienię typ danych z rekord na przykładowo int, wszystko jest w porządku. Proszę o wskazówkę i wytknięcie gdzie leży błąd.

Pozdrawiam.



P-854
DejaVu
» 2008-06-18 22:06:54
[tutorial]
C/C++
int ilosc = 0;
rekord * baza = NULL;
baza = new rekord[ ilosc ];
ilosc++;
Twój obecny fragment programu próbuje wykonać coś takiego:
rekord * baza = new rekord[ 0 ];
Co jak nie trudno zauważyć kończy się GPF'em (czyli wywaleniem programu). Dzieje się tak dlatego, ponieważ nie możesz zarezerwować 0 rekordów nowej pamięci. Jeśli chcesz poćwiczyć dynamiczne zarządzanie pamięcią polecam zacząć od listy jednokierunkowej.
struktura do takiej listy wygląda następująco:

C/C++
struct rekord
{
    int jakasLiczba;
    string jakisTekst;
    rekord * nastepny;
};

Początek listy wygląda tak:
rekord * poczatek = NULL;

Za każdym razem gdy będziesz chciał dodać nowy rekord do listy, będziesz musiał przejść przez wszystkie elementy listy. Jeśli lista jest pusta to nowy element stanie się pierwszym elementem. Aby poruszać się po wskaźnikach z danymi praktycznie zawsze (niezaleznie od struktury danych) tworzysz sobie wskaźnik do tego aby gdzieś dotrzeć, czyli:
C/C++
rekord * szukamCzegos = poczatek;
if( szukamCzegos != NULL ) //Jeśli lista nie jest pusta
{
    while( szukamCzegos->nastepny != NULL )
    {
        szukamCzegos = szukamCzegos->nastepny;
    }
    cout << "Ostatni element w kolejce to: " << szukamCzegos->jakisTekst << endl;
}
Poczytaj sobie gdzieś na Internecie o kolejkach :) niestety jeszcze nie zrobiłem kursów ze struktur danych, jednak w te wakacje są szanse, że się takowe pojawią [emot src=":)"/][/tutorial]
P-855
takano
Temat założony przez niniejszego użytkownika
» 2008-06-18 22:30:32
Aha, czyli szedłem w złym kierunku ^^ . Dziękuje za wytłumaczenie mi gdzie leży błąd ,a z rady skorzystam. Pozdrawiam :].
P-856
DejaVu
» 2008-06-18 23:41:22
Tworzenie tablic coraz większych też jest rozwiązaniem, ale ma ono pewne minusy (bo np. dla tablicy 1mln elementów musisz wszystkie przepisać do nowej i usunąć starą) => patrząc z poziomu C++, a nie C.

/edit:
Zarządzanie pamięcią w formie jakiejś struktury danych jest korzystne ale są różne różniaste techniki na to żeby uzyskać albo szybki dostęp do wszystkich elementów, albo szybkie wyszukiwanie albo jeszcze inne cuda :) Generalnie ucząc się programować struktury danych, takie jak: stos, lista, kolejka, drzewo binarne itp. uczysz się posługiwania wskaźnikami, a co za tym idzie uczysz się myśleć jak zarządzać danymi :)
P-857
« 1 »
  Strona 1 z 1