PDA

View Full Version : استفاده از اشاره گر



mahdi bg
سه شنبه 14 خرداد 1387, 20:18 عصر
سلام
چطوری باید توی C#.net اشاره گر تعریف کرد
مثلا
int * next

ممنون

Cold.82
سه شنبه 14 خرداد 1387, 21:27 عصر
اصولا اینطوری استفاده می کنند البته سی شارپ فقط در بلاکهای کدی اجازه می دهد از اشاره گر استفاده کنید(البته باید بلاکتان را علامت گذاری کنید)

mahdi bg
سه شنبه 14 خرداد 1387, 22:27 عصر
سلام
میشه یکم بیشتر توضیح بدیدن دقیقا یعنی چی؟

من می خوام یک کلاس تعریف کنم برای PUSH و POP کردن(ساختن stack) و می خوام ساختار stack رو با اشاره گر تعریف کنم
میخواستم بدونم میشه از اشاره گر استفاده کرد یا نه؟


چون من خیلی کم .net کار میکنم ، فکر کنم موضوعی به اسم برنامه امن و نا امن مطرح میشه که دقیقا نمی دونم چیه.

ممنون

Cold.82
چهارشنبه 15 خرداد 1387, 00:21 صبح
unsafe {
int* pInt = stackalloc int[30];
*pInt = 5;
//pInt[0]=5;
*(pInt + 1) = 6;
//pInt[1]=6;
Console.WriteLine("*pInt={0}",*(pInt+1));


}

اصولا برای استفاده از اشاره گرها باید از این کلمه استفاده کنید

این دستور یک حافظه ای رو بر روی پشته قرار می ده البته بدون هیچ مقدار دهی اولیه

با این کدها هم می توانید مقدار دهی کنید و یا به عناصر دسترسی داشته باشید

البته این کد یک پشته رو پیاده سازی نمی کنه البته یک ارایه است مبتنی بر پشته

در مورد کد نا امن هم برفرض مثال اگر همین رو در نظر بگیریم به 2 صورت می شود پیاده سازی کرد



int[] myInt = new int[10];
myInt[25] = 1;
که در اولی چون خارج از ارایه است exception ایجاد می شود



int* pInt = stackalloc int[20];
pInt[40]=8
ولی در این کد هیچ گونه نظارتی انجام نمی گیرد

برای کامپایل هم باید از قسمت properties قسمت Build گزینه Allow unsafe code رو انتخاب کرده باشین .

mahdi bg
چهارشنبه 15 خرداد 1387, 07:02 صبح
سلام
راهی وجود نداره که بشه از اشاره گر استفاده کرد
اما به کد ، safe اضافه نکرد؟
مثل توابع API که مثلا به جای int * نوع داده ای با نام Pint وجود داره
یا هر راه دیگه ای ، اما کارکرد آشاره گر رو داشته باشه
ممنون

Cold.82
چهارشنبه 15 خرداد 1387, 11:16 صبح
من فکر نکنم این اجازه در سی شارپ داده شده باشه که بدون استفاده Unsafe بتوان از اشاره گر استفاده کرد .

linux
چهارشنبه 15 خرداد 1387, 13:12 عصر
سلام
راهی وجود نداره که بشه از اشاره گر استفاده کرد
اما به کد ، safe اضافه نکرد؟
مثل توابع API که مثلا به جای int * نوع داده ای با نام Pint وجود داره
یا هر راه دیگه ای ، اما کارکرد آشاره گر رو داشته باشه
ممنون
شاید اگر توضیح بدهید که در کجا می خواهید از این اشاره گرها استفاده کنید ، راه حل بهتری باشد

mahdi bg
چهارشنبه 15 خرداد 1387, 15:38 عصر
سلام


شاید اگر توضیح بدهید که در کجا می خواهید از این اشاره گرها استفاده کنید ، راه حل بهتری باشد


سلام
میخوام پشته رو با کمک لیست پیوندی پیاده سازی کنم

اول تعریف نود



struct node

{
type1 data1
type2 data2
.
.
.
typen datan
node * next
}


و در یک کلاس به اسم stack از این ساختار
استفاده کنم
ممنون

linux
چهارشنبه 15 خرداد 1387, 16:19 عصر
سلام
سلام
میخوام پشته رو با کمک لیست پیوندی پیاده سازی کنم

اول تعریف نود



struct node

{
type1 data1
type2 data2
.
.
.
typen datan
node * next
}


و در یک کلاس به اسم stack از این ساختار
استفاده کنم
ممنون
خوب یک وقتی مساله پیاده سازی stack هست یه وقتی استفاده از stack هست.
اگر مساله بخش دوم هست در .نت stack پیاده سازی شده است ، می توانید از آن استفاده کنید
در پیوند زیر یک مثال خوب به همراه توضیح هم هست.
http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=65

Alireza_Salehi
چهارشنبه 15 خرداد 1387, 22:00 عصر
سلام
از همه دوستان ممنون
برنامه رو با VC++.net پیاده سازی کردم
نمی صرفه به این همه دردسر توی C#

فقط یک سوال دیگه
چطوری میشه توی VC++.net
cin و cout رو فراخوانی کرد خطا می گیره تعریف نشده؟


ممنون
پیاده سازی پشته در #C دردسری نداره و نیازی هم به اشاره گر نیست.

در VC++.NET به جای cin و cout از Console استفاده کنید.

mahdi bg
پنج شنبه 16 خرداد 1387, 17:28 عصر
سلام
من کد زیر رو نوشتم
اما بلاک unsafe رو قبول نمیکنه
مشکل کجاست؟

http://i30.tinypic.com/2q38abq.jpg

بلاک unsfe رو فقط توی بلاک main قبول می کنه
راهی وجود داره تا بتونم کد بالا رو درست کنم
(باید از اشاره گر استفاده کنم)

Allow unsafe code رو چکشو زدم

ممنون

Zaparo
جمعه 17 خرداد 1387, 06:21 صبح
دوست عزیز شما در مورد CTS مطالعه کن مشکلت حل میشه همونطور که arsp گفتش نیازی به Pointer نیست شما باید یه کلاس خود ارجاع بنویسی با توجه به اینکه class در net. یه نوع داده مرجعی هست(RefrenceType) مشکلی پیش نمیاد بعد برای لیست پیوندی حتما" نباید Struct باشه میتونه کلاس مثلا"



class Node
{
object Data;
Node refrence;
}
اینیم که unsafe رو قبول نمیکنه بخاطر اینه که باید به compiler بفهمونید که کد شما باید unsafe ه این کار با دستور unsafe/ به کامپایلر فهمونده میشه ولی اگه از vs استفاده میکنید تو Properties پروژتون یه جا هست تیکش رو میزنید درست میشه :D
فکر کنم Build باشه

mahdi bg
جمعه 17 خرداد 1387, 10:16 صبح
سلام
قبلش ازدوستان که پیگیر هستند ممنون

WinFx Developer (http://barnamenevis.org/forum/member.php?u=66551) عزیز ممنون
من هم میدونم استک رو میشه با غیر از لیست هم پیاده سازی کرد (آرایه)
اما باید با لیست پیدا سازی کنم

توی لینک زیر قسمتی از کد به زبان VC++.net میخواستم بدونم معادل اون به VC#.net چی میشه؟


(http://i28.tinypic.com/33acn6d.jpg)
http://i28.tinypic.com/33acn6d.jpg
(http://i28.tinypic.com/33acn6d.jpg)

قسمتی از کد اینه که تبدیلش به VC#.net برام مشکله




struct mystack
{
int count1,count2;
mystack * next;
};
class stack
{
mystack * Topstack;
public:
stack(){
Topstack=NULL;}
void push(int a,int b){
mystack * p;
p=new mystack;
p->count1=a;
p->count2=b;
p->next=Topstack;
Topstack=p;}
};


همون طور که معلومه من برای عناصر استک یک struct تعریف کردم
و از اون توی کلاس stack استفاده کردم.
مشکل اصلی من همین قسمته(تبدیل قسمتی های که
از اشاره گر استفاده شده)
ممنون

salibsatan
سه شنبه 12 آذر 1387, 20:43 عصر
دوستان عزیز ببخشید یک تاپیک قدیمی رو کشیدم بالا.مشکل من دقیقا همین نکته هست اما صریح توضیح داده نشده.گفتم اگه تاپیک مجدد بزنم پاکش می کنن.این کد رو کجا باید بنویسم دقیقا؟ unsafe /رو کجا بنویسم؟هرجا می نویسم پیغام خطا میده...می خوام یک اشاره گر بسازم.(برای ساختن یک صف و استفاده از front و rear.ممنون میشم کامل توضیح بدید.
unsafe {
int* pInt = stackalloc int[30];
*pInt = 5;
//pInt[0]=5;
*(pInt + 1) = 6;
//pInt[1]=6;
Console.WriteLine("*pInt={0}",*(pInt+1));


}

Mehdi Asgari
سه شنبه 12 آذر 1387, 21:10 عصر
پیغام خطات رو بذار اینجا.
به احتمال خیلی زیاد ، سویچ /unsafe کامپایلر رو on نکردی
Project -> Properties -> Build -> Allow Unsafe Code