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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.