PDA

View Full Version : آرایه ها و pointer



1485159
جمعه 21 آبان 1389, 10:01 صبح
سلام
برای آخرین پارامتر تابع gluBuild2DMipmaps که یکی از توابع opengl هست باید یک pointer به کار ببریم!
وقتی من یه آرایه پویا رو به صورت زیر بهش میدم درست کار میکنه:
@array
ولی وقتی از یه آرایه داینامیک استفاده میکنم:
array
or
@array
درست کار نمیکنه!
مشکلش چیه؟
ممنون

tdkhakpur
جمعه 21 آبان 1389, 11:36 صبح
آرایه داینامیک خودش محل حافظه رو نشان میده و شما با این کار مکان حافظه رو از محتوانی این مکان میگیرید یعنی میشه اشاره گر به اشاره گر. به همین دلیل برای داینامیک از @ استفاده نکنید.

1485159
جمعه 21 آبان 1389, 11:47 صبح
به همین دلیل برای داینامیک از @ استفاده نکنید.
اگه پست اول رو خوب بخونید میبینید که نوشتم بازم نمیشه!

tdkhakpur
جمعه 21 آبان 1389, 16:03 عصر
اگه پست اول رو خوب بخونید میبینید که نوشتم بازم نمیشه!
حتما پارامترهای اشتباهی رو استفاده میکنید .
کدتان را ارسال کنید.

vcldeveloper
جمعه 21 آبان 1389, 20:39 عصر
وقتی من یه آرایه پویا رو به صورت زیر بهش میدم درست کار میکنه:
@array
ولی وقتی از یه آرایه داینامیک استفاده میکنم:
array
or
@array
درست کار نمیکنه!
مشکلش چیه؟
آرایه پویا که همون آرایه دینامیک هست، یعنی چی که با آرایه پویا کار میکنه، ولی با آرایه دینامیک کار نمیکنه؟!
باید می گفتید با آرایه استاتیک کار میکنه، ولی با آرایه دینامیک کار نمیکنه.

همانطور که در پست شماره 2 هم برای شما توضیح داده شد، آرایه دینامیک (پویا) خودش یک pointer هست. شما اگر میخواید آدرس آرایه رو بدید، باید آدرس خونه صفر آرایه دینامیک مربوطه رو بدید:


@MyArray[0]

1485159
شنبه 22 آبان 1389, 05:38 صبح
خانه صفر یک آرایه 2 بعدی کدوم یکی میشه؟

Felony
شنبه 22 آبان 1389, 06:19 صبح
خانه صفر یک آرایه 2 بعدی کدوم یکی میشه؟


@MyArray[0, 0];

1485159
شنبه 22 آبان 1389, 18:40 عصر
مشکل من بازم حل نشد!
فرض کنید میخوام به تابع آرایه ای بدم که برای هر مختصات x و y مقدار های rgba رو ذخیره کنه. بطوری که طول و عرض 16 باشن. باید آرایه داینامیک رو به صورت زیر طولش رو تعریف کنم:

SetLength(a, 16, 16, 4);
و بعد به صورت:

@a
یا
a
یا
@a[0]
یا
@a[0][0]
یا
@a[0][0][0]
تحویل تابع بدم. که در هیچ کدوم درست کار نمیکنه! ولی وقتی که آرایه رو به صورت استاتیک میدم قبول میکنه!
مشکل چیه؟

vcldeveloper
شنبه 22 آبان 1389, 20:46 عصر
تعریف اون تابع رو اینجا قرار بدید.

Mahmood_M
شنبه 22 آبان 1389, 20:58 عصر
فرض کنید میخوام به تابع آرایه ای بدم که برای هر مختصات x و y مقدار های rgba رو ذخیره کنه. بطوری که طول و عرض 16 باشن. باید آرایه داینامیک رو به صورت زیر طولش رو تعریف کنم:
اینکه اندازه هاش ثابت هست ! ، چرا به صورت دینامیک تعریف میکنی ؟ ، اینطوری نمیشه ؟ :

MyArray : array[0..3] of array[0..15] of array[0..15] of Integer;


برای آخرین پارامتر تابع gluBuild2DMipmaps که یکی از توابع opengl هست باید یک pointer به کار ببریم!
اما پارامتر آخر این تابع اشاره گری به یکی از انواع زیر می تونه باشه

GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, GL_FLOAT
یا در نهایت معادل این مقادیر در دلفی ، نه یک آرایه ...
باید اول فایل Texture رو باز کنی و اطلاعاتش رو درون یک Pointer قرار بدی ، بعد Pointer رو به پارامتر آخر تابع gluBuild2DMipmaps اختصاص بدی :
var
Data : ^BYTE;
const
Width = 16;
Height = 16;
RGBA = 4;
begin
Data := AllocMem(Width*Height*RGBA);
...
gluBuild2DMipmaps( x, x, x, x, x, x, DATA);
end;
اول یک متغیر با نام Data که اشاره گری به نوع داده ی BYTE هست ساختیم ، عرض و طول و اطلاعات دیگه مشخص هست ، با تابع AllocMem یک فضا با اندازه ی مورد نیاز که مشخص شده برای Data در نظر میگیریم ، بعد از خوندن فایل Texture و ریختن اطلاعات توی Data ، اون رو به تابع gluBuild2DMipmaps می فرستیم ...

اینکه کجای فایل رو باید بخونی ، یعنی اطلاعات کجای فایل هست ، بستگی به فایلت داره که از چه نوعی هست ...

موفق باشی ...

1485159
یک شنبه 23 آبان 1389, 05:57 صبح
تعریف اون تابع رو اینجا قرار بدید.
تعریفش رو که ندارم... آخه یکی از توابع opengl هست!

اینکه اندازه هاش ثابت هست !
خیر ثابت نیست!

چرا به صورت دینامیک تعریف میکنی ؟ ، اینطوری نمیشه ؟ :
نه! اینطوری میشه:

MyArray : array[0..15] of array[0..15] of array[0..3] of glfloat;

یا در نهایت معادل این مقادیر در دلفی ، نه یک آرایه ...
باید یک آرایه باشه! چون اولا یک عکس که میخوایم ازش به عنوان تکسجر استفاده کنیم بیش از یک پیگسل هست!! درضمن پس چرا وقتی استاتیک هست مشکلی نیست؟

باید اول فایل Texture رو باز کنی و اطلاعاتش رو درون یک Pointer قرار بدی ، بعد Pointer رو به پارامتر آخر تابع gluBuild2DMipmaps اختصاص بدی :

بعد از خوندن فایل Texture و ریختن اطلاعات توی Data ، اون رو به تابع gluBuild2DMipmaps می فرستیم ...

اینکه کجای فایل رو باید بخونی ، یعنی اطلاعات کجای فایل هست ، بستگی به فایلت داره که از چه نوعی هست ...
اگه شما برای یک فایل png مثال بزنی حله!

Mahmood_M
یک شنبه 23 آبان 1389, 14:27 عصر
باید یک آرایه باشه! چون اولا یک عکس که میخوایم ازش به عنوان تکسجر استفاده کنیم بیش از یک پیگسل هست!! درضمن پس چرا وقتی استاتیک هست مشکلی نیست؟
باید اشاره گری به فایل Texture باشه ! ، چند نمونه به زبان ++C اینجا (http://en.wikibooks.org/wiki/OpenGL_Programming/Intermediate/Textures) هست ، اولیش فکر کنم کارت رو راه بندازه ، معادل دلفیش میشه چیزی شبیه به این :
function LoadPNGTexture(FileName : String; PNGWidth, PNGHeight : Integer) : Integer;
var
Texture : GLuint;
Data : ^GLubyte;
PNGFile : Cardinal;
begin
PNGFile := FileOpen(FileName, fmOpenRead);
Data := AllocMem(PNGWidth*PNGHeight*4);
try
FileRead(PNGFile, Data, 1);
finally
FileClose(PNGFile);
end;
...
FreeMem(Data);
end;
توابع OpenGL دیگه معادل نداره و همه جا یکسان هست ، واسه همین ننوشتمشون ...
برای استفاده راحت تر از OpenGL توی دلفی میتونی از مجموعه ی GLScene استفاده کنی ، ولی توصیه میکنم به سراغ زبان ++C بری و با اون کار کنی ، ابزارهای زیادی هم برای کار با تصاویر PNG توی OpenGL ( برای ++C ) وجود داره که OpenSource هم هستند ، مثل Devil یا LibPNG که توی همون لینکی که گذاشتم هم در موردش مثال و توضیحات هست ...

نکته ی دیگه اینکه اگر در مورد توابع OpenGL سئوال داشتی در قسمت ساخت بازیهای کامپیوتری مطرح کن ، OpenGL ربطی به دلفی نداره ، اونجا جواب بهتر و کاملتری می گیری ...

موفق باشی ...

1485159
یک شنبه 23 آبان 1389, 15:05 عصر
باید اشاره گری به فایل Texture باشه ! ، چند نمونه به زبان ++C اینجا (http://en.wikibooks.org/wiki/OpenGL_Programming/Intermediate/Textures) هست ، اولیش فکر کنم کارت رو راه بندازه ، معادل دلفیش میشه چیزی شبیه به این :
آخه مشکل من توابع opengl نیست که اون مثال ها کار منو راه بندازه!!! من میگم چرا وقتی از آرایه استاتیک استفاده میکنم مشکلی پیش نمیاد! ولی وقتی از آرایه داینامیک استفاده میکنم درست کار نمیکنه؟

Mahmood_M
یک شنبه 23 آبان 1389, 15:17 عصر
آخه مشکل من توابع opengl نیست که اون مثال ها کار منو راه بندازه!!! من میگم چرا وقتی از آرایه استاتیک استفاده میکنم مشکلی پیش نمیاد! ولی وقتی از آرایه داینامیک استفاده میکنم درست کار نمیکنه؟
یک مثال از آرایه ی دینامیک و یک مثال از آرایه ی استاتیک همراه با پیغام خطایی که کامپایلر میده و نحوه ی فرستادن اونها به تابع gluBuild2DMipmaps بزار تا بررسی بشه ...
ولی باز میگم که آرایه نباید باشه ، مثالها رو بررسی کن متوجه میشی ...

1485159
یک شنبه 23 آبان 1389, 16:08 عصر
پیغام خطایی که کامپایلر میده
خطا نمیده که! کامپایل میشه ولی تابع درست کار نمیکنه!
الان دارم میرم بعدا سورسشو میزارم.