IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

interprétation des données lues dans un fichier


Sujet :

C

  1. #21
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Redgard Voir le message
    Parce que je pensais que je pouvais sauter l'étape de la variable, pensant pouvoir faire pointé un pointeur directement sur un nombre. Le problème c'est qu'en faisant ça je le fais pointé sur un espace vide, car non-défini.
    Plus exactement, ton pointeur contient une valeur aléatoire et toi tu utilises cette valeur comme adresse. Au résultat tu tapes aléatoirement dans la mémoire sans te préoccuper de 1) si tu as le droit d'écrire à cet endroit et 2) si cet endroit n'est pas utilisé par autre chose
    Or, un pointeur doit toujours avoir une adresse bien précise. Mais c'est pas obligé qu'il soit lié forcément à une variable...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int *pt;
    pt=malloc(sizeof(int));
    *pt=123;
    printf("%d\n", *pt);
    free(pt);

    Voilà. Je relie juste mon pointeur à une zone mémoire anonyme mais allouée (réservée) donc je suis certain qu'elle sera protégée. Et quand j'ai finis je la libère. Bien évidemment l'utilité de ce type de code est nulle. On n'utilise pas les pointeurs pour faire genre, on les utilise quand on en a besoin et si je dois stocker 123 alors j'utilise un int !!!

    Citation Envoyé par Redgard Voir le message
    Parce que je pensais que déclarer un pointeur étoile était équivalent à associer un pointeur à une adresse, en bref que *pn = x == pn = &xOr apparament non, il faut absolument que je le déclare comme ci pn = &x.
    On en revient à ma phrase précédente. En écrivant *pn=n tu ne fais aucune association entre l'adresse de "n" et "pn" mais simplement une copie d'une valeur (ici "n") dans une case mémoire (ici "*pn").
    La seule façon d'associer un pointeur à une adresse est de l'écrire explicitement pn=&n (copie de l'adresse de n dans pn).

    Citation Envoyé par Redgard Voir le message
    la fonction continue permet de sauter la *c = '\0';?
    Ah non !!! Il te faudrait quand-même les bases de la base. L'instruction continue saute tout le reste de la boucle et repart à l'itération suivante. Et le break éventuel te fait quitter la boucle avant sa fin naturelle. Ca fait partie des standards de tous les langages structurés et tu aurais dû le connaitre avant d'arriver ici...

    Citation Envoyé par Redgard Voir le message
    En fouillant sur le net, je suis tombé sur la fonction fscanf, donc je l'ai utilisé pour encore raccourcir le code. J'ai pas tout compris, donc j'ai du faire quelques suppositions.
    Il ne disait pas si elle lisait une ligne, ou si elle lisait tout le fichier donc j'ai supposé quelle lisait qu'une ligne et l'aie inclus dans la boucle while. J'ai lu quelle pouvait renvoyer le status "fin de fichier/ End-Of-File", ce qui m'a permis de l'inclure directement dans la boucle. J'ai gardé l'incrémentation de tab, pour les valeurs sentinelles.
    Oui, fscanf() fonctionne comme scanf() à ceci près qu'elle lit un fichier et non le clavier. Et comme scanf() elle s'arrête au <return> qui est symbolisé, dans le fichier, par le '\n' terminant la ligne (donc en effet elle s'arrête à chaque ligne).
    Certains n'aiment pas trop l'utiliser parce qu'elle demande énormément de précision. Il faut vraiment que l'entrée soit bien formatée comme il faut sinon elle part dans le décors. Mais ici effectivement elle est utilisable et j'aurais effectivement pu y penser.
    Mais bon, c'est pas une mauvaise chose non plus que tu aies vu comment gérer manuellement ta chaine et positionner les '\0' pour en extraire ce dont tu avais besoin...

    Citation Envoyé par Redgard Voir le message
    Je sais pas si mon utilisation est correcte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int chargeEleve(char *fic, t_eleve *tab) {
    	FILE *fp;
     
    	if ((fp = fopen(fic, "r")) == NULL) return -1;								//ouvre le fichier "fic", affecte un "oeil de lecture" qu'on stock dans "fp". Si l'oeil est "NULL" retourne -1 (valeur sentinelle)
    	while (fscanf(fp, "%d; %s", &tab->note, tab->nom) != EOF)					//boucle "while", tournant tant la fin du fichier n'est pas atteinte.
    		tab++;																	//passe à la case suivante de la structure, qui est 1*sizeof(*tab) plus loin. (tab + n == tab + n * sizeof(*tab))
    	fclose(fp);																	// fermeture du flux "fp"
    	tab->note = -1;																// tab ayant été incrémenté encore une fois à la fin de la boucle, une valeur sentinelle est placé afin d'éviter tout débordement de mémoire
    	tab->nom[0] = '\0';															// de même.
    	return 0;																	// retour d'une valeur sentinelle
    }
    C'est bon. T'as même compris qu'il fallait passer &tab->note (parce que la fonction modifiant une variable doit alors recevoir l'adresse de cette variable) et que tab->nom suffisait (sans le "&" parce qu'il est implicite avec le nom du tableau tab->nom <=> &tab->nom[0].

    Citation Envoyé par Redgard Voir le message
    Code global (pas grand chose ne change):
    Hé oui, c'est l'avantage d'être modulaire. Si on change un module dédié à une action, cela ne change rien au reste du code...

    Citation Envoyé par Redgard Voir le message
    J'envisage de plus en plus de passer sur une VM, comme tu l'as suggéré précédemment dans la discussion.
    Je pense que c'est quelques choses que les profs auraient dû nous faire faire au début de la formation, pour normaliser l'environnement de travail/d'étude, car actuellement si un élève a un problème sur un autre système d'exploitation que le leur, ils sont moins/pas en mesure de les aider. Et ça aurait permis de nous faire installer directement un compilateur et de nous rendre/ pousser à une certaines autonomie.
    Bien pratique les VM. D'ailleurs même en professionnel c'est utilisé. Maintenant, on virtualise des serveurs comme ça quand on veut en installer 10 on en installe un puis on copie 10 fois ses disques (de simples fichiers en réalité). J'ai même vu une boite qui avait acheté Visual Studio et qui l'avait installé sur une VM. Ensuite, il lui a suffit de copier la VM sur les différents postes pour que chaque poste ait ce logiciel. Lance toi, c'est gratuit. Juste avoir un PC qui assure un peu (au-moins 4Go de RAM pour pouvoir lancer une VM et rester dans le confort)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #22
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut
    Pour le status continue j'ai regardé la documentation et mieux compris l'intérêt de ta démarche. L'idée était d'éviter l'apparition d'une erreur d'attribution dans le cas ou le ";" vient à manquer, si je ne me trompe pas? car comme tu l'as dit ça permet de passer les lignes de code qui suite en passant directement à l'itération suivante.

    Pour la VM, c'est pas un problème, j'ai suffisament de core et de ram.

    ==============================

    J'ai essayé à de multiples reprises de faire valider le code par le correcteur automatique, or même si la compilation se passe sans encombre, il ne veut pas me le valider. J'ai demander à la prof sur le forum, mais ne sachant pas très bien, elle m'a demandé de réécrire mon programme en plus simple et plus court. N'ayant pas d'autres solution, c'est ce que j'ai fait mais je trouve ça frustrant :/. Même si le plus important c'est le chemin parcourru, j'aurais préféré que ce soi le code préccédent.

    Même avec celui-ce c'est pas parfait, je suis à 70/100:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct {
    	int note;
    	char nom[100 + 1];
    } t_eleve;
     
    int main() {
    	FILE *fs;		//File Scan
    	FILE *fp;		//File Print
     
    	t_eleve tab[1];
    	t_eleve *pt;
    	pt = tab;
     
    	if ((fs = fopen("./notes.txt", "r")) == NULL)										//ouverture en lecture du flux
    	{
    		printf("impossible d'ouvrir en lecture le fichier note.txt !\n");				//impression d'un message d'erreur en cas d'échec de l'ouverture en lecture
    		exit(0);
    	}
    	if ((fp = fopen("./anniversaire.txt", "w")) == NULL)								// ouverture en écriture du flux
    	{
    		printf("impossible d'ouvrir en écriture le fichier anniversaire.txt !\n");		//impression d'un message d'erreur en cas d'échec de l'ouverture en écriture
    		exit(1);
    	}
     
    	while (fscanf(fs, "%d;%s\n", &pt->note, pt->nom) != EOF)							//boucle "while", tournant tant la fin du fichier n'est pas atteinte.
    	{		
    		if (pt->note <= 18)																// ajoute 2 points si le membre note du tableau pt est plus petit ou égal à 18 
    			pt->note += 2;
    		else
    			pt->note = 20;		
     
    		fprintf(fp, "%d;%s\n", pt->note, pt->nom);										//écriture de la ligne dans le fichier de destination
    	}
     
    	fclose(fs);
    	fclose(fp);
    	return 0;
    }

  3. #23
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Redgard Voir le message
    L'idée était d'éviter l'apparition d'une erreur d'attribution dans le cas ou le ";" vient à manquer, si je ne me trompe pas?
    Exact. Car j'utilise ensuite le pointeur qui a été positionné'. Vaut mieux qu'il soit donc bien positionné et ne soit pas NULL !!!

    Citation Envoyé par Redgard Voir le message
    car comme tu l'as dit ça permet de passer les lignes de code qui suite en passant directement à l'itération suivante.
    Sinon obligé de créer un sous-bloc if
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while (fgets(zone, 100 + 1, fp) != NULL) {
    	if ((c=strchr(zone, '\n')) != NULL) *c='\0';
    	if ((c=strchr(zone, ';')) != NULL) {
    		*c='\0';
    		tab->note=atoi(zone);
    		strcpy(tab->nom, c+1);
    		tab++;
    	}
    }
    Super le bloc (et ses tabulations qui décalent le code réel bien à droit de ton écran) vachement inutile !!! Et si t'as 3 tests à faire, tu vois ce que ça donne...

    Citation Envoyé par Redgard Voir le message
    J'ai demander à la prof sur le forum, mais ne sachant pas très bien, elle m'a demandé de réécrire mon programme en plus simple et plus court.
    Hum... Encore un prof qui semble à la hauteur...

    Citation Envoyé par Redgard Voir le message
    N'ayant pas d'autres solution, c'est ce que j'ai fait mais je trouve ça frustrant :/. Même si le plus important c'est le chemin parcourru, j'aurais préféré que ce soit le code préccédent.
    Là ça va. Chaque module n'étant appelé qu'une fois, tu peux le recopier dans le main(). Mais effectivement c'est moins élégant. Ca devient ce qu'on appelle un "programme monolithique", avec un seul main() qui fait tout. Le jour où tu veux le faire évoluer...

    Citation Envoyé par Redgard Voir le message
    Même avec celui-ce c'est pas parfait, je suis à 70/100:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
    	int note;
    	char nom[100 + 1];
    } t_eleve;
    
    int main() {
    	FILE *fs;		//File Scan
    	FILE *fp;		//File Print
    	
    	t_eleve tab[1];		// Déjà dit - Un tableau à un seul élément ne sert à rien !!! => t_eleve eleve;
    	t_eleve *pt;		// Inutile !!! 
    	pt = tab;		// Inutile !!! 
    																					
    	if ((fs = fopen("./notes.txt", "r")) == NULL)										//ouverture en lecture du flux
    	{
    		printf("impossible d'ouvrir en lecture le fichier note.txt !\n");				//impression d'un message d'erreur en cas d'échec de l'ouverture en lecture
    		exit(0);		// Eviter le exit, lui préférer un return. Et éviter la valeur "0" signifiant par convention "tout s'est bien passé"...
    	}
    	if ((fp = fopen("./anniversaire.txt", "w")) == NULL)								// ouverture en écriture du flux
    	{
    		printf("impossible d'ouvrir en écriture le fichier anniversaire.txt !\n");		//impression d'un message d'erreur en cas d'échec de l'ouverture en écriture
    		// Attention, dans ce cas penser à fermer fs...
    		exit(1);
    	}
    
    	while (fscanf(fs, "%d;%s\n", &pt->note, pt->nom) != EOF)							//boucle "while", tournant tant la fin du fichier n'est pas atteinte.
    	// while (fscanf(fs, "%d;%s\n", &eleve.note, eleve.nom) != EOF)
    	{		
    		if (pt->note <= 18)																// ajoute 2 points si le membre note du tableau pt est plus petit ou égal à 18 
    			pt->note += 2;
    		else
    			pt->note = 20;
    		/* Autre façon de faire
    		eleve.note=(eleve.note <= 18 ?eleve.note + 2 :20);		*/
    
    		fprintf(fp, "%d;%s\n", pt->note, pt->nom);										//écriture de la ligne dans le fichier de destination
    		// fprintf(fp, "%d;%s\n", eleve.note, eleve.nom);
    	}
    
    	fclose(fs);
    	fclose(fp);
    	return 0;
    }
    Encore quelques détails...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #24
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut
    Je viens d'appliquer les changements suggérés.
    As-tu une page qui parle de comment tu as résumé la condition en if > eleve.note = (eleve.note <= 18 ? eleve.note + 2 : 20);, parce que ça m'intéresse???

    Le problème qui faisait que j'avais 70/100 dans l'exercice est que ma structure n'acceptait pas les décimales...
    C'était précisé dans l'énoncé, c'est pour ça que je l'avais mise à la base... j'avais totalement oublié.

    Bref affaire réglé, j'ai pu validé mon code (100/100)
    J'ai déjà tracé tout le contenu de la semaine suivante pour pas perdre de temps et m'affairé au prochain code, l'échéance étant le 4.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct {
    	float note;
    	char nom[100 + 1];
    } t_eleve;
     
    int main() {
    	FILE *fs;		//File Scan
    	FILE *fp;		//File Print
     
    	t_eleve eleve;
     
    	if ((fs = fopen("./notes.txt", "r")) == NULL)										//ouverture en lecture du flux
    	{
    		printf("impossible d'ouvrir en lecture le fichier note.txt !\n");				//impression d'un message d'erreur en cas d'échec de l'ouverture en lecture
    		exit(1);
    	}
    	if ((fp = fopen("./anniversaire.txt", "w")) == NULL)								// ouverture en écriture du flux
    	{
    		printf("impossible d'ouvrir en écriture le fichier anniversaire.txt !\n");		//impression d'un message d'erreur en cas d'échec de l'ouverture en écriture
    		exit(2);
    	}
     
    	while (fscanf(fs, "%f;%s\n",&eleve.note, eleve.nom) != EOF)							//boucle "while", tournant tant la fin du fichier n'est pas atteinte.
    	{		
    		eleve.note = (eleve.note <= 18 ? eleve.note + 2 : 20);
     
    		fprintf(fp, "%f;%s\n", eleve.note, eleve.nom);										//écriture de la ligne dans le fichier de destination
    	}
     
    	fclose(fs);
    	fclose(fp);
    	return 0;
    }
    Je trouve ça un peu débile qu'on soit indirectement encouragé par leur système à faire de la programmation mono-lytique...
    Vivement que les IA évolue

  5. #25
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Redgard Voir le message
    Je viens d'appliquer les changements suggérés.
    As-tu une page qui parle de comment tu as résumé la condition en if > eleve.note = (eleve.note <= 18 ? eleve.note + 2 : 20);, parce que ça m'intéresse???
    C'est comme si tu me demandais une page qui parle du remplacement de i=i+1 par i+=1 !!! Il s'agit de l'opérateur ternaire ?: qui s'écrit expression ?X :Y et qui vaut X si l'expression est vraie sinon il vaut Y. Une fois que tu le connais, il n'y a plus rien à en dire ni encore moins à écrire une page dessus...

    Citation Envoyé par Redgard Voir le message
    Bref affaire réglé, j'ai pu validé mon code (100/100)

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
    	float note;
    	char nom[100 + 1];
    } t_eleve;
    
    int main() {
    	FILE *fs;		//File Scan
    	FILE *fp;		//File Print
    	
    	t_eleve eleve;
    																					
    	if ((fs = fopen("./notes.txt", "r")) == NULL)										//ouverture en lecture du flux
    	{
    		printf("impossible d'ouvrir en lecture le fichier note.txt !\n");				//impression d'un message d'erreur en cas d'échec de l'ouverture en lecture
    		exit(1);
    	}
    	if ((fp = fopen("./anniversaire.txt", "w")) == NULL)								// ouverture en écriture du flux
    	{
    		printf("impossible d'ouvrir en écriture le fichier anniversaire.txt !\n");		//impression d'un message d'erreur en cas d'échec de l'ouverture en écriture
    		exit(2);
    		// Pense à fermer fs !!!
    	}
    
    	while (fscanf(fs, "%f;%s\n",&eleve.note, eleve.nom) != EOF)							//boucle "while", tournant tant la fin du fichier n'est pas atteinte.
    	{		
    		eleve.note = (eleve.note <= 18 ? eleve.note + 2 : 20);
    		fprintf(fp, "%f;%s\n", eleve.note, eleve.nom);										//écriture de la ligne dans le fichier de destination
    	}
    
    	// Autre solution possible...
    	while (fscanf(fs, "%f;%s\n",&eleve.note, eleve.nom) != EOF)							//boucle "while", tournant tant la fin du fichier n'est pas atteinte.
    		fprintf(fp, "%f;%s\n", eleve.note <= 18 ?eleve.note + 2 :20, eleve.nom);			// tant qu'à faire... si la note n'est utilisée qu'une fois, autant ne pas la modifier et écrire directement le résultat de l'incrémentation
    
    	fclose(fs);
    	fclose(fp);
    	return 0;
    }
    Hop, encore un peu d'optimisation... A la limite je me demande même si la structure est encore utile parce qu'avec juste une variable nom et une autre note... On va dire que oui dans un souci d'évolutivité toujours possible...

    Citation Envoyé par Redgard Voir le message
    Je trouve ça un peu débile qu'on soit indirectement encouragé par leur système à faire de la programmation mono-lytique...
    J'aimerais bien savoir quelle est ton école...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #26
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut
    Pour l'école:
    "Les paroles s'envole, les écrits restent". Je préfère éviter de répondre à cette question.
    C'est un mooc de 10 semaines, type formation courte en ligne, que tu suis le soir en rentrant du travail/ de l'école, et ayant pour objectif de mettre en place un socle/ des bases en informatique.

    Si je pense qu'il y a beaucoup de choses à améliorer, je ne suis pas sûr que c'est légitime de leur taper dessus à cause de la contrainte de temps trop courte, des moyens matériels disponible et de la nature de la formation, qui les limitent terriblement. Je pense qu'ils essaient de bien faire leur travail et qu'ils se qu'ils peuvent avec ce qu'ils ont, c'est juste que c'est trop court.
    Une formation plus longue serait surement mieux et permettrait un meilleur apprentissage. De même qu'il devrait prendre des dispositions pour que tout les étudiants soient sur le même OS, que ce soit par Dual Boot ou Virtual Machine.

    ============================================

    Je suis passé sur le test de la semaine 10 (dernier test), j'ai pris le temps de fouiller dans tout le programme fournit pour mieux voir comment m'y intégrer proprement et éviter de me retrouver bloquer comme la semaine précédente.

    Je dois donc rajouter deux fonctions (voir repertoireFichier.c):
    - une restaurant la liste des contacts depuis un fichier "repertoire.txt" --> restCont(lerep)
    - une autre sauvegardant cette liste de contact dans le fichier "repertoire.txt" --> saveCont(lerep)

    Le problème c'est que je ne sais par comment je suis censé définir ma variable d'entrée de la fonction (Contact? Repertoire? voir repertoire.h)? car j'ai donc un structure "Contact" qui est définit, puis un tableau "Repertoire" de [100] structure "Contact", qui est déclaré.

    repertoireFichier.h
    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
    repertoireFichier.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
    27
    28
    29
    30
    31
    32
    33
    #include <stdio.h>
    #include <stdlib.h>
    #include "repertoire.h"																	// inclus pour récupéré la structure contact
     
    void restCont(Repertoire *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");
    		exit(-1);
    	}
     
    	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(Repertoire *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");
    		exit(-1);
    	}
     
    	while (tab->nom != 0) {																//bouclant tournant jusqu'à rencontrer une case vide
    		fprintf(fd, "%s;%s\n", tab->nom, tab->numero);
    		tab++;
    	}
     
    	fclose(fd);
    }
    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
    #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
    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
    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);
      }
    }
    repertoireIHM.c - fonction MAIN
    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:
          printf("au revoir\n");
    	  saveCont(lerep);			//copie de la liste des contactes du tableau "lerep" dans le fichier "repertoire.txt".
        }
      }
     
      return 0;
    }


    =================================
    Pour le MakeFile:
    C'est encore d'actualité?
    "Chaque commande est précédée d'une tabulation." (source)
    Je l'ai fait dans mon fichier, mais c'est juste que le fichier de base, donne pas l'air que cette règle est respectée. ça change quelque chose?

    Pour mon MakeFile, je suis censé faire quelques choses d'autres?
    Nom : C.PNG
Affichages : 122
Taille : 15,8 Ko
    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
    # 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
     
    repertoire.o : repertoire.h repertoire.o
    	${CC}  -o repertoire.o repertoire.h repertoire.o
     
    lireClavier.o : lireClavier.h lireClavier.c
    	${CC}  -o lireClavier.o lireClavier.h lireClavier.c
     
    repertoireFichier.o : repertoire.h repertoireFichier.h repertoireFichier.c
    	${CC}  -o repertoireFichier.o repertoire.h repertoireFichier.h repertoireFichier.c
     
    clean:
    	rm *.o *.exe
    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
    #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
    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
    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");
    }
    */
    =================================
    J'en aie marre de ce compilateur en ligne... j'essaie de le faire marcher avec 3 navigateur (Opera, vivaldi, Chrome) et il y a rien qui répond correctement.

  7. #27
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    Bon, déjà nouveau problème = nouveau topic.
    Ensuite, je t'ai déjà dit qu'on mettait "t_" pour les noms de types ; et qu'on ne sortait jamais d'une fonction par exit() (parce que si le programmeur qui a créé fopen() avait fait pareil, ton programme s'arrêterait connement et tu ne pourrais jamais gérer le cas "fichier pas ouvert") donc toi aussi adopte la même attitude. On entre dans un programme par le main(), on en ressort par le main().

    Autre chose de nouveau: on ne masque jamais un pointeur derrière un type. Ni un tableau. Le tableau c'est d'ailleurs compréhensible (il n'y a rien de choquant à manipuler un tableau donc je vois pas pourquoi on s'empresserait de le cacher derrière un nom de type) et pour le pointeur c'est à peu près la même histoire. Les programmeurs de C ont besoin de voir le pointeur parce qu'ils ont besoin de savoir que tel ou tel truc est un pointeur. Et ce, sans devoir se rappeler que "ah oui, Repertoire est un tableau de 100 contacts).
    Le typedef est fait pour aider à la manipulation de nouveaux objets, pas pour cacher (et donc obfusquer) un truc déjà existant et aisément manipulable.

    Pour ton makefile tu demandes à compiler "repertoire.o" pour créer "repertoire.o". De plus, on n'a pas besoin d'inclure les ".h" dans la ligne de compilation, ceux-ci sont déjà inclus par le compilateur quand il voit #include (plus exactement par le préprocesseur).

    Sinon tes fonctions "saveCont" et "restCont" sont correctes. Les deux reçoivent en paramètre un pointeur sur le tableau de contacts à sauvegarder/restituer ce qui est exactement ce qu'elles doivent recevoir.

    PS: c'est toi qui a écrit "pluspetit" ??? Tu sais que strlen() (qui y est appelé 2 fois) parcours intégralement la chaine reçue en paramètre ???
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool pluspetit(char* s1, char* s2){
      while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
        s1++;
        s2++;
      }
      return *s1 < *s2;
    }
    En programmation comme en mathématiques, la simplicité est la clef de l'élégance.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #28
    Membre confirmé Avatar de Redgard
    Homme Profil pro
    x
    Inscrit en
    Décembre 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : x

    Informations forums :
    Inscription : Décembre 2014
    Messages : 90
    Par défaut
    Nouveau problème, nouveau poste?
    donc quoi je crée un nouveau sujet? Je voulais éviter de spam le forum




    Je n'ai pas tapé tout le programme... Mon action se limite au:
    • repertoireFichier.h
    • repertoireFichier.c
    • à l'ajout des fonctions restCont et saveCont, ainsi que #include "repertoireFichier.h" dans repertoireIHM.c
    • au MakeFile

    Tout le reste est le travail et l'action du prof.
    Pour le nom de la structure Contact et Repertoire[100], je n'ai pas choisi le nom, ni même le fichier où ils ont été déclaré; Je n'ai fait que reprendre le travail du prof.
    Le fait que le truc ne soit pas commenté ne facilite d'ailleurs pas trop la compréhension. On peut déclaré une structure (ex: T_Contact) dans un fichier .h?




    Pour ce qui est de Exit, effectivement je m'en rappel, désolé. Le prof avait montré ça dans un exemple, je l'ai juste repris. je vais me renseigner sur le fonction return comme tu en avais parlé.
    En fait le problème se situe dans le fait qu'on interromp le code sans nécessairement avoir tout fermé (les flux, etc)?

    En bref, pour reprendre ce que tu as déjà fait et dit: Tu me conseilles de passer mes fonctions de "void" à "int", de mettre un return -1 (valeur sentinelle), et d'interrompre le programme au sain du main dans le cas où la valeur est retournée?
    exemple: if(restCont = -1) cout << “Good bye world.” << endl; ;Je sais pas très bien comment interrompre la fonction main. Je me suis inspiré d'exemple sur internet pour illustré mon idée. utiliser return 0 interrompt la fonction main?




    Quand tu parles de "cacher un pointeur derrière un type" tu parles de "Repertoire[100]"? C'est le travail du prof, moi ce qui m'emmerde c'est justement ça. C'est considéré comme "Contact" (comme un type), et donc je sais pas trop quoi en faire. De base, j'avais utilisé "Contact", mais ayant des erreurs j'ai essayé avec "Repertoire".




    Typedef : aussi le travail du prof.




    Makefile: J'ai cherché sur internet et developpez.net mais je ne trouvais pas de documentation expliquant comment c'était exploité par le compilateur. Okay donc dès qu'un fichier .h est "include" dans mon fichier .c, j'ai plus besoin de m'embarasser avec dans le makefile.




    "saceCont" et "restCont" sont de mon propre fait sur base de ce que tu m'a appris. Il y a juste un truc dont je ne suis pas sur dans restCont.
    Le prof initialise un tableau qu'il remplit de vide (" "," "), de ce fait quand je fais tourner ma boucle "while" pour copier le contenu du tableau dans le fichier .txt, je suis censé la faire arrêter sur ce vide while (tab->nom != 0). Je ne sais pas si ça marche, je me suis basé sur une autre fonction que le prof avait fait.




    "pluspetit" non je n'y aie pas touché. C'était toute une affaire de se retrouver dans ce code, sans commentaire.


    En bref, le prof a codé un système qui compare les contacts et les classes par ordre alphabétique. Je sais qu'il utilise la longueur des chaines de caractère et leur id ASCII (spéculatif, il ne l'a pas expliqué. j'en aie tiré la conclusion) pour les évaluer.




    Donc quoi? Mon MakeFile, se limiterait à ça, si je comprend bien?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 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
     
    clean:
    	rm *.o *.exe

  9. #29
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Redgard Voir le message
    Nouveau problème, nouveau poste?
    donc quoi je crée un nouveau sujet?
    Exact. Surtout que ce topic qui a déjà plus de 20 réponses n'attire personne. Les gens voient "26 réponses", se disent "tout à été dit" et ne s'embêtent même pas à venir lire le truc.

    Citation Envoyé par Redgard Voir le message
    Le fait que le truc ne soit pas commenté ne facilite d'ailleurs pas trop la compréhension. On peut déclaré une structure (ex: T_Contact) dans un fichier .h?
    Oui. Le ".h" sert justement à ce que différents sources connaissent les outils utilisés. Tu pourrais même y mettre une fonction mais on ne le fait pas parce qu'un .h est livrable alors qu'une fonction peut être tenue secrète et que ça pourrait poser des soucis à l'édition de liens. Mais les déclarations des trucs, oui, se fait dans le .h...

    Citation Envoyé par Redgard Voir le message
    Pour ce qui est de Exit, effectivement je m'en rappel, désolé. Le prof avait montré ça dans un exemple, je l'ai juste repris. je vais me renseigner sur le fonction return comme tu en avais parlé.
    En fait le problème se situe dans le fait qu'on interromp le code sans nécessairement avoir tout fermé (les flux, etc)?
    Oui d'une part, et d'autre part le programme s'arrête alors qu'il pourrait/devrait faire autre chose...

    Citation Envoyé par Redgard Voir le message
    En bref, pour reprendre ce que tu as déjà fait et dit: Tu me conseilles de passer mes fonctions de "void" à "int", de mettre un return -1 (valeur sentinelle), et d'interrompre le programme au sain du main dans le cas où la valeur est retournée?
    exemple: if(restCont = -1) cout << “Good bye world.” << endl; ;Je sais pas très bien comment interrompre la fonction main. Je me suis inspiré d'exemple sur internet pour illustré mon idée. utiliser return 0 interrompt la fonction main?
    Oui, le return interromp toute fonction. Donc si une fonctionX se passe mal, elle retourne une valeur spécifique (code d'erreur et non sentinelle) à son appelant qui gère le cas. Et si ce cas est impossible, alors l'appelant retourne un code d'erreur à son propre appelant et etc jusqu'au main. Evite juste d'écrire du C++ dans un code C...

    Citation Envoyé par Redgard Voir le message
    Quand tu parles de "cacher un pointeur derrière un type" tu parles de "Repertoire[100]"? C'est le travail du prof, moi ce qui m'emmerde c'est justement ça. C'est considéré comme "Contact" (comme un type), et donc je sais pas trop quoi en faire. De base, j'avais utilisé "Contact", mais ayant des erreurs j'ai essayé avec "Repertoire".
    Pour moi, faut t'en tenir au tableau de Contact. Ce type est propre. Le Repertoire (qui est un type incluant un tableau) est une horreur...

    Citation Envoyé par Redgard Voir le message
    "saceCont" et "restCont" sont de mon propre fait sur base de ce que tu m'a appris. Il y a juste un truc dont je ne suis pas sur dans restCont.
    Le prof initialise un tableau qu'il remplit de vide (" "," "), de ce fait quand je fais tourner ma boucle "while" pour copier le contenu du tableau dans le fichier .txt, je suis censé la faire arrêter sur ce vide while (tab->nom != 0). Je ne sais pas si ça marche, je me suis basé sur une autre fonction que le prof avait fait.
    Oui, le "vide" c'est la sentinelle. Juste qu'on ne compare pas une chaine avec "!=" parce que là, tu compares un pointeur (rappel "tab->nom" <=> "&tab->nom[0]"). On peut comparer un caractère de la chaine (while (tab->nom[0] != '\0') ou utiliser strcmp() pour comparer une chaine avec une autre (while (strcmp(tab->nom, "") == 0)).

    Citation Envoyé par Redgard Voir le message
    "pluspetit" non je n'y aie pas touché. C'était toute une affaire de se retrouver dans ce code, sans commentaire.
    Ben tu peux lui dire "monsieur, est-ce que cette fonction (la mienne) ne serait pas plus efficace ???" Et éventuellement tu l'invites à venir voir ce que j'ai écrit sur son code de merde...

    Citation Envoyé par Redgard Voir le message
    Donc quoi? Mon MakeFile, se limiterait à ça, si je comprend bien?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 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
     
    clean:
    	rm *.o *.exe
    Non, il te faut aussi expliquer comment tu crées "repertoire.o"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    repertoire.o : repertoire.c repertoire.h
    	${CC} -c repertoire.c
    Et idem avec les autres ".o"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/06/2008, 15h38
  2. Réponses: 3
    Dernier message: 04/01/2007, 17h42
  3. Transposer des données sql dans un fichier texte
    Par Anakior dans le forum Outils
    Réponses: 3
    Dernier message: 11/12/2005, 10h01
  4. récupérer des données saisies dans un fichier
    Par natie_49 dans le forum C++
    Réponses: 6
    Dernier message: 24/11/2005, 11h29
  5. [JList] Lecture des données sauvegardées dans un fichier
    Par Myogtha dans le forum Composants
    Réponses: 7
    Dernier message: 10/06/2004, 21h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo