problème de compilation

problème de compilation - C++ - Programmation

Marsh Posté le 25-08-2014 à 12:09:25    

Bonjour tous le monde,
 
voila j'ai un petit problème de compilation,
j'ai fait une fonction pour calculer une loi log normale,et j'appelle cette fonction dans mon programme principal.
lors de l'exécution il m'affiche une fenêtre en me disant  que le programme à cesser de fonctionner.
mon erreur s'affiche à ce niveau:

Code :
  1. for (int i=0;i<lines;++i)
  2.      {
  3.        for (int j=0;j<lines;++j)
  4.         {
  5.           mat[i][j]=LognorDist(t1[j], t2[i], mu_y1[j], mu_y2[i], segma_y1[j], segma_y2[i], rho1, lines);
  6.           cout<<mat[i][j];
  7.         }
  8.      }


 
les déclarations sont les suivantes:
 

Code :
  1. vector<vector<double> > mat;
  2. vector<double> t1, t2, mu_t1, mu_t2, segma_t1, segma_t2,mu_y1,mu_y2,segma_y1,segma_y2, rho; //Y1=ln ( t1),Y2=ln ( X2)


 
je travaille avec des vecteurs  et je veux récuperer le résultat dans une matrice de 36X36.
 
le soucis c'est que quand je fait une commande pour récupérer un vecteur 36X1 ça marche mais pas une matrice!!!
 
SVP pourriez vous m'aider et m'orienter vers l'erreur commise?!
 
Je programme sous code blocks.
 
Merci d'avance


---------------
etudoc
Reply

Marsh Posté le 25-08-2014 à 12:09:25   

Reply

Marsh Posté le 25-08-2014 à 13:26:26    

ce n'est pas une erreur de compilation si ton programme plante à l'exécution.

 

Tu dois probablement utiliser un index trop grand pour ton tableau àdeux dimensions.
Es-tu sur d'avoir bien redmiensionné mat et chaque mat[i] aussi ?

 

Edit : accessoirement, un vector<vector<>> pour une simple matrice, c'est pas top.
Edit2 : tu vas de 0 à lines dans tes deux boucles, tu es sr que ca ne devrait pas être columns pour l'un des deux ?


Message édité par theshockwave le 25-08-2014 à 13:27:20

---------------
last.fm
Reply

Marsh Posté le 25-08-2014 à 13:39:35    

puisque j'utilise le même nombre de colonnes et de ligne, j'ai fait directement lines (avec lines=36) c'est pour cette raison j’utilise le même indice

Reply

Marsh Posté le 25-08-2014 à 13:45:15    

tu a totalement raison c'est un problème de dimension car je fait debug, il me mentionne une erreur de size au niveau de mat.
mais je vois pas bien l'erreur car pour moi la déclaration que j'ai faite est logique.
chaque mat[i] est de dimension 36X1, donc je dois avoir une matrice mat de dimension 36x36!!non!!??

Reply

Marsh Posté le 25-08-2014 à 13:50:00    

Montre-nous donc comment tu initialises tes matrices.

 

Edit : note que n'importe quel autre accès en dehors des limites des tableaux pourrait avoir le même effet (je pense à tes "t1[j], t2[i], mu_y1[j], mu_y2[i], segma_y1[j], segma_y2[i]" )

Message cité 1 fois
Message édité par theshockwave le 25-08-2014 à 13:53:37

---------------
last.fm
Reply

Marsh Posté le 25-08-2014 à 13:59:01    

theshockwave a écrit :

Montre-nous donc comment tu initialises tes matrices.
 
Edit : note que n'importe quel autre accès en dehors des limites des tableaux pourrait avoir le même effet (je pense à tes "t1[j], t2[i], mu_y1[j], mu_y2[i], segma_y1[j], segma_y2[i]" )


 
dans mon programme j'utilise mes vecteurs et ma matrice comme variables globaux, donc je les déclare directement comme suit:

Code :
  1. vector<vector<double> > mat;
  2. vector<double> t1, t2, mu_t1, mu_t2, segma_t1, segma_t2,mu_y1,mu_y2,segma_y1,segma_y2, rho; //Y1=ln ( t1),Y2=ln ( X2)


 
Est ce que j'ai raté quelque chose??
 
et pour les vecteurs je les récupère directement d'une sous fonction que j'ai deja programmé

Code :
  1. for(int i = 0; i < lines; i++)
  2.     {
  3.         t1.push_back(matrix [i][4]);
  4.         t2.push_back(matrix [i][5]);
  5.         mu_t1.push_back(matrix [i][10]);
  6.         mu_t2.push_back(matrix [i][11]);
  7.         segma_t1.push_back(matrix [i][12]);
  8.         segma_t2.push_back(matrix [i][13]);
  9.         cout<<t1[i]<<"\t"<<t2[i]<<"\t"<<mu_t1[i]<<"\t"<<mu_t2[i]<<"\t"<<segma_t1[i]<<"\t"<<segma_t2[i]<<"\n";
  10.     }


et pour les segma_y et mu_y sont calculés en fonction de segma_t et mu_t comme suit:

Code :
  1. for (int i=0;i<lines;i++)
  2.     {
  3.        segma_y1.push_back(sqrt(log(1+(pow(segma_t1[i],2)/pow(mu_t1[i],2)))));
  4.        mu_y1.push_back(log(mu_t1[i])-(pow(segma_y1[i],2)/2));
  5.        segma_y2.push_back(sqrt(log(1+(pow(segma_t2[i],2)/pow(mu_t2[i],2)))));
  6.        mu_y2.push_back(log(mu_t2[i])-(pow(segma_y2[i],2)/2));
  7.        cout<<segma_y1[i]<<" \t "<<mu_y1[i]<<" \t "<<segma_y2[i]<<" \t "<<mu_y2[i]<<"\n";
  8.     }


Message édité par etudoc le 25-08-2014 à 14:09:36

---------------
etudoc
Reply

Marsh Posté le 25-08-2014 à 14:05:23    

Oui, comment ton vecteur sait-il quelle taille il doit faire ?

 

Par défaut, ton vecteur a une taille nulle. Tenter d'accéder à l'un de ses éléments via l'opérateur [] est une erreur. Tu dois le redimensionner, par exemple, comme ca :

 
Code :
  1. vector<vector<double> > mat( lines, vector<double>( lines ) );
  2. vector<double> t1, t2, mu_t1, mu_t2, segma_t1, segma_t2,mu_y1,mu_y2,segma_y1,segma_y2, rho; //Y1=ln ( t1),Y2=ln ( X2)
 

Attention à tes autres vecteurs aussi (si tu les remplis avec des push_back, tout se passera bien)

 

(Edit : typo)

Message cité 1 fois
Message édité par theshockwave le 25-08-2014 à 14:06:36

---------------
last.fm
Reply

Marsh Posté le 25-08-2014 à 14:19:13    

theshockwave a écrit :

Oui, comment ton vecteur sait-il quelle taille il doit faire ?
 
Par défaut, ton vecteur a une taille nulle. Tenter d'accéder à l'un de ses éléments via l'opérateur [] est une erreur. Tu dois le redimensionner, par exemple, comme ca :
 

Code :
  1. vector<vector<double> > mat( lines, vector<double>( lines ) );
  2. vector<double> t1, t2, mu_t1, mu_t2, segma_t1, segma_t2,mu_y1,mu_y2,segma_y1,segma_y2, rho; //Y1=ln ( t1),Y2=ln ( X2)


 
Attention à tes autres vecteurs aussi (si tu les remplis avec des push_back, tout se passera bien)
 
(Edit : typo)


 
 
Un GRAND MERCII theshockwave, le problème est résolu; en mettant

Code :
  1. vector<vector<double> > mat( lines, vector<double>( lines ) );

.
merci beaucoup.


---------------
etudoc
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed