for-Funktion schaltet nicht ein

07/17/2015 16:03 Katzenstreu#1
Hey,

ich bin momentan dabei, Aufgabe 3.20 im C++ Primer zu lösen.
Dabei soll ich eine Reihe von Ganzzahlen in einen Vector lesen und dann die Summe mit den angrenzenden Paaren berechnen.

Dafür habe ich diesen Code hier geschrieben:

Code:
#include <iostream>
#include <vector>
#include <string>

using std::vector;
using std::string;

int main()
{
	vector<string::size_type> storage;
	int stor;

	while (std::cin >> stor)
		storage.push_back(stor);

	for (unsigned i = 0; i == storage.size() - 1; ++i)
	{
		int num1(0), num2(0), num3(0);

		for (int &c : storage[i])
			num1 += c;

		if (i != 0)
		{
			for (int &c : storage[i - 1])
				num3 += c;
		}

		if (i != storage.size() - 1)
		{
			for (int &c : storage[i + 1])
				num2 += c;
		}

		std::cout << "Sum is " << num1 + num2 + num3 << std::endl;
	}

	system("Pause");
	return 0;
}
Allerdings setzt die for-Funktion nie ein und weiß leider auch nicht woran das liegt. :X
Könnte mir jemand bei diesem Problem behilflich sein?

Schonmal danke im Voraus!


Mit freundlichen Grüßen,
Katzenstreu
07/17/2015 16:05 Cr4nkSt4r#2
Die Bedingung ist nur erfüllt wenn storage.size() - 1 = 0 ist, soll das so sein?

for (unsigned i = 0; i <= storage.size() - 1; ++i)
würde für mich mehr Sinn ergeben
07/17/2015 16:21 Katzenstreu#3
Quote:
Originally Posted by Cr4nkSt4r View Post
for (unsigned i = 0; i <= storage.size() - 1; ++i)
würde für mich mehr Sinn ergeben

Ahh, da habe ich den zweiten Reiter so behandelt, als würde der for abgebrochen werden, wenn die Bedingung erfüllt wird... :X Danke!

Hätte jetzt aber ein neues Problem, und zwar kriege ich hier:

Code:
		for (int &c : storage[i])
			num1 += c;
diesen Fehler: "no callable 'begin' function found for type 'unsigned int'"

Hättest du da auch eine Idee?
07/17/2015 16:54 snafu#4
Quote:
Originally Posted by Katzenstreu View Post
Ahh, da habe ich den zweiten Reiter so behandelt, als würde der for abgebrochen werden, wenn die Bedingung erfüllt wird... :X Danke!

Hätte jetzt aber ein neues Problem, und zwar kriege ich hier:

Code:
		for (int &c : storage[i])
			num1 += c;
diesen Fehler: "no callable 'begin' function found for type 'unsigned int'"

Hättest du da auch eine Idee?
Bist du dir sicher, dass die Referenz C den richtigen Datentypen hat? Du kannst es ja mal mit auto versuchen. Hier ist übrigens keine Referenz angebracht. Wieso nutzt du einen Index/Subscript Operator für einen Iterator?
07/17/2015 17:56 Katzenstreu#5
Quote:
Originally Posted by Rouvesta View Post
Bist du dir sicher, dass die Referenz C den richtigen Datentypen hat? Du kannst es ja mal mit auto versuchen. Hier ist übrigens keine Referenz angebracht. Wieso nutzt du einen Index/Subscript Operator für einen Iterator?
Sollte ja eigentlich, schließlich lässt der string::type_ref Typ nur Zahlen zu und es werden ja nur einzelne Zahlen ausgelesen. Habe es zur Sicherheit nochmals getestet, scheint auch nicht zu funktionieren. :X

Wieso denn keine Referenz? Ich will ja nur den einzelnen Buchstaben auslesen. Was wäre denn angebrachter?

Weil ich einzelne Zahlen auslesen will. Schau mal in den ersten Post, dort ist der Code in der Gesamtheit zu sehen.
07/17/2015 18:02 snafu#6
In einem range for nutzt du aber einen Iterator und dementsprechend ist der Index unangebracht. Eine Referenz wäre nützlich um den Wert von C zu verändern, das tust du aber gar nicht.
07/17/2015 19:04 Katzenstreu#7
Quote:
Originally Posted by Rouvesta View Post
In einem range for nutzt du aber einen Iterator und dementsprechend ist der Index unangebracht. Eine Referenz wäre nützlich um den Wert von C zu verändern, das tust du aber gar nicht.
Der Index ist dort schon angebracht, schließlich will ich nicht alle Vektoren lesen sondern nur einen Wert davon.

Aber was soll ich denn stattdessen verwenden?
Ich will ja schließlich nur einen Wert ablesen, und ein neues Objekt dafür zu erschaffen ist ja nicht wirklich nötig.

€dit: bzw. nein, der Index ist nicht nötig, habe die Aufgabe falsch verstanden. Bitte einfach wegdenken. Naja, der ganze Code ist somit nicht wirklich interessant. Trotzdem würde ich gerne meine Fehler erfahren. :x
07/17/2015 19:12 snafu#8
Quote:
Originally Posted by snow
Code:
for (unsigned int i = 1; i != storage.size() - 2; ++i) 
{
 std::cout << (storage[i - 1] + storage[i] + storage[i + 1]) << std::endl; 
}
Wäre eine mögliche Lösung, da gibt er es ja von jedem aus.

Du greifst mit deinem Index auf ein Element des vectors storages zu. Dieses ist ein primitiver Datentyp und über einen solchen(einzelnen) kannst du ja schlecht drüber iterieren. Ein primitiver Datentyp hat ja schließlich keine Iterator-Memberfunktion "begin()". :)

e: der Code war ein Einzeiler, natürlich darf man Edge-Cases nicht vergessen usw.
07/17/2015 22:55 Katzenstreu#9
Quote:
Originally Posted by Rouvesta View Post
Wäre eine mögliche Lösung, da gibt er es ja von jedem aus.

Du greifst mit deinem Index auf ein Element des vectors storages zu. Dieses ist ein primitiver Datentyp und über einen solchen(einzelnen) kannst du ja schlecht drüber iterieren. Ein primitiver Datentyp hat ja schließlich keine Iterator-Memberfunktion "begin()". :)

e: der Code war ein Einzeiler, natürlich darf man Edge-Cases nicht vergessen usw.
Hätte ich im Buch eine Seite weiter geblättert, hätte ich mir die Frage auch sparen können. :S

Danke euch beiden für die Hilfe!