PDA

View Full Version : سوال: خطا در نوشتن کد کلاس(تازه کار)



bargesabz
دوشنبه 31 تیر 1387, 01:57 صبح
سلام
در یه برنامه من یه کلاس نوشتم که سه تا آرایه داره و و برای هر آرایه یه متد هست که رشته رو میگیره و در آرایه ها دنبال اون رشته می گرده و باید نتیجه بولین رو برگردونه
برای هر سه متد یه خطا و یه اخطار(warning) می ده ممنون میشم کمکم کنید




public bool kword( string tok)
{
for (i = 0; i < Keyw.Length; i++)
if (tok == Keyw[i])
return true;
else
return false;
}
برای خطا
kword رو هایلات می کنه و میگه که

'compiler.word.kword(string)': not all code paths return a value
منظور از برنگرداندن مقدار چیه؟
برای warningهم ++i رو هایلایت می کنه و میگه

Unreachable code detected
در راهنما نوشته شده بود که کد مورد نظر اجرا نمی شه .چرا اجرا نمیشه؟من دلیلی نمی بینم

یه سوال دیگه هم دارم در همین متد نوع مقدار برگردانده شده(bool) نوشتم اگه boolean می نوشتم فرقی داشت؟چون برای هردو در توضیحات می نویسه که مقدار بولین رو بر می گردونه اما boolآبی نوشته میشه اما boolean سبزکم رنگ نوشته میشه

DarkSoroush
دوشنبه 31 تیر 1387, 02:33 صبح
خطایی که برای i میده احتمالا به علت اینه که i رو تعریف نکردید. درستش میشه این:


for (int i = 0; i < Keyw.Length; i++) if (tok == Keyw[i]) return true; else return false;



ولی خطای دوم.... میشه کلاستون رو کامل بزارید؟!

pars.engineer
دوشنبه 31 تیر 1387, 04:58 صبح
فرض كنيد Keyw.Lenght مقدار 0 يا منفي برگرداند، پس بديهي است وارد حلقه ي For نخواهد شد و نيز هيچ مقداري بر نمي گرداند در حالي كه تابع بايد يك مقدار بولين برگرداند،پس خطا خواهد داد.

كد صحيح:



public bool kword( string tok)
{
for (i = 0; i < Keyw.Length; i++)
if (tok == Keyw[i])
return true;
else
return false;
return false
}

در مورد قسمت دوم اگر بقيه ي كلاس را بگذاريد، شايد بهتر بتوانيم كمكتان كنيم.
موفق باشيد.

bargesabz
دوشنبه 31 تیر 1387, 12:01 عصر
با سلام دوباره
وتشکر از لطفتون

این هم کل کلاس




using System;
using System.Collections.Generic;
using System.Text;


namespace compiler
{
class word
{
private string tok;
private int i;


string[] Keyw ={ "dastpebka","tawaw","agar","dana","danaagar","tavaxtek","hatako","bo","brodare",
"halbzhar","xal","bpse","bnosa","bxena","ravstaw","danana"};
string[] Tp ={"zhmkort","zhmtawaw","zhmrzhaw","lezhna","mezho","dola"};
string[] op ={"^","+","-","*","/","%","&","|","<","<=",">=",">","==","<>","dzh","(",")"};


public bool kword( string tok)
{
for (i = 0; i < Keyw.Length; i++)
if (tok == Keyw[i])
return true;
else
return false;
}



public bool tword(string tok)
{
for (i=0;i<Tp.Length ;i++)
if(tok==Tp[i])
return true;
else
return false;
}



public bool opword(string tok)
{
for (i = 0; i < op.Length; i++)
if (tok == op[i])
return true;
else
return false;
}


}
}



میبینید که هم i رو تعریف کردم هم آرایه ها خالی نیستند.

این سه متد همزمان اجرا نمی شن بلکه یکی بعد از دیگری انجام میشه به همین دلیل برای همشون از یک آرگومان استفاده کردم(tok ) فکر نمی کنم خطاها مربوط به اون باشه.

البته یه خط خالی بین تعریف آرایه و مقدار دهی وجود داره که در خود کلاس وجود نداره اما در این جا به وجود اومده

ASKaffash
دوشنبه 31 تیر 1387, 12:19 عصر
سلام
دوست عزیز اینهمه کد نوشتن نمی خواهد متد Contains در هر آرایه کارش همینه .


string[] Tp = { "zhmkort", "zhmtawaw", "zhmrzhaw", "lezhna", "mezho", "dola" };
this.Text = Tp.Contains<string>("lezhna").ToString();

bargesabz
دوشنبه 31 تیر 1387, 16:58 عصر
دوباره سلام

جناب ASKaffashمن نفهمیدم شما چی گفتید؟
من دنبال یه کلمه مخصوص نمی گردم
من اینو برای نوشتن فاز تحلیل لغوی کامپایلر می خوام برنامه اصلی کد نوشته شده از کاربر رو میگیره حرف به حرف تجزیه می کنه و در یه آرایه قرار می ده سپس میاد اونها رو ترکیب میکنه هر کلمه رو که گرفتدر متغییر tokقرار میده و میاره با این سه تاآرایه که کلمات کلیدی،عملگرها و نوع داده هستند مقایسه می کنه اگه این سه تا بودند که به عنوان عملگر یا کلمه کلیدی یا نوع داده در جدول نماد قرار می گیرند اگه نه یا شناسه هستند یا عملوند یا ثابت یا عدد که برای هر کدام عملیات خودش انجام میشه
پس هیچوقت نمی تونیم بگیم که به طور حتم با مثلا "lezhna " روبرو میشیم که بگیم دنبال اون بگردیم

خطی که شمانوشتید چه کاری انجام میده؟
فکر میکنم آرایه رو دنبال کلمه مورد نظر می گرده؟ اگه اشتباه میگم ممنون میشم تصحیح کنید


کسی نبود در مورد این خطاها به من کمک کنه؟ من شدیدا به اون نیاز دارم:ناراحت::افسرده:

اَرژنگ
دوشنبه 31 تیر 1387, 17:13 عصر
if
Keyw=[]

tok("blah")=??

اگر
Tp=[]
tword("زرشک")==??
اصلا اگر دستی هم هرکدام از ۳ تا متدها را امتحان کنید هیچ کدام به جز اینکه عنصر اول را با رشته مقایسه کنند (اگر آرایه خالی نباشد) کاره بیشتری انجام نمیدن.
منطق هر ۳ تا متد درست پیاده نشده.






using System;
using System.Collections.Generic;
using System.Text;


namespace compiler
{
class word
{
private string tok;
private int i;از این در لوپ نمیتوانید استفاده کنید//


string[] Keyw ={ "dastpebka","tawaw","agar","dana","danaagar","tavaxtek","hatako","bo","brodare",
"halbzhar","xal","bpse","bnosa","bxena","ravstaw","danana"};
string[] Tp ={"zhmkort","zhmtawaw","zhmrzhaw","lezhna","mezho","dola"};
string[] op ={"^","+","-","*","/","%","&","|","<","<=",">=",">","==","<>","dzh","(",")"};


public bool kword( string tok)
{
for (int i = 0; i < Keyw.Length; i++)
if (tok == Keyw[i])
return true;
else
return false;
}



public bool tword(string tok)
{
for (int i=0;i<Tp.Length ;i++)
if(tok==Tp[i])
return true;
else
return false;
}



public bool opword(string tok)
{
for (int i = 0; i < op.Length; i++)
if (tok == op[i])
return true;
else
return false;
}


}
}

اَرژنگ
دوشنبه 31 تیر 1387, 17:34 عصر
فرض كنيد Keyw.Lenght مقدار 0 يا منفي برگرداند، پس بديهي است وارد حلقه ي For نخواهد شد و نيز هيچ مقداري بر نمي گرداند در حالي كه تابع بايد يك مقدار بولين برگرداند،پس خطا خواهد داد.

كد صحيح:



public bool kword( string tok)
{
for (i = 0; i < Keyw.Length; i++)
if (tok == Keyw[i])
return true;
else
return false;
return false
}
در مورد قسمت دوم اگر بقيه ي كلاس را بگذاريد، شايد بهتر بتوانيم كمكتان كنيم.
موفق باشيد.




public bool kword( string tok)
{
bool result = false;
for (i = 0; i < Keyw.Length; i++)
{
if (tok == Keyw[i]) result = true;
}
return result ;
}

اَرژنگ
دوشنبه 31 تیر 1387, 17:41 عصر
دوباره سلام

جناب ASKaffashمن نفهمیدم شما چی گفتید؟
من دنبال یه کلمه مخصوص نمی گردم
من اینو برای نوشتن فاز تحلیل لغوی کامپایلر می خوام برنامه اصلی کد نوشته شده از کاربر رو میگیره حرف به حرف تجزیه می کنه و در یه آرایه قرار می ده سپس میاد اونها رو ترکیب میکنه هر کلمه رو که گرفتدر متغییر tokقرار میده و میاره با این سه تاآرایه که کلمات کلیدی،عملگرها و نوع داده هستند مقایسه می کنه اگه این سه تا بودند که به عنوان عملگر یا کلمه کلیدی یا نوع داده در جدول نماد قرار می گیرند اگه نه یا شناسه هستند یا عملوند یا ثابت یا عدد که برای هر کدام عملیات خودش انجام میشه
پس هیچوقت نمی تونیم بگیم که به طور حتم با مثلا "lezhna " روبرو میشیم که بگیم دنبال اون بگردیم

خطی که شمانوشتید چه کاری انجام میده؟
فکر میکنم آرایه رو دنبال کلمه مورد نظر می گرده؟ اگه اشتباه میگم ممنون میشم تصحیح کنید


کسی نبود در مورد این خطاها به من کمک کنه؟ من شدیدا به اون نیاز دارم:ناراحت::افسرده:

اصلا کاری که بیان کردید میخواهید انجام بدید با کدی که فرستید جور در نمیاد، جواب جناب ASKaffash بنابر کدی که فرستادید کاملا درست بود. بنابر کدتان به نظر میاد که هر ۳ تا متد فقط دنبال اینک رشته درشان وجود دارد عمل میکنند (منطقشان درست پیاده نشده).

bargesabz
سه شنبه 01 مرداد 1387, 18:00 عصر
دوباره سلام
از همه دوستان ممنونم که به من کمک کردید.به کمک شما این مشکلم حل شد
جناب اشکان
من زیاد برنامه نویسی بلد نیستم بنابر این خیلی ممنون میشم که خیلی رک و پوست کنده ازم انتقاد کنید ممکنه کمی دادو بیداد کنم ولی یاد می گیرم چه جوری برنامه نویسی کنم.

البته من هم به شما کمک خواهم کرد:شیطان:(خیالتون تخت)




کد:
if Keyw=[] tok("blah")=??اگر Tp=[]tword("زرشک")==??




اصلا اگر دستی هم هرکدام از ۳ تا متدها را امتحان کنید هیچ کدام به جز اینکه عنصر اول را با رشته مقایسه کنند (اگر آرایه خالی نباشد) کاره بیشتری انجام نمیدن.
منطق هر ۳ تا متد درست پیاده نشده.



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




یه سوال دیگه هم دارم در همین متد نوع مقدار برگردانده شده(bool) نوشتم اگه boolean می نوشتم فرقی داشت؟چون برای هردو در توضیحات می نویسه که مقدار بولین رو بر می گردونه اما boolآبی نوشته میشه اما boolean سبزکم رنگ نوشته میشه

میشه در این مورد هم کمی توضیح بدید




در آرایه زیر



string[] op ={"^","+","-","*","/","%","&","|","<","<=",">=",">","==","<>","dzh","(",")"};


من نمی تونم عملگر "\" اضافه کنم چون سیستم اونو به عنوان توضیح یایه همچین چیزهایی در نظر میگیره و خطا میگیره به نظر شما من باید چیکار کنم تا بتونم این عملگر رو هم در آرایه قرار بدم

اَرژنگ
سه شنبه 01 مرداد 1387, 18:30 عصر
چه طور فهمیدید که "هیچ کدام به جز اینکه عنصر اول را با رشته مقایسه کنند (اگر آرایه خالی نباشد) کاره بیشتری انجام نمیدن."
من متوجه نشدم



tok= "Harchi"
op[0]="Har chize digeh";
for (i = 0; i < op.Length; i++)


if (tok == op[i])
return true;
else
return false;

در آرایه زیر



string[] op ={"^","+","-","*","/","%","&","|","<","<=",">=",">","==","<>","dzh","(",")"};

من نمی تونم عملگر "\" اضافه کنم چون سیستم اونو به عنوان توضیح یایه همچین چیزهایی در نظر میگیره و خطا میگیره به نظر شما من باید چیکار کنم تا بتونم این عملگر رو هم در آرایه قرار بدم[/quote]

"\\"

در مورد تازه کار بودن ، نگران نباشید، تازه کار بودن مدت کوتاهیه. حداقل ۳ نفر را میشناسم که یکزمانی تازه کار بودند و اشکلاشان را میگرفتم، این روزها بهشان زنگ میزنم که اشکلات من را بگیرند!

bargesabz
پنج شنبه 03 مرداد 1387, 18:19 عصر
بازم سلام
من دوباره اومدم

من می خوام با لیستهای پیوندی کار کنم اما مسئله اینه که نمی دونم اصلا چه چوری معرفی میشه؟ تو چه فضایی معرفی شده ؟ دستورات حذف و درج اون چیه؟ خلاصه به غیر از مفهموم لیست پیوندی هیچی نمی دونم .یه کتاب راهنمای #Cدارم اما چیزی از اون نفهمیدم
ممنون میشم اگه دراین مورد راهنماییم کنید

Sajjad.Aghapour
پنج شنبه 03 مرداد 1387, 18:39 عصر
سلام.لیست پیوندی در سی شارپ با تعریف کلمه کلیدی ArrayList ایجاد میشه و کار کردن با اون بسیار راحت هست و در فضای نام System.Collections .
یه نمونه از add کردن


ArrayList obj = new ArrayList();
obj.Add(any Object);

Add برای اضافه کردن به لیست.
AddRange برای اضافه کردن یک ارایه به لیست
Remove برای حذف کردن یک ابجکت از لیست
RemoveAt برای خذف کردن یک ابجکت بر اساس ایندکس اون
Sort برای مرتب کردن
این چیزهایی بود که از لیست یادم بود.
ولی توضیح زیادی نمی خواد چون همه چیز واضحه.فقط کافیه امتحان کنید و نتایج رو مشاهده کنید.....

bargesabz
پنج شنبه 03 مرداد 1387, 19:52 عصر
دوست عزیز از لطف شما متشکرم
من یه سوال دیگه هم دارم هر یک از گره هایی که من در لیست پیوندی دارم بایددر قسمت dataشامل 4فیلد باشند یعنی قسمت data نود باید چهار قسمتی باشه
اینو چطوری باید معرفی کنم؟

یه چیز دیگه که بد جوری اذیتم میکنه اینکه نمی تونم ا ز دستور else if استفاده کنم
به نظر شما کد زیر چه اشکالی داره که در خطی که else if نوشته شده میگه

[ ' CODE] Invalid expression term 'else
[/code]

بعدش هم میگه در همون خط ";"نگذاشتی و بعد هم میگه جلوی else "; " نذاشتی



string t1;
t1 = textBox1.Text;
if (t1=="a")
textBox1 .Text ="1";
elseif (t1=="b")
textBox1 .Text ="2";
else


textBox1 .Text ="3";

Sajjad.Aghapour
جمعه 04 مرداد 1387, 02:46 صبح
در مورد دومی باید بگم هیچ مشکلی وجود نداره فقط فاصله بین else و if یادتون رفته.....
در مورد سوال اول....
فکر کنم شما دنبال درخت ها باشید.برای این کار میتونید از TreeNode استفاده کنید...یه مثال...


TreeNode node = new TreeNode("Node1");
node.Nodes.Add("node1", "Names");
node.Nodes["node1"].Nodes.Add("node1_Children1", "sajjad");

برای نمایش اونها هم می تونی از TreeView استفاده کنی....

bargesabz
جمعه 04 مرداد 1387, 10:08 صبح
دوباره سلام
در مورد دستور else if من چه فاصله بذارم چه نذارم خطا می گیره باور کنید داره دیونه م می کنه
در مورد سوال اول هم من نمی خوام از درخت استفاده کنم
آیا لیستها همچین امکاناتی دارند(شرایطی که من میخوام :بخش dataاون شامل 4 بخش یا 4 فیلد باشه)؟

bargesabz
جمعه 04 مرداد 1387, 14:02 عصر
بازم سلام

من تو نوشتن دستور if-else if اشکال دارم.
چیزیکه من میخوام بنویسم اینه که محتویات یک آرایه رو از اول رو بگرده اگر فاصله خالی یا کاراکترtab بود هیچ کاری نکنه اما اگر کاراکتر خط جدید بود یه شمارنده رو افزایش بده




int linenum=1;
for (int i = 0; i < text.Length; i++)
{
if (text[i] == ' ' || text[i] == '\t')
// هیچ کاری نکن
if (text[i] == '\n')
linenum++;

textBox1.Text= System.Convert.ToString(linenum );


}




در این حالت اولینif رو چک می کنه ولیif بعدی رو چک نمی کنه وبه تعداد طول آرایه حلقه رو طی میکنه و در آخر از حلقه خارج میشه و مقدار 1 رو چاپ می کنه (اگر ifهایی دیگر هم باش آنها را چک میکند اما فقط دومی رو چک نمی کنه)

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


ولی اگه به صورت زیر بنویسم



int linenum=1;


for (int i = 0; i < text.Length; i++)
{
if (text[i] == ' ' || text[i] == '\t')
//هیچکاری نکن
else if (text[i] == '\n')
linenum++;
textBox1.Text = System.Convert.ToString(linenum );


}




خطی که else if در آن است رو خطا میگیره و میگه


' Invalid expression term 'else

وخطای بعدی هم میگه در همون خط ";"نگذاشتی


ممنون میشم یکی به من بگه که اشکال این کد چیه؟ و چه جوری باید بنویسمش؟

(در مورد دستور ELSE IF واقعا مشکل دارم چون هر برنامه ای که با ابن دستور نوشتم این ایراد رو داره)

bargesabz
جمعه 04 مرداد 1387, 15:16 عصر
سلام
جواب مشکل اولم روپیدا کردم

من می خوام بدونم اگر قرار باشد در ازای یک شرط کاری انجام ندهیم آن را چگونه باید بنویسیم

باید بعد از دستور if یه دونه ; بذاریم





if (text[i] == ' ' || text[i] == '\t')
; // هیچ کاری نکن