conversion d'un double vers un float[REGLE] [C] - C++ - Programmation
Marsh Posté le 27-05-2003 à 22:58:57
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
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
Marsh Posté le 27-05-2003 à 23:41:44
aurbadguy a écrit : |
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 ...
Marsh Posté le 28-05-2003 à 08:20:51
valretour n'est pas nul car j'arrive a copier la valeur dans valt!!!
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...
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
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