IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

problème d'erreur au run


Sujet :

C

  1. #21
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    Il faut absolument tester dans Calcul le retour de malloc, les demandes d'allocation vont devenir très copieuses. Par exemple pour n=50, tu dois arriver à plus d'un million de caractères dans la chaîne sauf erreur. Alors pour 100....
    Je suis d'accord avec toi que les retour de malloc sont très long mais je dois parvenir jusqu'à la 100ème ligne et l'afficher!!

  2. #22
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par zinjulio Voir le message
    Pou l'erreur, elle est peut être du à un e mauvaise configuration de labWindows CVI! Il me semble par mégarde avoir changer une option mais je ne sais pas comment y remédier! Le fait étant que cela marque tout le temps l'erreur!
    Il y a peut être véritablement une chaine qui déborde dans ton code... Je rappelle que dans tableau de char de dimension N, le 0 final doit être au maximum en [N-1]...
    Je n'ai pas très bien saisi ta phrase! Tu parles des pointeurs?
    Je parle du texte que tu affiches qui fait croire qu'il faut entrer des caractères...

    Je parle aussi du mauvais usage de scanf(). Il faut tester la valeur retournée (voir sa signification sens dans la doc) et agir en conséquence en cas d'erreur. Par exemple : purger le flux entrant avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
     
    void purge(void)
    {
       int c;
     
       while ((c = getchar()) != '\n' && c != EOF)
       {
       }
    }

  3. #23
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    Un autre problème j'ai bien rajouté la ligne suivante :
    Maintenant le programme a l'air de bien se compiler et au run malgré le getchar placé après le printf, ma fenêtre se ferme automatiquement! ai-je bien écrit le getchar? ou faut-il mettre autre chose?

  4. #24
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Regarde un peu ce qui se passe pour les valeurs <100
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       for (ii = 1; ii <= n; ii++)
       {
          TAB[ii] = Calcul (TAB[ii - 1]);
          printf (" %d %d %s\n", ii, strlen(TAB[ii]), TAB[ii]);  
       }
    Qu'est ce que tu obtiens pour les petites valeurs de ii ?

  5. #25
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    Pour le mauvaise usage du scanf, je viens de lire la FAQ, j'ai compris pourquoi il est déconseillé de l'utiliser! Mais le gets() et le fgets() je ne l'ai jamais utilisé et j'ai du mal à comprendre avec la FAQ! Peux tu m'expliquer comment les utiliser avec le cas présent afin que j'ai une vue assez claire de ce qu'il faut faire?

  6. #26
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par zinjulio Voir le message
    Pour le mauvaise usage du scanf, je viens de lire la FAQ, j'ai compris pourquoi il est déconseillé de l'utiliser! Mais le gets() et le fgets() je ne l'ai jamais utilisé et j'ai du mal à comprendre avec la FAQ! Peux tu m'expliquer comment les utiliser avec le cas présent afin que j'ai une vue assez claire de ce qu'il faut faire?
    Déjà, on utilise pas non plus gets() qui est un bug.

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    Tu as besoin de fgets() qui permet de saisir une ligne de texte. Tu dois commencer par lire la doc, par exemple dans http://man.developpez.com

    Ensuite il faut faire quelques traitements de nettoyage. Il existe une fonction 'fclean()' écrite par la communauté de DvP et d'autres forums, qui circule sur ce forum. Une simple recherche te permettras de trouver le code source qui est très simple.

    Enfin, dans certains cas (saisies numériques) il te faudra effectuer une conversion chaine -> numérique avec strtol(), strtoul() ou strtod(). Là encore, lire la doc. On peut aussi utiliser sscanf(). Bien lire la doc, qui renvoie probablement à fscanf())...

    Il faut apprendre à se débrouiller avec les ressources. Fait de ton mieux ert poste le code si tu as un problème. Je conseille d'expérimenter les fonctions nouvelles à part dans un petit code d'essai...

  7. #27
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    Avant tout essai je voulais vous mettre mon programme qui me semble être fini!! Il ne pose pas de bug du moins pour les petites lignes!!! C'est lorsque l'on demande une grand nombre de ligne supplémentaire qu'il commence à être long!! Mais à partir d'un certain nombre de lignes, l'écran ne m'affiche plus le début du résultat! Est ce juste que il n'y a pas assez de places sur l'écran ou est ce un défault de mon programme?
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    char *Calcul(char *LigneIn);
     
    char *Calcul (char *LigneIn)
    {
       char *Retour;                
       int i, K;
       i = 0;
       K = 0;
       Retour = malloc (2 * strlen (LigneIn) + 1);
       while (LigneIn[i] != 0)
       {
          if (LigneIn[i] != LigneIn[i + 1])
          {
             Retour[K] = '1';
             Retour[K + 1] = LigneIn[i];
             K = K + 2;
             i++;
          }
          else if (LigneIn[i] != LigneIn[i + 2])
          {
             Retour[K] = '2';
             Retour[K + 1] = LigneIn[i];
             K = K + 2;
             i = i + 2;
          }
          else
          {
             Retour[K] = '3';
             Retour[K + 1] = LigneIn[i];
             K = K + 2;
             i = i + 3;
          }
       }
       Retour[K] = 0;
       return Retour;
    }
     
    int main (void)
    #define NB_CHAINE 103
    {
       char *TAB[NB_CHAINE];        
       int ii, n, c;
       printf ("Voici la suite de logique de nombre\n1\n11\n21\n1211\n111221\nDonnez le nombre de lignes supplémenataires que vous voulez dévoiler : ");
       scanf ("%d", &n);
       while (n < 0 || n > 99)
       {
          printf ("\nErreur de saisie, recommencez :");
          scanf ("%d", &n);
       }
     
       TAB[0] = malloc (2);
       strcpy (TAB[0], "1");
     
       for (ii = 1; ii <= n+4; ii++)
       {
          TAB[ii] = Calcul (TAB[ii-1]);
       }
       for (ii = 0; ii <= n+4; ii++) printf ("\n%s", TAB[ii]);
       getchar();
       for (ii = 0; ii <= n+4 ; ii++)
          free (TAB[ii]);
       return 0;
    }

  8. #28
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Tu refuses de tester le retour du malloc, tu auras des surprises!
    La taille des lignes peut être extrèmement importante. Si je n'ai pas d'erreur,
    pour n = 40 il y a 82 350 caractères
    pour n = 50 : 1 166 642 caractères
    pour n= 70 : 234 241 786 caractères
    pour n = 74 : 676 414 798 caractères

    pour n = 100 ???


    Tu as intérêt à avoir un paquet de mémoire vive sinon, tu ne t'en sort plus en temps de calcul et à un moment donné tu n'auras plus de mémoire du tout!

  9. #29
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    Je sais ce que tu veux dire, j'ai testé sur des petites valeurs et ça devient très vite lourd!!! Mais le fait est que je dois résoudre ce problème et que le résultat que je dois fournir correspond à ce que j'obtient!!

  10. #30
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    J'aurai une dernière question avant de vous laisser tranquille!
    Une chaîne de caractère peut occuper un espace mémoire de 64 Mo donc 64 millions de caractères et j'aimerais savoir à quelle ligne cette limite est dépasser! Pouvez m'aide s'il vous plait? car j'ai vu que vous avez déja effectué cela dans les réponses précédentes et j'aimerais savoir comment vous avez fait!

  11. #31
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    Citation Envoyé par zinjulio Voir le message
    J'aurai une dernière question avant de vous laisser tranquille!
    Tu ne déranges personne, mais on est là pour t'aider, pas pour faire ton travail.

    Citation Envoyé par zinjulio Voir le message
    .... et j'aimerais savoir comment vous avez fait!
    Tout simplement en faisant l'exercice, l'autre jour j'avais 5 minutes a perdre !.

    Pour la fonction de calcul, c'est a toi de la trouver, tu as toutes les indications pour la faire dans ce post.

    Pour ce qui est de l'affichage des longueurs générées, le main suivant qui travaille avec deux pointeurs permet d'afficher les longueurs des chaines générées.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    int main(void)
    {
    char *In;
    char *Out;
    int ii;
     
     
    // alloue et initialise la premiere chaine
    In=malloc(2);
    if(In!=NULL)
      {
      strcpy(In,"1");
      ii=1;
      while((ii<NB_CHAINES)&&(In!=NULL))
        {
        // Appelle la fonction de creation d'une chaine a partir de la precedente
        Out=AnalyseLigne(In);  
        if(Out!=NULL)
          {
          // Affiche l'index et la longueur de la chaine générée
          printf("ii=%d lng=%d\n",ii,strlen(Out));
          // Libére la mémoire de la chaine d'entrée
          free(In);
          // Positionne le pointeur sur la chaine générée en vue du prochain appel
          In=Out;
          }
        else
          {
          printf("ii=%d Impossible d'allouer la mémoire\n",ii);
          }  
        ii++;
        }
      free(In);
      In=NULL;
      }
    return(0);
    }
    Bonne continuation.

Discussions similaires

  1. [EasyPHP] Problème EasyPHP erreur 404
    Par caledonie dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 13/12/2006, 18h00
  2. Réponses: 2
    Dernier message: 22/05/2006, 10h59
  3. Problème ListBox 'Erreur 2176'
    Par emeraudes dans le forum IHM
    Réponses: 5
    Dernier message: 19/05/2006, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo