Moin. Ich hab nen Problem beim lesen und beschreiben des EEPROM. Zwar funktioniert alles, aber ich bekomme eine Warnmeldung und die würde ich gern verstehen und beheben: ... #define EEP_ADD_0 1 ... if (eeprom_read_byte(EEP_ADD_0) == 1) ... -> warning: passing arg 1 of `eeprom_read_byte' makes pointer from integer without a cast interessanterweise tritt diese Warnung nicht auf, wenn ich EEP_ADD_0 als 0 definiere. Wär sehr nett, wenn mir jemand helfen könnte. mfg rico
Hi, steht doch eigentlich schon in der Warnung drin! 'eeprom_read_byte' erwartet als Parameter einen Pointer und Du fütterst die Funktion mit einem 'int'. CU
... btw. 0 (NULL) ist ein gültiger Pointer, deshalb kommt in dem Fall keine Warnung. Ansonsten:
1 | eeprom_read_byte((uint8_t*)EEP_ADD_0) |
Danke für die schnelle Antwort! Hab nur noch ne Frage zum Verständnis: Warum ist der Adresszeiger bei read_word ein (uint16_t*)? Zeigt der nicht genau wie beim read_byte auch nur auf EINE Speicheradresse?
Der Adresszeiger für ein Objekt, das 16 bits groß ist, sollte halt ein Zeiger sein, der auf ein 16-bit-Objekt zeigt, nicht wahr? Klar besteht das 16-bit-Objekt aus zwei Bytes, und der Zahl, die den Zeiger repräsentiert, sieht man nicht an, wie viele Bytes ab dieser Stelle gelesen werden sollen. Der Rest ist die Semantik des Compilers, die er in einen Zeiger hineinlegt. Analog wird bei den Blocklesefunktionen, bei denen man vom Typ her ja nicht aussagen kann, wie groß der Block werden soll, ein generischer zeiger (void *) benutzt. Das ist aber alles mehr kosmetisch bzw. "politisch korrekt".
ähm, ok. Man sollte also nicht weiter darüber nachdenken ...
Auch beim auslesen eines WORD, müsste der Adresszeiger doch bloß auf das erste der beiden BYTES zeigen. Nur das dann eben noch ein weiteres BYTE ausgelesen wird... Zumindest hab ich mir das so vorgestellt.
Das kannst du in C im Prinzip immer. Zeigertypen sind aber genau deshalb da, damit man hier unterscheiden kann. Würdest du es wirklich logischer finden, wenn du eine 16bit-Variable definierst, dann den Zeiger darauf erst in einen Zeiger auf 8 Bit konvertieren mußt, nur damit die Funktion dann trotzdem 16 Bits einliest?
ne, wahrscheinlich nicht... ich sollte mich, wenn ich Zeit hat aber mal intensiver mit Zeigern befassen! Vielleicht schaff ich das, wenn der ganze Robocup-Kram vorbei ist. Nochmal Danke an alle Antworten!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.