سلام
من دارم یه برنامه نسبتا ساده رو از ++C به vb6 تبدیل می کنم ولی بعضی جاهاش گیر کردم...
کد:
char *m_ReadBuffer, *m_WriteBuffer;
m_ReadBuffer = (char *)malloc(SIZE * SIZE);
m_WriteBuffer = (char *)malloc(SIZE * SIZE);
...
#define SETBUFFER(buf,x,y,value) (buf[((y) * WATER_SIZE) + (x)] = value)
#define READBUFFER(buf,x,y) (buf[((y) * WATER_SIZE) + (x)])
توی کد بالا اول 2 تا pointer تعریف کرده ولی setbuffer و readbuffer چیه ؟ تابع یا ... ؟
معنی این چیه؟ m_Display.Invalidate . میشه گفت refresh کردن صفحه نمایش یا picturebox ؟
در ضمن در حالت دیباگ توی ++VC چطور میشه مقدار موجود در یک pointer رو دید ؟ همش هگز خود اشاره گر رو نشون میده.
خیلی ممنون
نقل قول: توی کد بالا اول 2 تا pointer تعریف کرده ولی setbuffer و readbuffer چیه ؟ تابع یا ... ؟
اونها ماکرو هستند که تعریف کرده . ماکروها تابع نیستند بلکه یه قسمت کد هستند که بشکل تابع نوشته میشن . ماکروپروسسور ( قسمتی از برنامه کامپایلر) قبل از کامپایل شدن برنامه ، مقدار اونها رو با کد اصلی جانشین میکنه . مثلا اگر در قسمتی از برنامه بنویسیم :
کد:
SETBUFFER(buf,2,3,5);
این کد با مقدار زیر جانشین میشه ( در واقع انگار کد زیر رو نوشتیم ) :
کد:
(buf[((3) * WATER_SIZE) + (2)] = 5)
نقل قول: معنی این چیه؟ m_Display.Invalidate . میشه گفت refresh کردن صفحه نمایش یا picturebox ؟
این همون مثل متد refresh هست در وی بی 6 . کارش اینه که باعث میشه ویندوز به برنامه یک پیغام WM_PAINT بفرسته و باعث بشه که picturebox دوباره خودش رو ترسیم کنه ( معمولا تغییراتی که تو حافظه انجام دادیم رو حالا ترسیم کنیم )
نقل قول: در حالت دیباگ توی ++VC چطور میشه مقدار موجود در یک pointer رو دید ؟
توی variable Window میتونی این رو ببینی . روی قسمت خالی ToolBar کلیک راست بکن و بعد این گزینه رو انتخاب کن تا پنجره اش باز بشه .
ببخشید این قضیه ماکرو ها رو درست نفهمیدم. مثلا اگر SIZE=256 ، x=5 , y=3 باشه اونوقت با توجه به :
کد:
#define SETBUFFER(buf,x,y,value) (buf[((y) * WATER_SIZE) + (x)] = value)
#define READBUFFER(buf,x,y) (buf[((y) * WATER_SIZE) + (x)])
اگر داشته باشیم :
کد:
SETBUFFER (m_WriteBuffer,i,j,value)
و
READBUFFER(m_ReadBuffer,x,y)
اونوقت در setbuffer و readbuffer چه اتفاقی میوفته ؟
ممنون
هر زمان ، در هر جایی از کد برنامه ، اگر شما کد زیر رو بنویسید :
کد:
SETBUFFER (m_WriteBuffer,i,j,value)
دقیقا مثل این میمونه که نوشته باشی ( در واقع خط زیر جایگزین کد بالا میشه قبل از کامپایل )
کد:
m_WriteBuffer[((j) * 256) + (i)] = value
و همینطور :
کد:
READBUFFER(m_ReadBuffer,x,y)
جانشین میشه با :
کد:
m_ReadBuffer[((y) * 256) + (x)]
ماکرو ها کدهایی هستند که حالت کلی دارند و در قسمت های مختلف برنامه باید با پارامتر های مختلف نوشته بشن . بجای اینکه ما هر بار این قسمت از کد رو در برنامه تکرار کنیم ، یک ماکرو مینویسیم و هر جا که بخواییم اون ماکرو رو با پارامتر های دلخواهمون مینویسم میزنیم . قبل از کامپایل این ماکرو ها به کداصلی خودشون تبدیل میشن ( جانشین میشن ) و بعد برنامه کامپایل میشه .
شرمنده اینقدر سوال میکنم...تازه کارم دیگه
این علامت >> و << چه عملی انجام میدن ؟ مثلا :
کد:
#define RGB32(r,g,b) ((r << 16) + (g << 8) + b)
و یه خواهش دیگه، میشه ای سورس رو یه نگاه بندازید ؟ مشکل اصلی من اینه که میخوام طول و عرض تصویرم متفاوت باشه ولی توی این سورس تصویر مربع فرض شده؛ برای همین برای من یه کم پیچیدس...
download
خیلی ممنون
نقل قول: این علامت >> و << چه عملی انجام میدن ؟
اینها در اینجا شیف های بیتی هستند . شیفت به سمت چپ ( اگر اعداد رو در مبنای 2 فرض کنیم شیفت به سمت چپ باعث اضافه کردن 0 به بیت های سمت راست میشه و بیت های قبلی به سمت چپ منتقل میشن )
در واقع اینجا این ماکرو کاری نمیکنه جز اینکه یه مقدار رنگی RGB رو از مقادیر قرمز ، آبی و سبز بشکل 32 بیتی میسازه . ما عملگر شیف بیتی در وی بی نداریم ولی توی وی بی تابع RGB داریم که اینکار رو برات انجام میده .
http://msdn.microsoft.com/en-us/library/...S.80).aspx
تبدیل برنامه های MFC به VB تا حدودی مشکله . کلا چون سیستم برنامه نویسی این دوتا با هم فرق میکنه ! شما توی خط زیر باید بتونی سایز رو تغییر بدی :
کد:
CRect bounds(0,0,WATER_SIZE - 1,WATER_SIZE - 1);