Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 7 sie 2026, o 12:02


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 28 lis 2015, o 03:50 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Witajcie.

Mam kilka prostych pytań dotyczących wskaźników bo nie mogę tego ogarnąć. Pociągnąłem sobie dane z GPSa i są zapisane jako wskaźniki do pamięci
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

oraz mam zmienne tablicowe
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pierwsze pytanie -jak mam to podzielić na 3 zmienne gg[], mm[] i ss[]
Próbowałem na różne sposoby i niby proste, ale nie do końca
np gg wyciągnąłem funkcją skracającą string ale mm i ss nie ma jak wyciągnąc. Nie wiem dlaczego skoro wskaźnik jest liczbą wskazującą w pamięci na początek stringa to nie mogę do niej dodać np 4 żeby wyciągnąć sekundy np lcd_str(ggmmss+4);
inna metoda np strcpy (t_ggmmss , ggmmss);
i teraz wyswietlając lcd_int(t_ggmmss[0]) pokazuje godzinę poprawnie oprócz zera za zero podstawia krzaki.
moze są jakieś inne metody
np ta też nie działa: t_ggmmss = &ggmmss;

Drugie pytanie - Chciałbym obliczyć sumę kontrolna - znalazłem taką definicję
Sumę kontrolną stanowią zawsze dwie liczby (w systemie heksadecymalnym) poprzedzone znakiem gwiazdki.
Obecność znaku gwiazdki jednoznacznie wskazuje początek sumy kontrolnej.
Suma kontrolna wyznaczana jest za pomocą operacji XOR na wszystkich znakach od początku linii (za wyjątkiem znaku $) do samej sumy
kontrolnej (bez sumy kontrolnej i znaku *),
np. linia: $GPGLL,3907.360,N,12102.481,W,183730,A*33
ma sumę kontrolną równą 33 (51 w systemie dziesiętnym) obliczoną na podstawie operacji
XOR na znakach:
GPGLL,3907.360,N,12102.481,W,183730,A


jak tego dokonać skoro każdą z tych danych mogę przechowywać pod zmienną wskaźnikową
zadeklarowałem
Kod:
uint8_t suma_kontrolna;
i teraz
Kod:
suma_kontrolna = &dane_gps0 ^ &dane_gps1 itd
- otrzymuje komunikat invalid operands to binary ^ (have 'char **' and 'char **')
co z tym zrobić?

a trzecie pytanie - może zamiast liczyć sumę kontrolną może możnaby policzyć przecinki - a dlaczego o to pytam - bo czasami nie przylatuje w sygnala jakaś ramka i wszystko się przesuwa o jeden w lewo - chcę się zabezpieczyć przed takim czymś.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2015, o 10:35 
Offline
Użytkownik

Dołączył(a): 20 lip 2015
Posty: 83
Pomógł: 6

Kurczę ale pomieszanie z poplątaniem :) Masz duże tyły w operowaniu wskaźnikami z tego co widzę.

Zapamiętaj coś takiego

To jest zwykła zmienna przechowująca jakąś wartość np. może to być liczba 5
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


To jest zmienna przechowująca wskaźnik, czyli adres w pamięci, gdzie wartość się znajduje - adres zazwyczaj jest w postaci hexadecymalnej np. 0x08a22c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Liczbę zmyśliłem, ale jak widać jest znaczna różnica.

To jest operator pobrania adresu zmiennej &:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W tej chwili w zmiennej wsk masz ADRES do pamięci gdzie znajduje się wartość zmiennej zmn, nie jest to absolutnie wartość którą możesz od tak sobie wyświetlać na lcd czy robić na niej działania bo zawsze skończy się to różnymi błędami.

A teraz uwaga, ja wyciągnąć (wyłuskać) wartość zmiennej zmn poprzez wskaznik wsk? Użyjemy operatora *, ktory teraz mozesz interpretowac jako "wyciagnij wartosc ze wskaznika"
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Innymi slowy oznaczo to "wyciągnij wartość z pod adresu pamięci ktory przechowuje zmienna wsk oraz zapisz do wyciagnietaWartoscZmiennej"

Sam miałem na początku problemy z tym z racji jakby dwojakiego znaczenia operatora *.
Zasada jest prosta, gdy deklarujesz zmienną, * przy typie oznacza że chcesz utworzyć zmienna wskaźnikową.
Z kolei gdy * umieścisz przy zmiennej wskaxnikowej już w jakiejś instrukcji, otrzymasz wyciagnieta wartość z pod adresu na ktory zmienna ta wskazuje :P

Podsumowując, działanie np. takie jak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kończą się błędem, bo do zwykłej zmiennej chcesz zapisać adres do zmiennej wskaznikowej, ktora tez przechowuje jakis adres i jeszcze do tego chcesz jakieś działania na tym robić :P Niezły koktajl :)


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Myślę że wiele się wyjaśni w tym i znajdzie się odpowiedź na Twoje pytania :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2015, o 16:58 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Dzięki za wyjaśnienia. Trochę pomogło tylko że dalej nie działa. Dla uproszczenia na początek tylko jedną zmienną chcę przemienić ze wskaźnika na daną tzn
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

jak wyświetlam stringa danegps0 to wyświetla np $GPGGA a jak wyświetlę gps1 to wyświetla 44 - więc to nie to
jeżeli tak ją zadeklaruje
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
nie przechodzi przy kompilacji

na tej sumie kontrolnej mi nie zależy - to jest tylko w ramach "uczenia" się i sprawdzania czy to można obliczyć, ale zależy mi na podzieleniu zmiennej ggmmss na gg, mm i ss - a to jak ruszyć?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2015, o 02:23 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

to :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


działa zgodnie z oczekiwaniami, znaczy zerowy element stringa umieszcza w zmiennej typu char, ale później funkcja:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


oczekuje wskaźnika: adresu do stringa !!! tekstowego, a więc takiego, który jest zakończony znakiem \0 ( po prostu zero jest jej ostatnim elementem. To co funkcja lcd_str(...) Ci wyświetla, to adres zmiennej gps1 jako 2 znaki ascii !!!

Drugie, co próbujesz w ogóle nie ma sensu, jak napiszę resztę, to myślę, że zrozumiesz dlaczego.

1. Nazwa tablicy - jakiejkolwiek, także literału napisowego jest adresem jej zerowego elementu!!!!

2. Zapisy: postaci:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
są dla Ciebie praktycznie równoważne. Piszę tu, że praktycznie równoważne, coby puryści się nie czepiali, bo są pewne różnice, ale na tym etapie w sumie nieistotne.

3. Oba oznaczają definicję stringa tekstowego w pamięci ( a więc takiego, na którego końcu jest to nieszczęsne zero ), czyli gdybyś chciał wyświetlić to na LCD, musiałbyś wywołać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i identycznie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
, albo też:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pomyśl chwilę nad ostatnim wywołaniem funkcji lcd_str(....). Przypominam, funkcja lcd_str oczekuje wskaźnika początku napisu, który ma wyświetlić !!!

4. W "C" nie da się wprost kopiować tablic ( a więc i stringów tekstowych ) poprzez proste przypisanie !!! Można to zrobić którąś z funkcji bibliotecznych, na początek polecam, abyś użył memcpy(). Załóżmy, że masz wskaźnik do stringa postaci: ggmmss, czyli :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i chcesz go "rozbić" na 3 oddzielne elementy ( a więc też stringi ), które będą zawierały po 2 elementy. Musisz więc powołać 3 tablice 3 o rozmiarze, który pomieści 3 elementy: zerowy i pierwszy z tab_test2 skopiować do 1 z tablic pomocniczych, ale że chcesz by to był też string tekstowy, więc jako ostatni element pierwszej z tablic pomocniczej musisz umieścić zero. I tak z kolejnymi elementami tablicy test_tab 2 i kolejnymi tablicami pomocniczymi. Czy to jest jasne ? No dobra, teraz kod, bo już mnie to pisanie wyczerpało:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No dobra, dosyć przynudzania. Myślę, że teraz trochę więcej zrozumiesz ze wskaźników i operacji na stringach. Umieściłem tu kod bez testowania, więc być może gdzieś się pomyliłem, ale jeśli nawet, to myślę, że teraz sam dasz radę go w razie czego poprawić.

Pozdrawiam, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2015, o 02:30 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Dziękuję - no nie powiem że wszystko jasne, ale po Twoich podpowiedziach mam już obliczanie sumy kontrolnej zrobione i działa jednak mam takie pytania
pierwsze
mam w jednej zmiennej prawie cały łańcuch do obliczenia sumy kontrolnej
(wszystko oprócz pierwszych 6 znaków "GPRMC,"
jest funkcja łączenia znaków
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ale ona nie działa i w zasadzie wiesza mi uP.
napisałem sobie funkcję która oblicza mi sumę kontrolną
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ale do niej muszę podstawić wszystkie znaki a mi brakuje z przodu przedrostka.

Druga sprawa to ciągle wskaźniki - jest sobie coś takiego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

tutaj chciałbym coś dopytać
składnia jest taka
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

reszta zadeklarowana jest jako char * reszta;
w funkcji wywołujemy to jako &reszta. No i tutaj wszystko się
przykład z postu marmura
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ale tutaj mamy inny przykład bo nasza zmienna nie jest zwykłym char tylko wskaźnikiem.
co wtedy robi znak "&" - skoro "reszta" jest wskaźnikiem to dlaczego nie jest wywołanie przez "reszta"
zapewne chodzi o te 2 gwiazdki w funkcji **ptrptr. No i tutaj jest zaplątanie.
Gdyby w funkcji było zapytanie oz końcówką char *ptrptr to znaczy że mamy do czynienia ze wskaźnikiem. Skoro są ** to pewnie chodzi o wskaźnik do wskaźnika - ale co to takiego w ogóle jest.
Załóżmy że
char znak = "procesor";
char *wsk = &znak - tzn że pod zmienną wsk przechowujemy adres pamięci jakiś 2 bajtowy.
char **wskwsk = no właśnie co to w ogóle nam da - adres do adresu?
przepraszam że takie pytania, ale o ile wskaźniki do jednej kropeczki można zrozumieć, to to już jest pogmatwane.

*** dopisano później
trochę sam sobie odpowiadam na jedno z pytań dotyczące funkcji strcat
znalazłem w końcu przykład i chyba już wiem o co chodzi - po prostu źle ją wywoływałem - co prawda on jest na tablicy a nie na wskaźniku, ale może jakoś to przejdę.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2015, o 16:21 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam ponownie,

1. Co do funkcji strcat(.....), to sam sobie w sumie odpowiedziałeś. Prototyp funkcji wygląda następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zamieniałeś stringi: źródłowy z docelowym .Tak nawiasem mówiąc w WIN_AVR masz manuala z opisem funkcji bibliotecznych (..../WinAVR-20100110/doc/avr-libc/avr-libc-user-manual/index.html).

iwi napisał(a):
*** dopisano później
trochę sam sobie odpowiadam na jedno z pytań dotyczące funkcji strcat
znalazłem w końcu przykład i chyba już wiem o co chodzi - po prostu źle ją wywoływałem - co prawda on jest na tablicy a nie na wskaźniku, ale może jakoś to przejdę.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jak już Ci pisałem, tablice można reprezentować i przetwarzać za pośrednictwem arytmetyki wskaźników. Jednak, jeśli chcesz wykonać operacje jak w przykładzie powyżej, to musisz w jakiś sposób zarezerwować obszar pamięci na Twojego stringa wynikowego i to właśnie robi definicja:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No bo jeśli zrobisz coś takiego:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to jest to jedynie deklaracja wskaźnika do obiektu typu char, ale kompilator nie przydzieli obszaru pamięci na ten obiekt ( obiekty ). Oczywiście można to zrobić inaczej, nie definiując tablicy, na przykład za pośrednictwem np. funkcji malloc(....), ale to trochę wyższa szkoła jazdy i nie będę Ci mieszał.

iwi napisał(a):
.....Druga sprawa to ciągle wskaźniki - jest sobie coś takiego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

tutaj chciałbym coś dopytać
składnia jest taka
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

reszta zadeklarowana jest jako char * reszta;
w funkcji wywołujemy to jako &reszta. No i tutaj wszystko się
przykład z postu marmura
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ale tutaj mamy inny przykład bo nasza zmienna nie jest zwykłym char tylko wskaźnikiem.
co wtedy robi znak "&" - skoro "reszta" jest wskaźnikiem to dlaczego nie jest wywołanie przez "reszta"
zapewne chodzi o te 2 gwiazdki w funkcji **ptrptr. No i tutaj jest zaplątanie.
Gdyby w funkcji było zapytanie oz końcówką char *ptrptr to znaczy że mamy do czynienia ze wskaźnikiem. Skoro są ** to pewnie chodzi o wskaźnik do wskaźnika - ale co to takiego w ogóle jest.
Załóżmy że
char znak = "procesor";
char *wsk = &znak - tzn że pod zmienną wsk przechowujemy adres pamięci jakiś 2 bajtowy.
char **wskwsk = no właśnie co to w ogóle nam da - adres do adresu?
przepraszam że takie pytania, ale o ile wskaźniki do jednej kropeczki można zrozumieć, to to już jest pogmatwane.



1. Nie możesz tego tak robić !!!!:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


bo zapis char znak = "abcdefgh" nie ma sensu !!!!. Przecież char to jest typ zmiennej prostej - czyli jednego elementu, a Ty usiłujesz przypisać do niego łańcuch tekstowy. jeśli już to tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czyli inaczej mówiąc, musisz zadeklarować tablicę na "procesor", a kompilator sam policzy jej rozmiar, uwzględniając znak \0 i sam ten znak umieści na końcu. Można też tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i to dokładnie zadziała tak samo, jak to powyżej. Cały problem polega chyba na tym, że Kolega marmur pisał o odnosząc się do zmiennych prostych, a Ty nie potrafisz tego przenieść na zmienne tablicowe. W przypadku tablic, czy wskaźników do elementów stringa będzie w sumie analogicznie ale z pewnymi niuansami:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A teraz wskaźnik do wskaźnika, czyli to: **ptr. Brzmi trochę przerażająco, ale w sumie nie jest wcale takie trudne. Załóżmy, że mamy 3 zmienne proste : x,y,z. Wtedy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Można oczywiście pójść dalej: wskaźnik do wskaźnika do wskaźnika ( char*** ) itd. i wcalę nie żartuję, nieraz się to przydaje :-). Pewnie teraz zastanawiasz się, dlaczego takie kombinacje ? Przyjrzyjmy się na chwilę prototypowi funkcji strtok_r(.......):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcja ta wymaga dwóch parametrów wejściowych: wskaźnika na string do obróbki, wskaźnika na separator ( który też może być stringiem ) i ma zwrócić jeden parametr wyjściowy. To też ma być w sumie wskaźnik na tego Twojego stringa "reszta", ale przecież funkcja nie wiedziała by, gdzie ma tego stringa umieścić !!! Konstrukcja: char** last w tym wypadku rozwiazuje problem, na bo musimy podać adres do miejsca w pamięci, od którego to miejsca ta funkcja ma umieścić tego stringa, dlatego jako parametr musimy podać: &reszta ( i to będzie właśnie ten wskaźnik do wskaźnika! - popatrz an to, co napisałem powyżej ), przy założeniu, że reszta jest typu char*. Oczywiście zastosowań tego mechanizmu jest więcej, np. tablice wskaźników do wskaźników ( masz np. elementy menu o różnej długości i chcesz w prosty sposób je wyświetlać ), itd.
Przetraw dokładnie to co napisałem, bo jeśli to załapiesz, to będziesz dokładnie wiedział, jak korzystać ze wskaźników. Najważniejsze moim zdaniem, abyś zrozumiał dokładnie ścisły związek ( wręcz nawet analogię ) między wskaźnikami i tablicami.

Pozdrawiam, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO