000
31.12.2015, 20:16 Uhr
Yadgar
|
Hi(gh)!
Ich will einen zweidimensionalen vector an einen Funktion übergeben, die Objekte vom selbst definierten Typ pixel an diesen vector anhängt:
C++: |
bool loadTGA(vector<vector<pixel> >* img, string filename) {
ifstream Source; unsigned short idfield, width, height; // rgb triple;
Source.open(filename.c_str(), ios::binary); if (!Source) { cerr << filename << " cannot be opened!\n"; return false; }
char ch;
Source.get(ch); // reads in first byte: length of image identification field (0 - 255) idfield = (unsigned short)(unsigned char)ch;;
Source.seekg(12, ios_base::beg); // file pointer is set to 12th byte Source.get(ch); width = (unsigned short)(unsigned char)ch; Source.get(ch); width += ((unsigned short)(unsigned char)ch)*256; Source.get(ch); height = (unsigned short)(unsigned char)ch; Source.get(ch); height += ((unsigned short)(unsigned char)ch)*256;
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+idfield, ios_base::beg); // file pointer is set to first byte of pixel data while (Source.get(ch) && Source.tellg() <= 18+idfield+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/width->push_back(p); }
c++; } return true; }
|
Der vector enthält vector-Objekte, die wiederum aus pixel-Objekten bestehen; jedes pixel-Objekt ist drei Byte groß.
Für img+c/width->push_back(p); bekomme ich allerdings eine Fehlermeldung, und zwar:
[Error] base operand of '->' is not a pointer
Warum? Wenn img die Startadresse des gesamten vector-Objektes ist und c ein Zähler für die einzelnen eingelesenen Bytes (aus einer TGA-Grafikdatei), sollte doch jeder untergeordnete vector (entspricht einer Bildzeile) bei img+c/width beginnen...
Bis bald im Khyberspace!
Yadgar -- Flagmaker - ein Programmier-Blog |