Dlaczego mój program nie może się skompilować pod Windows 7 w języku francuskim? [Zamknięte]


237

Korzystam z francuskiego systemu Windows 7 i próbuję skompilować ten naprawdę prosty program, ale Visual Studio jest uparty i odmawia spełnienia. Próbowałem też skompilować go z GCC 4.7 i Trangiem Clanga na Coliru i dostaję mniej więcej te same błędy (dane wyjściowe są poniżej kodu), choć myślę, że Coliru działa na angielskim systemie operacyjnym, więc nie spodziewałbym się, że i tak zadziała .

Co ja robię źle? Jak mogę to naprawić?

Kod

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

Wynik

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
Prawdopodobnie powinieneś użyć std::findelignezamiast \npostaci :)
Aliou

66
Wygląda na żartobliwe pytanie z 1 kwietnia ...
Basile Starynkevitch

2
Czy na pewno masz iostreamprawidłową nazwę nagłówka w języku francuskim?
Bart van Nierop

9
Myślę, że problem leży w języku, który wybrałeś.
phoops

2
Nie patrz na kompilator, on i ja mieliśmy trudności z nauką francuskiego. Staramy się jak najlepiej, więc daj nam co najmniej 6-8 tygodni na naukę!
user1942027

Odpowiedzi:


62

Wiele problemów wynika z buforowania , ale twój jest jednym z innych trudnych problemów : nazywanie rzeczy. Tak, lokalizacja jest trudna.

Nie wspomniałeś o tym, którego wariantu francuskiego używasz, ale z komunikatu o błędzie myślę, że używasz „francuskiego (Francja)” (jak nazywają to my, użytkownicy cywilizowanych systemów operacyjnych fr_FR). Ustawienia fr_FRregionalne MS zachowują się w bardzo dziwny sposób: wielkie litery akcentowane są odwzorowywane na ich nieakcentowany odpowiednik (dla kompatybilności wstecznej z niektórymi modelami maszyn do pisania). Więc musisz pisać SORTIE_SUCCESzamiast SORTIE_SUCCÈS.

Obejściem tego problemu jest użycie języka „francuskiego (Monako)” ( fr_MC) , w którym wielkie litery z akcentami działają zgodnie z oczekiwaniami. Niestety wersja kompilatora w Monako jest bardzo droga. Możesz także użyć wersji kanadyjskiej francuskiej, francuskiej belgijskiej lub szwajcarskiej francuskiej, ale wszystkie one wymagają przesłania dwujęzycznego ( fr_CA+ en_CA), trójjęzycznego ( fr_BE+ nl_BE+ de_BE) lub czterojęzycznego ( fr_CH+ it_CH+ de_CH+ rm_CH) pliku źródłowego. Afrykańskie warianty francuskiego są obecnie dostępne, ponieważ są zbyt słabe, aby pozwolić sobie na kompilator C ++, jednak zamiast tego można użyć C.

Potem są inne błędy składniowe w twoim programie:

  • Zapomniałeś przetłumaczyć niektóre słowa kluczowe.
  • Uwaga: kompilator i dokumentacja nie zawsze używają tego samego tłumaczenia dla tego samego słowa.
  • Nie uwzględniłeś faktu, że przymiotniki są po rzeczowniku po francusku.
  • Używasz niewłaściwego rodzaju cytatów.

Wollun wypróbowałem następujący kod w kompilatorze C ++ zawartym w Émaxe 51,70 i to zadziałało:

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

Niektóre języki mają lepszą obsługę internacjonalizacji niż C ++. Na przykład, oto program w LOGO (oczywiście nie należy go mylić z LOGO ).

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

151

Problem polega oczywiście na tym, że dołączasz niewłaściwy standardowy nagłówek:

#inclure <iostream>

Powinien być:

#inclure <fluxes>

Przekonasz się również, że działa to znacznie lepiej, jeśli używasz Studio Visuel Micromou lub narzędzi CCG (skrót od „Collection de Compilateurs GPU”, btw), a nie ich bardziej popularnych krewnych z MVS lub GCC.


5
Pamiętaj również, aby nadać plikom nagłówka rozszerzenie «.e» dla «en-tête»
Pierre Arlaud

2
@ArlaudPierre: okazuje się, że możesz użyć dowolnego rozszerzenia dla swoich plików nagłówkowych, z wyjątkiem plików nagłówkowych biblioteki standardowej C, które są wymagane do korzystania z tego .erozszerzenia. Ale oczywiście, standardowe rozszerzenia, takie jak .e, .ee, .epppreferowane są umownie ... Szczegółowe informacje: stackoverflow.com/questions/441568/...
Martin J.

@MartinJ. Racja, chociaż nie miałem na myśli, że było to obowiązkowe, kiedy mówiłem „bądź ostrożny”.
Pierre Arlaud,

31
GNPU n'est pas UNIX.
abuzittin gillifirca

5
Pamiętam, jak De Gaulle wołał „Vive le logiciel libre!” ...
Axel

111
  1. Wystąpił błąd semantyczny - drugi argument funkcji wprowadzania powinien być typu cara**, a nie ent**:

    ent principal(ent argn, cara** argm)
  2. Za <iostream>błąd @MartinJ. już poprawnie wskazałem, że powinieneś używać <esflux>zamiast tego.

  3. Jeśli chodzi o inne błędy, wydaje się, że twój kompilator po prostu strike. Może się to czasem zdarzyć przy kompilacji kodu francuskiego i powinno się naprawić za kilka dni.


51

Próbuję skompilować ten naprawdę prosty program .

To nie jest program BASIC, więc Visual Studio nie wie, co z nim zrobić.

Ponadto w systemie francuskim musisz przekazać program do kompilatora.


6
„zdać program ” <3
Pierre Arlaud

5
Mówisz więc: „Ceci n'est pas une program BASIC”.
Stuart Olsen

44

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

Chciałbym podkreślić, że mimo przestrzegania wszystkich podanych tutaj odpowiedzi program nadal nie będzie się kompilował z powodu interpunkcji. Średniki są poprzedzone nieprzerwaną spacją po francusku.

Poleciłbym następujące:

#inclure <esflux>

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

Proszę zauważyć, że zmieniłem argnna narg, ponieważ jest to bardziej naturalne w języku francuskim (choć nie ma to nic wspólnego z węgierskimi notacjami)!

Edycja: zgodnie z zaleceniem Angew


35

Prawie wszystko zostało omówione w poprzednich odpowiedziach, ale jeśli mogę dodać:

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

to Certes dozwolone, ale dodaje się zwykle korzystne jest:

capitulation ; // a better, frenchier approach

3
czy dwa semantycznie nie są równoważne we francuskim C?

17

Musisz odwołać się do francuskiego preprocesora:

#inclure <Montebourg>

hummm ... za późno, to jest przestarzałe. Nowa wersja będzie dostępna w tym tygodniu.


17

Zdaję sobie sprawę, że nie dotyczy to tej konkretnej sytuacji, ale ważne jest, aby pamiętać o płci swoich obiektów podczas programowania w języku francuskim. Istnieją 2 rodzaje klas ( genre) genre::masculinsigenre::féminin

Na przykład:

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

Ponadto podczas przekazywania thisdo innej funkcji wywołanie funkcji jest poprzedzane listą parametrów, a nie przyrostkiem:

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

lub

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

Aby uzyskać dodatkowe informacje: Wikipedia Word Order


15

Co się stanie, jeśli spróbujesz ponownie po godzinach lunchu (12–22)? Ponadto, jeśli dostaniesz więcej niż jeden procesor, mogą one być w trakcie strajku. Możesz jednak odzyskać swój proces za pomocą tego (francuskiego) polecenia Windows 7:

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

Powtórz, gdy utkniesz (ale nie zapomnij za każdym razem zmniejszać liczby!).


2
+1 i myślę, że set pension-starting-age = 62może też pomóc, może zmienić się set pension-starting-age = 60wkrótce ...
Axel

Oczywiście wiek emerytalny również może załatwić sprawę! Où avais-je la tête? :-)
Sylvain Rodrigue

10

Wygląda na to, że zapomniałeś zainstalować FrenChPP++pakiet. Po udanej instalacji ( FrenChPP++jeśli nie ma pakietów binarnych dla twojego systemu , będziesz musiał skompilować na standardowym kompilatorze c ++ (my w Unauthorized Frog zalecamy do tego g ++, ale możesz też użyć clang, ale zignoruj ​​ostrzeżenia)) musisz utworzyć nowy projekt i po prostu skopiować go do nowo utworzonego principal.fcpppliku. Następnie po uruchomieniu FrenChPP++prekompilator (który działa bardzo podobnie do sposobu, w jaki Qt obsługuje swój sygnał / mechanizm szczeliny) przeanalizuje wszystkie .fcpppliki i „przetłumaczy” je .fcppna poprawne, .cppa następnie skompiluje je przy użyciu domyślnego kompilatora systemu.




7

W twoim kodzie jest tyle błędów, że większość z nich została już rozwiązana w innych odpowiedziach. Ale czy nie wiesz, że twórcy C++zaprojektowali go tak, aby kod źródłowy programu nie był dość długi po przetłumaczeniu?

To nie jest std::cendehors, ale std::deh(skrót od dehors ) jak std::cintłumaczy się std::ded(dla dedans ).

Zauważ też, że kiedyś były kompilatory, które nie uruchamiały się automatycznie \n, więc lepiej jest używać std::findl( fin de ligne ). Tak powinno być tak:

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

EDYCJA: Przepraszam, nie zauważyłem kolejnego błędu. Prawidłową formą jest oczywiście użycie takich gilemetów:

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

2
Dobrze zauważono cudzysłowów
jwav

Czy te kompilatory nadal nie musiały opróżniać wyjścia po zakończeniu procesu?
Wyścigi lekkości na orbicie

1
@LightnessRacesinOrbit: Tak, w zasadzie masz rację, ale uważaj na różnice we wdrażaniu w wersji francuskiej, ponieważ rumieniec we Francji może prowadzić do niepożądanych rezultatów ( en.wikipedia.org/wiki/French_toilet ).
Axel

5

Nie można używać francuskich słów kluczowych w programie C ++ (lub C). Powinieneś zakodować

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

I podobnie

 return EXIT_SUCCESS;

i oczywiście kod int main(int argc, char**argv) itp ...

(dzięki za żart primaaprilisowy!)


9
Naprawdę? W przeszłości zawsze mi to działało. Czy mogę ustawić flagę kompilatora?
Wyścigi lekkości na orbicie

może # zdefiniować SORTIE_SUCCÈS EXIT_SUCCESS
Jerry1

1
„il est manquant espace ...”: Ktokolwiek wykonał tłumaczenie, nie zna francuskiego. (Z doświadczenia: unikaj przetłumaczonych wersji kompilatora. Nie ma formalnie ustalonych i powszechnie uzgodnionych tłumaczeń wielu terminów technicznych, a skończysz na próbie odgadnięcia wyborów tłumaczy, aby dowiedzieć się, jakie komunikaty o błędach naprawdę oznaczają.)
James Kanze

18
@JamesKanze: Więc uważasz, że hiszpański może działać lepiej? Lub?
Wyścigi lekkości na orbicie

2
no cóż, istnieje przywiązanie do tranlaste C ++, patrz FrenC github.com/carado/FranC , to tylko dużo #define: D
Lesto

4

Ponieważ pan George Bush zakazał frytek na rzecz smaczniejszych frytek Liberty (i mniej smacznych, ale równie patriotycznych frytek Freedom), inne amerykańskie korporacje również wycofują wsparcie dla francuskich produktów.

Musisz użyć kompilatora sprzed 2003 roku lub wysłać wiadomość na adres http://www.whitehouse.gov/contact/submit-questions-and-comments, aby zapytać, czy planują wkrótce przywrócić sytuację.


3

Po pierwsze musisz

#inclure <clibstd>

zanim będzie można użyć stałej SORTIE_SUCCÈS.

Innym problemem związanym z kodem C ++ jest to, że zapomniałeś użyć std :: lend, a zamiast tego użyłeś „\ n” w ciągu wyjściowym - nie będzie działać w kodzie francuskim, oczywiście, tylko kod napisany w języku angielskim i rosyjskim jest dozwolony aby to zrobić.

Co więcej, użyłeś niewłaściwego wcięcia (GCC w języku francuskim wymaga tabulacji zamiast spacji) i umieszczenia nawiasów klamrowych (musisz umieszczać nawiasy klamrowe w tej samej linii, gdy jest to możliwe, nie wolno między nimi odstępów); pozostawienie ich bez zmian spowoduje wygenerowanie błędów uruchomieniowych w kodzie „vous ne connaissez pas votre tabulation, Jacques” i „pas assez d'amour entre accolades”.

Po zmianie tych wierszy kod został pomyślnie skompilowany. Nadal nie działa, prawdopodobnie z podanych tutaj powodów .

Snippet: http://ideone.fr/sQbL6E

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.