تمرير الرموز بدل قيمتها في جدول ASCII

السلام عليكم
في المثال التالي

فالنتيجة حسب التعليق انه يطبع @ لكن الحقيقة انه يقوم بطباعة 64 وهي قيمتها في ascii
ولطباعة الرمز بدل قيمته يجب اضافة c%
هكذا

السؤال أواجه مشكلة في تمرير قيمة char الى للدالة parseInt
كيف امرر القيمة او الرمز @ بدل 64 ؟

يبدو أن هناك خطأ في المثال كما ذكرت.
بالنسبة لسؤالك، تمرير قيمة الascii لمحرف دون كتابة الرقم يتم باستخدام علامات الاقتباس المفردة، أي تمرير '@'. أي أن هاتين الجملتين متطابقتين:

print("%c\n", 64);
print("%c\n", '@');

لكن لماذا تريد تمرير قيمة ascii واحدة لدالة parseInt؟ هذه الدالة تستلم سلسلة محارف وليس محرفا واحدا.

parseInt('1') <-- error
parseInt("1") <-- correct
parseInt("123") <-- correct

إن كنت تبحث عن طريقة لتحويل محرف واحد إلى الرقم الذي يقابله فكل ما عليك فعله استخدام عملية طرح. مثلا:

'0' == 48
'1' == 49
'1' - '0' == 1
'5' - '0' == 5
1 Like

مثلا في هذا المثال احاول تحويل “123” الى 123 لكن في النتيجة تظهر 0 بغض النظر على الرقم المكتوب .
ايضا احتاج الى تمرير كل قيمة على حدة مثلا بدل تمرير “123” ارغب بإرسال كل على حدي
“1” وبعدها "2 " وغيرها
ويظهر خطأ

ملاحظة فقط لا يتعرف على parseInt الا بعد اضافة
@expname[atof] func parseInt (CharsPtr): Int[64];

عدة ملاحظات:

1: تعريفك لدالة parseInt خاطئ، نأسف إن كنت قد أخذت التعريف من إحدى الوثائق. التعريف يربط الدالة parseInt مع الدالة atof (أي أنك عندما تستدعي parseInt فأنت في الحقيقة تستدعي دالة atof من النظام، وهي في الحقيقة إحدى دالات لغة الC). المشكلة هنا أن دالة atof تحول سلسلة المحارف إلى عدد عائم (float) وليس عدد صحيح، لذا ستحتاج لاستخدام دالة atoi بدلا من ذلك. فيكون التعريف كالتالي:

@expname[atoi] func parseInt (CharsPtr): Int;

2: السطر الثاني parseInt(s(1)) خاطئ لأنك مررت محرفا واحدا بدل سلسلة المحارف. السطر الذي قبله صحيح لكنه أعطى نتيجة 0 بسبب الخطأ المذكور في الملاحظة الأولى.

3: دالة parseInt لم يتعرف عليها لأنها معرفة داخل الصنف String. أي أنك إن أزلت السطر الأول من المثال أعلاه فيمكنك استخدام التعريف الموجود داخل String كما يلي:

Console.print("%i\n", String.parseInt(s));
1 Like

شكرا على الشرح الأن اصبحت امور واضحة

1 Like