PDA

View Full Version : مشکل در فهم کد!



cloudy day
یک شنبه 04 بهمن 1388, 08:52 صبح
سلام
میشه یه نفر لطف کنه بگه این تکه کد چیکار میکنه؟؟


int y = (int)(110 * Math.Sin(sec * Math.PI / 30));
int signy = y / Math.Abs(y);
for (int i = 0; i < Math.Abs(y); i++)
{
int x = (int)(signy * i / Math.Tan (sec * Math.PI / 30));
*(S + (signy * i + 129) * 257 + x + 129) = Color.Red.ToArgb();
}

slashslash2009
یک شنبه 04 بهمن 1388, 09:53 صبح
فکر کنم موج سینوسی چیزی باشه

اَرژنگ
یک شنبه 04 بهمن 1388, 10:13 صبح
سلام
میشه یه نفر لطف کنه بگه این تکه کد چیکار میکنه؟؟


int y = (int)(110 * Math.Sin(sec * Math.PI / 30));
int signy = y / Math.Abs(y);
for (int i = 0; i < Math.Abs(y); i++)
{
int x = (int)(signy * i / Math.Tan (sec * Math.PI / 30));
*(S + (signy * i + 129) * 257 + x + 129) = Color.Red.ToArgb();
}


بهم ریختگیش نشان دهنده این است که یک ناشی سرهمش کرده، و توصیه من این است که به جایه اینکه زمانتان را به تحلیل کردن اینگونه کدها هدر بدید، زمانتان را صرف یکی از موارد زیر کنید:
۱.کدهایه که قابلیت خانایی بالایی را دارند تحلیل کنید چونکه به احتمال زیاد توسط یک حرفه‌ای نوشته شدند.
۲.همینطوری به هر کدی توجه نکنید، اگر برایه کاری هدفی دارید ، کدهایی را که برایه رسیدن به هدفتان به کارتان میاند را مورد توجه‌تان قرار بدید.

سوال "این تکه کد چکار میکنه؟" در این مورد مانند این میماند که خط خطی یک بچه ۲ ساله را نشان بدید و بپرسید که "این نوشته‌ها یعنی چی؟"

cloudy day
یک شنبه 04 بهمن 1388, 10:45 صبح
من فراموش کردم که تعریف متغیر secو S را داخل کد قرار بدم:


int* S = (int*)s.Scan0.ToPointer();



int mainsec = DateTime.Now.Second;
int sec = mainsec - 15;

حالا میتونید بگین این کد چیه؟؟(لازم به ذکر است که این کد نه توسط یک فرد ناشی نوشته شده نه موج سینوسیه!!!!)

اَرژنگ
یک شنبه 04 بهمن 1388, 10:55 صبح
حالا میتونید بگین این کد چیه؟؟(لازم به ذکر است که این کد نه توسط یک فرد ناشی نوشته شده نه موج سینوسیه!!!!)

۱.لطفاً کد کامل تصحیح شده را بفرستید
۲.این تیکه کد به خودی خود کافی نیست، در این حالت بهترین توضیحی که میشه برایه این کد داد خودش است.
۳.کدی که گنگ و نامفهوم باشد حاصل کار یک ناشی است وگرنه برنامه‌نویس برایه خانایی کدش تلاش میکنه و به این شکل کد به هم نمیبافه که یکی مجبور بشه برایه درکش از بقیه کمک بخواهد.
۴. این کد در کجا استفاده شده؟ بقیه کد قبل و بعدش کجاست؟ متد کامل را بفرستید

اَرژنگ
یک شنبه 04 بهمن 1388, 11:15 صبح
اشکالات کد :


int y = (int)(110 * Math.Sin(sec * Math.PI / 30));
int sec = mainsec - 15;

استفاده از اعداد سحر آمیز )magic numbers):
۱۵، ۱۱۰ و ۳۰ از آسمان نازل شدند و در مورد معنی و مفهومشان نمیشه چیزی گفت. اشتباه بودن این روش جزو اولین مباحث )قبل از( شروع برنامه نویسی است.


int signy = y / Math.Abs(y);

احتیاجی به این خط نیست، متد Math.Sign
http://msdn.microsoft.com/en-us/library/system.math.sign.aspx
برایه همین کار است.


*(S + (signy * i + 129) * 257 + x + 129) = Color.Red.ToArgb();

این خط حتی در سی‌شارپ کد حساب نمیشه چه برسه به اینکه بخاهیم در موردش توضیح بدیم.

لطفاً در مورد اینکه شما هدفتان چی هست و به چه نیاز دارید توضیح بدید، چونکه با اطلاعاتی که در این مورد در اختیارمان گذاشته شده تفکر کردن بر این کد وقت هدر دادن است.

cloudy day
یک شنبه 04 بهمن 1388, 11:41 صبح
ای بابا...
اینم "قسمتی" از کد کامل:


unsafeprivatevoid DrawClock(BitmapData s)
{
int* S = (int*)s.Scan0.ToPointer();
for(int x=0;x<257;x++)
for(int y=0;y<257;y++)
*(S + y * 257 + x) = Color.White.ToArgb();
//Draw Second Hand
int mainsec = DateTime.Now.Second;
int sec = mainsec - 15;
if (((mainsec > 7) && (mainsec <= 22)) || ((mainsec > 37) && (mainsec <= 52)))
{
int x = (int)(110 * Math.Cos(sec * Math.PI / 30));
int signx = x / Math.Abs(x);
for (int i = 0; i < Math.Abs(x); i++)
{
int y = (int)(signx * i * Math.Tan(sec * Math.PI / 30));
*(S + (y + 129) * 257 + signx * i + 129) = Color.Red.ToArgb();
}
}
else
{
int y = (int)(110 * Math.Sin(sec * Math.PI / 30));
int signy = y / Math.Abs(y);
for (int i = 0; i < Math.Abs(y); i++)
{
int x = (int)(signy * i / Math.Tan (sec * Math.PI / 30));
*(S + (signy * i + 129) * 257 + x + 129) = Color.Red.ToArgb();
}
}


این کد داره یک ساعت رسم میکنه و من میخاستم کدرا تبدیل کنم برای همین میخاستم بدونم اون قسمت کد "دقیقا" چیکار میکنه؟!! (ولی ظاهرا خودم بیشتر میدونم!)
از تلاشتون برای پاسخ متشکرم!
اگه تونستین کمکم کنید ممنون میشم

اَرژنگ
یک شنبه 04 بهمن 1388, 11:43 صبح
کد رسم ساعته، ولی چی کار می کنه را نمی دونم.......:چشمک::لبخند:

کد رسمه ساعت از این خیلی ساده‌تره، احتیاجی به استفاد از تانژانت، سیگنوم و اعداد ۱۵، ۱۱۰ و ۳۰ ندارد.
این کد استفاده‌ای برایه رسم ساعت ندارد.

اَرژنگ
یک شنبه 04 بهمن 1388, 11:52 صبح
ای بابا...

این کد داره یک ساعت رسم میکنه و من میخاستم کدرا تبدیل کنم برای همین میخاستم بدونم اون قسمت کد "دقیقا" چیکار میکنه؟!! (ولی ظاهرا خودم بیشتر میدونم!)
از تلاشتون برای پاسخ متشکرم!
اگه تونستین کمکم کنید ممنون میشم

اون کد برایه سلامتی روحی برنامه‌نویس مضر است!
و هر زمانی اگر به کد گنگ برخوردید از خودتان بپرسید که واقعا نمیشه از این ساده‌تر باشد ؟
در گوگل C# Clock را جستجو کنید مثال زیاد پیدا میکنید.
یک مثالش این: http://www.codeproject.com/KB/selection/AnalogClockControl.aspx
به نظر من کدش زیاد بد نبود ولی اگر چه الان قدیمی شده از این کدی که شما سرتان باهاش درد آوردید ساده‌تر است.

lvlina_r
یک شنبه 04 بهمن 1388, 12:01 عصر
آقای ارژنگ، اینجور که من می دونم باید حتما همین کد را تبدیل کنند، اگر می تونید این کد را توضیح بدید، توضیح بدید....، اگه نه هم هیچی.....

اَرژنگ
یک شنبه 04 بهمن 1388, 12:21 عصر
آقای ارژنگ، اینجور که من می دونم باید حتما همین کد را تبدیل کنند، اگر می تونید این کد را توضیح بدید، توضیح بدید....، اگه نه هم هیچی.....

یعنی چی باید همین کد را تبدیل کنند؟
کدام آدم عاقلی زمانش را میزاره که رویه الاغ کولر نصب کنه؟
توضیح من در مورد اون کد این بود که اتلاف زمان است، حیف وقت و زمان است که زمانی که از ۱۰۰ جایه مختلف میشه کدهایه تمیزتر و بهتر بدست آورد زمانشان را با کار کردن بر رویه یک کد گنگ و خراب هدر بدن.
اگر واقعا دلیلی وجود دارد که یک کد آشغالی را هکه را که باید به جایه اوراغ دور ریخته بشه را با کلی زحمت تمیزکاری کنند که به یک حالت قابل استفاده برسه به جایه اینکه از کدهایی که ۱۰۰ بار تمیزتر و بهتر نوشته شدن و حاظر آماده وجود دارند استفاده کنند یکی دلیلش را بگه که من هم یک چیزی یاد بگیرم.

کمک این نیست که وقتی یک نفر تو ماشین نشته به یکنفر که دارد پیاده میره بگه شهر بعدی کجاست.میگه بیا بالا برسونمت.

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

بر چه منطقی میشه زمان مردم را بر رویه یک کد آشغال هدر داد ؟

FastCode
یک شنبه 04 بهمن 1388, 18:05 عصر
اون قسمت در واقع یه کد بی نهایت optimize نشدست برای کپی کردن عدد 255 = Red توی چند بایت از حافظه, برای نشان دادن به user.
و آدرس دهی دو بعدی در حافظه ی یک بعدی.(احمقانه ترین کار دنیا برای یک ساعت, من این کار رو برای 100MB دیتا انجام ندادم چون 3% optimize ارزشش رو نداه) البته این کد اونقدر افتضاح(حرف دل) نوشته شده که سرعت رو 1/10 میکنه.

rezatati
سه شنبه 06 بهمن 1388, 20:26 عصر
این هم یک ساعت خوشگل به قول دوستامون وقتی که یه چیزی آماده هستش اون هم به صورت اوپن سورس دیگه چه لزومی داره که به خودمون زحمت درک این کدها رو بدیم بهتره که انرژیمون رو برای کارهای بهتری صرف کنیم اگه کسی خواست سورس کدشو هم میزارم