Mengapa program saya tidak dapat dikompilasi di bawah Windows 7 dalam bahasa Prancis? [Tutup]

237

Saya menjalankan Windows 7 French dan saya mencoba untuk mengkompilasi program yang sangat mendasar ini, tetapi Visual Studio keras kepala dan menolak untuk mematuhinya. Saya juga mencoba mengompilasinya dengan GCC 4.7 dan clang trunk di Coliru dan saya mendapatkan lebih atau kurang kesalahan yang sama (output di bawah kode), meskipun saya pikir Coliru berjalan pada OS Inggris jadi saya tidak berharap itu berfungsi lagi .

Apa yang saya lakukan salah? Dan bagaimana cara memperbaikinya?

Kode

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

Keluaran

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
     ^
Lightness Races di Orbit
sumber
3
Anda mungkin harus menggunakan std::findelignedaripada menggunakan \nkarakter :)
Aliou
66
Sepertinya pertanyaan lelucon untuk 1 April .....
Basile Starynkevitch
2
Apakah Anda yakin iostreamnama header yang benar dalam bahasa Prancis?
Bart van Nierop
9
Saya pikir masalahnya terletak pada bahasa yang Anda pilih.
phoops
2
Jangan meremehkan kompiler, dia dan saya sama-sama kesulitan belajar bahasa Prancis. Kami mencoba yang terbaik, jadi beri kami setidaknya 6-8 minggu lagi untuk belajar!
user1942027

Jawaban:

62

Banyak masalah disebabkan oleh caching , tetapi masalah Anda adalah salah satu dari masalah sulit lainnya : penamaan sesuatu. Ya, pelokalan itu sulit.

Anda tidak menyebutkan varian bahasa Prancis yang Anda gunakan, tetapi dari pesan kesalahan, saya pikir Anda menggunakan "Prancis (Prancis)" (apa yang kita sebut sebagai pengguna OS beradab fr_FR). fr_FRLokal MS berperilaku dengan cara yang sangat aneh: huruf beraksen huruf besar dipetakan ke rekan mereka yang tidak berakreditasi (untuk kompatibilitas mundur dengan beberapa model mesin tik). Jadi, Anda harus menulis SORTIE_SUCCESalih-alih SORTIE_SUCCÈS.

Solusinya adalah menggunakan bahasa "Prancis (Monako)" ( fr_MC) , di mana huruf beraksen huruf besar bekerja seperti yang diharapkan. Sayangnya, versi kompiler Monaco sangat mahal. Anda juga dapat menggunakan versi Kanada Prancis, Belgia Prancis atau Prancis Swiss, tetapi ini semua mengharuskan Anda mengirimkan file sumber bilingual ( fr_CA+ en_CA), trilingual ( fr_BE+ nl_BE+ de_BE) atau kuadilingual ( fr_CH+ it_CH+ de_CH+ rm_CH). Varian Afrika Perancis tidak tersedia karena terlalu buruk untuk membeli kompiler C ++, namun Anda bisa menggunakan C sebagai gantinya.

Lalu ada kesalahan sintaksis lain dalam program Anda:

  • Anda lupa menerjemahkan beberapa kata kunci.
  • Berhati-hatilah karena kompiler dan dokumentasi tidak selalu menggunakan terjemahan yang sama untuk kata yang sama.
  • Anda tidak memperhitungkan fakta bahwa kata sifat datang setelah kata benda dalam bahasa Prancis.
  • Anda menggunakan jenis kutipan yang salah.

Saya wollun mencoba kode berikut dalam kompiler C ++ yang termasuk dalam Émaxe 51,70, dan itu wollun bekerja:

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

Beberapa bahasa memiliki dukungan internasionalisasi yang lebih baik daripada C ++. Sebagai contoh, inilah program di LOGO (jangan bingung dengan LOGO tentu saja).

pour exemple
  répète 18 [av 5 td 10]
  td 60
  répète 18 [av 5 td 10]
fin
Gilles 'SANGAT berhenti menjadi jahat'
sumber
151

Masalahnya jelas bahwa Anda termasuk header standar yang salah:

#inclure <iostream>

seharusnya:

#inclure <fluxes>

Selain itu, Anda akan menemukan bahwa ini bekerja jauh lebih baik adalah Anda menggunakan Studio Visuel Micromou atau CCG (kependekan dari "Collection de Compilateurs GPU", btw), daripada alat-alat MVS atau GCC yang lebih umum.

Martin J.
sumber
5
Juga berhati-hatilah untuk memberi ekstensi file header Anda «.e» untuk «en-tête»
Pierre Arlaud
2
@ArlaudPierre: ternyata Anda dapat menggunakan ekstensi apa pun yang Anda inginkan untuk file header Anda, kecuali untuk file header-perpustakaan-C-standar yang diperlukan untuk menggunakan .eekstensi. Tapi tentu saja, ekstensi standar seperti .e, .ee, .epplebih disukai oleh konvensi ... Untuk rincian: stackoverflow.com/questions/441568/...
Martin J.
@MartinJ. Benar, meskipun saya tidak bermaksud bahwa itu wajib ketika saya mengatakan "hati-hati".
Pierre Arlaud
31
GNPU n'est pas UNIX.
abuzittin gillifirca
5
Saya ingat De Gaulle memanggil "Vive le logiciel libre!" ...
Axel
111
  1. Anda memiliki kesalahan semantik - argumen kedua dari fungsi entri harus bertipe cara**, bukan ent**:

    ent principal(ent argn, cara** argm)
  2. Untuk <iostream>kesalahan, @MartinJ. sudah dengan benar menunjukkan bahwa Anda seharusnya menggunakan <esflux>.

  3. Mengenai kesalahan lain, tampaknya kompiler Anda hanya mogok. Ini dapat terjadi sesekali ketika mengkompilasi kode prancis, dan akan memperbaiki sendiri dalam beberapa hari.

Angew tidak lagi bangga dengan SO
sumber
51

Saya mencoba mengkompilasi program yang sangat mendasar ini .

Ini bukan program BASIC, jadi Visual Studio tidak tahu apa yang harus dilakukan dengannya.

Selain itu, pada sistem Prancis, Anda harus meneruskan program ke kompiler.

zmarties
sumber
6
"to pass a program " <3
Pierre Arlaud
5
Jadi yang Anda katakan adalah, "Program paling populer BASIC."
Stuart Olsen
44

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

Saya ingin menekankan bahwa meskipun Anda mengikuti semua jawaban yang diberikan di sini, program Anda masih tidak dapat dikompilasi karena tanda baca Anda. Titik koma didahului oleh ruang non-putus di Perancis.

Saya akan merekomendasikan yang berikut ini:

#inclure <esflux>

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

Harap perhatikan saya berubah argnmenjadi narg, karena lebih alami di Perancis (tidak ada hubungannya dengan notasi Hongaria)!

Sunting: mengikuti rekomendasi angew

Pierre Arlaud
sumber
35

Semuanya sudah tercakup dalam jawaban sebelumnya, tetapi jika saya dapat menambahkan:

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

ini certes diperbolehkan, tapi berikut ini biasanya disukai:

capitulation ; // a better, frenchier approach
jwav
sumber
3
bukankah keduanya setara secara semantik dalam bahasa Prancis C?
17

Anda perlu merujuk pada praproses Prancis:

#inclure <Montebourg>

hummm ... terlambat, sudah usang. Rilis baru akan tersedia minggu ini.

pmartin
sumber
17

Saya menyadari ini tidak berlaku untuk situasi khusus ini, tetapi penting untuk diingat jenis kelamin objek Anda saat pemrograman dalam bahasa Prancis. Ada 2 jenis kelas ( genre) genre::masculinsdangenre::féminin

Misalnya:

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

Lebih jauh, ketika melewati thiske fungsi lain pemanggilan fungsi diawali dengan daftar parameter daripada suffix:

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

atau

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

Untuk referensi lebih lanjut: Wikipedia Word Order

Chris Pfohl
sumber
15

Bagaimana jika Anda mencoba lagi setelah jam makan siang (12-2 siang)? Juga, jika Anda mendapatkan lebih dari satu prosesor, mereka mungkin mogok. Namun Anda bisa mendapatkan proc Anda kembali dengan perintah Windows 7 (Prancis) ini:

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

Ulangi ketika Anda mandek (tapi jangan lupa untuk menurunkan jumlahnya setiap kali!).

Sylvain Rodrigue
sumber
2
+1, dan saya pikir set pension-starting-age = 62juga bisa membantu, mungkin berubah menjadi set pension-starting-age = 60segera ...
Axel
Tentu saja, usia mulai pensiun juga bisa melakukan trik! Où avais-je la tête? :-)
Sylvain Rodrigue
10

Sepertinya Anda lupa menginstal FrenChPP++paket. Setelah instalasi berhasil (Anda perlu mengkompilasi FrenChPP++pada kompiler c ++ standar jika tidak ada paket biner untuk sistem Anda (kami di Kodok Tidak Sah merekomendasikan menggunakan g ++ untuk ini, tetapi jangan ragu untuk menggunakan dentang juga, tetapi abaikan peringatan)) Anda perlu membuat proyek baru, dan cukup salin tempel ini ke file yang baru dibuat principal.fcpp. Kemudian saat eksekusi FrenChPP++precompiler (yang bekerja sangat mirip dengan cara Qt menangani sinyal / mekanisme slotnya) akan mengurai semua .fcppfile dan akan "menerjemahkan" ke .fcppdalam yang valid .cppdan kemudian mengompilasinya menggunakan kompiler default sistem Anda.

Ferenc Deak
sumber
3
Berikut ini tautannya: github.com/carado/FranC
Valentin Lorentz
7

Ada begitu banyak kesalahan dalam kode Anda, sebagian besar dari mereka telah dikagumi dalam jawaban lain. Tapi tahukah Anda bahwa pembuatnya C++mendesainnya sehingga kode sumber program tidak terlalu panjang ketika diterjemahkan?

Bukan std::cendehors, tapi std::deh(kependekan dari dehors ) yang std::cinditerjemahkan menjadi std::ded(for dedans ).

Juga perhatikan dulu ada kompiler yang tidak otomatis menyala \n, jadi lebih baik digunakan std::findl( fin de ligne ). Jadi harus seperti ini:

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

EDIT: Maaf, saya tidak menemukan kesalahan lain. Bentuk yang benar tentu saja menggunakan sarung tangan seperti ini:

   std::deh << «Bonjour le monde << std::findl; 
Axel
sumber
2
Terlihat dengan
Bukankah kompiler-kompiler itu masih harus menyiram output ketika proses berakhir?
Lightness Races dalam Orbit
1
@LightnessRacesinOrbit: Ya, pada prinsipnya Anda benar, tetapi waspadalah terhadap perbedaan implementasi dalam versi Perancis karena pembilasan di Prancis dapat menyebabkan hasil yang tidak diinginkan ( en.wikipedia.org/wiki/French_toilet ).
Axel
5

Anda tidak dapat menggunakan kata kunci Prancis dalam program C ++ (atau C). Anda harus kode

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

dan juga

 return EXIT_SUCCESS;

dan tentu saja kode int main(int argc, char**argv) dll ...

(Terima kasih atas lelucon April bodoh Anda!)

Basile Starynkevitch
sumber
9
Oh benarkah? Itu selalu berhasil untuk saya di masa lalu. Apakah ada beberapa flag compiler yang dapat saya atur?
Lightness Races dalam Orbit
mungkin #define SORTIE_SUCCÈS EXIT_SUCCESS
Jerry1
1
"il est manquant espace ...": Siapa pun yang melakukan terjemahan tidak tahu bahasa Prancis. (Dari pengalaman: hindari versi terjemahan dari kompiler. Tidak ada terjemahan yang ditetapkan secara formal dan universal untuk banyak istilah teknis, dan Anda akan akhirnya mencoba menebak pilihan penerjemah untuk mencari tahu apa yang menjadi pesan kesalahan benar-benar berarti.)
James Kanze
18
@JamesKanze: Jadi, apakah menurut Anda bahasa Spanyol dapat berfungsi lebih baik? Atau?
Lightness Races dalam Orbit
2
Baiklah, ada upaya untuk tranlaste C ++, lihat FrenC github.com/carado/FranC , itu hanya banyak #define: D
Lesto
4

Karena Mr. George Bush melarang French Fries demi Liberty Fries yang lebih enak (dan Freedom Fries yang kurang enak tetapi sama-sama patriotik), perusahaan-perusahaan Amerika lainnya juga menghilangkan dukungan untuk French dalam produk-produk mereka.

Anda perlu menggunakan kompiler pra-2003, atau mengirim email ke http://www.whitehouse.gov/contact/submit-questions-and-comments untuk menanyakan apakah mereka berencana untuk mengembalikan situasi segera.

rupp
sumber
3

Pertama, Anda harus melakukannya

#inclure <clibstd>

sebelum Anda dapat menggunakan konstanta SORTIE_SUCC constantS.

Masalah lain dengan kode C ++ Anda adalah Anda lupa menggunakan std :: lend dan alih-alih menggunakan '\ n' dalam string keluaran Anda - kode itu tidak akan berfungsi dalam kode Prancis, jelas, hanya kode yang ditulis dalam bahasa Inggris dan Rusia yang diizinkan. untuk melakukannya.

Terlebih lagi, Anda menggunakan indentasi yang salah (GCC pada bahasa Prancis membutuhkan tab alih-alih spasi) dan penempatan brace (Anda perlu menempatkan kawat gigi pada garis yang sama bila memungkinkan, tidak ada spasi di antara mereka); menjaga mereka tidak berubah akan menghasilkan "vous ne connaissez pas votre tabulation, Jacques" dan "pas assez d'amour entre accolades" runtime kesalahan dalam kode Anda.

Setelah saya mengubah baris itu, kode berhasil dikompilasi. Itu masih belum berjalan, mungkin karena alasan yang ditentukan di sini .

Cuplikan: http://ideone.fr/sQbL6E

Komunitas
sumber