tutorial - practical c++ programming pdf




لماذا تم رفض هذا البرنامج عن طريق ثلاثة مترجمات C++؟ (20)

أواجه بعض الصعوبة في تجميع برنامج C ++ الذي قمت بكتابته.

هذا البرنامج بسيط جدا ، وعلى حد علمي ، يتوافق مع جميع القواعد المنصوص عليها في C ++ Standard. لقد قرأت على كامل ISO / IEC 14882: 2003 مرتين للتأكد.

البرنامج على النحو التالي:

إليك الإخراج الذي تلقيته عند محاولة ترجمة هذا البرنامج باستخدام Visual C ++ 2010:

c:\dev>cl /nologo helloworld.png
cl : Command line warning D9024 : unrecognized source file type 'helloworld.png', object file assumed
helloworld.png : fatal error LNK1107: invalid or corrupt file: cannot read at 0x5172

لقد جربت ++ g 4.5.2 ، لكن لم يكن مساعداً على حد سواء:

c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status

كنت أحسب أن Clang (الإصدار 3.0 trunk 127530) يجب أن تعمل ، حيث أنه أشاد جداً لمطابقة المعايير. لسوء الحظ ، لم تعطيني حتى إحدى رسائل الخطأ المميزة الخاصة بها:

c:\dev>clang++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
clang++: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

لنكون صادقين ، لا أعرف حقا ما تعنيه أي من رسائل الخطأ هذه.

تحتوي العديد من برامج C ++ الأخرى على ملفات مصدر بامتداد .cpp ، لذا فكرت ربما احتجت لإعادة تسمية الملف الخاص بي. لقد غيرت اسمها إلى helloworld.cpp ، ولكن ذلك لم يساعد. أعتقد أن هناك خطأ خطير جدا في Clang لأنه عندما حاولت استخدامه لتجميع البرنامج المعاد تسميته ، تم نقشه ، طبع "84 تحذيرات و 20 خطأ تم توليدها." وجعل جهاز الكمبيوتر الخاص بي صفارة كثيرا!

ما الذي فعلته خطأ هنا؟ هل فاتني جزء هام من معيار C ++؟ أم أن جميع المترجمين الثلاثة هم في الحقيقة منقطعين لدرجة أنهم لا يستطيعون تجميع هذا البرنامج البسيط؟


helloworld.png: لم يتم التعرف على الملف: لم يتم التعرف على تنسيق الملف

من الواضح ، يجب عليك تهيئة القرص الصلب الخاص بك.

حقا ، هذه الأخطاء ليست صعبة القراءة.


OCR يقول:

N lml_�e <loJ+_e__}

.lnt Mk.,n ( ln+ _rSC Lhc_yh )
h_S_
_l

s_l . co__ <, " H llo uo/_d ! '` << s l� . ena_ .
TP__rn _ |
_|

وهو لعنة جيدة ، أن نكون منصفين.


أنت تحاول تجميع صورة.

اكتب ما كتبته في مستند باسم main.cpp ، وقم بتشغيل هذا الملف من خلال المحول البرمجي ، ثم قم بتشغيل ملف الإخراج.


ارسم التضمينات أدناه لتجميعها:

#include <ChuckNorris>

أسمع أنه يمكن تجميع أخطاء في بناء الجملة ...


تحتاج إلى تحديد دقة الإخراج الخاص بك قبل نقطتين مباشرة قبل قوس الإغلاق الأخير . نظرًا لأن الناتج ليس رقميًا ، تكون الدقة صفرية ، لذلك تحتاج إلى هذا

: 0}


تكمن المشكلة في تعريف بناء الجملة ، حاول استخدام المسطرة والبوصلات للحصول على وصف أكثر كلاسيكية!

في صحتك،


جرب بهذه الطريقة:


جرب هذه:


في المعيار ، تحدد §1.1 / 1 ما يلي:

يتم تعيين أحرف الملف المصدر الفعلي ، بطريقة محددة بالتنفيذ ، إلى مجموعة أحرف المصدر الأساسية (إدخال أحرف سطر جديد لمؤشرات نهاية الخط) إذا لزم الأمر.

لا يدعم المحول البرمجي الخاص بك هذا التنسيق (لا يمكن تعيينه إلى مجموعة أحرف المصدر الأساسية ) ، لذلك لا يمكنه الانتقال إلى مراحل معالجة أخرى ، وبالتالي الخطأ. من المحتمل تمامًا أن يدعم المترجم الخاص بك تعيينًا من صورة إلى مجموعة أحرف المصدر الأساسية ، ولكنه غير مطلوب.

نظرًا لأن هذا التعيين محدد بالتنفيذ ، فستحتاج إلى الاطلاع على وثائق التنفيذ لمعرفة تنسيقات الملفات التي يدعمها. عادةً ، يدعم كل بائع برامج التحويل البرمجي الرئيسية (النصية المعرفة) الملفات النصية: أي ملف يتم إنتاجه بواسطة محرر نصوص ، وعادةً ما يكون سلسلة من الأحرف.

لاحظ أن معيار C ++ يستند إلى معيار C (§1.1 / 2) ، وأن معيار C (99) يقول في الفقرة 2.1.

لا تحدد هذه المواصفة القياسية الدولية
- الآلية التي يتم بها تحويل برامج C لاستخدامها في نظام معالجة البيانات ؛
- الآلية التي يتم بها استدعاء برامج C لاستخدامها في نظام معالجة البيانات ؛
- الآلية التي يتم تحويل بيانات المدخلات من أجل استخدامها بواسطة برنامج C ؛

لذا ، مرة أخرى ، علاج ملفات المصدر هو شيء تحتاج إلى العثور عليه في وثائق المجمع الخاص بك.


لا أستطيع رؤية سطر جديد بعد ذلك الدعامات الأخيرة.

كما تعلم: "إذا لم ينتهي ملف مصدر غير فارغ بحرف جديد ، ... السلوك غير معروف".


لسوء الحظ ، لقد حددت ثلاثة برامج ترجمة تدعم جميعها لغات متعددة ، وليس C ++ فقط. يجب عليهم جميعًا تخمين لغة البرمجة التي استخدمتها. وكما تعلمون بالفعل ، فإن تنسيق PNG مناسب لجميع لغات البرمجة ، وليس C ++ فقط.

عادة يمكن لل مترجم معرفة اللغة نفسها. على سبيل المثال ، إذا كان من الواضح أن PNG مرسومة بأقلام التلوين ، سيعرف المجمع أنه يحتوي على Visual Basic. إذا بدا الأمر وكأنه مرسوم بقلم رصاص ميكانيكي ، فمن السهل التعرف على المهندس أثناء العمل ، وكتابة كود FORTRAN.

هذه الخطوة الثانية لا تساعد المترجم سواء في هذه الحالة. C و C ++ فقط تبدو متشابهة للغاية ، وصولاً إلى #include . لذلك ، يجب عليك مساعدة المترجم في تحديد اللغة التي هو عليها بالفعل. الآن ، يمكنك استخدام وسائل غير قياسية. على سبيل المثال ، يقبل برنامج التحويل البرمجي Visual Studio الوسائط سطر / TC و / TP أو يمكنك استخدام الخيار "ترجمة كـ: C ++" في ملف المشروع. لدى GCC و CLang آلياتها الخاصة ، والتي لا أعرفها.

لذلك ، أوصي باستخدام الطريقة القياسية بدلاً من إخبار المترجم الخاص بك أن الشفرة التالية في C ++. كما كنت قد اكتشفت الآن ، فإن المتكلمين C ++ من الصعب إرضائهم للغاية حول ما يقبلونه. لذا فإن الطريقة القياسية لتحديد C ++ هي من قبل المبرمجين للتخويف إضافة إلى رمز C ++ الخاص بهم. على سبيل المثال ، سيوضح السطر التالي للمترجم الخاص بك أن ما يلي هو C ++ (وأنه من الأفضل أن يقوم بتجميعها دون شكاوى).

// To the compiler: I know where you are installed. No funny games, capice?

لقد قمت بتحويل برنامجك من PNG إلى ASCII ، لكنه لم يتم تجميعه بعد. لمعلوماتك ، جربت عرض الخط 100 و 250 حرفًا ، لكن كلاهما يحقق نتائج مماثلة.

   `         `  .     `.      `         ...                                                         
   +:: ..-.. --.:`:. `-` .....:`../--`.. `-                                                         
           `      `       ````                                                                      
                                                                      `                             
   ` `` .`       ``    .`    `.               `` .      -``-          ..                            
   .`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :                            
   .`         ` `    ` .`         ````:``  -                  ` ``-.`  `                            
   `-                                ..                           ``                                
    .       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `       
           `:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `     
            ``  `       ```.      ``    ````    `       `     `        `    `         `   `   .     
            : -...`.- .` .:/ `                                                                      
    -       `             `` .                                                                      
    -`                                                                                              
    `                                                                                               

لقد نسيت المعالج السابق. جرب هذا:

pngtopnm helloworld.png | ocrad | g++ -x 'c++' -

لقد وجدت أنه يساعد على عدم كتابة الرمز الخاص بي على زجاج الشاشة الخاص بي مع علامة سحرية ، على الرغم من أنها تبدو لطيفة عندما تكون سوداء حقا. تمتلئ الشاشة بسرعة كبيرة ، ثم يتصل بي الأشخاص الذين يقدمون لي جهازًا نظيفًا أسماء كل أسبوع.

زوجان من الموظفين (أنا مدير) يشتركان في شراء واحدة من تلك الحواسيب ذات الوسادة الحمراء مع المقابض. وقالوا إنني لن أحتاج إلى علامات ويمكنني تنظيف الشاشة بنفسي عندما تكون ممتلئة ولكن يجب أن أكون حذرا وهو يهزها. من المفترض انها حساسة بهذه الطريقة.

هذا هو السبب في أنني توظيف الأشخاص الأذكياء.


هل أنا الوحيد الذي لا يستطيع التعرف على الشخصية بين "العودة" والفاصلة المنقوطة؟ يمكن أن يكون!


هل قمت بكتابة البرنامج ثم قم بمسحه ضوئيًا في الكمبيوتر؟ هذا هو ما ينطوي عليه "helloworld.png". إذا كانت هذه هي الحالة ، يجب أن تكون على علم بأن معيار C ++ (حتى في أحدث إصدار له) لا يتطلب وجود التعرّف البصري على الأحرف ، ولسوء الحظ لم يتم تضمينه كميزة اختيارية في أي مترجم حالي.

قد ترغب في النظر في نقل الرسومات إلى تنسيق نصي. يمكن استخدام أي محرر نص عادي. إن استخدام معالج الكلمات ، رغم أنه قادر على توليد نسخة مطبوعة جميلة ، سيؤدي على الأرجح إلى نفس الخطأ الذي تحصل عليه أثناء محاولة المسح.

إذا كنت مغامرًا بالفعل ، فقد تحاول كتابة رمزك في معالج كلمات. اطبعها ، ويفضل استخدام خط مثل OCR-A . ثم ، خذ المطبوعات والمسح الضوئي مرة أخرى. ويمكن تشغيل المسح ثم من خلال حزمة OCR لجهة خارجية لإنشاء نموذج نصي. ثم قد يتم ترجمة نموذج النص باستخدام واحدة من العديد من برامج التحويل البرمجي القياسية.

ومع ذلك ، كن حذرًا من التكلفة الهائلة للورقة التي سيتحملها ذلك خلال مرحلة تصحيح الأخطاء.


هو مجموعة مترجم الخاص بك في وضع الخبير؟! إذا كانت الإجابة بنعم ، فلا يجب أن يتم تجميعها. لقد تعب المترجمون الحديثون من "Hello World!"


يبدو أن المحول البرمجي الخاص بك لا يدعم الملفات في مثل hmm ... الترميز. محاولة تحويله إلى ASCII.


يمكنك أن تجرب السيناريو python التالية. لاحظ أنك تحتاج إلى تثبيت PIL و pytesser .

from pytesser import *
image = Image.open('helloworld.png')  # Open image object using PIL
print image_to_string(image)     # Run tesseract.exe on image

لاستخدامها ، قم بما يلي:

python script.py > helloworld.cpp; g++ helloworld.cpp

File format not recognized على تنسيق الملف تحتاج إلى تنسيق الملف الخاص بك بشكل صحيح. وهذا يعني استخدام الألوان والخطوط المناسبة لرمزك. انظر وثائق محددة لكل مترجم لأن هذه الألوان تختلف بين المترجم ؛)





clang