PDA

View Full Version : سوال: مشکل در استفاده از اشاره گرها



soheilajoon
یک شنبه 17 آذر 1387, 22:08 عصر
سلام به همه.
این کدی هست که من نوشتم





unsafe class Program


{


public struct node
{
public int data;
public node* next;
}

public static node* getnode()
{
node* p = new node();
return p;
}


}





ولی نمی دونم چرا توی قسمت





p = new node();





این خطا رو میده





Cannot implicitly convert type 'node.Program.node' to 'node.Program.node*' C:\Documents and Settings\Mahsa\My Documents\Visual Studio 2008\Projects\node\node\Program.cs 19 23 node







اگه کسی کمکم کنه ممنون میشم. :قلب:

Mehdi Asgari
دوشنبه 18 آذر 1387, 00:17 صبح
اصولا استفاده از اشاره گر ها زیاد توصیه نمیشه در سی شارپ
به هر حال ،
متن خطا که واضحه.
از این کد می تونی استفاده کنی

node myNode = new node();
node* p = &myNode;
return p;

soheilajoon
دوشنبه 18 آذر 1387, 09:45 صبح
من از این کد استفاده کردم ولی تو قسمت تغییر data و next اصلا هیچ اتفاقی نمی افته! یعنی اصلا مقدارشون تغییر نمی کنه! ( کد های قرمز )



public static void fill(node* f, int x)
{
node* p, q;
p = getnode();
p->data = x;
p->next = null;
.
.
.
}
}

static void Main(string[] args)
{
node* f = getnode();
f->next = null;
f->data = 11;
Console.WriteLine("enter data");
int x = Convert.ToInt32(Console.ReadLine());
fill(f, x);
}



تو کد بالا من اشاره گر f و متغییر x رو به تابع fill میفرستم ولی نه تو بلاک اصلی برنامه و نه تو تابع fill مقدار data و next تغییر نمی کنند.
برای تعریف node ها هم از struct پست قبلی استفاده کردم.
میدونید اشکال کارم کجاست و چرا تغییراتم اعمال نمیشه؟

Mehdi Asgari
دوشنبه 18 آذر 1387, 12:00 عصر
اولا توضیح بده میخوای چیکار کنی. لیست داری درست می کنی ؟
استفاده از اشاره گر درست نیست.راه های دیگری هم برای این کار هست
(اگه قرار باشه برای کارای معمولی هم از اشاره گر استفاده کنی ، برو سراغ C++/CLI . هدف از قرار دادن اشاره گر در سی شارپ چیز دیگری بوده. اگرم صرفا داری یاد می گیری ، مثال خوبی رو برای یادگیری انتخاب نکردی.
این مثال خیلی بهتره:
http://blogs.msdn.com/ericgu/archive/2007/06/20/lost-column-2-unsafe-image-processing.aspx

soheilajoon
دوشنبه 18 آذر 1387, 12:38 عصر
بله دقیقا دارم link - list درست می کنم. حذف و اضافه و پیمایش و . . . .
این کار رو با ++C انجام دادم , حالا می خوام با #C انجامش بدم ولی نمیشه!
البته می دونم #C برای استفاده از link-list

LinkedList<T>


رو داره ولی می خوام خودم بتونم بنویسم.
حالا میشه بگید چرا گفتید :

استفاده از اشاره گر ها در #C زیاد توصیه نمیشه
و

هدف از قرار دادن اشاره گر در سی شارپ چیز دیگری بوده
چی بوده؟
واقعا دوست دارم بدونم. ممنون.

Mehdi Asgari
دوشنبه 18 آذر 1387, 16:22 عصر
سی شارپ (و در کل دات نت) یک محیط مدیریت شده و type-safe هست.
هنگام اجرای کد خیلی از عملیات (مثل دسترسی به اعضای یک آرایه) چک میشن ، تخصیص و آزاد کردن حافظه به طور خودکار توسط GC انجام میشه و ..
عمل verification بر روی کد unsafe انجام نمیشه ، در نتیجه این کد fully trusted نیست و (مثلا) نمیشه از اینترنت اجراش کرد.
معمولا کد unsafe در مواقعی استفاده میشه که نیاز به دسترسی به یک ساختار در COM یا محیط unmanaged هست که از اشاره گر در اون استفاده شده و یکی هم در مواقعی که نیاز به پرفورمنس بالایی داریم (مثل کار با عکس ها که یه لینک در پست قبلی دادم)
کد زیر رو اجرا کنید ، خطا خواهید گرفت (بر خلاف سی) ؛ چون میخواید به عضوی از ارایه دسترسی پیدا کنید که وجود نداره (خارج از محدوده است)


int[] array = { 1,2,3,4};
Console.WriteLine(array[6]);


حالا کد زیر رو اجرا کنید. خطایی نمی گیرید و برنامه تون مثل سی یک جواب نادرست چاپ می کنه در خروجی (در واقع مکانیسم array-bound checking زمان اجرای دات نت رو bypass کردیم)


int[] array = { 1,2,3,4};
unsafe
{
fixed (int* pointer = &array[0])
{
Console.WriteLine(pointer[6]);
}
}


کد unsafe خیلی کم به کار میره ، اونم در مواردی که ذکر کردم و توسط کسی که می فهمه داره چیکار می کنه.
(اگه نیاز به کار زیاد با اشاره گر ها دارید و پرفورمنس خیلی مهمه ، قسمت های کریتیکال کد رو در C++ نوشته و در سی شارپ اونا رو فراخوانی کنید. همین fixed کردن دستکاری در کار GC هست و در صورت استفادۀ زیاد خودش رو پرفورمنس تاثیر میذاره، چون اشیا رو pin کرده و به GC میگه اون ها رو collect نکنه (نه تنها collect بلکه move یا هر عملیات دیگری که باعث تغییر آدرس حافظه بشن)
یه نکته: هیچوقت سعی نکنید در سی شارپ کد سی بنویسید.

soheilajoon
سه شنبه 19 آذر 1387, 09:15 صبح
اینها رو نمی دونستم , خیلی جالب بود.
ممنون.