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   -
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.
Configuration: Windows XP
Opera 9.64

8 réponses

  1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  2. Setth Messages postés 11 Date d'inscription   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
    1. 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
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  4. Setth Messages postés 11 Date d'inscription   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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. fiddy Messages postés 441 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
  7. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  8. Setth Messages postés 11 Date d'inscription   Statut Membre
     
    Pour n :

    #define n 2

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