Structs in eeprom minimalcode durchschauen

OP #2244057
Lesenswert?

Hallo!

Folgenden Minimalcode habe ich geschrieben. Gerade habe ich keinen 
Controller zum Testen. Kompiliert habe ich mit dem winavr für einen 
Atmega328P.

Evtl. könnt ihr mal den kleinen code angucken und bescheid geben, falls 
es so nicht funktioniert. DANKE!
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
#define MAX_IDS    10
4

5
struct id_s{
6
  unsigned char ids_in_list;
7
  unsigned long id_list[MAX_IDS];
8
}whitelist;
9

10
void eeprom_write_struct(short addr,void *obj,char size);
11
void eeprom_read_struct(short addr,void *obj,char size);
12

13
void add_id(unsigned long data){
14
  whitelist.id_list[whitelist.ids_in_list] = data;
15
  whitelist.ids_in_list++;
16
  eeprom_write_struct(0,&whitelist,sizeof(whitelist));     //Write the structure to EEPROM
17
}
18

19
int main(){
20
  eeprom_read_struct(0,&whitelist,sizeof(whitelist));
21
  add_id(1234567UL);
22
  return 0;
23
}
24

25
void eeprom_write_struct(short addr,void *obj,char size){
26
      char i,*ptr=(char *)obj;
27
      for (i=0;i<size;i++)
28
            eeprom_write_byte(addr++,*(ptr++));
29
}
30

31
void eeprom_read_struct(short addr,void *obj,char size){
32
      char i,*ptr= (char *)obj;
33
      for (i=0;i<size;i++)
34
            *(ptr++)=eeprom_read_byte(addr++);
35
}
#2244088
Lesenswert?

> void eeprom_write_struct(short addr,void *obj,char size){
>      char i,*ptr=(char *)obj;
>      for (i=0;i<size;i++)
>            eeprom_write_byte(addr++,*(ptr++));
> }
>
> void eeprom_read_struct(short addr,void *obj,char size){
>       char i,*ptr= (char *)obj;
>       for (i=0;i<size;i++)
>             *(ptr++)=eeprom_read_byte(addr++);
> }

Gratuliere:
Du hast gerade die Funtionen eeprom_write_block bzw. eeprom_read_block 
neu erfunden. Nur dass du für size den falschen Datentyp genommen hast 
:-)
OP #2244138
Lesenswert?

gerade habe ich gelesen:

size_t corresponds to the integral data type returned by the language 
operator sizeof

damit weiß ich nun,dass sizeof keine funktion ist, sondern ein Operator, 
der daten im format size_t zurückgibt.

also ich füttere die Funktionen ja mit dem argument sizeof(...) dann 
werde ich mal die funktionsköpfe entsprechend von char auf size_t 
ändern. Das sollte dann reichen oder?
#2244140
Lesenswert?

Timo P. schrieb:
> gerade habe ich gelesen:
>
> size_t corresponds to the integral data type returned by the language
> operator sizeof
>
> damit weiß ich nun,dass sizeof keine funktion ist, sondern ein Operator,
> der daten im format size_t zurückgibt.
>
> also ich füttere die Funktionen ja mit dem argument sizeof(...) dann
> werde ich mal die funktionsköpfe entsprechend von char auf size_t
> ändern. Das sollte dann reichen oder?

Ähm.
Warum nimmst du nicht die Funktionen eeprom_read_block bzw. 
eeprom_write_block anstelle deiner Funktionen? Die machen genau das 
gleiche.
OP #2244157
Lesenswert?

Gibt es eine geschickte Möglichkeit, eine ID in der whitelist ausfindig 
zu machen?

Reicht eine for schleife, die direkte Vergleiche durchführt, oder gibt 
es geschicktere Wege als z.B.
1
char validate_id(unsigned long *compare)
2
{
3
  for(char i = 0; i<whitelist.ids_in_list;i++)
4
  {
5
     if(whitelist.id_list[i] == compare
6
     return ACCEPT;
7
  } 
8
  return DENY;
9
}
#2244162
Lesenswert?

Bei 10 Einträgen lohnt es nicht, sich da einen Kopf wegen Optimierungen 
zu machen.

Im Allgemeinen: ja, die gibt es. (*)

Wie suchst du denn in einem Telefonbuch nach "Meyer"?
Du schlägst es in der Mitte auf und liest Huber. Meyer kommt alphabetich 
nach Huber, also kannst du die erste Hälfte des Telefonbuchs schon mal 
vergessen, dort kann Meyer nicht sein. Aus der hinteren Hälfte nimmst du 
wieder die Mitte und findest "Peter". Meyer ist alphabeteich vor 
"Peter", also kannst du von deinem jetzigen Suchebereich schon mal die 
hintere Hälfte vergessen. Und das machst du so lange, bis du beim Meyer 
bist, oder dein Suchbereich dir sagt, dass Meyer nicht vorkommt.
Voraussetzung: Die Daten müssen sortiert sein.

(*) Es gibt noch viele andere Möglichkeiten. Donald Knuth hat einen 
ganzen >300 Seiten starken Wälzer zu diesen Themenbereichen geschrieben. 
Aus der Reihe "The art of computer programming" (wenn mich nicht alles 
täuscht) den Volume 2: "Sorting and Searching"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren