الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تحدي : امنع تغيير التعليقات !

بدأه مصطفى 36a2 في 15 نوفمبر 2013 · 10 رد · 1,195 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته
من المعروف أن كتابة أي شيء داخل التعليق لن يؤثر على البرنامج ..
ولكن ماذا لو أخبرتك بأنه يؤثّر :) ...
إليك الكود التالي :

#include<iostream>
using namespace std;
/*
If you add new line here the code will output "Error"
*/
int main()
{
    /*Guess This line :) */
    return 0;
}
في الكود السابق (قمت بإخفاء سطر منه) يقوم بطباعة Hello إن تركت الكود وشأنه,
ولكن إذا قمت بإضافة سطر جديد للتعليق مثل هذا
/*
If you add new line here the code will output "Error"
Let's Try it
*/
فسيطبع Error  مثلاً ..

احزر ما هو محتوى السطر المخفي في الكود ..:)

بالتوفيق
#2

خلاااص :D

يظهر السؤال سهل جداً , لم يرغب أحد في حرقه :)

هذه هي الإجابة :

إذا أردنا الطباعة تكون على الكونسول :

#include<iostream>
using namespace std;
/*
If you add new line here the code will output "Error"
*/
int main()
{
    cout << ((__LINE__ ==8 )? "Hello":"Error" )<< endl ;
    return 0;
}

إذا أضفنا سطر آخر للتعليق فسيتم طباعة Error .. جربها :)

__________________________

يمكن أن نجعل البرنامج لا يعمل أبداً ويصدر Error ( بدل أن يطبع كلمة Error ) كما يلي .. ( خارج عن السؤال الأصلي )

جرب الكود :

#include<iostream>
using namespace std;
/*
If you add new line here the code will output "Error"
*/
int main()
{
    #if __LINE__ != 8
        #error Hey Stop Editing My comments !!
    #endif // __LINE__
    return 0;
}

بالتوفيق للجميع :)

2
#3

:rolleyes:  شكرا على الحل .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#4

عفواً :D
هل هناك أسئلة :D

#5

هههه جميل صراحة... حلو نشوفك دوم مع هذه المشاركات الحلوة.

#6
مصطفى 36a2 كتب:

عفواً :D

هل هناك أسئلة :D

B)  لا أسئلة .. و الحمد لله ..

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7
#include <iostream>
using namespace std;
/*
If you add new line here the code will output "Error"
-------- no it won't --------
*/
int main()
{
#line 8
    #if __LINE__ != 8
        #error Hey Stop Editing My comments !!
    #endif // __LINE__
    return 0;
}

:P

تم تعديل هذه المشاركة بواسطة C++er في 22 نوفمبر 2013 في 21:07

4

مدونتي: C++ Tips and Tricks

#8

جاء في السؤال 

 

اقتباس

 

 

من المعروف أن كتابة أي شيء داخل التعليق لن يؤثر على البرنامج ..
ولكن ماذا لو أخبرتك بأنه يؤثّر  :) ...

 

المثال التالي، يعطي أيضا Error مع أني لم أغير التعليقات

#include<iostream>
using namespace std;
/*
If you add new line here the code will output "Error"
*/
int main()
{

	cout << ((__LINE__ ==8 )? "Hello":"Error" )<< endl ;
    return 0;
}

تم تعديل هذه المشاركة بواسطة zirek99i في 22 نوفمبر 2013 في 23:35

#9

آسف لأنني جعلتك تفعل كل هذا :P

الفكرة فعليّا ليست في تغيير التعليقات .. بل في إضافة أي سطر بدون اكتراث إلى البرنامج ..

فكرة البرنامج هي بأن الماكرو الخاص بالمترجم __LINE__ والذي يستبدله برقم السطر  , ستتغيّر قيمته عند إضافة أي سطر قبله ..

وكما كتب أخونا C++er فقد وضع قفلاّ على التعويذة بحيث يوهم المترجم بأن السطر التالي للتعليمة line# رقمه 8 ..

طبعاً من الخطأ أن تصل إلى PE header لأن كل هذه الحركات تجري وقت الترجمة حيث يتم استبدال __LINE__ برقم , بل وأكثر من ذلك .. سيتم اختبار الشرط 8==8 مثلاً وسيعرف المترجم أنه محقق وعلى الأغلب .. ستجد في البرنامج عند تحليله أنه سيطبع Hello بدون أي شطر وأي شيء .. (أو Error)

كما قلت .. التعليمات السابقة يظهر أثرها وقت الترجمة فقط ..

مثلاً جرب كتابة :

cout << __LINE__<<endl;
cout << __LINE__<<endl;
cout << __LINE__<<endl;
cout << __LINE__<<endl;
cout << __LINE__<<endl;

وانظر إلى الخرج ..

الفكرة كانت فقط باستعماله داخل شرط

آسف لإضاعة وقتك مرة أخرى :)

بالتوفيق

_____________________

إضافة :

يمكنك قراءة ما كتبه الأخ C++er داخل الأسئلة الأكثر شيوعاً .. ( يجب أن يكون اسم الموضوع : الأسئلة الأكثر غموضاً :) )

كتب أن عملية الترجمة تتم على 9 مراحل بدءا من الكود وانتهاءا بملف تنفيذي ..

المهم : في المرحلة الأولى على ما أذكر يتم حذف التعليقات من الكود :D

 

على كل حال : كان السؤال يقول : ولكن إذا قمت بإضافة سطر جديد للتعليق مثل هذا ... فسيظهر Error .. وكما يقول بابا سنفور : كل ما ينفّذ المطلوب فهو صحيح :)

بالتوفيق مرة أخرى :)

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 22 نوفمبر 2013 في 23:06

#10

لاعليك أخي فالأمرعادي تماما، B)

المسألة كانت مثيرة جداً، فقد ظننت أن هناك طريقة لإكتشاف أي تغيير حدث بالتعليقات :ph34r: .

تم تعديل هذه المشاركة بواسطة zirek99i في 22 نوفمبر 2013 في 23:35

#11

حسناً سأغير عنوان السؤال إلى  " اعثر على ملفاتك الضائعة باستخدام PreProcesses " 

:D

بالتوفيق للجميع .. وشكرا أخي C++er عالحركة :) قويّة :)

وأهلين أخي حسام شرفتنا :)

والسلام عليكم ورحمة الله

______________________

:: فقد ظننت أن هناك طريقة لإكتشاف أي تغيير حدث بالتعليقات

ربما هناك بالفعل .. ولكن عليك أن تعرف أين تبحث :)

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 22 نوفمبر 2013 في 23:17

مواضيع مشابهة