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 :

le printf magique


Sujet :

C

  1. #1
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut le printf magique
    Bonjour,
    voila j'ai un soucis avec mon code C. Le bout de code se lance parfaitement si on laisse le printf dans le code et si je l'enleve alors j'ai un problème lors de l'exécution.

    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(i=1;i<nbEtapes;i++){              
                      a=b+dureeTotalTournee(distanceStruct(tableauEtapesFinal,i-1,i),0); 
                   b=a+10;
                   //printf("%d\n%d \n",a,b);
     
                   creerLigneTournee(BD,(tableauEtapesFinal+i)->nom, (tableauEtapesFinal+i)->cp,(tableauEtapesFinal+i)->type,10,id_tournee,heure,a,b);
    Le printf est mit en commentaire. je ne comprend pas l'erreur surtout que a et b sont bien renseignés.

    Merci de votre aide.

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    à quel valeur de i cela plante, sur quelle ligne dureetotaltournee ou creerlignetournee ?

    ce sont juste des questions te permettant de chercher à identifier plus précisément la cause du plantage, probablement aléatoire mais pas spécifique à printf car la magie n'existe pas.

  3. #3
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    bah tout est la.... lorsque je voulais savoir a quel indice cela plantait j'ai voulu mettre le printf et a ce moment la plus de plantage....

    et lorsque je le retire cela plante des le debut donc à i=1..
    étrange

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    ca plante à i=1 mais est-ce que la fonction dureeTotalTournee est executée complétement ou est-ce que cela plante à la fonction d'après cad creerLigneTournee

  5. #5
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Oui la fonction duréetotale est bien réalisée car les entiers a et b sont renseignés. le problème vient donc de la méthode creerLigneTournée.
    j'ai donc essayer de mettre directement dans la fonction des valeurs fixe de a et b telle que 23 et 23. Et j'ai lancé cela sans le printf et cela deconne toujours.. mais des que je remet le printf cela remarche.

  6. #6
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Le problème venait d'une variable mal initialisé dans la fonction creerFeuilleRetrait. le problème c'est pourquoi cela marchait uniquement quand il y avait un printf auparavant? en quoi il est important ?

  7. #7
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    en rien tu ne devrais pas te focaliser dessus.

    le seul lien est que printf utilise la pile et que les fonctions aussi.

  8. #8
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Ok merci de ton aide. C'est vrai je me suis trop focalisé dessus et j'aurai du d'avantage regarder les fonctions au alentours.

    Donc problème résolu.
    Erreur fonction creerFeuilleRetrait où une variable etait mal initialisé.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 nicodn02 Voir le message
    Le problème venait d'une variable mal initialisé dans la fonction creerFeuilleRetrait.
    Ce qui entraine un comportement indéfini : tout peut arriver.

    http://emmanuel-delahaye.developpez.com/notes.htm#ub

  10. #10
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    il faut se méfier de printf pour l'affichage de trace, sur ma plateforme xp mettre un % en début de chaîne génére un plantage à l'execution, printf("% quelque chose %d",4); par exemple et ce n'est pas forcément évidemment à voir avec un ici et l'autre là. une MACRO serait déja pas plus mal

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 968
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 968
    Par défaut
    Jue,
    Citation Envoyé par hegros Voir le message
    il faut se méfier de printf pour l'affichage de trace, sur ma plateforme xp mettre un % en début de chaîne génére un plantage à l'execution, printf("% quelque chose %d",4); par exemple et ce n'est pas forcément évidemment à voir avec un ici et l'autre là. une MACRO serait déja pas plus mal
    Si ce que tu cherches à afficher n'est pas conforme (ce qui est le cas de ton printf), une macro ne changera rien, je pense.

  12. #12
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par droggo Voir le message
    Jue,

    Si ce que tu cherches à afficher n'est pas conforme (ce qui est le cas de ton printf), une macro ne changera rien, je pense.
    ce n'est pas le problème d'être conforme, de connaître les specs ou les bugs de cette fonction, c'est que c'est une erreur possible de taper un % dans un début de printf et que cela entraîne un plantage d'execution sur ma plateforme, je ne pense pas que j'utiliserais printf pour faire un trace pour la macro non plus.

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 hegros Voir le message
    ce n'est pas le problème d'être conforme, de connaître les specs ou les bugs de cette fonction, c'est que c'est une erreur possible de taper un % dans un début de printf et que cela entraîne un plantage d'execution sur ma plateforme, je ne pense pas que j'utiliserais printf pour faire un trace pour la macro non plus.
    Peux-tu montrer exactement le code qui fait planter ?

  14. #14
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    tout de suite chef !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc,char*argv[])
    {
        printf("%nombre argument %d\n\n\n",argc);
    	return 0;
    }
    il doit surement prendre le n de "nombre" avec le % comme spécificateur de format ce qui le fait planter je ne sais pas avec "fombre" je n'ai pas ce problème (cela affiche 0.0XF)

    avec le message d'erreur
    Images attachées Images attachées  

  15. #15
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par hegros Voir le message
    ce n'est pas le problème d'être conforme, de connaître les specs ou les bugs de cette fonction
    Ce n'est pas un bug !

    Les % sont interprété par printf(), et si tu veux afficher le caractères % il faut le doubler : %%.

    D'après la page man de printf() le %n stocke le nombre de caractères déjà écrit dans le paramètre correspondant (quoi doit être de type int*).

    Donc ici il tente d'écrire dans l'adresse représenté par la valeur de argc -> plantage logique !


    printf() c'est puissant, du coup cela peut même être dangereux

    a++

  16. #16
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    noooooon je ne veux pas afficher le % c'est juste une erreur de frappe.

    ce n'est pas un bug en effet c'est une écriture dans les choux

  17. #17
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Mais alors je ne vois pas le problème : tu lui passes un format incorrect c'est normal qu'il plante !

    a++

  18. #18
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    il n'y a pas de problème son interface n'est pas robuste cela plante parfois cela fais fonctionner des programmes autant réécrire une fonction qui corrige ces comportements indéfinis du coup cela me prendra 5fois moins de temps qu'apprendre la syntaxe de printf

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 hegros Voir le message
    il n'y a pas de problème son interface n'est pas robuste cela plante parfois cela fais fonctionner des programmes autant réécrire une fonction qui corrige ces comportements indéfinis du coup cela me prendra 5fois moins de temps qu'apprendre la syntaxe de printf
    Tu as invoqué le formateur "%n" sans fournir d'adresse de char. C'est une erreur de codage dont tu es seul responsable. Le comportement est indéterminé. Un compilateur bien réglé le voit tout de suite :

    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:5: warning: format argument is not a pointer (arg 2)
    main.c:5: warning: too few arguments for format
    main.c: At top level:
    main.c:3: warning: unused parameter 'argv'
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 3 warnings

  20. #20
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    ok printf n'a jamais eu de bug c'est la plus parfaite des fonctions d'affichage

    je n'ai rien invoqué, le %n s'est retrouvé là par hasard, suite à une erreur de frappe un % s'est inséré avant la chaîne que je voulais afficher, effectivement cette commande attend l'adresse d'un int et je lui donne n'importe quoi et elle me sort n'importe quoi, normal


    en 2008 je pensais écrire la valeur de argc en 3d, j'étais loin, loin là bas dans la nuit noire et obscure...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème a l'affichage dans la console (printf)
    Par PhoneKilleR dans le forum C
    Réponses: 21
    Dernier message: 23/09/2003, 17h21
  2. printf avec %g
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 15/09/2003, 09h08
  3. printf et LARGE_INTEGER
    Par KORTA dans le forum C
    Réponses: 10
    Dernier message: 05/09/2003, 15h20
  4. les accents et printf
    Par remi77 dans le forum C
    Réponses: 5
    Dernier message: 07/07/2003, 20h53
  5. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24

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