aide thread avec mutex URGENT

aide thread avec mutex URGENT - C - Programmation

Marsh Posté le 04-03-2006 à 23:36:23    

bonjour,
je cherche de l'aide a propo d'un sujet que j'ai eu a l'ecole, bon le probleme est:
 
debut de l'ennocé
 
je doit ecrire en C un programme qui calcul la moyenne générale d'un ensemble de notes d'un groupe d'etudiants.
--  la processus (thread principal) lira lesnotesdans un fichier et les stockera dans un tableau à 2 dimensions a raison d'un etudiant par ligne et d'une matiére par colonne. la designation du fichier sera transmise en parametre du main.
 
--  le thread principal créera ensuite autant de threads qu'il y a de colonnes, chacun devant calculer la moyenne des notes de la colonne qui lui aura été assigné.
 
--  chaque thread rangera sa moyenne dans un tableau, à l'indice correspondant a la colonne qui lui a été assignée.
 
--  chaque thread informera le thread principal de la fin de son calcul par l'intermediaire d'une variable condition.
 
--  lorsque tous les threads auront terminé leur calcul, le thread principal calculera la moyenne générale et affichera les moyennes partielles et la moyenne générale.
 
fin de l'ennoncé
 
le fichier texte cotiendra des float et sera de la forme:
1.0 2.1 1.2 1.8 7.4
1.5 15.6 3.7 12.4 10.2
....
 
voir mes connaissance en langage C, j'arrive a peine a recupérer les valeurs du fichier et en suite je les range dans tableau, mais pas plus, aucune connaissance des thread et encore moin les mutex avec condition.
 
s'il y a qq'un qui pe bien me venir en aide je serai reconnaissant.
sinon voila le code de ce que j'ai déja fait, s'il y a une methode plus simple je suis preneur
 
merci beaucoup d'avance
 

Code :
  1. #include <stdio.h>                             // fonction de base(printf, fgets,....)
  2. #include <string.h>                            // strtok() -> decoupage de chaine de caracteres
  3. #include <stdlib.h>                            // atof -> convertir une chaine de caractere en un float
  4. #define CMAX                 400               // Nombre de ligne maximum du tableau
  5. #define LMAX                 400               // Nombre de colonne maximum du tableau
  6. #define MAX_CHAR_PER_LINE    1650              // Nombre de caratere maximum par ligne dans le fichier lu :  
  7.                                                //       3*400+400+1 = 1601 mais j'ai mis 1650 pour arrondir
  8. #define SEP                  " "               // Séparateur utilisé dans le fichier
  9. #define PATH                 "test.txt"        // Mets l'emplacement de ton fichier contenant les valeurs
  10. int main(int argc, char* argv[])
  11. {
  12.     FILE*    m_File;
  13.     int        i;
  14.     int        j;
  15.     float    Tab[LMAX][CMAX];
  16.     char    szbuff[MAX_CHAR_PER_LINE];
  17.     char*    token;
  18.    
  19.    
  20.     // On initialise le tableau a -1
  21.     for(i=0;i<LMAX;i++)
  22.     {
  23.         for(j=0;j<CMAX;j++)
  24.         {
  25.             Tab[i][j] = -1;
  26.         }
  27.     }
  28.    
  29.     // On réinitialise le compteur de ligne car i;a été incrémenté lors de l'iniatialisation
  30.     i = 0;
  31.    
  32.     // On ouvre le fichier en lecture seule et en mode texte
  33.     m_File = fopen(PATH,"rt" );
  34.     // On vérifie qu'il n'y ai pas eu d'erreur pendant l'ouverture du fichier
  35.     if(!m_File) return 1;
  36.     // On lit le fichier ligne a ligne et on stocke les valeurs dans un tableau d'entier
  37.     // La boucle while a l'avantage de permettre la lecture d'un fichier sans connaitre son nombre de ligne exact
  38.     // et nous évite donc de faire bugger le programme
  39.     // Le "feof" veut "End Of File". On lit donc jusuqu'à la fin du fichier
  40.     while(!feof(m_File) && i < LMAX)
  41.     {
  42.        
  43.         j = 0;
  44.         // On récupere la ligne courante du fichier
  45.         fgets(szbuff,MAX_CHAR_PER_LINE,m_File);
  46.        
  47.         // On decoupe la ligne selon le charactere de séparation SEP (" " )
  48.         token = strtok(szbuff,SEP);
  49.         // On lit les éléments découpés un à un et on les stocke dans le tableau Tab
  50.         while(token != NULL && j < CMAX)
  51.         {
  52.             // On stocke la valeur lue dans le tableau
  53.             Tab[i][j] = atof(token);
  54.             // On lit l'element suivant retourner par strtok
  55.             token = strtok(NULL,SEP);
  56.             // On incremente le compteur des ordonnées
  57.             j++;
  58.         }
  59.        
  60.         // On incrémente le compteur des abscisses
  61.         i++;
  62.     }
  63.     // On affiche le tableau pour etre sur que tout s'est bien passé... Le \t correspond au caractere tabulation
  64.     // Le 0.2f indique qu'on doit afficher un float avec 2 decimales après la virugle
  65. int x;
  66. int y;
  67.     for(x=0;x<i;x++)
  68.     {
  69.         for(y=0;y<j;y++)
  70.         {
  71.             printf("%0.2f\t",Tab[x][y]);
  72.         }
  73.         printf("\n" );
  74.     }
  75.     return 0;
  76. }

Reply

Marsh Posté le 04-03-2006 à 23:36:23   

Reply

Marsh Posté le 04-03-2006 à 23:40:56    

hichamelo a écrit :


voir mes connaissance en langage C, j'arrive a peine a recupérer les valeurs du fichier et en suite je les range dans tableau, mais pas plus, aucune connaissance des thread et encore moin les mutex avec condition.


http://mapage.noos.fr/emdel/pthreads.htm
 
Sinon, pour le code que tu as posté, la première impression est bonne.
 

  • bonne présentation
  • commentaires 'intelligents' (bien que parfois un peu excessif...)
  • compilation sans problème chez moi (en mode paranoïaque )
  • pas de globales
  • pas de plantage sur 'fichier inconnu' (un petit message serait le bienvenu)
  • affichage de contrôle


Après, il y a quelques détails à améliorer...

  • Il n'est pas nécessaire de regrouper les définitions de données au début de la fonction. Elles peuvent être définies à l'endroit où on en a besoin. Ça facilite la lecture, maintenance et ça prépare le code à la modularisation (découpage en fonctions). Ça évite aussi le recyclage parfois douteux des données... Le compilateur peut mieux vérifier si une variable a biel été initialisée avant d'être lue.
  • J'ai un doute sur le choix de la taille des tableaux.
  • Le choix de 'float' n'est pas judicieux. On pert en précision et on augmente les temps de conversions double<->float[1]. Préférer 'double'.
  • Le mode d'ouverture du ficher en mode lecture texte est "r" et non "rt"[2]
  • 'if(!m_File) return 1;' L'intention est bonne, mais le codage est améliorable.  

- 'if (m_file == NULL)' est plus clair.  
- 1 n'est pas une valeur normalisée. En cas d'erreur, c'est EXIT_FAILURE (<stdlib.h> ).

  • feof() ne fait pas ce que tu crois. Il faut tester la valeur retournée par la fonction de lecture. A lire absolument :  

http://mapage.noos.fr/emdel/notes.htm#fichiers

  • La fonction strtok() présente quelques défauts qui la rende difficilement utilisable dans certains cas. (ici, c'est OK)
  • La fonction de conversion atof() est obsolète depuis 1989. Elle est remplacée par strtod(). Cette fonction permet en fait de faire en même temps l'analyse de la ligne et la conversion, rendant strtok() inutile quand les séparateurs sont des 'blancs' (espaces, TABS.).
  • Il manque la fermeture du fichier
  • La présentation des données se fait non pas à coup de 'TAB' dont le comportement peut changer d'une machine à l'autre, mais avec les formats prévus à cet effet. Par exemple ".8.2f" qui signifie que l'on occupe 8 caractères dont un pour le '.', 2 pour les décimales, les reste se répartissant entre des espaces et la partie entière.  


Correction. (Pose des questions si tu ne comprends pas).

Code :
  1. #include <stdio.h>                             // fonction de base(printf, fgets,....)
  2. #include <string.h>                            // strtok() -> decoupage de chaine de caracteres
  3. #include <stdlib.h>                            // atof -> convertir une chaine de caractere en un float
  4.  
  5. #define CMAX                 400               // Nombre de ligne maximum du tableau
  6. #define LMAX                 400               // Nombre de colonne maximum du tableau
  7. #define MAX_CHAR_PER_LINE    1650              // Nombre de caratere maximum par ligne dans le fichier lu :
  8. //       3*400+400+1 = 1601 mais j'ai mis 1650 pour arrondir
  9. #define PATH                 "test.txt"        // Mets l'emplacement de ton fichier contenant les valeurs
  10.  
  11.  
  12. int main(int argc, char* argv[])
  13. {
  14.   int ret;
  15.   double Tab[LMAX][CMAX];
  16.  
  17.   // On initialise le tableau a -1
  18.   {
  19.      int i;
  20.      for (i = 0;i < LMAX;i++)
  21.      {
  22.         int j;
  23.         for (j = 0;j < CMAX;j++)
  24.         {
  25.            Tab[i][j] = -1;
  26.         }
  27.      }
  28.   }
  29.  
  30.   {
  31.      int nb_lin;
  32.      int nb_col;
  33.      // On ouvre le fichier en lecture seule et en mode texte
  34.      FILE* m_File = fopen(PATH, "rt" );
  35.  
  36.      // On vérifie qu'il n'y ai pas eu d'erreur pendant l'ouverture du fichier
  37.      if (m_File != NULL)
  38.      {
  39.         char szbuff[MAX_CHAR_PER_LINE];
  40.  
  41.         // Mise a 0 du compteur de ligne
  42.         int i = 0;
  43.  
  44.         // On lit le fichier ligne a ligne et on stocke les valeurs dans un tableau d'entier
  45.         // La boucle while a l'avantage de permettre la lecture d'un fichier sans connaitre son nombre de ligne exact
  46.         // et nous évite donc de faire bugger le programme
  47.         // On récupere la ligne courante du fichier
  48.         while (fgets(szbuff, sizeof szbuff, m_File) != NULL && i < LMAX)
  49.         {
  50.            // On decoupe la ligne selon le charactere de séparation SEP (" " )
  51.            char* token = szbuff;
  52.  
  53.            // mise a zero du compteur des ordonnees
  54.            int j = 0;
  55.  
  56.            // On lit les éléments découpés un à un et on les stocke dans le tableau Tab
  57.            while (*token != 0 && j < CMAX)
  58.            {
  59.               // On stocke la valeur lue dans le tableau
  60.               Tab[i][j] = strtod (token, &token);
  61.               token++;
  62.  
  63.               // On incremente le compteur des ordonnées
  64.               j++;
  65.            }
  66.            nb_col = j;
  67.  
  68.            // On incrémente le compteur des abscisses
  69.            i++;
  70.         }
  71.         nb_lin = i;
  72.         /* fermeture du fichier */
  73.         fclose (m_File), m_File = NULL;
  74.         ret = EXIT_SUCCESS;
  75.  
  76.         {
  77.            // On affiche le tableau pour etre sur que tout s'est bien passe...
  78.            int x;
  79.            int y;
  80.            for (x = 0;x < nb_lin;x++)
  81.            {
  82.               for (y = 0;y < nb_col;y++)
  83.               {
  84.                  printf("%8.2f", Tab[x][y]);
  85.               }
  86.               printf("\n" );
  87.            }
  88.         }
  89.      }
  90.      else
  91.      {
  92.         perror(PATH);
  93.         ret = EXIT_FAILURE;
  94.      }
  95.   }
  96.  
  97.   return ret;
  98. }


avec


1.0 2.1 1.2 1.8 7.4
1.5 15.6 3.7 12.4 10.2


produit


    1.00    2.10    1.20    1.80    7.40
    1.50   15.60    3.70   12.40   10.20


---------------
[1] Les fonctions standards et les calculs, utilisent 'double'.
[2] "rt" est une extension de Borland C. Elle inutile dans la plupart des cas.


Message édité par Emmanuel Delahaye le 05-03-2006 à 08:40:52

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-03-2006 à 02:16:41    

hichamelo a écrit :

bonjour,
 
....
 
voir mes connaissance en langage C, j'arrive a peine a recupérer les valeurs du fichier et en suite je les range dans tableau, mais pas plus, aucune connaissance des thread et encore moin les mutex avec condition.
 


 
Comment cela se fait il?


---------------
Mon feedback
Reply

Marsh Posté le 05-03-2006 à 10:32:53    

Citation :

Comment cela se fait il?


 
plus de notion en java et c++ (objet); sinon j'ai eu un psodo cours en C, qui n'explique pas grane chose, donc j'ai du chercher des cours sur internet, sinon les threads, c comme ca, il fo apprendre tout seul, pas de cours rien.
 
sinon merci beaucoup a frederic de la haye, ca se voi qu'il s'est donné de la peine.
pour la correction de mon code je trouve que c'est plutot claire comme ca, merci.
j'ai été sur le site que tu ma donné..., rien capté, j'ai lu tout les cours sur les mutex.
pas moyen de capté.
 
un bou de fil svp

Reply

Marsh Posté le 05-03-2006 à 10:47:19    

hichamelo a écrit :

sinon merci beaucoup a frederic de la haye,


Qui c'est celui-là ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-03-2006 à 13:24:30    

frederic, emanuelle..
un chat, un chien c'est pareille.
c'etait une erreur de frape! :lol:  
sinon une solution a mon problem, ca me rappelera surment de ton prenom.

Reply

Marsh Posté le 05-03-2006 à 13:29:33    

hichamelo a écrit :

frederic, emanuelle..


Problèmes de vue ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-03-2006 à 15:38:06    

alors il y a personne qui pe m'aidé?
 
svp :ange: , il me fo le truc pr demain... :cry:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed