Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[ Liste Chainées dans une Textbox]

2 réponses
Avatar
gn235301
Bonsoir,
J'ai une liste chainée dans laquelle je génére aléatoirement un polynômes,
je voudrais affiche ce polynome dasn une textbox(editbox)!
Je connais la fonction SetDlgItemText et j'arrive à mettre un texte
comme "salut" dans ma textbox comme ca :
SetDlgItemText(hdlg, IDC_POL1,(LPCSTR)"salut");
hdlg : handle de ma boite de dialogue
IDC_POL1 : id de ma textbox

Le probleme c'est que je n'arrive pas à remplir un pointeur de type char
contenant ma liste chainée. J'ai essayé de faire ca mais ca ne marche pas!

char* Convert(liste l, char* string)
{
int i = 0;
while(l.first){
string[i] += (char*)( l.first->val + "x^(" + l.first->exp + ")" );

l.first = l.first->next;
i++;
}
}

De plus je n'arrive pas vraiment à savoir si c'est réellement un
pointeur de type char qui faut remplir mais le type (LPCSTR) d'apres ce
que j'ai compris c'est soit un const char* soit un char* donc voila si
quelqu'un avait une idée???


ma liste chainée :
typedef struct maillon
{
double val;
int exp;
struct maillon* next,back;
}t_maillon;

typedef struct{
t_maillon* first;
t_maillon* last;
}liste;

2 réponses

Avatar
Pierre Maurette
Bonsoir,
J'ai une liste chainée dans laquelle je génére aléatoirement un polynômes,
je voudrais affiche ce polynome dasn une textbox(editbox)!
Je connais la fonction SetDlgItemText et j'arrive à mettre un texte comme
"salut" dans ma textbox comme ca :
SetDlgItemText(hdlg, IDC_POL1,(LPCSTR)"salut");
hdlg : handle de ma boite de dialogue
IDC_POL1 : id de ma textbox

Le probleme c'est que je n'arrive pas à remplir un pointeur de type char
contenant ma liste chainée. J'ai essayé de faire ca mais ca ne marche pas!
C'est un peu normal ;-)

Pensez à préciser un peu plutôt que "ça ne marche pas". Là, c'est
clair, aucune chance de début de compilation.

char* Convert(liste l, char* string)
{
int i = 0;
while(l.first){
string[i] += (char*)( l.first->val + "x^(" + l.first->exp + ")" );

l.first = l.first->next;
i++;
}
}

De plus je n'arrive pas vraiment à savoir si c'est réellement un pointeur de
type char qui faut remplir mais le type (LPCSTR) d'apres ce que j'ai compris
c'est soit un const char* soit un char* donc voila si quelqu'un avait une
idée???


ma liste chainée :
typedef struct maillon
{
double val;
int exp;
struct maillon* next,back;
}t_maillon;

typedef struct{
t_maillon* first;
t_maillon* last;
}liste;


Vous avez du pain sur la planche, il va vous falloir sérier les
difficultés. Je vais essayer de vous y aider, en restant en C.

Effectivement, ce dont vous avez besoin pour nourrir SetDlgItemText()
est un char*, je ne pense même pas qu'un cast soit nécessaire en C.
Votre "code" de Convert() fait vaguement penser à du C++. Choisissez,
et si c'est du C que vous voulez, vérifiez quel langage vous compilez.
Au moins pour le savoir.
Si c'est du C++ que vous souhaitez, ce n'est pas le bon endroit. Vous
allez bricoler sur une classe chaîne genre basic_string, et au final
vous récupèrerez le LPCSTR ou char* par sa méthode c_str().
Nous sommes donc en C. Il s'agit de fabriquer une chaîne de caractères.
Mais avant, il faudrait être au point avec la liste chaînée. Déjà, un
piégac' classique:
struct maillon* next,back;
next est un struct maillon* mais back est un struct maillon. Solutions:
faire deux lignes (comme dans liste), faire un typedef (voir plus loin)
ou faire ça que j'aime pas:
struct maillon * next, * back;

Nous allons faire un petit bout d'essai (vous pouvez utiliser des
SetDlgItemText() à la place des printf(), mais dans un code minimum):

typedef struct maillon* p_maillon;

typedef struct maillon
{
double val;
int exp;
p_maillon next, back;
}t_maillon;


typedef struct{
p_maillon first;
p_maillon last;
}liste;

int main(void)
{
t_maillon premier = {1.2, 2, NULL, NULL};
t_maillon dernier = {1.5, 3, NULL, NULL};
t_maillon milieu = {1.3, 4, NULL, NULL};
milieu.next = &dernier;
milieu.back = &premier;
premier.next = &milieu;
dernier.back = &milieu;
printf("%fn", milieu.back->val);
printf("%fn", milieu.next->val);
return 0;
}

nota peu important, à sauter: l'initialisation
t_maillon milieu = {1.3, 4, &premier, &dernier};
n'est pas souhaitable. Certains compilos la refusent à juste titre, il
faut donc passer par le NULL. Ou déclarer les éléments de la liste
chaînée globaux, ou static, mais dans la vraie vie, une telle liste a
surtout du sens si ses éléments sont alloués dynamiquement. Peu importe
pour l'instant.

Maintenant que ça fonctionne, il va falloir fabriquer la chaîne, et sur
fclc on s'arrêtera là. Regardez le fil très récent "concaténer des
"phrases" dans un char*".

En C, il faudra être capable d'estimer la taille maximum de la chaîne.
Disons 1000, et conformément aux règles de style, utilisons un #define:
#define TAILLE 1000

Je vous propose:

const char* st1 = "x^(";
const char* st2 = ")";

char* Convert(liste l, char* chaine)
{
int tempo;
int i = 0;
p_maillon pm = NULL;
if(l.first == NULL || l.last == NULL) return NULL;
pm = l.first;
do{
tempo = snprintf(chaine + i, TAILLE - i, "%f %s %d %s ", pm->val,
st1, pm->exp, st2);
if(tempo < 0 || tempo >= (TAILLE - i))
{
fprintf(stderr, "Erreur (tableau trop petit ?)");
return NULL;
}
else
{
if(pm->next != NULL)
{
i += tempo;
pm = pm->next;
}
else
{
return chaine;
}
}
}while(1);
}

Les deux const char* sont là pour se parer d'un compilateur idiot,
normalement ils optimisent tous les chaînes constantes. Enfin, il me
semble.
J'ai utilisé des return multiples. C'est paraît-il pas bien. A vous de
voir.
On pourrait ajouter de la tuyauterie pour connaître la taille de la
chaîne fabriquée et surtout la taille minimum du tableau.
La chaîne ne me semble pas correspondre exactement à ce que vous
souhaitez, mais je n'ai pas l'énoncé de votre exercice ;-)

Code de test:

int main(void)
{
char chaine[TAILLE];
liste liste1 = {NULL, NULL};
t_maillon premier = {1.2, 2, NULL, NULL};
t_maillon dernier = {1.5, 3, NULL, NULL};
t_maillon milieu = {1.3, 4, NULL, NULL};
milieu.next = &dernier;
milieu.back = &premier;
premier.next = &milieu;
dernier.back = &milieu;
liste1.first = &premier;
liste1.last = &dernier;

printf("%sn", Convert(liste1, chaine));

return 0;
}

Dans ce code, je suppose que printf("%s", NULL) ne crashe pas. Chez
moi, ça affiche toujours <null> ou NULL, mais je ne sais pas ce que dit
la norme. puts() planterait ...

--
Pierre Maurette

Avatar
gn235301

Bonsoir,
J'ai une liste chainée dans laquelle je génére aléatoirement un
polynômes,
je voudrais affiche ce polynome dasn une textbox(editbox)!
Je connais la fonction SetDlgItemText et j'arrive à mettre un texte
comme "salut" dans ma textbox comme ca :
SetDlgItemText(hdlg, IDC_POL1,(LPCSTR)"salut");
hdlg : handle de ma boite de dialogue
IDC_POL1 : id de ma textbox

Le probleme c'est que je n'arrive pas à remplir un pointeur de type char
contenant ma liste chainée. J'ai essayé de faire ca mais ca ne marche
pas!


C'est un peu normal ;-)
Pensez à préciser un peu plutôt que "ça ne marche pas". Là, c'est clair,
aucune chance de début de compilation.

char* Convert(liste l, char* string)
{
int i = 0;
while(l.first){
string[i] += (char*)( l.first->val + "x^(" + l.first->exp + ")" );

l.first = l.first->next;
i++;
}
}

De plus je n'arrive pas vraiment à savoir si c'est réellement un
pointeur de type char qui faut remplir mais le type (LPCSTR) d'apres
ce que j'ai compris c'est soit un const char* soit un char* donc voila
si quelqu'un avait une idée???


ma liste chainée :
typedef struct maillon
{
double val;
int exp;
struct maillon* next,back;
}t_maillon;

typedef struct{
t_maillon* first;
t_maillon* last;
}liste;



Vous avez du pain sur la planche, il va vous falloir sérier les
difficultés. Je vais essayer de vous y aider, en restant en C.

Effectivement, ce dont vous avez besoin pour nourrir SetDlgItemText()
est un char*, je ne pense même pas qu'un cast soit nécessaire en C.
Votre "code" de Convert() fait vaguement penser à du C++. Choisissez, et
si c'est du C que vous voulez, vérifiez quel langage vous compilez. Au
moins pour le savoir.
Si c'est du C++ que vous souhaitez, ce n'est pas le bon endroit. Vous
allez bricoler sur une classe chaîne genre basic_string, et au final
vous récupèrerez le LPCSTR ou char* par sa méthode c_str().
Nous sommes donc en C. Il s'agit de fabriquer une chaîne de caractères.
Mais avant, il faudrait être au point avec la liste chaînée. Déjà, un
piégac' classique:
struct maillon* next,back;
next est un struct maillon* mais back est un struct maillon. Solutions:
faire deux lignes (comme dans liste), faire un typedef (voir plus loin)
ou faire ça que j'aime pas:
struct maillon * next, * back;

Nous allons faire un petit bout d'essai (vous pouvez utiliser des
SetDlgItemText() à la place des printf(), mais dans un code minimum):

typedef struct maillon* p_maillon;

typedef struct maillon
{
double val;
int exp;
p_maillon next, back;
}t_maillon;


typedef struct{
p_maillon first;
p_maillon last;
}liste;

int main(void)
{
t_maillon premier = {1.2, 2, NULL, NULL};
t_maillon dernier = {1.5, 3, NULL, NULL};
t_maillon milieu = {1.3, 4, NULL, NULL};
milieu.next = &dernier;
milieu.back = &premier;
premier.next = &milieu;
dernier.back = &milieu;
printf("%fn", milieu.back->val);
printf("%fn", milieu.next->val);
return 0;
}

nota peu important, à sauter: l'initialisation
t_maillon milieu = {1.3, 4, &premier, &dernier};
n'est pas souhaitable. Certains compilos la refusent à juste titre, il
faut donc passer par le NULL. Ou déclarer les éléments de la liste
chaînée globaux, ou static, mais dans la vraie vie, une telle liste a
surtout du sens si ses éléments sont alloués dynamiquement. Peu importe
pour l'instant.

Maintenant que ça fonctionne, il va falloir fabriquer la chaîne, et sur
fclc on s'arrêtera là. Regardez le fil très récent "concaténer des
"phrases" dans un char*".

En C, il faudra être capable d'estimer la taille maximum de la chaîne.
Disons 1000, et conformément aux règles de style, utilisons un #define:
#define TAILLE 1000

Je vous propose:

const char* st1 = "x^(";
const char* st2 = ")";

char* Convert(liste l, char* chaine)
{
int tempo;
int i = 0;
p_maillon pm = NULL;
if(l.first == NULL || l.last == NULL) return NULL;
pm = l.first;
do{
tempo = snprintf(chaine + i, TAILLE - i, "%f %s %d %s ",
pm->val, st1, pm->exp, st2);
if(tempo < 0 || tempo >= (TAILLE - i))
{
fprintf(stderr, "Erreur (tableau trop petit ?)");
return NULL;
}
else
{
if(pm->next != NULL)
{
i += tempo;
pm = pm->next;
}
else
{
return chaine;
}
}
}while(1);
}

Les deux const char* sont là pour se parer d'un compilateur idiot,
normalement ils optimisent tous les chaînes constantes. Enfin, il me
semble.
J'ai utilisé des return multiples. C'est paraît-il pas bien. A vous de
voir.
On pourrait ajouter de la tuyauterie pour connaître la taille de la
chaîne fabriquée et surtout la taille minimum du tableau.
La chaîne ne me semble pas correspondre exactement à ce que vous
souhaitez, mais je n'ai pas l'énoncé de votre exercice ;-)

Code de test:

int main(void)
{
char chaine[TAILLE];
liste liste1 = {NULL, NULL};
t_maillon premier = {1.2, 2, NULL, NULL};
t_maillon dernier = {1.5, 3, NULL, NULL};
t_maillon milieu = {1.3, 4, NULL, NULL};
milieu.next = &dernier;
milieu.back = &premier;
premier.next = &milieu;
dernier.back = &milieu;
liste1.first = &premier;
liste1.last = &dernier;

printf("%sn", Convert(liste1, chaine));

return 0;
}

Dans ce code, je suppose que printf("%s", NULL) ne crashe pas. Chez moi,
ça affiche toujours <null> ou NULL, mais je ne sais pas ce que dit la
norme. puts() planterait ...

Merci à toi pour ton aide, je ne connaissais pas la fonction snprintf,

grâce à cette fonction j'ai pu sans aucun problèmes créer ma chaine de
caractère.

Pour la liste chainée ne t'inquiéte pas je n'avais pas fait l'erreur
dans mon programme c'est sur le moment j'ai cru que ca économiserais de
la place sur le message. Désolé, j'ai été con.

Maintenant j'ai d'autre problèmes, je vai sy travailler! Merci pour ton
aide!!