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 :

[Printf] Y sont ou mes affichages ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Par défaut [Printf] Y sont ou mes affichages ?
    Bonsoir

    Voilà je travaille sur un ptit projet de jeu et en particulier sur un algorithme A*. Cet algorithme effectue enormement de travail avec des noeuds donc des structures et la gestion de memoire devient difficile devant le nombre exponentiel de noeuds a comparer. Mais enfin bref si je parle de noeud et de memoire c'est parce que j'ai l'impression que mon problème est lié à sa.

    Alors je travaille sous Solaris, et j'utilise DDD pour debug mon programme, j'ai fait un main dans un test.c et j'ai declaré quelques valeurs tests dans celui ci. A chaque etape du code je fais un printf du genre '
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("NomDeFonction En Cours d'execution\n");
    On arrive au probleme, sous DDD le programme semble s'executer correctement et gdb m'affiche mes printf sans probleme. Le programme se termine bien d'apres lui d'ailleurs ( si on ne pousse pas loin la recherche de l'algo, c'est a dire sa profondeur definie dans mon main).
    Mais si j'execute directement sous le shell le binaire, la il m'affiche rien de chez rien et retourne direct a la ligne.
    Pourquoi DDD me montre mes printf et me signale mon programme correctement terminé avec un resultat bien reel et pourquoi rien ne se passe quand je l' execute ? Un probleme de gestion memoire?


    Merci d'avance, Cordialement

    Pour les courageux qui veulent un peu de code pas joli ( jsuis debutant )
    http://atpred.free.fr/test.tar
    -AStar_ListOp correspond au module qui travaille sur le traitement de liste et de noeud.
    -AStar_MeilleurCoup l'algorithme principal et quelques sous fonctions utiles
    -Global réunit des fonctions/types que d'autres personnes devront utiliser.
    -Test est le main avec un plateau vite fait généré

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    J'ai regardé ton code, bien qu'à mon avis il est possible de faire plus simple, là n'est pas la question pour ce problème. Sans pouvoir certifier tous les problèmes que tu as, je peux te dire ceci:

    Ton programme marche chez moi sans aucun problème (quoique, je n'en sais rien...), j'obtiens ceci à la fin...

    Resultat de AStar_MeilleurCoup: 3, parcours de l'algorithme fini.

    Après avoir pris mon courage à deux mains, j'ai commencé à regarder de plus près le code et j'ai remarqué ceci:

    Dans test.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            platasse = malloc(sizeof(struct representation_plateau_dynamique));
            platasse->position_joueur = malloc(sizeof(struct coordonnees));
            platasse->position_caisse[0] = malloc(sizeof(struct coordonnees));
            platasse->position_caisse[1] = malloc(sizeof(struct coordonnees));
    Où sont les tests qui vérifient si malloc a fonctionné?

    Mais plus grave, dans global.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* Fonction globale qui analyse le nombre de caisses a traiter*/
    int cpt_caisse(struct representation_plateau_dynamique *cpt_caisse_plateau)
    {
            int nbcaisse;
            nbcaisse=0;
            while(cpt_caisse_plateau->position_caisse[nbcaisse]!= NULL)
            {
                    nbcaisse++;
            }
            return nbcaisse;
    }
    Visiblement, tu supposes que dans ce programme cpt_caisse_plateau->position[2] == NULL, vu que dans la fonction main tu ne l'alloues pas... Une règle en C: la zone mémoire que rend malloc n'est pas initialisé, cela veut dire que tu peux avoir n'importe quoi dedans... Pour être sûr, que ta fonction marche, il faut donc ajouter une ligne après les malloc du main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    platasse->position_caisse[2] = NULL;
    Ce n'est pas forcèment suffisant pour résoudre ton problème, mais cela y contribue sûrement... Vu que tu supposais cela, je vais te conseiller de revoir tout ton code et regarder chaque endroit qui pourrait poser problème...

    Jc

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Par défaut
    Bonjour,

    Je vais tout de suite corriger çà. C'est vrai que j'aurai pu faire pu simple mais j'ai tres peu de temps pour coder cet algorithme et paufiner ce joli charabia. Je te remercie pour l'attention que tu m'a donné vraiment en tout cas c'est bien sympa !

    Cordialement

    EDIT: Malheureusement aucun changement, mon shell n'affiche rien

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Par défaut
    Re

    Tiens j'ai un autre probleme qui m'embete + en fait.
    Avec le makefile suivant impossible pour GDB et DDD de lire les lignes a debugger ("No line number information available for address 0x10ad0 <main>")

    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
    CC=gcc
    OBJETS=test.o global.o AStar_ListOp.o AStar_MeilleurCoup.o
    CFLAGS= -ansi -Wall -g
     
    test: $(OBJETS)
    	$(CC) $(CFLAGS) $(OBJETS)\
    	-o test
     
    global.o: global.c global.h AStar_ListOp.h
    	$(CC) $(CFLAGS) -c global.c
     
    AStar_ListOp.o: AStar_ListOp.c global.h AStar_ListOp.h
    	$(CC) $(CFLAGS) -c AStar_ListOp.c
     
    AStar_MeilleurCoup.o: AStar_MeilleurCoup.c global.h AStar_ListOp.h
    	$(CC) $(CFLAGS) -c AStar_MeilleurCoup.c
     
    test.o: test.c global.h AStar_ListOp.h
    	$(CC) $(CFLAGS) -c test.c

    Sinon pour en revenir au probleme principal où le debugger execute correctement le programme et sur le shell quand on l'execute rien ne se passe, j'ai fait des tests assez interessants.
    Primo si je laisse dans mon main juste et uniquement le printf comme pour faire un HelloWorld basique, le shell ne m'affiche rien. La seule chose particuliere a ce helloWorld, c'est que je le compile avec le make ci dessus, malgré que le main n'appelle aucune des autres fonctions compilées. Comment sa se fait alors qu'il n'a rien appelé d'autre et inclu seulement le stdio.h que le printf du main n'affiche rien alors?

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par predacktor
    Primo si je laisse dans mon main juste et uniquement le printf comme pour faire un HelloWorld basique, le shell ne m'affiche rien. La seule chose particuliere a ce helloWorld, c'est que je le compile avec le make ci dessus, malgré que le main n'appelle aucune des autres fonctions compilées. Comment sa se fait alors qu'il n'a rien appelé d'autre et inclu seulement le stdio.h que le printf du main n'affiche rien alors?
    Le fait de compiler avec d'autres .o ne devrait pas affecter ton main... Si je résume ton problème, ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    #include <stdio.h>
     
    int main()
    {
            printf("Hello World\n");
            return 0;
    }
    Compiler comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc hello.c -o hello
    N'affiche rien?

    Si c'est le cas, ce n'est plus un problème de C que tu as, mais plutôt un problème système, il faudrait donc poster là-bas...

    Jc

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Par défaut
    Le code est comme çà. et je le compile en tapant:

    Avec le makefile ci dessus bien sur. Comme tu dis il me semble etrange que les .o affecte ce code.
    Toi tu l'as compilé sous quel systeme pour qu'il marche?

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par predacktor
    Le code est comme çà. et je le compile en tapant:

    Avec le makefile ci dessus bien sur. Comme tu dis il me semble etrange que les .o affecte ce code.
    Toi tu l'as compilé sous quel systeme pour qu'il marche?
    Linux perceval 2.6.11-1-686-smp #1 SMP Mon Jun 20 20:18:45 MDT 2005 i686 GNU/Linux

    Distribution: Debian
    Compilateur: gcc version 4.0.3 20060115 (prerelease) (Debian 4.0.2-7)

  8. #8
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Par défaut
    Toute façon cet algorithme n'est censé rien affiché car une equipe travaille sur l'interface et je ne renverrai que des valeurs. Tout de meme j'aurai aimé voir mes printf au cas ou cette meme equipe ne finit pas son travail

  9. #9
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par predacktor
    Toute façon cet algorithme n'est censé rien affiché car une equipe travaille sur l'interface et je ne renverrai que des valeurs. Tout de meme j'aurai aimé voir mes printf au cas ou cette meme equipe ne finit pas son travail
    Comme dit, c'est sûrement un problème de printf et de configuration de ton shell... Essaie le code hello.c que j'ai fourni avec tous les shells en ta possession pour voir si le problème ne vient pas tout simplement de là.

    Une autre solution, modifie tes printf en fprintf pour écrire le tout dans un fichier...

    Jc

  10. #10
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par predacktor
    Tout de meme j'aurai aimé voir mes printf au cas ou cette meme equipe ne finit pas son travail
    Quel est le nom de ton executable? Si ton test.c est compile en l'executable 'test' et que tu invoques:
    Il va faire tourner man 1 test et non ton exe. Pour faire tourner ton exe, invoque
    dans ta console.

  11. #11
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par DaZumba
    Citation Envoyé par predacktor
    Tout de meme j'aurai aimé voir mes printf au cas ou cette meme equipe ne finit pas son travail
    Quel est le nom de ton executable? Si ton test.c est compile en l'executable 'test' et que tu invoques:
    Il va faire tourner man 1 test et non ton exe. Pour faire tourner ton exe, invoque
    dans ta console.
    Exact, j'ai un collégue qui a eu le même problème, tu as raison... Enfin je le parierais bien...

    Jc

  12. #12
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Par défaut
    Incroyable c'était çà . Pfiou et moi qui cherchait si loin ! Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MediaWiki] Où sont stockés mes pages ?
    Par onashx dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 21/06/2010, 16h31
  2. Callback et g_signal_connect ne sont pas mes amies
    Par PazaiFoG dans le forum GTK+ avec C & C++
    Réponses: 9
    Dernier message: 10/12/2009, 13h09
  3. Où sont passeé mes 11 GO?
    Par Finodia dans le forum Composants
    Réponses: 6
    Dernier message: 07/07/2009, 09h34
  4. Réponses: 10
    Dernier message: 23/03/2006, 20h57

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