Bonjour à tous,
Pour un travail dans un MOOC en ligne, je suis amené à devoir compilé un programme de répertoire de contact, dans lequel j'ai rajouté deux fonctions afin de stocké le répertoire de contact dans un fichier "repertoire.txt".
Or lors de la compilation, le fichier se compile mais le compilateur en ligne me renvoit un message d'erreur à propos d'un "problème d'horloge", mais malgré mes recherches sur internet, je n'arrive pas très bien à comprendre le problème.
Mon MakeFile:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 make: Warning: File `makefile' has modification time 1.5e+03 s in the future make: warning: Clock skew detected. Your build may be incomplete.
J'ai lu (ici) que je pouvais rajouter la commande -I. à la fin des lignes de codes de mon makefile, pour le faire chercher dans le dossier où se trouve les fichiers. Est-ce toujours d'actualité? Est-ce réellement intéressant?
J'ai lu que ça pourrait être lié à un problème de synchronisation d'horloge entre ma machine et le compilateur en ligne?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 # pour webworkbench # CC=tcc CC=gcc repertoireIHM.exe : repertoireIHM.o repertoire.o lireClavier.o repertoireFichier.o ${CC} -o repertoireIHM.exe repertoireIHM.o repertoire.o lireClavier.o repertoireFichier.o repertoireIHM.o : repertoireIHM.c repertoire.h lireClavier.h repertoireFichier.h ${CC} -c repertoireIHM.c repertoire.o : repertoire.c repertoire.h ${CC} -c repertoire.c lireClavier.o : lireClavier.c lireClavier.h ${CC} -c lireClavier.c repertoireFichier.o : repertoireFichier.c repertoireFichier.h repertoire.h ${CC} -c repertoireFichier.c clean: rm *.o
Mes fichiers:
repertoireFichier.h
repertoireFichier.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #ifndef __REPERTOIREFICHIER_H #define __REPERTOIREFICHIER_H void restCont(Contact *tab); //fonction copiant le contenu du "repertoire.txt" dans "tab" void saveCont(Contact *tab); // fonction copiant le contenu de "tab" dans "repertoire.txt" #endif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include <stdio.h> #include <stdlib.h> #include "repertoire.h" // inclus pour récupéré la structure contact #include "repertoireFichier.h" void restCont(Contact *tab) { // fonction récupérant les contacts stocké dans le fichier "repertoire.txt" FILE *fs; // pointeur Fichier Source if ((fs = fopen("repertoire.txt", "r")) == NULL) { // Condition "if" ouvrant en lecture le fichier "repertoire.txt", copiant son contenu dans "fs", et vérifiant son existence. printf("Echec de l'ouverture du fichier \"repertoire\" en lecture\n"); } while (fscanf(fs, "%s;%s\n", tab->nom, tab->numero) != EOF) // Boucle "while" copiant le contenu du tableau "fs" tant que la fin du fichier n'est pas atteinte tab++; // Passage à la case suivante du tableau fclose(fs); } void saveCont(Contact *tab) { // fonction copiant les dernières modifications des contacts dans le fichier "repertoire.txtt" FILE *fd; // pointeur Fichier Destination if ((fd = fopen("repertoire.txt", "w")) == NULL) { // Condition "if" ouvrant en écriture le fichier "repertoire.txt", copiant son contenu dans "fd", et vérifiant son existence. printf("Echec de l'ouverture du fichier \"repertoire.txt\" en écriture.\n"); } while (tab->nom[0] != '\0') { //bouclant tournant jusqu'à rencontrer une case vide fprintf(fd, "%s;%s\n", tab->nom, tab->numero); tab++; } fclose(fd); }
Les fichiers fournis pour l'exercice:
repertoireIHM.c
repertoire.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 #include <stdio.h> #include <stdlib.h> #include <string.h> #include "repertoire.h" #include "lireClavier.h" #include "repertoireFichier.h" int menu(){ int option=0; printf("1: ajouter un contact\n"); printf("2: rechercher un contact\n"); printf("3: supprimer un contact\n"); printf("4: afficher tous les contacts\n"); printf("5: quitter\n"); while(option<1 || option>5){ printf(" votre choix: "); option = lireEntier(); } return option; } char* saisir_string(char* chose, char* op, char *res, int taille){ printf("Entrez le %s du contact Ã* %s\n",chose,op); lireMot(res, taille); return res; } int main(){ Repertoire lerep; int i; int option=0; char nom[99+1]; char numero[19+1]; Contact cont; bool done; nom[0] = numero[0] = '\0'; for(i=0; i<100; i++){ //nettoyage du répertoire? strcpy(lerep[i].nom,""); strcpy(lerep[i].numero,""); } restCont(lerep); //copie la liste de contact du fichier "repertoire.txt" dans le tableau "lerep" de structure "Contact". while(option != 5){ option = menu(); switch(option){ case 1: saisir_string("nom","ajouter", nom, 99); saisir_string("numero","ajouter", numero, 19); ajouterContact(nom,numero,lerep); break; case 2: saisir_string("morceau du nom","rechercher", nom, 99); cont = rechercherContact(nom,lerep); if (strlen(cont.nom)>0){ printf("nom: %s numéro: %s\n",cont.nom,cont.numero); }else{ printf("aucun contact trouvé\n"); } break; case 3: saisir_string("morceau du nom","supprimer", nom, 99); done = supprimerContact(nom,lerep); if (done) printf("contact supprimé\n"); else printf("aucun contact correspondant: %s\n",nom); break; case 4: afficherRepertoire(lerep); break; case 5: saveCont(lerep); //copie de la liste des contactes du tableau "lerep" dans le fichier "repertoire.txt". printf("au revoir\n"); } } return 0; }
repertoire.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #ifndef __REPERTOIRE_H #define __REPERTOIRE_H #define TRUE 1 #define FALSE 0 typedef int bool; typedef struct { char nom[100]; char numero[20]; } Contact; typedef Contact Repertoire[100]; bool pluspetit(char* s1, char* s2); void decaler(int indice, Repertoire rep); void ajouterContact(char* nom, char* num, Repertoire rep); bool charsEgaux(char c1, char c2); bool estDans(char* morceau, char* chaine); int rechercherIndiceContact(char* sschaine, Repertoire rep); Contact rechercherContact(char* sschaine, Repertoire rep); bool supprimerContact(char* sschaine, Repertoire rep); void afficherRepertoire(Repertoire rep); #endif
lireClavier.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 #include <stdio.h> #include <stdlib.h> #include <string.h> #include "repertoire.h" bool pluspetit(char* s1, char* s2){ bool diff = FALSE; int lg1, lg2; int i = 0; lg1 = strlen(s1); lg2 = strlen(s2); while (i<lg1 && i<lg2 && !diff){ if (s1[i] != s2[i]) diff = TRUE; else i++; } if (diff){ if (s1[i]<s2[i]) return TRUE; else return FALSE; }else{ if (lg1<lg2) return TRUE; else return FALSE; } } void decaler(int indice, Repertoire rep){ int i=0; int j; while(strlen(rep[i].nom)!=0) i++; for (j=i; j>indice; j--){ strcpy(rep[j].nom,rep[j-1].nom); strcpy(rep[j].numero,rep[j-1].numero); } } void ajouterContact(char* nom, char* num, Repertoire rep){ int i=0; while (strlen(rep[i].nom)!=0 && pluspetit(rep[i].nom,nom)){ i++; } decaler(i,rep); strcpy(rep[i].nom,nom); strcpy(rep[i].numero,num); } bool charsEgaux(char c1, char c2){ switch(c1-c2){ case 0: case 32: // macro? case -32: return TRUE; default: return FALSE; } } bool estDans(char* morceau, char* chaine){ int ind =0; int ssind; bool trouve = FALSE; while(!trouve && strlen(chaine)-ind >= strlen(morceau)){ ssind = 0; trouve = TRUE; while(trouve && ssind<strlen(morceau)){ trouve = charsEgaux(chaine[ind+ssind],morceau[ssind]); ssind++; } ind++; } return trouve; } int rechercherIndiceContact(char* sschaine, Repertoire rep){ int i=0; while(!estDans(sschaine,rep[i].nom) && strlen(rep[i].nom )!=0) i++; return i; } Contact rechercherContact(char* sschaine, Repertoire rep){ int i=rechercherIndiceContact(sschaine,rep); return rep[i]; } bool supprimerContact(char* sschaine, Repertoire rep){ int ind = rechercherIndiceContact(sschaine,rep); if (strlen(rep[ind].nom)==0) return FALSE; while(strlen(rep[ind].nom)!=0){ strcpy(rep[ind].nom,rep[ind+1].nom); strcpy(rep[ind].numero,rep[ind+1].numero); ind++; } return TRUE; } void afficherRepertoire(Repertoire rep){ int ind = 0; for(ind = 0; strlen(rep[ind].nom)!=0; ind++){ printf("nom: %s numéro: %s\n",rep[ind].nom,rep[ind].numero); } }
lireClavier.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #ifndef __LIRECLAVIER_H #define __LIRECLAVIER_H #include <stdio.h> /* retourne un entier lu sur l'entrée standard et nettoie toute la ligne courante. */ int lireEntier(void); /* retourne un caractère lu sur l'entrée standard et nettoie toute la ligne courante. */ char lireCaractere(void); /* retourne un mot lu sur l'entrée standard et nettoie toute la ligne courante. */ char * lireMot(char *s, int taille); /* retourne une ligne lue sur l'entrée standard */ char * lireLigne(char *s, int taille); #endif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 #include <string.h> #include "lireClavier.h" void videResteLigne(void) { char c; do { scanf("%c", &c); } while (c != '\n'); } int lireEntier(void) { int entierLu = 0, nbEntiersLus; nbEntiersLus = scanf("%d", &entierLu); if (nbEntiersLus != 1) { fprintf(stderr, "Erreur de format: veuillez saisir un entier.\n"); } videResteLigne(); return entierLu; } char lireCaractere(void) { char c; scanf("%c", &c); if (c != '\n') { videResteLigne(); } return c; } char * lireLigne(char *s, int taille) { int l; fgets(s, taille, stdin); l = strlen(s); if ( l > 1 && s[l-1] == '\n' ) s[l-1] = '\0'; else videResteLigne(); return s; } char * lireMot(char *s, int taille) { char buff[taille+1]; lireLigne(buff, taille); s[0] = '\0'; buff[taille] = '\0'; // prevent sscanf overflow!! sscanf(buff, "%s", s); s[taille] = '\0'; return s; } /* int printf(const char *f, ...) { fprintf(stdout, "HJHJHJHJ\n"); } */
@Sve@r J'ai retiré les exits, mais je n'ai pas mis de return, je n'ai pas trop envie d'aller chipoter dans le reste du code. Je préfère finir ça rapidement et me mettre sur de nouveaux tutos/ autres . à part Développez.net, tu as d'autres sites à me conseiller pour apprendre le C? J'ai actuellement:
- http://www.cplusplus.com
- http://en.cppreference.com/w/
- Je pensais jetté un oeil plus tard au c++: https://www.sololearn.com/Courses/
Partager