[C] conversion d'un double vers un float[REGLE]

conversion d'un double vers un float[REGLE] [C] - C++ - Programmation

Marsh Posté le 27-05-2003 à 22:27:08    

voila mon problème dans une semaine je rend mon projet  
et j'ai une erreur car j'ai une fonction ( resolution de gauss) qui tourne avec des doubles (avec des float je pe pas effectuer certaines opérations)  
et j'ai besion de le passer en float donc je fais un cast du genre:  
blabla =(float) blablabla;
 
pour la suite de mon prog (si je met des double de partous ca génère d'autres erreurs du je pense a la mémoire)  
donc si qqun sait comment effectués cette conversion sans générer un superbe message d'erreur a l'execution (write of adress) il me sauvra la vie et mon projet  
merci d'avance


Message édité par aurbadguy le 28-05-2003 à 20:19:15
Reply

Marsh Posté le 27-05-2003 à 22:27:08   

Reply

Marsh Posté le 27-05-2003 à 22:58:57    

:heink:
 
le cast ne génère pas d'erreurs en lui-même ...
 
Edit :
A la limite, j'imagine qu'on compilo pourrait donner un warning pour signaler la perte de précision occasionnée, mais sinon, je ne vois pas trop ...
Donne voir les messages d'erreurs entiers et les lignes de code concernées ... Ce sera plus facile pour t'aider


Message édité par theshockwave le 27-05-2003 à 22:59:58

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

Marsh Posté le 27-05-2003 à 23:35:50    

/*---------------------------------------------------------------------------*/
/*                       Calcule de l'ifs perso                              */
/*---------------------------------------------------------------------------*/
 
 
int calculifs (POINT tab[])
{
float valx[3],valy[3],valtransforme[3],valretour1[3];
int testok;
float val1=123.123,val2,val3,val4,val5,val6;
double valt;
 
 valx[0]=400;
 valy[0]=200;
 valx[1]=300;
 valy[1]=300;
 valx[2]=500;
 valy[2]=300;
 
   valtransforme[0]=tab[0].x;
   valtransforme[1]=tab[1].x;
   valtransforme[2]=tab[2].x;
 
   testok=resolutionifs(valx,valy,valtransforme,valretour1);
   if(testok==-1)
   {
    return (-1);
   }
 
 
    if(compteurifsperso==0)
   {
    valt=valretour1[0];  //ici ca plante pas
     val1=valretour1[0];   // mais ici ca plante !!!!
      ifsperso1[0]=val1;
    ifsperso1[1]=valretour1[1];
    ifsperso1[4]=valretour1[2];
   }
    if(compteurifsperso==1)
   {
     ifsperso2[0]=valretour1[0];
    ifsperso2[1]=valretour1[1];
    ifsperso2[4]=valretour1[2];
   }
    if(compteurifsperso==2)
   {
     ifsperso3[0]=valretour1[0];
    ifsperso3[1]=valretour1[1];
    ifsperso3[4]=valretour1[2];
   }
    if(compteurifsperso==3)
   {
     ifsperso4[0]=valretour1[0];
    ifsperso4[1]=valretour1[1];
    ifsperso4[4]=valretour1[2];
   }
   valtransforme[0]=tab[0].y;
   valtransforme[1]=tab[1].y;
   valtransforme[2]=tab[2].y;
 
   testok=resolutionifs(valx,valy,valtransforme,valretour1);
    if(testok==-1)
   {
    return (-1);
   }
 
    if(compteurifsperso==0)
   {
     ifsperso1[2]=valretour1[0];
    ifsperso1[2]=valretour1[1];
    ifsperso1[5]=valretour1[2];
   }
   {
     ifsperso2[2]=valretour1[0];
    ifsperso2[2]=valretour1[1];
    ifsperso2[5]=valretour1[2];
   }
   {
     ifsperso3[2]=valretour1[0];
    ifsperso3[2]=valretour1[1];
    ifsperso3[5]=valretour1[2];
   }
   {
     ifsperso4[2]=valretour1[0];
    ifsperso4[2]=valretour1[1];
    ifsperso4[5]=valretour1[2];
   }
   return(0);
}
 
 
 
 
 
 
 
 
/*---------------------------------------------------------------------------*/
/*                       Résolution de l'équation pour l'ifs perso           */
/*---------------------------------------------------------------------------*/
int resolutionifs(float valx[],float valy[],float valtransforme[],float *valretour)
//valx contient les abcisses des 3 points d'origine
//valy contient les ordonnées des 3 points d'origine
//valtransforme contient une fois les abcisses des 3 nouveaux points
//                       et une autre les ordonnées des 3 nouveaux points
// la fontion gauss ne gère pas  les coefficients égals à 0.
{
 int n=3,j,k,test=0;
 double matrice[4][3];
 double resultat[10];
   double temp,det;
 int a,x;
   int ligne,sol;
 
 //Saisi des facteurs des equations ds matrice[][]
 
 
 
   while(test==0)
   {
 
      matrice[0][0]=(double)valx[0];
      matrice[0][1]=(double)valx[1];
      matrice[0][2]=(double)valx[2];
      matrice[1][0]=(double)valy[0];
      matrice[1][1]=(double)valy[1];
      matrice[1][2]=(double)valy[2];
      matrice[2][0]=(double)1;
      matrice[2][1]=(double)1;
      matrice[2][2]=(double)1;
      matrice[3][0]=(double)valtransforme[0];
      matrice[3][1]=(double)valtransforme[1];
      matrice[3][2]=(double)valtransforme[2];
 
 
 
    //calcul du derterminant
     det=(matrice[0][0]*matrice[1][1]*matrice[2][2])+(matrice[0][1]*matrice[1][2]*\
     matrice[2][0])+(matrice[0][2]*matrice[1][0]*matrice[2][1])-(matrice[0][2]*\
     matrice[1][1]*matrice[2][0])-(matrice[1][2]*matrice[2][1]*matrice[0][0])-\
     (matrice[2][2]*matrice[0][1]*matrice[1][0]);
     printf("le determinant de la matrice vaut : %.0f \n",det);
     getch();
      if( det!=0.0)
      {
       test=1;
      }
      else
      {
           return (-1) ;
      }
 
    }
 
 
   // triangulation du systeme.
   for(x=0;x<n-1;x++)
 {
  for(a=1+x;a<n;a++)
  {
   temp=matrice[x][a];
 
   for (k=x;k<n+1;k++)
   {
    matrice[k][a]=matrice[k][a]*matrice[x][x]-matrice[k][x]*temp;
   }
  }
 }
   //Remplacage et résolution
 resultat[n-1]=matrice[n][n-1]/matrice[n-1][n-1];
 
 matrice[n][n-1]=0;
 matrice[n-1][n-1]=0;
 
 for (ligne=1;ligne<=n;ligne++)
 {
  for (sol=2;sol<=n;sol++)
  {
   matrice[n-ligne][n-sol]=matrice[n-ligne][n-sol]*resultat[n-ligne];
   matrice[n][n-sol]=matrice[n][n-sol]-matrice[n-ligne][n-sol];
   matrice[n-ligne][n-sol]=0;
  }
  resultat[n-(ligne+1)]=matrice[n][n-(ligne+1)]/matrice[n-(ligne+1)][n-(ligne+1)];
 }
 
 // Copie des résultats
 for (j=0;j<n;j++)
 {
  valretour[j]=(float)(resultat[j]);  //la je fais le cast  et ca passe !!                
 }
 return 0;
}
/*---------------------------------------------------------------------------*/
/*                       Résolution de l'équation pour l'ifs perso           */
/*                                      FIN                                  */
/*---------------------------------------------------------------------------*/
 
 
l'erreur exat est :
Fault: access violation at 0x402f96: read of address 0x0
 
 
ifsperso1,2,3 et 4 sont declarés en globale
tableau de float

Reply

Marsh Posté le 27-05-2003 à 23:41:44    

aurbadguy a écrit :


l'erreur exat est :
Fault: access violation at 0x402f96: read of address 0x0


 
:o Tu cherches à lire un élément à l'adresse 0 (NULL quoi ...)
 
L'erreur ne vient pas des casts ... Je lis ton code et je t'en reparle après ...
 
Edit : le plus simple serait qd même que tu fasses un peu de debug pour aller jusqu'à la zone où se déclenche l'erreur en pas à pas et en observant les valeurs de tes pointeurs ...
 
Edit 2 : Vérifie que valretour n'est pas NULL ... pareil pour tes tableaux en entrée ...


Message édité par theshockwave le 27-05-2003 à 23:50:48

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

Marsh Posté le 28-05-2003 à 08:20:51    

valretour n'est pas nul car j'arrive a copier la valeur dans valt!!!

Reply

Marsh Posté le 28-05-2003 à 08:58:27    

Quitte à avoir une fonction qui prend un float *, passe-lui plutot un float * qu'un tableau de float, pour voir...

Reply

Marsh Posté le 28-05-2003 à 20:17:46    

bon je comprend pas pkoi mais je viens d'essayer de remetre gauss en float  
.
.
.
.
ET CA MARCHE !!!!
merci a toutes les personnes qui mon repondu

Reply

Sujets relatifs:

Leave a Replay

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