problem z c++

Potrzebujesz pomocy z C, C++, perl, python, itp.
skotik87
Posty: 98
Rejestracja: 05 kwietnia 2007, 00:20
Lokalizacja: Krakow

Post 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??
Immortal
Posty: 31
Rejestracja: 11 grudnia 2007, 12:15
Lokalizacja: Kraków

Post autor: Immortal »

Jeśli masz napisane wcześniej tak:

Kod: Zaznacz cały

  laptop *lap;    
To masz tylko wskaźnik do elementu typu laptop. Jeśli zaś tak:

Kod: Zaznacz cały

  laptop lap[5];    
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ć :)
skotik87
Posty: 98
Rejestracja: 05 kwietnia 2007, 00:20
Lokalizacja: Krakow

Post 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 :/
salmon
Beginner
Posty: 296
Rejestracja: 12 października 2007, 23:28
Lokalizacja: Gliwice/Bielsko-Biała

Post autor: salmon »

może napisz której wersji używasz bo się pojawiło tutaj kilka...
Immortal
Posty: 31
Rejestracja: 11 grudnia 2007, 12:15
Lokalizacja: Kraków

Post 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
ponton
Beginner
Posty: 406
Rejestracja: 24 stycznia 2007, 01:40
Lokalizacja: Kalisz/Wroc³aw

Post 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.
Theq
Beginner
Posty: 140
Rejestracja: 16 kwietnia 2007, 19:00
Lokalizacja: Legnica

Post 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 ;)
skotik87
Posty: 98
Rejestracja: 05 kwietnia 2007, 00:20
Lokalizacja: Krakow

Post 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
Theq
Beginner
Posty: 140
Rejestracja: 16 kwietnia 2007, 19:00
Lokalizacja: Legnica

Post 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.
skotik87
Posty: 98
Rejestracja: 05 kwietnia 2007, 00:20
Lokalizacja: Krakow

Post autor: skotik87 »

Theq pisze:No troche namieszales :)
nawet bardziej niz troche :D 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
ODPOWIEDZ