2010-10-10 7 views
4

Je suis nouveau en C++, et faire un peu de googling je pensais que sprintf ferait le travail, mais j'obtiens une erreur lors de la compilation que je ne peux pas convertir entre un unsigned char et char. J'ai besoin d'un caractère non signé parce que je vais imprimer dans un fichier image (0-255 RVB).C++ Conversion d'un flottant en un caractère non signé?

unsigned char*** pixels = new unsigned char**[SIZE]; 
vector<float> pixelColors; 

... 

sprintf(pixels[i][j][k], "%.4g", pixelColors.at(k)); 

(pixelColors a une taille de 3 et 'k' fait référence à une variable 'boucle')

+0

DO que vous voulez convertir un flotteur dans une chaîne? Ou voulez-vous imprimer la représentation binaire d'une valeur flottante? –

+0

J'ai édité mon post principal. J'ai un tableau dynamique 3D de caractères non signés et je veux stocker la valeur d'octet pour chaque flottant. – Steve

+0

Attendez, voulez-vous dire que vous allez envoyer les données d'image à l'imprimante? Si c'est le cas, vous devrez rechercher CUPS (Common Unix Printing System) ou l'équivalent de Windows. – Frank

Répondre

7

je vais deviner que les flotteurs sont compris entre 0,0 ... 1,0, alors vous fait comme ceci:

float redf = 0.5f; 
unsigned char reduc = redf * 255; 

La ROUGES variable sont maintenant 128.


EDIT: exemple complet, l'image sortie en format net PPM.

// Usage 
// program > file.ppm 

#include <vector> 
#include <iostream> 

typedef struct 
{ /* colors in range 0..1 anything else is out of gamut */ 
    float red, green, blue; 
} color; 

using namespace std; 

int main (int argc, char **argv) 
{ 
    int width = 10, height = 10; 
    vector<color> bitmap; // This should maybe be called floatmap? ;) 

    // Make an image in memory as a float vector 

    for(int y = 0; y < height; y++) 
    { 
     for(int x = 0; x < width; x++) 
     { 
      color temp; 
      temp.red = ((float)x/width); 
      temp.green = 0; 
      temp.blue = ((float)y/height); 
      bitmap.push_back(temp); 
     } 
    } 

    // output image as an Netppm pixmap 
    cout << "P3" << endl << width << " " << height << endl << 255 << endl; 
    for(int y = 0; y < height; y++) 
    { 
     for(int x = 0; x < width; x++) 
     { 
      int red, green, blue; 
      red = (unsigned char)(bitmap[y*width+x].red * 255); 
      green = (unsigned char)(bitmap[y*width+x].green * 255); 
      blue = (unsigned char)(bitmap[y*width+x].blue * 255); 
      cout << red << " "; 
      cout << green << " "; 
      cout << blue << " "; 
     } 
     cout << endl; 
    } 
    return 0; 

}

J'espère que cela vous aide. Vous pouvez lire environ Netpbm format on wikipedia.


EDIT2: La sortie d'image est clair.
Le résultat est comme ceci:
test image (minuscule, est-il pas la ligne d'édition 16 à 512x512 ou quelque chose?)

Et la sortie réelle est la suivante:

P3 
10 10 
255 
0 0 0 25 0 0 51 0 0 76 0 0 102 0 0 127 0 0 153 0 0 178 0 0 204 0 0 229 0 0 
0 0 25 25 0 25 51 0 25 76 0 25 102 0 25 127 0 25 153 0 25 178 0 25 204 0 25 229 0 25 
0 0 51 25 0 51 51 0 51 76 0 51 102 0 51 127 0 51 153 0 51 178 0 51 204 0 51 229 0 51 
0 0 76 25 0 76 51 0 76 76 0 76 102 0 76 127 0 76 153 0 76 178 0 76 204 0 76 229 0 76 
0 0 102 25 0 102 51 0 102 76 0 102 102 0 102 127 0 102 153 0 102 178 0 102 204 0 102 229 0 102 
0 0 127 25 0 127 51 0 127 76 0 127 102 0 127 127 0 127 153 0 127 178 0 127 204 0 127 229 0 127 
0 0 153 25 0 153 51 0 153 76 0 153 102 0 153 127 0 153 153 0 153 178 0 153 204 0 153 229 0 153 
0 0 178 25 0 178 51 0 178 76 0 178 102 0 178 127 0 178 153 0 178 178 0 178 204 0 178 229 0 178 
0 0 204 25 0 204 51 0 204 76 0 204 102 0 204 127 0 204 153 0 204 178 0 204 204 0 204 229 0 204 
0 0 229 25 0 229 51 0 229 76 0 229 102 0 229 127 0 229 153 0 229 178 0 229 204 0 229 229 0 229 
2

Je ne sais pas, quelle est votre exigence exacte [puisque vous didnot coller un extrait du code .. comme Greg a demandé], exemple suivant pourrait résoudre:

#include <iostream> 
#include <conio.h> 
using namespace std; 

int main() 
{ 
    float i=1; 
    unsigned char c; 
    c = static_cast<unsigned char>(i); 
    cout << c << endl; 
    getch(); 
    return 0; 
} 
+0

Je vais essayer, merci! – Steve

Questions connexes