Forum: Mikrocontroller und Digitale Elektronik Infinite Loop STM32 Zeichen ersetzen


von Peter (Gast)


Lesenswert?

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
}

von Stefan F. (Gast)


Lesenswert?

Hast du vielleicht vergessen, die Zeichenkette vor dem Aufruf der 
Funktion mit 0 zu terminieren?

von Joe F. (easylife)


Lesenswert?

Ist der String denn auch mit einem Nullbyte abgeschlossen?

von leo (Gast)


Lesenswert?

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

HTH
leo

von Peter (Gast)


Lesenswert?

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?

von leo (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

Mein Aufruf ist der folgende:
1
strrpl(str, '\r', ' ');

von leo (Gast)


Lesenswert?

Peter schrieb:
> Mein Aufruf ist der folgende:strrpl(str, '\r', ' ');

Ja dann musst du halt debuggen. Aus diesen Infos ist kein Fehler 
errsichtlich.

lei

von Jim M. (turboj)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

Jim M. schrieb:
> Steht der String zufällig im Flash statt im RAM (weil Konstante)?

Danke, das war es!

von leo (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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!

von zitter_ned_aso (Gast)


Lesenswert?

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.

von leo (Gast)


Lesenswert?

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

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.