الفرق بين المراجعتين لصفحة: «Arduino/string»
جميل-بيلوني (نقاش | مساهمات) لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) لا ملخص تعديل |
||
سطر 1: | سطر 1: | ||
يمكن تمثيل السلاسل النصية بطريقين. فإمَّا أن | يمكن تمثيل السلاسل النصية بطريقين. فإمَّا أن تُستخدَم السلاسل النصية كأحد أنواع البيانات في أردوينو والذي أصبح جزءًا من النواة بدءًا من الإصدار 0019، أو يمكن إنشاء سلسلة نصية من مصفوفة من المحارف مع وجود المحرف <code>null</code> في نهايتها؛ ستُشرَح الطريقة الثانية في هذه الصفحة. لمزيد من التفاصيل حول الكائن <code>[[Arduino/stringobject|String]]</code> الذي يوفر الكثير من الوظائف على حساب الذاكرة، اطلع على [[Arduino/stringobject|صفحة]] توثيقه. | ||
==البنية العامة== | |||
== البنية العامة == | |||
جميع الأمثلة التالية هي تصريحات صالحة للسلاسل النصية:<syntaxhighlight lang="arduino"> | جميع الأمثلة التالية هي تصريحات صالحة للسلاسل النصية:<syntaxhighlight lang="arduino"> | ||
char Str1[15]; | char Str1[15]; | ||
سطر 10: | سطر 9: | ||
char Str6[15] = "arduino"; | char Str6[15] = "arduino"; | ||
</syntaxhighlight>يوجد عدَّة احتمالات متاحة للتصريح عن السلاسل النصية هي: | </syntaxhighlight>يوجد عدَّة احتمالات متاحة للتصريح عن السلاسل النصية هي: | ||
* التصريح عن مصفوفة من المحارف دون تهيئتها كما في المصفوفة Str1. | *التصريح عن مصفوفة من المحارف دون تهيئتها كما في المصفوفة <code>Str1</code>. | ||
* التصريح عن مصفوفة من المحارف (مع زيادة | *التصريح عن مصفوفة من المحارف (مع زيادة الحجم لمحرف إضافي)، وسيضيف المصرَّف المحرف <code>null</code> المطلوب تلقائيًّا مثل المصفوفة <code>Str2</code>. | ||
* هذه الحالة تشبه الحالة السابقة تمامًا باستثناء إضافة المحرف null بشكل صريح إلى المصفوفة مثل المصفوفة Str3. | *هذه الحالة تشبه الحالة السابقة تمامًا باستثناء إضافة المحرف <code>null</code> بشكل صريح إلى المصفوفة مثل المصفوفة <code>Str3</code>. | ||
* تهيئة المصفوفة بسلسلة نصية ثابتة | *تهيئة المصفوفة بسلسلة نصية ثابتة تعطى ضمن علامتي اقتباس؛ سيختار المصرِّف عند تصريفه للشيفرة حجمًا ملائمًا للمصفوفة يسع السلسلة النصية الثابتة مع محرف الإنهاء <code>null</code>. انظر إلى المصفوفة <code>Str4</code> التي تشرح هذه الحالة. | ||
* تهيئة المصفوفة مع تحديد حجمها بصريح العبارة مثل المصفوفة Str5. | *تهيئة المصفوفة مع تحديد حجمها بصريح العبارة مثل المصفوفة <code>Str5</code>. | ||
* تهيئة المصفوفة مع اختيار حجم زائد لتوفير إمكانية لسلسلة نصية أكبر مستقبلًا. انظر مثلًا إلى المصفوفة Str6 التي تمثِّل هذه الحالة. | *تهيئة المصفوفة مع اختيار حجم زائد لتوفير إمكانية لسلسلة نصية أكبر مستقبلًا. انظر مثلًا إلى المصفوفة <code>Str6</code> التي تمثِّل هذه الحالة. | ||
===محرف الإنهاء <code>null</code>=== | |||
عمومًا، تُنهَى السلاسل النصية بالمحرف <code>null</code> (المحرف ASCII 0). هذا يسمح للدوال (مثل الدالة <code>[[Arduino/serial/print|Serial.print()]]</code>) بأن تعرف نهاية السلسلة النصية في الذاكرة. إن لم يكن محرف الإنهاء موجودًا، فستكمل الدالة قراءة البايتات المتلاحقة الموجودة في الذاكرة التي قد لا تكون جزءًا من السلسلة النصية نفسها. | |||
هذا يعني أنَّ أي سلسلة نصية يجب أن تملك مساحة إضافية لمحرف زائد إضافةً إلى المحتوى الذي تريد تخزينه في السلسلة. هذا هو السبب الذي يفسِّر حاجة المصفوفة <code>Str2</code> والمصفوفة <code>Str5</code> إلى حجم بمقدار 8 رغم أنَّ حجم العبارة "arduino" هو 7 فقط، إذ سيُضاف في الموضع الأخير المتاح المحرف <code>null</code> تلقائيًّا. بالنسبة للمصفوفة <code>Str4</code>، سيحدَّد حجمها إلى 8 محارف تلقائيًّا مع أخذ محرف الإنهاء بالحسبان. في المصفوفة <code>Str3</code>، أضفنا المحرف <code>null</code> بصريح العبارة (يُكتَب '0\') يدويًّا. | |||
انتبه إلى أنَّه من المحتمل وجود سلسلة نصية لا تملك محرف إنهاءٍ (مثل تحديد حجم المصفوفة <code>Str2</code> إلى 7 بدلًا من 8). سيؤدي هذا إلى حدوث خلل في أغلب الدوال التي تتعامل مع السلاسل النصية، لذا يجب عليك تجنب فعل ذلك من غير قصد. إن لاحظت أنَّ سلوك البرنامج أصبح غريبًا بعض الشيء (خصوصًا عند التعامل مع المحارف وليس مع السلاسل النصية)، فيُحتمَل غالبًا أن يكون محرف الإنهاء هو مسبب المشكلة. | |||
== | === علامتي الإقتباس المفردة والمزدوجة === | ||
تعرَّف السلاسل النصية دومًا داخل علامتي اقتباس مزدوجة مثل "ABC"، وتعرَّف المحارف دومًا داخل علامتي اقتباس مفردة مثل 'A'. | |||
=== | === التفاف السلاسل النصية الطويل === | ||
يمكن للسلاسل النصية الطويل الالتفاف والانتقال إلى السطر التالي بالشكل:<syntaxhighlight lang="arduino"> | |||
char myString[] = "هذا هو السطر الأول" | |||
" وهذا السطر الثاني" | |||
" وهلم جرًّا"; | |||
</syntaxhighlight> | |||
=== | === مصفوفات من سلاسل نصية === | ||
إنَّه من المناسب في كثير من الأحيان عند التعامل مع قدرٍ كبيرٍ من النصوص، مثل العمل على مشروع يحوي شاشة LCD، إنشاء مصفوفة من سلاسل نصية. لمَّا كانت السلاسل النصية هي مصفوفات بحد ذاتها، فسنلجأ في هذه الحالة إلى استعمال مصفوفة ثنائية الأبعاد. | |||
في المثال الآتي، وجود المعامل <code>[[Arduino/pointer access operators/dereference|*]]</code> بعد تعريف نوع البيانات الذي هو <code>[[Arduino/char|char]]</code> بالشكل "*char" يشير إلى أنَّ المصفوفة المراد التصريح عنها هي مصفوفة من المؤشِّرات (pointers). حقيقيةً، جميع المصفوفات هي مؤشِّرات، لذا استعمال المعامل <code>[[Arduino/pointer access operators/dereference|*]]</code> بهذا الشكل مهم لإنشاء مصفوفةٍ من مصفوفات. المؤشرات في لغة C معقدةٌ بعض الشيء ولا يفهمها الكثير من المبرمجين المبتدئين، ولكن يكفي فهم المؤشرات بشكل سطحي فقط للتعامل معها في حالتنا هذه. | |||
== | == أمثلة == | ||
مثالٌ على تعرف مصفوفة من مصفوفات باستعمال المعامل <code>[[Arduino/pointer access operators/dereference|*]]</code> وطباعة محتوي هذه المصفوفة على [[Arduino/serial|الواجهة التسلسلية]]:<syntaxhighlight lang="arduino"> | |||
char* myStrings[]={"This is string 1", "This is string 2", "This is string 3", | |||
"This is string 4", "This is string 5","This is string 6"}; | |||
void setup(){ | |||
Serial.begin(9600); | |||
} | |||
void loop(){ | |||
for (int i = 0; i < 6; i++){ | |||
Serial.println(myStrings[i]); | |||
delay(500); | |||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
==انظر أيضًا== | |||
==مصادر== | |||
*[https://www.arduino.cc/reference/en/language/variables/data-types/string/ صفحة النوع String في توثيق أردوينو الرسمي.] | |||
== انظر أيضًا == | |||
== مصادر == | |||
* [https://www.arduino.cc/reference/en/language/variables/data-types/ |
مراجعة 08:55، 25 أكتوبر 2018
يمكن تمثيل السلاسل النصية بطريقين. فإمَّا أن تُستخدَم السلاسل النصية كأحد أنواع البيانات في أردوينو والذي أصبح جزءًا من النواة بدءًا من الإصدار 0019، أو يمكن إنشاء سلسلة نصية من مصفوفة من المحارف مع وجود المحرف null
في نهايتها؛ ستُشرَح الطريقة الثانية في هذه الصفحة. لمزيد من التفاصيل حول الكائن String
الذي يوفر الكثير من الوظائف على حساب الذاكرة، اطلع على صفحة توثيقه.
البنية العامة
جميع الأمثلة التالية هي تصريحات صالحة للسلاسل النصية:
char Str1[15];
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
char Str4[ ] = "arduino";
char Str5[8] = "arduino";
char Str6[15] = "arduino";
يوجد عدَّة احتمالات متاحة للتصريح عن السلاسل النصية هي:
- التصريح عن مصفوفة من المحارف دون تهيئتها كما في المصفوفة
Str1
. - التصريح عن مصفوفة من المحارف (مع زيادة الحجم لمحرف إضافي)، وسيضيف المصرَّف المحرف
null
المطلوب تلقائيًّا مثل المصفوفةStr2
. - هذه الحالة تشبه الحالة السابقة تمامًا باستثناء إضافة المحرف
null
بشكل صريح إلى المصفوفة مثل المصفوفةStr3
. - تهيئة المصفوفة بسلسلة نصية ثابتة تعطى ضمن علامتي اقتباس؛ سيختار المصرِّف عند تصريفه للشيفرة حجمًا ملائمًا للمصفوفة يسع السلسلة النصية الثابتة مع محرف الإنهاء
null
. انظر إلى المصفوفةStr4
التي تشرح هذه الحالة. - تهيئة المصفوفة مع تحديد حجمها بصريح العبارة مثل المصفوفة
Str5
. - تهيئة المصفوفة مع اختيار حجم زائد لتوفير إمكانية لسلسلة نصية أكبر مستقبلًا. انظر مثلًا إلى المصفوفة
Str6
التي تمثِّل هذه الحالة.
محرف الإنهاء null
عمومًا، تُنهَى السلاسل النصية بالمحرف null
(المحرف ASCII 0). هذا يسمح للدوال (مثل الدالة Serial.print()
) بأن تعرف نهاية السلسلة النصية في الذاكرة. إن لم يكن محرف الإنهاء موجودًا، فستكمل الدالة قراءة البايتات المتلاحقة الموجودة في الذاكرة التي قد لا تكون جزءًا من السلسلة النصية نفسها.
هذا يعني أنَّ أي سلسلة نصية يجب أن تملك مساحة إضافية لمحرف زائد إضافةً إلى المحتوى الذي تريد تخزينه في السلسلة. هذا هو السبب الذي يفسِّر حاجة المصفوفة Str2
والمصفوفة Str5
إلى حجم بمقدار 8 رغم أنَّ حجم العبارة "arduino" هو 7 فقط، إذ سيُضاف في الموضع الأخير المتاح المحرف null
تلقائيًّا. بالنسبة للمصفوفة Str4
، سيحدَّد حجمها إلى 8 محارف تلقائيًّا مع أخذ محرف الإنهاء بالحسبان. في المصفوفة Str3
، أضفنا المحرف null
بصريح العبارة (يُكتَب '0\') يدويًّا.
انتبه إلى أنَّه من المحتمل وجود سلسلة نصية لا تملك محرف إنهاءٍ (مثل تحديد حجم المصفوفة Str2
إلى 7 بدلًا من 8). سيؤدي هذا إلى حدوث خلل في أغلب الدوال التي تتعامل مع السلاسل النصية، لذا يجب عليك تجنب فعل ذلك من غير قصد. إن لاحظت أنَّ سلوك البرنامج أصبح غريبًا بعض الشيء (خصوصًا عند التعامل مع المحارف وليس مع السلاسل النصية)، فيُحتمَل غالبًا أن يكون محرف الإنهاء هو مسبب المشكلة.
علامتي الإقتباس المفردة والمزدوجة
تعرَّف السلاسل النصية دومًا داخل علامتي اقتباس مزدوجة مثل "ABC"، وتعرَّف المحارف دومًا داخل علامتي اقتباس مفردة مثل 'A'.
التفاف السلاسل النصية الطويل
يمكن للسلاسل النصية الطويل الالتفاف والانتقال إلى السطر التالي بالشكل:
char myString[] = "هذا هو السطر الأول"
" وهذا السطر الثاني"
" وهلم جرًّا";
مصفوفات من سلاسل نصية
إنَّه من المناسب في كثير من الأحيان عند التعامل مع قدرٍ كبيرٍ من النصوص، مثل العمل على مشروع يحوي شاشة LCD، إنشاء مصفوفة من سلاسل نصية. لمَّا كانت السلاسل النصية هي مصفوفات بحد ذاتها، فسنلجأ في هذه الحالة إلى استعمال مصفوفة ثنائية الأبعاد.
في المثال الآتي، وجود المعامل *
بعد تعريف نوع البيانات الذي هو char
بالشكل "*char" يشير إلى أنَّ المصفوفة المراد التصريح عنها هي مصفوفة من المؤشِّرات (pointers). حقيقيةً، جميع المصفوفات هي مؤشِّرات، لذا استعمال المعامل *
بهذا الشكل مهم لإنشاء مصفوفةٍ من مصفوفات. المؤشرات في لغة C معقدةٌ بعض الشيء ولا يفهمها الكثير من المبرمجين المبتدئين، ولكن يكفي فهم المؤشرات بشكل سطحي فقط للتعامل معها في حالتنا هذه.
أمثلة
مثالٌ على تعرف مصفوفة من مصفوفات باستعمال المعامل *
وطباعة محتوي هذه المصفوفة على الواجهة التسلسلية:
char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6"};
void setup(){
Serial.begin(9600);
}
void loop(){
for (int i = 0; i < 6; i++){
Serial.println(myStrings[i]);
delay(500);
}
}