Qu'elle est cette erreur?

Résolu
linquisiteur -  
 linquisiteur -
Bonjour, je révise ma matière pour les examens de seconde session qui arrive à grand pas. Mais je suis bloquer sur une erreur que je ne connais pas.

Undefined                       first referenced
 symbol                             in file
initsema                            /var/tmp//ccQtVJvb.o
ld: fatal: Symbol referencing errors. No output written to ex6
collect2: ld returned 1 exit status



Le code (complet car je ne vois pas l'erreur)
Le code est simple. je fork une première fois pour demander les entiers et les mettre dans un tube.
Je fork une seconde fois pour faire la multiplication des 2 nombres et ensuite les remettre dans les tube.
Puis j'affiche avec le père.

Le code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>


// calcul de tube par 2 fils et renvoi au père
 int tube[2];
 int calcul(int, int);

 int main (int argc, char * argv[]){
  
  //verif tube crée
  if ((pipe(tube))<0){ perror("Le tube a rater"); exit(EXIT_FAILURE); }
  
  //fork du 1 fils
  pid_t a = fork();
  if(a<0){  perror("Le fork a rater"); exit(EXIT_FAILURE);}
  if(a==0){ 
            printf("Entrez 2 entiers pour les multiplier:\n");
            int nb[2];
            scanf("%3d %3d",&nb[0],&nb[1]);
            close(tube[0]);                                 	
            write(tube[1],&nb,sizeof(nb));
            
            exit(0);
  }
  
  //fork du second fils
  pid_t b = fork();
  if(b<0){  perror("Le fork a rater"); exit(EXIT_FAILURE);}
  if(b==0){ 
     int result, nb[2];
     close(tube[1]);                                 	
     read(tube[0],&nb,sizeof(nb));
     result = nb[0]*nb[1];
     close(tube[0]);
     write(tube[1],&result,sizeof(result));
     }
     
  //père
  int rep;
  close(tube[1]);
  write(tube[0],&rep,sizeof(rep));
  printf("Le résultat de la multiplication est %d \n",rep);
     
     
  wait(0); wait(0);
  
 return 0;
 }

 int calcul(int nb1, int nb2){
 return (nb1 * nb2);
 }



Merci d'avance!

7 réponses

  1. linquisiteur
     
    Désoler Nassim je ne vois pas ton message, je peux par contre le lire sur ma boite mail.
    tu peux voir ce livre
    
    http://filerack.net/file/0s3M85
    


    désoler je ne télécharge pas et surtout ne répond pas au questionnaire obligatoire.
    0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Sur quel OS réalises-tu ton code ?
    0
  3. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  4. Utilisateur anonyme
     
    Bonjour

    D'après le nom du fichier, c'est un problème à l'édition des liens. Tu utilises quelque part dans ton code le symbole "initsema" (mais on ne le voit pas dans le code que tu donnes) alors qu'il n'est défini nulle part.

    Il te manque peut-être une bibliothèque.
    0
  5. linquisiteur
     
    effectivement je voulais mettre une sémaphore mais j'ai oublier. J'ai retirer la sémaphore quand j'ai copier..
    J'ai essayer et le problème vient de là. Ce qui m'arrange car j'ai exactement la même erreur dans un autre code. Je vais modifier cela. (De plus j'en aurais besoin dans le code car il est pas synchroniser

    Edit: Voici le code modifier suivi des code sema.c et sema.h

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
    #include "semaphore.h"
    
    // calcul de tube par 2 fils et renvoi au père
     int tube[2];
     
     int main (int argc, char * argv[]){
     
         //init des séma
      semaphore calcul;
      initsema(calcul,1);
      
      //verif tube crée
      if ((pipe(tube))<0){ perror("Le tube a rater"); exit(EXIT_FAILURE); }
     
      //fork du 1 fils
      pid_t a = fork();
      P(calcul);
      if(a<0){  perror("Le fork a rater"); exit(EXIT_FAILURE);}
      if(a==0){ 
                printf("Entrez 2 entiers pour les multiplier:\n");
                int nb[2];
                scanf("%3d %3d",&nb[0],&nb[1]);
                close(tube[0]);                                  
                write(tube[1],&nb,sizeof(nb));
                V(calcul);
                exit(0);
      }
       P(calcul);
      //fork du second fils
      pid_t b = fork();
      if(b<0){  perror("Le fork a rater"); exit(EXIT_FAILURE);}
      if(b==0){ 
         int result, nb[2];
         close(tube[1]);                                  
         read(tube[0],&nb,sizeof(nb));
         result = nb[0]*nb[1];
         close(tube[0]);
         write(tube[1],&result,sizeof(result));
          V(calcul);
         }
      P(calcul);  
      //père
      int rep;
      close(tube[1]);
      write(tube[0],&rep,sizeof(rep));
      printf("Le résultat de la multiplication est %d \n",rep);
      V(calcul);
         
      wait(0); wait(0);
      
     return 0;
     }
    
    
    


    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
    
    
    0
    1. linquisiteur
       
      chercher plus j'ai trouver !!

      j'ai oublier d'ajouter semaphore.c dans
      gcc ex8.c semaphore.c -o ex8
      0
  6. linquisiteur
     
    bon finalement j'ai encore un problème que je ne comprend pas
    aucun de mes printf n'est bon. Même pas le 1er tout au début. Mon programme compile et j'ai résolu l'erreur d'avant..
    Merci d'avance
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
    #include "semaphore.h"
    
    // calcul de tube par 2 fils et renvoi au père
     int tube[2];
    
     int main (int argc, char * argv[]){
     printf("prout");
         //init des séma
      semaphore calcul;
      initsema(calcul,1);
      
      //verif tube crée
      if ((pipe(tube))<0){ perror("Le tube a rater"); exit(EXIT_FAILURE); }
     
      //fork du 1 fils
      pid_t a = fork();
      printf("ici0");
       P(calcul);
      if(a<0){  perror("Le fork a rater"); exit(EXIT_FAILURE);}
      if(a==0){ 
                printf("Entrez 2 entiers pour les multiplier:\n");
                int nb[2];
                scanf("%3d %3d",&nb[0],&nb[1]);
                close(tube[0]);                                 	
                write(tube[1],&nb,sizeof(nb));
    			printf("ici");
                V(calcul);
                exit(0);
      }
       P(calcul);
       printf("ici2");
      //fork du second fils
      pid_t b = fork();
      if(b<0){  perror("Le fork a rater"); exit(EXIT_FAILURE);}
      if(b==0){ 
         int result, nb[2];
         close(tube[1]);                                 	
         read(tube[0],&nb,sizeof(nb));
         result = nb[0]*nb[1];
         close(tube[0]);
         write(tube[1],&result,sizeof(result));
          V(calcul);
         }
      P(calcul);  
      //père
      int rep;
      close(tube[1]);
      write(tube[0],&rep,sizeof(rep));
      printf("Le résultat de la multiplication est %d \n",rep);
      V(calcul);
         
      wait(0); wait(0);
      
     return 0;
     }
    
    
    0