1aam2am1 |
» 2017-02-04 18:53:18 Ja piszę w czystym c na atmegi. Nie w Arduino. Ale tam w tej bibliotece jest update() a i poco piszesz funkcje. Napisz macro do którego podasz obiekt i nazwę pola. Wykorzystasz typof by dostać typ obiektu podasz to do macra ofsetof i podasz to do funkcji którą aktualnie używasz znaczy put. Funkcji takiej nie napiszesz ale macro tak. |
|
kamil2234 Temat założony przez niniejszego użytkownika |
» 2017-02-04 22:00:48 No ale wydaje mi się, że tak właśnie robię? #define offsetof(s,m) (size_t)&(((s *)NULL)->m)
size_t offset_dns_p0 = offsetof( MySetingsTab, dns_p0 );
|
|
1aam2am1 |
» 2017-02-04 22:42:35 Ty liczysz tylko ofset i zapisujesz go do zmiennej potem używasz zmiennej i pola w strukturze by go zapisać. A według tego co zrozumiałem chcesz funkcję która dostanie pole i strukturę i automatycznie zapisze do eeprom z danym ofsetem tą informację. Więc według mojej wiedzy tego funkcja nie zrobisz. Ale makrem tak Prototyp: #define f(s,p) eep.put( s.p, offsetof(typeof(s), p));
Nie sprawdzałem czy działa, ale chyba o to ci chodziło. |
|
kamil2234 Temat założony przez niniejszego użytkownika |
» 2017-02-05 15:27:48 Dzięki za naprowadzanie. Chyba własnie o to chodziło :) Napisałem pierwsze w życiu makro i wygląda na to, że działa. To rozwiązanie działa i pozwala na zapis konkretnego pola, a nie całej struktury :) struct model { int nazwa_pola } egzemplarz;
#define offsetof(s,m) (size_t)&(((s *)NULL)->m)
#define save(o,p,model) (void) eep.put(offsetof(model, p) , o.p)
save( egzemplarz, nazwa_pola, model );
Jeszcze nurtują mnie kwestie związane z wielkością samej struktury i jej składowych. Znalazłem tutaj ciekawy przykład: https://programowaniec.wordpress.com/2014/11/28/typy-zlozone-jezyka-c-struktury-unie-enum-typedef-bool-complex-ptrdiff_t/ #include <stdio.h>
typedef struct { int liczbaInt; short liczbaShort; int( * wskNaFunkcje )( int ); } Strukturka;
int main( void ) { printf( "sizeof(Strukturka) = %d\n", sizeof( Strukturka ) ); printf( "sizeof(((Strukturka*)0)->liczbaInt) = %d\n", sizeof((( Strukturka * ) 0 )->liczbaInt ) ); printf( "sizeof(((Strukturka*)0)->liczbaShort) = %d\n", sizeof((( Strukturka * ) 0 )->liczbaShort ) ); printf( "sizeof(((Strukturka*)0)->wskNaFunkcje) = %d\n", sizeof((( Strukturka * ) 0 )->wskNaFunkcje ) ); return 0; }
"Wydruk powyższego programu to: sizeof(Strukturka) = 12 sizeof(((Strukturka*)0)->liczbaInt) = 4 sizeof(((Strukturka*)0)->liczbaShort) = 2 sizeof(((Strukturka*)0)->wskNaFunkcje) = 4" Suma rozmiarów składowych to 10, natomiast rozmiar tej struktury to 12. Zastanawiam się więc jak mój obiekt będzie wyglądać po zapisie selektywnym. |
|
mokrowski |
» 2017-02-05 15:43:38 Hmm.. a nie łatwiej było napisać procedurę która otrzymując całą strukturę (czyli surowy wskaźnik na pamięć i rozmiar tejże), czyta z EEPROM bajt i ew. zapisuje go jeśli nie był zmieniony? W nowszych procesorach AVR, nawet są optymalizowane procedury zapalania/gaszenia bitów w bajcie które zmieniają się pomiędzy zapisami. Oczywiście zdaję sobie sprawę że masz EEPROM dostępny na szynie I2C. No i .. ile ma być tych zapisów.. bo zapytałem ale w zasadzie nie odpowiedziałeś :-) |
|
kamil2234 Temat założony przez niniejszego użytkownika |
» 2017-02-05 19:17:34 mokrowski -> odpowiadając na Twoje pytanie.
Mechanizm będę wykorzystywać różnych celach np. do zapisu ustawień konfiguracji ESP8266 - tu nie będzie tego dużo. Ale w planie mam zapis danych z ADS1256. Będę robić pomiary zużycia prądu. Tutaj będzie bardzo dużo cykli zapisu/odczytu. Muszę to jeszcze przemyśleć koncepcyjnie.
Na tą chwilę zyskałem wygodę użycia i szybkość w przypadku aktualizacji :)
Co do Twojej koncepcji fajny pomysł, ale chyba nie mam jeszcze takiej wiedzy jak Ty ;). |
|
mateczek |
» 2017-02-05 19:42:28 A coś takiego się nada ?? program na PC tylko symulacja metody #include <iostream> using namespace std;
struct data { int zmienna1; int zmienna2; };
int main( int argc, char ** argv ) { int tablica[ 20 ]; data * wsk =( data * ) tablica; wsk->zmienna1 = 14; wsk->zmienna2 = 33; cout << tablica[ 0 ] << " " << tablica[ 1 ] << endl; }
|
|
1 « 2 » |