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

  1. #1
    Membre expert
    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
    Points : 3 654
    Points
    3 654
    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 : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    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 expert
    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
    Points : 3 654
    Points
    3 654
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 expert
    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
    Points : 3 654
    Points
    3 654
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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.

  7. #7
    Membre expert
    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
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut
    Ok très bien tous fonctionne. Mais peut tu m'expliquer cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneListe->data = (int*)(uneListe+1);
    Je comprend que mon champ data, prend l'adresse de.... je ne sais pas quoi en fait.

    A quoi correspond uneListe+1 ? Et pourquoi il était important de la préciser ?

    Merci d'avance.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il prend l'adresse de la zone mémoire située juste après la structure elle-même (vu qu'on a alloué assez de place pour les deux).
    Si on ne précise pas data, il pointera dans le vide --> segfault assurée.

    En fait, c'est une construction assez proche de la structure dite "à taille variable", qui est construite ainsi:
    Code C : 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
    #include <stddef.h> /*Pour la macro offsetof*/
    #include <stdlib.h>
     
    typedef struct {
    	unsigned int length;
    	unsigned int max;
    	int data[1]; /*Avec un compilo récent, on peut mettre [0] à la place, mais ça ne change pas grand-chose*/
    } t_list;
     
    t_list* list_new (unsigned int max)
    {
    	t_list* uneListe;
    	uneListe = malloc(max * sizeof(int) + offsetof(t_list, data));
    	uneListe->max = max;
    	uneListe->length = 0;
    	printf("Liste creee\n");
     
    	return uneListe;
    }
    L'avantage de cette manière est qu'on est sûr que les contraintes d'alignement sont respectées quelle que soit l'architecture.
    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.

  9. #9
    Membre expert
    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
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut
    Ok très bien j'ai compris. Merci de ton explication.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

+ 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