Infinite Loop STM32 Zeichen ersetzen

Gast #5836613
Hallo,

ich bekomme bei folgendem Code ein infinite Loop. Ich versuche lediglich 
in einem String alle Zeichen a durch Zeichen b zu ersetzen. Nach einer 
Hand voll Schleifendurchläufen bekomme ich den Fehler. Warum ist das so?
1
static void strrpl(char *pStr, char replace, char newChar){
2
  do {
3
    if(*pStr == replace) *pStr = newChar;
4
    pStr++;
5
  } while(*pStr != '\0');
6
}
Gast
Ja, aber wie gesagt: Bereits nach fünf vergleichen geht der in infinite 
loop. Der String ist aber 0-terminiert und deutlich länger als fünf 
Zeichen.

Unter welchen Bedingungen tritt dieser Fehler eigentlich ein?
Gast
leo schrieb:
> Peter schrieb:
>> ich bekomme bei folgendem Code ein infinite Loop.
>
> Zwei Moeglichkeiten:
>
> a) Worauf pStr zeigt, ist kein C-String, i.e. nicht durch NUL terminiert
> b) Du kaputtest diesen String irgendwo spaeter

c) "replace" ist NUL, i.e. du vernichtest dein Stringende.

>
> HTH
> leo
Peter schrieb:
> Ja, aber wie gesagt: Bereits nach fünf vergleichen geht der in infinite
> loop. Der String ist aber 0-terminiert und deutlich länger als fünf
> Zeichen.

Steht der String zufällig im Flash statt im RAM (weil Konstante)?
Das gäbe einen Fault weil man im Flash so nicht schreiben kann.
Gast
Peter schrieb:
> Jim M. schrieb:
>> Steht der String zufällig im Flash statt im RAM (weil Konstante)?
>
> Danke, das war es!

"Nach einer
Hand voll Schleifendurchläufen bekomme ich den Fehler."

Das passt aber nicht ganz zusammen. Oder (Hand-1) Durchlaeufe waren 
NOPs.

leo
Gast
Peter schrieb:
> static void strrpl(char *pStr, char replace, char newChar){
>   do {
>     if(*pStr == replace) *pStr = newChar;
>     pStr++;
>   } while(*pStr != '\0');
> }


ich würde diese do-while-Schleife durch eine while-Schleife ersetzen.

Bei dir wird immer die Adresse um eine Stelle verschoben. Erst dann wird 
geprüft.

Wenn es passiert dass die Funktion einen leeren String bekommt, dann 
wird solange geprüft bis im Speicher eine Null gefunden wird. Zumindest 
auf einem PC.
Gast
Peter schrieb:
> leo schrieb:
>> Das passt aber nicht ganz zusammen. Oder (Hand-1) Durchlaeufe waren
>> NOPs.
>
> Doch, denn das fünfte Zeichen war ein '\r' :). Das wurde versucht zu
> ersetzen und Fehler!

Ah. Die wichtigste Info im letzten Posting, nach Nachfragen. Super.

leo

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.