آرایههای چند بعدی در آردوینو، آرایههای دو بعدی (دارای دو اندیس) شامل اطلاعاتی از یک جدول در ساختار سطر و ستونی است. در ادامه این نوع آرایهها که کاربرد بسیار زیادی در بحثهای حرفهای دارند را برسی میکنیم.
موارد زیر جرء مهمترین مشخصات آرایههای دو بعدی است:
- برای مشخص کردن اعضای یک آرایه دو بعدی باید دو اندیس وارد شود.
- طبق قرارداد، اولین اندیس نشان دهنده سطر و اندیس دوم نشان دهنده ستون عضو مورد نظر است.
- آرایههایی که نیاز به دو اندیس برای تعیین اعضای خود دارند به نام آرایه دو بعدی یا 2-D شناخته میشوند.
- آرایههایی با دو یا تعداد ابعاد بیشتر به نام آرایههای چند بعدی نیز شناخته میشوند و میتوانند تعداد ابعاد بیشتری از 2 نیز داشته باشند.
شکل زیر آرایه دو بعدی a را نشان میدهد. این آرایه دارای سه سطر و چهار ستون است، در واقع یک آرایه 3 در 4 است. به طور کلی یک آرایه با m سطر و n ستون را یک آرایه m در n مینامند.
هریک از اعضای آرایه a به شکل [a[i][j شناخته میشود که a نام آرایه و i و j اندیسهای عضو مورد نظر هستند. توجه شود که همه اعضای سطر اول با اندیس 0 شروع میشوند یا همه اعضای ستون سوم دارای اندیس 2 هستند.
یک آرایه دو بعدی را میتوان مانند آرایههای یک بعدی مقدار دهی اولیه کرد. به عنوان مثال، آرایه دو بعدی b با مقدارهای 1 و 2 در سطر 0 و مقدارهای 3 و 4 در سطر 1 مانند زیر اعلان و مقداردهی اولیه می شود:
int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } };
این مقادیر مشابه آرایههای یک بعدی درون آکولاد نوشته میشوند با این تفاوت که هر سطر نیز درون آکولاد نوشته شده و بین سطرها از , استفاده میشود. مقادیر 1 و 2 به ترتیب به شکل [b[0][0 و [b[0][1 تعیین شده و مقادیر 3 و 4 به ترتیب به شکل [b[1][0 و [b[1][1 درون آرایه تعیین میشوند. اگر بقیه اعضای یک سطر مقداردهی نشوند به صورت پیشفرض درون آنها مقدار صفر ریخته میشود.
int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } };
مثال آرایههای چند بعدی
در این مثال مقداردهی اولیه به یک آرایه دو بعدی نشان داده میشود.
- سطرهای a تا c سه آرایه هریک با دو سطر و سه ستون تعریف میشوند.
- آرایه 1 (a)، بخش اول لیست مقداردهی مربوط به سطر اول است که به ترتیب مقادیر 1 ، 2 و 3.
درون اعضای سطر اول ریخته میشود. لیست دوم برای مقداردهی به اعضای سطر دوم است که به ترتیب مقادیر 4 ، 5 و 6 را درون اعضای این سطر قرار میدهد.
- قرار دادن آکولاد برای جداسازی هر سطر اختیاری است.
- مقدار دهی اولیه آرایه 2 (خط b) با 5 مقدار انجام میشود.
- اعضایی که مقداردهی نمیشوند درون آنها صفر ریخته میشود. در اینجا [array2[1][2 صفر میباشد.
- اعلان array3 (خط c) دارای سه مقداردهی اولیه در دو لیست است.
- اولین لیست از مقادیر اولیه مقادیر سطر اول را به ترتیب 1 و 2 قرار میدهد. عضو سوم نیز صفر در نظر گرفته میشود.
- لیست مقداردهی برای سطر دوم اولین عضو را 4 و اعضای دیگر را به صورت پیشفرض صفر قرار میدهد.
- برنامه تابع printArray را برای چاپ مقادیر اعضای آرایه فراخوانی میکند. توجه شود که اعلان تابع (خط k) پارامتر [const int a[][columns را تعیین میکند.
- زمانی که یک تابع یک آرایه یک بعدی را به عنوان آرگومان ورودی دریافت میکند، درون براکتهای آرایه چیزی نمینویسیم.
- در مورد آرایههای چند بعدی نوشتن بعد اول که تعداد سطرها را تعیین میکند الزامی نیست اما نوشتن ابعاد بعدی لازم است. کامپایلر از این ابعاد برای تعیین حافظه مورد نیاز برای تخصیص دهی به آرایه استفاده میکند.
- همه اعضای آرایه صرف نظر از تعداد ابعاد آرایه در حافظه به صورت پشت سر هم ذخیره سازی میشوند. به عنوان مثال در یک آرایه دو بعدی سرط اول و دوم به صورت پشت سرهم ذخیره سازی میشوند.
مثال :
void printArray ( const int [][ 3 ] ); // prototype const int rows = 2; const int columns = 3; int array1[ rows ][ columns ] = { { 1, 2, 3 }, { 4, 5, 6 } }; int array2[ rows ][ columns ] = { 1, 2, 3, 4, 5 }; int array3[ rows ][ columns ] = { { 1, 2 }, { 4 } }; void setup () { } void loop () { Serial.print ("Values in array1 by row are: ") ; Serial.print (“\r” ) ; printArray(array1) ; Serial.print ("Values in array2 by row are: ") ; Serial.print (“\r” ) ; printArray(array2) ; Serial.print ("Values in array3 by row are: ") ; Serial.print (“\r” ) ; printArray(array3) ; } // output array with two rows and three columns void printArray( const int a[][ columns ] ) { // loop through array's rows for ( int i = 0; i < rows; ++i ) { // loop through columns of current row for ( int j = 0; j < columns; ++j ) Serial.print (a[ i ][ j ] ); Serial.print (“\r” ) ; // start new line of output } // end outer for } // end function printArray
نتایج :
Values in array1 by row are: 1 2 3 4 5 6 Values in array2 by row are: 1 2 3 4 5 0 Values in array3 by row are: 1 2 0 4 0 0
نکته : هر سطر به عنوان یک آرایه یک بعدی در نظر گرفته میشود. به منظور تعیین مکان قرارگیری یک عضو، تابع باید بداند که تعداد اعضای هر سطر چقدر است تا هنگام دسترسی به اعضای آرایه بتواند مکان قرارگیری اعضا را تشخیص دهد. بنابراین زمانی که میخواهد به عضو a[1][2] دسترسی پیدا کند، تابع میداند که باید در سطر اول از سه عضو عبور کند تا به سطر دوم برسد و سپس به عضو دوم از این آرایه دسترسی پیدا کند. بسیاری از تغییرات بر روی آرایهها توسط دستور حلقه FOR انجام میشود.
for ( int column = 0; column < 4; ++column ) a[ 2 ][ column ] = 0;
در حلقه FOR فقط اندیس دوم تغییر داده میشود (اندیس مربوط به ستون). این حلقه FOR مقداردهی اعضا را به شکل زیر انجام میدهد:
a[ 2 ][ 0 ] = 0; a[ 2 ][ 1 ] = 0; a[ 2 ][ 2 ] = 0; a[ 2 ][ 3 ] = 0;
حلقه FOR تو در تو زیر همه اعضای آرایه a را مقداردهی میکند.
total = 0; for ( int row = 0; row < 3; ++row ) for ( int column = 0; column < 4; ++column ) total += a[ row ][ column ];
حلقه FOR همه اعضای یک سطر را با هم جمع میکند. برای این منظور حلقه FOR خارجی با تعیین سطر اول شروع میشود. در نتیجه در حلقه FOR داخلی همه اعضای سطر اول با یکدیگر جمع میشوند.
در مرحله بعدی حلقه FOR خارجی سطر را یک واحد افزایش میدهد و سپس اعضای سطر دوم توسط حلقه FOR داخلی با یکدیگر جمع میشوند و این مرحله برای سطر سوم نیز انجام میشود. زمانی که از حلقههای FOR تو در تو خارج شدیم، متغیر total شامل مجموع اعضای همه سطرها میباشد.
این جلسه هم به پایان رسید، امیدوارم این نوشته برایتان مفید باشد.
منبع: میکرودیزاینرالکترونیک