Aller au contenu

Programme en c


Messages recommandés

Chez moi, ton programme compile avec les options Wall et ansi, par contre il crashe avec une erreur de segmentation.

Un truc bizarre, dans ton main:

int main(void)
{
 char *ligne = "		   + * 1 2 7";
 Expression e = NULL;





 if(AnalyseExpression(&ligne)==NULL)
  {
 fprintf(stderr,"erreur\n");
 return 1;
  }
  e=AnalyseExpression(&ligne);


  return 0;
}

Tu lui fais calculer 2 fois le résultat, c'est un peu dommage non?

Par exemple:

int main(void)
{
 char *ligne = "		   + * 1 2 7";
 Expression e = NULL;





 if((e= AnalyseExpression(&ligne))==NULL)
  {
 fprintf(stderr,"erreur\n");
 return 1;
  }


  return 0;
}

Par ailleurs, j'ai regardé vite fait, et il me semble que la ligne que tu parses est un char * (un string quoi)

Pourquoi tu passes un pointeur vers la string? Tu peux la passer direct, en C une string est un pointeur vers le premier élément, au moins tu n'auras pas à te faire chier avec des char **liste.

Ou alors j'ai pas compris ce que tu fais.

J'ai l'impression que c'est ta fonction espace qui merde, mais je ne comprends pas ce qu'elle fait.

un char ** est un tableau de string (comme lorsque tu récupères les paramètres sur la ligne de commande, char **argv.

Ensuite, tu fais:

void espace(char **ligne)
{
 while(*ligne[0] == ' ') ++(*ligne);
}

T'incrémentes ce qui se trouve à une case mémoire référencé par un char.

T'essaie d'écrire n'importe où en mémoire.

En dehors de ton espace d'adressage, l'OS termine le programme (segfalut). Normal.

Lien vers le commentaire
Partager sur d’autres sites

Oula, je suis fatigué moi.

Tu incrémentes une adresse mémoire (pointeur char *).

Ca, tu peux le faire.

Le problème, c'est que les adresses mémoire ainsi obtenues ne pointent plus vers quelque chose, donc dès que tu vas y accéder, tu vas obtenir un segfault.

En fait, dis-moi ce que tu veux que la fonction espace fasse, et on va voir.

Lien vers le commentaire
Partager sur d’autres sites

un truc dans ce goût là :

char * espace(char * c)
{
char * ret = c;
while( *ret == ' ' && *ret != '\0') ret++;
return ret;
}

après, j'ai pas eu le courrage de lire tout ton code... :craint:

EDIT : au temps pour moi, tu veux que ta fonction espace modifie le pointeur qu'on lui donne. Bon, j'aime pas du tout, mais si tu y tiens... Ce qu'il faut, c'est surtout ne pas oublier de gérer la fin de la chaîne... :mad2:

Lien vers le commentaire
Partager sur d’autres sites

un truc dans ce goût là :

char * espace(char * c)
{
char * ret = c;
while( *ret == ' ' && *ret != '\0') ret++;
return ret;
}

La deuxième condition du while est pas redondante?

si *ret == ' ', alors *ret != '\0' non?

char * espace(char * c)
{
char * ret = c;
while( *ret == ' ') ret++;
return ret;
}

Moi aussi, ça me semblait bizarre de modifier un pointeur, et je me suis un peu embrouillé :chinois:

Lien vers le commentaire
Partager sur d’autres sites

Sauf qu'un espace n'est pas un caractère de fin de chaine.

Donc si le caractère courant est un espace, alors ce n'est pas un caractère de fin de chaine.

Pour un espace : *ret == ' ' est vrai et *ret != '\0' est vrai aussi (vu que ' ' != '\0')

Pour un non espace, *ret == ' ' est faux, fin de l'évaluation.

Seule la première partie sert.

Ça me rappelle les cours de logique en 1ere année, les algo du style

if(a==b) x=b; else x=a;

Le nombre de gens qui ne savaient pas optimiser ça... :mdr2:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...