مشکل تعجب انگیز در ویژوال استودیو 2010
سلام به همه دوستان؛
در رابطه با اجرای گام به کام برنامه در ویژوال استودیو، سوالی داشتم که برای خودم هم تعجب انگیز هست!
وقتی برنامه رو به صورت معمولی اجرا میکنم، پس از مقداری اجرا ظاهرا" وارد یک حلقه ی بی نهایت میشه که با توجه به درست بودن منطق برنامه، چنین چیزی امکان پذیر نیست.
به همین خاطر برای یافتن مشکل برنامه رو گام به گام اجرا کردم؛ و به یک مشکل تعجب برانگیز رسیدم؛
اینکه پس از مدتی اجرای برنامه، وقتی داخل یک تابع مشخص میشه، بدون اجرای کامل تابع، از آن خارج شده و به نقطه ی فراخوانی بازگشته و به اجرای برنامه ادامه میدهد و
گویا همین مشکل باعث حلقه ی بی نهایت در برنامه میشه.
دوستان اگر میدونند که این مشکل به چه دلیلی پیش میاد، لطفا راهنمایی کنند.
ممنون.
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
نقل قول:
نوشته شده توسط
parvizwpf
کد رو بزارید لطفا
کد قسمتی از برنامه که مربوط به مشکل میشه:
private void button4_Click(object sender, EventArgs e)
{
List<string> ips = ipCollector();
SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=sitelog;Integrated Security=True;");
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT ip,rday,rhour,rminute,userAgent FROM requests WHERE ip=@p1";
cmd.Parameters.Add("@p1",SqlDbType.NVarChar);
for (int i = 0; i < ips.Count; i++)
{
List<List<string>> iprequests = new List<List<string>>();
cmd.Parameters["@p1"].Value = ips[i];
con.Open();
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
List<string> request = new List<string>();
request.Add(rd["ip"].ToString());
request.Add(rd["rday"].ToString());
request.Add(rd["rhour"].ToString());
request.Add(rd["rminute"].ToString());
request.Add(rd["userAgent"].ToString());
iprequests.Add(request);
}
con.Close();
agentFrequency(iprequests);
}
}
private void agentFrequency(List<List<string>> temp)
{
string agentFrequence = null;
SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=sitelog;Integrated Security=True;");
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO UAFrequency VALUES(@p1,@p2)";
cmd.Parameters.Add("@p1",SqlDbType.VarChar);
cmd.Parameters.Add("@p2",SqlDbType.NText);
List<int> time = new List<int>();
time.Add(int.Parse(temp[0][1]));
time.Add(int.Parse(temp[0][2]));
time.Add(int.Parse(temp[0][3]));
List<int> upRange = timeIterator(time);
bool finish=false;
int ipNum = 0;
while(!finish)
{
List<string> userAgent = new List<string>();
int agentCounter = 0;
for (int j = ipNum; j < temp.Count; j++)
{
if (int.Parse(temp[j][1]) == upRange[0])
{
if (int.Parse(temp[j][2]) == upRange[1])
{
if (int.Parse(temp[j][3]) <= upRange[2])
{
ipNum++;
if (!(agentController(userAgent, temp[j][4])))
{
agentCounter++;
userAgent.Add(temp[j][4]);
}
}
}
else if (int.Parse(temp[j][2]) < upRange[1])
{
if (int.Parse(temp[j][3]) > upRange[2])
{
ipNum++;
if (!(agentController(userAgent, temp[j][4])))
{
agentCounter++;
userAgent.Add(temp[j][4]);
}
}
}
}
else if (int.Parse(temp[j][1]) < upRange[0])
{
if (int.Parse(temp[j][2]) > upRange[1])
{
if (int.Parse(temp[j][3]) > upRange[2])
{
ipNum++;
if (!(agentController(userAgent, temp[j][4])))
{
agentCounter++;
userAgent.Add(temp[j][4]);
}
}
}
}
}
agentFrequence += (agentCounter.ToString()) + ",";
upRange = timeIterator(upRange);
if (ipNum >= temp.Count)
{
finish = true;
}
}
cmd.Parameters["@p1"].Value=temp[0][0];
cmd.Parameters["@p2"].Value = agentFrequence;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
private bool agentController(List<string> agents, string usedAgent)
{
bool inList = false;
for (int i = 0; i < agents.Count; i++)
{
if (agents[0] == usedAgent)
inList = true;
}
return inList;
}
private List<int> timeIterator(List<int> temp)
{
List<int> upRange = new List<int>();
int rday = temp[0];
int rhour=temp[1];
int rminute = temp[2];
if (((rminute + 30) / 60) > 0)
{
rminute = (rminute + 30) % 60;
if ((rhour + 1) / 24 == 0)
{
rhour++;
}
else if ((rhour + 1) / 24 > 0)
{
if (((rday + 1) / 30) > 0)
{
rday = (rday + 1) % 30;
}
else
rday++;
}
}
else
rminute+=30;
upRange.Add(rday);
upRange.Add(rhour);
upRange.Add(rminute);
return upRange;
}
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
بابا دمت گرم الان چی به چیه کدوم لوپ گیر میکنه؟
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
نقل قول:
نوشته شده توسط
parvizwpf
بابا دمت گرم الان چی به چیه کدوم لوپ گیر میکنه؟
با توجه به اینکه تابع timeIterator زمان رو 30 دقیقه به 30 دقیقه جلو میبره، تابع agentFrequency از این تابع توی پایان حلقه های For و داخل حلقه while استفاده میکنه.
مشکلی که هست اینه که، پس از گذشت مدتی از اجرای برنامه، تابع timeIterator کامل طی نمیشه و پس از طی مثلا یکی دو دستور از این تابع، خارج شده و به تابع قبلی یعنی
agentFrequency برمیگرده که ظاهرا" همین مشکل باعث خارج نشدن از حلقه ی while میشه چرا که شرط خارج شدن از حلقه ی while رسیدن ipNum به یه مقدار خاص هست و
این متغیر توی if ها مقدارش افزایش پیدا میکنه که ظاهرا" بخاطر عدم طی شدن صحیح تابع timeIterator، شرط های if ها صحیح در نمیاد و این متغیر هم به مقدار مورد نظر نمیرسه و
گویا همین نکته هم باعث میشه تا حلقه ی بی نهایت while ایجاد بشه.
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
من واقعا نمیدونم چی بگم. بنظرم خودت تریس کنی بهتر باشه. چون من گیچ شدم واقعا و نمیتونم تمرکز کنم رو کدت. شرمنده دوست عزیز.معمولا وقتی این اتفاق رخ میده که زمانی که داره توی حلقه سپری میشه توسط جاهای دیگر برنامه تلف بشه.
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
نقل قول:
نوشته شده توسط
parvizwpf
من واقعا نمیدونم چی بگم. بنظرم خودت تریس کنی بهتر باشه. چون من گیچ شدم واقعا و نمیتونم تمرکز کنم رو کدت. شرمنده دوست عزیز.معمولا وقتی این اتفاق رخ میده که زمانی که داره توی حلقه سپری میشه توسط جاهای دیگر برنامه تلف بشه.
خب خیلی ممنون از نظرتون؛ اما برای حل همین مشکلی که گفتین، چه میشه کرد؟
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
دلیل این عدم تمرکز اینه که کد ایشون به قول گفتنی کثیف نوشته شده. بهتره کدشو تمیز بنویسه و اگر میتونه در قالب یه پروژه بزاره تا تست کنیم
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
من وافعا شرمنده ام. برای حل اون مشکل خب ببیند مشکلی نیست که بگید باید پیدا بشه. شما باید کدتون رو از گره هایی که ممکنه وجود داشته باشه رهایی بدید میگم من احساسم اینه که مشکل توی زمانبندیه اجرای حلقه هاست تا جایی که تجربه کوچک من جوابگوست.مطمئنا با تریس میتونید گیرش رو رفع کنید. حلاصه عذر تقصیر.
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
فکر میکنم از توابع بازگشتی استفاده میکنی(توابعی که خودشون رو فراخوانی میکنند) ، که اگه دقت لازم را نداشته باشی وارد حلقه بینهایت میشه ، حلقه لزوما با for ایجا دنمیشه.
نقل قول: مشکل تعجب انگیز در ویژوال استودیو 2010
من از کدت زیاد سر در نیاوردم ولی شاید به خاطر اینه که داخل شرط حلقه هات از > استفاده کردی باید از => استفاده بکنی