Probleme pour multiplier 2 matrices
Setth
Messages postés
11
Date d'inscription
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.
Configuration: Windows XP Opera 9.64
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. -
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... -
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. -
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^^ -
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 -
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é ? -
Pour n :
#define n 2
Et pour ta question char sniper, oui 'j' est modifié si je fait ça^^ -
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.