2012-04-11 16 views
-1

Ich versuche, eine Matrix von (doubles) in ein Zeichen ohne Vorzeichen zu konvertieren, damit ich dann in eine .pmg-Datei schreiben kann ... Aber es funktioniert nicht.Konvertieren von Double in unsigned char?

void writePNG(vector<double>& matrix) 
{ 
vector<unsigned char> image; 
ofstream myfile; 

myfile.open("newFile.txt", ios::out); // writing to .txt file for now for testing. 

if(!myfile.is_open()) 
{ 
    cout << "Cannot open file"; 
} 
for(int i=0; (i < 512*512); i++) 
{ 
    image[i] = (unsigned char) matrix[i]; 
} 

myfile.close(); 
} 

Die Daten werden nicht konvertiert. Irgendwelche Ideen?? Danke :)

+0

Was genau ist der Fehler? Gibt es einen Compilerfehler? Ist die Datei leer (was definitiv der Fall ist, weil Sie nichts schreiben)? Gibt es einen Laufzeitfehler? – alfa

+0

Ändern Sie die Deklaration in 'vector image (512 * 512);'. –

+0

Was ist der Fehler, den Sie dann sehen? Was sind die Wertebereiche im Matrix-Vektor? Z.B. Wenn -1 ... 1, müssen Sie zuerst die Werte skalieren. –

Antwort

2
  • Fehler: Sie sind ein Vektor der Größe 0, das Erstellen und dann in seine nicht vorhandenen Elemente zu schreiben.
  • Fehler: Sie schreiben nie die Daten in eine Datei
  • Stil: Sie können die Datei unnötig schließen. Es wird geschlossen, wenn das Objekt fstream den Geltungsbereich verlässt.
  • Format: Sie kopieren die Daten in einer Schleife. Mit vector::vector wird Ihre Absicht deutlicher angezeigt.
  • potenzieller Fehler: Sie erstellen einen Ausgabevektor von 512x512, unabhängig von der Größe des Eingabevektors.
  • SSCCE Ihr Testfall ist unvollständig.

Try this:

#include <vector> 
#include <iostream> 
#include <fstream> 

void writePNG(const std::vector<double>& matrix) 
{ 
    std::ofstream myfile("newFile.txt", std::ios::out); 

    if(!myfile.is_open()) 
    { 
    std::cout << "Cannot open file"; 
    } 
    std::vector<unsigned char> image (matrix.begin(), matrix.end()); 
    myfile.write(reinterpret_cast<const char*>(&image[0]), image.size()); 
} 

int main() { 
    writePNG({ 
    72, 101, 108.1, 108.2, 
    111, 0x2c, 0x20, 0x77, 
    0x6f, 0x72, 0x6c, 
    100.3, 10.4}); 
} 
+0

Konnten Sie nicht static_cast () 'statt der' reinterpret_cast <> 'verwenden? – Attila

+0

Nein, ich brauche 'reinterpret_cast' für nicht verwandte Zeigertypen. –

0

Sie Image-Vektor hat keine Größe - Sie müssten mindestens eine push_back tun, um ein Element hinzuzufügen. Außerdem ist die Größe eines Double nicht die gleiche Größe eines Chars, so dass Sie Informationen verlieren.

1

Sie erstellen image mit dem Standardkonstruktor vector, der den Vektor als leer initialisiert (enthält keine Elemente). Die tiefgestellte Notation (image[i]) erstellt kein Element, sondern weist nur einem bereits vorhandenen zu.

Sie haben (mindestens) zwei Möglichkeiten, es zu beheben:

  • erklären image die Ctor von vector verwenden, die die notwendige Größe zuordnet: vector<unsigned char> image(512*512) - dies wird der Vektor mit 512 * 512 Elemente der Standardbevöl Wert (0 für unsigned char)
  • die Elemente one-by-one fügen Sie die push_back Methode: image.push_back((unsigned char) matrix[i]);

Sie werden auch zu Schrift haben e den Inhalt von image zu myfile schließlich.

Hinweis: Es ist eine gute Angewohnheit, static_cast<unsigned char>(...) anstelle des C-style (unsigned char) ... zu verwenden, da ersterer Fehler finden kann, die letzterer nicht kennzeichnen wird; dies ist kein Problem in diesem besonderen Fall, obwohl