Diskussion:Off-by-one-Error

aus Wikipedia, der freien Enzyklopädie
Letzter Kommentar: vor 2 Jahren von Carl B aus W in Abschnitt Fehlervermeidung
Zur Navigation springen Zur Suche springen

Was soll das letzte C-Beispiel? eine konstante ohne initialisierung??? das sollte man nochmal überarbeiten. ich mache hier nichts, weil ich nicht weiß, was dieses Beispiel beabsichtigt...

Da kann ich nur zustimmen. Mir erschließt sich das letzte Beispiel auch nicht vollständig. Es ist nicht nur eine Konstante nicht initialisiert, es ist keine Variable mit irgendeinem Wert gegeben. Eventuell sollte man ein Beispiel wie in der englischen Original-Seite verwenden? -- M.vossi, 2008-04-15

Fehlervermeidung

[Quelltext bearbeiten]

Ich würde außerdem noch einen neuen Abschnitt empfehlen, der die Möglichkeiten heutiger Programmiersprachen aufzeigt, wie Probleme dieser Art umgangen werden können (foreach-Konzept für Schleifen).

Für Java (ab 1.5) würde das dann zum Beispiel so aussehen:

String[] sFeld = { "string_a", "string_b" };
for (String sLaufvariable : sFeld) {
  System.out.println(sLaufvariable);
}

In diesem Beispiel wird immer über alle Feldelemente iteriert (es werden alle Elemente des gegebenen Feldes sFeld durchlaufen). Die Feldlängenbestimmung sowie den automatischen Variablen-Durchlauf übernimmt der Compiler, so dass der Programmierer sich nicht mehr explizit darum kümmern muss.

Stichworte: Generics, Iterations over Collections, foreach
Link: An enhanced FOR loop

Ein entsprechendes Beispiel müsste dann auch mal für C erstellt werden. -- M.vossi, 2008-04-15

Hier bietet sich die Verwendung eines #define für die Arraygröße und des sizeof-Operators für den Endwert des Schleifenindex an, dann funktioniert das auch mit Kernighan-Ritchie-C.--Rotkaeppchen68 00:23, 17. Jun. 2009 (CEST)Beantworten
Mal ganz abgesehen davon, dass das angegebene Beispiel stilistisch zu wünschen übrig lässt, würde ich den Off-by-one-Error in diesem Fall etwa folgendermaßen umgehen:
int nettopreise[10];
int i;

/* nettopreise initialisieren */
...
i = sizeof(nettopreise);
for (i = 0; i < (sizeof(nettopreise) / sizeof(int)); ++i)
    nettopreise[i] = nettopreise[i] * 1.19; // MWSt aufschlagen.
Die Tatsachen, dass hier Konstanten im Quelltext vorkommen und dass Preise in int-Variablen gespeichert werden, die mit einer double-Konstante verrechnet werden, sind für das eigentliche Problem irrelevant, sind aber dennoch schlechter Programmierstil. Ich bin dafür, dass das behutsam geändert wird, ohne das Codefragment zu überfrachten.--Rotkaeppchen68 01:13, 17. Jun. 2009 (CEST)Beantworten


Mein Java-Tutor an der Uni empfiehlt, Schleifenzähler grundsätzlich bei 0 beginnen zu lassen. Das erhöht durch Einheitlichkeit die Übersicht und macht so zumindest das Suchen nach dem Fehler einfacher, so sein Denken. Ich kann nicht sagen, wie sehr sich das bei großen Projekten bewahrheitet, aber vielleicht liest das hier ja mal jemand mit etwas Erfahrung. --Bengtlueers 23:32, 15. Dez. 2008 (CET)Beantworten

So lange niemand anderer an deinem Quellcode mitarbeitet oder dort Fehler sucht, ist es nur wichtig, dass du das selbst immer einheitlich machst. --MrBurns 01:49, 9. Jan. 2009 (CET)Beantworten

Das Beispiel ist wirklich gruselig. Der Off-by-One-Error ist das geringste Problem. Geldbeträge in einem int zu speichern Sünde. Das Produkt aus Netto und MwSt wieder in nettopreis speichern zu wollen, ist Todsünde. Zum Glück wird aber in nettopreise immer noch der Nettopreis stehen, weil die Mutliplikation eines int mit 1.19 auf eine Multiplikation mit 1 rausläuft. --Carl B aus W (Diskussion) 01:23, 9. Nov. 2022 (CET)Beantworten

Herkunft des Begriffs

[Quelltext bearbeiten]

Hallo,

woher stammt diese "Fehlerkategorisierung"? Wird "um-eins-daneben" auch in der Literatur über Softwarefehler und Testen verwendet? Ich stoße jetzt zum ersten Mal auf diesen Begriff (was natürlich nicht heißen muss, dass "off-by-one" nicht verwendet wird - der Fehler kommt leider allzu häufig in der Software-entwicklung vor, aber das es dafür einen Begriff gibt war mir bisher nicht bekannt). Leider keine Quellenangaben dabei...

Grüße

Der englische Begriff ist gar nicht mal so ungebräuchlich. Er wird in der Praxis häufig verwendet (insbesondere bei Software-Sicherheitsfirmen, die sich mit der Code-Analyse beschäftigen). Er hat sich (natürlich) aus dem englischen Sprachgebrauch entwickelt. Off bezeichnet dabei sowas wie Ende, Aus, Abschalten oder ähnliches Durch by wird nur der "Grund" angegeben. So gibt es zum Beispiel auch "Off by ten", wenn man um Zehn daneben gelegen hat. Da der Fehler "Off-by-one" aber nur allzu häufig begangen wird, ist er sozusagen eine extra Fehler-Kategorie geworden (sozusagen ein Standardfehler, dessen Ursache ja meistens das hier auch referenzierte Zaunpfahlproblem ist). Allerdings, die deutsche Übersetzung habe ich auch erst durch diesen Artikel erfahren und finde ihn, naja, etwas unglücklich. Das liegt wohl daran, dass es keine passende Übersetzung für das "Off by ..." gibt. Eine eher zutreffende Übersetzung für diese Wort-Kombination ist wohl "knapp daneben" (wobei das Englische durch die genaue Angabe des Wertes, um den man daneben liegt, diese Art des Fehlers "besser trifft"). -- M.vossi, 2008-04-15
"off" ist hier wohl eher im Sinn von "weg" oder "entfernt" verwendet (vgl. "die stimme aus dem off"), so daß die Übersetzung "um eins daneben" gar nicht so schlecht ist. Auch wenn ich zugegebenermaßen bisher immer nur die englische Fassung gelesen und gehört habe. --JokerClz 00:55, 29. Jun. 2008 (CEST)Beantworten
"Off by (Zahl)" bedeutet "um die genannte Zahl zu groß oder zu klein". Beispiel "Three times seven is 21, so the pupil's answer 31 was off by ten." Entsprechend bedeutet "off by one" soviel wie "um eins zu groß oder zu klein". Mit off im Sinne von Ende, Aus hat es nichts zu tun. --Neitram  13:34, 13. Jan. 2020 (CET)Beantworten

Verwendungshäufigkeit

[Quelltext bearbeiten]

englisch:2.370

deutsch:2.550

--Lostintranslation 22:42, 5. Nov. 2008 (CET)Beantworten

Zählen mit google hat ein Problem: Die Anzahl der Treffer auf der ersten Seite ist nur eine Schätzung. Du solltest nicht auf die erste, sondern auf die letzte Ergebnisseite achten und ausserdem Wikipedia-Klone und Wörterbücher ausschließen:
englisch 64
deutsch 18
Und jetzt können wir auch einfach mal diskutieren, bevor zu nachtschlafender Zeit Tatsachen geschaffen werden. --Gnu1742 22:55, 5. Nov. 2008 (CET)Beantworten
Ach ja: Ich hab vergessen, die nicht als Wikipedia-Klone gekennzeichneten Wikipedia-Klone auszuschließen: 4 Verwendungen von 'Um-eins-daneben-Fehler' --Gnu1742 23:01, 5. Nov. 2008 (CET)Beantworten
Man sollte mal für solche Fälle Suchstandards definieren. Allerdings ist jede Art der Suche nur ein mehr oder weniger ungenaues Schätzverfahren und keine Messung, deshalb darf man ein wie auch immer geartetes Suchmaschinenergebnis wohl nicht überbewerten. Alles nicht ganz so einfach. --Lostintranslation 20:24, 6. Nov. 2008 (CET)Beantworten
Google hat sich ein bisschen „verschätzt“ auf der ersten Seite:
deutsch: 26 Seiten
englisch: 89 Seiten
=> Der englische Begriff ist zu verwenden. Erstens mal ist in der IT sowieso jeder Fachbegriff englisch - Programmierer müssen meistens in englischsprachiger Literatur stöbern - und zweitens ist Englisch ideal um gerade so dämliche Holzhammer-Begriffe in eine „flüssige“ Form zu bringen. --91.12.144.146 11:25, 11. Nov. 2008 (CET)Beantworten

Beispiel

[Quelltext bearbeiten]

Häufig resultiert diese Art der Fehler aus der Verwirrung, die dadurch entsteht, dass Menschen von 1 bis N zählen, Feldindizes in vielen Programmiersprachen aber von 0 bis N–1 gehen

Dieser Satz trifft bei dem ersten Beispiel eigentlich nicht zu, weil dort kann man diese Verwirrung einfach umgehen, indem man halt for (i = 1; i <= 10; ++i) schreibt. --MrBurns 01:51, 9. Jan. 2009 (CET)Beantworten

Wie kommst du denn auf die Idee? Wenn man i mit 1 initialisiert, hat man noch einen Fehler eingebaut ;-) --DownAnUp 11:57, 19. Feb. 2009 (CET)Beantworten
Wieso, es ist doch völlig wurscht, mit welchem Wert du i initialisierst. Wenns dir besser gefällt, kannst du i auch mit dem Wert 3587 initialisieren... --MrBurns 07:17, 20. Feb. 2009 (CET)Beantworten
Äh? Weil i als index eines von 0 bis 9 indizierten Feldes dient!? --DownAnUp 00:05, 21. Feb. 2009 (CET)Beantworten
Nein, sondern weil es darum geht, den selben Vorgang 10x zu wiederholen und dafür ists wurscht, ob man den Index von 0 bis 9, von 1 bis 10 oder von 3587 bis 3596 zählen lässt. --MrBurns 01:27, 17. Jun. 2009 (CEST)Beantworten
Das Problem der Anzahl der Durchläufe mag behoben sein, aber es ist doch keine Lösung für dieses Beispiel. Man will nicht 10x den selben Vorgang machen, sondern 10x die gleiche Operation mit anderen Werten. --Zahnradzacken 00:58, 31. Dez. 2009 (CET)Beantworten