خطوة من المصفوفة
تحتاج هذه المقالة إلى مصادر إضافية للتحقق . ( ديسمبر 2009 ) |
في برمجة الكمبيوتر ، تُعَد خطوة المصفوفة (يُشار إليها أيضًا باسم الزيادة أو الخطوة أو حجم الخطوة ) هي عدد المواقع في الذاكرة بين بدايات عناصر المصفوفة المتعاقبة ، والتي تُقاس بالبايتات أو بوحدات حجم عناصر المصفوفة. لا يمكن أن تكون الخطوة أصغر من حجم العنصر ولكن يمكن أن تكون أكبر، مما يشير إلى وجود مساحة إضافية بين العناصر.
تكون المصفوفة التي لها خطوة بنفس حجم حجم كل عنصر من عناصرها متجاورة في الذاكرة. يُقال أحيانًا أن مثل هذه المصفوفات لها خطوة وحدة . تكون مصفوفات الخطوة الوحدة أحيانًا أكثر كفاءة من مصفوفات الخطوة غير الوحدوية، ولكن يمكن أن تكون مصفوفات الخطوة غير الوحدوية أكثر كفاءة للمصفوفات ثنائية الأبعاد أو متعددة الأبعاد ، اعتمادًا على تأثيرات التخزين المؤقت وأنماط الوصول المستخدمة [ بحاجة لمصدر ] . يمكن أن يُعزى هذا إلى مبدأ المحلية ، وتحديدًا المحلية المكانية .
أسباب عدم اتخاذ الخطوة الوحدوية
قد يكون للمصفوفات خطوة أكبر من عرض عناصرها بالبايتات في حالتين على الأقل:
المصفوفات المتوازية المتداخلة
تسمح بعض اللغات بمعالجة مجموعات الهياكل كمصفوفات متوازية متداخلة بخطوة غير وحدوية:
#تضمين <stdio.h>
struct MyRecord { int value ؛ char * text ؛ };
/** اطبع محتويات مجموعة من الأعداد الصحيحة بالخطوة المحددة.
لاحظ أن size_t هو النوع الصحيح، حيث يمكن أن يتجاوز int الحد المسموح به. */
void print_some_ints ( const int * arr , int length , size_t stride ) { int i ; printf ( "Address \t\t Value \n " ); for ( i = 0 ; i < length ; ++ i ) { printf ( "%p \t %d \n " , arr , arr [ 0 ]); arr = ( int * )(( unsigned char * ) arr + stride ); } }
int main ( void ) { int ints [ 100 ] = {0} ؛ struct MyRecord records [ 100 ] = {0} ؛
print_some_ints ( & ints [ 0 ], 100 , sizeof ints [ 0 ]); print_some_ints ( & records [ 0 ]. value , 100 , sizeof records [ 0 ]); return 0 ; }
هذه العبارة هي شكل من أشكال التلاعب بالألفاظ .
مقطع عرضي للمصفوفة
تسمح بعض اللغات مثل PL/I أو Fortran بما يُعرف باسم المقطع العرضي للمصفوفة ، والذي يختار أعمدة أو صفوفًا معينة من مصفوفة أكبر. [1] : ص 262 على سبيل المثال، إذا تم إعلان مصفوفة ثنائية الأبعاد على أنها
أعلن some_array ( 12 ، 2 ) ثابتًا ؛
يمكن الإشارة إلى مجموعة ذات بعد واحد تتكون فقط من العمود الثاني على أنها
بعض_المصفوفة ( * , 2 )
مثال على مصفوفة متعددة الأبعاد بخطوة غير وحدوية
تعتبر الخطوة غير الوحدوية مفيدة بشكل خاص للصور. فهي تسمح بإنشاء صور فرعية دون نسخ بيانات البكسل. مثال Java:
public class GrayscaleImage { private final int width , height , widthStride ; /** بيانات البكسل. يتم اعتبار البكسل في صف واحد متجاورًا دائمًا في هذا المثال. */ private final byte [] pixels ; /** إزاحة البكسل الأول ضمن وحدات البكسل */ private final int offset ;
/** منشئ للبيانات المتجاورة */
public Image ( int width ، int height ، byte [] pixels ) { this . width = width ؛ this . height = height ؛ this . pixels = pixels ؛ this . offset = 0 ؛ this . widthStride = width ؛ }
/** منشئ القسم الفرعي */
public Image ( int width ، int height ، byte [] pixels ، int offset ، int widthStride ) { this . width = width ؛ this . height = height ؛ this . pixels = pixels ؛ this . offset = offset ؛ this . widthStride = widthStride ؛ }
/** يعيد منطقة فرعية من هذه الصورة كصورة جديدة. تشترك هذه الصورة والصورة الجديدة في
وحدات البكسل، لذا ستنعكس التغييرات التي تطرأ على الصورة المُرجعة في هذه الصورة. */
public Image crop ( int x1 , int y1 , int x2 , int y2 ) { return new Image ( x2 - x1 , y2 - y1 , pixels , offset + y1 * widthStride + x1 , widthStride ); }
/** إرجاع قيمة البكسل عند الإحداثيات المحددة */
public byte getPixelAt ( int x , int y ) { return pixels [ offset + y * widthStride + x ] ; } }
مراجع
- ^ هيوز، جوان ك (1979). البرمجة الهيكلية PL/I (الطبعة الثانية) . نيويورك: جون وايلي وأولاده. رقم ISBN 0-471-01908-9.
