Programmation c sous linux

Fermé
salahprince Messages postés 2 Date d'inscription dimanche 24 mai 2015 Statut Membre Dernière intervention 7 juin 2015 - Modifié par Whismeril le 8/06/2015 à 07:49
chris79 Messages postés 97 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 - 10 juin 2015 à 20:08
Bonjour,

..Aidez moi SVP!!!!!!!!!!!
J'ai écrit un prgrm pour exécution 4 processus on parallèle sous linux (c) mais Il ya une erreur svp aidez moi pour Correction de l'erreur .....
le prgrm est :


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
  
  int n,m,k;
     printf("n = "  );
     scanf("%d",&n);
     printf("m = "  );
    scanf("%d",&m);
     printf("k = "  );
    scanf("%d",&k);

    int a[n][m];
    int b[m][k];
    int w[n][k];
    int c[n];
    int d[m];
    int i,j,h;
    int s,q ;
 int pid , pid1,pid2,pid3;
 q=0;
      //entre de la prossuse pid; 
   pid = fork();
   if(pid==-1)
    {
      printf("Can't fork\n");
    }
  if(pid==0)
    //entre de la valzur a;
    {  
    for(i =0; i< n;i++)
    {
       
        for(j = 0;j < m;j++)
        {
              printf("\ta[%d][%d]= ",i,j);
              scanf("%d",&a[i][j]);
              printf("\n");
             
        }
   }
   
     //entre de la vqleur b;
       printf("\n");
    for(i =0; i< m;i++)
    {
       
        for(j = 0;j < k;j++)
        {
              printf("\tb[%d][%d]= ",i,j);
              scanf("%d",&b[i][j]);
              printf("\n");
             
        }
   }
q=1;
wait(pid1);wait(pid2);wait(pid3);
 //afiche de la valzur a;
   printf("\n");
   for(i =0; i< n;i++)
    {
       
        for(j = 0;j < m;j++)
        {
           printf("\n a[%d][%d]=%d",i,j,a[i][j]);
              printf("\n");
       printf("\n d[%d]=%d",i,d[i]);
                printf("\n");
            
             
        }
  printf("\n c[%d]=%d",i,c[i]);
                printf("\n");

   }
//afiche de la valzur b;
   printf("\n");
   for(i =0; i< m;i++)
    {
       
        for(j = 0;j < k;j++)
        {
           printf("\n b[%d][%d]=%d",i,j,b[i][j]);
              printf("\n");
            
             
        }
   }
//afiche de la valzur w;
   printf("\n");
   for(i =0; i< n;i++)
    {
       
        for(j = 0;j < k;j++)
        {
           printf("\n w[%d][%d]=%d",i,j,w[i][j]);
              printf("\n");
            
             
        }
   }

   }
   //fin la prossuse pid;
   if(q==1)
{ 

//entre de la prossuse pid1;
  pid1 = fork() ; 
if (pid1 == -1) {
printf("Can't fork\n");
}
if (pid1==0) {
  
  for(i = 0; i < n;i++ )
{
for(h = 0; h < k;h++ )
{
      s=0;
for(j = 0; j < m;j++ )
 {
      s=s+a[i][j]*b[j][h];
                               
}
w[i][h]=s;
 

}
} 
}  
  //fin la prossuse pid1;

 
  //entre de la prossuse pid2.; 
  
pid2 = fork() ; 
if (pid2 == -1) {
printf("Can't fork\n");
}
if (pid2==0) {
 wait(pid1);


s=0;
    for(i =0; i< n;i++)
    {
       
        for(j = 0;j < k;j++)
        {
             s=s+w[i][j];
        
        }
        c[i]=s;
         
        s=0;
   }
   }
  
   printf("\n");
   //fin la prossuse pid2;
   

    //enter de la prossuse pid3;  
  pid2 = fork() ; 
if (pid2 == -1) {
printf("Can't fork\n");
}
if (pid2==0) {
 wait(pid1);
  
    s=0;i=0;j=0;
  
    while( i < k )
    {
           
          s=s+w[j][i]; 
           j++;
           if(j = n -1)
           {
                d[i]=s;
                 
                printf("\n");
               i++;
               j=0;
               s=0;
                
                
                }
           
           
           }
 //fin la prossuse pid2;

  system("PAUSE"); 
  return 0;
}



EDIT: Ajout de la coloration syntaxique.


A voir également:

1 réponse

chris79 Messages postés 97 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25
10 juin 2015 à 20:08
Slt,

Si ton programme ne compile pas, c'est lié aux raisons suivantes :
- tu utilises mal la fonction wait(). Pour info son prototype est le suivant :
pid_t wait (int * status)

--> cette fonction bloque le processus jusqu'à ce qu'un des processus fils se termine. Elle renvoie ensuite le pid du fils terminé. La variable status indique les circonstances de fin de processus du fils...

Toi tu veux attendre un fils spécifique, tu dois donc utiliser la fonction dédiée :
pid_t waitpid (pid_t pid, int * status, int options)

Soit par exemple :
 waitpid(pid1,NULL,0);


Au passage, pid1 et autres sont de type pid_t et non int. Il faut veiller à respecter l'API définie surtout que int a une taille qui dépend de la machine ...

- Autre erreur, tu écris :
if(j = n -1)

au lieu de :
if(j == n -1)

C'est vicieux car ça doit certainement compiler mais ne teste pas la valeur de j mais lui assigne n-1....bref une sale histoire.
--> Une bonne habitude à prendre est de placer la variable que tu testes à droite de l'opérateur :
if ( j = MACONSTANTE) {} // ne génère pas d'erreur...vicieux !
if (MACONSTANTE = j) {} // génère une erreur dc on évite un debug futur ;)


Après j'ai pas regardé ce que faisait ton prog dans le détail....il faut vraiment prendre l'habitude de nommer les variables par ce qu'elles représentent...."a" ou "b" ça ne veut pas dire grand chose....

Bonne chance ^^
0