Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

résultat différent sous OS

1 réponse
Avatar
vinncegoogle
désolé pour les autres de n'avoir pas été suffisemment précis ;

quand je dis nickel, cela signifie notamment que le code fnctionne
comme je l'entends.
il lit dans un fichier des données en lf puis casté en double.

affichage windows : ligne 999 valeur du Zx(i) :
451232335656000000000000......000000000.00

alors que sous linux :
ligne 999 valeur du Zx(i) : 573.00
ligne 999 valeur du volume : 53.00
ligne 999 valeur du poids : 93.00

(note : voir plus bas pour le code : Zxi est la variable c, volume et
poids sont a[i][0] et a[i][1], par contre, sous windows, le n ou le m
s'affiche correctement. )

le printf est :
printf("\n Pour cette instance :");
printf("\n nombre de contraintes : %d",pKnapsack->m);
printf("\n nombre de variables : %d\n\n",pKnapsack->n);

for (i=0;i<2;i++)
{
printf("\n ligne %4d valeur du Zx(i) :
%.2f",i,pKnapsack->c[i]);
printf("\n ligne %4d valeur du volume :
%.2f",i,pKnapsack->a[0][i]);
printf("\n ligne %4d valeur du poids :
%.2f",i,pKnapsack->a[1][i]);
printf(".....\n");


sous w2000, la version de devc++ est 4.9.9.0, muni de son compilo
MingW32 gcc-lib 3.3.1 alors que sous linux (suse), c'est gcc
3.3.2003266

concernant le petit programme, voila les résultats au taf :

sous windows :
affichage :
0.000000 est codu f9 0f 49 40 (noté la présence à l'affichage du
accent aigu sur le u de codé ...)

sous linux, en revanche, pas de pb : j'ai bien la strcit même réponse
que toi.

tout ça me laisse bien dubitatif....

Vicnent


la fonction de lecture :
void lect_don_knapsack(TKnapsack *pKnapsack , char fich_knapsack[] )
{
int i , j , n , m ;
long ilire ;
char mess[30] ;
FILE *adres_data ;
double flire ;
double *c, **a , *b , *x ,*xinf , *xsup ;


adres_data = fopen( fich_knapsack , "r" ) ;

if( adres_data == NULL ) {
puts( "Failure : cannot open the file " ) ;
puts( "Sorry, I have to quit ! " ) ;
puts( "Goodbye for now and have a nice day. " ) ;
exit( 1 ) ;
}

/*--- Nombre de variables ---*/
fscanf( adres_data , "%ld" , &ilire ) ;
n = (int) ilire ;
if( pKnapsack->n != n ) {
printf( "!!! ATTENTION !!! dim <> dim_lue ??? \n" ) ;
exit( 1 ) ;
}

/*--- Nombre de contraintes ---*/
fscanf( adres_data , "%ld" , &ilire ) ;
m = (int) ilire ;

/*--- Allocation dynamique ---*/
c = (double *) calloc( n , sizeof(double) ) ;
a = (double **) calloc( m , sizeof(double) ) ;
for( i = 0 ; i < m ; i++ )
a[i] = (double *) calloc( n , sizeof(double) ) ;
b = (double *) calloc( m , sizeof(double) ) ;
x = (double *) calloc( n , sizeof(double) ) ;
xinf = (double *) calloc( n , sizeof(double) ) ;
xsup = (double *) calloc( n , sizeof(double) ) ;


/* lecture des donnees */
for( j = 0 ; j < n ; j++ ) {
fscanf( adres_data , "%lf" , &flire ) ; /* vecteur objectif :
c(j) */
c[j] = (double) flire ;
for( i = 0 ; i < m ; i++ ) { /* matrice contraintes :
A = a(i)(j) */
fscanf( adres_data , "%lf" , &flire ) ;
a[i][j] = (double) flire ;
}
}
for( i = 0 ; i < m ; i++ ) {
/* 2nd membre des contraintes : b(i) = TAUX*sum_aj */
fscanf( adres_data, "%lf" , &flire ) ;
b[i] = (double) flire ;
}

fclose( adres_data ) ;

pKnapsack->n = n ;
pKnapsack->m = m ;
pKnapsack->c = c ;
pKnapsack->a = a ;
pKnapsack->b = b ;
pKnapsack->v = 0.0 ;
pKnapsack->x = xinf ;
pKnapsack->vrelax = 1000000.0 ;
pKnapsack->xrelax = xsup ;
pKnapsack->iRelax = 0 ;
pKnapsack->iNonRelax = 1 ;
pKnapsack->uLag = 0.0 ;
pKnapsack->grad = 0.0 ;

return ;
}

avec :

typedef struct {
int n ; /* nombre de variables */
int m ; /* nombre de contraintes */
double *c ; /* vecteur numerateur */
double **a ; /* matrice des contraintes */
double *b ; /* vecteur second membre des contrantes */
double *x ; /* vecteur solution optimale réalisable */
double v ; /*valeur opt du pb */
double *xrelax ; /* vecteur meilleure solution relaxation */
double vrelax ; /* valeur de la meilleure solution relaxation */
double gap ; /* ecart relatif : ( vsup - vinf ) / vinf */
int iRelax ; /* indice de la contrainte relaxee */
int iNonRelax ; /* indice de la contrainte non relaxee */
double uLag ; /* vecteur multiplicateurs de lagrange */
double grad ; /* b-axsup : gradient de la meilleure
relaxation */
} TKnapsack ;

1 réponse

Avatar
Antoine Leca
En , Vicnent va escriure:
désolé pour les autres de n'avoir pas été suffisemment précis ;

il lit dans un fichier des données en lf puis casté en double.


Le transtypage est inutile (mais ce n'est pas nuisible en soit): scanf("%lf"
range déjà un double.

Par contre on considère généralement qu'il est bien programmé de vérifier si
un appel de fonction de bibliothèque s'est passé correctement ou pas. Avec
scanf, vues les difficultés de cette fonction, cela devient presque une
obligation.


affichage windows : ligne 999 valeur du Zx(i) :
451232335656000000000000......000000000.00


Tu as (plus de) 1000 « contraintes », et cela ne saute que sur la dernière
(ou à partir de 999e) ? tu ne crois pas que ce serait intéressant à examiner
de plus près ? Par exemple, quelles sont les valeurs de la 998e ligne, celle
juste avant le dérapage ?

En général, il y a BEAUCOUP plus de problèmes avec scanf qu'avec printf.
Simplement, tant que tu n'as pas fait de printf, tu ne peux pas t'apercevoir
si quelque chose a dérapé...

Essaye d'insérer un petit test de vraissemblance après les scanf. Genre

fscanf( adres_data , "%lf" , &flire ) ; /* c(j) */

if( flire < 0.0 || flire > 1e10 )
printf"Bizarre... pour j=%i, j'ai lu c[j]=%gn", j, flire);

c[j] = (double) flire ;

Devrait être instructif...


sous w2000, la version de devc++ est 4.9.9.0, muni de son compilo
MingW32 gcc-lib 3.3.1 alors que sous linux (suse), c'est gcc
3.3.2003266


Un détail en passant: tout ceci n'a rien à voir avec GCC. C'est probablement
un problème de bibliothèque standard. Linux utilise glibc, tandis que
MingW32 utilise MSVCRT.DLL, un fichier fourni par Microsoft et qui est connu
pour ne pas être aussi riche fonctionnellement. Ainsi, si tu as une valeur
+INFINITY ou NAN(28), c'est peut-être la cause de ton problème.


Antoine