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 :

tableau dynamique de structures initialisé dans une autre fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2008
    Messages : 97
    Par défaut tableau dynamique de structures initialisé dans une autre fonction
    Bonjour à tous,

    j'essaye de me remettre petit à petit au c...
    J'ai une petite question d'entrée de jeu:

    pourquoi lorsque je déclare un tableau de structure dynamique dans le main et que j'alloue directement la mémoire, ca fonctionne et pas quand je l'alloue dans une autre fonction...

    exemple:

    le code ci dessous affiche:
    AAAAAAAAA
    BBBBBBBBBB
    CCCCCCCCC
    etc...

    (si ca c'est pas du code utile)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct Machin Machin;
    struct Machin
    {
        char id[10];
    };
    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
    void Add(Machin trucs[])
    {
        //trucs = calloc(1, sizeof(Machin)); //si je fais un calloc ici ca affiche que des caractères rien avoir.
        int i;
        for(i = 0; i < 9; i++)
        {
            trucs[0].id[i] = 'A';
        }
        trucs[0].id[9] = '\0';
            int j;
            for (j = 1; j < 15; j++)
            {
                trucs = realloc(trucs, (j + 1) * sizeof(Machin)); //c'est débile de le faire 15 * 1 à 1 mais c'était pour mon épanouissement personnel
     
                int i;
                for(i = 0; i < 9; i++)
                {
                    trucs[j].id[i] = 'A' + j;
                }
                trucs[j].id[9] = '\0';
            }
    }
    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
    int main()
    {
        Machin* trucs;
        trucs = calloc(1, sizeof(Machin)); // si je commente ici et que je fais le calloc dans la fonction add, ca affiche des caractères rien avoir.
     
        Add(trucs);
     
        int y;
        for(y = 0; y < 15; y++)
        {
            printf("res: %s\n",trucs[y].id);
        }
     
        free(trucs);
        return 0;
    }
    Donc, quand je fais le calloc dans main après la déclaration: c'est bon,
    quand je le fait dans la fonction Add: c'est pas bon.

    Pourquoi?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Dans la fonction add(), tu fais un realloc() de trucs.
    Mais :

    1- Un realloc() peut échouer

    2- Un realloc() peut changer l'adresse du bloc de données. Dans ce dernier cas, comment la fonction appelante pourra-t-elle savoir où se trouve le nouveau bloc de données ? La fonction doit renvoyer la (nouvelle) valeur de trucs et la fonction appelante stocker cette adresse à la place de l'ancienne.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2008
    Messages : 97
    Par défaut
    Et la lumière fut...
    je n'y avait pas pensé à ce point 2.

    pour le #1 c'est vrai, il faut toujours tester, je suis fouettable, même si c'était un code bidon.

    Merci beaucoup

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/04/2013, 11h11
  2. Utiliser structure tm dans une autre structure
    Par Mélodie_et_rythmes dans le forum C
    Réponses: 9
    Dernier message: 01/04/2012, 13h03
  3. Réponses: 4
    Dernier message: 19/11/2011, 20h53
  4. Structures complexes dans une autre structure?
    Par cata2 dans le forum MATLAB
    Réponses: 4
    Dernier message: 19/09/2007, 23h05
  5. Réponses: 5
    Dernier message: 29/06/2006, 17h23

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