Problem mit Pointers

Gast #588804
Lesenswert?

Hallo leute,


ich hab ein Problem mit Pointern und Speicher.
Bekomm immer die Warnung:

../Versucha.c:50: warning: passing argument 1 of 'eeprom_write_word' 
makes pointer from integer without a cast

entweder es hängt grade ein bisschen bei mir oder ich hab das prinzip 
der zuweisungen nicht verstanden.
1
unsigned int addr;
2

3
  DDRA = 0xFF;
4
  DDRB = 0x00;
5

6
  PORTA = 0x00;
7

8

9
for(addr=0x00;addr<=255;addr++)
10
{
11
  eeprom_write_word(addr,0xAAAA); // hier wird der debuger fündig
12
}
Gast #588807
Lesenswert?

Das Problem ist, dass addr kein Pointer, sondern bloß eine Adresse (= 
Zahl) ist. Du kannst die Warnung wegbekommen, indem Du 
eeprom_write_word( ( void * ) addr, 0xAAAA ); schreibst. Hierdurch 
machst Du dem Compiler klar, dass Du explizit einen Pointer aus der 
Adresse erzeugen möchtest. Ob Dein Quelltext allerdings das tut, was Du 
möchtest, ist mir mangels Kenntnis der Funktion eeprom_write_word nicht 
klar.
#588842
Lesenswert?

Du willst 256 Worte ins EEPROM speichern?

Dein Code speichert ein Wort ins EEPROM, danach erhöht es addr um 1(!) 
und schreibt das nächste Wort ins EEPROM - wobei ein Byte des letzten 
EEPROM-Worts überschrieben wird.

Richtiger wird es, wenn Du die Adresse bei jedem Zugriff um 2 erhöhst:
1
for(addr=0x00;addr<=255;addr+=2)

Besser ist es aber, die Schreibadresse ins EEPROM gleich als Pointer zu 
definieren. Dann funktioniert addr++ auch wieder: ein Pointer wird dabei 
um die Größe des Zielobjekts erhöht, in Deinem Fall (unsigned int) also 
um 2.

Als Anfänger benutzt Du lieber einen Pointer addr_ptr und zusätzlich 
eine Zählvariable i. Sonst schreibst Du wahrscheinlich statt 256 Worte 
nur 128 in das EEPROM:
1
unsigned int *addr_ptr;
2
unsigned int i;
3

4
addr_ptr = 0;
5
for(i=0; i <= 255; i++)
6
{
7
  eeprom_write_word(addr_ptr, 0xAAAA);
8
  addr++;
9
}

Ohne i geht es auch, aber nicht mehr so einfach zu lesen:
1
unsigned int *addr_ptr;
2

3
for (addr_ptr = 0x00; addr_ptr < (unsigned int*) 0x200; addr_ptr++)
4
{
5
  eeprom_write_word (addr_ptr, 0xAAAA);
6
}

Gruß, Stefan

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