Go Down

Topic: Variablen bitweise/direkt beschreiben (Read 902 times) previous topic - next topic

jurs

#5
Feb 07, 2013, 12:01 pm Last Edit: Feb 07, 2013, 12:20 pm by jurs Reason: 1

Wenn Datentypen egal sind:  Was hältst du von einem void*  ?


Hm, gerade mal getestet. Die EEPROM.write und EEPROM.read Funktionen mögen auf meinem Arduino keine per void* übergebenen Werte ins EEPROM schreiben, sondern damit liefert der Compiler bei mir:

 error: pointer of type 'void *' used in arithmetic

Ich sehe momentan konkret nicht, wie es mit void* funktionieren soll.

michael_x

Quote
error: pointer of type 'void *' used in arithmetic

Ich sehe momentan konkret nicht, wie es mit void* funktionieren soll.

Klar, deine write und read Methode muss intern schon wissen was sie machen soll,
(nämlich den void * als byte * verwenden)
Aber der Benutzer deiner Funktion kriegt mit der Deklaration des Übergabeparameters als void * gesagt, dass er jeden Pointer liefern darf.
Das ist doch das was du willst, oder ?

jurs


Klar, deine write und read Methode muss intern schon wissen was sie machen soll,
(nämlich den void * als byte * verwenden)


Na ja, EEPROM.write und EEPROM.read sind nicht "meine", sondern Methoden aus "#include <EEPROM.h>", und die wissen nur, wie sie bytes lesen und schreiben. Wenn ich byte* an meine eigenen Funktionen übergebe, weiß der Compiler, dass er den Funktionen aus EEPROM.h ein Byte übergeben muss. Wenn ich bei mir void* übergebe, dann weiß der Compiler es nicht.

Anyway: Der von mir oben in meiner ersten Antwort gepostete Sketch funktioniert. Falls sich jemand an den zwei Bytes überflüssigem Speicherverbrauch stört durch die Deklaration von "wert":
byte* wert = (byte*) &myFloatVar;
der kann diese Deklaration auch weglassen und stattdessen direkt im Funktionsaufruf auf byte* typecasten:

Code: [Select]

void setup()
{
  float myFloatVar;
  Serial.begin(9600);
  myFloatVar=90.23;
  Serial.print("myFloatVar anfangs: ");Serial.println(myFloatVar);
  EEPromSave((byte*) &myFloatVar, sizeof(myFloatVar), FLOATSAVEOFFSET);
  myFloatVar=0;
  Serial.print("myFloatVar anderer Wert: ");Serial.println(myFloatVar);
  EEPromLoad((byte*) &myFloatVar, sizeof(myFloatVar), FLOATSAVEOFFSET);
  Serial.print("myFloatVar aus EEPROM: ");Serial.println(myFloatVar);
}


Kann ja mal sein, dass es auf 2 Bytes RAM-Speicherverbrauch ankommt.

Obwohl: Wenn man viel mehr als 2 Bytes RAM-Speicher einsparen wollte, würde man in seinen Programmen ja zunächst mal komplett auf den Datentyp "float" verzichten. So schlimm scheint es also beim OP noch nicht zu sein, dass er in seinem Programm noch mit float und massig Speicherverbrauch herumfuhrwerken kann.


Udo Klein

Check out my experiments http://blog.blinkenlight.net

Go Up