1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : avril 2016
    Messages : 32
    Points : 25
    Points
    25

    Par défaut Accès aux champs d'une structure

    Bonjour, j'ai un souci avec le champ pointeur d'une structure sur une autre, j'ai deux structures dont l'une contient un pointeur vers vers, maintenant je veux accéder aux champs de la structure pointée en passant par la structure qui contient le pointeur. Vs avez ici les codes pour mieux cerner de quoi je parle.

    déclaration des structure

    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
    struct pixel
    {
    	unsigned short R,G,B;
    }; typedef struct pixel pixel;
    struct imagePPM
    {
    	char *nombreMagique[3];
    	char col,lig;
    	short max;
    	pixel * pixels;
    };typedef struct imagePPM imagePPM;
    pixel initialise(unsigned short r, unsigned short g, unsigned b);
    void initialise2(unsigned short r, unsigned short g, unsigned b, pixel *p);
    imagePPM *creerImagePPM(unsigned char col, unsigned char lig, unsigned char max);
    void affichePixels(imagePPM *image);
    void save(imagePPM *image, char *nomFic);
    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
    magePPM * creerImagePPM(unsigned char col, unsigned char lig, unsigned char max)
    {
    	imagePPM *image = malloc(sizeof(imagePPM));
    	image->col=col;
    	image->lig=lig;
    	image->max=max;
    	image->nombreMagique[0]="P";
    	image->nombreMagique[1]="3";
    	return image;
    }
     
    void affichePixels(imagePPM *p)
    {
    	printf("les codes de couleurs: %d %d %d\n",p->pixels->R,p->pixels->G,p->pixels->B);
    }
    epuis dans le main j'appelle la fonction affichePixels j'ai une erreur de segmentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include "tp3.h"
    #include <stdlib.h>
    int main(int argc, char argv[])
    {
    	imagePPM *image;
    	image = creerImagePPM(2,2,5);
    	affichePixels(image);
    }
    Je voudrais afficher les valeurs par défaut des champs p->pixels->R,p->pixels->G,p->pixels->B

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 736
    Points : 3 675
    Points
    3 675

    Par défaut

    Bonjour,

    Un pointeur, ça doit pointer quelque part. A aucun moment dans le code que tu fournis, le champ pixels n'est initialisé. Il pointe donc à un endroit aléatoire, l'utiliser donnera donc un comportement aléatoire

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : avril 2016
    Messages : 32
    Points : 25
    Points
    25

    Par défaut

    Merci Dalfab pour votre réponse, mais je me rends compte que quand je fais de cette manière
    dans la fonction qui me créé mon imagePPM, ça ne s'execute pas aussi cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    imagePPM * creerImagePPM(unsigned char col, unsigned char lig, unsigned char max)
    {
    	imagePPM *image = malloc(sizeof(imagePPM));
    	image->col=col;
    	image->lig=lig;
    	image->max=max;
            image->pixels->G=0;
            image->pixels->R=0;
            image->pixels->B=0;
    	image->nombreMagique[0]="P";
    	image->nombreMagique[1]="3";
    	return image;
    }
    je ne sais pas si j'ai mal fait mais je ne sais pas comment faire autrement.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : avril 2016
    Messages : 32
    Points : 25
    Points
    25

    Par défaut

    je viens de faire quelque chose dans ma fonction qui créé imagePPM, ça marche mais je me demande si c'est normal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    imagePPM * creerImagePPM(unsigned char col, unsigned char lig, unsigned char max)
    {
    	imagePPM *image = malloc(sizeof(imagePPM));
    	image->pixels= malloc(sizeof(pixel));//est-il normal de faire un malloc ici pour le champ pointeur??
    	image->col=col;
    	image->lig=lig;
    	image->max=max;
    	image->nombreMagique[0]="P";
    	image->nombreMagique[1]="3";
    	return image;
    }
    j'ai fait un malloc pour le champ pixels avec sizeof de la structure pixel sur laquelle il pointe.

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 390
    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 : 2 390
    Points : 5 404
    Points
    5 404

    Par défaut

    Tu peux initialiser un pointeur soit avec une adresse (avec l'esperluète) soit avec un malloc.

    Donc c'est bon pour le malloc, mais ton initialisation est fausse parce que tu initialises un tableau de dimension col x lign

    Et il te manque la désallocation de ta structure parce que tu as une fuite mémoire ou

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : avril 2016
    Messages : 32
    Points : 25
    Points
    25

    Par défaut

    Vous parlez dans ce cas de ma fonction en générale ou bien de la partie qui concerne le champ pixels?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : avril 2016
    Messages : 32
    Points : 25
    Points
    25

    Par défaut

    je comprends pour la des-allocation mais quant à l’initialisation d'un tableau bidimensionnel, je ne suis pas sûr de vous avoir compris.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : avril 2016
    Messages : 32
    Points : 25
    Points
    25

    Par défaut

    si je comprends bien feotus, je dois faire de cette manière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image->pixels = malloc(col*lig*sizeof(pixel));

  9. #9
    Membre expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 736
    Points : 3 675
    Points
    3 675

    Par défaut

    Oui, il faut allouer tous les pixels de la table

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : avril 2016
    Messages : 32
    Points : 25
    Points
    25

    Par défaut

    Merci à tous, mon problème a été résolu.

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

Discussions similaires

  1. non accessibilité aux champs d'une structure
    Par Christinita dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/02/2010, 08h18
  2. accès aux éléments d'une structure
    Par titou35 dans le forum Débuter
    Réponses: 4
    Dernier message: 05/03/2009, 09h23
  3. Problème d'accès à un champs d'une structure
    Par petdelascar dans le forum C
    Réponses: 7
    Dernier message: 05/04/2008, 20h12
  4. Accès aux membres d'une structure C
    Par Gulish dans le forum C++
    Réponses: 4
    Dernier message: 22/03/2008, 16h09
  5. Accès aux éléments d'une structure
    Par licorne dans le forum Pascal
    Réponses: 1
    Dernier message: 15/02/2007, 17h44

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