[C] thread sur SUN et sur linux

thread sur SUN et sur linux [C] - C - Programmation

Marsh Posté le 11-11-2004 à 11:50:57    

bonjour,
 
j'ai fait un petit programme qui utilise un thread sur une machine sun, en compilant avec -lpthread, ca passe sans probleme. J'ai reprit ce code chez moi, et il ne veut plus compiler : message d'erreur :
 


gcc -I"." -lpthread -c labo3_main.c
labo3_main.c: In function `main':
labo3_main.c:62: parse error before `threads'
labo3_main.c:66: `threads' undeclared (first use in this function)
labo3_main.c:66: (Each undeclared identifier is reported only once
labo3_main.c:66: for each function it appears in.)
make: *** [labo3_main.o] Erreur 1


 
evidemment, il y a #include <pthread.h> dans ce fichier  :o


---------------
.
Reply

Marsh Posté le 11-11-2004 à 11:50:57   

Reply

Marsh Posté le 11-11-2004 à 11:59:59    

ton code :o

Reply

Marsh Posté le 11-11-2004 à 12:06:39    

Il y a des fonctions non-portable dans certaines version de cette lib, sans le code c'est vrai qu on ira pas loin.


Message édité par Diody le 11-11-2004 à 12:10:39
Reply

Marsh Posté le 11-11-2004 à 12:08:13    


 

Code :
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. const int NB_THREAD = 1;
  5. char *mot;
  6. int trouve=0;
  7. long int taille;
  8. void *LireFichier (void *fich)
  9. {
  10. char *buf;
  11. int tt,rc;
  12. buf = (char *)malloc(sizeof(char) * taille);
  13. while( rc = fread(buf,sizeof(char),taille,fich) )
  14. {
  15.  if(strncmp(buf,mot,taille)==0)
  16.  {
  17.   trouve++;
  18.  }
  19.  else
  20.  {
  21.   if(!rc)
  22.   {
  23.    fseek(fich , -(taille-1) , SEEK_CUR);
  24.   }
  25.  }
  26. }
  27. pthread_exit(NULL);
  28. }
  29. int main (int argc, char *argv[])
  30. {
  31. int i,rc,status;
  32. char mot1[25];
  33. FILE *fichier;
  34. if (argc != 2)
  35. {
  36.  printf("syntaxe : %s nom_fichier\n",argv[0]);
  37.  exit (-1);
  38. }
  39. fichier = fopen(argv[1],"r" );
  40. if( fichier == (FILE *) NULL)
  41. {
  42.  perror(argv[1]);
  43.  exit(-1);
  44. }
  45. puts("Quel mot a chercher ?" );
  46. scanf("%s",&mot1);
  47. taille = strlen(mot1);
  48. mot = (char *) malloc(sizeof(char) * taille);
  49. strcpy(mot,mot1);
  50. pthread_t threads[NB_THREAD];
  51. for (i=0;i<NB_THREAD;i++)
  52. {
  53.  rc = pthread_create(&threads[i] , NULL , LireFichier , (void *)fichier );
  54.  if (rc)
  55.  {
  56.   perror("Erreur de creation du thread " );
  57.   exit (-1);
  58.  }
  59. }
  60. //boucle d'attente de terminaison des threads
  61. for (i=0;i<NB_THREAD;i++)
  62. {
  63.  rc = pthread_join(threads[i],(void *)status);
  64. }
  65. puts(" ** Recherche terminee ** " );
  66. if(trouve != 0)
  67.  printf("'%s' trouve %d fois\n",mot1,trouve);
  68. else
  69.  printf("'%s' non trouve dans '%s'\n",mot1,argv[1]);
  70. pthread_exit(NULL);
  71. fclose(fichier);
  72. return 0;
  73. }


 
pas taper  :D  
 
ps : regarde pas à la logique du code  :whistle:


---------------
.
Reply

Marsh Posté le 11-11-2004 à 12:11:48    

heu, se serait possible que se soit a cause de  

Code :
  1. pthread_t threads[NB_THREAD];


 
qui doit etre jsute en dessous du main et pas au milieu ?


---------------
.
Reply

Marsh Posté le 11-11-2004 à 12:13:34    

declare ca : pthread_t threads[NB_THREAD]; au debut du main
 
[edit] owned
 
A mon avis sur sun tu compilais avec un compilateur c++;


Message édité par Diody le 11-11-2004 à 12:15:29
Reply

Marsh Posté le 11-11-2004 à 13:20:33    

Diody a écrit :

declare ca : pthread_t threads[NB_THREAD]; au debut du main
 
[edit] owned
 
A mon avis sur sun tu compilais avec un compilateur c++;


 
owned par moi en plus [:ddr555]
 
non, j'utilisait gcc, j'ai repris le meme makefile pour compiler ce fichier  :pt1cable:  
 
Peut etre que les versions de gcc utilisées ne sont pas les memes  :??:


---------------
.
Reply

Marsh Posté le 11-11-2004 à 13:55:44    

gcc-3.0 utilise le mode par défaut gnu9x, gcc-2.9 gnu8x

Reply

Marsh Posté le 11-11-2004 à 14:22:39    

Taz a écrit :

gcc-3.0 utilise le mode par défaut gnu9x, gcc-2.9 gnu8x


 
 :jap:  
 
moi qui ai la mauvaise (?) habitude de déclarer des varaibles un peut partout, j'ai souvent de mauvaises surprise sur mon linux  :D


---------------
.
Reply

Marsh Posté le 11-11-2004 à 14:28:12    

ce n'est pas une mauvaise habitude du tout. c'est même conseiller. seulement le C ANSI / iso89 ne le permet pas. gcc2.95 ne le permet pas par défaut car il suit l'ANSI. un truc genre -std=gnu9x devrait tout régler quelque soit ton compilateur.

Reply

Marsh Posté le 11-11-2004 à 14:28:12   

Reply

Marsh Posté le 11-11-2004 à 14:34:58    

Taz a écrit :

ce n'est pas une mauvaise habitude du tout. c'est même conseiller. seulement le C ANSI / iso89 ne le permet pas. gcc2.95 ne le permet pas par défaut car il suit l'ANSI. un truc genre -std=gnu9x devrait tout régler quelque soit ton compilateur.


 
ha, tu me rassure :)
 
j'essaierai cet option de gcc chez moi, encore merci :jap:


---------------
.
Reply

Marsh Posté le 11-11-2004 à 14:44:42    

Au pire, tu scopes. Je le fais parfois, même en C++ quand j'ai besoin qu'un destructeur soit appellé là ou je veux.
 
void f()
{
  // blablabla
 
  {
    phtread_t threads[5];
    // lalala, le reste
  }
}

Reply

Marsh Posté le 11-11-2004 à 14:45:23    

Lam's a écrit :

Au pire, tu scopes. Je le fais parfois, même en C++ quand j'ai besoin qu'un destructeur soit appellé là ou je veux.
 
void f()
{
  // blablabla
 
  {
    phtread_t threads[5];
    // lalala, le reste
  }
}


 
en fait, il verifie uniquement que les declarations soient en debut de bloc ?


---------------
.
Reply

Marsh Posté le 11-11-2004 à 14:49:42    

didier1809 a écrit :

en fait, il verifie uniquement que les declarations soient en debut de bloc ?


 
oui.
 

Reply

Sujets relatifs:

Leave a Replay

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