Gast
#806442
Hallo, was soll diese Warnung? Ich habe den folgenden Codeausschnitt, den er bemängelt: uint8_t i= 0; while(name[i] != 0) header[i] = name[i++]; Wieso sollte i undefiniert sein? Gru0 Jan
|
Anzeige
|
warning: operation on "i" may be undefined
Gast
#806442
Hallo, was soll diese Warnung? Ich habe den folgenden Codeausschnitt, den er bemängelt: uint8_t i= 0; while(name[i] != 0) header[i] = name[i++]; Wieso sollte i undefiniert sein? Gru0 Jan
Gast
#806447
Nicht i ist undefiniert, sondern die damit durchgeführte Operation. i++ wird nach dem Auslesen des Arrays name durchgeführt, aber es ist nicht sichergestellt, daß dies erst nach dem Zuweisen an das Array header geschieht.
Gast
#806453
Okay danke. Und warum ist das so? Ich schreibe doch gerade grade den POSTfix Operator hin, damit es danach erst inkrementiert wird... Gruß Jan Das Problem ist das i auf der linken Seite der Zuweisung. Welches i ist das? Der Wert vor dem Erhöhen oder nach derm Erhöhen. Der C Standard stellt es dem Compiler frei was in so einem Fall geschehen soll. Es ist undefiniert welcher Wert hier zum Zug kommt.
Gast
#806464
> header[i] = name[i++];
i wird hier zweimal benutzt, links und rechts. Aber es ist nicht
festgelegt, wann i inkrementiert wird.
Beachte die Reihenfolge:
Fall 1:
1. Adresse von header[i] merken (= linke Seite auswerten)
2. Wert von name[i] ermitteln und i erhöhen (= rechte Seite auswerten)
3. Zuweisung durchführen
Fall 2:
1. Wert von name[i] ermitteln und i erhöhen (= rechte Seite auswerten)
2. Adresse von header[i] merken (= linke Seite auswerten)
3. Zuweisung durchführen
Im zweiten Fall würde "header[i]" schon mit dem erhöhten "i" arbeiten.
Welcher Fall eintritt, ist eben undefiniert (= zufällig).
Gast
#806503
Jan wrote: > Hallo, > was soll diese Warnung? > > Ich habe den folgenden Codeausschnitt, den er bemängelt: > > uint8_t i= 0; > > while(name[i] != 0) > header[i] = name[i++]; Yups... noch nen bisschen ungluecklicher kann man das eigentlich nicht schreiben. In solchen Faellen for benutzen.
Gast
#806568
:) Dass ich in der for-Schleife die Abbruchbedingung auch für die Prüfung name[i] != 0 nutzen kann, hab ich nicht bedacht. Danke. Klar, da darf ein beliebiger Ausdruck stehen ;) Wobei ich mich frage, warum du nicht ganz einfach das für strings vorgesehene strcpy benutzt
Karl heinz Buchegger wrote: > Wobei ich mich frage, warum du nicht ganz einfach > das für strings vorgesehene strcpy benutzt > >
Weil das ein '\0' am Stringende mitkopiert? Ernst Bachmann wrote: > Karl heinz Buchegger wrote: >> Wobei ich mich frage, warum du nicht ganz einfach >> das für strings vorgesehene strcpy benutzt >> >>
> > Weil das ein '\0' am Stringende mitkopiert? Ich wette um ein Bier mit dir, dass der OP genau das eigentlich will und nur noch nicht weiß, dass er hier in seiner Version einen Programmfehler hat.
Gast
#806746
> Ich wette um ein Bier mit dir, dass der OP genau das eigentlich > will und nur noch nicht weiß, dass er hier in seiner Version > einen Programmfehler hat. Das ist ein Argument. Dagegen würde ich nicht wirklich wetten wollen. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|