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 :

Passage d'un tableau à deux dimensions


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut Passage d'un tableau à deux dimensions
    Bonjour à tous,

    J'ai besoin de faire une fonction qui prend un tableau à deux dimensions comme paramètre. Dans le test ci-dessous, je remplis (puis affiche) les éléments du tableau avec le chiffre 8 dans la fonction. Mais quand je reviens dans le main, après l'appel de la fonction le tableau est rempli de 0. Pourtant je passe bien un pointeur par paramètre (En l'occurence : &tab[0][0])). Si quelqu'un a une idée, merci beaucoup...

    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
     
    void mafonc(float* tab); 
     
    void main()
    {
    	int i,j;
    	float tab[3][3];
    	mafonc(&tab[0][0]);
     
    	for(i=0;i<3;i++)
    	{
    		for(j=0;j<3;j++)
    		{
    		printf("%f \n",tab[i,j]);
    		}
    	}
    }
     
    void mafonc(float* tab)
    {
    	int i = 0;
    	int j = 0;
    	for(i=0;i<3;i++)
    	{
    		for(j=0;j<3;j++)
    		{
    		tab[i,j]=8;
    		printf("%f \n",tab[i,j]);
    		}
    	}
    }
    Guilhem.

  2. #2
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    C'est a cause du tab[i,j] : en C, ca n'existe pas. Ou plutot pas comme ca. L'expression i,j va evaluer i (ici c'est pas dur), evaluer j et renvoyer j.

    Si tu avais compiler avec les Warnings aux maximum (-Wall sous gcc) tu aurrais surement eu des messages:
    Citation Envoyé par gcc -Wall -c guilhem.c
    guilhem.c:6: warning: return type of `main' is not `int'
    guilhem.c: In function `main':
    guilhem.c:15: warning: left-hand operand of comma expression has no effect
    guilhem.c:15: warning: double format, pointer arg (arg 2)
    guilhem.c: In function `mafonc':
    guilhem.c:28: warning: left-hand operand of comma expression has no effect
    guilhem.c:29: warning: left-hand operand of comma expression has no effect
    Un tableau a 2 dimension s'utilise de la maniere suivante :
    Sinon, pour ta fonction mafonc, soit tu dis que c'est un float *, et il faut alors calculer toi-meme les vrai indice. Car ton tableau d'orgine est de dimension 2, donc tab[i+3*j].
    Soit, tu dis que c'est un tableau a 2 dimensions : float tab[3][3] (la premiere dimension est falcultative), et la tu peux utiliser normalement tab[i][j], et lors de l'appel, faire uniquement mafonc(tab).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Merci pour ta réponse détaillée.

    Je suis en train de transcrire un programme Fortran vers du C. La solution du calcul des vrais indices (style ) serait donc pénible pour moi car il faudrait que je change carrément des portions de code. Je vais donc tenter la deuxième solution que tu m'as proposée.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Ok, merci pour tout D[r]eadLock, ca va m'épargner des lignes et des lignes de conversion Fortran-> C .

    Pour ceux que ca intéressent, voilà une des solutions proposées par D[r]eadLock implémentée :

    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
     
    void mafonc(float tab[3][3]); 
     
    void main()
    {
    	int i,j;
    	float tab[3][3];
    	mafonc(tab);
     
    	for(i=0;i<3;i++)
    	{
    		for(j=0;j<3;j++)
    		{
    		printf("%f \n",tab[i][j]);
    		}
    	}
    }
     
    void mafonc(float tab[3][3])
    {
    	int i = 0;
    	int j = 0;
    	for(i=0;i<3;i++)
    	{
    		for(j=0;j<3;j++)
    		{
    		tab[i][j]=8;
    		printf("%f \n",tab[i][j]);
    		}
    	}
    }

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

Discussions similaires

  1. [JNI] passage d'un tableau à 2 dimensions à une méthod nativ
    Par mmathieu dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 09/02/2007, 18h52
  2. Passage de tableau à deux dimensions dans une session
    Par keumlebarbare dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 28/11/2006, 18h42
  3. Affichage d'un tableau à deux dimensions.
    Par Allan dans le forum C
    Réponses: 3
    Dernier message: 11/12/2005, 18h29
  4. Réponses: 1
    Dernier message: 18/11/2005, 11h38
  5. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38

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