آرایه های چند بعدی در آردوینو، آرایه های دو بعدی (دارای دو اندیس) شامل اطلاعاتی از یک جدول در ساختار سطر و ستونی است.در ادامه در میکرو دیزاینر الکترونیک این نوع آرایه ها که کاربرد بسیار زیادی در بحث های حرفه ای دارند را برسی میکنیم.
موارد زیر جرء مهم ترین مشخصات آرایه های دو بعدی است :
- برای مشخص کردن اعضای یک آرایه دو بعدی باید دو اندیس وارد شود.
- طبق قرارداد، اولین اندیس نشان دهنده سطر و اندیس دوم نشان دهنده ستون عضو مورد نظر است..
- آرایه هایی که نیاز به دو اندیس برای تعیین اعضای خود دارند به نام آرایه دو بعدی یا 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 شامل مجموع اعضای همه سطرها می باشد.
این جلسه هم به پایان رسید ، جلسات بعدی را در قسمت آردوینو حتما اینجا بخوانید و اگر نوشته ها مشکلی داشتن اطلاع بدید در قسمت نظرات و همچنین نظرات خودتان را برای جلسات بعدی که میخواهیم بنویسیم را اعلام کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.