mikrocontroller.net

Forum: Compiler & IDEs Problem mit Pointers


Autor: Boss (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
unsigned int addr;

  DDRA = 0xFF;
  DDRB = 0x00;

  PORTA = 0x00;


for(addr=0x00;addr<=255;addr++)
{
  eeprom_write_word(addr,0xAAAA); // hier wird der debuger fündig
}  

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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:
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:
unsigned int *addr_ptr;
unsigned int i;

addr_ptr = 0;
for(i=0; i <= 255; i++)
{
  eeprom_write_word(addr_ptr, 0xAAAA);
  addr++;
}  

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

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

Gruß, Stefan

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan meinte

unsigned int *addr_ptr;
unsigned int i;

addr_ptr = 0;
for(i=0; i <= 255; i++)
{
  eeprom_write_word(addr_ptr, 0xAAAA);
  addr_ptr++;
}


pumpkin

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.