PDA

View Full Version : مشکل در قرار دادن یک آدرس درون اشارگر با ساختار



hoax3r
شنبه 27 تیر 1388, 17:56 عصر
سلام
من یه مشکل کوچیک دارم اگه بتونین کمکم کنید لطف بزرگی در حقم کردین
من یه کتاخانه دارم مینویسمی و تابعی درون این کتابخانه هست که یکی از پارامتراش یک اشارگر به ساختاره
ساختار رو هم خودم تعریف کردم. حالا میخام یک آدرس بخصوص که به طریقی پیداش میکنم
رو درون اشارگری که به صورت پارامتر گرفتم قرار بدم. در واقع پارامتر حکم ورودی و خروجی رو برام داره
این یه نمونه سورس مشابه کاری که میگم هست



#include <windows.h>

// inside a library
/////////////////////////////////////////
typedef struct tagTestStruct
{
DWORD dwVar1;
DWORD dwVar2;
DWORD dwVar3;
}TestStrcut, *PTestStrcut;

int func(PTestStrcut ps)
{
ps = (PTestStrcut) // any Address;
return TRUE;
}
/////////////////////////////////////////

int main(void)
{
PTestStrcut s = 0;
func(s);

s->dwVar1 = 10;
s->dwVar2 = 12;
s->dwVar3 = 14;

return 0;
}


حالا مشکل اینه که کامپیایلر (هم ماکروسافت و هم PellesC تست کردم) میاد این قسمت تابع رو
کلا حذف میکنه یا بقول خودشون مثلا بهینه میکنن البته در حالت Releaseولی من نمیخام این قسمت حذف بشه


ps = (PTestStrcut) // any Address;


چیکار کنم اینجوری نشه، آیا درست اینکارو انجام میدم؟
ممنون میشم راهنمایی کنید.

tdkhakpur
شنبه 27 تیر 1388, 19:25 عصر
سلام
من ندانستم منظور شما چیه ولی این کد حالت دیگر از کار شماست.


(void *)ps = (void *) // any Address;

hoax3r
شنبه 27 تیر 1388, 22:05 عصر
ممنون بابت جواب ولی متاسفانه جواب نداد، حالا باز میگم شاید بالا بد توضیح دادم
من یه تابع دارم که یه پارامترش یه اشارگر به ساختار هست من اشارگر به ساختار رو بصورت PTestStrcut تعریف کردم
یه آدرس رو هم به طریقی محاسبه مکینم حالا میخوام داخل تابع func آدرسی که اشاره گر بهش اشاره میکنه رو با آدرسی که بدست آوردم تغییر بدم.
مثلا اگه آدرسم 10000 اینجوری جواب بگیریم، و ساختار بر مبنای اون آدرس بشه


ps = (PTestStrcut) 10000;
return TRUE;

ولی متاسفانه کامپایلر کلا این قسمت رو حذف مکینه و فقط reutrn باقی میمونه، کامپایلر ماکروسافت که کلا func رو حذف مکینه
با اشارگر void هم همین نتیجه رو میگیرم
البته تابع رو به این شکل تغییر میدم درست میشه ولی میخوام بصورت پارامتر باشه


PTestStrcut func()
{
return (PTestStrcut) address;
}


به نظرتون چیکارش کنم

tdkhakpur
شنبه 27 تیر 1388, 23:07 عصر
سلام
با روش زیر به هر اشاره گری میتوانید ادرس عددی بدید البته نباید آدرس خارج از محدوده باشد.


long addr;
addr = 10000;
memcpy(&ps, &addr, 4);

hoax3r
یک شنبه 28 تیر 1388, 01:21 صبح
ممنون این تابع کمک کرد، الان که سوالمو نگاه میکنم میبینم عجب سوتی دادیم:خجالت: