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 :

pb fonction retournant un Tableau à double dimension


Sujet :

C

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 30
    Points : 28
    Points
    28
    Par défaut pb fonction retournant un Tableau à double dimension
    Bonsoir tout le monde, ça fait 30 minutes que j'essaye de trouver comment faire pour créer une fonction qui prend un tableau a double dimension en parametre et mmodifie ses valeurs puis le renvoi a double dimension, mais sans succès.


    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
     
    int toto[19][37]={1};
     
    }
     
    int** initialisation(int** cadre){
       int i,j;
    cadre=(int**)malloc(19*sizeof(int*));
    for(i=0;i<19;i++){
    cadre[i]=(int*)malloc(37*sizeof(int));
    for (j=0;j<37;j++)
    cadre[i][j]={0}; // on prend le tableau ne contenant que des 1 et on y met 
    // des 0, juste pour l'exemple
    }
     
    return cadre;
     
    }

    merci pour votre aide.

  2. #2
    Membre régulier Avatar de mikhailo
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 78
    Points : 75
    Points
    75
    Par défaut
    Bonsoir,

    Alors, déjà il y a plusieurs soucis que je vois dans ton code.

    Premièrement, ton main ne retourne rien, alors que ta déclaration suppose qu'il retourne un int: donc il faut mettre un "return 0;" à la fin du main.

    Ensuite, ta façon d'initialiser le tableau "toto" dans le main est bizarre, il serait peut-être plus approprié de le faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i;
    int j;
    int toto[19][37];
     
    for (i = 0; i < 19; i++)
    {
    	for (j = 0; j < 37; j++)
    	{
    		toto[i][j] = 1;
    	}
    }
    Là au moins ton tableau toto ne contiendra effectivement que des 1.

    Ensuite, si tu veux que ta fonction "initialisation" soit appelée, il faut qu'il y ait un appel dans le main, du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toto = initialisation(toto);

    Puis, ta fonction "initialisation" fait aussi des choses bizarres avec ton tableau. Puisqu'il est déjà créé, il suffit de le reremplir avec toujours le même concept qu'avant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int i;
    int j;
     
    for (i = 0; i < 19; i++)
    {
    	for (j = 0; j < 37; j++)
    	{
    		cadre[i][j] = 0;
    	}
    }

    Je ferais ça à peu près comme ceci (j'espère que je ne fais pas de bourde là dedans ^^):
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
     
     
    int** initialisation(int** cadre)
    {
    	int i;
    	int j;
     
    	for (i = 0; i < 19; i++)
    	{
    		for (j = 0; j < 37; j++)
    		{
    			cadre[i][j] = 0;
    		}
    	}
    	return cadre;
    }
     
     
     
     
    int main()
    {
    	int i;
    	int j;
    	int** toto = (int**)malloc(19 * sizeof(int*));
     
    	for (i = 0; i < 19; i++)
    	{
    		toto[i] = (int*)malloc(37 * sizeof(int));
     
    		for (j = 0; j < 37; j++)
    		{
    			toto[i][j] = 1;
    		}
    	}
    	printf("La le tableau toto est rempli de 1\n");
    	printf("par exemple, toto[18][36] = %d\n", toto[18][36]);
     
    	toto = initialisation(toto);
     
    	printf("Et maintenant toto ne contient que des 0\n");
    	printf("par exemple, toto[18][36] = %d\n", toto[18][36]);
     
    	free(toto);
    	return 0;
    }

    Je crois que c'est assez propre comme ça. Et la fonction free() à la fin, c'est pour libérer la mémoire que tu alloues à ton tableau avec malloc(), pour éviter des pertes de celle-ci.
    "Les hommes et les femmes qui, sans bouger de leur bureau ou de leur bibliotheque, sans développer leur puissance corporelle et leurs infinies dimensions, parviennent, par une opération de la conscience, à une tristesse pessimiste qui se pretend lucide ne font que constater, sans le savoir, que toute identification du multiple de la vie à la vacuite de la conscience mène inévitablement à ce pessimisme et cette impuissance."

    extrait de "La fragilité" de Benasayag

  3. #3
    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
    1- le tableau toto ne contient pas que des 1 mais un 1 et des 0

    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int** initialisation(int** cadre)
    {
       int i,j;
       cadre = malloc(19*sizeof(int*));
    Cette dernière instruction va écraser le paramètre cadre qui donc ne sert à rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       cadre = malloc(19*sizeof(int*));
       for(i=0;i<19;i++)
      {
        cadre[i] =  malloc(37*sizeof(int));
        for (j=0;j<37;j++)  cadre[i][j]=0;
       }
    return cadre;
    }
    Il y a là allocation d'un nouveau tableau initialisé à 0 sans aucun rapport avec celui passé en argument.

    3- Si il s'agit d'initialiser un tableau passé en argument (comme toto) :
    cette fonction doit être modifiée
    - Le type de l'argument n'est pas int**. Il est "adresse d'un élément du tableau". Ici les éléments du tableau sont des tableaux de 37 int et la déclaration devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void initialisation( int (*cadre)[37])
    {
       int i,j;
      for(i=0;i<19;i++)
        for (j=0;j<37;j++)
          cadre[i][j]=0;
    }
    Un tel code ne marche que pour des tableaux de 37 int (le 19 peut lui être passé en argument supplémentaire)
    Si on veut pouvoir utiliser la fonction avec des tableaux 2D de int de dimensions variables, on peut procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void initialisation( int * cadre, size_t dim1, size_t dim2)
    {
       int i;
      for(i=0;i<dim1*dim2;i++) cadre[i] = 0;
    }
    L'appel de cette fonction sera alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initialisation(toto[0], 19,37);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 30
    Points : 28
    Points
    28
    Par défaut
    Merci beaucoup les mecs, vous étes trop forts, super bien expliqué, chapeau

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

Discussions similaires

  1. [XL-2010] Fonction Retourner un tableau a double entree
    Par Lnmex dans le forum Excel
    Réponses: 1
    Dernier message: 09/04/2014, 03h03
  2. [TP] Fonction retournant un tableau
    Par molesqualeux dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 07/05/2006, 01h01
  3. PB avec fonction retournant un tableau
    Par T-B dans le forum Langage
    Réponses: 2
    Dernier message: 27/01/2006, 22h01
  4. fonction retournant un tableau
    Par Jero13 dans le forum C
    Réponses: 7
    Dernier message: 22/11/2005, 11h14
  5. [FLASH MX] Tableau à double dimension
    Par totoche dans le forum Flash
    Réponses: 4
    Dernier message: 11/10/2005, 22h04

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