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 :

matrice d indice negatif


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Par défaut matrice d indice negatif
    Bonjour,
    comment je peut definir une matrice carre mais d indice negatif , ie : A(-M:M,-M:M) (comme en fortran 77)?

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Gie,

    Impossible. En C, le premier indice d'un tableau est 0, pas le choix.

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par feynman Voir le message
    comment je peut definir une matrice carre mais d indice negatif , ie : A(-M:M,-M:M) (comme en fortran 77)?
    Ce genre de manip n'est pas possible en C.

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par feynman Voir le message
    comment je peut definir une matrice carre mais d indice negatif , ie : A(-M:M,-M:M) (comme en fortran 77)?
    Il est possible d'emuler des indices negatifs dans les fonctions appellees en jouant sur le pointeur envoye vers la fonction.
    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
     
    #include <stdio.h>
     
    #define N 10
     
    void init_arr(float *arr, int n)
    {
      int i;
     
      for (i=-2; i<n; i++)
      {
        arr[i] = i*10.0;
      }
    }
     
    void print_arr(float *arr, int n)
    {
      int i;
     
      for (i=-2; i<n; i++)
      {
        printf("arr[%d] = %f\n", i, arr[i]);
      }
    }
     
    int main(void)
    {
      float arr[N+2]; /* to be used as [-2,N] */
     
      init_arr(arr + 2, N);
      print_arr(arr + 2, N);
     
      return 0;
    }
    C'est bien moins souple que le Fortran, mais ca peut faciliter le portage de certains codes.

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Dans le même gout que ce qu'a écrit DaZumba, on peut toujours jouer avec les pointeurs, mais cela comporte toujours une grande par de risque.

    A n'utiliser que si on est sûr de soi, voir plutôt à ne pas utiliser :

    En une dimension
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void test_1d(){
        int i;
        int vecteur[10];
        int *vect = vecteur + 5;
        for (i = 0; i < 10; ++i) {
            vecteur[i] = i;
        }
        for (i = -5; i < 5; ++i) {
            printf("vect[%d] = %d\n", i, vect[i]);
        }
    }
    en deux dimension
    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
    void test_2d(){
        int i,j;
        int matrice[10][10];
        int *matri[10];
        int **mat;
     
        for(i = 0; i < 10; ++i){    
            matr[i] = matrice[i] + 5;
        }
        mat = matrix + 5;
     
        for (i = 0; i < 10; ++i) {
            for (j = 0; j < 10; ++j) {
                matrice[i][j] = i * 10 + j;
            }
        }
     
        for (i = -5; i < 5; ++i) {
            for (j = -5; j < 5; ++j) {
                printf("[%d][%d] = %2d ", i, j, mat[i][j]);
            }
            printf("\n");
        }
    }
    Le comportement des exemples n'est peut-être pas celui des mêmes indices négatifs en Fortran.
    L'indice 0 ne correspond plus au premier élément du tableau, le -1 ne correspond pas à l'avant dernier élément.

  6. #6
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Tu peux également passer par une fonction "tampon" qui est la seule à manipuler la matrice, et qui déplace l'indice fourni d'un offset égal à la taille du tableau divisé par 2 (sans parler des tailles pair/impair).
    Mais c'est très moche .

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/05/2013, 12h49
  2. Réponses: 1
    Dernier message: 25/05/2013, 21h40
  3. Déclaration d'une matrice avec Indice const
    Par Delaready dans le forum C
    Réponses: 3
    Dernier message: 31/01/2013, 19h18
  4. [Débutant] Tableau de matrices et indices
    Par nadsky dans le forum MATLAB
    Réponses: 2
    Dernier message: 03/02/2011, 21h44
  5. Création d'une matrice d'indice
    Par stefsas dans le forum SAS Base
    Réponses: 3
    Dernier message: 30/05/2008, 17h14

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