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



Teraz jest 29 lis 2024, o 15:52


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: 27315
Lokalizacja: Szczecin
Pomógł: 1041

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: 27315
Lokalizacja: Szczecin
Pomógł: 1041

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: 27315
Lokalizacja: Szczecin
Pomógł: 1041

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: 27315
Lokalizacja: Szczecin
Pomógł: 1041

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: 27315
Lokalizacja: Szczecin
Pomógł: 1041

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