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 :

Erreur de parcours de tests, pas d'affichage (printf)


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Erreur de parcours de tests, pas d'affichage (printf)
    Bonjour,

    Etant actuellement pressé sur un projet (d'ou le code, certes un peu bourrin), je viens faire appel à vos lumière car complètement perdu sur un bug que je ne comprends pas.

    La partie de code qui me pose soucis est une sorte de parseur. Je lis dans un fichier une chaine de caractère, la convertit en une opération (cinq plus cinq devient 5 + 5). Cette partie fonctionne correctement, et je ferme ensuite le fichier. Puis vient le passage du calcule après conversion.

    Voici le segment de code concerné :
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    printf("\nChainePurgeeFINALE = %sFIN",chainePurgee);
    fflush(stdout);
            //Fin du fichier chainePurgee contient la chaine ex: moins un plus moins deux
            //plus longue type de chaine de base => prevoir les signes !
            while(c!='\0')
            {
    printf("\nDEBUT BOUCLE\n");
                //Composer un mot jusqua l'espace
                c=chainePurgee[i];
    printf("\nCHAR TRAITE : %c\n",c);
                i++;
                if(c != ' ')
                {
                    x=whatIsIt(c);
    printf("\nINT TRAITE : %d\n",x);
                    if(x < 0 && ((flagOpA==0 && flagOpeator==0) || (flagOpeator==1 && flagOpB==0))) //Si x detecte comme operande
                    {
                        if(x == -1)
                        {
                            fact=1;
                        }
                        else
                        {
                            if(x == -2)
                            {
                                fact=-1;
                            }
                            else
                            {
                                printf("\n**ERREUR** Operation mal placée ou erreur de traitement.");
                                exit(1);
                            }
     
                        }
                        if(flagOpA==0)
                                flagOpA=1;
                        else
                            if(flagOpA==1)
                                flagOpB=1;
                    }
                    if(x < 0 && (flagA==1 && flagOpeator==0))//x detecte comme operation
                    {
                        operation=x;
    printf("\nOPERATION VOULUE : %d\n",operation);
                        switch(operation)
                        {
                            case -1: operationChar='+';
                                    break;
                            case -2: operationChar='-';
                                    break;
                            case -3: operationChar='*';
                                    break;
                            case -4: operationChar='/';
                                    break;
                            default : printf("\n**ERREUR** L'operation n'est pas un symbole accepté.");
                                        exit(1);
                        }
                    }
                    else//x detecte comme chiffre, on prend en compte le facteur issue du signe de l'operande
                    {
                        if(flagA==0)
                        {
                            operandeA=fact*x;
                            flagA=1;
                            fact=1;
                        }
                        else
                        {
                            if(flagB==0)
                            {
                                operandeB=fact*x;
                                flagB=1;
                                fact=1;
                            }
                            else
                            {
                                printf("\n**ERREUR** Chiffre mal placé ou erreur de traitement.");
                            }
                        }
                    }
                }
     
                //On passe l'espace
                i++;
                j=0;
            }
            //Les operandes, operations sont en place, on lance le calcul
            resultat=calcul(operandeA, operation, operandeB, 0 , 0);
    Le soucis est que mon programme saute dès le premier passage à l'erreur "L'operation n'est pas un symbole accepté". Soit, soucis de test donc, je passe par des printf pour comprendre le cas que je n'ai pas pris en compte. Sauf que, les printf ne marchent pas ! Aucun de ceux affichés dans le code (en dehors de Chaine finale), ne passe. J'ai tenté par ajout de "\n" à la fin de chaque printf, par ajout de fflsuh(stdout), mais rien n'y fait ! pas une seule valeur ne s'affiche.

    Cela m'empêchant de débuguer ce fouillis temporaire, quelqu'un aurait il une idée sur ce qui cloche ?

    chainePurgee est un tableau de 12 caractère max, déclarée en statique. Le reste est principalement constitué de flags pour faire office de marqueurs. La fonction appelée ne fait qu'une conversion de type atoi(), et interprête les symboles d'opération.

    Merci !

  2. #2
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    Le moyen le plus simple pour tracer ton erreur serait à mon avis de lancer ton programme dans un debuger ...
    Éventuellement de rajouter des flush après chaque printf. Je suppose que la variable i est correctement initialisée ?

  3. #3
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour
    Citation Envoyé par AeldredOni Voir le message
    Bonjour,
    La partie de code qui me pose soucis est une sorte de parseur. Je lis dans un fichier une chaine de caractère, la convertit en une opération (cinq plus cinq devient 5 + 5). Cette partie fonctionne correctement,
    Utiliser des chaînes de caractères pour effectuer des opérations mathématiques n'est pas vraiment la bonne solution et de plus cela demande des notions d'algorithme avancés notamment dans la reconnaissance des chiffres/nombres grâce à leur référence en chaîne de caractère et en ma connaissance, il existe aucun algorithme de ce genre mais par contre, il est tout à fait possible de faire '5' = 5 contrairement à soixante-dix mille quatre cents qui peut être égale à 7010004100 ou 70 1000 4 100 voir autre.
    Je serais tout de même curieux de comprendre le fonctionnement de ce parseur particulièrement l'algorithme implémenté qui te permet de réaliser une référence exacte sans erreur.


    Citation Envoyé par AeldredOni Voir le message
    Le soucis est que mon programme saute dès le premier passage à l'erreur "L'operation n'est pas un symbole accepté". Soit, soucis de test donc, je passe par des printf pour comprendre le cas que je n'ai pas pris en compte. Sauf que, les printf ne marchent pas ! Aucun de ceux affichés dans le code (en dehors de Chaine finale), ne passe. J'ai tenté par ajout de "\n" à la fin de chaque printf, par ajout de fflsuh(stdout), mais rien n'y fait ! pas une seule valeur ne s'affiche.

    Cela m'empêchant de débuguer ce fouillis temporaire, quelqu'un aurait il une idée sur ce qui cloche ?

    chainePurgee est un tableau de 12 caractère max, déclarée en statique. Le reste est principalement constitué de flags pour faire office de marqueurs. La fonction appelée ne fait qu'une conversion de type atoi(), et interprête les symboles d'opération.
    Merci !
    Finalement est-ce des chaînes du genre "510" atoi() = 510 ou cinq cent dix atoi() = 510 ?
    dans le cas où c'est du '5' = 5, cela veut clairement dire que tu n'as pas un parseur mais plutôt une fonction qui convertit le caractère définit '5' à l'entier correspondant donc 5.

    Quant à ton erreur, il me semble que cela vienne de l'implémentation de ton algorithme et vue la façon dont tu mentionne-les fait je pencherais pour une mauvaise implémentation d'une variante de l'algorithme NPI ( calculatrice polonaise inverse) mais sans plus de détail je ne peux le certifier.
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

Discussions similaires

  1. [Débutant] Erreur : pas d'affichage
    Par kryptong dans le forum Développement Web avec .NET
    Réponses: 4
    Dernier message: 20/12/2012, 15h27
  2. [1.x] Erreur 404 en production mais pas en test
    Par faycalato dans le forum Symfony
    Réponses: 12
    Dernier message: 24/05/2011, 22h41
  3. Réponses: 3
    Dernier message: 12/06/2010, 10h16
  4. Réponses: 6
    Dernier message: 20/08/2009, 21h21
  5. Pas d'erreur, mais pas d'affichage
    Par FotoXe33 dans le forum Langage
    Réponses: 7
    Dernier message: 21/06/2009, 12h54

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