Forum: Mikrocontroller und Digitale Elektronik Substituierter Code schmiert ab


von Progger (Gast)


Lesenswert?

Hallo,

ich habe ein merkwürdiges Absturzverhalten:

Gegeben ist eine Funktion in der der folgende Code enthalten ist:
1
Funktion1()
2
{
3
...diverser Code...
4
5
uint8_t array[6] = {0};
6
sscanf(Struktur.Eintrag_eins, "%X:%X:%X:%X:%X:%X", (uint *) &array[0], (uint *) &array[1], (uint *) &array[2], (uint *) &array[3], (uint *) &array[4], (uint *) &array[5]);
7
8
for (uint8_t i = 0; i < 6; i++)
9
{
10
 Struktur.Eintrag_zwei[i] = array[i];
11
}
12
}


Nun kommt der detaillierte Code an weiteren Stellen auch vor und daher 
habe ich ihn in eine Funktion gepackt, d.h.
1
void Funktion2(void)
2
{
3
uint8_t array[6] = {0};
4
sscanf(Struktur.Eintrag_eins, "%X:%X:%X:%X:%X:%X", (uint *) &array[0], (uint *) &array[1], (uint *) &array[2], (uint *) &array[3], (uint *) &array[4], (uint *) &array[5]);
5
6
for (uint8_t i = 0; i < 6; i++)
7
{
8
 Struktur.Eintrag_zwei[i] = array[i];
9
}
10
11
}


und folgend:
1
Funktion1()
2
{
3
...diverser Code...
4
Funktion2();
5
}

Ich möchte also eigentlich nur substituieren, weil das an mehreren 
Stellen vorkommt, doch nun führt das plötzlich zu Abstürzen.

Bei der Struktur handelt es sich um eine globale Variable.


Jemand eine Idee, warum das so nicht funktioniert?

von abacus (Gast)


Lesenswert?

Sieht für mich so aus, als hättest du wirr irgendwelche Pointer 
zusammengewürfelt bis der Compiler keine Warnungen mehr erzeugt hat.

von fop (Gast)


Lesenswert?

Sieht so aus, als ob scanf mehr als ein Byte pro Wert in den Speicher 
schreibt. Der Fehler ist also schon im alten Code vorhanden, aber da hat 
es nichts sonderlich Wichtiges zerrissen.

Also muss die Definition
1
uint8_t array[6] = {0};
 angepasst werden.
Am Besten so, dass Typecasts wie Dein "(uint *)" nicht mehr nötig sind.

Bzw. mach die Typecasts weg und lass Dir die Compilerwarnungen auf der 
Zunge zergehen ;-)

von Nop (Gast)


Lesenswert?

Wenn man unsigned ints, die mindestens zwei Byte breit ist, in ein Array 
aus uint8_t liest, kann es schonmal zu Problemen kommen. Daß es das 
vorher nicht tat, kann Zufall gewesen sein, weil dann halt beim Zugriff 
auf das letzte Array-Element irgendwas Unwesentliches überschrieben 
wurde.

Ändere den Datentyp bei dem Array mal auf unsigned int.

von Progger (Gast)


Lesenswert?

Tatsache, der Fehler war schon immer da, hat sich nur nicht bemerkbar 
gemacht.

Danke!

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.