Strona 2 z 2
: 08 grudnia 2007, 20:17
autor: skotik87
Dzieki panowie, mysle ze kazdemu nalezy sie po plusiku za pomoc. Poki co problem rozwiazany
[ Dodano: 2007-12-09, 14:43 ]
Panowie mam do was jeszcze jedno pytanie. Zrobilem funkcje wypisujaca i wypisuje wszystko co wprowadzilem wczesniej oprocz stringow. A dokladnie tego:
Kod: Zaznacz cały
void wypisz(laptop *lap, int n)
{
for (int i=0; i<n; i++)
{
cout<<"Marka: "<<lap[i].marka<<endl;
cout<<"Model: "<<lap[i].model<<endl;
reszty nie pisze bo dziala
teraz pytanie co przegapilem??
: 11 grudnia 2007, 13:11
autor: Immortal
Jeśli masz napisane wcześniej tak:
To masz tylko wskaźnik do elementu typu laptop. Jeśli zaś tak:
To powinno działać. Ale jeśli chcesz dynamicznie to musisz zrobić tak :
Kod: Zaznacz cały
laptop *lap = new laptop[wczytany_rozmiar] ; // o ile pamiętam tak to działa ;)
I wtedy działa to jak zwykła tablica. Ale jeśli chcesz tablicę dynamiczną wskaźników to będzie tak :
Kod: Zaznacz cały
laptop **lap = new *laptop[rozmiar]; // za tą konstrukcję to już wogóle ręki nie daję popraw ktoś jak jest źle ;)
ale to już inna bajka
EDIT. No i oczywiście później to trzeba zwolnić. Jeśli tego nie lubisz robić albo zapominasz to C++ oferuje taki fajny automagiczny wskaźnik który sam się usuwa jak obiekt przestaje istnieć. Popatrz tutaj :
http://dinkumware.com/manuals/default.a ... shared_ptr
Oferuje jeszcze typ array (w bibliotece tr1/array -> trzeba mieć nowe gcc) który uniemożliwia wyjście poza zakres tablicy, wtedy rzuca jakiś wyjątek albo nic nie robi i program się nie wysypuje

Również polecam poczytać

: 11 grudnia 2007, 22:03
autor: skotik87
fajna sprawa z tym ptr. natomiast w dalszym ciagu nie moge rozwiazac problemu z wyswietlaniem stringow. kod wydaje mi sie poprawny, ale jednak nie dziala tak jak powinien :/
: 11 grudnia 2007, 22:43
autor: salmon
może napisz której wersji używasz bo się pojawiło tutaj kilka...
: 11 grudnia 2007, 23:45
autor: Immortal
skotik87, nie działa jak powinien czy nie działa wogóle

bo to jest drobna różnica :P I jak nie działa jak powinien to napisz jak działa.
Tak sobie teraz popatrzyłem na wersję pontona i myślę ża albo jest późno i ja coś nie łapię albo mam kilka zastrzerzeń. Mianowinie jest funkcja dodaj do bazy która przyjmuje ile elementów dodać i tyle dodaje. Fajnie. Tyle że jak wywołamy ją drugi raz, baaa jak wogóle skończymy funkcję to ta baza przestaje istnieć bo tablica istnieje tylko lokalnie. ¯eby wyeliminować ten problem albo musisz zrobić zmienną globalną (rozwiązanie nieeleganckie i się go nie stosuje) albo zrobić jakąś klasę (skoro to c++ to czemu nie

) Jeśli wybrałbyś wersję z klasą to np robisz prywatną tablicę, w konstruktorze z parametrem podajesz wielkość tej tablicy i definiujesz funkcję dodaj. Inna możliwość rozwiązania tego zadania to tablica z laptopami w mainie. Wadą tego rozwiązania jest fakt że wszystkie funkcje pracujące na tej tablicy musiałyby przyjmować tą tablicę jako parametr i najlepiej przez referencję.
Mam nadzieję że jasno napisałem. Jeśli nie to pytaj a chętnie odpowiem i wytłumaczę wszystko jeszcze raz
Pozdrawiam
: 12 grudnia 2007, 00:12
autor: ponton
Tak, moja wersja zakłada, że dodawanie do bazy będzie raz. Ale to był tylko przykład, jak jeszcze można zrobić ze zwracaniem wskaźnika.
: 12 grudnia 2007, 10:21
autor: Theq
skotik87 podales za malo danych, na tym etapie to ci moge powiedziec, ze sie nie wyswietla bo w tych stringach nic nie ma.
Immortal pisze:
Tak sobie teraz popatrzyłem na wersję pontona i myślę ża albo jest późno i ja coś nie łapię albo mam kilka zastrzerzeń. Mianowinie jest funkcja dodaj do bazy która przyjmuje ile elementów dodać i tyle dodaje. Fajnie. Tyle że jak wywołamy ją drugi raz, baaa jak wogóle skończymy funkcję to ta baza przestaje istnieć bo tablica istnieje tylko lokalnie.
Funkcja zwraca wskanik do tablicy zanim sie skonczy, wiec wskaznik do niej jak najbardziej istnieje dalej. Co innego, sytuacje jak chcemy wywolac ta funkcje drugi raz. Ale nie ma co tu winic pontona bo przeciez to byl tylko przyklad, a ty mowisz o calym zalozeniu projektowym :P Mylaca mogla tu byc nazwa funcji, ktora tak napradw nie "dodaje" do bazy, tylko ja tworzy i dodaje. Wiec jak ja wywolasz drugi raz to bedziesz mial druga baze (a jak bedziesz probowal ustawic ja na ten sam wskaznik to i stracisz pierwsza baze jak tego pierwszego wskaznika jakos nie zapamietasz). Jesli jest taka potrzba to przydalaby sie funkcja dodania do juz istniejace bazy.
Immortal pisze:
¯eby wyeliminować ten problem albo musisz zrobić zmienną globalną (rozwiązanie nieeleganckie i się go nie stosuje) albo zrobić jakąś klasę (skoro to c++ to czemu nie ]
Hehe a wszystkie funkcje pracujace na obiekcie tej klasy musialyby przyjmowac ten obiekt jako parametr i najlepiej przez referencje

Mala roznica

: 12 grudnia 2007, 14:09
autor: skotik87
może napisz której wersji używasz bo się pojawiło tutaj kilka...
Uzywam swojej, czyli od ktorej zaczal sie caly watek. W zalaczniku daje caly kod, ktory do tej pory zrobilem. Wiadomo ze kazdy zrobilby to na inny sposob, ale ja akurat wybralem ten :/
nie działa jak powinien czy nie działa wogóle
Dziala ale nie tak jak powinien. Nie wypisuje stringow ktore dodalem wczesnije do bazy.
Jak zmienie w strukturze stringi na np. na char[10] to wyswietla 2-gi element tablicy czyli model(natomist marke wyswietla tak: <Yh2 ) Druga tablice juz wyswietla poprawnie, ze wszystkimi elementami. Natomiast jak wykona sie kilka razy np. sortowanie to wtedy miesza strasznie w danych, ale to juz mniejsze zlo. Mysle ze po dodaniu zapisu do pliku nie bedzie jzu z tym problemow.
Tak, moja wersja zakłada, że dodawanie do bazy będzie raz
Moja tez taka jest =) Pozniej dodam do funkcji dodaj_do_bazy, zeby zapisywal to odrazu do pliku.
A nastepnie dodam funkcje ktora bedzie zliczala ile juz jest w pliku elementow zapisanych i wedlug tego beda dodawane nowe. Chyba najprostsze rozwiazanie jak dla mnie o_O
http://wklej.org/id/386e8de8dd
: 12 grudnia 2007, 14:52
autor: Theq
No troche namieszales

(case 4) Tworzysz tablice, dodajesz elementy, a potem ja kasujesz. Nastepnie (case 1) chcesz to wyswietlic i znowu tworzysz nowa tablice (w ktorej nic konkretnego juz nie ma), wyswietlasz i znowu kasujesz (ta "pusta" tablice). Podobnie robisz przy sortowaniu, tworzysz tablice, sortujesz, wyswietlasz (caly czas w tej tablicy nic ciekawego nie ma bo jest calkiem nowa :P ). W skrocie za duzo tych tablic robisz.
: 12 grudnia 2007, 15:10
autor: skotik87
Theq pisze:No troche namieszales
nawet bardziej niz troche

teraz juz wiem, co jest glownym problemem. Musze to jakos ogarnac, po przeczytaniu tych postow mam nie maly mentlik w glowie. nie lubie c++, ale nie ma wyjscia, trzeba to jakos zrobic