ورود

View Full Version : سوال: تعریف آرایه ای با طول یک مگابایت



zahmatkesh8519
دوشنبه 29 خرداد 1391, 16:34 عصر
آرایه ای با طول حداکثر یک مگابایت چطور میشه تعریف کرد ؟ می شه کاری کرد بر اساس طولش( با کمک متغییری دیگه) این آرایه تغریف بشه ؟

از نوع wchar_t استفاده می کردم که تا 64 کیلو بایت می شه بهش مقدار داد حالا مشکلم اینه که یه دیتا که تا حداکثر یک مگ داده رو می گیره چطوری می شه تعریف کرد ( CString نشد!) .

mehdi.mousavi
دوشنبه 29 خرداد 1391, 16:46 عصر
آرایه ای با طول حداکثر یک مگابایت چطور میشه تعریف کرد ؟ می شه کاری کرد بر اساس طولش( با کمک متغییری دیگه) این آرایه تغریف بشه ؟ از نوع wchar_t استفاده می کردم که تا 64 کیلو بایت می شه بهش مقدار داد حالا مشکلم اینه که یه دیتا که تا حداکثر یک مگ داده رو می گیره چطوری می شه تعریف کرد ( CString نشد!) .

سلام.

int size = 1024 * 1024;

wchar_t *p = new wchar_t[size];
//You've got your 1MB array...
//You can now do whatever suits your needs.

//deallocate the memory...
delete[] p;


دقت کنید که حافظه از Heap گرفته میشه و در نهایت، delete رو حتما فراخوانی کنید که حافظه به سیستم برگرده.

موفق باشید.

zahmatkesh8519
دوشنبه 29 خرداد 1391, 17:02 عصر
سلام.

int size = 1024 * 1024;

wchar_t *p = new wchar_t[size];
//You've got your 1MB array...
//You can now do whatever suits your needs.

//deallocate the memory...
delete[] p;


دقت کنید که حافظه از Heap گرفته میشه و در نهایت، delete رو حتما فراخوانی کنید که حافظه به سیستم برگرده.

موفق باشید.

ای گفتی بد جوری این heap و تابع free آزارم می ده . چون برنامه حجمی حدود چند تا 20 مگ رو به صورت بازگشتی برگشت می ده .

از (free(NULL می شه استفاده کرد ؟توی تابع بازگشتی در قبل هر فراخونی بزارم خوبه ؟

mehdi.mousavi
دوشنبه 29 خرداد 1391, 17:06 عصر
ای گفتی بد جوری این heap و تابع free آزارم می ده . چون برنامه حجمی حدود چند تا 20 مگ رو به صورت بازگشتی برگشت می ده . از (free(NULL می شه استفاده کرد ؟توی تابع بازگشتی در قبل هر فراخونی بزارم خوبه ؟

متوجه منظورتون نشدم. اینجا در کدی که نوشته ام نباید از free استفاده کنید، بلکه باید از همون delete[] استفاده کنید. اگر کدتون رو اینجا قرار بدید، بهتر میتونم راهنمایی کنم.

موفق باشید.

zahmatkesh8519
دوشنبه 29 خرداد 1391, 17:30 عصر
الان مشکل هیپ دیگه نداره ،ممنون ولی کماکان مشکل نمایش رو داره :
CT2475029촀췍췍췍췍췍췍췍췍췍췍췍
متن بولد شده داده یک ولیو هست که کاراکتر ها "췍" همین طور تا یک مگ ادامه داره !!
چیزی که نمایش داده می شه داده DATA یک Value از رجیستری هست .
اگر Value از نوع REG_BINARY باشه مقداری تا یک مگابایت رو می تونه بگیره (البته برخی نوع های دیگه هم می تونه ولی معمولا باینری این طوریه ) حالا اون رو می خوام نمایش بدم .
البته مشکل تبدیل داده ای که دریافت می شه به BINARY هم دارم

این کد Delete[]*p زیر را خطا می داد برای همین از delete[]p استفاده کردم ، ایرادی نداره ؟
این * برای اشاره گرهاست ؟ چه سودی داره اگر باشه؟
با پاک کردن * خطا درست شد وبا بودنش متن خطا اینه :
'delete' : cannot delete objects that are not pointers

mehdi.mousavi
دوشنبه 29 خرداد 1391, 17:53 عصر
الان مشکل هیپ دیگه نداره ،ممنون ولی کماکان مشکل نمایش رو داره : CT2475029촀췍췍췍췍췍췍췍췍췍췍췍
متن بولد شده داده یک ولیو هست که کاراکتر ها "췍" همین طور تا یک مگ ادامه داره !! چیزی که نمایش داده می شه داده DATA یک Value از رجیستری هست . اگر Value از نوع REG_BINARY باشه مقداری تا یک مگابایت رو می تونه بگیره (البته برخی نوع های دیگه هم می تونه ولی معمولا باینری این طوریه ) حالا اون رو می خوام نمایش بدم . البته مشکل تبدیل داده ای که دریافت می شه به BINARY هم دارم این کد Delete[]*p زیر را خطا می داد برای همین از delete[]p استفاده کردم ، ایرادی نداره ؟ این * برای اشاره گرهاست ؟ چه سودی داره اگر باشه؟ با پاک کردن * خطا درست شد وبا بودنش متن خطا اینه : 'delete' : cannot delete objects that are not pointers

سلام.
بسیار خوب... قبل از هر چیزی یک نکته: من کجا گفتم بنویسید delete[] *p ؟ کدهامو مجددا نگاه کنید. هیچ جا من * نزدم! :) شما این * رو از کجا آوردید؟ طبیعی هستش که این کد Compile نمیشه و ... اما در مورد سوال اصلی، وقتی مقداری Binary رو از Registry میخونید، متود QueryBinaryValue (http://msdn.microsoft.com/en-US/library/y45ck6tw%28v=vs.80%29) به شما میزان بایت های خونده شده رو برمیگردونه و شما باید فقط به اندازه میزان تعیین شده از Buffer رو بخونید، چون بیش از اون غیر معتبر هستش. وقتی شما مقدار رو چاپ می کنید، عموم توابع تا وقتی به کاراکتر NULL نرسیده اند پیش میرن و در نتیجه، شما اون Character های نامعتبر رو مشاهده می کنید. بنابراین، حتما مطمئن بشید که pnBytes اول pValue رو می خونید و استفاده می کنید، در غیر اینصورت، ممکنه ایرادهای متعدد دیگه ای نیز پیش بیاد.

موفق باشید.

پاورقی: اگر بازهم متوجه مشکل نشدید، لطفا کدتون رو اینجا قرار بدید تا براتون درستش کنم.

zahmatkesh8519
دوشنبه 29 خرداد 1391, 18:08 عصر
:خجالت: * از کجا برداشته بودم!!
از این کمکی که کردی استفاده می کنم ، امیدوارم ان شلء الله درست بشه ، مشکلی بود حتما کدش رو اینجا می زارم .
امیدوارم بازم بتونم از راهنمایی هاتون استفاده کنم .:لبخندساده:

zahmatkesh8519
دوشنبه 29 خرداد 1391, 18:10 عصر
یه سوال دیگه ،چطور می تونم با داشتن هندل یک کلید در رجیستری ، آدرس اون کلید رو بدست آورد ؟
بدلیل فراخوانی بازگشتی تابع نمی شه به آدرس ابتدایی نام کلید رو اضافه کرد تا رسید به آدرس کلید .

zahmatkesh8519
سه شنبه 30 خرداد 1391, 14:14 عصر
موقع استفاده از تابع QueryBinaryValue خطایی رخ می ده ، می دونین مشکلش چیه ؟
کد استفاده شده :
if (type == REG_BINARY) //get Binary DAta Keys
{
CRegKey KeyObj ;
KeyObj.Open(hkeySrcRoot,SubKeyCString,KEY_READ );
DWORD DataSizeULong =0 ;
DataSizeULong =
KeyObj.QueryBinaryValue(ValueName,NULL,&DataSizeULong);
//std::vector<char> buf (DataSizeULong);
if ( DataSizeULong != ERROR_SUCCESS)
throw ;
if( ERROR_SUCCESS == KeyObj.QueryBinaryValue(ValueName , &ValueData[0] , &DataSizeULong) )
{
CString strRet;
char s;
for (int i = 0; i < (int) DataSizeULong; ++i)
{
CString str;
str.Format(L"%2.2x", ValueData[i]);
strRet += str;
}
AfxMessageBox(strRet);
//dwBytesWritten = DataSizeULong ;
//ErrorFlag_WriteFile = WriteFile( fh2,(LPCVOID)TextInFileHKEY_USERS ,dwBytesToWrite,&dwBytesWritten,NULL ) ;
}


}

خطای ظاهر شده در عکس قرار می دم ، به خطی از توابع خودش هم اشاره می کنه که در ادامه می بینید :

inline LONG CRegKey::QueryBinaryValue(
_In_opt_z_ LPCTSTR pszValueName,
_Out_opt_ void* pValue,
_Inout_opt_ ULONG* pnBytes) throw()
{
LONG lRes;
DWORD dwType;

ATLASSERT(pnBytes != NULL);
ATLASSUME(m_hKey != NULL);

lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast<LPBYTE>(pValue),
pnBytes);
if (lRes != ERROR_SUCCESS)
return lRes;
if (dwType != REG_BINARY)
return ERROR_INVALID_DATA;

return ERROR_SUCCESS;
}CESS;
}

zahmatkesh8519
سه شنبه 30 خرداد 1391, 14:19 عصر
تصویر خطایی که می ده :
http://www.pic1.iran-forum.ir/images/up6/94996529022188687363.jpg