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 :

allouer un tableau a 2 dimensions via une fonction externe


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut allouer un tableau a 2 dimensions via une fonction externe
    bonjour ,
    je souhaite allouer un tableau a 2 dimensions via une fonction externe a main. je dois en fait allouer 2 tableau a une dimension et un a 2 dimensions.
    j'y arrive parfaitement pour les 2 tableau simple mais celui a deux dimensions cela ne va pas et je commence a secher ...

    ici le programme principal , coeff et moyenne sont les tableaux simple et note le tableau 2 dim.
    main()
    {int Netud , Nnote,*coeff;
    float *moyenne , *note ;

    init_tab(&*moyenne,&*coeff,&*note,&Netud, &Nnote);

    affiche(moyenne,coeff,note,Netud,Nnote);
    }

    ici la fonction init_tab ou je demande un nombre d'etudiant que jaffecte a etud , un nombre de note que jaffecte a notes , puis jalloue dynamiquement grace a malloc les tableaux coeff et moy , et j'en fais de meme avec note.
    void init_tab(float *moy,int *coeff,float *note,int *etud, int *notes)
    {int nbetud,nbnote;

    printf("combien y a t'il d'etudiants ?");
    scanf("%d", &nbetud);
    *etud = nbetud;

    printf("combien y a t'il de notes a enregistrer ?");
    scanf("%d", &nbnote);
    *notes = nbnote;

    *&moy= (float*)malloc(nbetud * sizeof (float));
    *&coeff= (int*)malloc(nbnote * sizeof(int));
    *&note= (float*)malloc(nbetud * nbnote * sizeof(float));
    }

    le seul soucis c'est que quand on appelle la fonction affiche pour afficher les trois tableaux on voit bien que le probleme se trouve au niveau du tableau note
    void affiche(float *moy,int *coeff,float *note,int etud,int notes)
    {int i , j ;

    /*premiere ligne du tableau*/
    printf("et. | coefficients \n");

    /*deuxieme ligne du tableau*/
    printf(" | %d",coeff[0]);
    for (i=1;i < notes;i++)
    printf(" | %d",coeff[i]);
    printf(" |moyennes\n");

    /*lignes suivantes*/

    /*numero etudiant*/
    for (i=0;i<etud;i++)
    {printf(" %d |",i);

    /*ses notes*/
    for (j=0;j<notes;j++)
    printf(" %.2f |", *(note + i *notes + j));
    printf("%.2f \n",moy[i]);}
    }
    donc je disais mon probleme doit se situer au niveau de l'allocation dynamique pour note , ou dans son placement en paramète dans init_tab ou quand j'appelle init_tab.

    je sèche totalement . si quelqu'un pourrait m'aider svp..

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Un tableau a deux dimensions est en fait un tableau de tableaux a 1 dimension:
    Pour l'allouer dynamiquement, il faut disposer d'un pointeur double:
    On alloue d'abord le nombre de lignes, puis le nombre de colonnes pour chaque ligne.

    Si l'on souhaite le faire a l'interieur d'une fonction dediee, deux solutions:
    - passer l'adresse du pointeur double:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int my_alloc(double ***arr2d, int dim_1, int dim_2);
    Triple indirection, ca commence a faire beaucoup.

    - faire que la fonction renvoie l'adresse du bloc alloue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double **my_alloc(int dim_1, int dim_2);
    C'est la solution la plus propre.

    Ne pas oublier la serie de free() associes a chaque malloc().

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    désolé , mais je suis encore un peu novice et j'ai pas tout compris

    pourrais tu me dire ici dans mon programme ou je dois modifier (paramètre quand j'apelle init_tab , paramètre de init_tab , ou la ligne ou j'alloue pour note.)

    désolé d'etre aussi mauvais

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Je n'avais pas regarde ta fonction init_tab.
    Pour la construire, tu as choisi la solution secrete numero 3, i.e. representer un tableau a deux-dimensions comme un tableau a 1 dimension (qui est le produit des deux dimensions). C'est aussi ma methode preferee.
    La fin de ta fonction est incorrecte. Un allocation se fait ainsi (en C):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double *arr;
    arr = malloc(n * sizeof *arr);
    Ainsi, la fin de ta fonction doit donc ressembler a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    moy= malloc(nbetud * sizeof *moy);
    coeff= malloc(nbnote * sizeof *coeff);
    note= malloc(nbetud * nbnote * sizeof *note);
    If est IMPERATIF de verifier que moy, coeff et note ne sont pas NULL (echec de l'allocation) avant de les utiliser. Il faudra egalement les liberer avant le retour de main().
    Egalement, mais ce sera pour plus tard, scanf() est une fonction d'entree difficile a utiliser. Il faudra penser a construire un systeme plus robuste.

    EDIT: l'appel a ta fonction est egalement incorrect (au passage, verifie que tu compiles en C (fichier d'extension.c) et non en C++).
    L'appel devrait etre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    float *moyenne;
    int *coeff;
    float *notes;
    int nb_etud;
    int notes;
     
    init_tab(moyenne, coeff, notes, &Netud, &Nnote);
    EDIT: informations erronees corrigees ci-dessous (passage par valeur non pris en compte).

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    j'ai effectué les corrections que tu m'a recommandé et j'en suis toujours au meme point .

    mais je n'ai pas vérifier si coeff moy et note sont NULL. je dois le faire dans main juste après l'appel a init_tab ou dans init_tab après les allocations ?

    euh et que veut dire il "faudra les liberer avant le retour de main() " ?

  6. #6
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    vérifie si coeff moy et note sont NULL après chaque allocation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    malloc()
    if(coeff==NULL) /*raler*/ exit(0);
    malloc()
    if()
    euh et que veut dire il "faudra les liberer avant le retour de main() " ?
    lorsque l'on n'a plus besoin de l'espace-mémoire alloué dynamiquement , on libère cette espace
    Cela ce fait avec l'instruction free() , mais dans ton cas, je pense que totalement à l'encontre de ce que tu veux faire, car tes tableaux ne seraient plus alloués après l'initialisation.

    mais je ne suis pas sûr
    Wer nicht probiert, verliert !!

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    j'en suis toujours strictement au meme point

    qu'est ce qui cloche ?

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Il faudrait que j'arrete de repondre aux questions de ce forum, je ne suis pas en forme en ce moment.
    Le passage de parametres en C se fait par valeur. Il est donc necessaire, si l'on souhaite modifier un parametre, de passer l'adresse de celui-ci. Pour un pointeur, ce sera donc un double pointeur (comme j'expliquais dans mon premier post).
    Donc:
    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
     
    int init_tab(float **moy,int **coeff, float **note,int *etud, int *notes)
    {
      float *l_moy;
       ...
      l_moy = malloc(nbetud * sizeof *l_moy);
      if(l_moy == NULL)
      {
           /* erreur */
           return -1;
      }
      *moy = l_moy;
      ...
      return 0;
    }
    De la meme facon pour les autres allocations. L'appel a la fonction se fait ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    float *moyenne;
    ...
    ret = init_tab(&moyenne, &coeff, &note,&Netud, &Nnote);

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    merci !!!!!!

    franchement merci j'arrive a comprendre ce qui ne fonctionnait pas !!

    merci encore de m'avoir aider et d'avoir eu de la patience pour moi

Discussions similaires

  1. Remplir 2 tableaux via une fonction booléenne filtrant sur un tableau
    Par Elvaiz dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 31/03/2013, 16h06
  2. Comment passer un tableau à deux dimensions dans une fonction
    Par Niko_de_bordo dans le forum Débuter
    Réponses: 2
    Dernier message: 02/07/2009, 15h15
  3. Réponses: 2
    Dernier message: 19/03/2009, 23h23
  4. tableau d'images affichées via une servlet
    Par lemfi dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 29/08/2008, 08h45
  5. Réponses: 7
    Dernier message: 30/01/2007, 09h48

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