Pourquoi mon programme ne peut-il pas être compilé sous Windows 7 en français? [fermé]


237

J'utilise Windows 7 en français et j'essaie de compiler ce programme vraiment basique, mais Visual Studio est têtu et refuse de se conformer. J'ai également essayé de le compiler avec GCC 4.7 et Clang trunk sur Coliru et j'obtiens plus ou moins les mêmes erreurs (la sortie est inférieure au code), bien que je pense que Coliru fonctionne sur un système d'exploitation anglais, donc je ne m'attendrais pas à ce qu'il fonctionne de toute façon .

Qu'est-ce que je fais mal? Et comment puis-je le réparer?

Code

#inclure <iostream>

ent principal(ent argn, ent** argm)  // entier, nombre d'arguments, valeur des arguments
{
   std::cendehors << "Bonjour le monde!\n";
   renvoi SORTIE_SUCCÈS;
}

Production

principal.cpp:1:6: erreur: prétraitement de la directive invalide #inclure
     #inclure <iostream>
      ^
principal.cpp:6:8: erreur: '\303' égaré dans le programme
        renvoi SORTIE_SUCCÈS;
        ^
principal.cpp:6:8: erreur: '\210' égaré dans le programme
principal.cpp:3:5: erreur: «ent» ne désigne pas un type
     ent principal(ent argn, ent** argm)  // entier, nombre d'arguments, value des arguments
     ^

3
Vous devriez probablement utiliser std::findeligneau lieu d'utiliser un \npersonnage :)
Aliou

66
Cela ressemble à une question de blague pour le 1er avril .....
Basile Starynkevitch

2
Êtes-vous sûr que iostreamle nom correct de l'en-tête est en français?
Bart van Nierop

9
Je pense que le problème réside dans la langue que vous avez choisie.
phoops

2
Ne méprisez pas le compilateur, lui et moi avons tous deux eu du mal à apprendre le français. Nous faisons de notre mieux, alors donnez-nous au moins 6-8 semaines de plus pour apprendre!
user1942027

Réponses:


62

De nombreux problèmes sont dus à la mise en cache , mais le vôtre est l'un des autres types de problèmes difficiles : nommer les choses. Oui, la localisation est difficile.

Vous n'avez pas mentionné la variante de français que vous utilisez, mais d'après le message d'erreur, je pense que vous utilisez «français (France)» (ce que nous, les utilisateurs d'OS civilisés, appelons fr_FR). Les fr_FRparamètres régionaux de MS se comportent de manière très étrange: les lettres accentuées majuscules sont mappées sur leur homologue non accentué (pour une compatibilité descendante avec certains modèles de machines à écrire). Vous devez donc écrire SORTIE_SUCCESau lieu de SORTIE_SUCCÈS.

Une solution de contournement consiste à utiliser la langue «français (Monaco)» ( fr_MC) , où les lettres accentuées majuscules fonctionnent comme prévu. Malheureusement, la version monégasque du compilateur est très très chère. Vous pouvez également utiliser la version canadienne-française, française-belge ou française-suisse, mais celles-ci exigent toutes que vous soumettiez un fichier source bilingue ( fr_CA+ en_CA), trilingue ( fr_BE+ nl_BE+ de_BE) ou quadrilingue ( fr_CH+ it_CH+ de_CH+ rm_CH). Les variantes africaines du français sont sorties car elles sont trop pauvres pour se permettre un compilateur C ++, cependant vous pouvez utiliser C à la place.

Ensuite, il y a d'autres erreurs de syntaxe dans votre programme:

  • Vous avez oublié de traduire certains mots clés.
  • Attention, le compilateur et la documentation n'utilisent pas toujours la même traduction pour le même mot.
  • Vous n'avez pas tenu compte du fait que les adjectifs viennent après le nom en français.
  • Vous utilisez le mauvais type de guillemets.

J'ai wollun essayé le code suivant dans le compilateur C ++ inclus dans Émaxe 51,70, et cela a fonctionné:

#inclure <fluxes>

principal ent(argn ent, argm **ent)  // entier, nombre d'arguments, valeur des arguments
{
   norme::sortiec << « Bonjour à tout le monde !\n » ;
   retourner SORTIE_SUCCÈ;
}

Certains langages ont une meilleure prise en charge de l'internationalisation que C ++. Par exemple, voici un programme dans LOGO (à ne pas confondre avec LOGO bien sûr).

pour exemple
  répète 18 [av 5 td 10]
  td 60
  répète 18 [av 5 td 10]
fin

151

Le problème est évidemment que vous incluez le mauvais en-tête standard:

#inclure <iostream>

devrait être:

#inclure <fluxes>

En outre, vous constaterez que cela fonctionne beaucoup mieux si vous utilisez Studio Visuel Micromou ou les outils CCG (pour "Collection de Compilateurs GPU", btw), plutôt que leurs parents MVS ou GCC plus courants.


5
Attention aussi à donner à vos fichiers d'en-tête l'extension «.e» pour «en-tête»
Pierre Arlaud

2
@ArlaudPierre: il s'avère que vous pouvez utiliser l'extension de votre choix pour vos fichiers d'en-tête, à l'exception des fichiers d'en-tête de bibliothèque C-standard qui sont nécessaires pour utiliser l' .eextension. Mais bien sûr, les extensions standards tels que .e, .ee, .eppsont préférés par convention ... Pour en savoir plus: stackoverflow.com/questions/441568/...
Martin J.

@MartinJ. D'accord, même si je ne voulais pas dire que c'était obligatoire quand j'ai dit "soyez prudent".
Pierre Arlaud

31
GNPU n'est pas UNIX.
abuzittin gillifirca

5
Je me souviens de De Gaulle criant "Vive le logiciel libre!" ...
Axel

111
  1. Vous avez une erreur sémantique - le deuxième argument de la fonction d'entrée doit être de type cara**, pas ent**:

    ent principal(ent argn, cara** argm)
  2. Pour l' <iostream>erreur, @MartinJ. déjà correctement indiqué que vous devriez utiliser à la <esflux>place.

  3. En ce qui concerne les autres erreurs, il semble que votre compilateur soit simplement en grève. Cela peut se produire occasionnellement lors de la compilation du code français et devrait se corriger en quelques jours.


51

J'essaie de compiler ce programme vraiment basique .

Ce n'est pas un programme BASIC, donc Visual Studio ne sait pas quoi en faire.

De plus, sur un système français, vous devez passer un programme au compilateur.


6
"réussir un programme " <3
Pierre Arlaud

5
Donc ce que vous dites, c'est "Ceci n'est pas un programme BASIC".
Stuart Olsen

44

Bonjour Légèreté fait la course en orbite ,

Je voudrais souligner que même si vous suivez toutes les réponses données ici, votre programme ne compilera toujours pas à cause de votre ponctuation. Les points-virgules sont précédés d'un espace insécable en français.

Je recommanderais ce qui suit:

#inclure <esflux>

ent principal(ent narg, cara** marg)  // entier, nombre d'arguments, valeur des arguments
{
   std::cendehors << "Bonjour le monde !\n" ;
   renvoyer SORTIE_SUCCÈ;
}

Veuillez noter que j'ai changé argnpour narg, car c'est plus naturel en français (rien à voir avec les notations hongroises cependant)!

Edit: suivi la recommandation d'Angew


35

Presque tout a été couvert dans les réponses précédentes, mais si je peux ajouter:

renvoyer SORTIE_SUCCÈS ; // correct, but bad pratice

c'est certes autorisé, mais ce qui suit est généralement préféré:

capitulation ; // a better, frenchier approach

3
les deux ne sont-ils pas sémantiquement équivalents en français C?

17

Vous devez référencer le pré-processeur français:

#inclure <Montebourg>

hummm ... trop tard, c'est obsolète. La nouvelle version sera disponible cette semaine.


17

Je me rends compte que cela ne s'applique pas à cette situation particulière, mais il est important de garder à l'esprit le sexe de vos objets lors de la programmation en français. Il existe 2 types de classes ( genre) genre::masculinsetgenre::féminin

Par exemple:

genre::masculins Hommes {}
genre::féminin Femme {}

De plus, lors du passage thisà une autre fonction, l'appel de fonction est préfixé avec la liste des paramètres plutôt que suffixé:

genre::masculins Croissant {
    nul nourrir(Hommes hommes) {
        hommes.(ce)manger ;
    }
}

ou

genre::féminin Grenouille {
    nul nourrir(Hommes hommes) {
        hommes.(cette)manger;
    }
}

Pour plus d'informations: Wikipedia Word Order


15

Et si vous réessayez après les heures du déjeuner (12-22 h)? De plus, si vous obtenez plus d'un processeur, ils peuvent être en grève. Vous pouvez cependant récupérer votre proc avec cette commande (française) de Windows 7:

set max-working-hours-a-week = 35

Répétez lorsque vous êtes coincé (mais n'oubliez pas de baisser le nombre à chaque fois!).


2
+1, et je pense que cela set pension-starting-age = 62pourrait aussi aider, pourrait changer pour set pension-starting-age = 60bientôt ...
Axel

Bien sûr, l'âge de départ à la retraite pourrait aussi faire l'affaire! Où avais-je la tête? :-)
Sylvain Rodrigue

10

Il semble que vous ayez oublié d'installer le FrenChPP++package. Après une installation réussie (vous devrez compiler FrenChPP++sur un compilateur c ++ standard s'il n'y a pas de paquets binaires pour votre système (nous, à la grenouille non autorisée, recommandons d'utiliser g ++ pour cela, mais n'hésitez pas à utiliser clang aussi, mais ignorez les avertissements)) vous devrez créer un nouveau projet, et copiez-le simplement dans le principal.fcppfichier nouvellement créé . Ensuite, lors de l'exécution, le FrenChPP++précompilateur (qui fonctionne de manière très similaire à la façon dont Qt gère son mécanisme de signaux / slot) analysera tous les .fcppfichiers et "traduira" le .fcppen valide .cpppuis les compilera en utilisant votre compilateur par défaut du système.




7

Il y a tellement d'erreurs dans votre code, la plupart d'entre elles ont déjà été traitées dans les autres réponses. Mais ne savez-vous pas que les créateurs l'ont C++conçu pour que le code source du programme ne soit pas trop long lorsqu'il est traduit?

Ce n'est pas le cas std::cendehors, mais std::deh(abréviation de dehors ) comme cela se std::cintraduit par std::ded(pour dedans ).

Notez également qu'il existait auparavant des compilateurs qui ne se vidaient pas automatiquement \n, il est donc préférable de les utiliser std::findl( fin de ligne ). Donc ça devrait être comme ça:

   std::deh << "Bonjour le monde!" << std::findl; 

EDIT: Désolé, je n'ai pas repéré une autre erreur. La forme correcte est bien sûr d'utiliser des guillemets comme ceci:

   std::deh << «Bonjour le monde << std::findl; 

2
Bien repéré pour les guillemets
jwav

Ces compilateurs n'avaient-ils pas encore à vider la sortie à la fin du processus?
Courses de légèreté en orbite du

1
@LightnessRacesinOrbit: Oui, en principe, vous avez raison, mais méfiez-vous des différences d'implémentation dans la version française, car le rinçage en France peut conduire à des résultats indésirables ( en.wikipedia.org/wiki/French_toilet ).
Axel

5

Vous ne pouvez pas utiliser de mots clés français dans un programme C ++ (ou C). Vous devez coder

 #include <iostream>
 //  ^^^  the english word "include" 

et également

 return EXIT_SUCCESS;

et bien sûr le code int main(int argc, char**argv) etc ...

(merci pour votre blague du poisson d'avril!)


9
Oh vraiment? Cela a toujours fonctionné pour moi dans le passé. Existe-t-il un indicateur de compilation que je peux définir?
Courses de légèreté en orbite le

peut-être #define SORTIE_SUCCÈS EXIT_SUCCESS
Jerry1

1
"il est manquant espace ...": Celui qui a fait la traduction ne connaît pas le français. (Par expérience: évitez les versions traduites du compilateur. Il n'y a pas de traductions formellement établies et universellement acceptées pour de nombreux termes techniques, et vous finirez par essayer de deviner les choix des traducteurs afin de comprendre ce que le les messages d'erreur signifient vraiment.)
James Kanze

18
@JamesKanze: Pensez-vous donc que l'espagnol pourrait mieux fonctionner? Ou?
Courses de légèreté en orbite du

2
eh bien, il y a un attemp pour tranlaste C ++, voir FrenC github.com/carado/FranC , c'est juste beaucoup de #define: D
Lesto

4

Depuis que M. George Bush a interdit les frites françaises au profit des Liberty Fries plus savoureux (et des Freedom Fries moins savoureux mais tout aussi patriotiques), d'autres sociétés américaines retirent également le soutien au français dans leurs produits.

Vous devez utiliser un compilateur antérieur à 2003 ou envoyer un courrier à http://www.whitehouse.gov/contact/submit-questions-and-comments pour leur demander s'ils prévoient de revenir bientôt sur la situation.


3

Tout d'abord, vous devez

#inclure <clibstd>

avant de pouvoir utiliser la constante SORTIE_SUCCÈS.

Un autre problème avec votre code C ++ est que vous avez oublié d'utiliser std :: lend et que vous avez plutôt utilisé '\ n' dans votre chaîne de sortie - cela ne fonctionnera pas en code français, évidemment, seul le code écrit en anglais et en russe est autorisé pour faire ça.

Encore plus, vous avez utilisé une mauvaise indentation (GCC en français nécessite des tabulations au lieu d'espaces) et le placement des accolades (vous devez placer des accolades sur la même ligne chaque fois que possible, aucun espace entre eux n'est autorisé); les garder inchangés générera des erreurs d'exécution "vous ne connaissez pas votre tabulation, Jacques" et "pas assez d'amour entre accolades" dans votre code.

Après avoir modifié ces lignes, le code a été compilé avec succès. Il ne fonctionne toujours pas, probablement pour les raisons indiquées ici .

Extrait: http://ideone.fr/sQbL6E

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.