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 :

allocation strucure et pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut allocation strucure et pointeur
    Bonjour, je suis nouveau dans se site et je me permet de vous exposer mon problème, Voici les différentes question de l'exercice :

    Nous souhaitons manipuler une structure de données constituée d'un tableau de pointeurs sur des structures de type Element(type défini dans la première question de cet énoncé).Cette structure de données sera donc de type Element **.
    Nous appelons taille de cette structure de données la taille de son tableau de pointeurs. Nous appelons k-ème élément de cette structure de données la structure dont l'adresse figure dans la case d'indice k du tableau de pointeur de cette structure de données.

    1. Écrire le code permettant de définir une structure de nom Element qui comporte deux champs de type int et de noms c1 etc2.

    Ma réponse ( je ne suis pas sur pour la notation des pointeurs) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct Element ** {
               int a,b;
               char* c1,c2;} Element;
    2.Écrire la fonction de prototype Element **creer_structure(int n) qui permet d'allouer et d'initialiser un telle structure de données de taille n. Cette fonction doit initialiser tous les champs des structures de type Element à 0 et retourner la structure de données allouée. On prendra soin d'éviter toute erreur de segmentation .

    Ma reponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Element **creer_structure(intn){
     
                   Element **tab = malloc(n*sizeof(Element));
     
                   if (tab == NULL){ 
                           printf("Probleme d'allocation \n");
                           return NULL;}
     
                   for(int i =0; i <=n;i++){
                        tab[i] = 0; }
                   return tab;
    }
    3.Écrire la fonction de prototype void liberer_structure(Element **sd, int n) qui permet de libérer l'espace mémoire occupé par la structure de données sd de taille n. Vous prendrez garde que votre fonction ne présente pas de risque de fuite de mémoire.

    Pour ca, je sais qu'il faut utiliser free() mais je sais pas comment l'utiliser xD.

    4.Écrire la fonction de prototype void modifier_element_dans_structure(Element **sd, int n,int k, int a,int b) qui permet d'affecter respectivement les valeurs a et b aux champs c1 et c2 du k-ème élément de la structure de données sd de taille n. Vous prendrez garde que votre fonction ne puisse pas générer d'erreur de segmentation.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par akhma Voir le message
    Element qui comporte deux champs de type int et de noms c1 etc2.

    Ma réponse ( je ne suis pas sur pour la notation des pointeurs) :

    typedef struct Element ** {
    int a,b;
    char* c1,c2;
    } Element;
    J'ai ri

    Espèce de gros béta :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct s_element  /*<- tu peux donner n'importe quel nom */ {
               int c1, c2;
    } Element;

    Citation Envoyé par akhma Voir le message
    if (tab == NULL){
    printf("Probleme d'allocation \n");
    return NULL;}
    Ouais ce n'est pas génial : il manque quand même un booléen pour dire si la création s'est bien passée et qu'on peut lire le tableau retourné. Mais la signature et le retour sont imposés.

  3. #3
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour,

    Ta réponse à la question 1 ne compile pas. À terme, le plus simple serait que tu aies un compilateur C chez toi. En attendant, tu peux utiliser un compilateur en ligne. Il y en a plusieurs. En voici un :
    http://www.compileonline.com/compile_c_online.php

    Réponse à la question 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct Element {
        int c1, c2;
    } Element;
    [Edit]Doublé par foetus pour la réponse à la question 1.[/Edit]

    Pour la question 2, pour commencer, il manque une étoile après Element :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Element **tab = malloc(n*sizeof(Element*));
    En effet, il faut allouer un tableau de n pointeurs, donc chaque "case" du tableau doit avoir la taille d'un pointeur.

    Toujours dans la question 2, la suite du code ne respecte pas la consigne. La consigne ne demande pas que chaque pointeur du tableau soit nul. Chaque pointeur doit pointer vers un nouvel élément Element (à allouer) dont c1 et c2 valent 0. Je te laisse écrire le code et vérifier qu'il compile.

    Pour la question 3, voici un lien vers la FAQ C sur l'allocation dynamique de la mémoire :
    https://c.developpez.com/faq/?page=L...que-de-memoire

    Ce lien ne contient pas directement le code qui répond à la question, mais il explique, entre autres, comment utiliser free.

  4. #4
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut Reponse
    Tout d'abord, merci beaucoup pour vos réponse.

    Donc pour la question 2 voici se que j'ai modifier :

    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
    typedef struct s_element{int c1, c2;} Element;
     
    Element **creer_structure(int n){
     
                   Element **sd = malloc(n*sizeof(Element*));
     
                   if (tab == NULL){ 
                           return NULL;}
     
                   for(int i =0; i <=n;i++){
                        sd -> c1 = 0;
    		    sd -> c2 = 0; 
    		}
                   return sd;
    }
    Puis pour la question 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void liberer_structure(Element **sd, int n){
     
                    **sd = **creer_structure(int n);
     
                    free(**sd);
    }
    Pour la question 4, je n'ai pas trop d'idée.

  5. #5
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct s_element{int c1, c2;} Element;
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Element **creer_structure(int n){
     
                 Element **sd = malloc(n*sizeof(Element*));
     
                 if (tab == NULL){
                       return NULL;}
     
                 for(int i =0; i <=n;i++){
                       sd -> c1 = 0;
                       sd -> c2 = 0;
                 }
                 return sd;
    }
    Puis pour la question 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void liberer_structure(Element **sd, int n){
     
                  **sd = **creer_structure(int n);
     
                  free(**sd);
    }

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Je remarque que malgré ton MP, tu as quand-même réussi à trouver comment créer un topic.

    Citation Envoyé par akhma Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Element **creer_structure(int n){
     
                 Element **sd = malloc(n*sizeof(Element*));
     
                 if (tab == NULL){
                       return NULL;}
     
                 for(int i =0; i <=n;i++){
                       sd -> c1 = 0;
                       sd -> c2 = 0;
                 }
                 return sd;
    }
    Moui...
    C'est quoi "tab" en ligne 2 ??? Et à quoi sert de boucler sur "i" si "i" n'est pas utilisé dans la boucle ???
    Par ailleurs cette fonction a pour but de créer un tableau de n "Element". Donc il te faut allouer n pointeurs oui ; puis il te faut ensuite allouer chaque pointeur de ce tableau pour que chaque pointeur du tableau de pointeurs puisse, lui, stocker un "Element". Ce qu'a dit d'ailleurs Pyramidev.

    Citation Envoyé par akhma Voir le message
    Puis pour la question 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void liberer_structure(Element **sd, int n){
     
                  **sd = **creer_structure(int n);
     
                  free(**sd);
    }
    Mouais. Là c'est du grand n'importe quoi. Pourquoi en effet créer la structure dans la fonction alors que celle-ci est sensée libérer une structure déjà créée ailleurs. Et tu penses vraiment qu'on te ferait écrire une fonction juste pour qu'elle appelle free() ??? Visiblement aucune réflexion quoi.

    Accessoirement, une convention veut que les types que l'on crée se nomment "t_xxx" pour ne pas les confondre ensuite avec des variables. Et aussi pour pouvoir utiliser le nom pour les variables justement. Parce que si tu veux créer une variable de type Element comment tu vas l'appeler ? "element" ??? => Element element en effet ça sera super clair et super lisible !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2018
    Messages : 10
    Par défaut
    Merci pour ta réponse, en faite je ne comprend comment faire pour que chaque pointeur pointe vers un nouvel élément Element (à allouer) avec c1 et c2 valent 0

Discussions similaires

  1. Allocation tableau de pointeur
    Par kaikait dans le forum Débuter
    Réponses: 4
    Dernier message: 24/04/2010, 21h59
  2. allocation dynamique et pointeur
    Par siempre dans le forum C
    Réponses: 3
    Dernier message: 29/11/2009, 21h35
  3. Réponses: 6
    Dernier message: 24/03/2006, 18h24
  4. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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