j-d pire que Mc Giver | Citation :
-> "fice, fics" c'est pas très explicite comme nom plutôt qqlch du genre "fic_in, fic_out" ou la même chose en français 
|
fice -> fichier entrée
fics -> fichier sortie
sur le coup s'était logique pour moi
Citation :
-> tes if sur "choix", soit tu fait un else if, soit utilise un switch
|
j'ai essayé l'instruction switch, le compilateur en pas voulu, après 1H de combat j'ai laissé tombé (il est chiant visual c++)
Citation :
tu fais des scanf pour lire une chaîne de caractère potentiellement infinie pour la mettre dans une zone mémoire limité (150 caract) : c'est ce qu'on appel un dépassement de capacité. Utilie fgets ou une syntaxe meilleur mais plus complexe de scanf pour éviter cela.
|
je suis novice en C; on a utilisé ça a l'école, ça marchait bien, le prof m'a dit que ça suffirai, j'ai pas cherché plus loin (je suis dans une école d'aéronautique, aérospaciale et système embarqué -> la programation n'est pas notre fort)
Citation :
tu ne vérifie pas ce que renvoie tes fopen et fclose
|
je l'ai fait pour tester si les fichiers existaient au départ; après comme ce n'est pas le but du programme, je suis partis du principe que rien ne bougerai (le but du programme est de chronométrer la boite noire; j'ai déjà surpassé ce qui était demandé par le prof en faisant un début de gestion des erreures). Mais il est vrai qu'en toute rigueure j'aurai dut le faire.
Citation :
-> "else {a=5;}" ça c'est moche. Suis la syntaxe que tu utilises ailleurs, à savoir chaque élément sur une ligne
|
un reste d'une précedente version du code (je sais plus ce qu'il y avait mais s'est resté au cas où)
Citation :
-> bien que tu l'ai corigé, le "void main(void)" c'est vraiment ideux ! Le C n'autorise que 2 prototypes pour le main : "int main (void);" et "int main (int, char **);"
|
Mes légères notion de C datent d'il y a 2 ans (sous la contrainte !) depuis j'ai eut du C++ (que je déteste), de l'assembleur (marrant mais prise de tête), le basic Ti (spécial faire bosser la caltos à sa place en TD ou en DS) => j'ai un peu tout mélangé, ce qui peut donner des forme étranges (et encore y'a 3 mois de boulot là, au début s'était vraiment horrible ).
dernière version du code source
Code :
- //################################################################
- //# Chronometre V10 final #
- //################################################################
- //BLAZIT Jean-Denis
- //D'ESTE Fabien
- #include<time.h>
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- const char *NomJourSemaine[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"}; //pour fonction date
- const char *NomMois[] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"}; // pour fonction date
- //=====================================================================================================================================
- void boite_noire(char * p1,char * p2) // p1 adresse fichier source, p2 adresse fichier de destination
- {
- FILE* fichierin; //definition pointeur pour fichier d'entree
- FILE* fichierout; //definition pointeur pour fichier de sortie
- char tempo[512]; //definition d'un tempon sous la forme d'un tableau de caractere
- int NbLu;
-
- printf("%s","\n\nBOITE NOIRE !\n\n" );
- fichierin=fopen(p1, "rb" ); //ouverture fichier source en lecture seule bianire
-
- fichierout=fopen(p2, "wb" ); //ouverture fichier destination en mode ecriture seule binaire
- while((NbLu=fread(tempo, 1, 512, fichierin)) != 0) //lecture de 512 blocs de taille 1 octet du fichier binaire et stockage dans tempo, NbLu = nombre de blocs réellement lus
- {
- fwrite(tempo, 1, NbLu, fichierout); // écriture de NbLu blocs de 1 octet stocké dans tempo vers fichierout
- }
- fclose(fichierout); //fermeture fichier de sortie
- fclose(fichierin); //fermeture fichier d'entrée
- };
- //=====================================================================================================================================
- void Affichage_resultat(clock_t debut,clock_t fin,double duree) //affichage des resultats du test
- {
- printf("Nombre de cycle d'horloge par secondes : %d\n",CLOCKS_PER_SEC);
- printf("Fonction se lance a : %6.0f top horloge\n",(double)(debut));
- printf("Fonction se termine a : %6.0f top horloge\n",(double)(fin));
- printf("\nTemps d'execution de la fonction :%6.0f top horloge soit %f secondes \n",duree,(duree/CLOCKS_PER_SEC));
- };
- //=====================================================================================================================================
- void dateGM(void) //donne la date avec la fonction gmtime
- {
- time_t timestamp;
- struct tm *t;
- // Lecture de la date et de l'heure
- timestamp = time (NULL);
- t = gmtime(×tamp);
- // Affiche la date et l'heure courante
- printf ("le %s ", NomJourSemaine[t -> tm_wday]);
- printf (" %02u %s %04u ", t -> tm_mday, NomMois[t -> tm_mon], 1900 +t -> tm_year);
- printf ("a %02uh %02umin %02usec.\n", t -> tm_hour+2, t -> tm_min, t -> tm_sec);
- printf ("\n" );
- };
- //=====================================================================================================================================
- void saisie(char * p1,char * p2)
- {
- char tempon1[150],tempon2[150];
- int in=0,out=0;
- int testchemin(char * p42); //declaration de la fonction testchemin
- while (in==0)
- {
- printf("\n\nSaisie du chemin du fichier a lire : \n" );
- scanf("%s",tempon1);
- strcpy(p1, tempon1);
- in=testchemin(p1); // lancement fonction de test du chemin avec passage du chemins en argument d'appel
- };
- while (out==0)
- {
- printf("\n\nSaisie du chemin du fichier a ecrire : \n" );
- scanf("%s",tempon2);
- strcpy(p2,tempon2);
- out=testchemin(p2); // lancement fonction de test du chemin avec passage du chemins en argument d'appel
- };
- };
- //=====================================================================================================================================
- int testchemin(char * p42) //fonction de test du chemin entre
- {
- FILE *fichiertest; //definition pointeur pour fichier teste
- fichiertest=fopen(p42,"rb" ); //ouverture du fichier binaire teste en mode lecture seule binaire
- long savepos, size;
- if(fichiertest==0) //verification accessibilitee du fichier d'entree
- {
- printf("\n\n--- /!\\ ERREUR D'OUVERTURE DU FICHIER : < %s > /!\\---\n\n",p42);
- return 0; //instruction retourne 0 si fichier innexistant
- }
- else
- {
- //definition de la taille du fichier binaire quad il existe
- savepos = ftell(fichiertest); // sauvegarder la position dans le fichier
- fseek(fichiertest, 0, SEEK_END); // aller en fin du fichier
- size = ftell(fichiertest); // lire la taille du fichier
- fseek(fichiertest, savepos, SEEK_SET); // rétablir la position initiale dans le fichier
- printf("\nla taille du fichier est %d octets \n",size);
- fclose(fichiertest); //fermeture du fichier binaire teste
- return 1; //instruction retourne 1 quand le fichier existe
- }
- };
- //=====================================================================================================================================
- void dessin()
- {
- printf(" ,,\n" );
- printf(" `\"\"*$b..\n" );
- printf(" \"\"*$o.\n" );
- printf(" \"$$o.\n" );
- printf(" \"*$$o.\n" );
- printf(" \"$$$o.\n" );
- printf(" \"$$$$bo... ..o:\n" );
- printf(" \"$$$$$$$$booocS$$$ .. ,.\n" );
- printf(" \". \"*$$$$SP V$o..o$$. .$$$b\n" );
- printf(" \"$$o. .$$$$$o. ...A$$$$$$$$$$$$$$b\n" );
- printf(" \"\"bo. \"*$$$$$$$$$$$$$$$$$$$$P*$$$$$$$$:\n" );
- printf(" \"$$. V$$$$$$$$$P\"**\"\"*\"\' VP * \"l\n" );
- printf(" \"$$$o.4$$$$$$$$X\n" );
- printf(" \"*$$$$$$$$$$$$$AoA$o..oooooo.. .b\n" );
- printf(" .X$$$$$$$$$$$P\"\" \"\"*oo,, ,$P\n" );
- printf(" $$P\"\"V$$$$$$$: . \"\"*****\"\n" );
- printf(" .*\" A$$$$$$$$o.4; .\n" );
- printf(" .oP\"\" \"$$$$$$b. .$;\n" );
- printf(" A$$$$$$$$$$P\n" );
- printf(" \" \"$$$$$P\"\n" );
- printf(" $$P*\"\n" );
- printf(" .$\"\n" );
- printf(" \"\n" );
- printf("\n" );
- };
- void pause(void)
- {
- int c;
- char cha[20];
- while ( ((c = getchar()) != '\n') && c != EOF); //vidage du flux
- printf("\n-> ENTRER pour continuer <-" );
- scanf("%s",cha);
- };
- //=====================================================================================================================================
- //=====================================================================================================================================
- int main(void) //PGM principale
- { /*definition des variables*/
- char fice[150],fics[150];
- int choix,quite=0,a=0;
- long i=600000000;
- double duree;
- float limite=0;
- clock_t debut, fin; //variables pour format clock_t
- printf("************************************************************************\n" );
- printf("* Chronometre *\n" );
- printf("************************************************************************\n" );
- printf("BLAZIT_J / D'ESTE_F\n" );
- printf("\nProgramme debute " );
- dateGM(); //appel fonction date gmtime
- while (quite==0)
- {
- dessin(); //appel fonction dessin
- printf("----------------------------------------------------------------------\n" );
- printf("| Choix du mode du chronometre\n" );
- printf("----------------------------------------------------------------------\n" );
- printf("[1] - chronometrage d'une boite noire\n[2] - Respect de la duree d'execution de la boite noire a une consigne\n[3] - Quiter\n\n-> " );
- if (scanf("%d",&choix) == 1) //on verifie qu'un nombre a bien été rentré pour le choix du mode du chronometre
- {
- /* saisie reussie */
- if(choix==1)
- {
- choix=0;
- saisie(fice,fics); // appel fonction de saisie des chemins
- debut=clock(); // releve du temps avant que la fonction ne s'execute
- boite_noire(fice,fics); // lancement fonction "boite noire" avec passage des chemins en argument d'appel
- fin=clock(); // releve du temps apres que la fonction se soit executee
- duree=(double)(fin-debut); //calcul de la duree d'execution
- Affichage_resultat(debut,fin,duree); //appel fonction d'affichage des resultats du chrono
- pause();
- }
- if (choix==2)
- {
- choix=0;
- saisie(fice,fics); // appel fonction de saisie des chemins
- printf("\nLimite de temps d'execution de la fonction en secondes ?\n" );
- scanf("%f",&limite);
- while(a!=5) //boucle de validation de la saisie du temps de limite d'éxécution (nombre réel)
- {
- if (scanf("%f",&limite) == 0) //test de la conformité du format de la saisie
- {
- /* echec de la saisie */
- printf("\n/!\\ ECHEC DANS LE FORMAT DE LA SAISIE (format X ou X.Y secondes) /!\\\n--Refaire la saisie--" );
- int c;
- while ( ((c = getchar()) != '\n') && c != EOF); //vidage du flux d'entree
- }
- else {a=5;}/* saisie reussie */
- }
- a=0; //remise a 0 de la variable a
- limite=(limite*CLOCKS_PER_SEC); //conversion temps en seconde -> top horloge
- printf("\n" );
- debut=clock(); // releve du temps avant que la fonction ne s'execute
- boite_noire(fice,fics); // lancement fonction "boite noire" avec passage des chemins en argument d'appel
- fin=clock(); // releve du temps apres que la fonction se soit executee
- duree=(double)(fin-debut); //calcul de la duree d'execution
- Affichage_resultat(debut,fin,duree); //appel fonction d'affichage des resultats du chrono
- if (limite-duree<0)
- printf("\n--LIMITE DE TEMPS D'EXECUTION DEPASSEE --\n de %6.0f top horloge soit %f secondes \n",(duree-limite),((duree-limite)/CLOCKS_PER_SEC)); //affichage de la duree de depassement de la boite noire
- else printf("\n-- LIMITE DE TEMPS D'EXECUTION RESPECTEE --\n marge de %6.0f top horloge soit %f secondes \n\n",(limite-duree),((limite-duree)/CLOCKS_PER_SEC)); //affichage de la marge de temps de la boite noire
- pause();
- }
- if (choix==3)
- {
- quite=1; //on peut quiter le programme
- printf("\nProgramme termine " );
- dateGM(); //appel fonction date gmtime
- pause();
- }
- }
- else
- {
- /* echec de la saisie */
- printf("\n/!\\ ECHEC DE LA SAISIE /!\\\n" );
- int c;
- while ( ((c = getchar()) != '\n') && c != EOF); //vidage du flux
- pause();
- }
- printf("\n\n\n\n" );
- };
- return 0;
- };
| ---------------
plus le bricolage est foireux et merdique, plus il faut le faire
"Se tromper est humain, mais pour vraiment mettre le bordel, il faut y ajouter un ordinateur."
|