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



Teraz jest 24 sty 2026, o 00:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 14 gru 2016, o 19:03 
Offline
Nowy

Dołączył(a): 14 paź 2015
Posty: 9
Pomógł: 0

Witam.
Mam problem jak przechować wartość pól struktury w tablicy znaków. Przedstawię może odrazu kod to pownno być wiadomo o co mi chodzi.
Mam strukturę daną tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

Na chwilę obecną zapisuję sobie w tej tablicy znaków pola struktury w taki 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.

W ten sposób rozbijam sobie zmienne 16 i 32 bitowe na większą liczbę zmiennych. I ten prezentowany kod (funkcja) działa (a przynajmniej tak wynika z pierwszych testów). Czy znacie może jakiś sposób aby ta "konwersja" była przeprowadzona w sposób bardziej elegancki? Może znacie Koledzy sposób aby przypisywać do tablicy nie właściwe wartości pól struktury, a wskaźnik do struktury (kombinuję w tą stronę, ale nie mogę nic działającego wymyślić). No bo jak rozwiązać taki problem, gdyby struktura zawierała nie parę, a np. 100 takich pól?
Mam nadzieję że w miarę jasno to opisałem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2016, o 20:17 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Jeśli chcesz skopiować dane ze struktury do tablicy, możesz użyć funkcji memcpy().
Jeśli chcesz mieć tablicowy dostęp do danych struktury, możesz użyć unii.

Mógłbyś zdradzić, do czego te manipulacje mają służyć? Być może da się to rozwiązać inaczej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2016, o 20:30 
Offline
Nowy

Dołączył(a): 14 paź 2015
Posty: 9
Pomógł: 0

No pewnie zostanę za to ostro skarcony :) ale oczywiście powiem
Muszę uruchomić komunikację SPI z Raspberry. Głupim, ale odgórnie nałożonym zaleceniem aby ta komunikacja była jak najszybsza. Dlatego rozważam czy nie zrezygnować z polecanej i szeroko wykorzystywanej komunikacji w zapisie tekstowym na rzecz binarnej. Ramka będzie ściśle określona, wiem jakie dane będą zawsze przesyłane. Także powinno się chyba udać.
A ponieważ mogę na raz przesłać tylko jeden bajt przez SPI, w przerwaniach od tego modułu (gdy pojawią sie dane od Mastera) wysyłałbym kolejne elementy tablicy poprzez prostą zmianę nr indeksu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2016, o 21:16 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Jeśli o to chodzi, możesz przecież to samo uzyskać za pomocą wskaźnika na strukturę bez użycia tablicy.
Przykładowo:
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 przykład, można to rozwiązać na różne sposoby tylko za pomocą wskaźników, efekt będzie taki sam, jak w przypadku użycia tablicy.

Oczywiście należy pamiętać, że w przypadku przesyłania danych pomiędzy różnymi systemami należy zapewnić odpowiednią interpretację odebranych danych, mając na względzie endianness oraz struct padding. Wpisanie odebranych danych bezpośrednio do struktury (w ten sam sposób, jak przy wysyłaniu) może nie przynieść oczekiwanych rezultatów. To może być nieco bardziej kłopotliwe, niż samo wysłanie.

O zabezpieczeniu transmisji sumą kontrolną już pisał nie będę ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2016, o 21:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

aa... to tak się pisze.
rzutowanie adresu do wskaźnika. :)
andrews napisał(a):
uint8_t *wynik_ptr = (uint8_t*)&wynik;

A ja tańczyłem z tą gwiazdką poza nawiasem i była ciągle kiszka. :)
Dzięki andrews .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2016, o 21:50 
Offline
Moderator
Avatar użytkownika

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

andrews napisał(a):
mając na względzie endianness oraz struct padding.


DOKŁADNIE - szczególnie na ten padding bym zwrócił uwagę ;) bo się można przejechać

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

Daro69 napisał(a):
aa... to tak się pisze.
rzutowanie adresu do wskaźnika. :)
andrews napisał(a):
uint8_t *wynik_ptr = (uint8_t*)&wynik;

A ja tańczyłem z tą gwiazdką poza nawiasem i była ciągle kiszka. :)
Dzięki andrews .


(char*)

(uint8_t*)

(int*)

to ZAWSZE oznacza rzutowanie na typ wskaźnikowy ;) ... i nie ważne czy dotyczy adresu czy zmiennej czy czegokolwiek - warto o tym pamiętać ;)

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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO