qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Cześć witam . Mam pytanie związane z komponentem TMemo w Borlandzie . W trakcie pobierania tekstu do bufora znakowego zamazuję pamięć. Niestety nie wiem dlaczego tak się dzieje . Podaję częśc kodu , który generuje błąd char * expression; [ bufor znakowy , 1024 bajty , przydzielenie pamieci funkcja malloc , alokacja udana]; void getTextAndProcess( TMemo * field ) { unsigned int len = strlen( expression ); for(unsigned int i = 0; i < len; i++) expression[ i ] = ' '; expression[ len ] = NULL; // funkcja ponize zamazuje pamiec , choc // rozmiar TMemo wynosci 1000 bajtow field->GetTextBuf( expression , field->GetTextLen() + 1 ); } Co więc robię zle , nie uczyłem się Borlanda natomiast musze z tego komponentu zrobic wyswietlacz , wybralem TMemo , gdyż wydawał mi sie odpowiendi. Jezeli macie jakies pomysl to proszę o pomoc . Z góry dzięki - narazie. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Contrast Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Nie znam sie na Borlandzie ale char * expression; To jest wskażnik do chara odwolanie expression jest tu nie poprawne.(gdyż wskaznik nie jest tablicą) jego wartością jest lidzba cheksadecymalna (adres komurki pamieci) tak samo strlen( expression ); da nie poprawny wynik(da dlugo). Spróbuj char * expression = &bufor; i w pętli for(...;...;...) możesz inkrementować adres wskażnika przez expression++; Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Wybacz ale to co napisałeś kupy się nie trzyma. Czemu nie mogę napisać expression[ i ] = przecież to String i dlaczego strlen( expresssion ) miało by dać zły wynik ? . przecież to standardowa funkcja ?????/ Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Nargil Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 char * expression; expression[ i ] = przecież to String w ktorym miejscu to jest string ? jakby to byl string to by wygladal tak: string expression; a nie tak jak ty to zrobiles ( o ile sam to robiles ); Tworzysz WSKAZNIK nie wiedzac co to jest ? doksztalc sie na ich temat a wtedy ewentualne problemy zglaszaj na forum. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Contrast Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 char * expression; To jest String? (przejżyj dokładnie swojego i mojego posta) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Nargil Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 To nie jest string tylko wskaznik do stringa... jako takiego bledu nie widze w tym fragmencie co tu podales... sprawdz jedynie czy pointer expression wskazuje na to miejsce co oczekujesz. i moze wytlumacz CO JEST ZLE ? bo ani Co więc robię zle , nie uczyłem się Borlanda natomiast musze z tego komponentu zrobic wyswietlacz , wybralem TMemo , gdyż wydawał mi sie odpowiendi. Jezeli macie jakies pomysl to proszę o pomoc . Z góry dzięki - narazie. ani: cześć witam . Mam pytanie związane z komponentem TMemo w Borlandzie . W trakcie pobierania tekstu do bufora znakowego zamazuję pamięć. Niestety nie wiem dlaczego tak się dzieje . Podaję częśc kodu , który generuje błąd ; nie mowi nam w czym masz problem... W trakcie pobierania tekstu do bufora znakowego zamazuję pamięć. Niestety nie wiem dlaczego tak się dzieje . ... n/c pewnie dlatego: unsigned int len = strlen( expression ); for(unsigned int i = 0; i < len; i++) expression[ i ] = ' '; expression[ len ] = NULL; Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Ok dyskusjs zeszła na złe tory , więc wyprostuje kilka rzeczy . Po pierwsze jeżeli chodzi o String to kod podany poniżej jest poprawny char * pStr = (char *)malloc( 10 ); //bla bla kod ktory zajumuje sie tym -Stringiem- unsigned int slen = strlen( pStr ); for(int i = 0; i < slen; i++) pStr[i] = 'a'; pStr[ slen ] = NULL; Dlaczego napisałem ze to jest String , bo dla mnie niewazne jest to czy jest to tablica znakow , wskaznik do char , czy tez do Stringa lub długi wskażnik do String czy klasa String w C++ lub Javie bo operuje na tekscie , tylko w rózny sposób mam do niego dostep . Macie racje moje słowa mogly byc opacznie zrozumiane gdy napisalem ze char * expression[ i ] //przeciez to String chodziło mi o to że operuje na tekscie , wyrażałem wątpliwosc co do słow Contrasta ktory napisal ze w wyniku operacji strlen( expression ); otrzymam zły wynik , co oczywiscie jest stwierdzenim błędnym. Równiez odwołanie expression[ i ] = znak; jest prawidlowe , dlatego sie zdziwilem ze ww tym miejscu sugerujecie mi blad. Tam na pewno go nie ma . A jaki mam problem - jest napisany na poczatku postu - program zamazuje pamiec. A robi to instrukcja GetTextBuf ( param ) , reszte kodu napisalem zeby nie bylo pytan dotyczacych banalow , lecz tego nie dalo sie jak widac uniknac. Moje pytanie wiec brzmi , czy nie wiecie czemu funkcja BIBLIOTECZNA GetTextBuf wywołuje błąd ochrony pamieci , czyli zamazuje pamiec . Zeby nie bylo zadnych wattpliwosci kod pnizej wygeneruje ogolny blad ochony pamiec void getTextAndProcess( TMemo * field , ...) { field->GetTextBuf( expression , field->GetTextLen + 1 ); } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Contrast Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Panowie czy String w C++ jest tablicą Charów i można sie odwoływać do jego elementów poprzez indeksy? Wydaje mi sie że nie. Ja bym utwożył tak: int lenth = ....;char[] bufor= new char[lenth];char * ptr = &bufor[0]; //wskazuje na pierwszy element bufora; for(int i = 0; i <lenth; i++){/*ptr = "";//wstawienie pustego znaku do bufor[i]ptr ++;//inkrementacja wskażnika;//jeśli bufor zajmuje jednolity przedział adresów w pamieci(jak to jest w c++?)} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Nargil Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 jak juz mowilem... doksztalc sie o wskaznikach !!! sprobuj tak: unsignet int size = field->GetTextLen(); expression=(char*) malloc ( size ); field->GetTextBuf( expression , size ); Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Posłuchaj nie musze sie dokształcac ze wskaznikow . Po pierwsze przeczytaj tytuł postu - pisze tam [ C / C++ ] wszystkie odwołania w C , które tutaj zaprezentowałem są poprawne i nie kłoć sie ze mną o to bo widze że jestes teoretykiem programowania a nie praktykiem Pisesz że Panowie czy String w C++ jest tablicą Charów i można sie odwoływać do jego elementów poprzez indeksy? Wydaje mi sie że nie. a potem pokazujesz fragment programu , który inkremenruje wskaznik który porusza się po ciągłym obszarze pamięci ( czyżby to nie była definicja tablicy ) , sam sie doucz wskaznikow Dalej pokazujesz fragment kodu unsignet int size = field->GetTextLen(); expression=(char*) malloc ( size ); field->GetTextBuf( expression , size ); który według siebie jest lepszy od mojego field->GetTextBuf( expression , field->GetTextLen + 1 );Niestety musze cie zmartwic , bo to jest dokładnie to samo :) I ciągle nie ustosunkuwujesz sie do mojego pytania tylko uczepiłes się tego Stringa , co pozwala mi stwierdzic iż nie masz nic wiecej do powiedzenia Dziękuje Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Nargil Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 probowales to chociaz ? bo to nie jest dokladnie to samo... GetTextBuf() oczekuje 2 parametrow: 1 z nich bedacy tablica charow do ktorej zostanie skopiowana zawartosc bufora obiektu 2 dlugoscia jaka ma kopiowac char * expression; jest wskaznikiem wskazujacym do pewnego miejsca w pamieci. a ty chcesz tam wrzucic dowolnej dlugosci tablice charow. Teraz pomysl i sie zastanow jakiej wielkosci obszar pamieci zajmuje twoj pointer *expression i czy w tym fragmencie zmiesci zawartosc bufora pola field. Niby skad program ma wiedziec ile pamieci ma przypisac wskaznikowi ? MUSISZ TO ZADEKLAROWAC poprzez malloc, ktore w moim przykladzie wystepuje, a w twoim nie. Imho ty nawet tego nie sprobowales, ale odnosisz sie do mnie tonem jakbys wszystkie rozumy pozjadal. W takim razie powinienes sobie samemu poradzic. Ja probuje ci pomoc z wlasnej nie przymuszonej woli i nic z tego nie mam. Poswiecam ci moj cenny czas wiec TROCHE SZACUNKU. "Posłuchaj nie musze sie dokształcac ze wskaznikow ." Ja mimo wszystko twierdze ze musisz. "Po pierwsze przeczytaj tytuł postu - pisze tam [ C / C++ ] wszystkie odwołania w C , które tutaj zaprezentowałem są poprawne i nie kłoć sie ze mną o to bo widze że jestes teoretykiem programowania a nie praktykiem" 1. przeczytalem. wlasnie dlatego tu wszedlem. wierz mi... pascala bym nie tknal 2. nie pisze tylko jest napisane 3. skoro sa poprawne to w czym masz problem ? uwazasz ze borland spierd**** robote tworzac swoj kompilator, a nie ty piszac swoj kod ? 4. mylisz sie... wszystko co umiem nauczylem sie sam piszac programy. i podchodze tak do kazdego jezyka zarowno c/c++/php jak ang czy niem. teoria sux... wazna jest praktyka. "co pozwala mi stwierdzic iż nie masz nic wiecej do powiedzenia Dziękuje" Nie ma sprawy... tylko ten post w nadzieji ze ci jednak pomoze. Wiecej tutaj palca nie wloze. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Niestety muszę stwierdzić iz jestem człowiekiem bardzo cierpliwym , lecz wytrzymałem tylko dwa posty w których wytknąłes mi nieuctwo . Cytuję Tworzysz WSKAZNIK nie wiedzac co to jest ? doksztalc sie na ich temat a wtedy ewentualne problemy zglaszaj na forum. jak juz mowilem... doksztalc sie o wskaznikach !!! Nie chcę się kłócić , lecz jezeli wytykasz mi nieuctwo , zamiast dokładnie przeczytać post i odpowiedziec na niego jezeli znasz odpowiedz , to trochę mnie to zdenrwowało. Na poczatku jest program , w którym pisze iz bufor został zaalokowany mallociem, jego rozmiar jest scisle kontrolowany przez program i uwierz mi ze to nie wina tego wskaznika , wszystko jest kontrolowane przez system. Nie pisalem tu całego programu bo zajmuje 147 kilo , użyłem tylko Borlanda do tworzenia Gui ( zalezy mi na czasie ) i natknąłem się na problem , którego rozwiązanie chciałem tutaj znalezc. Jeżeli poczułes się urażony to przepraszam. GetTextBuf oczekuje 2 parametrow ,.Pierwszy to wskaznik do Stringa , drugi liczba znakow do pobrania. Wskaznik to Stringa jednak trzeba kopiowac , bo jest on pozniej nieuzyteczny( takie informacje są w pomocy ) i moze wywolac bład ochrony pamiec , lecz to TEZ NIE TEN PROBLEM . Nadal wystepuje załamanie programu w trakcie pracy. Jestem otwarty na sugestie - moze GetTextBuf jest przestarzała funkcja ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Nargil Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Mialem nic tu nie pisac wiecej ale az mnie krew zalewa... [ciah ciah ciah! tu byla niezla wiazanka - deleted by: automatyczna kontrola mojej kultury] zrob tak jak ci napisalem i wtedy napisz czy dziala czy nie. Ty jestes jakis nienormalny. Oczekujesz pomocy, ale jak ktos wytyka ci blad to wmawiasz mu ze tam go nie ma bo jak to ladnie napisales : "jego rozmiar jest scisle kontrolowany przez program i uwierz mi ze to nie wina tego wskaznika". "Na poczatku jest program , w którym pisze iz bufor został zaalokowany mallociem" no wlasnie... na poczatku ! A na jaki rozmiar ? jestes pewien ze na taki sam co field->GetTextLen() ? zrob wiec: field->GetTextBuf( expression , strlen(expression) ); <-- ale w tym wypadku moze nie zostac skopiowana cala zawartosc bufora field. Nie bedzie jednak bledu ze kopiowany fragment bufora wychodzi poza obszar pamieci wskazywanej przez pointer. "GetTextBuf oczekuje 2 parametrow ,.Pierwszy to wskaznik do Stringa" SUPER !!! po prostu super... w takim razie zrob: "string * expression"......... N/C stary. Sorry, ale jestes n00bem, albo pokaz mi gdzie jest napisane o tym wskazniku do stringa... dobra moze nie n00b ale napewno ktos typu: "Mam nowy komputer: P4 3.8 ghz, gf 6800u, 1gb ram, codegegen 250W. Wie ktos czemu mi sie zawiesza ? zmienialem juz procesor, ram i karte graficzna" "zmien zasilacz !" "Nie ! zasilacz jest dobry ! moj pentium II 300 mhz mial ten sam zasilacz i sie nie zawieszal !!! napewno to nie jest zasilacz" Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Contrast Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Napisaliście: GetTextBuf() oczekuje 2 parametrow: 1 z nich bedacy tablica charow do ktorej zostanie skopiowana zawartosc bufora obiektu 2 dlugoscia jaka ma kopiowac Robiąc : field->GetTextBuf( expression , size ); gdy size jest większe od expression zgłoszony bedzie bład pamięci bo zapełni sie expression. Zostanie podjęta pruba zapisania Size minus ilość elementów w expression znaków z bufora obiektu do pelnego juz bufora expression , co da bląd . Ps a jakbyś mogl dodac do postu komunikat jaki wywala kompilator to tez by ulatwilo. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Nargil Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Contrast: przeciez caly czas o tym trabie... ale wydaje mi sie ze mowie do sciany... nie jestem tylko pewien czy: size=field->GetTextLen(); expression=(char*) malloc(size); czy size=field->GetTextLen() + 1; expression=(char*) malloc(size); Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Wstałem o godzinie 8 rano i z przerwą na posiłki i rozprostowanie obolałych pleców piszę program . Napotkany błąd naruszył moją delikatną aurę energii ,lecz twoja obecnosc na forum rozp .. ją na kawałki. Odrobinka dobrej chęci z twojej strony zaoszczedziła by nam obu czas. NIE CZYTASZ MOICH POSTÓW !!! Wróć się odrobinkę do tyłu i zobaczysz iż sprawę alokacji bufora załatwiłęm już na samym początku , specjalnie nie pisałem kodu z nią związanego Jeżeli napisałem kod field->GetTextBuf( expression , field->GetTextLen() + 1 ); a w poscie było napisane ze bufor zawiera 1024 bajty a field 1000 bajtow, to oznacząło ze nie mogę przekroczyc rozmiaru ( przypatrz się programowi w 1 poscie ) Zauważ iż drugi parametr funckji GetTextBuf to field->GetTextLen() , czyli pobieramy rozmiar tekstu który jest aktualnie przetrzymywany przez bufor ( przy ograniczeniu field do 1000 bajtow field->GetTextLen() <= 1000 ) . Sprawdzone , nie ma szans żeby było inaczej. Aha i tak - WSKAŹNIK DO STRINGA ( i nie obchodzi mnie czy to jest char * expression , bo ten wskaźnik wskazuje na ciąg uszeregowanych bajtów o ściśle uregulowanym rozmiarze ). Gdybym opierał się na twojej filozofii , wtedy przykładowy program napisany ponizej mogłby mnie wprowadzic w błąd. struct xMeshCoor { long double * myNameIsNoImportant; char * bonesNames ; }; I powiedz miu czy myNameIsNoImportant jest tablicą czy wskaźnikiem na int. A może bonesNames jest wskaźnikeim na char , a może to String ? , a moze ..... A moze to nie ma znaczenia bo pytam sie o GetTextBuf Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 tablica long double oczywiscie - juz mi sie wszystko myli Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 JAKIEJ KOMPILACJII !!!!!!!!!!!!!!!!!!!!!!!!! LUDZIE - przecież mówięo błędzie ochrony pamięci która w czasie kompoilacji nie występuje :) Program załąmuje się w trakcie działania. Program nie przektoczy strlen( expression ) bo unsigned int len = strlen( expression ); for(unsigned int i = 0; i < len; i++) expression[ i ] = ' '; expression[ len ] = NULL; Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Nargil Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 field->GetTextBuf( expression , field->GetTextLen() + 1 ); dla memo o wielkosci 1000 nie probuje przezucic przypadkiem przezucic 1001 znakow do expression ? przy czym 1001 znak buffora nie istnieje ? niestety nie mam bcb zeby pokombinowac Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Nargil Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 unsigned int len = strlen( expression ); for(unsigned int i = 0; i < len; i++) expression[ i ] = ' '; expression[ len ] = NULL; jest zbedne bo po prostu zawartosc i miejsce nulla jest ignorowane. niestety ale wskazniki znow sie klaniaja :) ale zeby nie bylo ze sie czepiam tych wskaznikow. Przyznam sie ze nie znam bcb ale z tego co widze na google: to zaczynam watpic czy TMemo obsluguje ->GetTextBuf. sprobuj moze GetData albo Read ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 Program ten to kalkulator który pobiera tekst z TMemo dynamicznie . Zawiesza się np . po kilku wpisanych tekstach , ale nie dlatego ze został przekroczony limit bo wyrażenie expression[ len ] = NULL; zeruje String , więc to nie to. Jeżeli udowodnisz mi ze ten kod co podałe powyżej nie zeruje Stringa to moze to byc to , ale jak to zrobisz ???? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
qreatyna Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 sorry ale nie napisalem kodu ktory ustawia wskaznik na początek w poprzenim poscie ten wczesniejszy null mogłby sugerowac bład , ale on był z czesci programu , ktora czyscila string , zmiesząłem sie Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Nargil Napisano 12 Stycznia 2005 Zgłoś Napisano 12 Stycznia 2005 unsigned int len = strlen( expression ); for(unsigned int i = 0; i < len; i++) expression[ i ] = ' '; expression[ len ] = NULL; ale ja w tym sensu nie widze... powiedzmy ze pointer wskazuje do obszaru pamieci gdzie przechowywane jest powiedzmy "abcd". strlen zwraca 4. poszczegolne komorki pamieci wygladaja tak: 0 - a 1 - b 2 - c 3 - d 4 - \0 po tej petli: 0 - ' ' 1 - ' ' 2 - ' ' 3 - ' ' a nastepnie po petli: 4 - \0 // chociaz i tak 4 wczesniej bylo rowne \0 sprawdz czy twoj problem nie pojawia sie w chwili gdy najpierw podasz krotszy lancuch danych a pozniej dluzszy. skoro to sie wyklada w momencie przyjmowania danych to moze jednak sprobuj mallocem alokowac ponownie pamiec dla pointera ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
PelzaK Napisano 17 Stycznia 2005 Zgłoś Napisano 17 Stycznia 2005 (edytowane) więc tak... 1. nie uzywać maloców.. po to jest w c++ new 2. nie uzywać tablic... :) po to są vectory vector <float> wektor_flołtów; (thx 4 DanieL :)) i tablice się chowają... (opis ma goglach) 3. w borlandzie jest takie narzędzie jak CODEGUARD - tryb emulowania aplikacji.. wychwyci najdrobniejszy błąd, wyciek pamięci, sięganie w obszar zabroniony, naruszanie pamięci i tym podobne (program działa dużo wolniej... ale dzieki temu opanowałem program symulacji sieci neuronowej.. a tam wskaźników mnustwo było...) 4. i jeszcze nie rozumiem po co Ci tam wskaźniki... jest typ AnsiString który doskonale ułatwia prace ze stringami i jest kompatybilny z więkoszścią komponentów... Tmemo ma chyba pole Lines->String (dokładniej AnsiString).. W sumie to nie znam celu takiego działania.. skoro Tmemo ma odpowiednie metody umożliwiające wpsółprace z textem w nim widocznym... aha.. bezpośrednie używanie wskaźników to taki przejaw akademickiej sztuki programowania.. powoli próbuje z niego uciec... NO MORE WSKAŹNIKÓW NA TABLICE! i inne tym podobne niepotrzebne śmieci... Edytowane 17 Stycznia 2005 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...