Bonjour, je suis tout nouveau ici, de meme que je suis novice en c et étant en stage actuellement je bute sur la prog.
Voilà mon probleme j'ai des fichiers de données dont les 1eres lignes sont du baratin, puis ensuite les donnees:
FORMAT-1
2004-07-15 11:09:15 0
BLS900
1 11 0
file generated by Scintec BLSRUN
Main Data
Scintillation Index Beta # beta # # S # 1
(Cn^2) # (Cn^2) # m^-2/3 # S # 1
Cn^2 corr. # Cn^2 # m^-2/3 # S # 1
(CT^2) # (CT^2) # K^2 m^-2/3 # S # 1
CT^2 corr. # CT^2 # K^2 m^-2/3 # S # 1
Heat Flux (H) # (H) # W m^-2 # S # 1
Heat Flux H corr. # H # W m^-2 # S # 1
Fried Diameter (r0) # (r0) # m # S # 1
Fried Diameter r0 corr. # r0 # m # S # 1
Crosswind # wind # m/s # S # 1
error code 1 # ALIGN LEVEL NUL NUL FLUCT BATT PATH NUL NUL COMM ALG NOSIGNAL WINDCALC WINDRANGE DUMMY # # E # WEIIWWIIIEEEWWE
2004-07-15 00:00:00 00:00:00 00:00:00
0 0 0 0 0 0 0 0 0 0 16384
2004-07-15 18:25:00 18:25:00 00:01:00
0.008 0.03368e-12 0.03368e-12 0.04167 0.04167 46.6 46.6 0.0134 0.0134 0.00 0
2004-07-15 18:26:00 18:26:00 00:01:00
0.009 0.04417e-12 0.04417e-12 0.05464 0.05464 57.1 57.1 0.0114 0.0114 0.00 0
etc etc.....
avec donc la date et en dessous les données séparées par des blancs.
dans un autre type de fichiers qui commence direct par date puis les données sur la meme ligne je récupère avec succes les dates et heures avec
fgets(chaine,200,fichier);
sscanf(chaine,"%d %d-%d-%d %d:%d",&x, &bornes[0],&bornes[1], &bornes[2], &bornes[3], &bornes[4]);
//0 = année 1 = mois 2=jour 3=heure 4=minutes
mais voilà je ne sais pas comment aller lire les dates avec le 1er type de fichiers ..... si vous avez une idée....merci beaucoup d'avance!
# Gni ?
Posté par Obsidian . Évalué à 2.
Si la différence entre les deux fichiers se résume au fait que la date se trouve ou non sur la première ligne, fais simplement une boucle avec ton fgets() à l'intérieur, teste à chaque tour si la ligne a le format qui te semble correct, et le cas échéant, parse la date.
Tu devrais aussi jeter un oeil du coté des expression régulières pour ce genre de traitement.
[^] # Re: Gni ?
Posté par Christophe Fergeau . Évalué à 3.
Ouais, c'est clairement le genre de parsing lourdingue à faire en perl ou en python ça, ça fait gagner un temps infini.
# dans time.h
Posté par gaaaaaAab . Évalué à 2.
et en plus, joie!, c'est du ANSI :)
[^] # Re: dans time.h
Posté par bosniaak . Évalué à 1.
printf: Argument 2 : wrong type argument, expecting a matrix of strings"
ca fait 2 jours que j'essaie rrrrrrrrrrrrrrrrrrrrr aidez moi svp!!
[^] # Re: dans time.h
Posté par gaaaaaAab . Évalué à 2.
par exemple la ligne avec ton printf
[^] # Re: dans time.h
Posté par bosniaak . Évalué à 1.
main.sce
==========================================
du blabla puis appel de lecture.sce
function lecture.sce
==========================================
function lecture_sce()
global resultats;
global chaine1;
donnees_lues=call("lecture",chemin,1,"c",type_fichiers,2,"i",variable,3,"i",tab_fichiers(i)(2),4,"i","out",[10,tab_fichiers(i)(2)],5,"r");
//appel de la fonction lecture.c ici je voudrais juste mettre un printf("voilà la chaine brute lue: %s",chaine1)
lecture.c
===============================================
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char chaine1;
int lecture(char *nom_fichier ,int *type_fichiers,int *variable, int *nb_lignes,float sortie[][10])
{FILE *fichier;
double av[30];
double v1;
int taille = 300;
int s0,s1,s2,s3,s4,s5,p;
char * chaine = malloc(taille);
fichier=fopen(nom_fichier,"r");
if (!feof(fichier)){
i=0;
fgets(chaine,300,fichier);
verif=sscanf(chaine," %d %d-%d-%d %d:%d:%d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",&x,&s0,&s1,&s2,&s3,&s4,&s5,&av[0],&av[1],&av[2],&av[3],&av[4],&av[5],&av[6],&av[7],&av[8],&av[9],&av[10],&av[11],&av[12],&av[13],&av[14],&av[15],&av[16],&av[17],&av[18],&av[19]);
//jusque là normalement c assez clair je dois avoir peu importe les affectations une string de 300 dans chaine....maintenant comment renvoyer cette chaine de caracteres à main ou lecture.sce pour pouvoir mettre le printf tout bete....sans ca je ne peux pas vérifier ce que fait fgets et donc je suis bloqué pour programmer......
[^] # Re: dans time.h
Posté par gaaaaaAab . Évalué à 1.
le problème de ton chaine1, c'est qu'il est défini en char alors qu'il devrait être déclaré en char* dans ton fichier.C. En plus, je suis pas sur que ton chaine1 en C soit le meme que ton chaine1 dans ton .sce mais en même temps je connais pas du tout scilab. Mais alors vraiment pas du tout :)
sinon, tu peux rajouter un char* dans le prototype de ta fonction lecture
genre
int lecture(char *nom_fichier ,int *type_fichiers,int *variable, int *nb_lignes,float sortie[][10], char* chaine_sortie)
{
(...)
fgets(chaine,300,fichier);
chaine_sortie=chaine;
}
pour finir, la lecture de la chaine de date avec strptime est peut-être un peu galère, mais ça serait quand même vachement plus joli :)
[^] # Re: dans time.h
Posté par bosniaak . Évalué à 1.
sinon question con: non on ne peut pas scilab ne recupere pas les sorties standard....
et moi j'en ai une autre qusetion con: comment je fais pour executer une fonction c sans le faire sous scilab??? (oui je suis super débutant, je taffe pour comprendre et modifier tout ce code....mais mes galeres sont en c pas trop en scilab....)
[^] # Quelques conseils
Posté par Obsidian . Évalué à 2.
Ensuite, le prototype d'une fonction, c'est effectivement sa déclaration. En principe, définir une fonction (autrement dit, écrire son contenu) la déclare implicitement, donc écrire son prototype ne sert que si tu comptes t'y référer dans ton code, avant de l'avoir défini, ou dans un autre fichier. Ce qui au final couvre 99% des cas. Donc tu mets proprement tes prototypes dans un fichier .h, tu inclues celui-ci au début de ton code et tu ne t'en soucies plus.
Si tu veux renvoyer chaine à la fonction main, le plus simple est de faire renvoyer le pointeur sur cette chaine par ta fonction :
char * lecture (...)
{
...
return chaine;
}
Ensuite, tu peux l'invoquer directement dans ton main et dans la fonction qui l'appelle :
int main ()
{
printf ("Le résultat est %s\n",lecture());
}
Ben tu fais un exécutable ! C'est à ça que cela sert ! A écrire des programmes indépendants. La fonction main sert à cela. Elle porte ce nom pour que le système sache que c'est la première chose à exécuter lorsqu'il va lancer ton programme.
[^] # Re: Quelques conseils
Posté par bosniaak . Évalué à 1.
[^] # Re: dans time.h
Posté par gaaaaaAab . Évalué à 1.
ouais, c'est la même chose à un pouillème près.
'comment je fais pour executer une fonction c sans le faire sous scilab???'
Le plus simple, ce serait que tu jettes un oeil sur un tutoriel (demande à google)
en gros, il faut que tu définisse une fonction main dans .c qui sera le point d'entrée de ton programme. Cette fonction main accepte les paramètres de la ligne de commande (cf argc et argv). Dans cette fonction main, tu peux ensuite appeler ta fonction lecture.
Il faudra aussi que tu te débrouilles pour compiler ton prog en dehors de scilab. Si t'es sous linux, gcc fera ça très bien pour toi. Sous windows ... scilab doit bien avoir un compilo quelquepart, mais est ce que c'est un compilo embarqué ou un compilo externe ...
après une petite visite sur le site de scilab, la version win utilise lcc-win32. Si tu es sous win donc, tu dois avoir moyen d'utiliser icc-win directement.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.