Bonsoir,

Je vous dis tout de suite, je suis fatigué, et je n'ai plus l'esprit très clair...

Voici mon soucis: j'ai fait une librairie qui inclut la structure suivante...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
struct s_RGB
{
  unsigned short Red;
  unsigned short Green;
  unsigned short Blue;
  bool  bold;
  unsigned short alpha;  // facilite la gestion de la transparence en SDL2 
};
Ce qui est assez étonnant c'est que la valeur de "bold" est toujours 0, que je mette true ou 1 :{

...dans un programme je fais ceci:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void ShowMe(void *ItsMe)
{
	t_Ennemy *tmp=(t_Ennemy*)ItsMe;
	switch(tmp->Defeats)
	{
		case 2:		setForegroundColor((struct s_RGB){170,255,0,true,0});
							break;
		case 3:   setForegroundColor((struct s_RGB){85,255,255,true,0});
							break;
		case 4:		setForegroundColor((struct s_RGB){255,255,0,true,0});
							break;
		case 5:		setForegroundColor((struct s_RGB){255,151,82,true,0});
							break;
		case 6:		setForegroundColor((struct s_RGB){235,133,49,true,0});
							break;
		default:	setForegroundColor((struct s_RGB){255,255,255,false,0});
							break;
 
	}
	wprintf(L"\t%s [%02d]\n",tmp->pName,tmp->Defeats);
	setForegroundColor((struct s_RGB){255,255,255,false,0});
}
...cette fonction est appelée dans une librairie comme ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void lc_showList(ListeChainee *pListe)
{
	if(pListe==NULL) return;
	if(pListe->pHead!=NULL)
	{
		lc_Datas *lc_parcours=pListe->pHead;
  
		while(lc_parcours!=NULL)
		{
			if(lc_parcours->pDisplay!=NULL) lc_parcours->pDisplay(lc_parcours->value);
			
			lc_parcours=lc_parcours->pNext;
			fflush(stdout);
		}
	}
}
...dans mon programme je mets tout en place ici...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
                        if(found==-1) 
			{
				unsigned short us_ID=lc_insert((void*)Ennemi,ll_Ennemis,cssmuserdef,sizeof(t_Ennemy));
				lc_setDisplayByID(ll_Ennemis,us_ID,ShowMe);
			}
... lc_setDisplayByID() est la fonction qui permet de spécifier quelle sera la fonction pour afficher l'élément de la liste chaînée si besoin est...

Dans la librairie j'ai placé des instructions de "debug"...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
void setForegroundColor(struct s_RGB color)
{
	wprintf(L"[%s] DEBUG --> %d;%d;%d %d (%d)\n",__func__,color.Red,color.Green,color.Blue,color.bold,color.alpha);
 
	char *couleurAvantPlan=getRGBString(color);
	wprintf(L"%s",couleurAvantPlan);
	free(couleurAvantPlan);
}
...et aussi...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
char* getRGBString(struct s_RGB target)
{
	wprintf(L"\n[DEBUG] %d;%d;%d %d (%d)\n",target.Red,target.Green,target.Blue,target.bold,target.alpha);
 
	char *pTmp=(char*)malloc(sizeof(char)*25); // \x1b[38;2;74;213;237;1m
	memset(pTmp,0,25);
 
	sprintf(pTmp,"\x1b[38;2;%d;%d;%d%sm",target.Red,target.Green,target.Blue,target.bold?";1":"");
	return pTmp;
}
...quand j'exécute mon programme j'ai TOUJOURS 0 dans le champs "bold" :{

J'ai fait un petit programme de test qui n'utilise pas la librairie...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdbool.h>
 
struct s_RGB
{
    short R;
    short G;
    short B;
    bool bold;
    short alpha;
};
 
void testRGB(struct s_RGB);
 
void main(void) // PAS ANSI mais je m'en fous
{
    struct s_RGB test=(struct s_RGB){170,255,0,true,0};
    printf("%d,%d,%d %d (%d)\n",test.R,test.G,test.B,test.bold,test.alpha);
    testRGB((struct s_RGB){170,255,0,true,0});
}
 
void testRGB(struct s_RGB target)
{
    printf("%s %d,%d,%d %d (%d)\n",__func__,target.R,target.G,target.B,target.bold,target.alpha);
}
...là ça fonctionne, bold a une valeur à 1 (true)...

Le même programme avec la librairie donne 1 au champs "bold" :]

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <uep_wide.h>
 
void testRGB(struct s_RGB);
 
void main(void)
{
    struct s_RGB test=(struct s_RGB){170,255,0,true,0};
    printf("%d,%d,%d %d (%d)\n",test.Red,test.Green,test.Blue,test.bold,test.alpha);
    testRGB((struct s_RGB){170,255,0,true,0});
}
 
void testRGB(struct s_RGB target)
{
    printf("%s %d,%d,%d %d (%d)\n",__func__,target.Red,target.Green,target.Blue,target.bold,target.alpha);
}
sirius:/exemples/structures # gcc debugRGBwithuepwide.c `pkg-config uepwide --cflags` `pkg-config uepwide --libs` -o debugRGBwithuepwide
sirius:/exemples/structures # ./debugRGBwithuepwide
170,255,0 1 (0)
testRGB 170,255,0 1 (0)
sirius:/exemples/structures #

Qu'est-ce que j'ai mal fait dans mon programme alors ???
Je sais pas super bien utiliser gdb avec un programme qui prends des paramètres en ligne de commande sinon je ferais bien un "watch" pour voir si -- comme par hasard -- je ne me taperais pas une saloperie d'effet de bord...

[edit added png]
Nom : bug202201_000.png
Affichages : 310
Taille : 56,8 Ko
[edit]
Là je sais pas...