Ce forum est maintenant fermé, seule cette archive statique reste consultable.
  FORUM Rue-Montgallet.com
  Programmation
  C - C++

  je comprend pas ou je me plante

Bas de page
Auteur Sujet :

je comprend pas ou je me plante

n°19228
adr1
Profil : Jeune recrue
Posté le 04-04-2008 à 21:30:27  
 

oui c'est un peu gros je sais mais je remerci d'autant plus celui qui prendra le temps de m'expliquer ou je me plante ^^.
en gros ce programme doit organiser dans un arbre une expression de la forme 4+8*6-5+7*9 en respectant les prioritées.
ce que j'ais écris est sencé créer l'arbre et l'afficher. il ne gere (il ne compile pas donc le mot est un peu exagéré^^) que les signes * et / pour l'instant pas les - et +.
 
quand je compile: j'ai ces erreurs en boucle  
 
calc.c: In function 'arbre':
calc.c:43: error: 'noeud' has no member named 'valD'
calc.c:47: error: 'noeud' has no member named 'valD'
calc.c:47: error: 'noeud' has no member named 'valG'
calc.c:60: error: 'noeud' has no member named 'filsG'
calc.c:61: error: 'noeud' has no member named 'filsD'
 
 
 
#include<stdio.h>
#include<string.h>
 
typedef struct{  
 void*  noeud;
 int num;
 noeud  filsG; /** je ne sais pas comment déclarer mes fils gauche et droit. */
 noeud  filsD;  
 float valG;
 float valD;
} noeud;
 
noeud arbre(void *chaine);
void afficher_arbre ( noeud root);
 
 
int main(){
 char chaine[2048];
 printf("coucou, entre ton calcul.\n" );
 scanf("%s",chaine);
 afficher_arbre(arbre(chaine));
 return 0;
}
 
noeud  arbre(void *chaine){
 static int cpt=1;
 int lect=0;
 char *chaineG;
 char *chaineD;
 char *cs='\0' ;
 char *ns='\0' ;
 noeud root;
 root.num = cpt;
 cpt++;
 
 lect=sscanf(chaine,"%[* / + - ]%[* / + - ]",cs,ns);
 
/**      pour sortir du récursif     pblm    ***************************/
 if (lect==1){
 float a,b;
 sscanf(chaine,"%f%[+-*/]%f%[+-*/]",&a,cs,&b,ns);
  if(ns=='\0')
  root.valD=b;
 return root;
 }
 else if (lect==0){
 sscanf(chaine,"%f%*[+-*/]%f",&root.valD,&root.valG);
 return root;
 }
/** **************************************************************************/
 
 
/**     gestion des prioritées  entre le signe courant(cs) et le suivant(cn)   ***********/
 /** cas 1 ***********/
 else if ((strcmp(cs,"*\0" )==0 ||strcmp(cs,"/\0" )==0 )&&(strcmp(ns,"*\0" )==0 ||strcmp(ns,"/\0" )==0 )){
  chaineD=(cs+1);
  strncpy(chaineG,chaine,strlen(chaine)-strlen(chaineD));
  strcpy(root.noeud, cs);
  root.filsG=(arbre(chaineG));
  root.filsD=(arbre(chaineD));
  return root;
  }
 /** cas 2 ***********/
 /** cas 3 ***********/
 /** cas 4 ***********/
 /**  fin des cas ***********/
return root;
}
 
void afficher_arbre ( noeud root){
 if (root.filsG!=NULL && root.filsD!=NULL){
 afficher_arbre ( root.filsG );
 printf("%s",root.noeud);
 afficher_arbre ( root.filsD );
 }
 else if (root.filsG!=NULL && root.filsD==NULL){
 afficher_arbre ( root.filsG );
 printf("%s",root.noeud);
 afficher_arbre ( root.valD );
 }
 else if (root.filsG==NULL && root.filsD==NULL){
 afficher_arbre ( root.valG );
 printf("%s",root.noeud);
 afficher_arbre ( root.valD );
 }
}
 

mood
Pub
Posté le 04-04-2008 à 21:30:27  
 

n°19231
adr1
Profil : Jeune recrue
Posté le 04-04-2008 à 21:46:31  
 

je comprend pas pourquoi il ne fais pas le liens entre les variable de ma structure et celles dans mon programme qui sont les meme.

n°19233
cmoila
Profil : Membre
Posté le 05-04-2008 à 15:58:19  
 

T'as écrit ca :
 
typedef struct{  
 void*  noeud;
 int num;
 noeud  filsG; /** je ne sais pas comment déclarer mes fils gauche et droit. */
 noeud  filsD;  
 float valG;
 float valD;
} noeud;  
 
 
Le pb c'est que tu fais dans ta définition de structure référence à elle même alors que tu ne lui as pas donné de nom. (C'est un pb qui vient de l'histoire du C). Quand tu fais "typedef struct ..." tu fais 2 commandes C imbriquées l'une dans l'autre:
 
struct machin { ... };
typedef struct machin  nom_de type_du_machin;
 
Donc tu dois donner un nom a la structure "machin" pour pouvoir y faire référence avant d'avoir fait le typedef qui se fait à l'étape suivante.
 
typedef struct _noeud {  
     void*      noeud;                             // quelle HORREUR ce void* !  
     int          num;
     struct _noeud    filsG, filsD;  
     float                valG, valD;
} noeud;
 
 
Edit:
Malicieusement je n'avais traité que l'erreur de syntaxe en laissant de coté le gros du problème posé par cette structure en espérant que tu le vois. Mais manifestement mon astuce est tombé à l'eau.


Message édité par cmoila le 07-04-2008 à 13:18:54
  FORUM Rue-Montgallet.com
  Programmation
  C - C++

  je comprend pas ou je me plante

© 2000-2024 Forum.rue-montgallet.com - Tous droits réservés