message d'erreur en C

Voir le sujet précédent Voir le sujet suivant Aller en bas

message d'erreur en C

Message  bouhmid1 le Lun 29 Déc 2008 - 17:30

bonjour tous le monde
g un probleme dans mon prog borland C .
quand je compile mon programme, il affiche des messages d'erreur comme "Thread stopped Fault:access violation at 0x404a53 write of adress 0xffffffff2"
sinon un autre type de message comme"Can't debug during asynchronous compile"
SVP pouvez me donner solution pour c probleme.
Et merci

bouhmid1

Messages : 2
Date d'inscription : 29/12/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: message d'erreur en C

Message  -ed- le Mar 30 Déc 2008 - 8:59

bouhmid1 a écrit:bonjour tous le monde
g un probleme dans mon prog borland C .
quand je compile mon programme, il affiche des messages d'erreur comme "Thread stopped Fault:access violation at 0x404a53 write of adress 0xffffffff2"
sinon un autre type de message comme"Can't debug during asynchronous compile"
SVP pouvez me donner solution pour c probleme.
Et merci
Impossible de répondre sans voir ton code source.

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: message d'erreur en C

Message  bouhmid1 le Mar 30 Déc 2008 - 12:48

Merci pour ta reponse:
bon, sa se voit que je suis debutant en C, En fait j'ai un programme a faire 'ANAGRAMME', mais j'ai pefere a commencer par des petites fonctions,au niveau 'main' le programme fait appel a la fontion 'lire' une fois et le message d'erreur 'se declenche' SVP, j'espere bien que vous avez une solution probleme
Code:

#include<stdio.h>
// pour tester si les 2 mots sont egaux
int equivalente(char *u, char *v)
{
   char t[100], x[100];
  int i,z,k;
  k=z=0;
  t[0]=*u;
  x[0]=*v;
  for(i=0;u[i]!='\0';i++)
  {
     t[z]=*(u+i);
      i++;
      z++;
  }
      for(i=0;v[i]!='\0';i++)
  {
     x[k]=*(v+i);
      i++;
      k++;
  }
  if (z==k)
     return 1;
      return 0;
}
//pour lire un chaine
void lire (char t[])
{  int i;
   i=0;
  while(t[i]!='\n')
  {
         scanf("%s",t[i]);i++;
  }

}
/*ce programme doit lire 2 chaines de caractere et les tester s'ils sont eguaux ou non*/
void main()
{
int n;
char *u,*v,t[1000],x[1000];
printf("donner la 1er chaine\n");
lire (t);
u=&t[0];
printf("\ndonner la 2eme chaine\n");
lire (x);
v=&x[0];
n=equivalente(u,v);
printf("%d",n);
scanf("%d",&n);
}


Dernière édition par -ed- le Mar 30 Déc 2008 - 14:11, édité 1 fois (Raison : Ajout des balise de code [code][/code]. Merci d'y penser la prochaine fois)

bouhmid1

Messages : 2
Date d'inscription : 29/12/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: message d'erreur en C

Message  -ed- le Mar 30 Déc 2008 - 14:51

bouhmid1 a écrit:Merci pour ta reponse:
bon, sa se voit que je suis debutant en C, En fait j'ai un programme a faire 'ANAGRAMME', mais j'ai pefere a commencer par des petites fonctions,au niveau 'main' le programme fait appel a la fontion 'lire' une fois et le message d'erreur 'se declenche' SVP, j'espere bien que vous avez une solution probleme
Code:

//pour lire un chaine
void lire (char t[])
{  int i;
   i=0;
  while(t[i]!='\n')
  {
         scanf("%s",t[i]);i++;
  }

}
Ce code est extrêmement suspect.
1 - Il provoque ce warning chez moi :
Code:
C:\dev\hello\main.c: In function `lire':
C:\dev\hello\main.c:32: warning: format argument is not a pointer (arg 2)
Tu passes un entier à une fonction qui attend l'adresse d'un char, le comportement est indéfini. Tout peut arriver.

2 - Si tu cherches à écrire une fonction de saisie, il suffit d'utiliser getchar() qui est fait pour ça :
/* pour lire un chaine */
Code:

void lire (char t[])
{
  int i;
  i = 0;
  while (t[i] != '\n')
  {
      t[i] = getchar();
      i++;
  }
}
Mais l'algorithme est faux. en effet, t[0] pourrait très bien valoir '\n' avant même d'entrer dans la boucle, ce qui fait qu'on entrerait pas dans la boucle.

D'autre part, si on est entré dans la boucle, il n'y a quasiment aucune chance d'en sortir, car on teste encore une fois une zone non initialisée de la chaine. (on stocke le caractère lu en [i], puis on teste en [i+1], caer c'est après un i++).

La forme usuelle consiste à placer le getchar() dans le while et à tester immédiatement le résultat :
Code:
/* pour lire un chaine */
void lire (char t[])
{
  int i = 0;
  while ((t[i]= getchar()) != '\n')
  {
      i++;
  }
}
ceci fonctionne mais stocke le \n en fin de chaine. Mais la chaine n'est pas terminée par un 0. On pourrait alors placer un 0 à la place du \n comme ceci :
Code:
/* pour lire un chaine */
void lire (char t[])
{
  int i = 0;
  while ((t[i]= getchar()) != '\n')
  {
      i++;
  }
  t[i] = 0;
}
Mais on tombe alors sur un problème de limitation. Tu as mis des tableaux de 1000 caractères, mais la fonction n'en sait rien, et elle pourrait très bien chercher à stocker 1001, 10000 ou 1000000000000000 caractères dans ce tableau. Il faut donc lui fournir la taille max du tableau, et qu'elle prenne les précautions nécessaires pour ne pas stocker les caractères supplémentaires (en les purgeant, par exemple).

ce qui donne dans un premier temps :

Code:
/* pour lire un chaine */
void lire (char t[], size_t size)
{
  int i = 0;
  while (i < size - 1 && (t[i]= getchar()) != '\n')
  {
      i++;
  }
  t[i] = 0;
}
mais les caractères non lus seront lus sans suspension de l'exécution par l'appel suivant, ce qui est troublant. Je propose donc de placer tout de suite un mécanisme de purge et de signaler en retour que la lecture est incomplète. Pour savoir si la chaine a été tronquée, on vérifie la présence du '\n' :

Code:
/* pour lire un chaine */
int lire (char t[], size_t size)
{
  int err = 0;
  size_t i = 0;

  while (i < size - 1 && (t[i] = getchar ()) != '\n')
  {
      i++;
  }

  if (t[i] != '\n')
  {
      err = 1;
      while (getchar () != '\n')
      {
      }
  }
  t[i] = 0;

  return err;
}
Maintenant, on a une fonction de saisie de chaine fiable.

Je recommande d'ailleurs de baser toute saisie ultérieure sur cette fonction.

Concernant la fonction suivante :
Code:

/* pour tester si les 2 mots sont egaux */
int equivalente (char *u, char *v)
Si le but est de tester l'égalité de 2 chaines, sache que le langage C fourni la fonction sytrcmp(). Si on t'a expressément demander de ne pas l'utiliser, et donc d'écrire toit même une fonction de comparaison, ce que tu as fait est horriblement compliqaué et ne fonctionne pas.

Comparer 2 chaine, c'est extrêmement simple, mais comme toujours, il faut réfléchir avant de coder.

1 - Il faut se souvenir qu'une chaine est une séquence de caractères terminée par un 0.
2 - il suffit de comparer les caractères de chaque chaine 2 à 2. Pour ça, une simple boucle suffit.
3 - il faut déterminer les conditions d'arrêt 'normales' (chaine identiques) et 'erronées' (chaine différentes)

Je te laisse réfléchir à ça et proposer un algorithme qui tient la toute.

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: message d'erreur en C

Message  Contenu sponsorisé Aujourd'hui à 15:25


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum