Perché il mio programma non può essere compilato in Windows 7 in francese? [chiuso]


237

Sto eseguendo Windows 7 francese e sto cercando di compilare questo programma davvero di base, ma Visual Studio è testardo e si rifiuta di aderire. Ho anche provato a compilarlo con GCC 4.7 e Clang trunk su Coliru e ho più o meno gli stessi errori (l'output è sotto il codice), anche se penso che Coliru funzioni su un sistema operativo inglese, quindi non mi aspetto che funzioni comunque .

Che cosa sto facendo di sbagliato? E come posso ripararlo?

Codice

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

Produzione

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
Probabilmente dovresti usare std::findeligneinvece di usare un \npersonaggio :)
Aliou

66
Sembra una domanda scherzosa per il 1 aprile .....
Basile Starynkevitch

2
Sei sicuro che iostreamil nome corretto dell'intestazione sia in francese?
Bart van Nierop,

9
Penso che il problema risieda nella lingua che hai scelto.
phoops

2
Non guardare in basso il compilatore, entrambi abbiamo avuto difficoltà a imparare il francese. Stiamo facendo del nostro meglio, quindi dacci almeno 6-8 settimane in più per imparare!
user1942027

Risposte:


62

Molti problemi sono dovuti alla memorizzazione nella cache , ma il tuo è uno degli altri tipi di problemi difficili : denominare le cose. Sì, la localizzazione è difficile.

Non hai menzionato quale variante di francese stai usando, ma dal messaggio di errore, penso che tu stia usando "francese (Francia)" (ciò che chiamiamo noi utenti dei sistemi operativi civili fr_FR). Le fr_FRimpostazioni internazionali di MS si comportano in modo molto strano: le lettere accentate maiuscole vengono mappate sulla loro controparte non accentata (per compatibilità con le versioni precedenti di alcuni modelli di macchine da scrivere). Quindi devi scrivere SORTIE_SUCCESinvece di SORTIE_SUCCÈS.

Una soluzione alternativa consiste nell'utilizzare la lingua "francese (Monaco)" ( fr_MC) , in cui le lettere accentate maiuscole funzionano come previsto. Sfortunatamente, la versione Monaco del compilatore è molto costosa. Puoi anche usare la versione francese canadese, francese belga o francese svizzero, ma tutto ciò richiede che tu invii un file sorgente bilingue ( fr_CA+ en_CA), trilingue ( fr_BE+ nl_BE+ de_BE) o quadrilingue ( fr_CH+ it_CH+ de_CH+ rm_CH). Esistono varianti africane del francese perché sono troppo povere per permettersi un compilatore C ++, tuttavia è possibile usare C invece.

Quindi ci sono altri errori di sintassi nel tuo programma:

  • Hai dimenticato di tradurre alcune parole chiave.
  • Attenzione che il compilatore e la documentazione non usano sempre la stessa traduzione per la stessa parola.
  • Non hai tenuto conto del fatto che gli aggettivi vengono dopo il nome in francese.
  • Stai usando le virgolette sbagliate.

Ho provato il seguente codice nel compilatore C ++ incluso in Émaxe 51,70, e ha funzionato:

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

Alcune lingue supportano meglio l'internazionalizzazione rispetto al C ++. Ad esempio, ecco un programma in LOGO (da non confondere con LOGO ovviamente).

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

151

Il problema è ovviamente che stai includendo un'intestazione standard errata:

#inclure <iostream>

dovrebbe essere:

#inclure <fluxes>

Scoprirai inoltre che funziona molto meglio se usi gli strumenti Studio Visuel Micromou o CCG (acronimo di "Collection de Compilateurs GPU", btw), piuttosto che i loro parenti MVS o GCC più comuni.


5
Fai anche attenzione a dare ai tuoi file header l'estensione «.e» per «en-tête»
Pierre Arlaud,

2
@ArlaudPierre: si scopre che è possibile utilizzare qualsiasi estensione desiderata per i file di intestazione, ad eccezione dei file C-standard-library-header necessari per utilizzare l' .eestensione. Ma, naturalmente, le estensioni standard come .e, .ee, .eppsono preferiti per convenzione ... Per informazioni: stackoverflow.com/questions/441568/...
Martin J.

@MartinJ. Giusto, anche se non intendevo dire che era obbligatorio quando dicevo "stai attento".
Pierre Arlaud,

31
GNPU n'est pas UNIX.
abuzittin gillifirca,

5
Ricordo che De Gaulle chiamava "Vive le logiciel libre!" ...
Axel

111
  1. Hai un errore semantico - il secondo argomento della funzione entry dovrebbe essere di tipo cara**, non ent**:

    ent principal(ent argn, cara** argm)
  2. Per l' <iostream>errore, @MartinJ. già correttamente sottolineato che dovresti usare <esflux>invece.

  3. Per quanto riguarda gli altri errori, sembra che il tuo compilatore sia semplicemente in sciopero. Questo può accadere occasionalmente durante la compilazione del codice francese e dovrebbe risolversi in pochi giorni.


51

Sto cercando di compilare questo programma davvero di base .

Questo non è un programma BASIC, quindi Visual Studio non sa cosa farne.

Inoltre, su un sistema francese, è necessario passare un programma al compilatore.


6
"passare un programma " <3
Pierre Arlaud,

5
Quindi quello che stai dicendo è "Ceci n'est pas une program BASIC".
Stuart Olsen,

44

Ciao Légèreté fait il corso in orbita ,

Vorrei sottolineare che anche se segui tutte le risposte fornite qui, il tuo programma non si compila ancora a causa della punteggiatura. I punti e virgola sono preceduti da uno spazio ininterrotto in francese.

Consiglierei quanto segue:

#inclure <esflux>

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

Si noti che sono cambiato argnin narg, poiché è più naturale in francese (niente a che vedere con le notazioni ungheresi)!

Modifica: ha seguito la raccomandazione di angew


35

Praticamente tutto è stato trattato nelle risposte precedenti, ma se posso aggiungere:

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

questo è autorizzato certes , ma di solito è preferito quanto segue:

capitulation ; // a better, frenchier approach

3
non sono i due semanticamente equivalenti in francese C?

17

Devi fare riferimento al pre-processore francese:

#inclure <Montebourg>

hummm ... troppo tardi, è deprecato. La nuova versione sarà disponibile questa settimana.


17

Mi rendo conto che questo non si applica a questa particolare situazione, ma è importante tenere presente il genere dei tuoi oggetti durante la programmazione in francese. Esistono 2 tipi di classi ( genre) genre::masculinsegenre::féminin

Per esempio:

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

Inoltre, quando si passa thisa un'altra funzione, la chiamata di funzione viene preceduta dall'elenco dei parametri anziché dal suffisso:

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

o

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

Per ulteriori riferimenti: Wikipedia Word Order


15

Cosa succede se si riprova dopo l'ora di pranzo (dalle 12 alle 14)? Inoltre, se ottieni più di un processore, potrebbero essere in sciopero. Puoi riavviare il tuo proc con questo comando (francese) di Windows 7:

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

Ripeti quando sei bloccato (ma non dimenticare di abbassare il numero ogni volta!).


2
+1, e penso che set pension-starting-age = 62potrebbe anche aiutare, potrebbe cambiare set pension-starting-age = 60presto ...
Axel

Naturalmente, anche l'età pensionabile potrebbe fare il trucco! Où avais-je la tête? :-)
Sylvain Rodrigue

10

Sembra che tu abbia dimenticato di installare il FrenChPP++pacchetto. Dopo una corretta installazione (dovrai compilare FrenChPP++su un compilatore c ++ standard se non ci sono pacchetti binari per il tuo sistema (noi di Unuthorized Frog raccomandiamo di usare g ++ per questo, ma sentiti libero di usare anche clang, ma ignora gli avvertimenti)) dovrai creare un nuovo progetto e copiarlo semplicemente incollarlo nel principal.fcppfile appena creato . Quindi, al momento dell'esecuzione, il FrenChPP++precompilatore (che funziona in modo molto simile al modo in cui Qt gestisce i suoi segnali / meccanismo di slot) analizzerà tutti i .fcppfile e li "tradurrà" .fcppin validi, .cppquindi li compilerà utilizzando il compilatore predefinito del sistema.




7

Ci sono così tanti errori nel tuo codice, molti dei quali sono già stati risolti nelle altre risposte. Ma non sai che i creatori lo hanno C++progettato in modo che il codice sorgente del programma non diventi eccessivamente lungo quando tradotto?

Non lo è std::cendehors, ma std::deh(abbreviazione di dehors ) come std::cintradotto instd::ded (per dedans ).

Nota anche che c'erano compilatori che non funzionavano automaticamente \n, quindi è meglio usarli std::findl( fin de ligne ). Quindi dovrebbe essere così:

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

EDIT: Mi dispiace, non ho notato un altro errore. La forma corretta ovviamente sta usando guillemets come questo:

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

2
Ben individuato per le virgolette
jwav

Quei compilatori non dovevano ancora scaricare l'output al termine del processo?
Razze di leggerezza in orbita

1
@LightnessRacesinOrbit: Sì, in linea di principio hai ragione, ma fai attenzione alle differenze di implementazione nella versione francese poiché il flushing in Francia può portare a risultati indesiderati ( en.wikipedia.org/wiki/French_toilet ).
Axel

5

Non è possibile utilizzare le parole chiave francesi in un programma C ++ (o C). Dovresti codificare

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

e allo stesso modo

 return EXIT_SUCCESS;

e ovviamente codice int main(int argc, char**argv) ecc ...

(grazie per la battuta del tuo pesce d'aprile!)


9
Oh veramente? Ha sempre funzionato per me in passato. C'è qualche flag del compilatore che posso impostare?
Razze di leggerezza in orbita

forse #define SORTIE_SUCCÈS EXIT_SUCCESS
Jerry1

1
"il est manquant espace ...": Chiunque abbia fatto la traduzione non conosce il francese. (Per esperienza: Evitare tradotto versioni del compilatore non ci sono. Alcun formalmente stabilito e universalmente concordato traduzioni per molti dei termini tecnici, e si finirà per cercare di indovinare secondo le scelte dei traduttori al fine di capire quale sia il i messaggi di errore significano davvero.)
James Kanze,

18
@JamesKanze: Quindi pensi che lo spagnolo possa funzionare meglio? O?
Razze di leggerezza in orbita

2
beh, allora, c'è un tentativo di trasferire C ++, vedi FrenC github.com/carado/FranC , è solo un sacco di #define: D
Lesto

4

Da quando George Bush ha vietato le patatine fritte a favore delle più gustose Liberty Fries (e delle Freedom Fries meno gustose ma ugualmente patriottiche), anche altre società americane stanno rimuovendo il supporto per i francesi nei loro prodotti.

È necessario utilizzare un compilatore precedente al 2003 o inviare una mail a http://www.whitehouse.gov/contact/submit-questions-and-comments per chiedere se intendono ripristinare la situazione presto.


3

In primo luogo, è necessario

#inclure <clibstd>

prima di poter usare la costante SORTIE_SUCCÈS.

Un altro problema con il tuo codice C ++ è che hai dimenticato di usare std :: lend e invece hai usato '\ n' nella tua stringa di output - non funzionerà nel codice francese, ovviamente, è consentito solo il codice scritto in inglese e russo fare quello.

Ancora di più, hai usato un rientro errato (GCC in francese richiede tabulazioni anziché spazi) e il posizionamento del controvento (è necessario posizionare le parentesi graffe sulla stessa linea ogni volta che è possibile, senza spazi tra loro consentiti); mantenerli invariati genererà errori di runtime "vous ne connaissez pas votre, Jacques" e "pas assez d'amour entre accolades" nel codice.

Dopo aver modificato quelle righe, il codice è stato compilato correttamente. Non è ancora stato eseguito, probabilmente per i motivi specificati qui .

Snippet: http://ideone.fr/sQbL6E

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.