000
10.02.2017, 14:39 Uhr
Yadgar
|
Hi(gh)!
Folgendes Problem:
Die Funktion "blackandwhite" (soll Farbbilder in 1-bit-Schwarzbilder umwandeln)
C++: |
void blackandwhite(vector<vector<pixel> > &img, unsigned short int d) { unsigned short h = img.size(); unsigned short w = img[0].size(); unsigned short r, c; float v; cout << "Rastermodus: " << d << endl; switch(d) { case 0: for (r=0; r<h; r++) { for (c=0; c<w; c++) { v = img[r].at(c).getvalue(); if (v < 128) img[r].at(c).set_all(0, 0, 0); else img[r].at(c).set_all(255, 255, 255); } } break; case 1: rgb col0; col0 = {0, 0, 0}; palette.push_back(col0); rgb col1; col1 = {255, 255, 255}; palette.push_back(col1); floydsteinberg(img, palette); break; default: #ifdef DE cout << "Noch nicht implementiert!" << endl; #endif #ifdef EN cout << "Not yet implemented!" << endl; #endif break; } }
|
ruft, sofern mit Parameter für den Rastermodus 1 aufgerufen, die Funktion "floydsteinberg" auf:
C++: |
void floydsteinberg(vector<vector<pixel> > &img, vector<rgb> &pal) { unsigned short h = img.size(); unsigned short w = img[0].size(); unsigned short r, c, i; unsigned short p = pal.size(); rgb t0, t1, t2, t3, t4, closest=pal.at(0); rgb *triple; for (r=0; r<h; r++) { for (c=0; c<w; c++) { t0 = *img[r].at(c).get_all(triple); /* for (i=1; i<p; i++) { if (coldist(t0, pal.at(i)) < coldist(t0, closest)) closest = pal.at(i); cout << "<" << closest.red << ", " << closest.green << ", " << closest.blue << ">" << endl; } */ } }
cout << "Floyd-Steinberg-Rasterung wird berechnet!" << endl; }
|
Dieser zweiten Position wird ein zweidimensionaler Vector aus Objekten der von mir selbst definierten Klasse "pixel" übergeben. Die Klasse "pixel" sieht so aus:
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&); rgb* get_all(rgb*); unsigned char get_red(); unsigned char get_green(); unsigned char get_blue(); void invert(); void rgb2grey(); void rgb2grey(float, float, float); float getvalue(); private: unsigned char r; unsigned char g; unsigned char b; unsigned char round(float); };
|
In der Funktion "floydsteinberg" wird auf eine ihrer Methoden zugegriffen, die die RGB-Werte des jeweils aktuellen pixel-Objekts ausliest und als (Zeiger auf) ein struct-Objekt vom Typ "rgb" zurückgeben soll:
C++: |
rgb t0, t1, t2, t3, t4, closest=pal.at(0); rgb *triple; [...] t0 = *img[r].at(c).get_all(triple);
|
Genau dieser Aufruf mit Zuweisung führt dazu, dass sich das Programm aufhängt... wieso?
Bis bald im Khyberspace!
Yadgar -- Flagmaker - ein Programmier-Blog |