Paniert bei Versuch, mit Überlauf zu subtrahieren, wenn rückwärts durch eine Liste geblättert wird

8

Ich schreibe eine Zyklusmethode für eine Liste, die einen Index vorwärts oder rückwärts verschiebt. Der folgende Code wird verwendet, um rückwärts zu gehen:

%Vor%

In diesem Fall ist i vom Typ usize , was bedeutet, dass es unsigniert ist. Wenn i gleich 0 ist, führt dies zu einem Fehler "Versuch, mit Überlauf zu subtrahieren". Ich habe versucht, die richtigen Casting-Methoden zu verwenden, um dieses Problem zu umgehen:

%Vor%

Dies führt zu einem ganzzahligen Überlauf.

Ich verstehe, warum die Fehler passieren, und im Moment habe ich das Problem gelöst, indem ich überprüft habe, ob der Index gleich 0 ist, aber ich habe mich gefragt, ob es eine Möglichkeit gäbe, die Variablen auf die richtigen Typen zu übertragen .

    
blackplant 23.12.2016, 12:24
quelle

2 Antworten

4

Als DK. weist darauf hin, , Sie wollen Semantik nicht auf Ganzzahlebene umbrechen:

%Vor%

Stattdessen möchten Sie mit Modulo-Logik umgehen:

%Vor%

Dies funktioniert nur, wenn len + idx kleiner als der maximale Wert des Typs ist - dies ist viel einfacher zu sehen mit u8 anstelle von usize ; Setzen Sie einfach idx auf 200 und len auf 250.

Wenn Sie nicht garantieren können, dass die Summe der beiden Werte immer kleiner als der maximale Wert ist, würde ich wahrscheinlich die "geprüfte" Familie von Operationen verwenden. Dies ist das gleiche Niveau der konditionellen Überprüfung, das Sie bereits erwähnt haben, aber es ist sauber in eine einzige Zeile eingebunden:

%Vor%     
Shepmaster 23.12.2016, 14:17
quelle
3

Wenn Ihr Code überlaufende Operationen ausführen kann, würde ich vorschlagen, Wrapping . Sie müssen sich keine Sorgen über Überfüllung oder Überlauf machen, wenn Sie es zulassen:

%Vor%     
ljedrz 23.12.2016 12:31
quelle