OVH Cloud OVH Cloud

portage de sun à linux

20 réponses
Avatar
Elodie
Bonjour,

Au boulot, je dois porter tout un tas de programme en C de sun à Linux. Bien
sûr ce n'est pas moi qui ait écrit ces programmes et je ne connais pas le c.

Pour le moment, dans la majorité des programmes j'ai fait les modifs
suivantes :

- virer le module fp.h et compiler avec gcc -lm
- remplacer void main(int argc, char* argv[]) par
main(argc,argv)
int argc;
char *argv[];
(ne me demandez pas pkoi)

A la compilation pas de problème mais à l'exécution j'ai une erreur de
segmentation. Une idée ?

Merci d'avance pour votre aide.

Elodie

PS : un des codes :


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*#include <fp.h>*/
#include "../include/herve.h"

#define FICHIER 0
#define UV 1

FILE *fp1,*fp2;

void lecture_ligne(int);

main(argc,argv)
int argc;
char *argv[];
{
char entree[80],sortie[80];
float u,v,ff;
int rep,dd,nb,type;

if (argc==3)
{
if (strlen(argv[1])<=5)
{
type=UV;
u=atof(argv[1]);
v=atof(argv[2]);
}
else
{
type=FICHIER;
strcpy(entree,argv[1]);
nb=atoi(argv[2]);
}
}
else
{
printf("Conversion des coordonnees (u,v) d'un vent en (dd,ff)\n");
printf("-----------------------------------------------------\n");
printf("1 => Saisie d'un couple (u,v)\n");
printf("2 => Traitement sur un fichier de donnees ?\n");
scanf("%d",&rep);
if (rep!=1 && rep!=2) exit(-1);

if (rep==1)
{
type=UV;
printf("Coordonnee u ? ");
scanf("%f",&u);
printf("Coordonnee v ? ");
scanf("%f",&v);
}
else
{
type=FICHIER;
printf("Nom du fichier a traiter ? ");
scanf("%s",&entree);
printf("Nombre de couples (u,v) par enregistrement ? ");
scanf("%d",&nb);
}
}

if (type==UV)
{
vent_uv_ddff(u,v,&dd,&ff);
printf("dd=%d ff=%.1f\n",dd,ff);
}
else
{
fp1=fopen(entree,"r");
if (fp1==NULL)
{
printf("%s n'existe pas!\n",entree);
exit(0);
}
sprintf(sortie,"%s.res",entree);
fp2=fopen(sortie,"w");
while (!(feof(fp1))) lecture_ligne(nb);
fclose(fp1);
fclose(fp2);
}
}


void lecture_ligne(int nb)
{
char chaine[160];
float u,v,ff;
int n,dd;

fgets(chaine,160,fp1);
if (!(feof(fp1)))
{
fprintf(fp2,"%s;",strtok(chaine,";"));
fprintf(fp2,"%s;",strtok(NULL,";"));
fprintf(fp2,"%s;",strtok(NULL,";"));
fprintf(fp2,"%s;",strtok(NULL,";"));

for (n=1;n<=nb;n++)
{
u=atof(strtok(NULL,";"));
v=atof(strtok(NULL,";"));

vent_uv_ddff(u,v,&dd,&ff);
fprintf(fp2,"%d;%.2f;",dd,ff);
}
fprintf(fp2,"\n");
}
}

10 réponses

1 2
Avatar
Anthony Fleury
Elodie wrote:

Eh non même pas stagiaire mais récemment arrivée j'avoue ! Et en plus je
suis une vraie fille (incroyable non ?), et vraiment susceptible aussi !!



Pas tant que ca il y en a pas mal... Et puis pour Olivier, on ne répond pas
en fonction du pseudo (enfin pas pour moi en tout cas). Mais comme l'a dit
Régis, le code était bien présentée et la question clairement posée, donc
ca encourage à répondre.

En tous cas, merci beaucoup à Anthony et Régis. Je n'ai pas encore eu le
temps de tout regarder mais voici ce que donne le debugger :

Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6

Et le plantage intervient juste après la saisie du nombre de couple (u,v)


En fait il faudrait être plus précis. strtod sera appellée ici assez
souvent, déjà parce que tout appel à atof utilise strtod à ma connaissance
dans la libc soux linux, je pense donc comme je l'avais dit, à un appel de
atof() avec le paramètre NULL retourné par strtok() en cas de problème de
formattage, et ce peut etre pour le dernier appel par exemple. Quitte à
mettre soit des points d'arrets dans le debugger soit des traces avec des
printf selon les préférences, il faudrait voir quel appel fait planter le
programme. [ le debugger ne donne pas des masses d'info là, l'application
est bien compilée avec -g ? il devrait mettre la ligne de l'appel dans
l'executable lui même qui a provoqué le SIGSEGV ]. Une fois cet appel
trouvé il faut en vérifier avec le debugger la valeur des paramètres.

En tout cas moi j'avais copié collé le programme et ca passait parfaitement
chez moi, en reconstituant un fichier, mais nous n'avions ni de fichier
(donc il était simple d'en faire un qui respectait le code) ni la fonction
vent_uv_ddff() cependant il serait étonnant que cela vienne d'elle vu son
prototype...

Anthony
--
"You could be my unintended, choice to live my life extended
You should be the one I'll always love, I'll be there as soon as I can
But I'm busy mending broken pieces of the life I had before"
(C) Muse - Unintended

Avatar
Régis Troadec
"Vincent Guichard" a écrit dans le message de
news:c8f47b$ck7$

Salut,

sprintf(sortie,"%s.res",entree);
Et boum ! sortie a de quoi contenir 80 char, mais ce n'est à priori pas

une


chaine, si il n'y a pas de '' (caractère de fin de chaine)quelquepart
dedans.
La solution, remplir sortie de zéros (ce qu'est '') avec memset par
exemple:
memset(sortie, 0, sizeof sortie);
sprintf(sortie,"%s.res", entree);


d'après la norme (§ 7.19.6.6)

<Quote>
The sprintf function is equivalent to fprintf, except that the output is
written into an array (specified by the argument s) rather than to a
stream. _A null character_ is written at the end of the characters
written; it is not counted as part of the returned value. If copying
takes place between objects that overlap, the behavior is undefined.
</Quote>

Donc ca risque de faire boom, mais pas parce que le '' manque.
L'appel à memset ne sert à rien (sauf à perdre du temps).


Très juste, autant pour moi. Et vu que entree et sortie etaient bien
disjoints, aucun problème ici donc.

Regis



Avatar
Régis Troadec
"Elodie" a écrit dans le message de
news:c8f0uc$buo$

Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6

Et le plantage intervient juste après la saisie du nombre de couple (u,v)


Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton code
original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr, (char**)NULL);
Anthony avait raison, il y a donc de grandes chances que ptr soit nul dans
ton cas, soupçon plus porté sur la fonction lecture_ligne().

Tu peux soit directement blinder ton code, ou utiliser dans un premier temps
la macro assert(EXPR) (<assert.h>) pour un debug rapide. Si l'expression
EXPR est fausse (donc l'assertion), le programme se termine en affichant ce
qui ne va pas avec nom du fichier source et ligne.

J'ai réécris ton programme en incluant mes propositions avec un support de
debug minimaliste. J'utilise aussi l'indicateur d'erreur errno (inclure
<errno.h>) qui est un entier prenant différents codes d'erreur (ce sont les
fonctions de la bibliothèque standard C qui mettent errno à telle ou telle
valeur, exple, strtod() met errno à ERANGE pour signaler que lors de la
conversion chaine -> double, la valeur renvoyée est hors du domaine des
valeurs).


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <assert.h>
#include <errno.h>

/*
#include <fp.h>
#include <math.h>
*/
#include "../include/herve.h"

#define FICHIER 0
#define UV 1

void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb);

int main(int argc, char *argv[])
{
char entree[80],sortie[80];
float u, v, ff;
int rep, ddtu trouveras sur le net pas mal d'exemples, nb, type;

if (argc==3)
{
if (strlen(argv[1])<=5)
{
type = UV;
u = (float)strtod(argv[1], NULL);
assert(errno != ERANGE);
v = (float)strtod(argv[2], NULL);
assert(errno != ERANGE);
}
else
{
type = FICHIER;
memset(entree, 0, sizeof entree);
strncpy(entree, argv[1], sizeof entree - 1);
nb = (int)strtol(argv[2], NULL, 10);
assert(errno != ERANGE);
}
}
else
{
printf("Conversion des coordonnees (u,v) d'un vent en (dd,ff)n");
printf("-----------------------------------------------------n");
printf("1 => Saisie d'un couple (u,v)n");
printf("2 => Traitement sur un fichier de donnees ?n");
scanf("%d",&rep);

if (rep!=1 && rep!=2)
{
exit(EXIT_FAILURE);
}

if (rep==1)
{
type = UV;
printf("Coordonnee u ? n");
scanf("%f",&u);
printf("Coordonnee v ? n");
scanf("%f",&v);
}
else
{
type = FICHIER;
printf("Nom du fichier a traiter ? ");
scanf("%s",entree);
printf("Nombre de couples (u,v) par enregistrement ? ");
scanf("%d",&nb);
}
}

if (type==UV)
{
vent_uv_ddff(u,v,&dd,&ff);
printf("dd=%d ff=%.1fn",dd,ff);
}
else
{
FILE *fp1,*fp2;

fp1=fopen(entree,"r");
if (fp1 != NULL)
{
if ( (strlen(entree)+4) < (sizeof sortie - 1) )
sprintf(sortie,"%s.res", entree);

fp2=fopen(sortie,"w");
if (fp2 != NULL)
{
traitementVentFicVersFic(fp1, fp2, nb);
fclose(fp2);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",sortie);
exit(EXIT_FAILURE);
}

fclose(fp1);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",entree);
exit(EXIT_FAILURE);
}
}

return 0;
}


void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb)
{
char chaine[160], *p;
float u,v,ff;
int n,dd;

while(fgets(chaine,160,f_src) != NULL)
{
if (chaine[0] == 'n') continue;

p = strtok(chaine,";");
n = 1;

while (p != NULL && n < 4)
{
fprintf(f_dst,"%s;",p);
p = strtok(NULL,";");
++n;
}

for (n=1; n<=nb; n++)
{
p = strtok(NULL,";");
assert(p != NULL);
u = (float)strtod(p, NULL);
assert(errno != ERANGE);

p = strtok(NULL,";");
assert(p != NULL);
v = (float)strtod(p, NULL);
assert(errno != ERANGE);

vent_uv_ddff(u,v,&dd,&ff);
fprintf(f_dst,"%d;%.2f;",dd,ff);
}

fprintf(f_dst,"n");
}
}


Regis

Notas :
1. Pq pas utiliser des double à la place des float ?
("vent_uv_ddff() en a besoin" n'est pas une bonne raison)
2. <math.h> ne sert à rien ici.
3. J'avais repéré un scanf("%s",&entree); avec char entree[80] dans le code
original. Attention, entree "est déjà" un char *.

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Régis Troadec" wrote:

Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton
code original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL); Anthony avait raison, il y a donc de grandes chances que


Ouch! C'est quoi ce cast de la mort?

strtod (ptr, NULL);

est suffisant, non? Pourquoi obscurcir le code ?

3. J'avais repéré un scanf("%s",&entree); avec char entree[80] dans le
code original. Attention, entree "est déjà" un char *.


Attention. Je comprends bien le sens de la remarque, mais elle est mal
exprimée. Ce type d'affirmation entretien le mythe "pointeur = tableau".

'entree' est une constante qui a la valeur de l'adresse du premier élément du
tableau.

tableau == tableau + 0 = &tableau[0]

Cette constante est du type pointeur sur le type des élements du tableau.

Ici, le type est char, donc la constante tableau est du type char*.

scanf() avec "%s" attend l'adresse d'un char. Or comme on vient de le
démontrer, tableau est une constante adresse d'un char. Donc on peut
(techniquement) écrire:

char entree[80],
...
scanf ("%s", entree);

Relarque importe : Cette pratique est aussi dangereuse que l'usage de gets()
(pas de contrôle de taille de la destination).

scanf ("79%s", entree);

est un palliatif, mais difficile à maintenir.

Il est préférable d'utiliser une fonction de saisie de ligne basée sur
fgetc() ou fgets().

Des exemples ici :

http://mapage.noos.fr/emdel/clib.htm module IO

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Régis Troadec
"Emmanuel Delahaye" a écrit dans le message de
news:
In 'fr.comp.lang.c', "Régis Troadec" wrote:


Salut,

Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton
code original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL); Anthony avait raison, il y a donc de grandes chances que


Ouch! C'est quoi ce cast de la mort?

strtod (ptr, NULL);

est suffisant, non? Pourquoi obscurcir le code ?


J'ai recopié honteusement ce qui il y avait dans mon K&R2, je n'étais pas
sûr que atof() pouvait appeler strtod(), et il est dit dans le bouquin que
atof(ptr); est équivalent à strtod(ptr, (char**)NULL); Je n'ai pas encore
consulté les errata de la deuxième édition du K&R pour le savoir mais
peut-être que c'est une coquille laissée depuis le temps où char* était le
pointeur générique.

[coupé, les très bonnes explications]


Il est préférable d'utiliser une fonction de saisie de ligne basée sur
fgetc() ou fgets().

Des exemples ici :

http://mapage.noos.fr/emdel/clib.htm module IO


Suggestion : lien à ajouter dans la FAQ. Ca fait depuis 1 mois environ que
j'ai connaissance de ton site en furetant sur c.l.c et c'est vraiment de
l'excellent code bien documenté. Tu devrais même rajouter le lien de ton
site dans ta signature.

Regis


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Régis Troadec" wrote:

http://mapage.noos.fr/emdel/clib.htm module IO


Suggestion : lien à ajouter dans la FAQ. Ca fait depuis 1 mois environ que
j'ai connaissance de ton site en furetant sur c.l.c et c'est vraiment de
l'excellent code bien documenté.


Merci!

Tu devrais même rajouter le lien de ton
site dans ta signature.


J'attends qu'il soit un peu plus 'terminé'...

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
eric_alube
Bonjour,

Des exemples ici :

http://mapage.noos.fr/emdel/clib.htm module IO




Si je puis me permettre, elle est vraiment excellente, cette page.
Bravo, tout simplement !

Au passage, je suis en train d'écrire un document sur la modularité.
Même si cette page web n'est pas complète, puis-je ajouter le lien
(ci-dessus) dans mon document ?


Suggestion : lien à ajouter dans la FAQ.


Je viens de découvrir ce forum, et je tiens à dire que je trouve cette
FAQ d'excellente qualité, et c'est vrai qu'y ajouter ce lien serait une
excellente chose.


Cordialement


--
eric bachard


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', eric_alube wrote:

http://mapage.noos.fr/emdel/clib.htm module IO



Si je puis me permettre, elle est vraiment excellente, cette page.
Bravo, tout simplement !


Merci.

Au passage, je suis en train d'écrire un document sur la modularité.
Même si cette page web n'est pas complète, puis-je ajouter le lien
(ci-dessus) dans mon document ?


Oui.

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/



Avatar
ericb
Au passage, je suis en train d'écrire un document sur la modularité.
Même si cette page web n'est pas complète, puis-je ajouter le lien
(ci-dessus) dans mon document ?



Oui.



Alors merci bien. C'est fait, et je posterai le lien pour info quand ce
document sera terminé (faudra attendre un tout petit peu).

C'est sans prétention, avec juste l'essentiel.


Avatar
Elodie
Me revoila de vacances.

J'ai essayé de suivre vos conseils. Ca a l'air de bien fonctionner. Il reste
sûrement des trucs à améliorer mais je vais passer à la suite car il me
reste un paquet de programmes à porter.
Merci infiniment en tous cas.

Et pour info, voici le code :


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "../include/herve.h"

#define FICHIER 0
#define UV 1

void traitement_ventfic(FILE*,FILE*,int);

int main(int argc, char* argv[])
{
char entree[80],sortie[80];
float u,v,ff;
int rep,dd,nb,type;
FILE *fp1,*fp2;

if (argc==3)
{
if (strlen(argv[1])<=5)
{
type=UV;
u=strtod(argv[1],(char **)NULL);
v=strtod(argv[2],(char **)NULL);
}
else
{
type=FICHIER;
memset(entree,0,sizeof entree);
strncpy(entree,argv[1],80-1);
nb=strtol(argv[2],(char **)NULL,10);
}
}
else
{
printf("Conversion des coordonnees (u,v) d'un vent en (dd,ff)n");
printf("-----------------------------------------------------n");
printf("1 => Saisie d'un couple (u,v)n");
printf("2 => Traitement sur un fichier de donnees ?n");
scanf("%d",&rep);
if (rep!=1 && rep!=2) exit(EXIT_FAILURE);
if (rep==1)
{
type=UV;
printf("Coordonnee u ? ");
scanf("%f",&u);
printf("Coordonnee v ? ");
scanf("%f",&v);
}
else
{
type=FICHIER;
printf("Nom du fichier a traiter ? ");
scanf("%s",&entree);
printf("Nombre de couples (u,v) par enregistrement ? ");
scanf("%d",&nb);
}
}
if (type==UV)
{
vent_uv_ddff(u,v,&dd,&ff);
printf("dd=%d ff=%.1fn",dd,ff);
}
else
{
fp1=fopen(entree,"r");
if (fp1==NULL)
{
fprintf(stderr,"%s n'existe pas!n",entree);
exit(EXIT_FAILURE);
}
sprintf(sortie,"%s.res",entree);
fp2=fopen(sortie,"w");
traitement_ventfic(fp1,fp2,nb);
fclose(fp1);
fclose(fp2);
}
}

void traitement_ventfic(FILE *f_src,FILE *f_dst,int nb)
{
char chaine[160];
float u,v,ff;
int n,dd;

while(fgets(chaine,160,f_src)!=NULL)
{
if (strcmp(chaine,"n")==0) continue;

fprintf(f_dst,"%s;",strtok(chaine,";"));
fprintf(f_dst,"%s;",strtok(NULL,";"));
fprintf(f_dst,"%s;",strtok(NULL,";"));
fprintf(f_dst,"%s;",strtok(NULL,";"));

for (n=1;n<=nb;n++)
{
u=strtod(strtok(NULL,";"),(char **)NULL);
v=strtod(strtok(NULL,";"),(char **)NULL);

vent_uv_ddff(u,v,&dd,&ff);
fprintf(f_dst,"%d;%.2f;",dd,ff);
}
fprintf(f_dst,"n");
}
}



"Régis Troadec" a écrit dans le message de
news:c8m22p$fr6$

"Elodie" a écrit dans le message de
news:c8f0uc$buo$

Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6

Et le plantage intervient juste après la saisie du nombre de couple
(u,v)



Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton code
original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL);

Anthony avait raison, il y a donc de grandes chances que ptr soit nul dans
ton cas, soupçon plus porté sur la fonction lecture_ligne().

Tu peux soit directement blinder ton code, ou utiliser dans un premier
temps

la macro assert(EXPR) (<assert.h>) pour un debug rapide. Si l'expression
EXPR est fausse (donc l'assertion), le programme se termine en affichant
ce

qui ne va pas avec nom du fichier source et ligne.

J'ai réécris ton programme en incluant mes propositions avec un support de
debug minimaliste. J'utilise aussi l'indicateur d'erreur errno (inclure
<errno.h>) qui est un entier prenant différents codes d'erreur (ce sont
les

fonctions de la bibliothèque standard C qui mettent errno à telle ou telle
valeur, exple, strtod() met errno à ERANGE pour signaler que lors de la
conversion chaine -> double, la valeur renvoyée est hors du domaine des
valeurs).


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <assert.h>
#include <errno.h>

/*
#include <fp.h>
#include <math.h>
*/
#include "../include/herve.h"

#define FICHIER 0
#define UV 1

void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb);

int main(int argc, char *argv[])
{
char entree[80],sortie[80];
float u, v, ff;
int rep, ddtu trouveras sur le net pas mal d'exemples, nb, type;

if (argc==3)
{
if (strlen(argv[1])<=5)
{
type = UV;
u = (float)strtod(argv[1], NULL);
assert(errno != ERANGE);
v = (float)strtod(argv[2], NULL);
assert(errno != ERANGE);
}
else
{
type = FICHIER;
memset(entree, 0, sizeof entree);
strncpy(entree, argv[1], sizeof entree - 1);
nb = (int)strtol(argv[2], NULL, 10);
assert(errno != ERANGE);
}
}
else
{
printf("Conversion des coordonnees (u,v) d'un vent en (dd,ff)n");
printf("-----------------------------------------------------n");
printf("1 => Saisie d'un couple (u,v)n");
printf("2 => Traitement sur un fichier de donnees ?n");
scanf("%d",&rep);

if (rep!=1 && rep!=2)
{
exit(EXIT_FAILURE);
}

if (rep==1)
{
type = UV;
printf("Coordonnee u ? n");
scanf("%f",&u);
printf("Coordonnee v ? n");
scanf("%f",&v);
}
else
{
type = FICHIER;
printf("Nom du fichier a traiter ? ");
scanf("%s",entree);
printf("Nombre de couples (u,v) par enregistrement ? ");
scanf("%d",&nb);
}
}

if (type==UV)
{
vent_uv_ddff(u,v,&dd,&ff);
printf("dd=%d ff=%.1fn",dd,ff);
}
else
{
FILE *fp1,*fp2;

fp1=fopen(entree,"r");
if (fp1 != NULL)
{
if ( (strlen(entree)+4) < (sizeof sortie - 1) )
sprintf(sortie,"%s.res", entree);

fp2=fopen(sortie,"w");
if (fp2 != NULL)
{
traitementVentFicVersFic(fp1, fp2, nb);
fclose(fp2);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",sortie);
exit(EXIT_FAILURE);
}

fclose(fp1);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",entree);
exit(EXIT_FAILURE);
}
}

return 0;
}


void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb)
{
char chaine[160], *p;
float u,v,ff;
int n,dd;

while(fgets(chaine,160,f_src) != NULL)
{
if (chaine[0] == 'n') continue;

p = strtok(chaine,";");
n = 1;

while (p != NULL && n < 4)
{
fprintf(f_dst,"%s;",p);
p = strtok(NULL,";");
++n;
}

for (n=1; n<=nb; n++)
{
p = strtok(NULL,";");
assert(p != NULL);
u = (float)strtod(p, NULL);
assert(errno != ERANGE);

p = strtok(NULL,";");
assert(p != NULL);
v = (float)strtod(p, NULL);
assert(errno != ERANGE);

vent_uv_ddff(u,v,&dd,&ff);
fprintf(f_dst,"%d;%.2f;",dd,ff);
}

fprintf(f_dst,"n");
}
}


Regis

Notas :
1. Pq pas utiliser des double à la place des float ?
("vent_uv_ddff() en a besoin" n'est pas une bonne raison)
2. <math.h> ne sert à rien ici.
3. J'avais repéré un scanf("%s",&entree); avec char entree[80] dans le
code

original. Attention, entree "est déjà" un char *.






1 2