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 :

Cesse de fonctionner en fin d'exécution


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut Cesse de fonctionner en fin d'exécution
    Bonjour,

    Alors je débute en C, et il à pas mal de chose que je catch mal, que ce soit niveau code ou niveau environnement de Dev. Et la je pense que ma question se rapporte plus à une mauvaise configuration de mon EDI. (Mais en vrai j'en sais rien c'est pourquoi je suis là).

    J'ai un programme assez light. Dont voici le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
        t_list* liste1;
        liste1 = list_new(10);
        list_append(liste1, 5);
        list_display((*liste1));
        list_append(liste1, 6);
        list_display((*liste1));
     
        return 0;
    }
    j'ai une structure t_list. Qui contient un tableau de int, et d'autre élément du type int
    list_new sert à créer cette structure.
    list_append à ajouter un élément dans mon tableau de int.
    list_display affiche tout les élément de ma liste.

    Quand je l’exécute tous semble bien ce passer
    Liste creee
    Element ajoutee
    5
    Element ajoutee
    5 6

    Process returned -1073741819 (0xC0000005) execution time : 1.968 s
    Press any key to continue.
    Mais à la fin j'ai une fenêtre qui me dis que mon .exe à cessé de fonctionner. Je ne comprend pas pourquoi et d'où ça vient.

    Edit : j'ai oublié le plus important. Mon IDE est codeblocks
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Euh... quelle est l'IDE du coup ? Et l'OS ? (surtout : la version de Windows on va dire )
    Quels sont les includes ? (pour avoir une idée exacte de ce qui "pourrait" être appelé avant et après le main ! )

    EDIT : OK ! CodeBlocks

    EDIT2 : tu es sûr de ton afficheur de liste "si" plus de 1 élément ?
    Essaye d'ajouter un printf de test "après" ton 2e display pour voir s'il se fait.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut
    l'os est windows 7 32 bits
    les includes présent sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <stdio.h>
    #include <stdlib.h>
    les fonctions

    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
    t_list* list_new (unsigned int max)
    {
        t_list* uneListe;
        uneListe = malloc(max * sizeof(int));
        uneListe->max = max;
        uneListe->length = 0;
        printf("Liste creee\n");
     
        return uneListe;
    }
     
    void list_append(t_list* list, int value)
    {
        if(list->length == list->max)
        {
            printf("Element maximum de la liste atteint\n");
        }
        else
        {
            list->data[list->length] = value;
            list->length++;
            printf("Element ajoutee\n");
        }
    }
     
    void list_display(t_list list)
    {
        int i;
        for(i = 0; i < list.length; i++)
        {
            printf("%d ", list.data[i]);
        }
        printf("\n");
    }
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    • list_new alloue la place pour les entiers, mais pas pour le reste de la structure.
      • D'ailleurs, pourrais-tu poster la définition de la structure également?
    • Est-ce normal que list_display prenne en paramètre une copie de la structure (avec un probable problème de slicing si tu utilises une structure à dimension variable) au lieu d'un pointeur const vers celle-ci?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre extrêmement actif
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    • list_new alloue la place pour les entiers, mais pas pour le reste de la structure.
      • D'ailleurs, pourrais-tu poster la définition de la structure également?
    • Est-ce normal que list_display prenne en paramètre une copie de la structure (avec un probable problème de slicing si tu utilises une structure à dimension variable) au lieu d'un pointeur const vers celle-ci?

    Je n'avais pas penser à la taille de la structure en effet qui ne dois pas correspondre avec la taille que je lui donne.

    Pour info la définition de la structure est celle ci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        typedef struct {
            int* data;
            unsigned int length;
            unsigned int max;
    	}t_list;
    du coup je devrai peut être plutôt faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneListe = malloc(sizeof(t_list) + (sizeof(int * max)))
    Pour la question sur list_display on ma donner la signature de la fonction comme ça. Ca ma paru bizarre aussi. Mais j'ai pas chercher à comprendre plus loin, j'ai fait avec.

    La structure n'est pas à dimension variable pour le moment.

    edit : j'avais écris n'importe quoi dans mes idée...
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    J'ai vu aussi que tu oubliais de régler data.
    Si tu veux utiliser un seul buffer, tu peux faire comme ceci, mais tu t'exposes potentiellement à des problèmes d'alignement sur des plate-formes ésotériques:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    t_list* list_new (unsigned int max)
    {
        t_list* uneListe;
        uneListe = malloc(max * sizeof(int) + sizeof *uneListe);
        uneListe->data = (int*)(uneListe+1);
        uneListe->max = max;
        uneListe->length = 0;
        printf("Liste creee\n");
     
        return uneListe;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. ''explorateur exe a cessé de fonctionner ''
    Par bibiou dans le forum Windows Vista
    Réponses: 6
    Dernier message: 05/07/2008, 15h16
  2. [Système] Détection de fin d'exécution
    Par Xris dans le forum Langage
    Réponses: 2
    Dernier message: 01/02/2007, 10h15
  3. [POO] Connaître la fin d'exécution d'un fonction
    Par Shandler dans le forum Langage
    Réponses: 4
    Dernier message: 28/01/2007, 18h45
  4. [MySQL] Update ne fonctionnant pas à la première exécution
    Par isa150183 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/11/2006, 18h25
  5. Attendre la fin d'exécution d'un page en JS
    Par TekP@f dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/08/2005, 15h15

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