Strona 1 z 3

[+] tablice dynamiczne c++

: 10 stycznia 2008, 16:21
autor: skotik87
Witam, mam problem z tablicami dynamicznymi. Ciag dalszy mojego programu i teraz go musze przerabiac. chce zrobic cos takiego: wczytuje kilka razy dane i chce zeby byly zapamietywane w pamieci (rozszerzenie tablicy dynamicznej) . i tu jest problem nie wiem jak to zrobic zeby to dzialalo. Potrzebne mi to bo chce pozniej dorobic funkcje zebym mogl kiedy chce wybrac opcje zapis i wtedy wszystko co jest w tablicy zapisuje do pliku.

Mniej wiecej tego typu funcja ktora mi wczytuje dane
rekord *nowy_rekord(int n)
{
rekord *rek = new rekord[n];
cout << "Podaj dane :\n";
for(int i=0;i<n;++i)
{
cout << "imie: ";
cin >> rek.imie;
cout << "nazwisko: ";
cin >> rek.nazwisko;
cout << "telefon: ";
cin >> rek.telefon;
}
return rek;
}


Probowalem to zrobic z jakas pomocnicza tablica ale nie wyszlo mi to. Teraz czytam o realloc, moze cos z tego wyjdzie :/

Za wszelkie podpowiedzi dzieki.
Pozdrawiam skotik87

: 10 stycznia 2008, 16:36
autor: mlyczek
Jedno pytanie: czy chcesz tworzyć dynamicznie za każdym razem nową tablicę i do niej wczytywać dane, czy masz jedną globalną i chcesz tylko zwiększyć jej rozmiar i w nowe miejsce wczytać dane? Bo do tego pierwszego realloc Ci się nie przyda (a tak zrozumiałem to co napisałeś).

: 10 stycznia 2008, 16:57
autor: skotik87
Najlepiej chyba by bylo zwiekszac jej rozmiar, zreszta mysle ze kazde rozwiazanie bedzie dobre bo mnie zaczyna czas gonic. Wytlumacze na przykladzie o co mi dokladnie chodzi. Zalozmy ze wczytalem dane osoby, pozniej wpisalem dane dwoch osob i stwierdzilem ze sobie teraz to wszystko zapisze do pliku. naciskam klawisz ktory odpowiada za funkcje zapisu i zapisuje. Wczesniej mialem zeby odrazu zapisywalo dane do pliku, ale kolesiowi na uczelni to nie pasuje :/

: 10 stycznia 2008, 17:16
autor: mlyczek
tylko, że funkcja, którą podałeś w pierwszym poście nie zmieni Ci rozmiaru tablicy, bo tworzy nową. Nie wiem, co poza opisanymi rzeczami (czytanie danych i pisanie do plików) ma ten program jeszcze robić, ale jeśli to nie przeszkodzi, to wygodniej i łatwiej byłoby zrobić po prostu listę jedno- (lub w razie potrzeby dwu-) stronną. Dane (imię, nazwisko, itd.) trzymać w jakiejś strukturze i tylko tworzyć nową strukturę, wczytywać do niej dane i zapisywać wskaźnik na nową strukturę w ostatniej z listy.

Można też zrobić globalną tablicę i zmieniać jej rozmiar realloc'em, ale wtedy w/w funkcja musiałaby przyjmować jako parametr wskaźnik na ta tablicę (chyba, że funkcja jest definiowana w tym samym module co deklarowana tablica). Musiałbyś też gdzieś trzymać rozmiar tablicy i najprawdopodobniej też przekazywać go do funkcji.

Jeśli wykładowca/ćwiczeniowiec nie zabronił, to możesz też użyć vector'a z STL'a, on sam się rozszerza, Ty tylko dodajesz elementy <- to jest najprostsze w implementacji.

: 10 stycznia 2008, 18:02
autor: skotik87
sprobuje pokombinowac cos z dodatkowa tablica, ewentualnie poszukam cos konkretnego o vectorze. o listach nie mam zielonego pojecia wiec nie probuje bo szkoda mi czasu. moze cos zrobie sensownego

: 10 stycznia 2008, 18:22
autor: grzesiek
w STL są klasy tablic dowolnego typu oparte na template i z przeciążonym operatorem indeksowania[] ;-) .... tablice zwiększają się automatycznie co 10 elementów jak dobrze pamiętam - to takie gotowe rozwiązanie a jak byś chciał sam się w to bawić to albo trzeba zrobić jakąś strukturę albo do tablicy wskaźników dodawać wskaźniki z dynamicznie zaalokowaną strukturą, polecam przestudiowanie źródeł GLib i klasę/strukturę GArray :-)

: 10 stycznia 2008, 18:36
autor: skotik87
mi trzeba latwe i szybkie rozwiazanie tego problemu ;p nie mam tyle czasu zeby kombinowac az tak bardzo z nowymi bibliotekami.

: 10 stycznia 2008, 18:39
autor: salmon
skotik87 pisze:mi trzeba latwe i szybkie rozwiazanie tego problemu

Kod: Zaznacz cały

#include <vector>
std::vector <rekord> rek]

Tutaj opis: [url]http://www.cplusplus.com/reference/stl/vector/[/url]

: 10 stycznia 2008, 18:52
autor: grzesiek
te biblioteki odwalą za ciebie całą robotę, to właśnie bez nich będziesz siedział w bugach ;) i czas tracił
poza tym nie są takie nowe mają ponad 20 lat ;)

: 10 stycznia 2008, 18:59
autor: skotik87
[quote="grzesiek"]te biblioteki odwalą za ciebie całą robotę, to właśnie bez nich będziesz siedział w bugach ]

heh wlasnie wzialem sie za ta klase, sprobuje cos napisac i wrzuce na forum, zobaczycie czy dobrze. poki co to opornie mi idzie, chyba za duzo na dzisiaj tego wszystkiego.