Que fait le puts
Résolu
Bonjour, j'ai un drôle de cas..
Question1:
Dans mon programme les printf ne s'affiche que seulement lorsque je met un puts(" ");
Je ne comprend pas.. (exemple dans la procédure calculer)
Question2:
Je voudrais écrire dans 2 fichier txt. Ce programme est un copier d'un autre que j'ai fait juste avant mais où je voulais corser la difficulté. L'ancien allait parfaitement mais pas celui ci pourtant le premier afficher dans le fichier "multiplication".
Le fichier somme doit contenir la somme des resultat (que je reçois avec le printf ligne 64")
Merci d'avance
Question1:
Dans mon programme les printf ne s'affiche que seulement lorsque je met un puts(" ");
Je ne comprend pas.. (exemple dans la procédure calculer)
Question2:
Je voudrais écrire dans 2 fichier txt. Ce programme est un copier d'un autre que j'ai fait juste avant mais où je voulais corser la difficulté. L'ancien allait parfaitement mais pas celui ci pourtant le premier afficher dans le fichier "multiplication".
Le fichier somme doit contenir la somme des resultat (que je reçois avec le printf ligne 64")
Merci d'avance
#include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #include <fcntl.h> #include "semaphore.h" #define fichiertexte "multiplication2.txt" #define fichierSomme "somme.txt" void calculer(int,int); void somme(); int tube[2]; FILE * fichier; FILE * fichierAdd; int main (int argc, char * argv[]){ int nbMultip, nb; if (argc > 2) { // au cas ou il n'y ai pas de 2eme parametre nbMultip = atoi(argv[1]); nb = atoi(argv[2]); } else exit(EXIT_FAILURE); if ((fichier = fopen(fichiertexte,"w"))==NULL) { perror("Write error"); exit(1); } //init des sema semaphore sonTour; initsema(sonTour,1); int cpt; for(cpt=0;cpt<nbMultip;cpt++) { P(sonTour); pid_t a = fork(); if(a<0){ perror("Le fork a rater"); exit(EXIT_FAILURE);} if(a==0){ calculer(nb,cpt); printf("46"); somme(); } V(sonTour); } for(cpt=0;cpt<nbMultip;cpt++) wait(0); fclose(fichier); return 0; } void calculer(int nb, int cpt){ cpt++; int result; printf("60"); result = nb * cpt; printf("62"); fprintf(fichier,"%d * %d = %d \n",nb, cpt, result); printf("\t result: %d \t", result); close(tube[0]); write(tube[1],&result,sizeof(result)); printf("65"); puts(" "); } void somme(){ int result; close(tube[1]); read(tube[0],&result,sizeof(result)); if ((fichier = fopen(fichierSomme,"r+"))==NULL) { perror("Read/Write error"); exit(1); } int nb; fscanf(fichierAdd,"%d",&nb); result += nb; fseek(fichierAdd, 0, SEEK_SET); //revient au début du fichier fprintf(fichierAdd, "%d", result); printf("%d", result); fclose(fichierAdd); exit(0); }
4 réponses
1) Peut-être que tu devrais rajouter un fflush(stdout) après ton printf.
2) Il y a des incohérences dans ton programme, certaines fonction ouvre un fichier mais ne le ferme pas (exemple : somme et le file descriptor fichier). J'ai l'impression en plus que ce file descriptor est ouvert et fermé plusieurs fois. Tu devrais simplement passer ce FILE * en paramètre (depuis ton main vers ta fonction), l'ouverture et la fermeture du fichier seraient alors complètement gérée par la fonction main.
3) Pour qu'on puisse tester ton programme dans le même contexte, il faudrait nous donner le contenu de tes fichiers d'entrée (ainsi que semaphore.h).
Quelques conseils :
- évite les variables globales, ça rend le code illisible et ça conduit souvent à des défauts d'architecture pour ton code, bref c'est globalement une mauvaise habitude
- essaye d'indenter le code un peu mieux (par exemple vim ou n'importe quel IDE digne de ce nom permet d'indenter facilement du code),
- essaye d'avoir un code "symétrique" ça le rend plus lisible (par exemple un fopen devrait conduire dans cette même fonction à un fclose, de même qu'un malloc devrait conduire à un free).
Évidemment il y a des contre-exemples à ce deuxième point. Par exemple tu pourrais avoir une fonction toto_create qui fait des malloc et des fopen et toto_free qui fait les fclose / free correspondant, mais dans ce cas, ton code sera "symétrique" dans une autre fonction qui appellera probablement au même niveau toto_create et toto_free.
Bonne chance
2) Il y a des incohérences dans ton programme, certaines fonction ouvre un fichier mais ne le ferme pas (exemple : somme et le file descriptor fichier). J'ai l'impression en plus que ce file descriptor est ouvert et fermé plusieurs fois. Tu devrais simplement passer ce FILE * en paramètre (depuis ton main vers ta fonction), l'ouverture et la fermeture du fichier seraient alors complètement gérée par la fonction main.
3) Pour qu'on puisse tester ton programme dans le même contexte, il faudrait nous donner le contenu de tes fichiers d'entrée (ainsi que semaphore.h).
Quelques conseils :
- évite les variables globales, ça rend le code illisible et ça conduit souvent à des défauts d'architecture pour ton code, bref c'est globalement une mauvaise habitude
- essaye d'indenter le code un peu mieux (par exemple vim ou n'importe quel IDE digne de ce nom permet d'indenter facilement du code),
- essaye d'avoir un code "symétrique" ça le rend plus lisible (par exemple un fopen devrait conduire dans cette même fonction à un fclose, de même qu'un malloc devrait conduire à un free).
Évidemment il y a des contre-exemples à ce deuxième point. Par exemple tu pourrais avoir une fonction toto_create qui fait des malloc et des fopen et toto_free qui fait les fclose / free correspondant, mais dans ce cas, ton code sera "symétrique" dans une autre fonction qui appellera probablement au même niveau toto_create et toto_free.
Bonne chance
Merci je poste le code pour les semaphores. Il s'agit d'un code que j'emporte partout quand je les utilises.
semaphore.c
semaphore.h
Je pourrais faire un code plus "simple" mais vu que je prépare mes examen mon objectif est de mélanger un maximum de matière ensemble ce qui me fait un code pas beau.
Je vais tenter d'améliorer le code pour le rendre plus lisible. Ce que je veux faire dans le programme est de remplir 2 fichier texte. Le 1er avec une table de multiplication d'un x nombre sur x nombre. Chaque processus crée écrira une ligne dans multiplication2.txt et renverra le résultat par tube dans la seconde fonction, qui contiendra la somme de tout les résultat. Ces données ne servent à rien mais il s'agit d'un entrainement.
P.S possible d'éviter un fflush ?
Merci encore
semaphore.c
#include "semaphore.h" void initsema(semaphore s, int nb){ pipe(s); char c = 'x'; int i; for (i=0;i<nb;i++) write (s[1] , &c , 1); } void P(semaphore s){ char c; read (s[0], &c , 1); } void V(semaphore s){ char c = 'x'; write (s[1] , &c , 1); }
semaphore.h
#ifndef SP #define SP #include <stdio.h> #include <time.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> #include <sys/types.h> #include <math.h> typedef int semaphore[2]; void initsema(semaphore s, int nb); void P(semaphore s); void V(semaphore s); #endif
Je pourrais faire un code plus "simple" mais vu que je prépare mes examen mon objectif est de mélanger un maximum de matière ensemble ce qui me fait un code pas beau.
Je vais tenter d'améliorer le code pour le rendre plus lisible. Ce que je veux faire dans le programme est de remplir 2 fichier texte. Le 1er avec une table de multiplication d'un x nombre sur x nombre. Chaque processus crée écrira une ligne dans multiplication2.txt et renverra le résultat par tube dans la seconde fonction, qui contiendra la somme de tout les résultat. Ces données ne servent à rien mais il s'agit d'un entrainement.
P.S possible d'éviter un fflush ?
Merci encore