Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

dans la serie les mysteres du C
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3285
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » ven. 20 févr. 2026 14:04

ce n'est pas la serie
Les mysteres de l'Ouest ... avec James Conrad
mais les mysteres du C dans l'Est .. avec paulfjujo


me voci de nouveau confronté à un smilblick ..
:sifflotte: probablement un bug de ma part

je veux afficher l'entete d'un fichier BMP 16 bits , contenue dans les 54 premiers bytes

Utilisant UART RX Interrupt,
je lance une capture du fichier sur un compte d'octets atteint ..54
et j'affiche le contenu ... qui n'atteint pas 54 valeurs ?


avec ce code C (XC8)
uint16_t k;
Buffer1[256] recoit l'entete du fichier BMP
p1 = pointeur sur debut du Buffer1
Bavard=2:

Code : Tout sélectionner


   if
(Requete_BMP==0)
     {
        CPrint(" Entete BMP de 54 bytes\r\n");// (6x8)+6 bytes
        for (i=0;i<6;i++)
         { 
          PrintChar
((char)i+48);PrintChar('>');PrintChar(' ');
          for (j=0;j<8;j++)
          {  
              k
=(i*8)+j;
              Un.Entete_BMP[k] =*(p1+k);
             if(Bavard>1)
              sprintf( CRam1,"%3d> 0x%02X ",k,*(p1+k) );
              else
                sprintf
( CRam1,"0x%02X ",*(p1+k) );   
            Print
(CRam1);
          }
          CRLF1();
         } 
         k
=k+1;
         PrintChar('6');PrintChar('>');PrintChar(' ');
         for (j=0;j<6;j++)
          {  
              k
=k+j;
             if(k>54) break;
             Un.Entete_BMP[k] =*(p1+k);
              //*( Entete_BMP+k)=*(p1+k);
             if(Bavard>1)
              sprintf( CRam1,"%3d> 0x%02x ",k,*(p1+k) );
             else
              sprintf
( CRam1,"0x%02x ",*(p1+k) );
            Print(CRam1);
          }
          CRLF1();  
          
}
          else 
          
{  //  ---  dialogue normal operateur  --------
             if((*(p1)=='H') && (*(p1+3)=='p'))     //Help<CR>
            {
                CPrint("\r\n Help : Help<CR>  \r\n");
                    CPrint(" RTC Update: U;18;01;26;11;36;06;#<CR>\r\n");
                    CPrint(" exemple pour :18 janv 2026 11:36 Dimanche\r\n");
                CPrint(" Nota: lundi=0  dimanche=6\r\n");
                    CPrint(" BAUD=X pour SPI Speed x=0=>32Mhz  X=1=>16Mhz  X=3=>8MHz  X=7=> 4MHz\r\n");
                CPrint(" BAV=0,1..9 -> Bavard pour tracage programme\r\n");
                CRLF1();
                    p1=0;
            }
          


resultat obtenu sur YAT Terminal

Code : Tout sélectionner


 Demande d
'envoi Fichier Image BMP , valide 4sec
..  sur terminal YAT , send file  :Image_128x160_16.bmp 

 Stop envoi terminal YAT
 Entete BMP de 54 bytes
0>   0> 0x42   1> 0x4D   2> 0x46   3> 0xA0   4> 0x00   5> 0x00   6> 0x00   7> 0x00 
1>   8> 0x00   9> 0x00  10> 0x46  11> 0x00  12> 0x00  13> 0x00  14> 0x38  15> 0x00 
2>  16> 0x00  17> 0x00  18> 0x80  19> 0x00  20> 0x00  21> 0x00  22> 0x60  23> 0xFF 
3>  24> 0xFF  25> 0xFF  26> 0x01  27> 0x00  28> 0x10  29> 0x00  30> 0x03  31> 0x00 
4>  32> 0x00  33> 0x00  34> 0x00  35> 0xA0  36> 0x00  37> 0x00  38> 0x20  39> 0x1C 
5>  40> 0x00  41> 0x00  42> 0x20  43> 0x1C  44> 0x00  45> 0x00  46> 0x00  47> 0x00 
6>  48> 0x00  49> 0x00  51> 0x00  54> 0x00 

 HEADER type : 4D42
 Taille: 41030
 Headsize 70
 W=128 x H=-160
 plan=    1 
  bitsColor=   16
 ResolH: 7200 
 ResolV: 7200 


Problemo :

quid des des valeurs manquantes 50,52,53 ?



Entete vue par XNVIEW

Image_128x160_16.bmp_via_XNVIEW.jpg





je viens de rajouter ce test :

Code : Tout sélectionner


CPrint
("Contenu Entete( Buffer1)\r\n");
        
p1=&Buffer1[0];
        for (
i=0;i<54;i++)
        {
            
sprintf(CRam1,"i=%5d  -> 0x%02X\r\n",i,*(p1+i));
            Print(
CRam1);
        }    
        
CRLF1();
 





Code : Tout sélectionner

 Entete BMP de 54 bytes
Contenu Entete
Buffer1)
i=    0  -> 0x42
i
=    1  -> 0x4D
i
=    2  -> 0x46
i
=    3  -> 0xA0
i
=    4  -> 0x00
i
=    5  -> 0x00
i
=    6  -> 0x00
i
=    7  -> 0x00
i
=    8  -> 0x00
i
=    9  -> 0x00
i
=   10  -> 0x46
i
=   11  -> 0x00
i
=   12  -> 0x00
i
=   13  -> 0x00
i
=   14  -> 0x38
i
=   15  -> 0x00
i
=   16  -> 0x00
i
=   17  -> 0x00
i
=   18  -> 0x80
i
=   19  -> 0x00
i
=   20  -> 0x00
i
=   21  -> 0x00
i
=   22  -> 0x60
i
=   23  -> 0xFF
i
=   24  -> 0xFF
i
=   25  -> 0xFF
i
=   26  -> 0x01
i
=   27  -> 0x00
i
=   28  -> 0x10
i
=   29  -> 0x00
i
=   30  -> 0x03
i
=   31  -> 0x00
i
=   32  -> 0x00
i
=   33  -> 0x00
i
=   34  -> 0x00
i
=   35  -> 0xA0
i
=   36  -> 0x00
i
=   37  -> 0x00
i
=   38  -> 0x20
i
=   39  -> 0x1C
i
=   40  -> 0x00
i
=   41  -> 0x00
i
=   42  -> 0x20
i
=   43  -> 0x1C
i
=   44  -> 0x00
i
=   45  -> 0x00
i
=   46  -> 0x00
i
=   47  -> 0x00
i
=   48  -> 0x00
i
=   49  -> 0x00
i
=   50  -> 0x00
i
=   51  -> 0x00
i
=   52  -> 0x00
i
=   53  -> 0x00

0
>   00x42   10x4D   20x46   30xA0   40x00   50x00   60x00   70x00 
1
>   80x00   90x00  100x46  110x00  120x00  130x00  140x38  150x00 
2
>  160x00  170x00  180x80  190x00  200x00  210x00  220x60  230xFF 
3
>  240xFF  250xFF  260x01  270x00  280x10  290x00  300x03  310x00 
4
>  320x00  330x00  340x00  350xA0  360x00  370x00  380x20  390x1C 
5
>  400x00  410x00  420x20  430x1C  440x00  450x00  460x00  470x00 
6
>  480x00  490x00  510x00  540x00 


idea ! j'ai bien 54 valeurs 0 à 53 , mais toujours manquantes dans la mise en forme
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

dans la serie les mysteres du C
satinas
Expert
Expert
Messages : 1503
Enregistré en : novembre 2015

#2 Message par satinas » ven. 20 févr. 2026 14:55

Essaie cette version plus courte, et on ne met pas à jour la structure Un pour le test.

Code : Tout sélectionner

  for (k=0; k<54; k++) {
    if (!(k%8)) {
      if (k) CRLF1();
      PrintChar((char)(k/8)+48);PrintChar('>');PrintChar(' ');
    }
    if (Bavard>1) sprintf( CRam1,"%3d> 0x%02X ",k,*(p1+k) );
    else          sprintf( CRam1,"0x%02X ",*(p1+k) );   
    Print(CRam1);
  }
  CRLF1(); 

dans la serie les mysteres du C
gwion
Expert
Expert
Messages : 1135
Enregistré en : février 2022

#3 Message par gwion » ven. 20 févr. 2026 15:16

Il ne manque pas la RAZ de k dans la seconde boucle ?

dans la serie les mysteres du C
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3285
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » ven. 20 févr. 2026 18:50

satinas a écrit :Essaie cette version plus courte, et on ne met pas à jour la structure Un pour le test.

Code : Tout sélectionner

  for (k=0; k<54; k++) {
    if (!(k%8)) {
      if (k) CRLF1();
      PrintChar((char)(k/8)+48);PrintChar('>');PrintChar(' ');
    }
    if (Bavard>1) sprintf( CRam1,"%3d> 0x%02X ",k,*(p1+k) );
    else          sprintf( CRam1,"0x%02X ",*(p1+k) );   
    Print(CRam1);
  }
  CRLF1(); 



Code : Tout sélectionner


0
>   00x42   10x4D   20x46   30xA0   40x00   50x00   60x00   70x00 
1
>   80x00   90x00  100x46  110x00  120x00  130x00  140x38  150x00 
2
>  160x00  170x00  180x80  190x00  200x00  210x00  220x60  230xFF 
3
>  240xFF  250xFF  260x01  270x00  280x10  290x00  300x03  310x00 
4
>  320x00  330x00  340x00  350xA0  360x00  370x00  380x20  390x1C 
5
>  400x00  410x00  420x20  430x1C  440x00  450x00  460x00  470x00 
6
>  480x00  490x00  500x00  510x00  520x00  530x00 


c'est OK ...
l'usage de l'union mettrait le boxon ?

je retesterai en incluant le U ...dans la boucle.

declaration union

Code : Tout sélectionner



union
{
struct 
 
{// size is 14 bytes
  
uint16_t   bfType;        //bitmap id
  
uint32_t   bfSize;        //The size of the BMP file in bytes
  
uint16_t   bfReserved1;
  
uint16_t   bfReserved2;
  
uint32_t   bfOffBits;      
  
//the size of this header, in bytes (40)  
  
uint32_t  biSize;         
  
int32_t  biWidth;          //the bitmap width in pixels (signed integer)
  
int32_t  biHeight;         //the bitmap height in pixels (signed integer)
  
uint16_t  biPlanes;         //the number of color planes (must be 1)
  
uint16_t  biBitCount;       //the number of bits per pixel, which is the color depth of the image. Typical values are 1, 4, 8, 16, 24 and 32. 
  
uint32_t  biCompression;
  
uint32_t  biSizeImage;      //the image size. This is the size of the raw bitmap data; a dummy 0 can be given for BI_RGB bitmaps. 
  
int32_t  biXPelsPerMeter;  //the horizontal resolution of the image
  
int32_t  biYPelsPerMeter;  //the vertical resolution of the image
  
uint32_t  biClrUsed;
  
uint32_t  biClrImportant;
 } 
H_BMP
  
uint8_t Entete_BMP[54];
}
Un;
 
Aide toi, le ciel ou FantasPic t'aidera

dans la serie les mysteres du C
gwion
Expert
Expert
Messages : 1135
Enregistré en : février 2022

#5 Message par gwion » ven. 20 févr. 2026 19:02

C'est là qu'est le souci :

for (j=0;j<6;j++)
{
k=k+j;

Quand j=0 k=48 donc k=48+0 tu pointes l'octet 48
Quand j=1 k=48 (toujours) donc k=48+1 tu pointes l'octet 49
Quand j=2 k=49 donc k = 49+2 = 51 et tu loupes l'octet 50
etc pour les suivants.

Mystère résolu je pense.

dans la serie les mysteres du C
satinas
Expert
Expert
Messages : 1503
Enregistré en : novembre 2015

#6 Message par satinas » ven. 20 févr. 2026 19:49

On y est, bien vu, gwion :-)
Fallait enlever le k=k+1 et mettre dans la boucle k++ au lieu de k = k+j

dans la serie les mysteres du C
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3285
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » ven. 20 févr. 2026 20:40

oops quand on a le nez dans le guidon, on perd de vue l'essentiel

bug avéré !

Merci ! les gars..

:sifflotte: cela prouve que FANTASPIC est encore vivant !
Aide toi, le ciel ou FantasPic t'aidera

dans la serie les mysteres du C
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2950
Enregistré en : juillet 2016
Localisation : Terre

#8 Message par Temps-x » sam. 21 févr. 2026 05:04

Bonjour paulfjujo, et tout le forum,

J'écris actuellement un programme pour visionner un fichier bmp 24 bits en ASM 8-) :-D, mais avant toute chose, je me demandais comment ça
fonctionne cette lecture, j'ai alors entrepris de l'écrire en RapidQ, et ça fonctionne bien.

Je te fais parvenir le programme compilé, et la source. dans ce programme, tu peux lire juste les fichiers BMP non compressés (24 bits)

Après avoir décompressé le zip, tu pourras charger l'image exemple qui se trouve dans le dossier image. Notre célèbre tigre!

Une fois fait, toutes les informations du bmp vont s'afficher, après il te suffit d'appuyer sur le deuxième bouton pour voir apparaître l'image.

Pour la transformation en RGB565, ce n'est pas facile en rapidQ, je le ferai dans la source ASM que je fournirai ici.

Téléchargement : ICI

A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le sam. 21 févr. 2026 12:27, modifié 2 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

dans la serie les mysteres du C
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3285
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » sam. 21 févr. 2026 09:31

bonjour à tous,


à Satinas :

ta solution est effectivement bien plus courte et concise
mais je ne pige pas bien
if (k) CRLF1();
faux que pour k=0 ? sinon vrai dans les autres cas ?
le test k>0 est sous entendu ?
je pensais qu'on ne pouvait faire un test direct que sur une variable boolenne et non sur un entier ...

retesté avec inclusion Union .. OK

Code : Tout sélectionner


 Entete BMP de 54 bytes
0
>   0> 0x42   1> 0x4D   2> 0x46   3> 0xA0   4> 0x00   5> 0x00   6> 0x00   7> 0x00 
1
>   8> 0x00   9> 0x00  10> 0x46  11> 0x00  12> 0x00  13> 0x00  14> 0x38  15> 0x00 
2
>  16> 0x00  17> 0x00  18> 0x80  19> 0x00  20> 0x00  21> 0x00  22> 0x60  23> 0xFF 
3
>  24> 0xFF  25> 0xFF  26> 0x01  27> 0x00  28> 0x10  29> 0x00  30> 0x03  31> 0x00 
4
>  32> 0x00  33> 0x00  34> 0x00  35> 0xA0  36> 0x00  37> 0x00  38> 0x20  39> 0x1C 
5
>  40> 0x00  41> 0x00  42> 0x20  43> 0x1C  44> 0x00  45> 0x00  46> 0x00  47> 0x00 
6
>  48> 0x00  49> 0x00  50> 0x00  51> 0x00  52> 0x00  53> 0x00 

 HEADER type 
: 4D42
 Taille
: 41030
 Headsize 70
 W
=128 x H=-160
 plan
=    1 
  bitsColor
=   16
 ResolH
: 7200 
 ResolV
: 7200


à noter que la valeur Hauteur est negative ..parcours de l'image de bas en haut dans le fichier
remise en positive

------------------------------------------------------------------------------------

à temps X :

test de ton appli rapidQ ..OK

HeaderBmp_Rapidq.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

dans la serie les mysteres du C
satinas
Expert
Expert
Messages : 1503
Enregistré en : novembre 2015

#10 Message par satinas » sam. 21 févr. 2026 09:47

Bonjour,
C'est dans la définition de l'instruction if, elle est non vérifiée si l'expression est nulle, et vérifiée dans tous les autres cas, c'est à dire < 0 ou > 0.
Quand tu écris if (A == B) il évalue l'expression A == B qui donne bien un booléen, mais c'est un cas particulier pour if.

Un jour il y a longtemps j'en ai eu marre de taper des "== 0" ou "!= 0" d'où les lignes peu recommandables cependant correctes :
if (k) au lieu de if (k != 0)
if (!k) au lieu de if (k == 0)
if (!(k%8)) au lieu de if ((k%8) == 0)

J'ai bien sûr demandé à ChatGPT de valider ma réponse, c'est bon :
"Elles ne sont pas « peu recommandables », elles sont juste moins explicites"
Il se permet tout de même de conclure, le rustre :
"La vraie question est : écris-tu pour le compilateur ou pour le prochain humain qui lira ton code ?"
Sous entendu lui il s'en fout, il s'en sortira toujours !


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Majestic-12 [Bot] et 8 invités