เหตุใดโปรแกรมของฉันจึงคอมไพล์ใน Windows 7 ในภาษาฝรั่งเศสไม่ได้ [ปิด]


237

ฉันใช้ Windows 7 French และฉันพยายามที่จะรวบรวมโปรแกรมพื้นฐานนี้จริงๆ แต่ Visual Studio กำลังดื้อรั้นและปฏิเสธที่จะปฏิบัติตาม ฉันพยายามรวบรวมทั้ง GCC 4.7 และ Clang trunk บนColiruและฉันได้รับข้อผิดพลาดเดียวกันมากขึ้นหรือน้อยลง (ผลลัพธ์ต่ำกว่ารหัส) แม้ว่าฉันคิดว่า Coliru ทำงานบนระบบปฏิบัติการภาษาอังกฤษดังนั้นฉันจึงไม่คาดหวังว่ามันจะทำงานได้ .

ผมทำอะไรผิดหรือเปล่า? และฉันจะแก้ไขได้อย่างไร

รหัส

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

เอาท์พุต

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
คุณน่าจะใช้std::findeligneแทนการใช้\nตัวละคร :)
Aliou

66
ดูเหมือนคำถามตลกสำหรับวันที่ 1 เมษายน .....
Basile Starynkevitch

2
คุณแน่ใจหรือว่าiostreamชื่อที่ถูกต้องของส่วนหัวเป็นภาษาฝรั่งเศส?
Bart van Nierop

9
ฉันคิดว่าปัญหาอยู่ในภาษาที่คุณเลือก
phoops

2
อย่าดูถูกผู้แปลเขาและฉันต่างก็ลำบากกับการเรียนภาษาฝรั่งเศส เราพยายามอย่างดีที่สุดให้เวลาอย่างน้อย 6-8 สัปดาห์ในการเรียนรู้เพิ่มเติม!
user1942027

คำตอบ:


62

ปัญหาหลายอย่างเกิดจากการแคชแต่คุณเป็นอีกหนึ่งปัญหาที่ยาก : การตั้งชื่อ ใช่การแปลเป็นเรื่องยาก

คุณไม่ได้พูดถึงความแตกต่างของภาษาฝรั่งเศสที่คุณใช้ แต่จากข้อความแสดงข้อผิดพลาดฉันคิดว่าคุณกำลังใช้“ ฝรั่งเศส (ฝรั่งเศส)” (สิ่งที่เราใช้ในการโทรระบบปฏิบัติการอารยธรรมfr_FR) fr_FRสถานที่ตั้งของ MS ทำงานในลักษณะแปลกมาก: ตัวอักษรเน้นเสียงตัวพิมพ์ใหญ่จะถูกแมปกับคู่ของพวกเขาไม่ได้รับความยินยอม ดังนั้นคุณจะต้องเขียนแทนSORTIE_SUCCESSORTIE_SUCCÈS

วิธีแก้ไขคือใช้ภาษา“ ฝรั่งเศส (โมนาโก)” ( fr_MC)ซึ่งตัวอักษรเน้นเสียงตัวพิมพ์ใหญ่ทำงานได้ตามที่คาดไว้ น่าเสียดายที่คอมไพเลอร์เวอร์ชั่นโมนาโกมีราคาแพงมาก นอกจากนี้คุณยังสามารถใช้แคนาดาฝรั่งเศส, เบลเยียมฝรั่งเศสหรือรุ่นสวิสฝรั่งเศส แต่ทั้งหมดเหล่านี้จำเป็นต้องให้คุณส่งสองภาษา ( fr_CA+ en_CA) สามภาษา ( fr_BE+ nl_BE+ de_BE) หรือ quadrilingual ( fr_CH+ it_CH+ de_CH+ rm_CH) แฟ้มแหล่งที่มา สายพันธุ์แอฟริกาของฝรั่งเศสออกเพราะพวกเขายากจนเกินกว่าจะซื้อคอมไพเลอร์ C ++ ได้ แต่คุณสามารถใช้ C แทนได้

จากนั้นมีข้อผิดพลาดทางไวยากรณ์อื่น ๆ ในโปรแกรมของคุณ:

  • คุณลืมแปลคำค้นหา
  • ระวังว่าคอมไพเลอร์และเอกสารไม่ได้ใช้การแปลเดียวกันสำหรับคำเดียวกันเสมอไป
  • คุณไม่ได้คำนึงถึงความจริงที่ว่าคำคุณศัพท์มาจากคำนามเป็นภาษาฝรั่งเศส
  • คุณใช้เครื่องหมายคำพูดผิดประเภท

ฉันลองลองรหัสต่อไปนี้ในคอมไพเลอร์ C ++ ที่รวมอยู่ในÉmaxe 51,70 และมันทำงานได้ดี:

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

บางภาษามีการสนับสนุนสากลที่ดีกว่า C ++ ตัวอย่างเช่นต่อไปนี้เป็นโปรแกรมในโลโก้ (เพื่อไม่ให้สับสนกับโลโก้ของหลักสูตร)

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

151

ปัญหาชัดเจนว่าคุณรวมส่วนหัวมาตรฐานที่ไม่ถูกต้อง:

#inclure <iostream>

ควรจะเป็น:

#inclure <fluxes>

นอกจากนี้คุณจะพบว่าวิธีนี้ใช้งานได้ดีกว่ามากคือคุณใช้ Studio Visuel Micromou หรือ CCG (ย่อมาจากเครื่องมือ "Collection de Compilateurs GPU", btw) แทนที่จะเป็น MVS หรือ GCC ทั่วไป


5
นอกจากนี้ควรระวังที่จะให้ส่วนขยายของไฟล์ส่วนหัว« .e »สำหรับ« en-tête»
Pierre Arlaud

2
@ArlaudPierre: ปรากฎว่าคุณสามารถใช้ส่วนขยายใดก็ได้ที่คุณต้องการสำหรับไฟล์ส่วนหัวยกเว้นไฟล์ C-standard-library-header ที่จำเป็นต้องใช้ในการ.eขยาย แต่แน่นอนส่วนขยายมาตรฐานเช่น.e, .ee, .eppเป็นที่ต้องการโดยการประชุม ... สำหรับรายละเอียด: stackoverflow.com/questions/441568/...
มาร์ตินเจ

@MartinJ ใช่ฉันไม่ได้หมายความว่ามันเป็นข้อบังคับเมื่อฉันพูดว่า "ระวัง"
Pierre Arlaud

31
GNPU n'est pas UNIX
abuzittin gillifirca

5
ฉันจำได้ว่า De Gaulle โทรออก "Vive le logiciel libre!" ...
Axel

111
  1. คุณมีข้อผิดพลาดทางความหมาย - อาร์กิวเมนต์ที่สองของฟังก์ชันรายการควรเป็นประเภทcara**ไม่ใช่ent**:

    ent principal(ent argn, cara** argm)
  2. สำหรับ<iostream>ข้อผิดพลาด @MartinJ ชี้ให้เห็นอย่างถูกต้องแล้วคุณควรใช้<esflux>แทน

  3. เกี่ยวกับข้อผิดพลาดอื่น ๆ ดูเหมือนว่าคอมไพเลอร์ของคุณเป็นเพียงการนัดหยุดงาน สิ่งนี้สามารถเกิดขึ้นได้เป็นครั้งคราวเมื่อรวบรวมรหัสภาษาฝรั่งเศสและควรแก้ไขด้วยตัวเองในอีกไม่กี่วัน


51

ฉันพยายามที่จะรวบรวมจริงๆนี้โปรแกรมพื้นฐาน

นี่ไม่ใช่โปรแกรมพื้นฐานดังนั้น Visual Studio จึงไม่ทราบว่าต้องทำอย่างไร

นอกจากนี้ในระบบภาษาฝรั่งเศสคุณต้องผ่านโปรแกรมไปยังคอมไพเลอร์


6
"เพื่อผ่านโปรแกรม " <3
Pierre Arlaud

5
ดังนั้นสิ่งที่คุณพูดคือ "Ceci n'est โปรแกรมพื้นฐาน"
Stuart Olsen

44

สวัสดีLégèreté fait ลาแน่นอน en orbite ,

ฉันต้องการเน้นย้ำว่าแม้ว่าคุณจะทำตามคำตอบทั้งหมดที่ให้ไว้ที่นี่โปรแกรมของคุณยังไม่ได้รวบรวมเพราะเครื่องหมายวรรคตอนของคุณ อัฒภาคถูกนำหน้าด้วยพื้นที่ที่ไม่ทำลายในภาษาฝรั่งเศส

ฉันอยากจะแนะนำต่อไปนี้:

#inclure <esflux>

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

โปรดสังเกตุว่าฉันเปลี่ยนargnไปnargเพราะมันเป็นธรรมชาติมากกว่าในฝรั่งเศส

แก้ไข: ทำตามคำแนะนำของ angew


35

ค่อนข้างทุกอย่างถูกครอบคลุมในคำตอบก่อนหน้า แต่ถ้าฉันอาจเพิ่ม:

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

นี่เป็นใบรับรองที่ได้รับอนุญาต แต่โดยทั่วไปมักจะต้องการสิ่งต่อไปนี้:

capitulation ; // a better, frenchier approach

3
ไม่ใช่สองคนที่เทียบเท่ากันในความหมายในภาษาฝรั่งเศส C?

17

คุณจำเป็นต้องอ้างอิงตัวประมวลผลล่วงหน้าภาษาฝรั่งเศส:

#inclure <Montebourg>

hummm ... สายเกินไปมันเลิกใช้แล้ว รุ่นใหม่จะวางจำหน่ายในสัปดาห์นี้


17

ฉันรู้ว่าสิ่งนี้ไม่ได้ใช้กับสถานการณ์เฉพาะนี้ แต่เป็นสิ่งสำคัญที่ต้องคำนึงถึงเพศของวัตถุของคุณเมื่อเขียนโปรแกรมเป็นภาษาฝรั่งเศส คลาสมี 2 ประเภท ( genre) genre::masculinsและgenre::féminin

ตัวอย่างเช่น

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

นอกจากนี้เมื่อผ่านthisไปยังฟังก์ชั่นอื่นการเรียกใช้ฟังก์ชันจะถูกนำหน้าด้วยรายการพารามิเตอร์แทนคำต่อท้าย

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

หรือ

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

สำหรับการอ้างอิงเพิ่มเติม: Wikipedia Word Order


15

ถ้าคุณลองอีกครั้งหลังเวลาอาหารกลางวัน (12-2.00 น.) นอกจากนี้หากคุณได้รับมากกว่าหนึ่งโปรเซสเซอร์พวกเขาอาจจะหยุดงาน คุณสามารถเรียกคืน proc ของคุณได้ด้วยคำสั่ง (ฝรั่งเศส) Windows 7:

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

ทำซ้ำเมื่อคุณติดอยู่ (แต่อย่าลืมลดจำนวนลงทุกครั้ง!)


2
1 และผมคิดว่าset pension-starting-age = 62ยังสามารถช่วยเหลืออาจจะเปลี่ยนไปset pension-starting-age = 60เร็ว ๆ นี้ ...
แอ็กเซิล

แน่นอนอายุเริ่มต้นบำนาญก็สามารถทำสิ่งนี้ได้! Où avais-je la tête? :-)
Sylvain Rodrigue

10

ดูเหมือนว่าคุณลืมติดตั้งFrenChPP++แพคเกจ หลังจากการติดตั้งสำเร็จ (คุณจะต้องคอมไพล์FrenChPP++ในคอมไพเลอร์มาตรฐาน c ++ หากไม่มีแพ็คเกจไบนารีสำหรับระบบของคุณ (เราที่ Unauthorized Frog แนะนำให้ใช้ g ++ สำหรับสิ่งนี้ แต่อย่าลังเลที่จะใช้เสียงดังกราวเกินไป แต่ไม่สนใจคำเตือน) คุณจะต้องสร้างโครงการใหม่และเพียงคัดลอกวางลงในprincipal.fcppไฟล์ที่สร้างขึ้นใหม่ จากนั้นเมื่อดำเนินการพรีคอมไพเลอร์FrenChPP++(ซึ่งทำงานคล้ายกับวิธีที่ Qt จัดการกับสัญญาณ / กลไกสล็อต) จะแยกวิเคราะห์.fcppไฟล์ทั้งหมดและจะ "แปล" .fcppเป็นที่ถูกต้อง.cppแล้วรวบรวมโดยใช้คอมไพเลอร์เริ่มต้นของระบบ


3
นี่คือลิงค์: github.com/carado/FranC
Valentin Lorentz


7

มีข้อผิดพลาดมากมายในรหัสของคุณซึ่งส่วนใหญ่แล้วจะได้รับคำตอบในคำตอบอื่น ๆ แล้ว แต่คุณไม่ทราบหรือไม่ว่าผู้สร้างC++ออกแบบเพื่อให้ซอร์สโค้ดของโปรแกรมนั้นไม่ได้รับการแปลนานเมื่อแปล?

มันไม่ได้std::cendehorsแต่std::deh(สั้นสำหรับdehors ) ขณะที่std::cinแปลว่าstd::ded(สำหรับdedans )

นอกจากนี้โปรดทราบว่าเคยมีคอมไพเลอร์ที่ไม่ได้ล้างออกโดยอัตโนมัติ\nดังนั้นจึงควรใช้std::findl( fin de ligne ) ดังนั้นควรเป็นเช่นนี้:

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

แก้ไข: ขออภัยฉันไม่ได้พบข้อผิดพลาดอีก รูปแบบที่ถูกต้องแน่นอนคือการใช้ guillemets ดังนี้:

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

2
เห็นเป็นอย่างดีสำหรับเครื่องหมายคำพูด
jwav

คอมไพเลอร์เหล่านั้นยังคงไม่ต้องล้างข้อมูลเอาต์พุตเมื่อกระบวนการสิ้นสุดลงหรือไม่
Lightness Races ในวงโคจร

1
@LightnessRacesinOrbit: ใช่แล้วในหลักการคุณพูดถูก แต่ระวังความแตกต่างของ implementaion ในเวอร์ชันภาษาฝรั่งเศสเนื่องจากการล้างข้อมูลในฝรั่งเศสอาจทำให้เกิดผลลัพธ์ที่ไม่พึงประสงค์ ( en.wikipedia.org/wiki/French_toilet )
Axel

5

คุณไม่สามารถใช้คำหลักภาษาฝรั่งเศสในโปรแกรม C ++ (หรือ C) คุณควรรหัส

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

และเช่นเดียวกัน

 return EXIT_SUCCESS;

และแน่นอนรหัสint main(int argc, char**argv) ฯลฯ ...

(ขอบคุณสำหรับมุขตลกของคุณในเดือนเมษายน!)


9
จริงๆเหรอ? มันทำงานให้ฉันในอดีตเสมอ มีธงคอมไพเลอร์ที่ฉันสามารถตั้งค่า?
Lightness Races ในวงโคจร

อาจเป็น #define SORTIE_SUCCÈS EXIT_SUCCESS
Jerry1

1
"il est manquant espace ... ": ใครก็ตามที่แปลไม่รู้จักภาษาฝรั่งเศส (จากประสบการณ์: หลีกเลี่ยงเวอร์ชันแปลของคอมไพเลอร์ไม่มีการยอมรับอย่างเป็นทางการและได้รับการยอมรับอย่างกว้างขวางในการแปลสำหรับคำศัพท์ทางเทคนิคมากมายและคุณจะต้องพยายามเดาตัวเลือกของนักแปลเป็นครั้งที่สอง ข้อความแสดงข้อผิดพลาดหมายถึงจริง ๆ )
James Kanze

18
@JamesKanze: คุณคิดว่าสเปนจะทำงานได้ดีขึ้นหรือไม่? หรือ?
การแข่งขัน Lightness ใน Orbit

2
ถ้าอย่างนั้นมี attemp to tranlaste C ++ ดู FrenC github.com/carado/FranCมันเป็น #define จำนวนมาก: D
Lesto

4

ตั้งแต่นายจอร์จบุชห้ามเฟรนช์ฟรายส์ให้กับ Liberty Fries แสนอร่อย (และ Freedom Fries ที่อร่อยน้อย แต่มีใจรักเท่า ๆ กัน) บริษัท อเมริกันอื่น ๆ ก็หันมาสนับสนุนผลิตภัณฑ์ฝรั่งเศสด้วยเช่นกัน

คุณต้องใช้คอมไพเลอร์ก่อนปี 2003 หรือส่งอีเมลไปที่http://www.whitehouse.gov/contact/submit-questions-and-commentsเพื่อถามว่าพวกเขาวางแผนที่จะเปลี่ยนสถานการณ์ในไม่ช้า


3

ประการแรกคุณต้อง

#inclure <clibstd>

ก่อนที่คุณจะสามารถใช้ค่าคงที่SORTIE_SUCCÈS

ปัญหาอีกประการของรหัส C ++ ของคุณคือคุณลืมใช้ std :: lend และใช้ '\ n' ในสตริงเอาต์พุตของคุณแทน - มันจะไม่ทำงานในรหัสภาษาฝรั่งเศสแน่นอนจะอนุญาตให้ใช้รหัสที่เขียนเป็นภาษาอังกฤษและรัสเซียเท่านั้น ทำเช่นนั้น

ยิ่งไปกว่านั้นคุณใช้การเยื้องที่ไม่ถูกต้อง (GCC ในภาษาฝรั่งเศสต้องใช้แท็บแทนช่องว่าง) และการจัดตำแหน่งรั้ง (คุณต้องวางวงเล็บปีกกาในบรรทัดเดียวกันทุกครั้งที่ทำได้ไม่อนุญาตให้มีช่องว่างระหว่างกัน) ทำให้พวกเขาไม่เปลี่ยนแปลงจะสร้าง "vous ne connaissez pas votre tabulation, Jacques" และ "pas assez d'amour entre accolades" ข้อผิดพลาดรันไทม์ในรหัสของคุณ

หลังจากที่ฉันเปลี่ยนบรรทัดเหล่านั้นรหัสก็รวบรวมได้สำเร็จ มันยังไม่ทำงานอาจจะด้วยเหตุผลที่ระบุไว้ที่นี่

ตัวอย่าง: http://ideone.fr/sQbL6E

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.