الشبكة العربية لمطوري الألعاب

خبير  Mohammad Khashashneh مشاركة 11

Hello again and thank you for your replies.
First of all I would like to rule out some misunderstanding (if any).

As you all know, that if I dynamically allocated a memory of bytes like this:
char * buffer = malloc (BUFFER_SIZE) ;
then defined a pointer P to characters like this:
char * P ;
and after that I made the pointer point to the buffer:
P = buffer ;
then I can access any location in that buffer using the array indexing like this:
p [ i ] = 5 ;

And as Wisam said, This also allows the following easy form to access a 2D buffer (frame buffer) like this:

p [ x + y * BUFF_WIDTH ] = 5 ;
Both methods allows me to access a dynamically allocated buffer in a “1D” array manner. and in both methods, you should always check your index not to overflow the original buffer size ( after all, this is the source of 50% of the bugs)

BUT I don't want that! I want to use it like this:

P [ x ] [ y ] = 5 ;

so instead of defining a pointer to a character, I defined a “pointer to an array” with a fixed size equals to the width of the buffer like this:

char (*pArray) [BUFF_WIDTH] ;

then assigned the pointer the previously allocated buffer:

pArray = buffer ; /*produces a warning*/

that allows me to access a dynamically allocated buffer in a “2D” array manner. AND yous should also check your array indexes to prevent buffer overrun bugs.

التعليق على مشاركة أحمد عبد الغني في July 23, 2006 21:49 :

> وأضيف أنه لا يمكنك أن تحول من الـ static إلى dynamic.
> وحتى
> إن أجبرت المترجم على ذلك فانت تخرب الذاكرة
> وهذا ما
> عنيته بردي الأول...
>

التعليق على مشاركة أحمد عبد الغني في July 23, 2006 21:49 :
> وأضيف أنه لا يمكنك أن تحول من الـ static إلى dynamic.
> وحتى
> إن أجبرت المترجم على ذلك فانت تخرب الذاكرة
> وهذا ما
> عنيته بردي الأول...
>

التعليق على مشاركة وسام البهنسي في July 22, 2006 6:54 :

> أن رد أحمد عبد الغني يوضح تماماً الموقف. أنت لا تتعامل
> مع مصفوفة ثنائية البعد محجوزة بشكل خطي. أنت تتعامل
> مع مصفوفة مؤشرات إلى مصفوفات خطية. مما قد يعني أن كل
> من هذه المؤشرات قد يؤشر إلى منطقة مختلفة في الذاكرة.
> لاحظ أنك تستخدم نفس البنية اللغوية في التعامل مع الـ
> Jagged Arrays مما يؤكد وجهة نظري.
>
> الحالة الوحيدة التي
> قد تعمل (وأشك في ذلك كثييييراً) هو أن تعلن عن المصفوفة
> كنوع مكون من أبعاد ثابتة، ثم تقوم بتغيير عنوان المتغير
> الأساسي إلى مصفوفة ديناميكية خطية تتسع لنفس العدد من
> العناصر. لاحظ أن هذا يلغي فائدة التكنيك كلها لأنك مربوط
> بأبعاد مسبقة التحديد (ليست ديناميكية)...
>



Actually yes. I am defining a pointer to an array with a previously defined size (BUFF_WIDTH). So that means “pArray [ 0 ][ 0 ]” points to the first byte in the buffer ; but “pArray [ 1 ][ 0 ]” points to the first byte after “BUFF_WIDTH” bytes, because the pointer is a pointer to an array of “BUFF_WIDTH” bytes and not single bytes. So no memory corruption is occurring here.


As Abdo explained, Dynamically 2D arrays can be accessed using pointers to pointers “**p”. and this is also called array of pointers, where each index points to a different location in the memory. This can be defined also like this:
char *pArrays [ NUM_OF_POINTERS ] ;

But what I wanted to establish is to access a 1D array using a 2D array fashion. So I needed a “Pointer to array” and not an “array of pointers”. The 2 are completely different in concept.


Mohammad

من سار على الدرب وصل, من جد وجد...
بس عتبك على اللي بيسمع

خبير  سعيد بسيوني مشاركة 12

كلام جميل. بس إيه الفايدة لو كنت بتستعمل بعد ثابت؟
يعني الفايدة محدودة من غير ان يكون البعدين ديناميكيين...

خبير  Mohammad Khashashneh مشاركة 13

This is not a replacement for 2D dynamic arrays, this is simply a good way to manipulate linear buffers in non linear ways, and to remove the overhead of calculating the next index in each Iteration of the loop. and believe me this is easier when you implement some algorithm that deals with more than one plane of data encapsulated in the same buffer.

Maybe the only draw back is speed as Wisam previously mentioned but I'm digging in it right now and will come back to you when I find more.

Thanks again.

من سار على الدرب وصل, من جد وجد...
بس عتبك على اللي بيسمع

محترف مشرف عبد اللطيف حاجي علي مشاركة 14

التعليق على مشاركة Mohammad Khashashneh في July 24, 2006 17:45 :
>
> Maybe the only draw back is speed
> as Wisam previously mentioned but I'm digging in it
> right now and will come back to you when I find more.
Let's agree on something here: The way you mentioned uses internally the "Rectangular Array" machanism (In other words the machanism that Wessam metioned previously)... So it's already as fast as it can be (You can check the assembly)

عبد اللطيف حاجي علي
مبرمج
In|Framez