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 :

Compilation foireuse bloquant la sortie standard


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Par défaut Compilation foireuse bloquant la sortie standard
    Bonjour,

    J'ai un probleme vraiment etrange, je realise en ce moment un sudoku en projet que l'on doit rendre demain. Nous recuperons des sudokus sur l'entree standard puis nous devons le resoudre et l'afficher le plus rapidement possible. Il est fini mais nous avons utilise fgets() et nous pensons qu'en faisant une petite fonction maison de 4 lignes, ca devrait marcher.
    Eh bien ca marche nickel mais seulement quand on compile (avec gcc) avec les sources (*.c) dans le Makefile. Si on creer des fichiers objets (*.o), et qu'on les links (toujours avec gcc), la sortie standard n'affiche plus rien tant que l'on a pas ecrit quelque chose. Si apres chaque read de ligne que je fais, je mets un write(1, "", 1) par exemple, le resultat s'affiche bien.

    En somme, connaissez-vous un moyen de resoudre le probleme occassionne par le linkage des fichiers objets, bloquant l'affichage de la sortie standard ?

    Merci d'avance

    EDIT : En fait, non ca doit venir encore d'ailleurs mais je ne sais pas de quoi :s Mais manifestemment, ce n'est pas au niveau du code mais bien de la compilation. Voici les CFLAGS que j'ai rajoute : -O -O2 -s -W -Wall -ansi -pedantic.

    RE-EDIT : En fait, c'est le CFLAGS -02 qui bloque l'affichage et -O fait carrement SegFault... Je vais devoir les enlever alors mais connaissez-vous la raison de cela ?

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Hoder Voir le message
    RE-EDIT : En fait, c'est le CFLAGS -02 qui bloque l'affichage et -O fait carrement SegFault... Je vais devoir les enlever alors mais connaissez-vous la raison de cela ?
    Tu as probablement une erreur dans ton code qui induit un comportement différent en fonction du niveau d'optimisation.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 158
    Billets dans le blog
    152
    Par défaut
    Bonjour,

    gdb et valgrind seront vos amis ( du moins les outils pour vous aider )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Par défaut
    On est repasser a une version antérieure et les optimisations ont pu être mises.
    Mais justement, le truc c'est que si je compile sans ces flags, ca marchait impec', c'est seulement quand je les rajoutais.
    Tu as probablement une erreur dans ton code
    C'est justement ce que je me demandais, mais bon, je vais pas vous copier/coller tout mon programme, ca serait un peu long ^^
    Tant pis, et merci quand meme

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 502
    Par défaut
    Il y a 99,999% de chances que ta segfault soit due à une erreur dans ton code plutôt que dans celui du compilateur. Ton code n'est pas forcement si long que tu le crois. Poste-le ici est veillant à utiliser les balises [code] et [/code].

    Pour la sortie standard, sache que celle-ci bufferise par défaut tout ce que tu écris dedans jusqu'à un retour à la ligne ou si le tampon est plein. Il faudra peut-être modifier ce comportement si tu fais des manipulations particulières avec l'affichage.

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Par défaut
    Ca doit etre ca, je ne pensais pas que l'entree standard bufferisait, contrairement a printf() justement.
    Je vais recoder la fonction qui creait le probleme pour voir cela.

    EDIT :
    Ceci fonctionne :

    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
     
    static char     **stock_sudoku(int *finish)
    {
      char          buffer[30];
      int           ctr;
      char          **tab;
     
      ctr = 0;
      tab = xmalloc(sizeof(*tab) * 11);
      while (*finish != TRUE && ctr <= 10) /* Recupere 10 lignes */
        {
          if ((fgets(buffer, sizeof(buffer), stdin)) == NULL)
            *finish = TRUE;
          else
            tab[ctr] = strdup(buffer);
          ctr++;
        }
      tab[ctr] = NULL;
      return (tab);
    }
     
    int             sudoku()
    {
      char          **tab;
      int           finish;
     
      finish = FALSE;
      while (finish != TRUE)
        {
          tab = stock_sudoku(&finish); /* Recupere les sudokus a partir de l'entree standard */
          begin_sudoku(tab); /* Nettoie la map et fait tout l'algo sur Sudoku */
          if (finish == FALSE)
            {
              fprintl(1, DELIMITER); /* Affiche un simple delimiteur avec retour a la ligne sur l'entree standard */
              free_tab(tab);
            }
        }
      printf("FINI\n");
      return (SUCCESS);
    }
    Mais on voulait augmenter la vitesse en evitant de passer par fgets qui serait peut-etre plus long qu'une fonction a nous de 3 lignes ^^.
    On a fait une fonction qui recupere toujours le meme nombre de caracteres (vu que les cases des sudokus donnees sont toujours de 21 caracteres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char            *get_next_line(const int fd)
    {
      char          buffer[20];
      char          *line;
      int           nb_read;
     
      if (!(nb_read = read(fd, buffer, 21)))
        return (NULL);
      buffer[nb_read] = '\0';
      line = strdup(buffer);
      return (line);
    }
    Suite a ce recode, je n'ai plus le probleme, mais un autre est apparu. Ca SegFault toujours au return de la fonction sudoku() (la fonction appellant sudoku() est le main et il n'y a rien d'autre apres cela, mais si on met un printf() dans le main, rien ne s'affiche, voici ce que me sort gdb : "Program received signal SIGSEGV, Segmentation fault. 0x00000000 in ?? ()").

    Malgre ca, j'ai rajoute dans le Makefile -0 et -02, et la, plus rien ne rentre sur l'entree standard ^^. Normalement, je ressors un truc dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    |------------------|
    | 4 8 9 3 1 7 6 2 5|
    | 6 5 1 2 4 8 9 7 3|
    | 3 2 7 9 6 5 8 1 4|
    | 9 7 8 5 3 2 1 4 6|
    | 5 3 6 4 8 1 7 9 2|
    | 2 1 4 7 9 6 5 3 8|
    | 1 9 5 8 2 3 4 6 7|
    | 8 4 3 6 7 9 2 5 1|
    | 7 6 2 1 5 4 3 8 9|
    |------------------|
    ####################
    (Ca rend mieux sur console )
    Mais la, il me ressort :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    |------------------|
    |------------------|
    ####################
    FINI
    Mais sans SegFault ^^

Discussions similaires

  1. PB sortie standard avec les PTHREAD !!!
    Par djspit dans le forum C++
    Réponses: 15
    Dernier message: 19/11/2004, 01h17
  2. [langage] sortie standard linux
    Par ebaynaud dans le forum Langage
    Réponses: 8
    Dernier message: 14/10/2004, 08h05
  3. rediriger la sortie standard vers un textarea
    Par gromite dans le forum Composants
    Réponses: 9
    Dernier message: 10/05/2004, 11h07
  4. Réponses: 5
    Dernier message: 24/12/2003, 09h49
  5. Réponses: 16
    Dernier message: 18/07/2003, 17h16

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