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 :

macro pour tableaux


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut macro pour tableaux
    Bonjour à tous,

    J'ai écrit un programme en C dans lequel j'ai mis des macros pour modifier les indices d'un tableau. Mon souci c'est que ça ne fonctionne pas je ne vois pas pourquoi. Pouvez-vous m'aidez à résoudre ce problème s'il vous plait ?
    Voici mon code :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "mex.h"
     
     
    #define  res[i1][j1]  res[i1*col+j1]
    #define  Ibas[i1][j1] Ibas[i1*col+j1]   
    #define  Ihaut[i1][j1] Ihaut[i1*col+j1]
     
        /*#######################************ Programme C hysteresis***********************####################*/
    void hysteresis(double *Ibas,double *Ihaut,double *res,int row, int col)
    {  
            int i1,j1,k,count,MAXITERATION; 
            count = 1; k=0; MAXITERATION = 200;
     
     
    	while ( ( count != 0 ) && k < MAXITERATION )
    	{
                count = 0;
     
                     for(i1=1; i1=row-1;i1++)
                     {
                      for(j1=1; j1=col-1;j1++)
                      {
     
    	             if(res[i1][j1]>0)
    	             {
     
    	 	        if(Ibas[i1-1][j1-1]>0)
    	 	        {
    	 	         res[i1-1][j1-1]=1; count=count + 1;
    	 	         }
     
     	         	if(Ibas[i1-1][j1]>0)
     	         	{
    	 	         res[i1-1][j1]=1; count=count + 1;
    	 		}
     
    	 	      	if(Ibas[i1-1][j1+1]>0)
    	 	      	{
    	 		  res[i1-1][j1+1]=1; count=count + 1;
    	 	 	}
     
    	 	 	if(Ibas[i1][j1-1]>0)
    	 	 	{
    	 	  	 res[i1][j1-1]=1; count=count + 1;
    	 	 	}
     
     
    	 	  	if(Ibas[i1][j1+1]>0)
    	 	  	{
    	 	  	res[i1][j1+1]=1;  count=count + 1;
    	 		}
     
     
     	 	 	if(Ibas[i1+1][j1-1]>0)
     	 	 	{
    	 	  	res[i1+1][j1-1]=1;  count=count + 1;
    	 	 	}
     
     
     		  	if(Ibas[i1+1][j1]>0)
    	 	  	{
    	 	  	res[i1+1][j1]=1;  count=count + 1;
    	 	  	}
     
     
    	 	  	if(Ibas[i1+1][j1+1]>0)
    	 	 	 {
    	 	 	 res[i1+1][j1+1]=1; count=count + 1;
    	 	  	}
     	         }
    		}
                } 
       k = k + 1; }       
    return;
    }
    et voici le message d'erreur de mon compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    hysteresis.c:7:13: attention : blanc d'espacement manquant après le nom de la macro [enabled by default]
    hysteresis.c:8:14: attention : blanc d'espacement manquant après le nom de la macro [enabled by default]
    hysteresis.c:9:15: attention : blanc d'espacement manquant après le nom de la macro [enabled by default]
    hysteresis.c:12:25: erreur: ‘i1’ undeclared here (not in a function)
    hysteresis.c:12:25: erreur: ‘j1’ undeclared here (not in a function)
    hysteresis.c:12:25: erreur: expected ‘;’, ‘,’ or)’ before ‘Ibas’

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Pas sûr que les [ ] soient acceptés comme macros. J'écrirais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define  res(i1,j1)  res[i1*col+j1]

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    Ah ok !!!
    Et vous pensez que res(i1,j1) sera considéré comme un tableau ?
    les indices vont t-il changer en fonction de la boucle ?

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Une macro n'est qu'une équivalence de texte.

    Lorsque tu écris res(i1,j1)=3 par exemple, le compilateur commence par remplacer ce texte par l'équivalent que tu as mis dans le #define. Il lira alors res[i1*col+j1]=3. Ton code sera fonctionnel.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    j'ai essayé mais ça ne fonctionne pas, j'ai le message d'erreurs suivant :
    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
     
    hysteresis.c: In function ‘hysteresis’:
    hysteresis.c:27:25: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:30:25: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:32:22: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:35:26: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:37:22: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:40:24: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:42:16: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:45:17: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:47:15: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:51:18: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:53:14: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:57:20: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:59:16: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:63:20: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:65:16: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:69:20: erreur: subscripted value is neither array nor pointer nor vector
    hysteresis.c:71:16: erreur: subscripted value is neither array nor pointer nor vector
    en fait ce que je veux faire c'est à partir de mon code C créer un Mex-Files pour l'utiliser dans Matlab.
    Le souci c'est que Matlab stock en mémoire les matrices comme des vecteurs. Ca emplique que matlab stock une matrice comme un pointeur sur un double alors que le C c'est un double **. Je ne peux donc pas faire la transition entre une matrice en C et Matlab

    voici mon code en entier :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "mex.h"
     
     
    #define  res[i1][j1]  res[i1*col+j1]
    #define  Iba[i1][j1] Ibas[i1*col+j1]   
    #define  Ihaut[i1][j1] Ihaut[i1*col+j1]
     
        /*#######################************ Programme C hysteresis***********************####################*/
    void hysteresis(double *Ibas,double *Ihaut,double *res,int row, int col)
    {  
            int i1,j1,k,count,MAXITERATION; 
            count = 1; k=0; MAXITERATION = 200;
     
     
    	while ( ( count != 0 ) && k < MAXITERATION )
    	{
                count = 0;
     
                     for(i1=1; i1=row-1;i1++)
                     {
                      for(j1=1; j1=col-1;j1++)
                      {
     
    	             if(res[i1][j1]>0)
    	             {
     
    	 	        if(Ibas[i1-1][j1-1]>0)
    	 	        {
    	 	         res[i1-1][j1-1]=1; count=count + 1;
    	 	         }
     
     	         	if(Ibas[i1-1][j1]>0)
     	         	{
    	 	         res[i1-1][j1]=1; count=count + 1;
    	 		}
     
    	 	      	if(Ibas[i1-1][j1+1]>0)
    	 	      	{
    	 		  res[i1-1][j1+1]=1; count=count + 1;
    	 	 	}
     
    	 	 	if(Ibas[i1][j1-1]>0)
    	 	 	{
    	 	  	 res[i1][j1-1]=1; count=count + 1;
    	 	 	}
     
     
    	 	  	if(Ibas[i1][j1+1]>0)
    	 	  	{
    	 	  	res[i1][j1+1]=1;  count=count + 1;
    	 		}
     
     
     	 	 	if(Ibas[i1+1][j1-1]>0)
     	 	 	{
    	 	  	res[i1+1][j1-1]=1;  count=count + 1;
    	 	 	}
     
     
     		  	if(Ibas[i1+1][j1]>0)
    	 	  	{
    	 	  	res[i1+1][j1]=1;  count=count + 1;
    	 	  	}
     
     
    	 	  	if(Ibas[i1+1][j1+1]>0)
    	 	 	 {
    	 	 	 res[i1+1][j1+1]=1; count=count + 1;
    	 	  	}
     	         }
    		}
                } 
       k = k + 1; }       
    return;
    }
     
     
    /* nrhs nombre de parametre d'entre
      nlhs nombre de parametre de sortie
      prhs tableau de pointeur d'un element en entre
      plhs tableau de pointeur de sortie
    */
    void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
    {
     
       double *IsBas,*IsHaut, *Ihyst; /* Ibas et Ihaut sont les tableau en entre et res tableau en sortie Matlab*/
        int row,col;
     
        /* Check for proper number of inputs */
        if (nrhs < 2)
    	{ mexErrMsgTxt("Not enough input arguments."); }
        else if (nrhs > 2)
          { mexErrMsgTxt("Too many input arguments."); }
     
        /* Check for proper number of outputs */
        if (nlhs < 1)
        { mexErrMsgTxt("Not enough output arguments."); }
        else if (nlhs > 1)
        { mexErrMsgTxt("Too many output arguments."); }
     
     
            /* Get inputs */ 
        row = mxGetM(prhs[0]); 
        col = mxGetN(prhs[0]);
     
        IsBas = mxGetPr(prhs[0]); /* retourne la matrice pointée par prhs[0]*/
        IsHaut = mxGetPr(prhs[1]); 
     
      /* Create a matrix for the return argument. */
      plhs[0] = mxCreateDoubleMatrix(row, col, mxREAL);
      Ihyst = mxGetPr(plhs[0]);
     
        /* main computation */
         hysteresis(IsBas,IsHaut,Ihyst,row,col);
     
    }

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 119
    Par défaut
    Il vaudrait mieux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define  res(i1,j1)  res[(i1)*col+(j1)]
    Tout en remplaçant tous les res[i][j] par res(i,j) dans le reste du code.

    Plus sérieusement écrit directement res(i1*col,j1).
    Si tu veux faire du C, apprend à faire du C, n'essaye pas de le transformer en du matlab.

    D'ailleurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for(i1=1; i1=row-1;i1++)
    n'est certainement pas ce que tu voulais écrire. En C, l'égalité s'écrit == (double égal). Ton code est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(i1=row-1)
    {
    //ta boucle
    }
    C'est à dire une boule infinie (si row!=1) ou bien une boucle dans laquelle on ne passe pas (si row==1)

    Tu voulais probablement écrire

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Voir ma réponse ici

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    Je vois que la modestie n'est pas un de vos points fort (Gulain);

    Je veux coder mon programme Matlab en C car il est courant sur Matlab d'utiliser des routines C ou fortran pour accélérer la vitesse d’exécution d'un programme.

    Je vous remercie de vos réponses cela fonctionne.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 482
    Par défaut
    Citation Envoyé par takout Voir le message
    Je vois que la modestie n'est pas un de vos points fort (Gulain);

    Je veux coder mon programme Matlab en C car il est courant sur Matlab d'utiliser des routines C ou fortran pour accélérer la vitesse d’exécution d'un programme.

    Je vous remercie de vos réponses cela fonctionne.
    Il a malgré tout raison : il ne t'a pas pris de haut en faisant cette réponse, mais a juste essayé de t'expliquer qu'il est important de faire une distinction nette entre les différents langages, spécialement lorsque l'on cherche à les interfacer entre eux.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    Ah ok mais je suis tout à fait contient de cela.
    Mon souci ici c'est que Matlab ne gère pas la mémoire de la même façon que le C. Dans le cas d'un tableau à une dimension il n' y a pas de problème si on veux interfacer les deux langages. Mais quand c'est un tableau à plusieurs dimensions ça devient plus compliqué à interfacer. Si vous avez une solution qui tienne compte du principe que vous avez évoqué je suis tout à fait preneur, moi j'en vois pas à part celle proposée par Dut.
    (le but étant aussi de garder l'esprit en deux dimensions car lorsqu'il faut implémenter des maths ça devient lourd de ce ramener à une dimension à chaque boucle)

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

Discussions similaires

  1. [XL-2003] Problème macro pour appeler valeur dans des tableaux
    Par phnguyen dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/07/2012, 11h24
  2. [WD-2003] Macro pour ajouter/caché des tableaux
    Par sabryluv dans le forum VBA Word
    Réponses: 4
    Dernier message: 16/05/2012, 19h33
  3. macro pour créer plusieurs graphique pour plusieurs tableaux
    Par totau dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 25/08/2011, 02h08
  4. Réponses: 0
    Dernier message: 11/11/2010, 08h30
  5. macro pour comparer 2 tableaux sous word
    Par mrom34 dans le forum VBA Word
    Réponses: 2
    Dernier message: 12/12/2007, 15h40

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