Probleme pour multiplier 2 matrices
Setth
Messages postés
15
Statut
Membre
-
Char Snipeur Messages postés 10112 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 10112 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour tout le monde !
Problême :
Alors voilà, j'ai un probleme de boucle infini...
La fonction que j'essaye de coder est simplement une multiplication de matrice[2][2] ("facile") mais pourtant, pas moyen de sortir de cette satané boucle :
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
/*on calcule la valeur de cet élément en fonction des deux autres matrices*/
buff=0;//initialisation du buffer
for(h=0;h<2;h++)
{
buff = buff + A[i][h] * Px[h][j];
}
printf(" 1 : %d %d %d\n\r",i,j,h);
AP[i][j]=buff;
printf(" 2 : %d %d %d\n\r",i,j,h);
}
}
Mon debug :
Les 2 lignes printf() insérée à la fin on été mises car j'ai pu constater que si je retirait l'afectation de "buff", tout se passait bien.
Et en effet, lors du test du programme, j'ai l'affichage suivant :
1 : 0 1 2
*Affectation de buff*
2 : 0 0 2
Cette affectation remet donc clairement la variable j à 0.
Précision :
Je compile avec PCWHD compiler 4.084 (Picc pour les intimes) avant de charger le programme sur un dsPIC30F4013 et d'afficher les données par liaison RS232 à l'aide d'un MAX233.
Je n'ai aucune interruption.
Merci d'avance pour votre aide.
Problême :
Alors voilà, j'ai un probleme de boucle infini...
La fonction que j'essaye de coder est simplement une multiplication de matrice[2][2] ("facile") mais pourtant, pas moyen de sortir de cette satané boucle :
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
/*on calcule la valeur de cet élément en fonction des deux autres matrices*/
buff=0;//initialisation du buffer
for(h=0;h<2;h++)
{
buff = buff + A[i][h] * Px[h][j];
}
printf(" 1 : %d %d %d\n\r",i,j,h);
AP[i][j]=buff;
printf(" 2 : %d %d %d\n\r",i,j,h);
}
}
Mon debug :
Les 2 lignes printf() insérée à la fin on été mises car j'ai pu constater que si je retirait l'afectation de "buff", tout se passait bien.
Et en effet, lors du test du programme, j'ai l'affichage suivant :
1 : 0 1 2
*Affectation de buff*
2 : 0 0 2
Cette affectation remet donc clairement la variable j à 0.
Précision :
Je compile avec PCWHD compiler 4.084 (Picc pour les intimes) avant de charger le programme sur un dsPIC30F4013 et d'afficher les données par liaison RS232 à l'aide d'un MAX233.
Je n'ai aucune interruption.
Merci d'avance pour votre aide.
A voir également:
- Probleme pour multiplier 2 matrices
- Supercopier 2 - Télécharger - Gestion de fichiers
- 2 ecran pc - Guide
- Gta 6 trailer 2 - Guide
- Faire 2 colonnes sur word - Guide
- Ce-35888-2 - Forum PS4
8 réponses
Et ben !
Là comme ça, à par un problème dans la déclaration des variables je ne vois pas.
Donne nous la déclaration de i,j,h,buff,A,Px,AP.
Ou alors un bug dans le compilateur qui fait que les tableaux à deux dimensions sont mal gérés.
Sort les adresses de j et AP aussi, pour vérifier que j n'est pas dans le tableau.
Là comme ça, à par un problème dans la déclaration des variables je ne vois pas.
Donne nous la déclaration de i,j,h,buff,A,Px,AP.
Ou alors un bug dans le compilateur qui fait que les tableaux à deux dimensions sont mal gérés.
Sort les adresses de j et AP aussi, pour vérifier que j n'est pas dans le tableau.
float buff;
int i,j,h;//Variables de boucle
float A[2][2];
float Px[2][2]; //Estimation de la covariance de l'erreur sur l'angle x
float AP[n][n]; // This is the matrix A*P
Nan, les déclarations de variables sont bonnes....
Et pour les adresses, j est à 2060 et AP[i][j] à 2068.
Il me semble aussi que ça soit le compilateur qui merde...
int i,j,h;//Variables de boucle
float A[2][2];
float Px[2][2]; //Estimation de la covariance de l'erreur sur l'angle x
float AP[n][n]; // This is the matrix A*P
Nan, les déclarations de variables sont bonnes....
Et pour les adresses, j est à 2060 et AP[i][j] à 2068.
Il me semble aussi que ça soit le compilateur qui merde...
AP[i][j] à 2068 n'a pas de sens si on ne connais pas i et j.
en général, il faut connaitre l'adresse de départ : AP[0][0]
ensuite, il faut bien sur avoir les tailles de int et float. en général, c'est 4 et 4 je crois.
Si 'j' a la même adresse que AP[0][1], le problème viens de là, sinon, le compilateur a un bug.
Je suis d'accord avec toi loupious, mais comme le compilateur a l'air un peu exotique, je n'ai pas écarté aussi violemment cette hypothèse.
en général, il faut connaitre l'adresse de départ : AP[0][0]
ensuite, il faut bien sur avoir les tailles de int et float. en général, c'est 4 et 4 je crois.
Si 'j' a la même adresse que AP[0][1], le problème viens de là, sinon, le compilateur a un bug.
Je suis d'accord avec toi loupious, mais comme le compilateur a l'air un peu exotique, je n'ai pas écarté aussi violemment cette hypothèse.
J'ai testé : 'j' n'à pas la même adresse que AP[0][1].
Et le compilateur n'est pas "exotique", c'est juste de la programmation embarquée^^
Et le compilateur n'est pas "exotique", c'est juste de la programmation embarquée^^
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
Je n'aime pas beaucoup cette ligne : float AP[n][n];
Donne la définition de n ?
Car si tu ne spécifies pas à la bonne taille : AP[i][j]=buff; va récrire sur la pile puisque l'esp n'aura pas été décrémenté suffisamment lors de la compilation. Ainsi, il est possible d'avoir des résultats surprenants.
Cdlt
Je n'aime pas beaucoup cette ligne : float AP[n][n];
Donne la définition de n ?
Car si tu ne spécifies pas à la bonne taille : AP[i][j]=buff; va récrire sur la pile puisque l'esp n'aura pas été décrémenté suffisamment lors de la compilation. Ainsi, il est possible d'avoir des résultats surprenants.
Cdlt
Il reste en suspent, que vaut n ?
Mais si AP[0][1] ne vaut pas j, je ne vois pas pourquoi j serais modifier...
Si tu fait :
j=1;
AP[0][1]=buff;
printf( j );
est-ce que j est modifié ?
Mais si AP[0][1] ne vaut pas j, je ne vois pas pourquoi j serais modifier...
Si tu fait :
j=1;
AP[0][1]=buff;
printf( j );
est-ce que j est modifié ?
Donc ta déclaration est propre.
J'ai deux trois idées.
AP[0][1] a des bits en commun avec 'j', auquel cas, il y a vraiment quelque chose qui m'échappe, ou c'est un bug.
j serait une variable utilisé par quelque chose en dessous pour calculer le tableau, et donc le lien se ferai (tu n'aurai pas une autre variable nommé j ?).
Essai de renommer j en autre chose ("variable_j" par exemple).
Essai de déclarer tes variables en static, il y a peut être là encore un problème de porté.
Simplifie au maximum ton programme jusqu'à ce qu'il ne fasse plus que quelques lignes pour faire une espèce de démonstrateur du problème.
J'ai deux trois idées.
AP[0][1] a des bits en commun avec 'j', auquel cas, il y a vraiment quelque chose qui m'échappe, ou c'est un bug.
j serait une variable utilisé par quelque chose en dessous pour calculer le tableau, et donc le lien se ferai (tu n'aurai pas une autre variable nommé j ?).
Essai de renommer j en autre chose ("variable_j" par exemple).
Essai de déclarer tes variables en static, il y a peut être là encore un problème de porté.
Simplifie au maximum ton programme jusqu'à ce qu'il ne fasse plus que quelques lignes pour faire une espèce de démonstrateur du problème.