Substituierter Code schmiert ab

Gast #5458778
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?
Gast #5458788
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 ;-)
Gast #5458789
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.