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 dynamique d'un tableau de structures


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 3
    Par défaut Allocation dynamique d'un tableau de structures
    Bonjour,
    j'ai une structure et je veux créer un tableau de cette structure avec une allocation dynamique et le remplir à partir d'un autre tableau de celle-ci.

    voici la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct Distance {
    	int idVille1;
    	int idVille2;
    	int distance;
    };
    typedef struct Distance Dist;
    je crée un tableau de cette structure et je le copie dans un autre créer avec un malloc() et je l'affiche.

    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
     
    int main(int argc, char* argv[]){
     
    	Dist a[11] = {	{1, 2, 10},
    				{1, 3, 5},
    				{1, 4, 16},
    				{1, 5, 12},
    				{2, 3, 9},
    				{2, 4, 10},
    				{2, 5, 20},
    				{3, 4, 13},
    				{3, 5, 15},
    				{4, 5, 12},
    				{2, 6, 10} };
     
    	Dist *b = (Dist*) malloc(11 * sizeof b);
    	for(int i=0; i<11; i++){
    		b[i] = a[i];
    	}
    	for(int i=0; i<11; i++){
    		printf("%d %d %d\n", b[i].idVille1, b[i].idVille2, b[i].distance);
    	}
     
    	return 0;
    }
    mais le problème c'est que le résultat qui est bizzare.

    le voila :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    1 2 10
    1 3 5
    1 4 16
    1 5 12
    2 3 9
    2 4 10
    2 5 20
    3 1041 0
    808525875 807416116 10
    909194295 540422449 667697
    669497 6 10
    et les 4 dernière ligne sont toujours les même à chaque fois.

    merci pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    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 771
    Par défaut
    C'est ultra normal Quel est pour toi la valeur de sizeof(b) ?

    De plus tu n'as pas besoin de fournir la taille de a - le compilateur le fait pour toi - Dist list_distances[] = { /* ... */ };.
    Et tant que ta variable tableau n'est pas dégradé en pointeur, sizeof(list_distances) vaut 11 (<- Édit : anas0dev me rappelle que c'est la taille totale et donc il faut diviser par la taille de la structure)

    Ta variable de boucle peut être sortie et ainsi définie 1 seule fois
    En C, le retour de malloc n'a pas besoin d'être casté


    Et n'oublie pas l'appel à free (<- lien cplusplus en anglais)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 3
    Par défaut
    Citation Envoyé par foetus Voir le message
    C'est ultra normal Quel est pour toi la valeur de sizeof(b) ?
    pour moi la valeur de sizeof(b) est la même que sizeof(Dist*) qui est la taille d'un pointeur, et je viens de le vérifier avec printf() et sa affiche 8, et vu que moi je veux un tableau de Dist se qu'il faut c'est sizeof(*b).

    merci pour le tuyau

    Citation Envoyé par foetus Voir le message
    De plus tu n'as pas besoin de fournir la taille de a - le compilateur le fait pour toi - Dist list_distances[] = { /* ... */ };.
    c'est vrai merci pour le rapelle.

    Citation Envoyé par foetus Voir le message
    Et tant que ta variable tableau n'est pas dégradé en pointeur, sizeof(list_distances) vaut 11.
    j'ai affiché la valeur de sizeof(a) et ça vaut 132, c'est la valeur de tout le tableau 4*3*11, je pense que tu voulais plutôt sizeof(a)/sizeof(Dist).

    Citation Envoyé par foetus Voir le message
    Ta variable de boucle peut être sortie et ainsi définie 1 seule fois
    En C, le retour de malloc n'a pas besoin d'être casté


    Et n'oublie pas l'appel à free (<- lien cplusplus en anglais)
    c'est noté merci

    et bonne soirée

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    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 771
    Par défaut
    Citation Envoyé par anas0dev Voir le message
    vu que moi je veux un tableau de Dist se qu'il faut c'est sizeof(*b).
    Ou plus simplement sizeof(Dist) (dans sizeof on peut mettre des types)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 3
    Par défaut
    Merci pour tout vos précieux conseils

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par anas0dev Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=0; i<11; i++){
    	b[i] = a[i];
    }
    Bonjour

    Tout a été dit. Il y a juste cette boucle qu'on peut remplacer par un memcpy(b, a, sizeof a)...
    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]

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/01/2012, 17h01
  2. Allocation dynamique d'un tableau de structure
    Par TheChicken dans le forum Débuter
    Réponses: 20
    Dernier message: 12/05/2011, 17h11
  3. Allocation dynamique d'un tableau de structures
    Par ryadh.naouar dans le forum C
    Réponses: 5
    Dernier message: 24/04/2008, 12h49
  4. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  5. [PRO*C] Allocation dynamique d'un tableau de VARCHAR
    Par NéalZheimer dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 07/07/2006, 13h02

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