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 :

fonctions de creation et remplissage de matrice


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 46
    Points : 27
    Points
    27
    Par défaut fonctions de creation et remplissage de matrice
    Bonjour,

    Je m'amuse à créer des fonctions pour jouer avec des matrices. Je voudrais avoir des fonctions pour afficher, créer et remplir des matrices. La première ne pose pas de soucis je pense mais les autres ça coince. Le 'créer' semble marcher mais le 'remplir' ça me fait un bus error... donc problème d'accès incorrecte à la mémoire mais je ne trouve pas le problème, voici mes fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void afficheMatrice(int **mat, int ligne, int colonne)
    {
    	int i;
    	for(i=0; i < ligne; i++)
    		afficheTab(mat[i], colonne);
                   // fonction qui affiche un tableau dont on connait la longueur (déjà testé avec des tableaux dans un autre programme)
    	printf("\n");
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void creerMat(int **mat, int ligne, int colonne)
    {
    	mat = (int**) malloc(ligne * sizeof(int *));
    	int tmp;
    	for (tmp=0; tmp < ligne; tmp++)
    		creerTab(&(mat[tmp]), colonne);
    		//fonction qui cree des tableaux d'une certaine longueur (déjà testé avec des tableaux dans un autre programme)
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void remplirMat(int **mat, int ligne, int colonne, int modulo)
    {
    	int i;
    	for(i=0; i < ligne;i++)
    	{
    		int j=0;
    		for(j=0; j <colonne; j++)
    			mat[i][j]=rand()%modulo;
    	}
    }
    Est ce que quelqu'un pourrait m'expliquer ce qui cloche?

  2. #2
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonsoir,
    À première vue, je dirais que le problème vient de la fonction de création.
    Pas du code, mais de la signature.

    À la sortie de la fonction tu as perdu l'adresse de la mémoire que tu viens d'allouer.
    Si c'est toi qui as écrit creerTab(), tu devrais vite comprendre.

    Sinon, observe bien le type du premier paramètre ; tu devrais te rendre compte qu'il y a une étoile en trop.
    Elle est indispensable, puisque l'on modifie la valeur du pointeur.
    C'est ce qui permet de passer le tableau par référence.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 46
    Points : 27
    Points
    27
    Par défaut
    Effectivement, c'est bien la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mat = (int**) malloc(ligne * sizeof(int *));
    qui pose un problème ?

    Mais alors comment faire ? On peut pas faire un pointeur de pointeur de pointeur, si?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    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 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Techniquement, rien n'en empêche.
    Ce serait même la solution à priori.
    Ou bien de retourner ce int** au lieu de le passer en paramètre.
    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
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    ** Il faut apprendre à utiliser les valeurs de retour des fonctions.

    ** Il faut comprendre le rôle des paramètres d'une fonction : ils ont pour objectif de passer une valeur à une fonction. Donc un code comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void creerMat(int **mat, int ligne, int colonne)
    {
       mat = (int**) malloc(ligne * sizeof(int *));
    ....
    où la valeur du paramètre mat est aussitôt écrasée par une autre, montre que mat n'est pas un paramètre de la fonction, mais une variable locale ordinaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void creerMat(int ligne, int colonne)
    {
       int ** mat = malloc(ligne * sizeof(int *));
    ....
    ** Reste à récupérer la valeur de mat à l'extérieur de la fonction. Ceci peut être fait

    - par la valeur de retour, méthode naturelle ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int ** creerMat(int ligne, int colonne)
    {
       int ** mat = malloc(ligne * sizeof(int *));
    ....
       return mat;
    }
    - par l'intermédiaire d'un paramètre en passant à la fonction l'adresse où elle doit placer la valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void creerMat(int *** adMat, int ligne, int colonne)
    {
       int ** mat = malloc(ligne * sizeof(int *));
       *adMat = mat;
    // ou *adMat = malloc(ligne * sizeof(int *))
    ....
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 46
    Points : 27
    Points
    27
    Par défaut
    ok merci... je pensais qu'on était limité à des pointeurs de pointeurs...
    Pour les valeurs de retour de fonction, je suis d'accord pour la fonction de création, par contre ce n'est pas possible pour le remplissage.

  7. #7
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    diogene a développé ce que je voulais dire.
    Quand je disais « une étoile en trop », je voulais en fait dire « une étoile en plus (par rapport au type du tableau) ».

    Citation Envoyé par grodwar Voir le message
    je pensais qu'on était limité à des pointeurs de pointeurs...
    Je ne pense pas qu'il y a une limite.
    Après tout, à partir du deuxième niveau, pour le compilateur ça reste un pointeur sur un pointeur (comprendre « un pointeur sur des données qui ont la taille d'un pointeur »), voire ça reste un pointeur (comprendre « des données de la taille d'un pointeur »).
    Ceci dit, je ne sais pas si quelqu'un s'est amusé à voir à partir de combien de niveaux de pointeurs on fait planter le compilateur (l'application ?), ni si les développeurs des compilateurs ont prévu que les utilisateurs pourraient mettre un nombre de niveaux de pointeurs conséquents.

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par grodwar Voir le message
    ok merci... je pensais qu'on était limité à des pointeurs de pointeurs...
    Il n'y a pas de limitation "théorique"
    Pour les valeurs de retour de fonction, je suis d'accord pour la fonction de création, par contre ce n'est pas possible pour le remplissage.
    mat dans le cas de la fonction de remplissage n'est pas le résultat de la fonction, c'est une donnée initiale dont la fonction a besoin pour travailler. C'est donc typiquement un paramètre.
    Dans le cas de la fonction de création, mat était le résultat de l'action de la fonction.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 03/08/2010, 18h54
  2. Fonction PHP creation thumbnail automatique
    Par accrok dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2009, 11h23
  3. Creation d'une classe Matrice
    Par parisjohn dans le forum Général Python
    Réponses: 1
    Dernier message: 20/07/2007, 17h46
  4. fonction pour creation de zone div
    Par ranell dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 08/04/2007, 19h53
  5. Une fonction de creation de fichier?
    Par zuzur dans le forum C++
    Réponses: 3
    Dernier message: 07/11/2004, 13h10

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