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) ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
Matrice* temp = old; old = curr; curr = next; next = temp; } return 0; }
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.
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.
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)
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++.
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)
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)
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
Merci bien pour l'explication, c'est plus clair pour moi maintenant, et je
m'en suis sorti :)