الفرق بين المراجعتين لصفحة: «Arduino/array»

من موسوعة حسوب
أنشأ الصفحة ب'المصفوفة هي مجموعة من المتغيرات الموضوعة في وعاء واحد والتي يمكن الوصول إليها عبر رقم فهرس ك...'
 
إضافة محتويات الصفحة.
 
سطر 1: سطر 1:
المصفوفة هي مجموعة من المتغيرات الموضوعة في وعاء واحد والتي يمكن الوصول إليها عبر رقم فهرس كلٍّ منها. يمكن أن تكون المصفوفات في لغة C، التي ترتكز عليها لغة أردونيو، معقدةً ولكن استعمال المصفوفات بأبسط شكل لها هو أمر سهل وواضح.
<noinclude>{{DISPLAYTITLE:المصفوفات في  أردوينو}}</noinclude>
 
المصفوفة هي مجموعة من المتغيرات الموضوعة في وعاء واحد والتي يمكن الوصول إليها عبر رقم فهرس كلٍّ منها. يمكن أن تكون المصفوفات في لغة C، التي ترتكز عليها لغة أردونيو، معقدةً بعض الشيء ولكنَّ استعمال المصفوفات بأبسط شكل لها هو أمر سهل ويسير.
== إنشاء مصفوفة ==
==إنشاء مصفوفة==
يوجد عدة طرائق لإنشاء مصفوفة منها:<syntaxhighlight lang="arduino">
يوجد عدة طرائق لإنشاء مصفوفة منها:<syntaxhighlight lang="arduino">
int myInts[6];
int myInts[6];
سطر 7: سطر 7:
int mySensVals[6] = {2, 4, -8, 3, 2};
int mySensVals[6] = {2, 4, -8, 3, 2};
char message[6] = "hello";
char message[6] = "hello";
</syntaxhighlight>يمكنك التصريح عن مصفوفة دون تهيئتها ووضع قيم فيها كما في المصفوفة <code>myInts</code>. ويمكن التصريح عن مصفوفة دون تحديد حجمها بوضوح مثل المصفوفة <code>myInts</code>؛ سيَعُدُّ المصرَّف في هذه الحالة العناصر وينشئ مصفوفةً بحجم مناسب.
</syntaxhighlight>يمكنك التصريح عن مصفوفة دون تهيئتها ووضع قيم فيها كما في المصفوفة <code>myInts</code>. ويمكن التصريح عن مصفوفة دون تحديد حجمها بوضوح مثل المصفوفة <code>myInts</code>؛ سيَعُدُّ المصرَّف في هذه الحالة العناصر ويعطي المصفوفة حجمًا مناسبًا.
 
على كل حال، يمكنك تهيئة مصفوفة وتحديد حجمها كما في حالة المصفوفة <code>mySensVals</code>. انتبه إلى أنَّه عند التصريح عن مصفوفة من المحارف، تحتاج إلى زيادة حجم المصفوفة عن الحجم المطلوب لتتسع إلى عنصرٍ إضافيٍّ واحدٍ فقط هو المحرف العدمي (null) الذي يتوضع في نهاية المحارف؛ انظر مثلًا إلى حجم المصفوفة <code>message</code> في المثال السابق وعدد المحارف المخزَّنة فيها.


== الوصول إلى المصفوفة ==
على كل حال، يمكنك تهيئة مصفوفة وتحديد حجمها كما في حالة المصفوفة <code>mySensVals</code>. انتبه إلى أنَّه عند التصريح عن [[Arduino/string|مصفوفة من المحارف]]، تحتاج إلى زيادة حجم المصفوفة عن الحجم المطلوب لتتسع إلى عنصرٍ إضافيٍّ واحدٍ فقط هو المحرف العدمي (null) الذي يتوضع في نهاية المحارف؛ انظر مثلًا إلى حجم المصفوفة <code>message</code> في المثال السابق وعدد المحارف المخزَّنة فيها.
تبدأ فهرسة العناصر في المصفوفة من القيمة 0؛ أي فهرس العنصر 2 في المصفوفة <code>mySensVals</code> -في المثال السابق- هو 0، وفهرس العنصر 4 (العنصر الثاني) هو 1 وهلم جرًّا. هذا يعني أيضًا أنَّ فهرس العنصر الأخير لمصفوفة مكونة من 10 عناصر هو 9 وليس 10! إليك هذا المثال:<syntaxhighlight lang="arduino">
==الوصول إلى المصفوفة==
تبدأ فهرسة العناصر في المصفوفة من القيمة 0؛ أي فهرس العنصر 2 في المصفوفة <code>mySensVals</code> -في المثال السابق- هو 0، وفهرس العنصر 4 (العنصر الثاني) هو 1 وهلم جرًّا. هذا يعني أيضًا أنَّ فهرس العنصر الأخير لمصفوفة مكوَّنة من 10 عناصر هو 9 وليس 10! إليك هذا المثال:<syntaxhighlight lang="arduino">
int myArray[10]={9,3,2,4,3,2,7,8,9,11};
int myArray[10]={9,3,2,4,3,2,7,8,9,11};
     // يحوي القيمة 11 myArray[9] العنصر
     // يحوي القيمة 11 myArray[9] العنصر
     // فهو يفع خارج المصفوفة وقد myArray[10] أمَّا العنصر
     // فهو يفع خارج المصفوفة وقد myArray[10] أمَّا العنصر
     // يعيد قيمة عشوائية من الذاكرة
     // يعيد قيمة عشوائية من الذاكرة
</syntaxhighlight>لهذا السبب، يجب عليك أن تكون حذرًا من الوقوع في هذا الخطأ عند الوصول إلى أي عنصر من عناصر مصفوفة. الوصول إلى عنصر يقع بعد العنصر الأخير (الذي فهرسه أكبر من حجم المصفوفة - 1)، أو خارج المصفوفة بشكل عام، يؤدي إلى القراءة من جزء من الذاكرة يُستعمَل لأغراض أخرى. قراءة هذا الجزء لا يعيد قيمًا أو بيانات صالحة. على النقيض، الكتابة على جزء من الذاكرة خارج الجزء المخصص للمصفوفة، عند إسناد قيمة إلى أحد عناصرها، هو أمر سيء وأكثر خطورة من قراءة هذا الجزء، إذ قد يؤدي إلى نتائج كارثية وغير متوقع مثل تحطم البرنامج أو توقفه عن العمل. هذا الخطأ قد يكون من الأخطاء التي يصعب تتبعها وتنقيحها.
</syntaxhighlight>لهذا السبب، يجب عليك أن تكون حذرًا من الوقوع في هذا الخطأ عند الوصول إلى أي عنصر من عناصر مصفوفة. الوصول إلى عنصر يقع بعد العنصر الأخير (الذي فهرسه أكبر من حجم المصفوفة مصروحًا منه القيمة 1)، أو خارج المصفوفة بشكل عام، يؤدي إلى القراءة من جزء من الذاكرة خُصِّص لأغراض أخرى. قراءة هذا الجزء لا يعيد قيمًا أو بيانات صالحة. على النقيض، الكتابة على جزء من الذاكرة خارج الجزء المحجوز للمصفوفة، عند إسناد قيمة إلى أحد عناصرها، هو أمر سيء وأكثر خطورة من قراءة هذا الجزء، إذ قد يؤدي إلى نتائج كارثية وغير متوقعة مثل تحطم البرنامج وتوقفه عن العمل. هذا الخطأ قد يكون من الأخطاء التي يصعب تتبعها وتنقيحها.


لا يتحقَّق مصرِّف لغة C من عمليات الوصول إلى المصفوفات المعرَّفة في البرنامج وإن كانت إحدى عمليات الوصول تتجاوز حدود إحداها خلافًا للغة BASIC أو JAVA لتي تتحقق من هذا الأمر.
لا يتحقَّق مصرِّف لغة C من عمليات الوصول إلى المصفوفات المعرَّفة في البرنامج وإن كانت إحدى عمليات الوصول تتجاوز حدود إحداها خلافًا للغة BASIC أو JAVA لتي تتحقق من هذا الأمر.
 
==إسناد قيمة إلى أحد عناصر مصفوفة==
== إسناد قيمة إلى أحد عناصر مصفوفة ==
يمكن اسناد أي قيمة إلى أحد عناصر المصفوفة باستعمال معامل الإسناد <code>=</code> وفهرس العنصر المراد إسناد القيمة إليه بالشكل التالي:<syntaxhighlight lang="arduino">
يمكن اسناد أي قيمة إلى أحد عناصر المصفوفة باستعمال معامل الإسناد <code>=</code> وفهرس العنصر المراد إسناد القيمة إليه بالشكل التالي:<syntaxhighlight lang="arduino">
mySensVals[0] = 10;
mySensVals[0] = 10;
</syntaxhighlight>
</syntaxhighlight>
 
==جلب قيمة من مصفوفة==
== جلب قيمة من مصفوفة ==
يمكن جلب قيمة أي عنصر من عناصر مصفوفة بمعرفة فهرس هذا العنصر كما يلي:<syntaxhighlight lang="arduino">
يمكن جلب قيمة أي عنصر من عناصر مصفوفة بمعرفة فهرس هذا العنصر كما يلي:<syntaxhighlight lang="arduino">
x = mySensVals[4];
x = mySensVals[4];
</syntaxhighlight>
</syntaxhighlight>
 
==المصفوفات وحلقات التكرار==
== المصفوفات وحلقات التكرار ==
تستعمَل المصفوفات بكثرة داخل حلقات التكرار لتعديلها أو جلب قيم عناصرها، إذ يُستعمَل عداد الحلقة على أنَّه فهرس كل عنصر من عناصر المصفوفة. على سبيل المثال، لطباعة جميع عناصر مصفوفة على [[Arduino/serial|واجهة التخاطب التسلسلية]]، يمكنك استعمال شيء شبيه بالمثال التالي:<syntaxhighlight lang="arduino">
تستعمَل المصفوفات بكثرة داخل حلقات التكرار لتعديلها أو جلب قيم عناصرها، إذ يُستعمَل عداد الحلقة على أنَّه فهرس كل عنصر من عناصر المصفوفة. على سبيل المثال، لطباعة جميع عناصر مصفوفة على [[Arduino/serial|واجهة التخاطب التسلسلية]]، يمكنك استعمال شيء شبيه بالمثال التالي:<syntaxhighlight lang="arduino">
int i;
int i;
سطر 38: سطر 34:
}
}
</syntaxhighlight>
</syntaxhighlight>
 
==أمثلة==
== أمثلة ==
إن أردت مثالًا كاملًا يوضَّح فيه استعمال المصفوفات بالتفصيل الممل، اطلع على هذا المثال.
إن أردت مثالًا كاملًا يوضَّح فيه استعمال المصفوفات بالتفصيل الممل، اطلع على هذا المثال.
==انظر أيضًا==
* النوع <code>[[Arduino/bool|bool]]</code>: يخزِّن المتغير الذي يصرَّح عنه بأنَّه من النوع [[Arduino/bool|<code>bool</code>]] إحدى القيمتين المنطقيَّتين التاليتين: <code>[[Arduino/constants#.D8.A7.D9.84.D8.AB.D8.A7.D8.A8.D8.AA true|true]]</code>، أو <code>[[Arduino/constants#.D8.A7.D9.84.D8.AB.D8.A7.D8.A8.D8.AA false|false]]</code> عبر حجز بايتٍ واحدٍ من الذاكرة فقط.
* النوع <code>[[Arduino/byte|byte]]</code>: يُخزِّن عددًا عديم الإشارة بحجم 8 بت؛ أي من القيمة 0 إلى القيمة 255.
* النوع <code>[[Arduino/char|char]]</code>: يحجز بايتًا واحدًا من الذاكرة ويخزِّن فيه قيمة محرف.
* النوع <code>[[Arduino/double|double]]</code>: يحجز أربعة بايتات (32 بت) من الذاكرة فقط في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega) أو ثمانية بايتات (64 بت) في اللوحات Due لتخزين عدد عشري فيها.
* النوع <code>[[Arduino/float|float]]</code>: يحجز أربعة بايتات (32 بت) من الذاكرة لتخزين عدد عشري فيها.
* النوع <code>[[Arduino/int|int]]</code>: يحجز حجمًا مقداره 16 بت (2 بايت) من الذاكرة في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega)  أو 32 بت (4 بايت) في لوحات أردوينو Due (والتي تعتمد على متحكمات SAMD) لتخزين عدد صحيح فيه.
* النوع <code>[[Arduino/long|long]]</code>: يحجز حجمًا كبيرًا من الذاكرة مقداره 4 بايت يستعمل لتخزين الأعداد الصحيحة التي تتسم بأنَّها طويلة.
* النوع <code>[[Arduino/short|short]]</code>: يحجز في جميع لوحات أردوينو (التي تعتمد على المتحكمات ATMega و ARM) حجمًا من الذاكرة مقداره 16 بت (2 بايت) لتخزين عدد قصير فيه.
* النوع <code>[[Arduino/string|string]]</code>: يمثِّل سلسلةً نصيةً مؤلفةً من عدة محارف مرتبطة مع بعضها بعضًا. تُستعمَل مصفوفة من المحارف لتخزين هذا النوع من البيانات واستدعائها والتعامل معها لاحقًا.
* النوع <code>[[Arduino/unsignedchar|unsigned char]]</code>: يحجز حجمًا من الذاكرة مقداره 1 بايت فقط.
* النوع <code>[[Arduino/unsignedint|unsigned int]]</code>: يحجز حجمًا من الذاكرة مقداره 2 بايت في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega أو 4 بايت في لوحات أردوينو Due لتخزين عدد صحيح عديم الإشارة فيها.
* النوع <code>[[Arduino/unsignedlong|unsigned long]]</code>: يحجز حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد الصحيحة عديمة الإشارة التي تتسم بأنَّها طويلة.
* النوع <code>[[Arduino/word|word]]</code>: يُخزِّن أعدادًا عديم الإشارة بحجم 2 بايت.


== انظر أيضًا ==
==مصادر==
 
*[https://www.arduino.cc/reference/en/language/variables/data-types/array/ صفحة array في توثيق أردوينو الرسمي.]
== مصادر ==
[[تصنيف: Arduino]]
* [https://www.arduino.cc/reference/en/language/variables/data-types/array/ صفحة array في توثيق أردوينو الرسمي.]
[[تصنيف: Arduino Data Type]]

المراجعة الحالية بتاريخ 14:56، 26 أكتوبر 2018

المصفوفة هي مجموعة من المتغيرات الموضوعة في وعاء واحد والتي يمكن الوصول إليها عبر رقم فهرس كلٍّ منها. يمكن أن تكون المصفوفات في لغة C، التي ترتكز عليها لغة أردونيو، معقدةً بعض الشيء ولكنَّ استعمال المصفوفات بأبسط شكل لها هو أمر سهل ويسير.

إنشاء مصفوفة

يوجد عدة طرائق لإنشاء مصفوفة منها:

int myInts[6];
int myPins[] = {2, 4, 8, 3, 6};
int mySensVals[6] = {2, 4, -8, 3, 2};
char message[6] = "hello";

يمكنك التصريح عن مصفوفة دون تهيئتها ووضع قيم فيها كما في المصفوفة myInts. ويمكن التصريح عن مصفوفة دون تحديد حجمها بوضوح مثل المصفوفة myInts؛ سيَعُدُّ المصرَّف في هذه الحالة العناصر ويعطي المصفوفة حجمًا مناسبًا.

على كل حال، يمكنك تهيئة مصفوفة وتحديد حجمها كما في حالة المصفوفة mySensVals. انتبه إلى أنَّه عند التصريح عن مصفوفة من المحارف، تحتاج إلى زيادة حجم المصفوفة عن الحجم المطلوب لتتسع إلى عنصرٍ إضافيٍّ واحدٍ فقط هو المحرف العدمي (null) الذي يتوضع في نهاية المحارف؛ انظر مثلًا إلى حجم المصفوفة message في المثال السابق وعدد المحارف المخزَّنة فيها.

الوصول إلى المصفوفة

تبدأ فهرسة العناصر في المصفوفة من القيمة 0؛ أي فهرس العنصر 2 في المصفوفة mySensVals -في المثال السابق- هو 0، وفهرس العنصر 4 (العنصر الثاني) هو 1 وهلم جرًّا. هذا يعني أيضًا أنَّ فهرس العنصر الأخير لمصفوفة مكوَّنة من 10 عناصر هو 9 وليس 10! إليك هذا المثال:

int myArray[10]={9,3,2,4,3,2,7,8,9,11};
     // يحوي القيمة 11 myArray[9] العنصر
     // فهو يفع خارج المصفوفة وقد myArray[10] أمَّا العنصر
     // يعيد قيمة عشوائية من الذاكرة

لهذا السبب، يجب عليك أن تكون حذرًا من الوقوع في هذا الخطأ عند الوصول إلى أي عنصر من عناصر مصفوفة. الوصول إلى عنصر يقع بعد العنصر الأخير (الذي فهرسه أكبر من حجم المصفوفة مصروحًا منه القيمة 1)، أو خارج المصفوفة بشكل عام، يؤدي إلى القراءة من جزء من الذاكرة خُصِّص لأغراض أخرى. قراءة هذا الجزء لا يعيد قيمًا أو بيانات صالحة. على النقيض، الكتابة على جزء من الذاكرة خارج الجزء المحجوز للمصفوفة، عند إسناد قيمة إلى أحد عناصرها، هو أمر سيء وأكثر خطورة من قراءة هذا الجزء، إذ قد يؤدي إلى نتائج كارثية وغير متوقعة مثل تحطم البرنامج وتوقفه عن العمل. هذا الخطأ قد يكون من الأخطاء التي يصعب تتبعها وتنقيحها.

لا يتحقَّق مصرِّف لغة C من عمليات الوصول إلى المصفوفات المعرَّفة في البرنامج وإن كانت إحدى عمليات الوصول تتجاوز حدود إحداها خلافًا للغة BASIC أو JAVA لتي تتحقق من هذا الأمر.

إسناد قيمة إلى أحد عناصر مصفوفة

يمكن اسناد أي قيمة إلى أحد عناصر المصفوفة باستعمال معامل الإسناد = وفهرس العنصر المراد إسناد القيمة إليه بالشكل التالي:

mySensVals[0] = 10;

جلب قيمة من مصفوفة

يمكن جلب قيمة أي عنصر من عناصر مصفوفة بمعرفة فهرس هذا العنصر كما يلي:

x = mySensVals[4];

المصفوفات وحلقات التكرار

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

int i;
for (i = 0; i < 5; i = i + 1) {
  Serial.println(myPins[i]);
}

أمثلة

إن أردت مثالًا كاملًا يوضَّح فيه استعمال المصفوفات بالتفصيل الممل، اطلع على هذا المثال.

انظر أيضًا

  • النوع bool: يخزِّن المتغير الذي يصرَّح عنه بأنَّه من النوع bool إحدى القيمتين المنطقيَّتين التاليتين: true، أو false عبر حجز بايتٍ واحدٍ من الذاكرة فقط.
  • النوع byte: يُخزِّن عددًا عديم الإشارة بحجم 8 بت؛ أي من القيمة 0 إلى القيمة 255.
  • النوع char: يحجز بايتًا واحدًا من الذاكرة ويخزِّن فيه قيمة محرف.
  • النوع double: يحجز أربعة بايتات (32 بت) من الذاكرة فقط في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega) أو ثمانية بايتات (64 بت) في اللوحات Due لتخزين عدد عشري فيها.
  • النوع float: يحجز أربعة بايتات (32 بت) من الذاكرة لتخزين عدد عشري فيها.
  • النوع int: يحجز حجمًا مقداره 16 بت (2 بايت) من الذاكرة في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega) أو 32 بت (4 بايت) في لوحات أردوينو Due (والتي تعتمد على متحكمات SAMD) لتخزين عدد صحيح فيه.
  • النوع long: يحجز حجمًا كبيرًا من الذاكرة مقداره 4 بايت يستعمل لتخزين الأعداد الصحيحة التي تتسم بأنَّها طويلة.
  • النوع short: يحجز في جميع لوحات أردوينو (التي تعتمد على المتحكمات ATMega و ARM) حجمًا من الذاكرة مقداره 16 بت (2 بايت) لتخزين عدد قصير فيه.
  • النوع string: يمثِّل سلسلةً نصيةً مؤلفةً من عدة محارف مرتبطة مع بعضها بعضًا. تُستعمَل مصفوفة من المحارف لتخزين هذا النوع من البيانات واستدعائها والتعامل معها لاحقًا.
  • النوع unsigned char: يحجز حجمًا من الذاكرة مقداره 1 بايت فقط.
  • النوع unsigned int: يحجز حجمًا من الذاكرة مقداره 2 بايت في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega أو 4 بايت في لوحات أردوينو Due لتخزين عدد صحيح عديم الإشارة فيها.
  • النوع unsigned long: يحجز حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد الصحيحة عديمة الإشارة التي تتسم بأنَّها طويلة.
  • النوع word: يُخزِّن أعدادًا عديم الإشارة بحجم 2 بايت.

مصادر