Rechercher : dans
Par :

Probleme pour multiplier 2 matrices

Dernière réponse le 9 avr 2009 à 16:45:04 Setth, le 9 avr 2009 à 10:59:33 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Probleme pour multiplier 2 matrices » dans :
Concaténer les vecteurs ou les matrices sous Matlab VoirL'opération de concaténation des variables de Matlab consiste à regrouper ces variables dans une seule (vecteur ou matrice). Exemple : |2 3 4| X= |1 2 5| |0 2 7| Avec : |9 6 8| Y= |5 6 2| |3 2 1| Donne...
Représentation des courbes sous Matlab VoirLa fonction plot permet essentiellement de tracer des courbes sous Matlab. Dans cette astuce, nous allons essayer de détailler le fonctionnement de cette commande. Simple utilisation Vecteur Matrice Vecteur en fonction d'un autre Autres...
Les Sims 2 - Solutions et codes VoirAfin de vous aider dans vos recherches de solutions dans ces jeux vidéo, voilà l'adresse de quelques sites web Sites http://www.jeuxvideopc.com/solutions/soluce-6983-les-sims-2.php http://fr.simsland.com/codes/
Télécharger 2+2 VoirL'apprentissage des maths aux tous petits n'est pas chose facile. 2+2 est un programme destiné à initier les enfants au calcul, aux différentes modes de multiplication, d'addition de soustraction et de division. 2+2 propose des exercices attractifs...
Télécharger Microsoft .NET Framework 2.0 (x86) VoirLe package redistribuable de Microsoft .NET Framework 2.0 installe le runtime .NET Framework et les fichiers associés requis pour l'exécution d'applications développées pour le .NET Framework 2.0. Le .NET Framework 2.0 fournit une évolutivité et...
J2EE - Java 2 Enterprise Edition VoirIntroduction au Java Framework Le «Java Framework» (Java 2 Platform) est composé de trois éditions, destinées à des usages différents : J2ME : Java 2 Micro Edition est prévu pour le développement d'applications embarquées, notamment sur des...
Connecteur PS/2 VoirConnecteur PS/2 Le connecteur PS/2 (au format mini-DIN6) est principalement utilisé sur les ordinateur pour la connexion du clavier et de la souris. Brochage Broche Désignation 1 Horloge 2 Masse 3 ...

1

Char Snipeur, le 9 avr 2009 à 11:29:55

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. Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

2

Setth, le 9 avr 2009 à 11:48:57

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...

Répondre à Setth

3

loupius, le 9 avr 2009 à 11:57:45

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' ?

Répondre à loupius

4

Char Snipeur, le 9 avr 2009 à 12:07:54

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. Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

5

Setth, le 9 avr 2009 à 15:26:55

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^^

Répondre à Setth

6

fiddy, le 9 avr 2009 à 15:52:32

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
Google is your friend

Répondre à fiddy

7

Char Snipeur, le 9 avr 2009 à 15:52:44

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é ? Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

8

Setth, le 9 avr 2009 à 16:34:58

Pour n :

#define n 2

Et pour ta question char sniper, oui 'j' est modifié si je fait ça^^

Répondre à Setth

9

 Char Snipeur, le 9 avr 2009 à 16:45:04

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. Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur

Répondre à Char Snipeur