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 12 kwi 2025, o 14:04


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 19 sie 2014, o 18:44 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2013
    Posty: 246
    Pomógł: 0

    Eksperymentując z językiem C pod Linuksem natknąłem się na kolejny problem.
    Mianowicie napisałem prostą aplikację, która łączy się z serwerem MPD (daemon pełniący funkcję odtwarzacza muzycznego), parsuje dane i wyświetla informacje o muzyce na wyświetlaczu 2x16 (korzystając z biblioteki wiringPi). Cały kod jest tutaj:

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


    Właściwie funkcje parsujące i wyświetlające są nieważne. Najważniejsze jest to, co dzieje się na początku funkcji main() oraz w jej pętli głównej. Szczególnie ważny jest tutaj fakt, że funkcja recv() pobiera do bufora komplet danych odsyłanych przez serwer..

    Dzisiaj postanowiłem trochę upiększyć kod, wydzielając funkcje odpowiedzialne za łączność z MPD do osobnej biblioteki. Tak oto powstały dwa pliki:

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



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


    No i jeszcze plik z głównym kodem programu:

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


    Ta wersja programu nie chce działać jak należy. Po godzinie zabawy udało mi się znaleźć przycyznę - zamiast całej wiadomości (jak przedtem) recv() odbiera tylko po kilka znaków. Ktoś wie, dlaczego tak się dzieje? Ustawienie flag MSG_WAITALL w niczym nie pomaga. Można by pewnie próbować odbierać poszczególne fragmenty w pętli, łącząc je potem, zupełnie jak na AVR-ach. Jednak przede wszystkim interesuje mnie dlaczego kod przestał działać. Przecież nadając komunikat za pomocą TCP wysyłam również iformację o jego długości, więc druga strona powinna wiedzieć, czego się spodziewać. Przecież przedtem działało jak należy... Coś się mogło "wyłączyć"?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 sie 2014, o 20:27 
    Offline
    Użytkownik

    Dołączył(a): 02 lut 2014
    Posty: 38
    Lokalizacja: Jaworzno
    Pomógł: 2

    Atlantis napisał(a):
    zamiast całej wiadomości (jak przedtem) recv() odbiera tylko po kilka znaków. Ktoś wie, dlaczego tak się dzieje?


    rc = recv(sd, ans, sizeof(ans), MSG_WAITALL);

    Zdaje się, że w tym przypadku sizeof(ans) == 4.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 sie 2014, o 21:08 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2013
    Posty: 246
    Pomógł: 0

    gordo napisał(a):
    Atlantis napisał(a):
    zamiast całej wiadomości (jak przedtem) recv() odbiera tylko po kilka znaków. Ktoś wie, dlaczego tak się dzieje?


    rc = recv(sd, ans, sizeof(ans), MSG_WAITALL);

    Zdaje się, że w tym przypadku sizeof(ans) == 4.



    Hmm... Z czego to wynika? Bo wydawało mi się, że do funkcji przekazałem bufor, który miał jakieś 1000 znaków pojemności...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 sie 2014, o 08:07 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2013
    Posty: 246
    Pomógł: 0

    mokrowski napisał(a):
    Przy przesyłaniu wskaźnika do funkcji, nie jest przesyłana informacja o wielkości bufora/tablicy na którą on ew. wskazuje. Typ traci informację o wielkości danych. A że wskaźnik jest na adres 32-bitowy, to i wielkość jest 4 bajty. Poza tym sizeof() to operator.


    Oczywiście masz rację, przepraszam za zamieszanie.
    Chciałbym przy tej okazji zapytać o jedno. Czy informacja o wielkości jest też tracona w przypadku przekazywania tablicy wchodzącej w skład struktury przez wskaźnik na tą strukturę. Czy konstrukcja sizeof(wskaźnik_na_strukture->tablica) zwróci prawidłową wartość?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 sie 2014, o 08:58 
    Offline
    Użytkownik

    Dołączył(a): 05 lut 2013
    Posty: 302
    Pomógł: 19

    Odpowiedz jest prosta i w wynika z pierwszego pytania, a jesli nie widzisz jej to w 5 minut to sobie sprawdzisz.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 sie 2014, o 10:22 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2013
    Posty: 246
    Pomógł: 0

    W porządku, już sprawdziłem. Tak jak podejrzewałem - informacja jest przekazywana.
    Czyli to chyba faktycznie najlepszy sposób na przekazywanie większej ilości danych "w dół", do kolejnych funkcji.



    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 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