Probleme langage C

Fermé
kekedu38 - Modifié le 7 mars 2020 à 21:16
 DevGnode - 9 mars 2020 à 11:49
Bonsoir,
je suis un étudiant en GEII 1ére année et j'ai un exercice de programmation en c a faire pour mardi.

La consigne de l'exercice :

Écrire un programme qui demande les valeurs des 3 composantes de couleurs (rouge, vert et bleu), chacune étant codée sur 8 bits, pour constituer une valeur de pixel sur 24 bits de la manière suivante : rrrrrrrrvvvvvvvvbbbbbbbb.
Votre programme devra faire appel à une fonction de saisie (à écrire) qui devra s’assurer que la valeur de chacune des composantes est bien comprise entre 0 et 255 inclus.

Le problème :

il faut que j'arrive a isolé 4 bit du Tpixel pour les envoyer dans la fonction : void fonction_switch_hexa(short int mot4bit), et ainsi pouvoir les convertir en hexadecimal.


void fonction_saisie(unsigned *pVAL1,unsigned *pVAL2,unsigned *pVAL3);
void fonction_conversion_decimal_binaire(short int tab[max],short int rou,short int ver,short int ble);
void fonction_switch_hexa(short int mot4bit);
int main(void)
{
short int i;
short int Tpixel[max];
unsigned r,v,b;
fonction_saisie(&r,&v,&b);
fonction_conversion_decimal_binaire(Tpixel,r,v,b);
printf("\nValeur du pixels sur 24 bits en binaire : ");
for(i=0;i<24;i++)
{
printf("%hd",Tpixel[i]);
}
printf("\n");
return(0);
}
void fonction_saisie(unsigned *pVAL1,unsigned *pVAL2,unsigned *pVAL3)
{
long int rouge,vert,bleu;
//rouge
do
{
printf("\ndonnez la composante rouge en decimal : ");
scanf("%ld",pVAL1);
}while(*pVAL1<0||*pVAL1>255);
//vert
do
{
printf("\ndonnez la composante vert en decimal : ");
scanf("%ld",pVAL2);
}while(*pVAL2<0||*pVAL2>255);
//bleu
do
{
printf("\ndonnez la composante bleu en decimal : ");
scanf("%ld",pVAL3);
}while(*pVAL3<0||*pVAL3>255);
}
void fonction_conversion_decimal_binaire(short int tab[max],short int rou,short int ver,short int ble)
{
short int i;
float result;
// rouge
for(i=0;i<8;i++)
{
result=rou%2;
rou=rou/2;
if(result==0)
{
tab[7-i]=0;
}
if(result==1)
{
tab[7-i]=1;
}
}
printf("\nLe resultat de la conversion en binaire de la composante rouge : ");
for(i=0;i<8;i++)
{
printf("%hd",tab[i]);
}
//vert
for(i=0;i<8;i++)
{
result=ver%2;
ver=ver/2;
if(result==0)
{
tab[15-i]=0;
}
if(result==1)
{
tab[15-i]=1;
}
}
printf("\nLe resultat de la conversion en binaire de la composante vert : ");
//bleu
for(i=8;i<16;i++)
{
printf("%hd",tab[i]);
}
for(i=0;i<8;i++)
{
result=ble%2;
ble=ble/2;
if(result==0)
{
tab[23-i]=0;
}
if(result==1)
{
tab[23-i]=1;
}
}
printf("\nLe resultat de la conversion en binaire de la composante bleu : ");
for(i=16;i<24;i++)
{
printf("%hd",tab[i]);
}
printf("\n");
}
void fonction_switch_hexa(short int mot4bit)
{
switch(mot4bit)
{
case 0000 : printf("0");
break;
case 0001 : printf("1");
break;
case 0010 : printf("2");
break;
case 0011 : printf("3");
break;
case 0100 : printf("4");
break;
case 0101 : printf("5");
break;
case 0110 : printf("6");
break;
case 0111 : printf("7");
break;
case 1000 : printf("8");
break;
case 1001 : printf("9");
break;
case 1010 : printf("A");
break;
case 1011 : printf("B");
break;
case 1100 : printf("C");
break;
case 1101 : printf("D");
break;
case 1110 : printf("E");
break;
case 1111 : printf("F");
break;
default : printf("ERREUR");
}
}
Quelqu'un pourrait m'aider ?

3 réponses

Bonsoir,

Pourquoi converti tu en binaire tes valeurs RGB saisie pour ensuite les reconvertir ton binaire en hexadécimal ?

si tes valeur RGB sont des entiers ( 1 byte ) en entrée converti directement ces valeurs RGB en hexadécimal.

( DWORD >> 16 )&255 = R, ( DWORD >> 8 )&255 = G, ( DWORD )&255 = B;
( Byte R << 16 ) | ( Byte G << 8 ) | ( byte B ) = DWORD 24 bits

si tu veux reconstruire un byte avec un tableau de 1 et 0 utilise les bitwise afin de recomposer ton Byte comme si dessus ( dans une boucle ).

c'est du js mais l'algorithmique de conversion reste la même (function __ ), j'ai du le faire en python lors de ma licence. tu peux optimiser ta function 'fonction_conversion_decimal_binaire'


(function( ){

 function __( a,b,f){
  var i = t = 0,
      ret = "";
  try{
   if( a == 0 )
   ret = f.call( 
    null,
    ret,
    0
   );;

   while( Math.floor( a ) > 0 ){
    
    t = Math.floor( a%b );
    a/= b;
    
    ret = f.call(
     null,
     ret,
     t
    );    
   } 
   t = ret.split("").reverse().join("");
  }catch(e){ console.log( e ); };
 return t;
 }
return{
 dec2bin:function( a ){
 return __( a, 2, function( r, d ){
  return r+d;
  });
 },
 dec2oct:function( a ){
 return __( a, 8, function( r, d ){
  return r+d;
  });
 },
 dec2hex:function(a){
 var al = "abcdef";
 return __( a, 16, function( r, d ){
  return r+( d < 10 ? d : al[ d-10 ] );
  }); 
 },
}
})


a est ta valeur de convertion, b ta base ( 2, 8, 16 ), f est ton tableau que tu incrémente de 0-23

reconstruit tes valeurs RGB en DWORD passe la dans ta function de convertion cela t'évitera de faire 3 boucles inutile pour ta function 'fonction_conversion_decimal_binaire'.


j'espère ne pas avoir répondu à côté de la plaque.

Bien Cdlt,
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
8 mars 2020 à 08:06
Bonjour à tous les 2.
@kekedu38, vois tu comme le code présenté par DevGnode est bien plus agréable à lire que le tien?
Voir ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code pour tu en fasses autant par la suite.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 9 mars 2020 à 11:39
Comme suggéré par DevGnode, la bonne façon de faire semblerait d'utiliser les opérateurs bit à bit de décalage vers la gauche et le OU logique

@kekedu38 vois :
https://emmanuel-delahaye.developpez.com/tutoriels/c/operateurs-bit-bit-c/

Sur les types à utiliser, je n'utiliserais pas DWORD comme le fait DevGnode, car c'est un type non standard inventé par MS Windows.

kekedu38 pourrait à la place utiliser des types standards entiers non signés prévus par le C et accessibles par stdint.h permettant de disposer d'une capacité suffisante pour y stocker 24 bits (
uint32_t
par exemple), les types pour les valeurs individuelles de R, V et B pouvant être affectés à des
uint8_t
une fois que l'on a vérifié que la saisie était correcte avec un type de capacité plus grande (
int
fait l'affaire).

sur ces types entiers permettant de maîtriser la taille en bits, voir :

http://www.cplusplus.com/reference/cstdint/

Dal
0
bonjour Dal,

En faite je parle en :

BYTE - 00,
WORD - 0000
DWORD - 00000000
QWORD - 0000000000000000

c'est juste pour avoir une vision plus clair en tête, après c'est à lui d'utiliser le typage le plus approprié au langage qu'il va utiliser, comme je fait pas mal ASM c'est plus clair pour avoir une vision de l'espace réelle utilisé en mémoire.

par contre lui veux avoir 4 bits je ne vois pas trop l'utilité car la valeur minimal même pour une Boolean l'espace en mémoire utilisé sera un BYTE, autant qu'il reconstruise sont BYTE mais dans sont cas cela revient à reformer les valeurs RGB de départ qu'il a en entré, c'est un peu le serpent qui se mort la queue.

:)

Cdlt,
0