PDA

View Full Version : سوال: استفاد از نوع داده string در struct



moh_43jq683l
یک شنبه 20 دی 1394, 15:40 عصر
با سلام.
دوستان مشکل بنده اینه که نمیتونم درC#‎‎‎‎ در struct نمیتونم از نوع داده رشته ای استفاده کنم .
خیلی هم سرچ کردم اما متاسفانه به نتیجه ای نرسیدم.
سوال دومم این که داخل استراکتم قصد داشتن ارایه ی 9 تایی از اشاره گر به همون نوع استراکتو دارم. که متاسفانه نتونستم اینم پیاده کنم. لطف میکنید کمک کنید.
در ضمن تیک unsafe رو برداشتم و از unsafe و fixed هم استفاده کردم مشکلم حل نشد.

public struct knowledge_base_tree
{
public int noOFnude;
static int [] addQstart = new int [9];
public string [] nodes = new string[9];
public string [] info = new string[9];
public unsafe knowledge_base_tree*[] nude = new knowledge_base_tree*[9];
public unsafe knowledge_base_tree* next ;
}

این استراکتم. و این هم ارور
Error 3 Cannot take the address of, get the size of, or declare a pointer to a managed type

مشکل از دو خط ارایه از رشته و از اشاره گر هست.
قصد بنده ایجاد استراکتی شامل چند ارایه 9 تایی از رشته و یک ارایه 9 تایی از اشاره گر برای همون نوع داده استراکتم هست.که بتونم ساختار درختی رو ایجاد کنم. تشکر

AJL110ALI
پنج شنبه 24 دی 1394, 11:36 صبح
سلام
دو تا مشکل هست اینجا:
1- مشکلی که با آرایه رشته ای دارید، که عملا ربطی به string نداره و مربوط میشه به این که توی struct نمیشه در جا initialize کرد ( توضیح کامل :http://vijaymukhi.com/documents/books/csbasics/chap11.htm ته صفحه بخش Structures )
یعنی اگه اینطور بنویسید حل میشه:


public struct knowledge_base_tree
{

knowledge_base_tree(int size)
{
noOFnude = 0;
nodes = new string[size];
info = new string[size];
addQstart = new int[size];
}

public int noOFnude;
static int[] addQstart;
public string[] nodes;
public string[] info;
}


2- مشکل دوم که با اشاره گر ها دارید. احتمالا شما ++C کار هستید و با موضوع unsafe زیاد آشنا نیستید. خلاصه اینجور بگم که تو .net ترجیح داده میشه که از اشاره گر ها استفاده نشه. و با توجه به امکاناتی که .net در اختیارمون قرار داده، عملا نیازی به اشاره گر ها نداریم. ( یه مطالعه ای در مورد Value and Refrence types بکنید : https://msdn.microsoft.com/en-us/library/4d43ts61%28v=vs.90%29.aspx )
در مورد شما. برای حل مشکلتون بدون نیار به اشاره گر ها. کافیه نوع ساحتار رو به کلاس تبدیل کنید. این جوری نوع داده تون از نوع reference type میشه و نیازی به اشاره گر ندارید. همچنین مشکل اولتون هم خودبخود حل میشه ( تو کلاس میشه درجا مقدار دهی اولیه کرد.
به این شکل:


public class knowledge_base_tree2
{
public int noOFnude;
static int[] addQstart = new int[9];
public string[] nodes = new string[9];
public string[] info = new string[9];
public knowledge_base_tree2[] node = new knowledge_base_tree2[9];
public knowledge_base_tree2 next;
}

moh_43jq683l
جمعه 25 دی 1394, 10:03 صبح
تشکر خیلی لطف کردید.
بله بنده c++ کار کردم تجربه ای در c# ندارم. با راهنمایتون مشکلم تا حد زیادی حل شد. فقط یه مشکل جدید دارم میخوام وقتی تو یه تابع با stackalloc حافظه ای رو میگیرم بعد اجرای تابع حافظه ازاد نشه.
در اصل قصدم اینه که چند تا اشاره گر سراسری بگیرم بعد با دستور


knowledge_base_tree* temp_kbt = stackalloc knowledge_base_tree [1];
esharegar_sarasari = temp_kbt;

و در قسمتهای دیگه برنامه بتونم از اشاره گرم استفاده کنم. اما متاسفانه با تموم شدن تابع تمام حافظه گرفته شده ازاد میشه و دیتامو از دست میدم.
متاسفانه من به استفاده از کلاس تسلط ندارم. از طرفی هم برنامه تا حد زیادیش نوشته شده دلم نمیاد تغیرات بزرگ توش بدم.
بازم تشکر.

moh_43jq683l
جمعه 25 دی 1394, 11:33 صبح
تشکر بابت راهنمایی.لطف کردید البطه من منظورمو بد رسوندم.
موضوع اینه که من یه اشاره گر سراسری دارم. حالا داخل یه تابع با stackalloc یه فضایی رو روی حافظم میگیرم.و اشاره گر هم به اون فضا اشاره میکنه. تا اینجاش مشکلی ندارم. حتی اگر داخل این تابع یه تابع دیگه رو هم فراخونی کنم مشکلی نیست و همه چی درست کار میکنه. مشکل از جایی شروع میشه که تابعی که داخلش stackalloc کردم به انتها میرسه. اونوقت خودکار فضایی که در حافظه داشتمو از دست میدم. یعنی دیتای داخل اون فضا عوض میشه و دست من نیست. البطه کماکان اشاره گرهای سراسریم به اون فضا اشاره میکنند. اما در هر صورت دیتای من دیگه در اون فضا نیست .میخوام با انتها یافتن تابع اون فضای گرفته شده با stackalloc دوباره ازاد نشه و دستم بمونه.
تشکر بابت راهنماییهاتون

AJL110ALI
جمعه 25 دی 1394, 13:41 عصر
ببینید، بازم میگم تو #C ترجیحا نباید از unsafe کد ها استفاده کرد. کار با اشاره گرها خیلی کم قابل توجیهه ( مثل کار با سخت افزار یا com یا وقتی سرعت و بازدهی خیلی مهمه). من تو ++C هم تا اونجایی که بتونم از allocate استفاده نمیکنم :لبخند:
الان برای مشکل شما. اگه درست فهمیده باشم میخواید یه متغیر سراسری رو توی یه تابع مقدار دهی کنید و از مقدارش در توابع دیگه استفاده کنید. خب این کار رو همین کلاستون حالت عادی انجام میده


knowledge_base_tree global_var;

void somefunction(){
knowledge_base_tree local_var;
//... some code
global_var=local_var;
}

void anotherfunction(){
knowledge_base_tree local_var;
//... some code
local_var=global_var;
}

یه خلاصه توضیحی در مورد reference and value type ها بدم. تو #C نوع داده های اولیه (int,single,...) و struct ها از نوع value type به حساب میاند و کلاس ها از نوع reference type . فرقشون در اینه که وقتی مینویسی a=b; (یه assignment انجام میدیم)، value type ها کپی میشن (مثل متغیر ها تو ++C) ولی reference type ها فقط آدرسشون کپی میشه ( مثل اشاره گر ها در ++C ). از این قضیه استفاده میکنیم برای انجام کارایی که به اشاره گر نیاز دارند.
برای مشکل شما. وقتی knowledge_base_tree رو از نوع کلاس تعریف کنید، عملا کار اشارهگر رو انجام میده برامون.

moh_43jq683l
شنبه 26 دی 1394, 13:16 عصر
چرا جای پست 4 و 5 عوض شده بنده در جواب پست 5 پست 4 رو نوشتم. در هر صورت مجدد.

تشکر بابت راهنمایی.لطف کردید البطه من منظورمو بد رسوندم.
موضوع اینه که من یه اشاره گر سراسری دارم. حالا داخل یه تابع با stackalloc یه فضایی رو روی حافظم میگیرم.و اشاره گر هم به اون فضا اشاره میکنه. تا اینجاش مشکلی ندارم. حتی اگر داخل این تابع یه تابع دیگه رو هم فراخونی کنم مشکلی نیست و همه چی درست کار میکنه. مشکل از جایی شروع میشه که تابعی که داخلش stackalloc کردم به انتها میرسه. اونوقت خودکار فضایی که در حافظه داشتمو از دست میدم. یعنی دیتای داخل اون فضا عوض میشه و دست من نیست. البطه کماکان اشاره گرهای سراسریم به اون فضا اشاره میکنند. اما در هر صورت دیتای من دیگه در اون فضا نیست .میخوام با انتها یافتن تابع اون فضای گرفته شده با stackalloc دوباره ازاد نشه و دستم بمونه.
تشکر بابت راهنماییهاتون

moh_43jq683l
سه شنبه 29 دی 1394, 00:21 صبح
همچنان هیچ راهی پیدا نکردم. اگر کسی از شدن یا نشدنشم هم اطلاع داره لطف کنه خبر بده. تشکر