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 :

Accès aux champs d'une structure


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2016
    Messages
    60
    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 : 60
    Points : 58
    Points
    58
    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
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 1 565
    Points : 7 648
    Points
    7 648
    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
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2016
    Messages
    60
    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 : 60
    Points : 58
    Points
    58
    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
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2016
    Messages
    60
    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 : 60
    Points : 58
    Points
    58
    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 éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    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
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2016
    Messages
    60
    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 : 60
    Points : 58
    Points
    58
    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
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2016
    Messages
    60
    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 : 60
    Points : 58
    Points
    58
    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
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2016
    Messages
    60
    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 : 60
    Points : 58
    Points
    58
    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
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Oui, il faut allouer tous les pixels de la table

  10. #10
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2016
    Messages
    60
    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 : 60
    Points : 58
    Points
    58
    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