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? 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 15 cze 2025, o 16:04


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
    Autor Wiadomość
    PostNapisane: 15 lip 2015, o 07:53 
    Offline
    Nowy

    Dołączył(a): 30 cze 2015
    Posty: 13
    Pomógł: 1

    Witam wszystkich ekspertów i miłośników c++. Po latach programowania obiektowego w językach 'wysokiego poziomu' człowiek tak bardzo oddalił się od sprzętu, że teraz co drugie wyrażenie z c czy c++ powoduje zawieszanie się moich półkul mózgowych...

    Analizuję ostatnio bibliotekę Mirf do obsługi modułu NRF24L01 poprzez SPI. Biblioteka ta jest napisana w taki sposób, że do sprzętu (SPI) odwołuje się poprzez klasę 'drivera'. Przy inicjacji programu można do Mirf-a przekazać swojego 'drivera' który będzie zajmował się obsługą sprzętu.
    Przykład jest bardzo prosty, ale tutaj już nie rozumiem jak to działa. Wygląda to tak jakby klasa drivera była statyczna (nie wymagała instancjalizacji obiektu), ale w kodzie nie widzę nigdzie typowych deklaracji metod 'static' czy 'static inline'.

    Oto przykład.

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


    A teraz deklaracja konkretnego drivera - obsługującego sprzętowe rejestry SPI:
    Składnia: [ Pobierz ] [ Ukryj ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    I tutaj pierwsze pytania: dlaczego ciała metod zadeklarowane są w pliku *.h ?
    I czy deklaracja zmiennej:

    MirfHardwareSpiDriver MirfHardwareSpi;

    powoduje powstanie instancji obiektu? Chyba nie. Instancja powstałaby chyba gdyby było:

    MirfHardwareSpiDriver MirfHardwareSpi = MirfHardwareSpiDriver();

    Czyli klasa zachowuje się jak statyczna...

    Później mamy główną klasę do obsługi modułu NRF24L01 zadeklarowaną w sposób:
    Składnia: [ Pobierz ] [ Ukryj ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    A potem w kodzie programu przekazujemy driver:
    Składnia: [ Pobierz ] [ Ukryj ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Driver SPI w klasie Nrf24l trzymany jest jako wskaźnik, a nie po prostu jako referencja. Znowu: wygląda mi to na klasę statyczną. Tylko dlaczego metody zadeklarowane są jako 'virtual' a nigdzie nie ma 'static'?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lip 2015, o 12:55 
    Offline
    Nowy

    Dołączył(a): 30 cze 2015
    Posty: 13
    Pomógł: 1

    Serdeczne dzięki za wyjaśnienia. Przyznam się, że jakieś pół godziny po napisaniu tego posta natrafiłem na całkiem nieźle (to znaczy dość szczegółowo oraz bardzo zrozumiale) napisany wykład: http://edu.pjwstk.edu.pl/wyklady/pro/sc ... G2CPP.html
    I wtedy zrozumiałem samo zadeklarowanie zmiennej typu klasowego powoduje wywołanie konstruktora domyślnego. A kiedy doczytałem o konstruktorach kopiujących, oraz że przypisanie zmiennej klasowej na zasadzie a = b to wcale nie jest przekazanie referencji do obiektu, tylko utworzenie nowego i skopiowanie 'zawartości', to uświadomiłem sobie że C++ to jednak dalej C, a nie to w czym programowałem od kilkunastu lat.

    Tak że przepraszam za zamieszanie. Jednak wyryte przez lata schematy myślowe nie poddają się tak łatwo. Gdyby nie AVR, to w moim wieku nie ośmieliłbym się już uczyć c/c++ :-)

    Cytuj:
    W plikach *.h można implementować całe ciała metod klasy. Kompilator wtedy "inlinuje" kod takiej klasy. Tak się często także czyni jeśli masz szablony.

    To kiedy stosujemy słówko 'inline'?



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

    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:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO