السلام عليكم و رحمة الله و بركاته
بينما كنت أناقش أخي Omnivore أمس, لفت انتباهي استدعاءه لــ getch بصفتين مختلفتين !, و هذا ما جعلني أفتح موضوعا جديدا لكي نناقش فيه بعض المسائل المتعلقة بهذه الدالة.
نهتم في هذا الموضوع بنقطتين هما :
- ما نوع المتغير الذي تعيده getch ؟ هل هو char أم int ؟
- كيف يمكننا استدعاء الدالة getch و كأنها تعيد void ؟
بالنسبة للنقطة الأولى :
بداية, الأخ Omnivore قال بأن الدالة getch تُعيد int و أنا أخالفه في هذه الجزئية ! لأنني أعتقد أن هذه الدالة تُعيد char وهو المحرف الذي أدخله المستخدم. بدليل أنه إذا قمنا بإسناد القيمة التي تعيدها getch إلى متغير من نوع int ثم أظهرنا هذه القيمة فسنلاحظ أن القيمة المُسندة ما هي إلا كود المتغير المُدخل في جدول ASCII و هذا يدل على أن getch قرأت المُدخلات على أنها محرف و عند إسناد القيمة تم عمل Casting بشكل ضمني و بالتالي سيحمل متغير int الكود المـُقابل للحرف المـُدخل في الــ ASCII.
حتى لا يكون كلامي نظريا بحتا, سأعطي مثال :
#include<stdio.h>
#include<conio.h>
int main() {
char CH = getch();
printf("CH = %d",(int)CH);
return 0;
}عندما نُدخل الحرف A في الكود السابق ستظهر القيمة 65 و عندما نُدخل a ستظهر القيمة 97.
إذا الدالة getch تعاملت مع المـُدخلات على أنها حرف (caractère) و السبب في ظهور تلك الأعداد يعود إلى نوع المتغير CH.(تم تحويل الأحرف إلى ما يُقابلها في جدول الآسكي).
الكود السابق يُكافئ :
char CH = getch();
printf("CH = %d",(int)CH);ملاحظة :
حتى لا نخرج عن سياق الموضوع .. لسنا هنا للحديث عن ترميز أنواع المتغيرات داخل الذاكرة و تسجيل القيم داخل مسجلات لبروسيسور !
الموضوع يناقش طرق استدعاء الدالة getch و الأمور الأخرى عبارة عن كماليات و لا تمثل لب الموضوع.
بالنسبة للنقطة الثانية :
إذا كانت لدينا دالة تعيد قيمة من نوع ما, ثم قمنا باستدعاء هذه الدالة و لكن لم نُخزن هذه القيمة فهل معنى هذا أن الدالة لا تعيد شيء ؟ طبعا لا !
مثلا , يمكننا استدعاء الدالة getch بالطريقتين :
char CH = getch(); getch();
إذا كنت تستغرب الإستدعاء الثاني بحجة أن الدالة getch تُعيد char فإليك الكود الآتي :
#include<stdio.h>
#include<time.h>
int random(){
srand(time(NULL));
return rand()%100;
}
int main() {
random();
printf("RANDOM = %d",random());
return 0;
}الدالة random تُعيد عدد عشوائي يقع بين 0 و 100, لكن ألا تلاحظ أنه تم استدعاء random (بدون تخزين القيمة المـُعادة في متغير جديد) داخل printf ؟ و الكود يعمل 100% !
قد تقول هذه حالة خاصة باستدعاء الدوال في printf لأن الكتابة العامة لـــ printf تفرض ذلك !, حسنا لا بأس .. يمكنك استدعاء random هكذا :
random();
نخلص إلى أن استدعاء الدالة (بدون تخزين القيمة المُعادة) لا يعبر عن شيء !.
ما رأيكم ؟؟

