001
26.12.2011, 23:21 Uhr
0xdeadbeef
Gott (Operator)
|
Au weia. Dann gehen wir mal von oben nach unten durch: der erste Fehler, der mir auffällt, ist
C++: |
int isbn[12]; //isbn ohne pruefziffer
...
std::cin >> isbn[12];
|
Hier solltest du deine Vorlesungsaufzeichnungen und das Lehrmaterial noch mal konsultieren; wie Arrays funktionieren, scheint dir nicht so richtig klar zu sein. isbn[12] ist nach der Deklaration kein Bezeichner für das gesamte Array (dieses heißt isbn), sondern wäre ein Element des Arrays, wenn dieses nicht auf 12 Einträge (also Indices 0-11) begrenzt wäre. So, wie es da steht, wird undefiniertes Verhalten erzeugt.
Etwas weiter unten passiert der selbe Fehler erneut:
C++: |
do //mache folgendes.... { i++; //index um 1 erhöhen zw[i] = isbn[i] * 3; //zweite, vierte ... zahl der isbn bearbeiten und abspeichern i++; //index um 1 erhöhen zw[i] = isbn[i] * 1; //dritte, fünfte ... zahl der isbn bearbeiten und abspeichern }while(i != 12); //...bis der index 12 ist
|
hier wird zw[12] = isbn[12] gesetzt, und da sowohl zw als auch isbn auf 12 Einträge begrenzt sind (der letzte gültige also zw[11] bzw. isbn[11] ist), würde der Code hier undefiniert, wenn er es nicht weiter oben schon wäre. Zusätzlich dazu werden hier schon bevor über die Arraygrenzen hinaus gelesen bzw. geschrieben wird Werte verwendet, die vorher nicht initialisiert werden. Das Ergebnis der betreffenden Berechnungen ist daher unspezifiziert.
Gleiches gilt hier:
C++: |
for(i = 0; i <= 12; i++) //index auf 0 setzen und je schleifendurschlauf um 1 erhöhen bis index = 12 ist { zs = zs + zw[i]; //zs den wert von aktuellen zs + zw des aktuellen indexes zuweisen }
|
Des weiteren bin ich mir ziemlich sicher, dass
nicht macht, was du vermutest; es löscht lediglich den Fehlerstatus des Stream-Objekts std::cin. Ich nehme an, du suchst nach cin.ignore(numeric_limits<streamsize>::max(), '\n');. In diesem Fall wäre es aber insgesamt einfacher und sauberer, erst die ganze Zeile in einen String zu holen und die Ziffern daraus in das Zahlenarray, mit dem du arbeiten willst (bzw. einen vector) zu zerlegen, dann löst sich das Problem in Wohlgefallen auf.
Beheb das erst mal, dann mach dich an die andere Funktion. Dort betreibst du den selben Kram ja erneut. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 26.12.2011 um 23:22 Uhr von 0xdeadbeef editiert. |