Logo du forum
 

Forum TT-Hardware

| Inscription | | Recherche | | FAQ | | Accueil | | Liste des membres |
| Calendrier |
 
Vous n'êtes pas identifié! [Connexion] ou [Inscription] Forum » Programmation » [C / C++ / C#] » Erreur compilation
Login Mot de passe

1 visiteurs sur ce topic (0 membre(s), 1 invité(s) )

Auteur
Sujet : Erreur compilation
zorgh



 






Message du 10-03-2008 @ 17:54


Bonjour,

J'ai une erreur sur ce code source; Je ne parviens pas à la corriger.

Code :



#include <stdio.h>
#include <stdlib.h>

int pip[2]; /* descripteur de pipe */
char buf[6];

main()
{
pipe(pip); /* creation pipe */
switch (fork())
{
case -1:
perror("fork");
exit(1);
case 0:
fils();
default:
pere();
}
pere()
{
close pip[0];
write (pipe[1],"hello",5); /* écriture pipe */
exit(0);
}
fils()
{
close pip[0];
read (pipe[0],buf,5); /* lecture pipe */
exit(0);
}
}




L'erreur est la suivante erreur: expected «;" before «{" token --> ligne au niveau de { après l'appel pere()

Toute aide est la bienvenue.

Merci bien
- Haut de page -
Paddy



 






Message du 10-03-2008 @ 18:38

Est-ce normal que tes méthodes pere() et fils() soient dans ta méthode main() ?
Mes cours de C/C++ sont trop loin pour que je me souvienne si cela vient bien de là :p

Si je comprend bien, ton compilateur n'arrive pas à comprendre la ligne
Code :


}
pere()
{



Pour lui, tu fait un 2e appel à la méthode pere(), il attend donc un ";", alors qu'en fait c'est la première ligne de définition de la méthode (si j'ai bien compris :p)

Le code correct serai donc, si j'ai raison :
Code :


#include <stdio.h>
#include <stdlib.h>

int pip[2]; /* descripteur de pipe */
char buf[6];

main()
{
pipe(pip); /* creation pipe */
switch (fork())
{
case -1:
perror("fork");
exit(1);
case 0:
fils();
default:
pere();
}
}
pere()
{
close pip[0];
write (pipe[1],"hello",5); /* écriture pipe */
exit(0);
}
fils()
{
close pip[0];
read (pipe[0],buf,5); /* lecture pipe */
exit(0);
}



HS : Grr, ma signature a encore perdu ses retours à la ligne :'(

[message édité le 10-03-2008 @ 18:43 Par Paddy]
- Haut de page -
Dédé



 






Message du 10-03-2008 @ 18:54

Ouaip, c'est juste un mélange d'accolades à priori :o
- Haut de page -
zorgh



 






Message du 10-03-2008 @ 19:44

Bonsoir,

Merci pour ces compléments d'informations.
Le raisonnement de Paddy semble correct excepté le fait que le compilateur considère close comme une variable non déclarée dans la fonction pere() et fils(). La déclaration du pipeline se faisant dans la fonction principale.

Je n'ai pas suffisament de recul et d'expérience pour corriger ce problème d'agencement d'accolades comme le fait remarquer Dédé.
- Haut de page -
Icy



 






Message du 10-03-2008 @ 19:47

utilise un ide qui fait le format pour toi ...
par ailleurs, il manque pas des break dans ton switch?
- Haut de page -
zorgh



 






Message du 10-03-2008 @ 19:57

Pourquoi placer un break ?

C'est un code source issu d'un support de formation. J'ai repris le code. J'ai utilisé l'éditeur vim sous nux et geany comme IDE.
- Haut de page -
Icy



 






Message du 10-03-2008 @ 19:59

ah je sais pas ce que dois faire ton pgm, mais si ton fork return 0, il fera pere et fils si tu met pas de break ...

[message édité le 10-03-2008 @ 20:04 Par Icy]
- Haut de page -
Paddy



 






Message du 10-03-2008 @ 20:02

Ya un exit(1) dans le cas -1 Icy, il va pas "killer le process" et donc éviter de passer dans le deuxième case ?

[message édité le 10-03-2008 @ 20:04 Par Paddy]
- Haut de page -
Icy



 






Message du 10-03-2008 @ 20:04

Paddy a écrit

Ya un exit(1) dans le cas -1 Icy, il va pas "killer le process" et donc éviter de passer dans le deuxième case ?



voulais dire return 0 ;)
- Haut de page -
B2000



 






Message du 10-03-2008 @ 22:35

manque les accolades pour delimiter le case 0 (obligation de mettre des accolades quand plusieurs fonctions séparées par des points virgules)

Code :

case 0:
{
fils();
default:
pere();
}



[edit]
j'ai rien dit, c'est tellement pas lisible que j'avais pas vu le default au milieu
par contre, y a pas de break comme le signal Icy...
[/edit]

[message édité le 10-03-2008 @ 22:37 Par B2000]
- Haut de page -
zorgh



 






Message du 12-03-2008 @ 18:15

Voici le code qui va bien.

Il fallait des () de fermeture sur la fonction close et sortir effectivement les fonctions pere() et fils() de la fonction principale.

Un break n'est pas nécessaire puisque j'ai un exit(1).

Code :


#include <stdio.h>
#include <stdlib.h>

int pip[2]; /* descripteur de pipe */
char buf[6];

int main()
{   
   pipe(pip); /* creation de pipe */
   switch (fork())
   {
      case -1: /* Code de gestion de l'erreur */
      perror("fork");
      exit(1);
      case 0: /* Code du processus fils */
      fils();
      default: /* Code du processus père */
      pere();
   }
   return 0;
}

pere()
{
   close (pip[0]);
   write (pip[1],"hello",5); /* écriture pipe */
   exit(0);
}
fils()
{
   close (pip[0]);
   read (pip[0],buf,5); /* lecture pipe */
   exit(0);
}



Merci encore pour vos contributions.
- Haut de page -
B2000



 






Message du 12-03-2008 @ 18:20

il faut quand meme un break pour le case 0 (avant le default)... a moins que cela ne soit volontaire mais pas tres courant
- Haut de page -
Icy



 






Message du 12-03-2008 @ 18:36

de tt facon s'il ne faut pas de break le cas 0 ne sert a rien ...
- Haut de page -
B2000



 






Message du 12-03-2008 @ 19:35

Icy a écrit

de tt facon s'il ne faut pas de break le cas 0 ne sert a rien ...



si, il sert a appeler fils() puis pere() alors que le default n'appelle que pere()
- Haut de page -
Icy



 






Message du 12-03-2008 @ 19:46

aneffet :aneffet:

suis trop crevé moi :p
- Haut de page -

Plan du forum | Contacter l'administrateur

Powered by SoulBB 3.0.1
© Soulmanto, 2003-2006

Valid XHTML 1.0 Transitional

Page générée en 0.092 secondes