Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zweidimensionales vector-Objekt als Referenz übergeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
05.12.2015, 05:54 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von Yadgar:
der zweidimensionale vector wird per Referenz übergeben und in der Funktion dann dimensioniert,

hast Du mal überprüft, ob er beim dimensionieren auch keinen neuen, lokalen Vector anlegt, also beim füllen auch wirklich auf den Speicherbereich zugreift, dessen Adresse Du mit der Referenz übergeben hast?
Das ist jedenfalls das Einzige, was mir (bisher) zum entstehen der unterschiedlichen Ergebnisse einfällt. Eine Überprüfung im Debugger sollte da Klarheit schaffen.

Hans


Edit in neuen Kommentar verschoben...
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 05.12.2015 um 06:55 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
05.12.2015, 06:54 Uhr
Hans
Library Walker
(Operator)


Stunden später...
Habe es nicht getestet, aber gemäss C++ Referenz dürfte der Fehler in der Verwendung von push_back liegen, denn std::vector::push_back
Zitat von cplusplus.com:
Adds a new element at the end of the vector, after its current last element.

Da die Grösse aber schon vorgegeben ist, und bereits vorhandene Elemente beschrieben werden sollen, wäre es wohl besser, mit dem Klammer-operator, also den eckigen Klammern auf die Elemente zuzugreifen.
Soweit mal mein Senf, den ich mir anhand der verlinkten Referenz zusammengereimt habe.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 05.12.2015 um 06:58 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
05.12.2015, 17:14 Uhr
Yadgar



Hi(gh)!


Zitat von Hans:

Da die Grösse aber schon vorgegeben ist, und bereits vorhandene Elemente beschrieben werden sollen, wäre es wohl besser, mit dem Klammer-operator, also den eckigen Klammern auf die Elemente zuzugreifen.
Soweit mal mein Senf, den ich mir anhand der verlinkten Referenz zusammengereimt habe.



Andersherum wird ein Schuh draus: wenn ich auf die vorherige Festlegung der Größe ("Dimensionierung") verzichte, funktioniert es mit push_back()! Danke für den Tipp!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
06.12.2015, 11:46 Uhr
ao

(Operator)


Nein, Hans hat völlig recht. Nach der Schleife über resize sind alle Pixel im Vector vorhanden, und du kannst mit dem doppelten Klammer-Operator drauf zugreifen:

img[row][col].set_all (p.get_red(), p.get_green(), p.get_blue());

Oder, wenn du der pixel-Klasse noch einen operator= spendierst, dann gehts auch einfacher:

img[row][col] = p;

Dein Fehler bestand darin, dass du zuerst resize gemacht hast (Default-Pixel fürs ganze Bild anlegen) und dann noch einmal jedes Pixes mit push_back angefügt hast. img enthält danach die doppelte Menge Pixel, links ein ganz schwarzes Bild und rechts daneben nochmal das richtige. Ausgelesen hast du nur das schwarze.

Außerdem: push_back auf einem Vector ist eine sehr teure Operation, weil der bestehende Vector jedesmal umkopiert und um ein Element verlängert wird (theoretisch - praktisch optimiert die Vectorklasse das schon ein bisschen, aber es bleibt trotzdem teuer). Wenn man weiß, wie groß das Array am Ende sein soll (und bei Bilddateien weiß man das), dann sollte man wirklich resize verwenden, genau dafür ist das da.

Dringender Rat: Spiel ein bisschen mit den STL-Klassen (Vector und so) herum, damit du ein Gefühl dafür bekommst, wie die funktionieren, und achte dabei auch auf Performance. NIcht mit jedem Stück Halbwissen sofort in die Applikation gehen.

Das hier sieht mit Verlaub auch ziemlich schweinisch aus - verstehst du das in drei Wochen noch?
cout << "Red: " << (int)img[(c/3)/width].at((c/3)%width).get_red() << endl;
Es wäre hier viel übersichtlicher, den Row- und Column-Index extra mitzuführen. Und performanter als die ständige Dividiererei wäre es wahrscheinlich auch. Zumal du das c/3 auch noch doppelt rechnest.

Und das tellg hier ist doch auch Pamperscode für irgendwas, was sonst in die Hose geht, oder?
while (Source.get(ch) && Source.tellg() <= 18+imgsize*3 )

Musst du das File zeichenweise auslesen? Hast du nicht genug RAM, um das ganze Ding auf einmal zu holen?

Dieser Post wurde am 06.12.2015 um 12:02 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: