009
04.12.2015, 23:01 Uhr
Yadgar
|
Hi(gh)!
Zitat von ao: |
Das letzte Mal, als du diese Meldung hattest, hast du gesagt, es lag an einem vergessenen return.
|
*anKopfklatsch*
Ich bin noch mal den Code durchgegangen - natürlich, das war es!
Jetzt läuft das Programm formell einwandfrei durch - und tut doch nicht, was es soll!
Denn: der zweidimensionale vector wird per Referenz übergeben und in der Funktion dann dimensioniert, danach folgt eine Auslese-Schleife, in der die einzelnen Bytes einem vorher definierten Einzelobjekt vom Typ pixel (p) zugeordnet werden - nach jedem dritten Byte (die Reihenfolge bei TGA ist blau, grün, rot) wird dann p per push_back dem vector hinzugefügt.
Solange ich nur auf p mit dessen get-Methoden zugreife, sehe ich die korrekten Farbwerte (die Bilddatei ist testhalber winzig klein, nur 2 x 2 Pixel) - sobald ich aber auf das entsprechende pixel-Tripel im vector zugreifen will, werden mir nur Nullen angezeigt!
Hier der Code:
C++: |
unsigned int imgsize = width*height; unsigned int c; // counter
img.resize(height); for (c=0; c<height; c++) { img[c].resize(width); } c=0; pixel p; Source.seekg(18, ios_base::beg); // file pointer is set to 18th byte while (Source.get(ch) && Source.tellg() <= 18+imgsize*3 ) { switch (c%3) { case 0: p.set_blue((unsigned char)ch); // cout << (int)(unsigned char)p.get_blue() << endl; break; case 1: p.set_green((unsigned char)ch); // cout << (int)(unsigned char)p.get_green() << endl; break; case 2: p.set_red((unsigned char)ch); // cout << (int)(unsigned char)p.get_red() << endl; img[(c/3)/width].push_back(p); cout << "Row " << (c/3)/width << ", col " << (c/3)%width << endl; cout << "Red: " << (int)img[(c/3)/width].at((c/3)%width).get_red() << endl; cout << "Green: " << (int)img[(c/3)/width].at((c/3)%width).get_green() << endl; cout << "Blue: " << (int)img[(c/3)/width].at((c/3)%width).get_blue() << endl; } c++; }
|
width, height und daher auch imgsize haben korrekte Werte (andernfalls würden mir entweder mehr als vier Farbtripel oder womöglich sogar wieder ein Laufzeitfehler angezeigt).
Zur Erinnerung noch mal die Klasse mit den relevanten Methoden:
C++: |
class pixel { public: pixel(); // Standard-Konstruktor pixel (int, int, int); // Allgemeiner Konstruktor ~pixel(); // Destruktor void set_all(int, int, int); void set_red(int); void set_red(unsigned char); void set_green(int); void set_green(unsigned char); void set_blue(int); void set_blue(unsigned char); void get_all(rgb&); unsigned char get_red(); unsigned char get_green(); unsigned char get_blue(); void invert(); private: unsigned char r; unsigned char g; unsigned char b; };
|
C++: |
void pixel::set_red(int red) { r = (unsigned char)red; }
void pixel::set_red(unsigned char red) { r = red; }
void pixel::set_green(int green) { g = (unsigned char)green; }
void pixel::set_green(unsigned char green) { g = green; }
void pixel::set_blue(int blue) { b = (unsigned char)blue; }
void pixel::set_blue(unsigned char blue) { b = blue; }
unsigned char pixel::get_red() { return r; }
unsigned char pixel::get_green() { return g; }
unsigned char pixel::get_blue() { return b; }
|
Die set-Methoden sind überladen, es gibt sie jeweils auch für int-Parameter (damit ich bei späteren Anwendungen auch int-Literale übergeben kann), aber daran liegt es nicht, ich habe sie in diesem Fall hier in beiden Versionen getestet, es kamen so oder so am Ende immer nur Nullen heraus. Ebensowenig hat das Problem mit dem Rückgabeformat der get-Methoden zu tun, eine zeitweilige Umstellung auf int führte ebenfalls zu keiner Veränderung.
Woran liegt es aber dann?
Bis bald im Khyberspace!
Yadgar -- Flagmaker - ein Programmier-Blog |