قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 322
نشاط [ احمد شهيد جواد ]
قوة السمعة:
قديم 08-12-2016, 07:19 PM المشاركة 17   
افتراضي



اخي مشتاق قيمة ال count غير معلومة لان الحلقة التكرارية لن تنتهي ابداً وبالتالي سيحصل طفحان بال count ومن ثم البدأ من جديد لانك جعلت المتغير (i)
unsigned اي عندما يصل الى الصفر سيحدث ايرور وبالتالي يبقى المايكرو في نفس اللوب اما ماذكرته من perfix فهذا توهيم وليس السبب ....
الحل اما بجعل المتغير (i) من نوع signed او تجعل الاختبار لحد 1 وبالتالي ستكون نتيجة ال count بــ 5


التعديل الأخير تم بواسطة : احمد شهيد جواد بتاريخ 08-12-2016 الساعة 07:24 PM
اعلانات

مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 08-12-2016, 11:31 PM المشاركة 18   
sun


أنا أحب الأصرار

تحليل بسيط للكود
unsigned int يكون داءما أكبر أو يساوى 0
صحيح

لذالك يكون التكرار لحد أكبر عدد فى unsigned int و بعدها ERROR
هل هذا التحليل صحيح ?
غير صحيح لان التكرار فى حلقة FOR يتوقف على قيمة البداية و شرط التكرار ثم حجم متغير التكرار .
و اذا وصل التكرار الى اكبر قيمة فى المتغير فانه لا يحدث ERROR , بينما يحدث تصفير لقيمة المتغير و بداية العد من جديد و هو ما يسمى الطفحان او OVER FLOW
.


التعديل الأخير تم بواسطة : مشتاق الله بتاريخ 09-12-2016 الساعة 12:49 AM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 08-12-2016, 11:42 PM المشاركة 19   
sun


اخي مشتاق قيمة ال count غير معلومة لان الحلقة التكرارية لن تنتهي ابداً وبالتالي سيحصل طفحان بال count ومن ثم البدأ من جديد لانك جعلت المتغير (i)
unsigned اي عندما يصل الى الصفر سيحدث ايرور وبالتالي يبقى المايكرو في نفس اللوب اما ماذكرته من perfix فهذا توهيم وليس السبب ....
الحل اما بجعل المتغير (i) من نوع signed او تجعل الاختبار لحد 1 وبالتالي ستكون نتيجة ال count بــ 5

جزاك الله خيرا اخ احمد , هذه الحلقة رغم بساطتها الا انها حلقة لا نهائية , و الخطأ فيها هو فى اختيار نوع متغير الحلقة i و هو احيانا كثيرة لا نهتم به .
وهو ما اردت ان الفت الانتباه اليه فى هذا الخطأ .

ارجو ان يكون الامر واضح و يمكن اعادة شرحه اذا طلب الشرح .

جزاكم الله خيرا لكل من شارك و ارجو ان نكون استفدنا من الكود ...
و يكون تصحيح الكود كما يلى :
كود:
signed int i;
unsigned int count = 0;

for (i=4; i>=0; i--){
    ++count;
}
مع ملاحظة امر مهم : ان اقصى قيمة للتكرار فى الحلقة هو اقصى قيمة للمتغير i و حجمه 2 بايت اى 16 بت اى يستطيع ان يحتوى 65535 ---> و هذا غير صحيح ,
لانه اصبح عدد ذو اشارة اى تم حجز البت الاخيرة للاشارة و بالتالى حجمه اصبح 15 بت اى اقصى قيمة له هو 32768 و هذا الامر ينطبق عليه لو كان نوعه char .

ان شاء الله فى انتظار الكود القادم ------>


الله ولى التوفيق

اللهم اجعلنا مؤمنين حقا
و علمنا ما ينفعنا و ينفع بنا
اللهم اكتب حياة ترضيك و ميتة تضحكك منا
و احفظ حلب و موصل و اهلها و سائر بلادنا



التعديل الأخير تم بواسطة : مشتاق الله بتاريخ 09-12-2016 الساعة 12:31 AM

مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 09-12-2016, 12:44 AM المشاركة 20   
sun


اهلا اخوانى مع الكود الجديد _2 : فكر قبل الاجابة (المترجم المستخدم ميكروسي)
كود:
char count = -16,   division ;
        
         division = count/4;

ما قيمة المتغير division ؟
----------------------------------------------------------------
الاجابة اسفل :







الاجابة الخطأ -------> division = -16/4 = -4
الاجابة الصحيحة ---> division = -16/4 = 60
السؤال لماذا ؟


التعديل الأخير تم بواسطة : مشتاق الله بتاريخ 09-12-2016 الساعة 08:31 AM

الصورة الرمزية ghars
ghars
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2016
المشاركات: 60
نشاط [ ghars ]
قوة السمعة:
قديم 09-12-2016, 11:29 AM المشاركة 21   
افتراضي


اهلا اخوانى مع الكود الجديد _2 : فكر قبل الاجابة (المترجم المستخدم ميكروسي)
كود:
char count = -16,   division ;
        
         division = count/4;

ما قيمة المتغير division ؟
----------------------------------------------------------------
الاجابة اسفل :







الاجابة الخطأ -------> division = -16/4 = -4
الاجابة الصحيحة ---> division = -16/4 = 60
السؤال لماذا ؟

فى Mickroc يعتبر char عبارة unsigned char أى من 0---255 لذالك char count = -16 تعنى أننا نجد
count = 10010000 أى 144
144/4 =36


مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 09-12-2016, 12:35 PM المشاركة 22   
افتراضي


فى Mickroc يعتبر char عبارة unsigned char أى من 0---255
رائع اخ ghars

لذالك char count = -16 تعنى أننا نجد count = 10010000
لكنك اخطأت فى التحويل هنا لذلك النتيجة غير صحيحة .

لذلك ساصحح التحويل :
count = 1111 0000 = -16

و هو ما يعتبره المترجم = 240
و يكون الناتج ---> 240/4=60

الدرس المستفاد :
لا تترك المترجم يحدد لك نوع اشارة المتغيرات او الثوابت بل حددها انت .



الصورة الرمزية ghars
ghars
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2016
المشاركات: 60
نشاط [ ghars ]
قوة السمعة:
قديم 09-12-2016, 01:52 PM المشاركة 23   
افتراضي


فى Mickroc يعتبر char عبارة unsigned char أى من 0---255
رائع اخ ghars

لذالك char count = -16 تعنى أننا نجد count = 10010000
لكنك اخطأت فى التحويل هنا لذلك النتيجة غير صحيحة .

لذلك ساصحح التحويل :
count = 1111 0000 = -16

و هو ما يعتبره المترجم = 240
و يكون الناتج ---> 240/4=60

الدرس المستفاد :
لا تترك المترجم يحدد لك نوع اشارة المتغيرات او الثوابت بل حددها انت .

شكرا أخى

لكننى بصراحة لم أفهم التحويل


مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 619
نشاط [ مشتاق الله ]
قوة السمعة:
قديم 09-12-2016, 09:15 PM المشاركة 24   
sun


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

اخى العزيز للحصول على الرقم السالب كما يخزنه الحاسب او الميكرو طبعا تجرى عدة خطوات , شرحها كالتالى :

مثال : للحصول على صيغة الرقم ( 7- ) نتبع التالى :
1- نكتب الصيغة الموجبة للرقم : 00000111
2- نقلب كل 1 الى 0 و العكس و تسمى هذه العملية المتمم (one's complement) فيصبح الرقم : 11111000 .
3- نجمع على الرقم السابق + 1 فقط فيصبح الناتج : 11111001 و يكون هذا هو ما يمثل الرقم ( 7- ) .
العملية 2 و 3 مع بعض اسمهم المكمل او (tow's complement)


يمكنك التاكد بالالة الحاسبة للكمبيوتر من النتيجة , و اغرب رقم له سالب هو رقم 1 , حيث صيغته هى 0xFF و معناها 1- حاول اثباتها بنفس الخطوات .



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 01:40 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)