Bonjour,
comment je peut definir une matrice carre mais d indice negatif , ie : A(-M:M,-M:M) (comme en fortran 77)?
Bonjour,
comment je peut definir une matrice carre mais d indice negatif , ie : A(-M:M,-M:M) (comme en fortran 77)?
Gie,
Impossible. En C, le premier indice d'un tableau est 0, pas le choix.![]()
Il est possible d'emuler des indices negatifs dans les fonctions appellees en jouant sur le pointeur envoye vers la fonction.
C'est bien moins souple que le Fortran, mais ca peut faciliter le portage de certains codes.
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; }
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 dimensionen deux 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]); } }Le comportement des exemples n'est peut-être pas celui des mêmes indices négatifs en Fortran.
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"); } }
L'indice 0 ne correspond plus au premier élément du tableau, le -1 ne correspond pas à l'avant dernier élément.
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.
Partager