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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 maja 2025, o 20:09


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
    Autor Wiadomość
    PostNapisane: 30 gru 2019, o 15:52 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    zapraszamy dzisiaj o 19:00 ;)

    Obrazek

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 gru 2019, o 20:01 
    Offline
    Nowy

    Dołączył(a): 15 gru 2014
    Posty: 13
    Pomógł: 0

    Obrazek
    I mały komentarz do obrazka konwersja typów wskaźników nie należy do rzutowań nie jawnych. Taki stan rzeczy w zasadzie jest właśnie dobry. Ponieważ gdy zmieniamy typy wskaźników to musimy wiedzieć co robimy( dla tego dodajemy rzutowanie jawnie ) a nie zrobić tego przypadkiem przez pomyłkę co mogło by spowodować sporo błędów w programie i gdyby nie ostrzenie mógłby być problem z odnalezieniem błędu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 gru 2019, o 23:09 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 09 maja 2015
    Posty: 8
    Lokalizacja: Lublin
    Pomógł: 0

    Mówią, że jeden obrazek jest wart więcej niż 1000 słów, no to zrobiłem obrazek.

    Czarne ramki oznaczają adresy w pamięci, które przechowują obydwa wskaźniki pod koniec programu i sposób w jaki dane są interpretowane. Mam nadzieję, że po takiej dawce łopatologii, komuś zaświeci się w głowie żarówka. W razie dodatkowych pytań, walcie śmiało.

    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 00:53 
    Offline
    Użytkownik

    Dołączył(a): 09 paź 2016
    Posty: 71
    Lokalizacja: Olsztyn
    Pomógł: 1

    Fajna tabelka. Chociaż typowałem a=1, b=258, w zasadzie potwierdza mój tok rozumowania, czyli:
    - podział wartości 16 bitowej na 2 x 8 bit i pobranie jednego bajta dla tab1
    - "zsumowanie" dwóch 8 bitowych elementów tab2, a raczej połączenie w jedną 16bit.
    I wszystko ok, gdyby nie jedna rzecz, której nie rozumiem - czemu to idzie " od tyłu" ?

    Wrzuciłem to zadanie na Rpi, oczywiście dwa ostrzeżenia i brak kompilacji. Po poprawieniu typów wskaźników, czyli
    uint16_t * wsk1 = tab1;
    uint8_t * wsk2 = tab2;
    poszło, wartości to: a=612, b=99.
    Nie wiem, czy można w tym kompilatorze ( gcc ) wyłączyć warningi i kompilować mimo błędów.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 01:17 
    Offline
    Użytkownik

    Dołączył(a): 01 lis 2013
    Posty: 301
    Pomógł: 32

    tomcat65 napisał(a):
    Nie wiem, czy można w tym kompilatorze ( gcc ) wyłączyć warningi i kompilować mimo błędów.

    Jak najbardziej można kompilować z warningami. Nic nie piszesz natomiast, w jaki sposób kompilujesz, jakich przełączników dla gcc używasz...

    _________________
    Pozdrawiam,
    sq8mvy, Paweł



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 01:38 
    Offline
    Użytkownik

    Dołączył(a): 09 paź 2016
    Posty: 71
    Lokalizacja: Olsztyn
    Pomógł: 1

    gizmo5418 napisał(a):
    w jaki sposób kompilujesz, jakich przełączników dla gcc używasz...


    Ponieważ "bawię się" tylko przez konsolę, jedyna znana mi opcja to 'gcc -o' .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 02:03 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 09 maja 2015
    Posty: 8
    Lokalizacja: Lublin
    Pomógł: 0

    tomcat65 napisał(a):
    I wszystko ok, gdyby nie jedna rzecz, której nie rozumiem - czemu to idzie " od tyłu" ?

    Wszystko rozbija się o to, w jaki sposób zapisują i czytają liczby ludzie, a w jaki mikrokontrolery przechowują je w pamięci.

    AVR to architektura Little Endian, dlatego w przypadku danych składających się z kilku bajtów, LSB (Least Significant Byte) jest zapisywany pod niższym adresem, a MSB (Most Significant Byte) pod wyższym. Ludzie zapisują liczby od lewej do prawej, stąd zamieszanie. Na szczęście większość narzędzi programistycznych można skonfigurować, żeby wyświetlały dane w pamięci na obydwa sposoby.

    Proponuję wyguglować materiały na temat Endianness.

    ----------------------------
    Wrzucam nową wersję obrazka, z lekko zmienionym formatowaniem, które powinno poprawić czytelność.

    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 08:11 
    Offline
    Użytkownik

    Dołączył(a): 01 lis 2013
    Posty: 301
    Pomógł: 32

    Rosto napisał(a):
    Wszystko rozbija się o to, w jaki sposób zapisują i czytają liczby ludzie, a w jaki mikrokontrolery przechowują je w pamięci.

    AVR to architektura Little Endian, dlatego w przypadku danych składających się z kilku bajtów, LSB (Least Significant Byte) jest zapisywany pod niższym adresem, a MSB (Most Significant Byte) pod wyższym. Ludzie zapisują liczby od lewej do prawej, stąd zamieszanie. Na szczęście większość narzędzi programistycznych można skonfigurować, żeby wyświetlały dane w pamięci na obydwa sposoby.

    Proponuję wyguglować materiały na temat Endianness.

    Z tą kolejnością bajtów w pamięci w zależności od architektury się zgadza, ale....
    Program, bez względu na jakiej platformie kompilowany, ma się wykonywać w taki sam sposób. O to dba kompilator. Z punktu widzenia programisty nie ma to znaczenia !!!

    To, że u kolegi tomcat65 wychodzą inne wartości, spowodowane jest tym, że nie przepisał dokładnie programu, tylko....
    Może sam się zorientuje co w jego przykładzie jest zamienione:
    tomcat65 napisał(a):
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Jeżeli zostało to celowo zamienione ( aby np. kompilacja przebiegła do końca bez błędów ), to nie zrozumiałe jest zaskoczenie spowodowane innym wynikiem. Przecież ten zapis nie jest równoznaczny z tym, który przedstawiony jest w zadaniu.
    Gdyby tomcat65 rzucił okiem na drugi post, w którym jest podane rozwiązanie występowania owych warningów przy kompilacji...

    _________________
    Pozdrawiam,
    sq8mvy, Paweł



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 13:08 
    Offline
    Użytkownik

    Dołączył(a): 09 paź 2016
    Posty: 71
    Lokalizacja: Olsztyn
    Pomógł: 1

    Ok, ponimaju zapis, i fakt odcztu od MSB dla wartości > 8bit.

    Kol. gizmo - jakiś problem z czytaniem ze zrozumieniem? :)
    Niczemu się nie dziwię, przedstawiłem efekt działania.
    Jak będę znał przełączniki dla kompilatora, aby pomijał błędy i ostrzeżenia - wtedy puszczę taką kompilację i zobaczę co wyjdzie. Wyniki przedstawię.

    Poprawienie błędu było zresztą kolejnym zadaniem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 13:22 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    tomcat65 napisał(a):
    Jak będę znał przełączniki dla kompilatora, aby pomijał błędy i ostrzeżenia

    Nie trzeba znać takich przełączników a wręcz unikać ich włączania - tu chodzi (mała podpowiedź - o zastosowanie JAWNEGO rzutowania) ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 13:35 
    Offline
    Użytkownik

    Dołączył(a): 09 paź 2016
    Posty: 71
    Lokalizacja: Olsztyn
    Pomógł: 1

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


    Bez przełączników, rzutowanie jawne.
    Wynik : a=2, b =513.

    Dzięki panowie, za wyjaśnienia.
    Nie bardzo wiem, jak wam tu pochwały złożyć :) .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 16:04 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 09 maja 2015
    Posty: 8
    Lokalizacja: Lublin
    Pomógł: 0

    tomcat65 napisał(a):
    Dzięki panowie, za wyjaśnienia.
    Nie bardzo wiem, jak wam tu pochwały złożyć :) .

    Podaję numer konta...

    A tak na serio:
    Nikt nie rodzi się ze znajomością wskaźników. Kiedy zacząłem rozumieć jak to działa, poczułem się jakbym miał super-moce. Zawsze chętnie pomogę komuś innemu zdobyć te same super-moce, bo trzeba nam więcej programistów, którzy wiedzą co się dzieje "pod maską".

    Gratulacje, jesteś w elitarnym klubie programistów - mutantów.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 18:18 
    Offline
    Nowy

    Dołączył(a): 08 maja 2019
    Posty: 17
    Pomógł: 1

    lukasz_0xfff napisał(a):
    Obrazek
    I mały komentarz do obrazka konwersja typów wskaźników nie należy do rzutowań nie jawnych. Taki stan rzeczy w zasadzie jest właśnie dobry. Ponieważ gdy zmieniamy typy wskaźników to musimy wiedzieć co robimy( dla tego dodajemy rzutowanie jawnie ) a nie zrobić tego przypadkiem przez pomyłkę co mogło by spowodować sporo błędów w programie i gdyby nie ostrzenie mógłby być problem z odnalezieniem błędu.

    coś dzwoni, ale nie w tym kościele :P

    w C++ tak by się zachowało, w C - nie :P a wyraźnie mowa w temacie, że działamy w języku C

    doczytaj sobie jakie są różnice w tym słowie kluczowym między C i Cpp



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 18:31 
    Offline
    Użytkownik

    Dołączył(a): 09 paź 2016
    Posty: 71
    Lokalizacja: Olsztyn
    Pomógł: 1

    Rosto napisał(a):
    Gratulacje, jesteś w elitarnym klubie programistów - mutantów

    Dziękuję, miło łechcą komplementy i pochlebstwa :) , zwłaszcza to o programiście - którym nigdy nie byłem i już nie będę. A jako żem ciekaw świata, trochę C liznąłem.

    Wszystkim wszystkiego najlepszego w Nowym Roku.

    P.S. Odnośnie zagadki - poza zrozumieniem działania wskaźników, czy do czegokolwiek taka sztuczka może być przydatna?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 31 gru 2019, o 20:36 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    Cytuj:
    P.S. Odnośnie zagadki - poza zrozumieniem działania wskaźników, czy do czegokolwiek taka sztuczka może być przydatna?

    To nie jest żadna sztuczka, w trakcie programowania czasem się zdarza wykorzystać takie właściwości - a z drugiej strony im lepiej się zrozumie działanie wskaźników tym więcej później przychodzi pomysłów na ich zastosowanie we własnych programach.

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 sty 2020, o 02:09 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 09 maja 2015
    Posty: 8
    Lokalizacja: Lublin
    Pomógł: 0

    Już po północy, więc zanim pójdę spać, wrzucam swoje uwagi na temat części trzeciej.

    W czasie streamu ktoś twierdził, że funkcja get_data() nie może być zdefiniowana w main(), ale (co zademonstrował pan Mirek) GCC posiada rozszerzenie, które sobie z tym radzi.

    Moim zdaniem problemem jest to, że zmienna `i` jest używana przez funkcję get_data() do przechowywania stanu PINC, a później ta sama zmienna służy jako licznik w pętli `for`. W konsekwencji, jeśli PINC będzie mieć wartość 199 lub większą, pętla zakończy się przedwcześnie.

    Można to rozwiązać na kilka sposobów:
    1. Stworzyć lokalną wersję zmiennej `i` w get_data():
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

    3. Stworzyć osobną zmienną, która będzie używana tylko jako licznik pętli.
    4. Zamiast
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    napisać po prostu
    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: 1 sty 2020, o 05:06 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    Rosto napisał(a):
    Już po północy, więc zanim pójdę spać, wrzucam swoje uwagi na temat części trzeciej.

    No i kolega bezbłędnie i jako pierwszy rozwiązał psychodeliczną zagadkę ;) Gratulacje!

    ------------------------ [ Dodano po: 2 minutach ]

    A takie funkcje nazywają się "Nested Functions" czyli "Funkcje zagnieżdżone" ;) I o dziwo - bo sam się kiedyś zdziwiłem AVR GCC śmiało je potrafi obsługiwać ;). Jedną z ich wad jest właśnie to że trzeba uważać na zmienne lokalne - ponieważ nieopatrznie można dokonać ich nadpisania tak jak wyjaśnił słusznie kolega wyżej ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 sty 2020, o 11:29 
    Offline
    Użytkownik

    Dołączył(a): 28 wrz 2016
    Posty: 215
    Pomógł: 14

    tomcat65 napisał(a):
    poza zrozumieniem działania wskaźników, czy do czegokolwiek taka sztuczka może być przydatna?
    dołączaam się do pytania
    Moim zdaniem można to wykorzystać do "wyłuskiwqania" konkretnego bajtu z liczby wielobajtowej. A to można wykorzystać np. do szybkiego obliczania kwadratu (wyliczanie RMS), i wyższych potęg (aproksymacja szeregiem). Chętnie poznam inne zastosowania i Wasze opinie.
    Rosto napisał(a):
    Moim zdaniem problemem jest to, że zmienna `i` jest używana przez funkcję get_data()
    Tu mam trochę odmienne zdanie, może dzielę włos na czworo lub nazwiecie mnie malkontentem, ale...
    Nie zostało podane do czego ma dany kod służyć. Więc poszedłem z drugiej strony i zastanowiłem się, gdzie taki kod miałby zastosowanie. Wyobraźmy sobie maszynę, która może rozpocząć działanie dopiero w określonej pozycji, dopóki tej pozycji nie osiągnie ma nic nie robić. Dla PINC mniejszego od 199 pokazuje wartość PINC, dla większego idzie dalej i COŚ robi. W takim układzie pętli for nadanie wartości i inkrementacja są zbędne, ale nie przeszkadzają.
    Jestem bardzo ciekaw Waszych opinii.

    _________________
    de gustibus non est disputandum



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 sty 2020, o 14:33 
    Offline
    Nowy

    Dołączył(a): 15 gru 2014
    Posty: 13
    Pomógł: 0

    tischtennis napisał(a):
    lukasz_0xfff napisał(a):
    Obrazek
    I mały komentarz do obrazka konwersja typów wskaźników nie należy do rzutowań nie jawnych. Taki stan rzeczy w zasadzie jest właśnie dobry. Ponieważ gdy zmieniamy typy wskaźników to musimy wiedzieć co robimy( dla tego dodajemy rzutowanie jawnie ) a nie zrobić tego przypadkiem przez pomyłkę co mogło by spowodować sporo błędów w programie i gdyby nie ostrzenie mógłby być problem z odnalezieniem błędu.

    coś dzwoni, ale nie w tym kościele :P

    w C++ tak by się zachowało, w C - nie :P a wyraźnie mowa w temacie, że działamy w języku C

    doczytaj sobie jakie są różnice w tym słowie kluczowym między C i Cpp

    Otóż wszystko się zgadza, w C również zwróci wskaźnik adekwatny do typu tablicy nawet po worningu da się to wywnioskować, tak auto NIE istnieje w C ale w tym przypadku po prostu używając cpp można przez to pokazać jak myśli kompilator. Z resztą Cpp jest rozszerzeniem C tak więc w tych elementarnych rzeczach takich jak tablice i wskaźniki zachowa się tak samo.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 sty 2020, o 16:59 
    Offline
    Nowy

    Dołączył(a): 08 maja 2019
    Posty: 17
    Pomógł: 1

    Właśnie "auto" istnieje w C - mało tego jest domyślnie używane dla zmiennych lokalnych i dlatego nie trzeba tego pisać :P
    Używając kompilatora Cpp zmieniasz całkiem znaczenie tego słowa kluczowego, więc nie pokazujesz wtedy "jak myśli kompilator" - bo to są 2 różne mechanizmy.
    Zrób to samo ale bez auto w C - napisałeś, że to dzięki "auto" kompilator sam ogarnął typ - no nie. A to że nie podałeś typu spowodowało zadziałanie innego mechanizmu i tu auto nie ma nic do gadania w C.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 sty 2020, o 00:08 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27378
    Lokalizacja: Szczecin
    Pomógł: 1043

    Alef2 napisał(a):
    tomcat65 napisał(a):
    poza zrozumieniem działania wskaźników, czy do czegokolwiek taka sztuczka może być przydatna?
    dołączaam się do pytania
    Moim zdaniem można to wykorzystać do "wyłuskiwqania" konkretnego bajtu z liczby wielobajtowej. A to można wykorzystać np. do szybkiego obliczania kwadratu (wyliczanie RMS), i wyższych potęg (aproksymacja szeregiem). Chętnie poznam inne zastosowania i Wasze opinie.
    Rosto napisał(a):
    Moim zdaniem problemem jest to, że zmienna `i` jest używana przez funkcję get_data()
    Tu mam trochę odmienne zdanie, może dzielę włos na czworo lub nazwiecie mnie malkontentem, ale...
    Nie zostało podane do czego ma dany kod służyć. Więc poszedłem z drugiej strony i zastanowiłem się, gdzie taki kod miałby zastosowanie. Wyobraźmy sobie maszynę, która może rozpocząć działanie dopiero w określonej pozycji, dopóki tej pozycji nie osiągnie ma nic nie robić. Dla PINC mniejszego od 199 pokazuje wartość PINC, dla większego idzie dalej i COŚ robi. W takim układzie pętli for nadanie wartości i inkrementacja są zbędne, ale nie przeszkadzają.
    Jestem bardzo ciekaw Waszych opinii.


    Uwierz mi sam kod nie ma żadnego znaczenia ;) ot wymyślone cokolwiek - a jedyny taki błąd jaki chciałem pokazać przy funkcjach zagnieżdżonych to właśnie problem z wykorzystaniem zmiennych lokalnych ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    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: 21 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO