Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przenoszenie pola struktury jako argument funkcji

Ostatnio zmodyfikowano 2017-02-05 19:42
Autor Wiadomość
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.
P-157341
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ę?

C/C++
#define offsetof(s,m) (size_t)&(((s *)NULL)->m)

size_t offset_dns_p0 = offsetof( MySetingsTab, dns_p0 );

 
P-157344
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:
C/C++
#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.
P-157348
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 :)

C/C++
struct model {
    int nazwa_pola
} egzemplarz;


#define offsetof(s,m) (size_t)&(((s *)NULL)->m) // makro wyliczające offsetof
// opis schematu poniżej #define  save(egzemplarz, nazwa_pola, model )  eep.put( adres pamięci ,   wartość do zapisu)

#define save(o,p,model)  (void) eep.put(offsetof(model, p) , o.p)

// przykład wywołania
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/

C/C++
#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.
P-157366
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ś :-)
P-157367
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 ;). 
P-157374
mateczek
» 2017-02-05 19:42:28
A coś takiego się nada ?? program na PC tylko symulacja metody
C/C++
#include <iostream>
using namespace std;

//struktura opisująca jakąś przestrzeń adresową
struct data {
    int zmienna1;
    int zmienna2;
};

int main( int argc, char ** argv ) {
    int tablica[ 20 ]; // z racji że to pc to coś tam rezewuje
    data * wsk =( data * ) tablica; //ustawiam wskaźnik na początek tablicy (ty na początek epromu)
    wsk->zmienna1 = 14; // i zapis już do tablica 0
    wsk->zmienna2 = 33; // i zapis już do tablica 1
    cout << tablica[ 0 ] << " " << tablica[ 1 ] << endl;
}
P-157375
1 « 2 »
Poprzednia strona Strona 2 z 2