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 :

remplissage d'une structure


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 123
    Points : 162
    Points
    162
    Par défaut remplissage d'une structure
    Bonjours,

    voici un bout du contenu de mat.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct mat_t { 		// class matrice
    	unsigned int height;
    	unsigned int width;
    	unsigned int level;		// niveau de gris max de l'image
    	char ** pixels;			// tableau de pixels accessible avec pixels[i][j]
    } mat_pas_pointeur, * mat;
     
    mat mat_new(unsigned int width, unsigned int height);// retourne une matrice non initialisee
    puis un bout dans mat.c:
    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
    mat mat_new(unsigned int width, unsigned int height){
    	// s'appelle avec la syntaxe self->pixels[ligne][colone]
    	mat m;
    	unsigned int i;
    	printf("juste avant l'assignation\n");
    	m->height = height;
    	m->width = width;
    	printf("juste avant l'allocation!\n");
    	m->pixels[0] = calloc(height * width, sizeof(**(m->pixels)));
    	printf("juste apres la premiere allocation\n");
    	m->pixels = calloc(height, sizeof(*(m->pixels)));
     
    	for (i=1; i<mat_height(m); i++){
    		m->pixels[i] = m->pixels[i-1] + mat_width(m);
    	}
    	return m;
    }
    un bout du main.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(int argc, char const *argv[]){
    	const char *input = NULL, *output = NULL;
    	const char *op = NULL;
    	int interp = -1;
    	double parm = 0.0;
     
    	mat in = NULL, out = NULL;
     
     
    	mat_print(mat_pgm_read("/home/dieu/Documents/Dropbox/projet_info/images/palmier.pgm")); return EXIT_SUCCESS; // pour tester pgm
    Et l'orsque le code arrive sur m->height = height; dans mat.c, il y a Segmentation fault (core dumped)
    Comment puis-je faire pour avoir le droit d'accéder au champ m->height ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    mat est un type pointeur et tu n'alloues jamais m.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre habitué
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 123
    Points : 162
    Points
    162
    Par défaut merci
    En initialisation la matrice avant et en ne faisant ici que la modifier, cela fonctionne effectivement mieu! Merci
    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 mat_init(mat_pointeur m, unsigned int width, unsigned int height, unsigned int level){
    	// s'appelle avec la syntaxe self->pixels[ligne][colone]
    	// instanci chacun des champs de la matrice m
    	unsigned int i;
    	m->width = width;	// largeur de l'image
    	m->height = height; // hauteur de l'image
    	m->level = level;   // niveau de gris maximum
    	m->pixels[0] = calloc(height * width, sizeof(**(m->pixels)));	// caloc afin d'avoir une image noir, pas random!
    	m->pixels = malloc(height * sizeof(*(m->pixels)));				// on ne perd pas de temps a tout metre a zero, on initialise en effet juste apres
     
    	for (i=1; i<mat_height(m); i++){
    		m->pixels[i] = m->pixels[i-1] + mat_width(m);
    	}
    	return 1;
    }

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    Pour cette raison, cacher un pointeur dans un typedef est imo une mauvaise pratique.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Attention, tu as inversé ces deux lignes :
    Citation Envoyé par robinechuca Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	m->pixels[0] = calloc(height * width, sizeof(**(m->pixels)));	// caloc afin d'avoir une image noir, pas random!
    	m->pixels = malloc(height * sizeof(*(m->pixels)));				// on ne perd pas de temps a tout metre a zero, on initialise en effet juste apres
    Tu dois d'abord initialiser le pointeur m->pixels avant de pouvoir accéder à m->pixels[0].
    Tester le retour de ces allocations serait aussi une bonne chose à faire.

  6. #6
    Membre habitué
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 123
    Points : 162
    Points
    162
    Par défaut correction finale
    Merci, voici donc le code final, autant laisser quelque chose de terminé!

    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
     
    int mat_init(mat_pointeur p_m, unsigned int width, unsigned int height, unsigned int level){
    	// s'appelle avec la syntaxe self->pixels[ligne][colone]
    	// instanci chacun des champs de la matrice m
    	unsigned int i;
    	p_m->width = width;	// largeur de l'image
    	p_m->height = height; // hauteur de l'image
    	p_m->level = level;   // niveau de gris maximum
    	p_m->pixels = malloc(mat_height(p_m) * sizeof(*(p_m->pixels)));					// on ne perd pas de temps a tout metre a zero, on initialise en effet juste apres
    	if (NULL == p_m->pixels){
    		fprintf(stderr, "L'os elle est pas gentille! Elle veux pas me donner de la memoire!\n");
    		return 0;
    	}
    	p_m->pixels[0] = calloc(mat_height(p_m) * mat_width(p_m), sizeof(**(p_m->pixels)));	// calloc afin d'avoir une image noir, pas random!
    	if (NULL == p_m->pixels[0]){
    		fprintf(stderr, "L'os elle est pas gentille! Elle veux pas me donner de la memoire!\n");
    		return 0;
    	}
    	for (i=1; i < mat_height(p_m); i++){								// on met les bon pointeurs
    		p_m->pixels[i] = p_m->pixels[i-1] + mat_width(p_m);				// dans la liste de pointeurs
    	}
    	return 1;
    }

  7. #7
    Invité
    Invité(e)
    Par défaut
    Presque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	p_m->pixels[0] = calloc(mat_height(p_m) * mat_width(p_m), sizeof(**(p_m->pixels)));	// calloc afin d'avoir une image noir, pas random!
    	if (NULL == p_m->pixels[0]){
    		free(p_m->pixels); // <======  On n'oublie pas de libérer la première zone allouée, sinon fuite de mémoire !
    		fprintf(stderr, "L'os elle est pas gentille! Elle veux pas me donner de la memoire!\n");
    		return 0;
    	}
    Enfin, tu pourrais très bien utiliser les entrées height et width à la place de tes appels à mat_height(p_m) et mat_width(p_m).

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

Discussions similaires

  1. [Débutant] Création et remplissage auto des champs d'une structure
    Par Remi Defraiteur dans le forum MATLAB
    Réponses: 1
    Dernier message: 13/02/2017, 11h43
  2. Remplissage d'une structure dans une boucle for
    Par Lorddolf dans le forum MATLAB
    Réponses: 4
    Dernier message: 07/04/2011, 17h52
  3. problème de remplissage d'une structure
    Par dereck1333 dans le forum Débuter
    Réponses: 11
    Dernier message: 08/12/2007, 19h43
  4. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    Réponses: 15
    Dernier message: 23/04/2003, 16h47
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 19h31

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