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



Teraz jest 28 mar 2024, o 18:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 11 paź 2020, o 13:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 148
Lokalizacja: KTT
Pomógł: 1

Witam,
Kombinuję przy zapisie/odczycie ustawień urządzenia do/z EEPROM. Chodzi o to, że przy zmianie ustawień, zapisywana jest oda razu kopia struktury do EEPROM, a przy uruchomieniu urządzenia odczyt struktury z EEMEM do struktury w RAM.
Wszystko działa poprawnie gdy używam bezpośrednio funkcji systemowych. Jednak chciałem sobie uprościć zadanie, żeby nie wpisywać za każdym razem wielkości bloku danych i to już nie działa tak jakbym chciał. Już pokazuję na przykładach o co chodzi:

To pewnie mało ważne, ale mam taką strukturę danych oraz zmienne, w których przechowuję ustawienia pieca:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Gdy stosuję funkcje systemowe (poniżej) wszystko jest ok. Dane ładnie się zapisują i odczytują.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jednak napisałem funckcje, w których przekazuję tylko źródło i miejsce docelowe danych, a rozmiar danych już miał się ustawiać automatycznie (i tu pewnie robię jakiegoś babola).
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Przy takim rozwiązaniu to nie działa.

Działa dopiero gdy rozmiar danych określę na sztywno
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Co mam wpisać w sizeof( ??? ) żeby rozmiar danych był obliczany automatycznie, żebym nie musiał za każdym razem zmieniać tego ręcznie :?:
Będę wdzięczny za podpowiedź.

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2020, o 15:51 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

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

To Ci nie działa ponieważ jako argument sizeof podałeś wskaźnik i operator zwraca Ci rozmiar typu wskaźnikowego a nie struktury.
Jeżeli chcesz, aby zwrócony był rozmiar struktury to musisz to zrobić właśnie tak jak już to zrobiłeś:

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

Chyba zamiast uprościć to sobie komplikujesz, nie bardzo widzę co i w jakim celu chcesz bardziej automatyzować.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2020, o 16:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 148
Lokalizacja: KTT
Pomógł: 1

Heh no to sobie "uprościłem" ;)
Ale chcę trochę podrążyć temat i w takim razie spytam inaczej:
Jak wyłuskać wielkość(rozmiar) elementu/zmiennej/typu, na który wskazuje wskaźnik?

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2020, o 16:09 
Offline
Użytkownik

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

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

Co mam wpisać w sizeof( ??? ) żeby rozmiar danych był obliczany automatycznie, żebym nie musiał za każdym razem zmieniać tego ręcznie

Za pomocą funkcji inline tego nie zrobisz. We fragmencie, który zacytowałem sizeof(ram_data) przyjmie wartość 2, ponieważ taki jest rozmiar samego wskaźnika. Aby sprawdzić rozmiar typu danych wskazywanych przez wskaźnik (czyli Twojej struktury TFURNANCE) należałoby użyć składni sizeof(*ram_data), ale u Ciebie to nie zadziała, ponieważ ram_data jest typu void*, więc kompilator nie zgadnie, jakiego typu elementy będziesz przekazywał do funkcji. Żeby to zadziałało parametr ram_data musiałby być typu TFURNANCE*
Możesz za to spróbować osiągnąć cel za pomocą makra:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


EDIT: Poprawiłem nazwę funkcji: było eeprom_write_block, powinno być eeprom_read_block



Ostatnio edytowano 11 paź 2020, o 16:28 przez andrews, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2020, o 16:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 148
Lokalizacja: KTT
Pomógł: 1

Uniwersalność widać nie zawsze ma sens...
ale makro trochę upraszcza sprawę, dzięki:)

_________________
Gordon



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ł: Brak zidentyfikowanych użytkowników i 18 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