2017-03-17 2 views
1

Je développais une application de console simple, où vous entrez le code hexadécimal d'une valeur ARGB, et l'application vous dira, sur 255, les contenus Rouge, Vert, Bleu et Alpha de la valeur.C++ - Affichage des paramètres d'une valeur ARGB ne fonctionne pas?

Par exemple:

Enter a 32-bit RGBA color value in hexadecimal (e.g. FF7F3300): FF7F3300 
Your color contains: 
255 of 255 red 
127 of 255 green 
51 of 255 blue 
0 of 255 alpha 

En théorie, c'est la façon dont l'application devrait fonctionner. Pourtant, ce n'est pas le cas. Il affiche 0 pour chaque couleur.

J'ai utilisé le même code que j'ai utilisé pour cette application dans une application C#, à l'exception de la syntaxe ajustée pour s'adapter à la langue, et cela a fonctionné correctement. Cependant, en raison de mon manque de connaissances en C++, je suis incapable de déboguer correctement cette application, même après une demi-heure de réflexion.

Mon code C++ que j'ai utilisé pour cela est la suivante:

#include "stdafx.h" //Always imported for VisualStudio 

#include <iostream> //For input/output operations 

using namespace std; //To simplify code - no conflicting namespaces are being used, and yet the std namespace is used often 

void introduce() 
{ 
    cout << "Welcome to 'ARGB to Decimal'! This program will take a hex ARGB colour value (such as FF7F3300) and output the colour parameters that this value stores."; 
} 

uint32_t getValue() 
{ 
    cout << "\n\nPlease enter an ARGB value: "; 

    uint32_t value; 

    cin >> hex >> value; 

    cout << hex << "You have selected an ARGB value of " << value; 

    return value; //Converted to hex due to bitwise operations that will be performed on this value 
} 

int main() 
{ 
    introduce(); 

    uint32_t ARGBValue{ getValue() }; 

    uint32_t bitComparison{ 0xFF000000 }; //Used as the right operand of a bitwise AND operator to single out the bits for each byte of the ARGB value (with its bits being shifted 8 bits to the right before the 2nd, 3rd, and 4th comparison, and so display the appropriate byte value for that parameter 

    cout << "\n\nThe selected value has the following parameter values (out of 255):\n- Alpha:\t" 
     << ((ARGBValue & bitComparison) >> 24) 
     << "\n- Red:\t\t" << ((ARGBValue & (bitComparison >>= 8)) >> 16)   
     << "\n- Green:\t" << ((ARGBValue & (bitComparison >>= 8)) >> 8) 
     << "\n- Blue:\t\t" << (ARGBValue & (bitComparison >>= 8)) 
     << "\n\n"; 

    system("pause"); 

    return 0; 
} 

Ce singularise les bits pour chaque paramètre de la valeur ARVB en utilisant le bit opérateur AND avec la valeur de paramètre et une valeur bitComparison , qui a un ensemble de 8 bits activés à l'emplacement respectif où sont situés les bits du paramètre en cours de sélection.

Les bits bitComparison sont décalés dans l'instruction cout, lors de son exécution.

J'apprécierais que quelqu'un puisse me dire comment résoudre ce problème.

Voici l'exemple de sortie, ce qui ne fonctionne pas:

Welcome to 'ARGB to Decimal'! This program will take a hex ARGB colour value (such as FF7F3300) and output the colour parameters that this value stores. 

Please enter an ARGB value: FF7F3300 
You have selected an ARGB value of ff7f3300 

The selected value has the following parameter values (out of 255): 
- Alpha:  0 
- Red:   0 
- Green:  0 
- Blue:   0 

Press any key to continue . . . 
+0

« Converti hexadécimale en raison des opérations sur les bits 'Vous n'avez pas à vous préoccuper de cela, std :: dec est parfaitement adapté à ces cas. – Papipone

+0

En outre, il semble que vous code avec VS. Parcourez votre code avec un débogueur et examinez la valeur des champs (ARGBValue & (bitComparison >> = 8) .... – Papipone

Répondre

2

Cette compilation fine et donner le résultat attendu (Compilé avec g ++ C++ 11 support):

#include <iostream> //For input/output operations 
#include <cstdint> 

void introduce() 
{ 
    std::cout << "Welcome to 'ARGB to Decimal'! This program will take a hex ARGB colour value (such as FF7F3300) and output the colour parameters that this value stores."; 
} 

uint32_t getValue() 
{ 
    std::cout << "\n\nPlease enter an ARGB value: "; 
    std::uint32_t value; 
    std::cin >> std::hex >> value; 
    std::cout << std::hex << "You have selected an ARGB value of " << value; 
    return value; //Converted to hex due to bitwise operations that will be performed on this value 
} 

int main() 
{ 
    introduce(); 

    std::uint32_t ARGBValue{ getValue() }; 

    std::cout << std::dec << "\n\nThe selected value has the following parameter values (out of 255):\n- Alpha:\t" 
       << ((ARGBValue >> 24) & 0xFF) 
       << "\n- Red:\t\t" 
       << ((ARGBValue >> 16) & 0xFF) 
       << "\n- Green:\t" 
       << ((ARGBValue >> 8) & 0xFF) 
       << "\n- Blue:\t\t" 
       << (ARGBValue & 0xFF) 
       << "\n\n"; 

    return 0; 
}