Forum: Compiler & IDEs eeprom: Daten nach Übergabe in Unterfunktion werden falsch geschreiben


von Ludwig (Gast)


Lesenswert?

Hallo,

ich habe folgende vereinfachte Ausgangssituation:



unsigned short Var1[3] = {1,2,3};
unsigned short Var1_EE[3] EEMEM = {0};

void Write2EEProm(void)
{
  eeprom_write_block(Var1,Var1_EE, size_of(Var1));
}

Write2EEProm();

Inhalt Var1_EE:  [0]:1 , [1]:2, [2]:3



Das obige Beispiel funktioniert bestenes, die Variablen sind global 
definiert und die Funktion Write2EEProm steht direkt darunter in der 
selben c-Datei.

Wenn ich jetzt die Funktion Write2EEProm so modifiziere, dass ihr ein 
Pointer für das SRAM Array übergeben werden kann, wird nur noch der 1. 
Wert des Arrays ins EEProm geschrieben, statt das ganze Array:



unsigned short Var1[3] = {1,2,3};
unsigned short Var1_EE[3] EEMEM = {0};

void Write2EEProm(unsigned short* pVar1)
{
  eeprom_write_block(pVar1,Var1_EE, size_of(pVar1));
}

Write2EEProm(Var1);
oder
Write2EEProm(&*Var1); // kommt auf das gleiche raus

Inhalt Var1_EE:  [0]:1 , [1]:0, [2]:0



Die EEProm Variable und (weil für das Beispiel einfacher) die SRAM 
Variable ist weiter direkt global darüber deklariert, lediglich wird 
jetzt der Quell-Pointer an die Funktion übergeben.

Was mache ich hier falsch ?

Dank für eure Hilfe.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Du sagst doch selbst, es solle nur 1 Wert geschrieben werden:
1
 eeprom_write_block(pVar1,Var1_EE, size_of(pVar1));
Wie groß ist denn die Größe des Pointers ermittelt mit size_of(pVar1)?
2 Byte? Soviel wird dann auch geschrieben...

Da mußt du jetzt schon die Länge des Arrays noch extra angeben. Allein 
von einer Adresse (einem Pointer) kannst du nicht auf die Länge des 
Arrays schließen.

von unbedarfter_no1 (Gast)


Lesenswert?

1
void Write2EEProm(unsigned short* pVar1)
2
{
3
  eeprom_write_block(*pVar1,Var1_EE, size_of(pVar1));
4
}
Muß der Pointer nicht dereferenziert werden?

von Stefan E. (sternst)


Lesenswert?

unbedarfter_no1 wrote:

> Muß der Pointer nicht dereferenziert werden?

Dann schreibt er aber auch nur ein unsigned short.
Es führt kein Weg daran vorbei, die Größe als zusätzlichen Parameter zu 
übergeben.

von Ludwig (Gast)


Lesenswert?

Also ich weiß echt nicht, wieso das ganze so nicht funktioniert. Die 
Größe wird durch size of RICHTIG ermittelt. selbst wenn ich die Größe 
des Arrays als konstanten Wert eingebe, wird nur 1 Wert geschrieben.

Gelöst habe ich das ganze problem, indem ich in einer For-Schleife das 
komplette zu schreibende Array pVar1 in eine temporäre locale Variable 
umkopiert habe.

also quasi:

unsigned short Var1[3] = {1,2,3};
unsigned short Var1_EE[3] EEMEM = {0};

void Write2EEProm(unsigned short* pVar1)
{
  unsigned short Var1Temp[3] = {1,2,3};

  for(int i=0; i<3; i++)
    Var1Temp[i] = pVar1[i];

  eeprom_write_block(Var1Temp,Var1_EE, size_of(Var1Temp));
}

Write2EEProm(&*Var1);

Inhalt Var1_EE:  [0]:1 , [1]:2, [2]:3



So funktionierts jetzt.

von Stefan E. (sternst)


Lesenswert?

Ludwig wrote:
> Also ich weiß echt nicht, wieso das ganze so nicht funktioniert. Die
> Größe wird durch size of RICHTIG ermittelt.

Bei deiner Pointerversion nicht.

> selbst wenn ich die Größe
> des Arrays als konstanten Wert eingebe, wird nur 1 Wert geschrieben.

Und was ist das für ein konstanter Wert? Womöglich 3?

> Gelöst habe ich das ganze problem, indem ich in einer For-Schleife das
> komplette zu schreibende Array pVar1 in eine temporäre locale Variable
> umkopiert habe.

Unflexibel und überflüssig.

PS: Was soll das size_of, das du da ständig benutzt, eigentlich sein? 
Ist das eine selbst geschriebene Funktion?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Probier mal das:
1
unsigned short Var1[3] = {1,2,3};
2
unsigned short Var1_EE[3] EEMEM = {0};
3
4
void Write2EEProm(unsigned short* pVar1)
5
{
6
    eeprom_write_block(pVar1,Var1_EE, 3*2); // 3 Shorts = 3 * 2 Bytes 
7
}
8
9
Write2EEProm(Var1);

Wichtig hier: 6 Bytes schreiben, nicht 3
Denn size_of(Var1Temp) in deiner temporären Lösung ist gleich 6.

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.