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



Teraz jest 12 gru 2024, o 21:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 17 sie 2014, o 10:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Hej!

Witam wszystkich. Wiec ostatnio na fali jest pisanie bibliotek wiec i ja pomyslalem ze zabiore sie za jedna. Jednakze mam chyba problemy ze zrozumieniem interakcji pomiedzy wskaznikami w uniach / strukturach :(

Mam sobie taka definicje unii. Na wstepie dodam , ze ten "qPacket" pochodzi z poradnika Mirka o DS3231 gdzie uzyskuje on szybki dostep do struktury co pozniej chcialem wykorzystac w obliczanie "checksum"
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wiec mam kilka pytan (oczywiscie krytyka kodu i podejscia mile widziana :) )

AD.1
W programie glownym chcialbym zainicjalizowac moj wskaznik na ta unie zeby nie "bujac sie" po przypadkowych adresach. Czy powinenem uzyc malloc ? czy po prostu hardcore jakas wartosc i bede mial miejsce w pamieci na caly wskaznik ?

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


AD.2 No i teraz fajna rzecz - chcialbym sobie zrobic funkcje ktora bedzie brala ten wskaznik jako prarametr - obrabiala go - i zwracala sam wskaznik dzieki czemu mozna bedzie wykorzystac go w innych funkcjach. W zwiazku z tym pytanie czy takie podejscie tu jest dobre czy gdzies sa jakies super bledosy :D ?

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


AD.3 No i teraz super ale podejrzewam , ze zeby wyslac to przez UART musze zrobic rzutowanie na ninny typ ? Napisalem sobie dwie funkcje.

AD.3a Jedna funkcja ma wyslac wlasnie caly pakiet przez UART - powinno byc rzutowanie na (char *) ?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


AD.3b a druga to calkowita podstawa do wyslania w UART
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


AD.4 Obliczanie Checksum - wykorzystujac wlasnie ten indeksowany szybki dostep chcialem obliczyc checksum (*pomysl z LONG pochodzi z kodu w internecie :( ) Wiec chcialem go obliczyc a nastepnie uzywajac przesuniec bitowych odpowiednio ustawic w moim pakiecie.

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





Wiec podsumowujac :) moje pytania to :
AD.1 - Czy poprawnie powinenem jakos zainicjalizowac wskaznik ? I jesli tak (* a wydaje mi sie ze tak:) ) to w jaki sposob zainicjalizowac wskaznik do takiej uni ?
AD.2 - Czy forma zwracania wskaznika aby pozniej go wykorzystac jest poprawna ?
AD.3 - Czy moj "pomysl" wysylania przez UART ma szanse na sukces :) ?
AD.4 - Czy uzycie long to dobry pomysl ? Podejrzewam , ze w tym wypadku takze brakuje mi rzutowania na inny typ danych ?
Z gory dzieki za wsparcie

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2014, o 13:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Widzę, że nikt nie odpowiedział, to może ja spróbuję trochę pomóc.
AD.1 - Zadeklarowałeś wskaźnik, ale nie zadeklarowałeś zmiennej, więc wskaźnik jest niezainicjowany i nie możesz go używać, bo nie wskazuje tego co byś chciał. Malloc możesz użyć, ale można najzwyczajniej zrobić tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


AD.2 - Nie wiem jaka jest Twoja intencja, ale przekazujesz wskaźnik do funkcji,
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


potem zmieniasz jakieś tam wartości i do funkcji liczącej crc przekazujesz wskaźnik na twój wskaźnik,

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


następnie zwracasz wskaźnik, co nie jest konieczne, bo przecież przekazałeś go do Twojej funkcji a ona zmienia tylko komórki w pamięci pod adresem przechowywanym we wskaźniku, zaś adres się nie zmienia.

Tyle na teraz, mam nadzieję, że nic nie pomieszałem (reszta forumowiczów - krzyczeć), resztę sprawdzę potem. Aha i polecam używać typów o znanej długości np uint16_t zamiast word, łatwiej się czyta taki kod.

_________________
Pozdrawiam, Adrian.



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

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

AD.2 No i teraz fajna rzecz - chcialbym sobie zrobic funkcje ktora bedzie brala ten wskaznik jako prarametr - obrabiala go - i zwracala sam wskaznik dzieki czemu mozna bedzie wykorzystac go w innych funkcjach. W zwiazku z tym pytanie czy takie podejscie tu jest dobre czy gdzies sa jakies super bledosy

O ile przewidujesz ze twoja funkcja bedzie uzywana jako parametr do innej funkcji ktora spodziewa sie na wejsciu wskaznika to wtedy zwracanie wskaznika ma sens.
O ile tez nie przewidujesz ze funkcja wykonuje operacje ktore moga nie wyjsc i wypadaloby poinformowac o tym ustawiajac odpowiednia wartosc zwracana przez return.

CalculateChecksum( &Command_Packet ); // Passing pointer so we can calculate cheksum
tu chyba powinno byc CalculateChecksum( Command_Packet );
poniewaz Command_Packet jest juz wskaznikiem na strukture SPACKET
a funkcja CalculateChecskum spodziewa sie wlasnie wskaznika.

USART_send_char( &data_to_send[var] )
czy tu nie powinno byc:
data_to_send->qPacket[var] ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2014, o 15:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

charsz napisał(a):
do innej funkcji ktora spodziewa sie na wejsciu wskaznika

O tej możliwości zapomniałem, wtedy rzeczywiście zwracanie wskaźnika ma sens.
charsz napisał(a):
CalculateChecksum( &Command_Packet ); // Passing pointer so we can calculate cheksum
tu chyba powinno byc CalculateChecksum( Command_Packet );

Też tak podejrzewam. Dlatego napisałem, że obecnie przekazuje wskaźnik na wskaźnik.
AD.3 - Tu zrobiłbym jak kolega charsz proponuje, bo tak jak jest raczej nie powinno się dać skompilować nawet. Sprawdzasz sobie na bieżąco czy Twój kod się kompiluje i działa? Czy piszesz całość a potem szukasz błędów?
AD.4 - Powinno działać.

_________________
Pozdrawiam, Adrian.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2014, o 16:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Witam! ,

Przepraszam , ze dopiero teraz odpisuje :) ale zalatany jestem i na dodatek jeszcze Mirek tak szybko produkuje poradniki o OLED :)

Ale do rzeczy :)

co do AD.1 dzieki za wyjasnienie - szukalem wlasnie informacji jak sie do tego zabrac i to rozwiewa moje watpliwosci w zakresie inicjalizacji wskaznikow :D

AD.2 To dokladnie chcialbym uzywac w opisany i potwierdzony sposob. Czyli wywoluje sobie funkcje jako parametr funkcji ktora oczekuje wskaznika. Super!

AD.3 oraz AD.4 beda calkowicie zmienione! Rozmawialem z naszym guru :) Ogolnie chcialem szybko "przeleciec" po moim "obiekcie" metoda tablicowa zeby obliczyc check sum.
Natomiast Mirek podpowiedzial ze moge uzyc wskaznika na wskaznik :)


Z gory wszystkim dzieki i jak tylko dopracuje kod to bede go tutaj dalej publikowac!

_________________
sig off ;(



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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