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 18 lip 2025, o 21:10


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
    Autor Wiadomość
    PostNapisane: 14 wrz 2015, o 16:10 
    Offline
    Nowy

    Dołączył(a): 18 kwi 2014
    Posty: 24
    Pomógł: 0

    Witam. Posiadam taki oto problem.

    Próba odczytu wartości poprzez wskaźnik daje czasami zawyżoną wartość o 256 :shock:

    W przerwaniach nie korzystam z tych zmiennych.

    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 wrz 2015, o 16:20 
    Offline
    Moderator
    Avatar użytkownika

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

    A czy ty wiesz co ty robisz rzutując jawnie na typ wskaźnikowy (uint16_t *) swoją strukturę w której masz wartości 8-bitowe ? .... toż sam na własne życzenie robisz sobie masakrę :(

    _________________
    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: 14 wrz 2015, o 17:01 
    Offline
    Nowy

    Dołączył(a): 18 kwi 2014
    Posty: 24
    Pomógł: 0

    Jak to Mirku zrobić fachowo?

    Myślałem, że jak można rzutować liczbę 8 bitową na 16 bitową tak samo można postąpić ze wskaźnikem.

    Ciekaw jestem jak przekazać tą wartość zachowując uniwersalność funkcji.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 wrz 2015, o 17:10 
    Offline
    Moderator
    Avatar użytkownika

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

    No zobacz jakiego typu masz elementy w strukturze ? 8-bitowe tak ? więc jeśli chcesz miziać je za pomocą indeksów 8-bitowych to zmień rzutowanie na 8-bitowe jawne rzutowanie zamiast 16-bitowego

    ale z drugiej strony zastanawiam się po co takie sztuczki masz czynić skoro można przekazać do funkcji typ strukturalny - tyle że ty w tym zrzucie ekanu jak widać, najpierw dobrze zacząłeś i zdefiniowałeś sobie typ strukturalny Czas_t; ale później go bez sensu zakomentowałeś i stworzyłeś czystą strukturę w pamięci, wtedy co ? brak typu

    A tak mógłbyś przekazać do funkcji argument tego typu

    fun( Czas_t * czas);

    i w funkcji odwoływać się do pól

    czas->minuty
    czas-_godziny

    itp

    _________________
    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: 14 wrz 2015, o 17:34 
    Offline
    Nowy

    Dołączył(a): 18 kwi 2014
    Posty: 24
    Pomógł: 0

    Mirku, ta Funkcja_testowa jest tylko do podglądania czy nie dzieją się jakieś krzaki.

    We własciwym użyciu ma to być taka Funkcja, którą potrafi odebrać zmienną typu int16_t i zmodyfikować ją. Dlatego, że w C nie ma referencji, muszę przesłać ją jako wskażnik na int16_t. Funkcja ma być uniwersalna.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 wrz 2015, o 19:50 
    Offline
    Moderator
    Avatar użytkownika

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

    Konradev2 napisał(a):
    We własciwym użyciu ma to być taka Funkcja, którą potrafi odebrać zmienną typu int16_t i zmodyfikować ją. Dlatego, że w C nie ma referencji, muszę przesłać ją jako wskażnik na int16_t. Funkcja ma być uniwersalna.

    Nie za bardzo widzę związku w tym co piszesz - bo co to za uniwersalność funkcji że ma mieć rzutowanie na typ wskaźnikowy uint16_t ?

    Raczej mi wynika z tego, że na razie nie do końca albo prawie w ogóle jeszcze nie rozumiesz jak działają wskaźniki i jakie to daje możliwości. A sądzę tak po tym, co piszesz - że dla ciebie jakimś problemem jest to że w C nie ma referencji .... Wskaźniki to dużo więcej niż przekazywanie przez referencję w porównaniu do języków w których nie ma wskaśników więc jak widać na tym etapie próbujesz się dopasować w programowaniu w C do jakiegoś tam innego swojego języka

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



    a ciało funkcji np:

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


    to tylko jedna z miliona możliwości bo np .... dzięki wskaźnikom można robić jeszcze może mniej czytelne dla początkującego ale nawet takie rzeczy: ;)

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


    a później w kodzie wywołać 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.



    albo jeszcze inne ciało funkcji


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



    albo jakbym się uparł to i nawet tak (ale uprzedam to już bezsens totalny - pokazuję tylko, że w C dzięki wskaźnikom można WSZYSTKO - rozumiesz? ) ;)

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

    (dziwnie wygląda co ?) ;)

    i później można by to wywołać tak jak masz w kodzie czyli

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


    ale uwaga - NIE RÓB TAK przypadkiem ;) bo to kompletna BZDURA pomimo że może działać, tyle, że jeden mały błąd w ciele tej funkcji (a że nie znasz wskaźników to niechybnie byś go popełnił) i nie pozbierasz się, jak ci zacznie program fikołki wyprawiać.

    Reasumując - jeśli chcesz szybciej i wydajniej zacząć pracować w C to postaraj się oderwać od nawyków poprzedniego języka którego używasz może do innych celów i powoli zacznij myśleć w C. A żeby to zrobić ćwicz jak najwięcej wskaźniki i staraj się je zrozumieć. Bo jak zaskoczysz - to zobaczysz, że będziesz miał tak jak ja - ;) że teraz jak zabieram się za programowanie czegoś na PC w moim Delphi to pluję sobie w brodę że tam nie ma połowy tych mechanizmów co mam w C na prockach ;)

    _________________
    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: 14 wrz 2015, o 22:36 
    Offline
    Nowy

    Dołączył(a): 18 kwi 2014
    Posty: 24
    Pomógł: 0

    Mirku, cenię sobie wszelkie uwagi i bardzo ludzkie Forum ale chyba źle się zrozumieliśmy,

    Potrafie operować wskaźnikami,bo fakt bez nich kod wygląda niekiedy fatalnie i zajmuje dużo za dużo miejsca, Ale tutaj zdziwiłem się, ale i to dobre, człowiek uczy się przez całe, życie.

    Ta UNIWERSALNOŚĆ funkcji ma polegać na tym, że potrafi ona przyjąć Liczbę int16_t, i jednocześnie bez zwracania niczego ma ona zmodyfikować tą przesłaną Liczbę np. wpisać jej 0


    Do funkcji przyjmującej Liczbę int16_t moge przesłać Liczbę int8_t.

    Przyznam się bez bicia, że myślałem iż ze wskaźnikiem jest tak samo.

    Do tej uniwersalnej funkcji chciałbym wysylać liczby z pól struktur i liczby z poza struktur.

    P.S. Coś ostatnio wszyscy robią zegary :d



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 wrz 2015, o 22:42 
    Offline
    Moderator
    Avatar użytkownika

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

    Konradev2 napisał(a):
    Do funkcji przyjmującej Liczbę int16_t moge przesłać Liczbę int8_t.

    Przyznam się bez bicia, że myślałem iż ze wskaźnikiem jest tak samo.


    Przyznam, że ja niestety też nie za bardzo rozumiem o co tobie chodzi i pewnie się dlatego nie rozumiemy

    jak można by było nie móc przesłać liczby uint8_t do funkcji której argumentem jest uint16_t ? ;) kompletnie nie wiem dlaczego tak sądzisz ...?
    oczywiście że można - tylko, że ty piszesz o zwykłych typach a na obrazku pokazujesz rzutowanie na typ wskaźnikowy (int16_t *)

    jednocześnie nie pokazujesz swojego nagłówka funkcji .... sorki ale tak to rzeczywiście ciężko pomóc ;) ... musisz jaśniej zadawać pytania i w takim przypadku posłużyć się fragmentem kodu zamieszczonym w poście a nie obrazkiem z eclipsa

    _________________
    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: 14 wrz 2015, o 22:50 
    Offline
    Nowy

    Dołączył(a): 18 kwi 2014
    Posty: 24
    Pomógł: 0

    A właśnie Mirku, skoro już piszesz to chciałbym zgłosić błędnie dzialajacy kod do obliczania dnia tygodnia z Twojego poradnika o RTC ( ktory pomogł mi i zainspirował ). Dla 1 marca 2016 roku kod oblicza, że jest to Poniedziałek a faktycznie to Wtorek.


    Czyli mam rozumieć, że nie można operować uin16_t * Problem. na zmiennych typu uint8_t po wczesniejszym przypisaniu ich do tego wskaźnika ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 wrz 2015, o 23:36 
    Offline
    Moderator
    Avatar użytkownika

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

    Konradev2 napisał(a):
    Dla 1 marca 2016 roku kod oblicza, że jest to Poniedziałek a faktycznie to Wtorek.

    O żesz w mordę! ależ BABOLA znalazłeś ;) .... ooo jak dobrze ;) bo od 1-go marca 2016 roku już wszystkie dalej dni są źle obliczane - masakra! ;)

    ale na szczęście już znalazłem na to lekarstwo!

    trzeba zmienić tylko ciało funkcji do obliczania dnia tygodnia w ten sposób:

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


    muszę to opublikować na blogu i dać notkę na poradniku wideo ! ;)

    dzięki za zgłoszenie tego BABOLA

    ------------------------ [ Dodano po: 1 minucie ]

    Konradev2 napisał(a):
    Czyli mam rozumieć, że nie można operować uin16_t * Problem. na zmiennych typu uint8_t po wczesniejszym przypisaniu ich do tego wskaźnika ?


    Posłuchaj - tak jak mówię, czuję, że nie rozumiesz wskaźników bo czym innym jest rzutowanie na typ wskaźnikowy a czym innym przekazanie zmiennej przez wskaźnik ... tu widzę masz jakiś problem. Podaj lepiej konkretny przykład co np chcesz zrobić - to łatwiej na konkretnym przykładzie będzie mi coś wyjaśnić.

    _________________
    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: 10 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Google [Bot] i 17 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