Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pointeurs et tableaux bidimensionnels

3 réponses
Avatar
Eric Bavu [Québec]
Bonjour,

je me penche sur un petit souci que je n'arrive pas à résoudre :

dans un programme en C, j'ai à ma disposition 3 matrices, définies par le
type suivant :

typdef double Matrice[N+2][M+2];

Ces matrices, appelons les MATRICEANCIENNE, MATRICE, et MATRICENOUVELLE,
sont utilisées dans des fonctions auxiliaires de calcul et de modifications
des éléments de ces matrices.

Dans le main, je lance ces fonctions auxiliaires à l'intérieur d'une boucle
for, et j'aimerai qu'à chaque fin de boucle for, MATANCIENNE devienne MAT
et MAT devienne MATNOUVELLE de façon à itérer le calcul.

Plutôt que d'égaliser élément à élément ces matrices, j'aimerais utiliser
des pointeurs pour éviter des opérations lourdes, alors qu'il "suffirait"
de changer l'adresse de MATANCIENNE par celle de MAT et l'adresse de MAT
par celle de MATNOUVELLE, mais je n'arrive pas à faire ça proprement, alors
que mon intuition me dit que ce doit être assez simple (si je change
&MATANCIENNE en &MAT, seul le premier élément de la matrice est changé,
mais tous les autres restent inchangés, contrairement à ce que
j'espérais) ...

Quelqu'un aurait il une idée, sans modifier la structure des autres
fonctions qui travaillent sur les matrices (i.e. que les pointeurs ne
soient qu'un intermédiaire pour échanger les matrices) ?

Merci d'avance !

--
Eric

3 réponses

Avatar
Sylvain
Eric Bavu [Québec] wrote on 12/07/2006 23:17:

typdef double Matrice[N+2][M+2];

j'aimerai qu'à chaque fin de boucle for, MATANCIENNE devienne MAT
et MAT devienne MATNOUVELLE de façon à itérer le calcul.


tu ne peux pas.

ton typedef introduit un type statique de taille fixe. tes variables
déclarés comme "Matrice" sont donc statique et allouées sur la pile à
l'entrée du main.

il faut donc introduire des pointeurs, soit dans la création des
variables donc comme variables auxiliaires transmisses à tes fonctions
de calcul.

par exemple, en supposant, les fct de calcul:

void op1(Matrice* m1, Matrice* m2){}
ou
void op2(Matrice& m1, Matrice& m2){}

(note op2(Matrice m1, Matrice m2){} doit marcher également, le compilo
ne s'amusant pas à dupliquer les gros paramètres)

tu peux faire:

int main()
{
Matrice ancienne, matrice, nouvelle;
Matrice *old = &ancienne;
Matrice *curr = &matrice;
Matrice *next = &nouvelle;

for (;;){
op1(curr, next);
op2(*curr, *next);

Matrice* temp = old;
old = curr;
curr = next;
next = temp;
}
return 0;
}

Sylvain.

Avatar
Stéphane Zuckerman
On Thu, 13 Jul 2006, Sylvain wrote:

il faut donc introduire des pointeurs, soit dans la création des variables
donc comme variables auxiliaires transmisses à tes fonctions de calcul.

par exemple, en supposant, les fct de calcul:

void op1(Matrice* m1, Matrice* m2){}
Oui.

ou
void op2(Matrice& m1, Matrice& m2){}
Là non : ca devient du C++.


int main()
{
Matrice ancienne, matrice, nouvelle;
Matrice *old = &ancienne;
Matrice *curr = &matrice;
Matrice *next = &nouvelle;

for (;;){
op1(curr, next);
op2(*curr, *next);
^^^ ^

Non (même cause, même effet).

Matrice* temp = old;
old = curr;
curr = next;
next = temp;
}
return 0;
}


--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
Eric Bavu [Québec]
Merci bien pour l'explication, c'est plus clair pour moi maintenant, et je
m'en suis sorti :)

Bonne continuation !

--
Eric