Que fait le puts

Résolu/Fermé
linquisiteur - Modifié par linquisiteur le 10/08/2013 à 10:37
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 11 août 2013 à 00:40
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


#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

mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
10 août 2013 à 12:51
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
0
linquisiteur
10 août 2013 à 13:27
Merci je poste le code pour les semaphores. Il s'agit d'un code que j'emporte partout quand je les utilises.

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
0
linquisiteur
10 août 2013 à 13:45
Problème résolu comme d'hab je passe 1h a chercher une erreur pour rien.. dans la 2eme fonction j'ouvre le mauvais fichier et donc écrase la partie du programme qui fonctionne.

J'ai changer le fopen
Merci pour l'aide
0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
11 août 2013 à 00:40
Pas de problème, bonne continuation !
0