Warum kann mein Programm unter Windows 7 nicht auf Französisch kompiliert werden? [geschlossen]


237

Ich verwende Windows 7 French und versuche, dieses wirklich grundlegende Programm zu kompilieren, aber Visual Studio ist hartnäckig und weigert sich, die Anforderungen zu erfüllen. Ich habe auch versucht, es mit GCC 4.7 und Clang Trunk auf Coliru zu kompilieren, und ich erhalte mehr oder weniger die gleichen Fehler (die Ausgabe befindet sich unter dem Code), obwohl ich denke, dass Coliru unter einem englischen Betriebssystem ausgeführt wird, sodass ich nicht erwarten würde, dass es trotzdem funktioniert .

Was mache ich falsch? Und wie kann ich das beheben?

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;
}

Ausgabe

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
Sie sollten wahrscheinlich std::findeligneanstelle eines \nZeichens verwenden :)
Aliou

66
Es sieht aus wie eine Scherzfrage für den 1. April .....
Basile Starynkevitch

2
Sind Sie sicher, dass iostreamder korrekte Name der Kopfzeile auf Französisch lautet?
Bart van Nierop

9
Ich denke, das Problem liegt in der Sprache, die Sie gewählt haben.
Phoops

2
Schauen Sie nicht auf den Compiler herab, er und ich haben es beide schwer, Französisch zu lernen. Wir versuchen unser Bestes, also geben Sie uns noch mindestens 6-8 Wochen Zeit, um zu lernen!
user1942027

Antworten:


62

Viele Probleme sind auf das Caching zurückzuführen , aber Ihr Problem ist eines der anderen schwierigen Probleme : das Benennen von Dingen. Ja, die Lokalisierung ist schwierig.

Sie haben nicht erwähnt, welche Variante von Französisch Sie verwenden, aber aus der Fehlermeldung geht hervor, dass Sie "Französisch (Frankreich)" verwenden (was wir Benutzer zivilisierter Betriebssysteme nennen fr_FR). Das fr_FRGebietsschema von MS verhält sich sehr seltsam: Buchstaben mit Akzent in Großbuchstaben werden ihrem Gegenstück ohne Akzent zugeordnet (aus Gründen der Abwärtskompatibilität mit einigen Schreibmaschinenmodellen). Sie müssen also SORTIE_SUCCESstatt schreiben SORTIE_SUCCÈS.

Eine Problemumgehung besteht darin, die Sprache „Französisch (Monaco)“ ( fr_MC) zu verwenden , in der Buchstaben mit Akzent in Großbuchstaben wie erwartet funktionieren. Leider ist die Monaco-Version des Compilers sehr, sehr teuer. Sie können auch die kanadische französische, belgische französische oder schweizerische französische Version verwenden. Für diese müssen Sie jedoch eine zweisprachige ( fr_CA+ en_CA), dreisprachige ( fr_BE+ nl_BE+ de_BE) oder viersprachige ( fr_CH+ it_CH+ de_CH+ rm_CH) Quelldatei einreichen. Afrikanische Varianten von Französisch sind nicht verfügbar, da sie zu arm sind, um sich einen C ++ - Compiler leisten zu können. Sie können jedoch stattdessen C verwenden.

Dann gibt es andere Syntaxfehler in Ihrem Programm:

  • Sie haben vergessen, einige Schlüsselwörter zu übersetzen.
  • Beachten Sie, dass der Compiler und die Dokumentation nicht immer dieselbe Übersetzung für dasselbe Wort verwenden.
  • Sie haben nicht berücksichtigt, dass Adjektive auf Französisch nach dem Substantiv stehen.
  • Sie verwenden die falsche Art von Anführungszeichen.

Ich habe den folgenden Code im C ++ - Compiler von Émaxe 51,70 ausprobiert und es hat funktioniert:

#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È;
}

Einige Sprachen bieten eine bessere Internationalisierungsunterstützung als C ++. Zum Beispiel ist hier ein Programm in LOGO (nicht zu verwechseln mit LOGO natürlich).

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

151

Das Problem ist offensichtlich, dass Sie den falschen Standardheader einschließen:

#inclure <iostream>

sollte sein:

#inclure <fluxes>

Sie werden auch feststellen, dass dies viel besser funktioniert, wenn Sie Studio Visuel Micromou oder die CCG-Tools (steht übrigens für "Collection de Compilateurs GPU") verwenden, anstatt deren häufigere MVS- oder GCC-Verwandte.


5
Achten Sie auch darauf, Ihren Header-Dateien die Erweiterung «.e» für «en-tête» zu geben
Pierre Arlaud

2
@ArlaudPierre: Es stellt sich heraus, dass Sie für Ihre Header-Dateien jede gewünschte Erweiterung verwenden können, mit Ausnahme der C-Standard-Library-Header-Dateien, die für die Verwendung der .eErweiterung erforderlich sind . Aber natürlich sind die Standarderweiterungen wie .e, .ee, .eppsind vereinbarungsgemäß bevorzugt ... Einzelheiten: stackoverflow.com/questions/441568/...
Martin J.

@ MartinJ. Richtig, obwohl ich nicht gemeint habe, dass es obligatorisch ist, als ich "Sei vorsichtig" sagte.
Pierre Arlaud

31
GNPU n'est pas UNIX.
Abuzittin Gillifirca

5
Ich erinnere mich, wie De Gaulle "Vive le Logiciel Libre!" Rief ...
Axel

111
  1. Sie haben einen semantischen Fehler - das zweite Argument der Eingabefunktion sollte vom Typ sein cara**, nicht ent**:

    ent principal(ent argn, cara** argm)
  2. Für den <iostream>Fehler @MartinJ. bereits richtig darauf hingewiesen, sollten Sie <esflux>stattdessen verwenden.

  3. In Bezug auf die anderen Fehler scheint Ihr Compiler einfach im Streik zu sein. Dies kann gelegentlich beim Kompilieren von französischem Code auftreten und sollte sich in wenigen Tagen von selbst beheben lassen.


51

Ich versuche dieses wirklich grundlegende Programm zu kompilieren .

Dies ist kein BASIC-Programm, daher weiß Visual Studio nicht, was es damit anfangen soll.

Außerdem müssen Sie auf einem französischen System ein Programm an den Compiler übergeben.


6
"um ein Programm zu bestehen " <3
Pierre Arlaud

5
Sie sagen also: "Ceci n'est pas une program BASIC."
Stuart Olsen

44

Hallo Légèreté fait la kurs en orbite ,

Ich möchte betonen, dass Ihr Programm, obwohl Sie alle hier gegebenen Antworten befolgen, aufgrund Ihrer Interpunktion immer noch nicht kompiliert werden kann. Vor Semikolons steht ein nicht unterbrechendes Leerzeichen in Französisch.

Ich würde folgendes empfehlen:

#inclure <esflux>

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

Bitte beachten Sie, dass ich zu geändert argnhabe narg, da es auf Französisch natürlicher ist (nichts mit ungarischen Notationen zu tun)!

Edit: folgte der Empfehlung von angew


35

In den vorherigen Antworten wurde so ziemlich alles behandelt, aber wenn ich hinzufügen darf:

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

dies ist certes erlaubt, aber die folgende ist in der Regel bevorzugt:

capitulation ; // a better, frenchier approach

3
Sind die beiden semantisch nicht gleichbedeutend mit Französisch C?

17

Sie müssen auf den französischen Vorprozessor verweisen:

#inclure <Montebourg>

hummm ... zu spät, es ist veraltet. Die neue Version wird diese Woche verfügbar sein.


17

Mir ist klar, dass dies nicht für diese spezielle Situation gilt, aber es ist wichtig, das Geschlecht Ihrer Objekte zu berücksichtigen, wenn Sie auf Französisch programmieren. Es gibt 2 Arten von Klassen ( genre) genre::masculinsundgenre::féminin

Zum Beispiel:

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

Bei der Übergabe thisan eine andere Funktion wird dem Funktionsaufruf außerdem die Parameterliste vorangestellt und nicht das Suffix:

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

oder

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

Zur weiteren Bezugnahme: Wikipedia Word Order


15

Was ist, wenn Sie es nach den Mittagspausen (12 bis 14 Uhr) erneut versuchen? Wenn Sie mehr als einen Prozessor erhalten, können diese ebenfalls streiken. Sie können Ihren Prozess jedoch mit diesem (französischen) Windows 7-Befehl zurückerhalten:

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

Wiederholen Sie diesen Vorgang, wenn Sie nicht weiterkommen (aber vergessen Sie nicht, die Zahl jedes Mal zu verringern!).


2
+1, und ich denke, set pension-starting-age = 62könnte auch helfen, könnte sich set pension-starting-age = 60bald ändern ...
Axel

Natürlich könnte auch das Renteneintrittsalter den Trick machen! Où avais-je la tête? :-)
Sylvain Rodrigue

10

Sie haben anscheinend vergessen, das FrenChPP++Paket zu installieren . Nach einer erfolgreichen Installation (Sie müssen FrenChPP++auf einem Standard-C ++ - Compiler kompilieren, wenn keine Binärpakete für Ihr System vorhanden sind (wir vom Unauthorized Frog empfehlen die Verwendung von g ++, können aber auch clang verwenden, aber die Warnungen ignorieren). Sie müssen ein neues Projekt erstellen und es einfach kopieren und in die neu erstellte principal.fcppDatei einfügen . Bei der Ausführung FrenChPP++analysiert der Precompiler (der sehr ähnlich wie Qt mit seinen Signalen / Slot-Mechanismen umgeht) alle .fcppDateien und "übersetzt" sie .fcppin "valid" .cppund kompiliert sie dann mit Ihrem Systemstandard-Compiler.




7

Ihr Code enthält so viele Fehler, dass die meisten bereits in den anderen Antworten behandelt wurden. Aber wissen Sie nicht, dass die C++Entwickler es so gestaltet haben, dass der Quellcode des Programms bei der Übersetzung nicht zu lang wird?

Es ist nicht std::cendehors, aber std::deh(kurz für Dehors ) wie std::cinübersetzt für std::ded(für Dedans ).

Beachten Sie auch, dass es früher Compiler gab, die nicht automatisch gespült \nwurden. Daher ist es besser, sie zu verwenden std::findl( fin de ligne ). So sollte es sein:

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

EDIT: Entschuldigung, ich habe keinen weiteren Fehler entdeckt. Die richtige Form ist natürlich die Verwendung von Guillemets wie folgt:

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

2
Gut entdeckt für die Anführungszeichen
jwav

Mussten diese Compiler die Ausgabe nicht noch leeren, als der Prozess endete?
Leichtigkeitsrennen im Orbit

1
@LightnessRacesinOrbit: Ja, im Prinzip haben Sie Recht, aber achten Sie auf Unterschiede bei der Implementierung in der französischen Version, da das Flushing in Frankreich zu unerwünschten Ergebnissen führen kann ( en.wikipedia.org/wiki/French_toilet ).
Axel

5

Sie können keine französischen Schlüsselwörter in einem C ++ (oder C) -Programm verwenden. Sie sollten codieren

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

und ebenfalls

 return EXIT_SUCCESS;

und natürlich Code int main(int argc, char**argv) etc ...

(Danke für deinen Aprilscherz!)


9
Ja wirklich? Es hat in der Vergangenheit immer für mich funktioniert. Gibt es ein Compiler-Flag, das ich setzen kann?
Leichtigkeitsrennen im Orbit

vielleicht #define SORTIE_SUCCÈS EXIT_SUCCESS
Jerry1

1
"il est manquant espace ...": Wer auch immer die Übersetzung gemacht hat, kann kein Französisch. (Aus Erfahrung: Vermeiden Sie übersetzte Versionen des Compilers. Es gibt keine formal festgelegten und allgemein vereinbarten Übersetzungen für viele der Fachbegriffe, und Sie werden am Ende versuchen, die Auswahl der Übersetzer zu erraten, um herauszufinden, was der ist Fehlermeldungen bedeuten wirklich.)
James Kanze

18
@ JamesKanze: Glaubst du, Spanisch könnte besser funktionieren? Oder?
Leichtigkeitsrennen im Orbit

2
Na dann, es gibt einen Versuch, C ++ zu übersetzen, siehe FrenC github.com/carado/FranC , es ist nur eine Menge von #define: D
Lesto

4

Da George Bush Pommes Frites zugunsten der schmackhafteren Liberty Fries (und der weniger schmackhaften, aber ebenso patriotischen Freedom Fries) verboten hat, nehmen auch andere amerikanische Unternehmen die Unterstützung für Pommes Frites in ihren Produkten auf.

Sie müssen einen Compiler vor 2003 verwenden oder eine E-Mail an http://www.whitehouse.gov/contact/submit-questions-and-comments senden , um zu fragen, ob die Situation bald wiederhergestellt werden soll.


3

Erstens müssen Sie

#inclure <clibstd>

bevor Sie die Konstante SORTIE_SUCCÈS verwenden können.

Ein weiteres Problem mit Ihrem C ++ - Code ist, dass Sie vergessen haben, std :: lend zu verwenden, und stattdessen '\ n' in Ihrer Ausgabezeichenfolge verwendet haben - es funktioniert nicht in französischem Code, natürlich ist nur Code zulässig, der in Englisch und Russisch geschrieben ist das zu tun.

Darüber hinaus haben Sie falsche Einrückungen verwendet (GCC für Französisch erfordert Tabulatoren anstelle von Leerzeichen) und die Platzierung von Klammern (Sie müssen Klammern nach Möglichkeit in derselben Zeile platzieren, wobei keine Leerzeichen zwischen ihnen zulässig sind). Wenn Sie sie unverändert lassen, werden in Ihrem Code Laufzeitfehler "vous ne connaissez pas votre tabulation, Jacques" und "pas assez d'amour entre accolades" generiert.

Nachdem ich diese Zeilen geändert habe, wurde der Code erfolgreich kompiliert. Es ist immer noch nicht gelaufen, wahrscheinlich aus den hier angegebenen Gründen .

Snippet: http://ideone.fr/sQbL6E

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.