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   -
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.
A voir également:

8 réponses

Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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.
0
Setth Messages postés 15 Statut Membre
 
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...
0
loupius
 
Facile de dire que le compilateur a tort; c'est excessivement rare ! Et peut-être encore moins souvent ;-)
float AP[n][n];
Que vaut 'n' ?
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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.
0
Setth Messages postés 15 Statut Membre
 
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^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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é ?
0
Setth Messages postés 15 Statut Membre
 
Pour n :

#define n 2

Et pour ta question char sniper, oui 'j' est modifié si je fait ça^^
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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.
0