View Full Version : مقدار دهی عناصر یک ارایه
Hossenbor
یک شنبه 21 خرداد 1391, 08:44 صبح
سلام دوستان عزیز یک سوال داشتم چگونه عناصر یک ارایه رو مقدار دهی می کنند من استراکچر داشتم که پنج تا ارایه از اون ساختم این استراکچر یک رشته که هر دفعه مقدارش فرق میکرد مقدار دهی میشد اما در اخر که نتیجه را دیدم هر پنج تا عضو مقادیر رشته هاشون همون رشته اخریه ممنون میشم راهنماییم کنید که مشکلم از کجاست با تشکر
returnx
یک شنبه 21 خرداد 1391, 12:11 عصر
به این شکل:
struct struct_name
{
type var_name;
};
struct_name i_test[1];
i_test[0].var_name=value;
i_test[1].var_name=value;
Hossenbor
یک شنبه 21 خرداد 1391, 13:57 عصر
سلام دوست عزیز مشکل از اینجا نیست تا اینجا رو درست برنامه نویسی کردم ولی وقتی رشته مقدار دهی می کنم به جای مقدار رشته چی میگن به قول سی شارپیا یک چیزی تو مایع کپی یا همون alias اتفاق میفته یا مثل بایند تو سی شارپ مقدار value رو تغییر بدی مقدار همه ارایه ها به مقدار الان value ست میشه
mehdi.mousavi
دوشنبه 22 خرداد 1391, 12:18 عصر
سلام دوست عزیز مشکل از اینجا نیست تا اینجا رو درست برنامه نویسی کردم ولی وقتی رشته مقدار دهی می کنم به جای مقدار رشته چی میگن به قول سی شارپیا یک چیزی تو مایع کپی یا همون alias اتفاق میفته یا مثل بایند تو سی شارپ مقدار value رو تغییر بدی مقدار همه ارایه ها به مقدار الان value ست میشه
سلام.
احتمالا شما Pointer به مقدار مورد نظر رو دارید در Structure ذخیره می کنید، نه Value ی مربوطه رو.
اگر Structure و کد مورد نظر رو اینجا قرار بدید، بهتون توضیح میدم چطور اینکارو انجام بدید.
موفق باشید.
Hossenbor
دوشنبه 22 خرداد 1391, 13:53 عصر
سلام استاد ببخشین تو قالب قرار ندادم اخه با موبایلم اینم کد
اینم استراکچرم
struct dic{char *wrd}
اینم کدی که استفاده کردم
char *c=new char[101];
fstream f("test.txt",ios::in);
dic *mdic=new dic[5];
int cnt=0;
while(!f.eof())
{
f.getline(c,100);
if(!f.eof())
mdic[cnt].wrd=c;
cnt++;
}
cout<<mdic[2].wrd<<endl;
cout<<mdic[0].wrd<<endl;
تو این حالت خروجی تمام اونها همون مقدار اخریه که از پارامتر c گرفته راستی میگم پارامتر درسته یا نه اگه میشه استاد در مورد نحوه کد نوشتنم یک نظر بدین ممنون میشم در ضمن من این کدها رو واسه نرم افزار دیکشنری میخوام و روشمم اینطوریه که همون اول همه دیتا بیسو تو مموری لود میکنه ایا این کار نظر استفاده از منابع مشکلی نداره؟ ممنون میشم راهنماییم کنید که چجوری این نرم افزارو بسازم با تشکر
mehdi.mousavi
دوشنبه 22 خرداد 1391, 15:34 عصر
تو این حالت خروجی تمام اونها همون مقدار اخریه که از پارامتر c گرفته راستی میگم پارامتر درسته یا نه اگه میشه استاد در مورد نحوه کد نوشتنم یک نظر بدین ممنون میشم در ضمن من این کدها رو واسه نرم افزار دیکشنری میخوام و روشمم اینطوریه که همون اول همه دیتا بیسو تو مموری لود میکنه ایا این کار نظر استفاده از منابع مشکلی نداره؟ ممنون میشم راهنماییم کنید که چجوری این نرم افزارو بسازم با تشکر
سلام.
در مورد کدی که نوشته اید، حقیقتش اولین چیزی که به چشمم اومد Naming Convention ها بود، که متاسفانه از هیچ یک از Convention های موجود پیروی نکرده اید. اما ایرادات اصلی برنامه:
اگر تعداد خطوط موجود در فایل، بیش از 5 باشه چی میشه؟ کد شما این مساله رو مورد نظر قرار نمیده.
ساختاری که تعریف کرده اید، یه char pointer نگه میداره. وقتی شما یک بار یه آرایه 100 تایی رو new می کنید و اونو در c میریزید، c فرضا به آدرس 0x00174308 اشاره خواهد کرد. سپس در هر دور از حلقه، شما همون آدرس رو در wrd میریزید، چون آدرس تغییری نکرده، بلکه محتوای مورد اشاره اون آدرس تغییر کرده. بنابراین، آخر حلقه، همه wrd های همه dic ها، به 0x00174308 اشاره می کنن و محتوای اونجا چیه؟ یا خالیه (بواسطه کدی که نوشته اید) یا به آخرین خط از فایل اشاره میکنه.
رفع مشکل اول ساده است، کافیه مطمئن بشید که بیش از 5 خط نمیخونید. برای رفع مشکل دوم، شما دو راه دارید. یکی اینکه wrd رو char pointer تعریف نکنید، فرضا char[100] تعریف کنید و محتوای هر حط رو در اون نگهداری کنید. روش دوم، اینه که بازای خطوط مختلف، Pointer ای new کنید و اشاره گر هر یک از خانه های dic رو به pointer متناظر assign کنید. در نهایت هم هر وقت کارتون با dic تموم شد، باید حافظه گرفته شده رو به سیستم برگردونید.
من کد شما رو قدری تغییر دادم:
const int MAX_LINE_SIZE = 100, TOTAL_DIC_ITEMS = 5;
dic *mdic = new dic[TOTAL_DIC_ITEMS];
int cnt = 0;
fstream f("d:\\test.txt", ios::in);
for(string line; getline(f, line) && cnt < TOTAL_DIC_ITEMS;)
{
char *p = new char[MAX_LINE_SIZE];
strcpy_s(p, MAX_LINE_SIZE, line.c_str());
mdic[cnt++].wrd = p;
}
cout << mdic[2].wrd << endl;
cout << mdic[0].wrd << endl;
//Release allocated memory...
for(int i = 0; i < cnt; i++)
delete mdic[i].wrd;
اما، بطور کلی، این روش روش جالبی برای نگهداری Dictionary نیست. آیا بهتر نیست از In-Memory Database ها استفاده کنید؟ آیا بهتر نیست از XML برای نگهداری داده ها استفاده کنید؟ حتی اگر پاسخ به دو سوال اخیر منفی باشه، آیا بهتر نیست داده ها رو بصورت Binary در فایل نگهداری کنید تا اطلاعات فربه تری رو بتونید در فایل ذخیره کنید تا فرضا، مجبور نباشید تعداد کل آیتم های موجود در Dictionary رو محاسبه کنید؟ از همه اینها بهتر، آیا نباید برای رسیدن به واژه مورد نظر، از Map یا دیگر Data Structure های بهینه برای Search استفاده کرد؟ (در مورد In-Memory DB ها قبلا یکی دو بار توضیح داده ام، لطفا جستجو کنید. در مورد XML هم شما میتونید بسادگی با استفاده از MS-XML Parser فایل XML مورد نظر رو Parse کنید و با W3C DOM API ها، از همون طریق به هدفتون برسید). قدری در مورد مسائلی که گفتم فکر کنید، سپس اگر سوالی بود در خدمتم.
موفق باشید.
پاورقی: من در اسم گذاری متغیرها دست نبردم که سردرگم نشید. اما از نظر من، یه کد خوب، باید حداقل "دست خط خوبی" داشته باشه که Naming Convention ها، به این موضوع کمک بسزایی میکنن.
Hossenbor
دوشنبه 22 خرداد 1391, 18:42 عصر
سلام استاد و خسته نباشید خدمتتون منم دنبال همین روش مموری دیتابیس میگشتم اما نمیدونستم چی سرچ کنم arraylist سرچ کردم جواب نگرفتم دوما شما گفته بودین از باینری استفاده کنم تو ذخیره باینری مشکل ندارم اما نمیدونم داده ها رو چجور قالب بندی کنم که سرعت لودشون بیشتر باشه تصمیم اولی که گرفتم این بود که فایل رو بصورت فشرده ذخیره کنم اخه زمان دیکمپرسشو اندازه گرفتم کمتر از دو ثانیه هست حالا نظرتونو در این مورد میخواستم که داده ها رو چجوری قالب بندی کنم اگه میشد همون مموری دیتابیسو دامپ گرفت و ذخیره کرد و دوباره همونو لود خوب نبود یا چیزی شبیه همین
فقط برام یک چیزی گنگه اون خط اخر چرا داده هامونو حذف میکنیم و یک سوال دیگه اگر پوینتر p رو حذف کنم اشکال ایجاد نمیکنه؟ با تشکر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.