Forum: Compiler & IDEs Problem mit Pointers


von Boss (Gast)


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
}

von Florian (Gast)


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.

von Stefan K. (_sk_)


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

von pumpkin (Gast)


Lesenswert?

Stefan meinte

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_ptr++;
9
}


pumpkin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.