Initialisierung-Fehlermeldung trotz Initialisierung vor der For-Schleife?



  • Hallöschen,

    ich fange gerade an mit C++ unter VS2010 zu programmieren und verwende die OpenCV zur Bildverarbeitung.
    Dabei stoße ich auf folgendes Problem

    std::vector<double> a,b,c;
    	unsigned int ii;
        fstream outputFile;
        outputFile.open( image.output_file.c_str(), std::ios::out ) ;
        outputFile << "1.0" << std::endl;
        outputFile << key_points.size( ) << std::endl;
        for( unsigned int ii = 0; ii < key_points.size( ); ii++ )
    		if(ii>=500)
    		   break;
    		b[ii]=0;
    		a[ii]=1/((key_points[ii].size/2)*(key_points[ii].size/2));
    		c[ii]=a[ii];
           outputFile << key_points[ii].pt.x << " " << key_points[ii].pt.y <<" "<<a[ii]<<" "<<b[ii]<<" "<<c[ii]<< std::endl;
        outputFile.close( );
    

    Mit der Fehlermeldung:

    warning C4700: uninitialized local variable 'ii' used

    Aber die habe ich doch ober initialisiert oder verstehe ich das falsch?

    Letztendlich möchte ich die in der For-Schleife die variablen a b c als ein Array haben bzw. ein Vector(da dynamische Größe).
    Das heißt, wenn key_points.size() = 50 ergibt, dann möchte ich gerne 50 Zeilen mit a b und c.
    Aber leider kommt die Fehlermeldung.

    Ich hoffe IHr könnt mir Helfen.

    MfG

    freekickchamp



  • die definition ist in zeile 2 (ohne initialisierung). du greifst darauf zu in zeile 10 - 13. der for-rumpf ist lediglich zeile 8 & 9.



  • Du hast die geschweiften Klammern um den Schleifenkörper vergessen. Python-geschädigt?



  • seldon schrieb:

    Du hast die geschweiften Klammern um den Schleifenkörper vergessen. Python-geschädigt?

    Was heisst geschädigt?
    Auch wenn ich die Sprache nicht kann und kaum kenne. Dass sie einen zwingt halbwegs "schön" zu coden, findsch geil 😉



  • Skym0sh0 schrieb:

    Auch wenn ich die Sprache nicht kann und kaum kenne. Dass sie einen zwingt halbwegs "schön" zu coden, findsch geil 😉

    Das eine liegt an dem anderen :p



  • Wie kann ich die Initialisierung durchführen`?



  • freekickchamp schrieb:

    Wie kann ich die Initialisierung durchführen`?

    Musst du nicht.
    Mach geschweifte Klammern um die eingerückten Anweisungen der for-Schleife und lösche Zeile 2.



  • super, dankeschön.
    Hat funktioniert.
    Aber wieso lässt man manchmal die Klammern weg?
    Und wenn ich eine Fehlermeldung bekomme mit "Vector out of range", was bedeutet das?
    Wie geht das überhaupt, wenn der vector sich dynamisch anpasst oder habe ich das falsch verstanden?



  • freekickchamp schrieb:

    Aber wieso lässt man manchmal die Klammern weg?

    dann will man nur die nächste anweisung / bedingung / kontrollstruktur ausführen:

    for(int i = 0; i < 10; ++i)
    	std::cout << 'I'; // Wird ausgeführt in der Schleife
    std::cout << '\n';	// Nicht mehr
    /////////////////////////////////////////////////////////////////
    for(int i = 0; i < 10; ++i)
    	if(i % 2 == 0) // Wird geprüft in der Schleife
    		std::cout << 'I'; // Wird ausgeführt innerhalb der Schleife aber nur wenn die Bedingung erfüllt ist
    std::cout << '\n'; // Nicht mehr
    /////////////////////////////////////////////////////////////////
    for(int i = 0; i < 10; ++i)
    	for(int j = 0; j < 10; ++j) // Schleife in der Schleife
    		std::cout << 'I'; // Wird 100x ausgeführt
    

    wenn man sich gedanken darüber macht, wie der compiler das überhaupt auflösen soll, dann ist das verhalten ganz intuitiv. wenn du es nicht verstehst, dann mach vorerst einfach konsequent immer { } hin.

    freekickchamp schrieb:

    Und wenn ich eine Fehlermeldung bekomme mit "Vector out of range", was bedeutet das?

    dass du auf einen teil des vectors zugreifst der gar nicht exisitiert. z.b. wenn der vector size() == 5 hat, dann greifst du wohl auf >= 5 zu.

    freekickchamp schrieb:

    Wie geht das überhaupt, wenn der vector sich dynamisch anpasst oder habe ich das falsch verstanden?

    er passt sich nicht selbst dynamisch an. du musst ihm einfach sagen, wie gross er sein soll. dann vergrössert / verkleinert er sich. am häufigsten nimmt man dafür std::vector::resize() .



  • freekickchamp schrieb:

    Aber wieso lässt man manchmal die Klammern weg?

    Wenn du nur eine Anweisung hast, brauchst du nicht extra dafür einen Block aufmachen.
    Ein for mit dem Schleifenkörper gilt auch als eine Anweisung.
    Ein if mit dem else -Zweig auch.



  • Wenn dus dir so besser vorstellen kannst:
    ohne geschweifte Klammern, bis zum nächsten Semikolon

    LG



  • Ok, super.
    Eine Frage noch: Benötigt resize() aber nicht noch einen Input?



  • freekickchamp schrieb:

    Ok, super.
    Eine Frage noch: Benötigt resize() aber nicht noch einen Input?

    Ja, sicher...?

    Was es (und alles andere) braucht, kannst du im Zweifelsfall hier nachschauen:
    http://www.cplusplus.com/reference/vector/vector/resize/



  • Vielen Dank 🙂


Anmelden zum Antworten