سلام ، آیا این بازدید اول شماست ؟ یا
تبلیغات در این انجمن
×
+
سفارش تبلیغات
صفحه 2 از 12 اولیناولین 1234 ... آخرینآخرین
نمایش نتایج: از شماره 11 تا 20 از مجموع 120

موضوع: مباحث نرم افزار AutoPlay Media Studio

  1. #11
    عضو ممتاز
    تاریخ عضویت
    Apr 2014
    ارسال ها
    238
    تشکر تشکر کرده 
    508
    تشکر تشکر شده 
    1,178
    اعتبار کاربر
    1

    پیش فرض

    نقل قول نوشته اصلی توسط SajjadKhati نمایش پست ها
    استاد Media Stream (و بقیه ی اساتیدا) ، کسی میدونه که چجوری تو AMS قابلیت درگ و دروپ فایل (نه شی برای جابجایی تو صفحه) از خارج به داخل نرم افزار رو میشه فعال کرد و بشه تو خروجی تابع مورد نظر، مسیر فایل دروپ شده تو نرم افزار رو بدست آورد؟ البته منظورم فایل dll با تابع خاص تو نرم افزار دیگه نیست. حداکثر بشه با api خود ویندوز این کار رو کرد.
    من دو تا تابع api گرفتم اما هیچ کدومش رو بلد نیستم که چجوری درگ و دروپ شو باهاش کار کنم . این دو تان :

    SetWindowLong function (Windows)

    DoDragDrop function (COM)

    تو تابع SetWindowsLong ، تو قسمت Extended Window Styles ، ثابت WS_EX_ACCEPTFILES رو مقداردهی میکنم ، تهش فقط فایل رو که درگ و دروپ تو پروژه میکنم ، علامت درگ و دروپ میاد (علامت شکل به اضافه موقه کشیدن رو پروژه میاد) اما مهم برام خروجی مسیر فایل هست رو نمیدونم اون تابع نمیده یا من بلد نیستم ، کلا نمیتونم خروجی مسیر فایل رو دربیارم
    اگه کسی بلده بگه ، ممنون میشم
    جناب SajjadKhati لطفا بنده ی حقیر را که مقدار جهلم بینهایت برابر مقدار علمم هست استاد خطاب نفرمائید چون ممکنه دچار دیو غرور بشم ، و یادتون باشه که ما انسانها هرچی بلد هستیم از لطف خداوند و دیگرانسانها (بوسیله ی کتابها ، فیلمهای آموزشی ، کلاسها و . . . ) آموختیم ، پس وظیفه داریم که بدون هیچ چشمداشت و منتی این اطلاعات ناچیز را به دیگران نیز منتقل کنیم .

    اگر قصد دارین از API برای اینکار استفاده کنید ، بهتره که API های قدرتمندShell Functions Windows را بکار ببرین ، توابع شل مربوط برای مربوطه عبارتند از :
    DragQueryFile, DragQueryPoin, and DragFinish
    برای بدست آوردن فایل درگ شده باید از DragQueryFile استفاده کنید ، برای اطلاعات بیشتر این صفحه را ببینید :
    DragQueryFile function (Windows)

    همچنین در صورتیکه پلاگینی برای AMS در این مورد موجود باشه میتونین ازش استفاده کنید.
    با تمام خردمندان و صنعت گران و سیاست مداران بحث و گفتگو کردم ، همه گمان می کردند که دانایند ، اما هیچ چیز نمی دانستند و جاهلی بیش نبودند ، و دانستم که هر که میگوید چیزی بلدم مطمئنن دیگر نمی تواند آنرا فرا بگیرد ، اما بعد از عمری جهالت با مطالعه و جستجو و پرس و جو و تجربه مطمئن شدم که خودم یک چیز را می دانم و در آن شکی ندارم اینکه
    می دانم که هیچ نمی دانم
    سقراط حکیم

  2. کاربران : 3 تشکر کرده اند از شما Media Stream برای ارسال این پست سودمند:


  3. #12
    عضو ممتاز
    تاریخ عضویت
    Apr 2014
    ارسال ها
    238
    تشکر تشکر کرده 
    508
    تشکر تشکر شده 
    1,178
    اعتبار کاربر
    1

    پیش فرض

    نقل قول نوشته اصلی توسط SajjadKhati نمایش پست ها
    استاد میدونم اذیت تون میکنم اما اگه این سئوال رو جواب شو میدونین ، ازم دریغ نکنین (خیلی این سئوال برام مهمه و گیره کارم توش) :
    اینکه تو iterator ها تو لوا ، خط سوم و چهارم تو کد زیر (متغییر op و ln) چرا تو تکرار دفعه ی بعد ، اضافه نمیشن؟ دفعه ی اول خوبه اما دفعه ی دوم به بعد ، نمیدونم چرا بازم مقادیر اولیه اش رو میگیره (ln تو اجرای بار دوم نمیدونم مقدار 1 اش رو از کجا میگیره . مقدار اولیه ی ln که 10 هه) :

    کد:
    function Abc(op,ln)
    Dialog.Message("2", "op : "..op.."\nln : "..ln, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    op=op+1
    ln=ln-1
    Dialog.Message("5", "op : "..op.."\nln : "..ln, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
        if op~=10 then
        return op,ln
        else
        return nil
        end
    end
    
    
    
    
    for Val,gig in Abc,0,10 do
    Dialog.Message("Notice", "Val : "..Val.."\ngig : "..gig, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    end
    ممنون میشم جواب این سئوال مو زودتر بدین چون همین تیکه هی تو مغزمه و جلوتر نمیرم
    ویرایش :

    مقدار برگشتی تابع را از return op,ln به return op,ln تغییر بدین تا برنامتون درست کار کنه.

    در ضمن بهتره شرط موجود در تابع را از if op~=10 then به شرط مناسبتری نظیر if op~=ln then تغییر بدین.


    البته اگر نخواین به مقدار برگشتی تابع دست بزنید باید حلقه را از for Val,gig in Abc,0,10 do به for Val,gig in Abc,10,0 do و همچنین شرط و شمارنده های داخل تابع را نیز تغییر دهید

    اما علت بروز این مشکل :

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


    شما باعث شدین که من سورس لوا را دانلود کنم و یک نگاهی بهش بندازم. متشکر
    ویرایش توسط Media Stream : 19-01-2015 در ساعت 20:17
    با تمام خردمندان و صنعت گران و سیاست مداران بحث و گفتگو کردم ، همه گمان می کردند که دانایند ، اما هیچ چیز نمی دانستند و جاهلی بیش نبودند ، و دانستم که هر که میگوید چیزی بلدم مطمئنن دیگر نمی تواند آنرا فرا بگیرد ، اما بعد از عمری جهالت با مطالعه و جستجو و پرس و جو و تجربه مطمئن شدم که خودم یک چیز را می دانم و در آن شکی ندارم اینکه
    می دانم که هیچ نمی دانم
    سقراط حکیم

  4. کاربران : 3 تشکر کرده اند از شما Media Stream برای ارسال این پست سودمند:


  5. #13
    عضو متخصص
    تاریخ عضویت
    Sep 2014
    ارسال ها
    1,773
    محل سکونت
    مازندران
    تشکر تشکر کرده 
    3,259
    تشکر تشکر شده 
    4,273
    اعتبار کاربر
    1

    پیش فرض

    نقل قول نوشته اصلی توسط Media Stream نمایش پست ها
    ویرایش :

    اما اگر اینجوری نبود بهم اطلاع بدین تا ایراد رو بعدا پیدا کنم ، آخه من الان در لینوکس هستم و دسترسی به AMS و لوا ندارم و مدت زیادی هست که با هاشون کار نکردم
    ممنون استاد
    حلقه for نه
    iterator ها یه بخشی شون حلقه for هه که فرق داره یه کمی با حلقه ی for
    حلقه ی for ، تو لوا ساختارش به این صورته (که تو اغلب زبان ها همینطوره تقریبا) :

    کد:
    for i=1,5,2 do
    Dialog.Message("Notice", i, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    end
    که تو اینجا 1 مقدار شمارنده هه و تا دومین عدد که 5 هست ، 5 بار تکرار میشه اما به شرط عدد سوم که 2 هست ینی 2 تا 2 تا هر بار به متغییر i اضافه میشه پس کلا 3 بار تکرار میشه (اولین بار i برابر 1 هه و دومین بار 2 تا بالاتر 3 و بعدشم 5 که تموم میشه)
    البته این توضیحات بی ادبی هه در مقابل شما میگم چون ممکنه ساختارهای زبون های دیگه فرق کنه یه کم میگم
    اما تو iterator ها ، قضیه اش یه کم فرق میکنه .
    آموزش شون یه کم اینجا هست :

    Programming in Lua : 7.3

    Programming in Lua : 7.4

    Programming in Lua : 7.5

    Programming in Lua : 7.1

    Programming in Lua : 7.2

    تو ایتریتورها که یک نوعش تو بالا هست یه تابع رو تا مقدارش nil یاپوچ شه (تا nil رو برگردونه) ادامه و تکرا میشه که تکرار اون تابع (یا ایتریتور) با استفاده از حلقه های تکرار انجام میشه مثل for
    ساختارشم این طوره که تو حلقه ی for ، اسم تابعی که میخایم تکرار بشه رو فراخونی میکنیم البته با دادن مقادیر توش
    تو مثال 3 پست قبل ، تو خطی که حلقه ی for نوشته شد ، abc یعنی تابع abc رو تکرار کن و بعد از اون پارامترها یا همون آرگومان هاش مقداردهی شد . همونطور که معلومه بعد از فراخونی abc تو خط حلقه ی for ، عدد 0 داده شد که بجای آرگومان اولیه ی تابع abc یعنی بجای op مقدار دهی و جایگذاری میشه و دومین عدد هم که 10 هست بجای آرگومان دوم که ln هست
    سئوال من الان اینه که چرا برای بار دوم به بعد قاتی میشن عددها مخصوصا مقدار ln که اصلا معلوم نیست از کجا آورده میشه
    البته مجبورتون نمیکنم که جواب بدین . هر جور راحتین
    ممنون که تا حالا هم جواب دادین
    دانلود فیلم آموزش برنامه نویسی Visual Studio C#.NET
    فیلم آموزش کامل Autoplay Media Studio


    وقتی انسان ، حیوان هست ، پس قیمت میتونی براش بذاری ولی وقتی انسان حَیّ متاله هست که قیمت نداره ، بها داره. "دکتر حسن عباسی"


  6. کاربران : 3 تشکر کرده اند از شما SajjadKhati برای ارسال این پست سودمند:


  7. #14
    عضو ممتاز
    تاریخ عضویت
    Apr 2014
    ارسال ها
    238
    تشکر تشکر کرده 
    508
    تشکر تشکر شده 
    1,178
    اعتبار کاربر
    1

    پیش فرض

    نقل قول نوشته اصلی توسط SajjadKhati نمایش پست ها
    ممنون استاد
    حلقه for نه
    iterator ها یه بخشی شون حلقه for هه که فرق داره یه کمی با حلقه ی for
    حلقه ی for ، تو لوا ساختارش به این صورته (که تو اغلب زبان ها همینطوره تقریبا) :

    کد:
    for i=1,5,2 do
    Dialog.Message("Notice", i, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    end
    که تو اینجا 1 شمارنده هه و تا دومین عدد که 5 هست ، 5 بار تکرار میشه اما به شرط عدد سوم که 2 هست ینی 2 تا 2 تا هر بار به متغییر i اضافه میشه پس کلا 3 بار تکرار میشه (اولین بار i برابر 1 هه و دومین بار 2 تا بالاتر 3 و بعدشم 5 که تموم میشه)
    البته این توضیحات بی ادبی هه در مقابل شما میگم چون ممکنه ساختارهای زبون های دیگه فرق کنه یه کم میگم
    اما تو iterator ها ، قضیه اش یه کم فرق میکنه .
    آموزش شون یه کم اینجا هست :

    Programming in Lua : 7.3

    Programming in Lua : 7.4

    Programming in Lua : 7.5

    Programming in Lua : 7.1

    Programming in Lua : 7.2

    تو ایتریتورها که یک نوعش تو بالا هست یه تابع رو تا مقدارش nil یاپوچ شه (تا nil رو برگردونه) ادامه و تکرا میشه که تکرار اون تابع (یا ایتریتور) با استفاده از حلقه های تکرار انجام میشه مثل for
    ساختارشم این طوره که تو حلقه ی for ، اسم تابعی که میخایم تکرار بشه رو فراخونی میکنیم البته با دادن مقادیر توش
    تو مثال 3 پست قبل ، تو خطی که حلقه ی for نوشته شد ، abc ینی تابع abc رو تکرار کن و بعد از اون پارامترها یا همون آرگومان هاش مقداردهی شد . همونطور که معلومه بعد از فراخونی abc تو خط حلقه ی for ، عدد 0 داده شد که بجای آرگومان اولیه ی تابع abc یعنی بجای op مقدار دهی و جایگذاری میشه و دومین عدد هم که 10 هست بجای آرگومان دوم که ln هست
    سئوال من الان اینه که چرا برای بار دوم به بعد قاتی میشن عددها مخصوصا مقدار ln که اصلا معلوم نیست از کجا آورده میشه
    البته مجبورتون نمیکنم که جواب بدین . هر جور راحتین
    ممنون که تا حالا هم جواب دادین

    از توضیحات خوبتون بسیار ممنونم ، بی ادبی چرا باشه برادر عزیز توضیحات و صحبتهای علمی اصلا بی ادبی نیست ، زمانی کسی این چیزها را بی ادبی تلقی میکنه که خیلی خودشه رو عالم و استاد بدونه . . . اما خوشبختانه با اشتباهی که من کردم خوب شد که شما بهتر متوجه شدین که من هم چیز زیادی بلد نیستم و مثل شما تا آخر عمر جویای علم هستم نه استاد.
    بقول بزرگان "همه چیز را همگان دانند"

    جواب صحیح سوالتون را در همون پست قبلی نوشتم.
    با تمام خردمندان و صنعت گران و سیاست مداران بحث و گفتگو کردم ، همه گمان می کردند که دانایند ، اما هیچ چیز نمی دانستند و جاهلی بیش نبودند ، و دانستم که هر که میگوید چیزی بلدم مطمئنن دیگر نمی تواند آنرا فرا بگیرد ، اما بعد از عمری جهالت با مطالعه و جستجو و پرس و جو و تجربه مطمئن شدم که خودم یک چیز را می دانم و در آن شکی ندارم اینکه
    می دانم که هیچ نمی دانم
    سقراط حکیم

  8. کاربران : 3 تشکر کرده اند از شما Media Stream برای ارسال این پست سودمند:


  9. #15
    عضو متخصص
    تاریخ عضویت
    Sep 2014
    ارسال ها
    1,773
    محل سکونت
    مازندران
    تشکر تشکر کرده 
    3,259
    تشکر تشکر شده 
    4,273
    اعتبار کاربر
    1

    پیش فرض

    نقل قول نوشته اصلی توسط Media Stream نمایش پست ها
    ویرایش :

    مقدار برگشتی تابع را از return op,ln به return op,ln تغییر بدین تا برنامتون درست کار کنه.

    در ضمن بهتره شرط موجود در تابع را از if op~=10 then به شرط مناسبتری نظیر if op~=ln then تغییر بدین.


    البته اگر نخواین به مقدار برگشتی تابع دست بزنید باید حلقه را از for Val,gig in Abc,0,10 do به for Val,gig in Abc,10,0 do و همچنین شرط و شمارنده های داخل تابع را نیز تغییر دهید

    اما علت بروز این مشکل :

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


    شما باعث شدین که من سورس لوا را دانلود کنم و یک نگاهی بهش بندازم. متشکر
    ممنون استاد بابت وقتی که گذاشتین
    البته امروز که یه کم بیشتر بررسی کردم ، نکات بیشتری فهمیدم
    iterator ، اغلب تا اونجایی که من فهمیدم ، تکرار یه تابع با استفاده از حلقه هایی مثل for و while هه تو لوا تا اینکه اولین مقدار بازگشتی تابع مورد نظر ، nil بشه (حتما باید اولین مقدارش nil بشه نه دومین یا چندمین) یعنی دیگه مثل حلقه های عادی ، شمارنده نداره چون این قدر تکرار میشه که اولین مقدار تابع مورد نظر ، nil رو برگردونه
    یه نکته ی دیگه فهمیدم اینه که برا فراخونی یه تابع ایتریتور توی یه حلقه (مثلا حلقه ی for) ، هیچ وقت نمیتونه اون تابع ایتریتور ، بالای 2 آرگومان یا ورودی رو بپذیره (مقدار بازگشتی یا خروجی تابع ایتریتور میتونه هر چند تا که خاست باشه)
    همون مثال بالا رو با یه تغییر کوچیک بزارم :

    کد:
    function Abc(op,ln)
    Dialog.Message("2", "op : "..op.."\nln : "..ln, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    op=op+1
    ln=ln-1
    Dialog.Message("5", "op : "..op.."\nln : "..ln, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
        if ln~=1 then
        return ln,op
        else
        return nil
        end
    end
    
    
    
    
    for Val,gig in Abc,0,10 do
    Dialog.Message("Notice", "Val : "..Val.."\ngig : "..gig, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    end
    خوب مثل قبلی ، اولین بار که تو حلقه ی for ، تابع ایتریتورمون که ABC هه فراخونی شد ، اولین آرگومان این تابع که op هست همون برابر میشه با اولین مقداری که تو آرگومانش تو حلقه ی for جایگزین کردیم یعنی op برابر میشه با 0 و دومین متغییر و آرگومان این تابع که ln هست برابر دومین آرگومان که 10 هست
    نکته ای که باعث میشد آدم گیج بشن تو ایتریتورها اینه که همیشه اولین آرگومان که مقدار دهی شد (یعنی مقدار op تو بالا) ، ثابت هست و هر تغییری هم که کنه ، تو تکرار بار بعد ، دوباره همون مقدار اولی ای که دادیم میشد . اما آرگومان دوم تابع ایتریتور (ln) همیشه برابر با اولین مقدار بازگشتی تابع بازگشتی تابع ایتریتور میشه (لازم نیست مثل ایم مثال بالا ، حتما هر دو یک نام باشن یعنی آرگومان دوم و مقدار بازگشتی اولی که هر دو اسمشون ln باشه . حتی اگه اسم شون و حتی الگوریتم شون هم فرق کنه ، بازم این قضیه صادق هه که مثال شو تو زیر میگم). یعنی تو تکرار بار بعد تابع ایتریتور ، آرگومان دومی (ln) برابر با اولین خروجی یا اولین مقدار بازگشتی دفعه ی قبل این تابع میشه
    نکته ی بعد هم اینکه تو تابع ایتریتور ، متغییر محلی (local) تا آخرین دور تکرارتابع (در طول تکرار) ، مثل متغییر معمولی ، مقدارش پابرجا میمونه و حذف نمیشه (البته اگه تو تابع iterator یعنی تو تابع Abc تعریف شه نه تو حلقه ی for)
    پس تو مثال بالا ، اولین بار op=0 و ln=10 هه ، با تغییراتی که میکنه ، تو تابع ایتریتور ، op=1 و ln=9 میشه و مقدار بازگشتی این تابع ایتریتور ABC مون ، میشه (اولین مقدار) ln=9 و (دومین مقدار) op=1 . حالا دفعه ی بعد تو تکرار این تابع ، اولین آرگومان همیشه برابر همون مقدار دهی اولیه که کرده بودیم ، ثابت میمونه یعنی همیشه مقدار آرگوما op=0 هست و دومین آرگومان اش که ln هست ، برابر اولین مقدار بازگشتی دفعه ی قبل همین تابع که بازم ln هست (یعنی ln=9) میشه
    تا این قدر تکرار میشه که ln برابر 1 بشه که nil رو برگردونه (اولین مقدار تابع) و دیگه تکرار تابع تموم میشه
    مثال دوم که دقیقا همینه (که در اینجا مقدار بازگشتی sum یا همون اولین مقدار بازگشتی تابع ایتریتور ، مقدارش برابر میشه با همون دومین آرگومان تابع یعنی ln در دفعه ی بعد) :

    کد:
    function Abc(op,ln)
    Dialog.Message("2", "op : "..op.."\nln : "..ln, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    op=op+1
    local sum=ln-1
    Dialog.Message("5", "op : "..op.."\nsum : "..sum, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
        if ln~=1 then
        return sum,op
        else
        return nil
        end
    end
    
    
    
    
    for Val,gig in Abc,0,10 do
    Dialog.Message("Notice", "sum : "..Val.."\ngig : "..gig, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    end
    دانلود فیلم آموزش برنامه نویسی Visual Studio C#.NET
    فیلم آموزش کامل Autoplay Media Studio


    وقتی انسان ، حیوان هست ، پس قیمت میتونی براش بذاری ولی وقتی انسان حَیّ متاله هست که قیمت نداره ، بها داره. "دکتر حسن عباسی"


  10. کاربران : 2 تشکر کرده اند از شما SajjadKhati برای ارسال این پست سودمند:


  11. #16
    عضو ممتاز
    تاریخ عضویت
    Apr 2014
    ارسال ها
    238
    تشکر تشکر کرده 
    508
    تشکر تشکر شده 
    1,178
    اعتبار کاربر
    1

    پیش فرض

    نقل قول نوشته اصلی توسط SajjadKhati نمایش پست ها
    ممنون استاد بابت وقتی که گذاشتین
    البته امروز که یه کم بیشتر بررسی کردم ، نکات بیشتری فهمیدم
    iterator ، اغلب تا اونجایی که من فهمیدم ، تکرار یه تابع با استفاده از حلقه هایی مثل for و while هه تو لوا تا اینکه اولین مقدار بازگشتی تابع مورد نظر ، nil بشه (حتما باید اولین مقدارش nil بشه نه دومین یا چندمین) یعنی دیگه مثل حلقه های عادی ، شمارنده نداره چون این قدر تکرار میشه که اولین مقدار تابع مورد نظر ، nil رو برگردونه
    یه نکته ی دیگه فهمیدم اینه که برا فراخونی یه تابع ایتریتور توی یه حلقه (مثلا حلقه ی for) ، هیچ وقت نمیتونه اون تابع ایتریتور ، بالای 2 آرگومان یا ورودی رو بپذیره (مقدار بازگشتی یا خروجی تابع ایتریتور میتونه هر چند تا که خاست باشه)
    همون مثال بالا رو با یه تغییر کوچیک بزارم :

    کد:
    function Abc(op,ln)
    Dialog.Message("2", "op : "..op.."\nln : "..ln, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    op=op+1
    ln=ln-1
    Dialog.Message("5", "op : "..op.."\nln : "..ln, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
        if ln~=1 then
        return ln,op
        else
        return nil
        end
    end
    
    
    
    
    for Val,gig in Abc,0,10 do
    Dialog.Message("Notice", "Val : "..Val.."\ngig : "..gig, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    end
    خوب مثل قبلی ، اولین بار که تو حلقه ی for ، تابع ایتریتورمون که ABC هه فراخونی شد ، اولین آرگومان این تابع که op هست همون برابر میشه با اولین مقداری که تو آرگومانش تو حلقه ی for جایگزین کردیم یعنی op برابر میشه با 0 و دومین متغییر و آرگومان این تابع که ln هست برابر دومین آرگومان که 10 هست
    نکته ای که باعث میشد آدم گیج بشن تو ایتریتورها اینه که همیشه اولین آرگومان که مقدار دهی شد (یعنی مقدار op تو بالا) ، ثابت هست و هر تغییری هم که کنه ، تو تکرار بار بعد ، دوباره همون مقدار اولی ای که دادیم میشد . اما آرگومان دوم تابع ایتریتور (ln) همیشه برابر با اولین مقدار تابع بازگشتی تابع ایتریتور میشه . یعنی تو تکرار بار بعد تابع ایتریتور ، آرگومان دومی (ln) برابر با اولین خروجی یا اولین مقدار بازگشتی دفعه ی قبل این تابع میشه
    پس تو مثال بالا ، اولین بار op=0 و ln=10 هه ، با تغییراتی که میکنه ، تو تابع ایتریتور ، op=1 و ln=9 میشه و مقدار بازگشتی این تابع ایتریتور ABC مون ، میشه (اولین مقدار) ln=9 و (دومین مقدار) op=1 . حالا دفعه ی بعد تو تکرار این تابع ، اولین آرگومان همیشه برابر همون مقدار دهی اولیه که کرده بودیم ، ثابت میمونه یعنی همیشه مقدار آرگوما op=0 هست و دومین آرگومان اش که ln هست ، برابر اولین مقدار بازگشتی دفعه ی قبل همین تابع که بازم ln هست (یعنی ln=9) میشه
    تا این قدر تکرار میشه که ln برابر 1 بشه که nil رو برگردونه (اولین مقدار تابع) و دیگه تکرار تابع تموم میشه
    خواهش میکنم ، وظیفه هست

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

    تحلیل شما عالی بود اما بنظر من بعضی از نکاتی که گفتین ممکنه که صحیح نباشه ،

    بنظر من که برای پایان یافتن حلقه یکی از این دو شرط لازمه :
    یا باید مقدار ارجاع شده به حلقه (از طرف تابع) برابر عدد تعیین شده بشه (در اینجا 10)
    یا باید مقدار ارجاع شده به حلقه (از طرف تابع) nil باشه

    در حالت اول اگر اصلا دستور return nil را هم از کدهای برنامه حذف کنید زمانیکه مقدار برگشتی تابع برابر با 10 شد حلقه متوقف میشه

    در نکته ی دیگری هم که فرمودین : "نکته ای که باعث میشد آدم گیج بشن تو ایتریتورها اینه که همیشه اولین آرگومان که مقدار دهی شد (یعنی مقدار op تو بالا) ، ثابت هست و هر تغییری هم که کنه ، تو تکرار بار بعد ، دوباره همون مقدار اولی ای که دادیم میشد
    " بنظرم مهم اولین و یا دومین آرگومان بودن نیست بلکه اهمیت در این هست که کدام آرگومان بزرگتر است تا حلقه بتونه وقتی عدد بزرگتر از تابع برگشت دتده شد توقف کنه

    در کل بهتره که تکرار شونده را مثل این مثال بنویسید تا براتون خوانا تر باشه :

    کد:
    function square(max,counter)
        if counter<max then
        counter = counter+1
      --  if counter>5 then      return 10 ,10    end
        return counter, max
        end
     end
     
     
     for i,n in square,10,0 do
     Dialog.Message("Notice", i.."\n"..n, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
     end
    یک بار کد را همینطور اجرا کنید یک بار هم علامت -- را پاک کنید تا خطی را که ریمارک کردم هم اجرا بشه و نتیجه را بررسی کنید.

    البته توجه داشته باشین که max میتونه اعداد بزرگتر از 10 هم باشه اما حلقه تکرار شه چون حلقه فقط با 10 و یا nil متوقف میشه (این را گفتم که اسم max باعث اشتباه نشه)
    با تمام خردمندان و صنعت گران و سیاست مداران بحث و گفتگو کردم ، همه گمان می کردند که دانایند ، اما هیچ چیز نمی دانستند و جاهلی بیش نبودند ، و دانستم که هر که میگوید چیزی بلدم مطمئنن دیگر نمی تواند آنرا فرا بگیرد ، اما بعد از عمری جهالت با مطالعه و جستجو و پرس و جو و تجربه مطمئن شدم که خودم یک چیز را می دانم و در آن شکی ندارم اینکه
    می دانم که هیچ نمی دانم
    سقراط حکیم

  12. کاربران : 3 تشکر کرده اند از شما Media Stream برای ارسال این پست سودمند:


  13. #17
    عضو متخصص
    تاریخ عضویت
    Sep 2014
    ارسال ها
    1,773
    محل سکونت
    مازندران
    تشکر تشکر کرده 
    3,259
    تشکر تشکر شده 
    4,273
    اعتبار کاربر
    1

    پیش فرض

    ممنون استاد
    این طور نیست
    برای قسمت اول که گفتین "باید مقدار ارجاع شده به حلقه (از طرف تابع) برابر عدد تعیین شده بشه (در اینجا 10)" ، به این مثال توجه کنین :

    کد:
    function Abc(op,ln)
    Dialog.Message("2", "op : "..op.."\nln : "..ln, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    	if Added=="yes" then
    	sum=ln+1
    	else
    	sum=ln-1
    	end
    op=op+1
    Dialog.Message("5", "op : "..op.."\nsum : "..sum, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    	if ln~=1 then
    	return sum,op
    	else
    	return nil
    	end
    end
    
    
    
    
    for Val,gig in Abc,0,10 do
    Dialog.Message("Notice", "sum : "..Val.."\ngig : "..gig, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    	if Val==4 then
    	Added="yes"
    	end
    end
    خوب مقدار اولیه (تو همون مثال قبل یا همین مثال که تغییر شکل یافته ی همون مثال هه) که 10 هست (ln=10) برخلاف اون مثال اولی که رسید به 1 و nil رو برگردوند ، تو اینجا از 10 به 4 میرسه و دوباره زیاد میشه و 10 رو هم رد میکنه اما حلقه اصلا خاتمه پیدا نمیکنه و همینطور تا ابد ادامه داره

    اون مثال ای هم که شما زدین ، با توضیحاتی که قبلا گفته شد ، تناقضی نداشت . مقدار max همیشه ثابت هه و برابر 10 هه چون آرگومان اولی ثابت هه . مقدار اولیه ی counter هم که 0 هه و در دفعات بعدی برابر میشه با اولین مقدار بازگشتی تابع ایتریتورش (counter یا در واقع بهتر بگم مقدار i) در آخرین اجرای تابع
    یعنی دفعه ی اول ، max=10 (که max هر چی که باشه ، در دفعات بعدی اجرای تابع ، مقدارش همین 10 ثابت میمونه) و counter=0 . اگه counter از max کوچیکتر باشه که هست ، یکی بهش اضافه میکنه و اول counter که مقدارش 1 میشه (که این متغییر هر چی که بود (حتی فرض کنیم counter هم اسمش نبود و حتی الگوریتم محاسباتی شم فرق میکرد) ، توی دومین آرگومان تابع ایتریتور square که بازم counter هست) ، و بعد max رو برمیگردونه دفعه ی بعد هم همینطور و هر بار یکی به counter اضافه میکنه و تا 10 که رسید ، شرط از اعتبارش ساقط میشه و در واقع تابع ، همون nil رو توی متغییرهای counter و max رو برمیگردنه . برای اینکه از نوع متغییر مطمئن شین ، از تابع اصلی لوا بنام type میتونین استفاده کنین. یعنی این کد رو تست کنین :

    کد:
    function square(max,counter)
        if counter<max then
        counter = counter+1
      --  if counter>5 then      return 10 ,10    end
        return counter, max
        end
     end
    
    
    x,y=square(2,3)
    Dialog.Message("Notice", "type x : "..type(x).."\ntype y : "..type(y), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    که نوع این متغییر رو برابر nil مینویسه اما اگه جای 2 و 3 رو توی آرگومان بالا عوض کنین میبینین که number مینویسه
    خوب این معلومه که چرا این فراخونی (type) رو توی حلقه ی for ننوشتم چون حلقه ی for (نه فقط برای ایتریتورها) اگه مقدار متغییرش nil بشه ، اصلا اجرا نمیشه
    میتونین برای با خبر شدن از نوع متغییر همین تابع ایتریتور که counter و max هستن (و نوع شون هم عدد هست)، توی حلقه ی for با کد زیر متوجه شین :

    کد:
    function square(max,counter)
        if counter<max then
        counter = counter+1
      --  if counter>5 then      return 10 ,10    end
        return counter, max
        end
     end
    
    
    for i,n in square,10,0 do
    Dialog.Message("Notice", "i : "..i.."\ntype i : "..type(i).."\nn : "..n.."\ntype n : "..type(n), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    end
    دانلود فیلم آموزش برنامه نویسی Visual Studio C#.NET
    فیلم آموزش کامل Autoplay Media Studio


    وقتی انسان ، حیوان هست ، پس قیمت میتونی براش بذاری ولی وقتی انسان حَیّ متاله هست که قیمت نداره ، بها داره. "دکتر حسن عباسی"


  14. کاربران : 3 تشکر کرده اند از شما SajjadKhati برای ارسال این پست سودمند:


  15. #18
    عضو ممتاز
    تاریخ عضویت
    Apr 2014
    ارسال ها
    238
    تشکر تشکر کرده 
    508
    تشکر تشکر شده 
    1,178
    اعتبار کاربر
    1

    پیش فرض

    فکر کنم مشکل اصلی اختلاف نظر ما ناشی از درک و دیدگاه متفاوت ما به این مسئله و دوری و کم اطلاعی بنده از لوا هست (و نیز پیش زمینه ی ذهنی ای که نسبت به زبانهای برنامه نویسی دیگر دارم ) ، به همین دلیل هم هست که بعضی از صحبتهای همدیگر را بد متوجه میشیم ،
    برای مثال منظور من از " یا باید مقدار ارجاع شده به حلقه (از طرف تابع) برابر عدد تعیین شده بشه (در اینجا 10 )ا
    عدد 10 برای همین شرطهای موجود در تابع هست وگرنه خب مسلم هست که با تغییر شرط تحلیل ما از کد و این عدد عوض میشه البته این 10 شدن با صحبتهای شما هم که فرمودین
    "تا 10 که رسید ، شرط از اعتبارش ساقط میشه و در واقع تابع ، همون nil رو توی متغییرهای counter و max رو برمیگردنه" هیچ تعارضی نداره و بنده چیزی غیر از این عرض نکردم ، چون وقتی میگیم با رسیدن به عدد 10 حلقه متوقف میشه در اصل علت توقف این هست عملیات موجود در شرط و بازگشت دهی انجام نمیشه و چون تابع باید مقداری را برگردونه به تبع مقدار نول را برمیگردونه

    حلقه در دیگر زبانهای برنامه نویسی با حلقه در لوا تفاوتهایی دارن برای مثال همونطور که میدونید در تمام حلقه ها حداقل یک متغییر و یک شرط وجود داره ،و متغییر در حلقه های معمولی با توجه بهگامی که تعیین میکنیم افزایش و یا کاهش پیدا میکنه (در لوا اگر میزان گام را تعیین نکنید خودش اون را 1 در نظر میگیره )

    همچنین در همه ی زبانها هر حلقه حداقل یک شرط داره که خاتمه ی حلقه را تعیین میکنه و تا زمانی که شرط درست باشه و یا خطایی رخ نده (مثلا null نشه) حلقه به کارش ادامه میده

    در اغلب زبانها مثل زبانهای خانواده ی C و . . . میتونیم مقدار متغیر داخل حلقه را تغییر بدیم ، مثلا اگر حلقه به شکل زیر باشه :
    کد:
     for (i = 0; i < 10; i++) 
                   print(item[i]);
    براحتی میتونیم مقدار متغیر i را تغییر بدیم ، مثلا یک شرط بزاریم تا وقتی به که به 5 رسید مقدارش بشه 1000- و یا هر عددی که شرط را نقض نکنه ( یعنی هر عددی که کوچکتر از 10 باشه )

    اما ظاهرا برنامه نویس زبان لوا به ما اجازه ی تغییر دستی مقدار متغیر حلقه را نداده و حتی اگر تغییرش بدیم روش اثر نمیکنه برای مثال :
    کد:
    for i = 1, 10 do
    i=0;
    end
    در کد بالا خط وسط هیچ تاثیری در کار حلقه نداره و حلقه کارش را بر مبنای اطلاعات خط اول انجام میده . (حداقل در کامپایلر AMS اینطوره)

    همچنین در اکثر زبانها اگر شیئی که با متغیر حلقه مقایسه میشه نول بشه باز هم حلقه از کار می افته .

    برای مثال اگر یک آرایه با 3 خانه داشته باشیم و آنها را مقدار دهی کرده باشیم ، اگر از ابتدا و یا انتهای آرایه شروع به خواندن اطلاعات کنیم و درهر بار اجرا بگیم که مقدار خانه ی بعدی را به ما بده وقتی به خانه ی 4 و یا 0 برسیم چون در آرایه همچین خانه ای نداریم به ما نول را برمیگرداند و حلقه هم متوقف میشه

    اما ظاهرا همین پیش زمینه ی ذهنی که درباره ی زبانهای دیگر داشتم باعث شد که درباره ی این نوع حلقه در لوا به اشتباه بیفتم.

    در صورتیکه ظاهرا برنامه نویس لوا خودش اکسپشن های مربوط به این نوع حلقه را کچ کرده و همونطور که شما هم فرمودین حلقه تا زمانی به کارش ادامه میده که شرط برقرار باشد وگرنه تابع nil را برمیگرداند ، (چون به هر حال باید مقداری را برگشت دهد )


    در دو صفحه ی زیر مثالهای ساده و خوبی موجود است
    : Iterator - Wikipedia, the free encyclopedia
    امیدوارم هرکس که دانش و تواناییشو داره این صفحه را در ویکی ترجمه کنه

    Lua - Iterators

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

  16. کاربران : 3 تشکر کرده اند از شما Media Stream برای ارسال این پست سودمند:


  17. #19
    عضو متخصص
    تاریخ عضویت
    Sep 2014
    ارسال ها
    1,773
    محل سکونت
    مازندران
    تشکر تشکر کرده 
    3,259
    تشکر تشکر شده 
    4,273
    اعتبار کاربر
    1

    پیش فرض

    ممنون استاد بابت راهنمایی تون
    درباره ی اون حلقه که تو زبان های دیگه گفتین ، چون با زبان های دیگه آشنا نیستم ، متوجه نشدم . یعنی اگه حلقه ای تو زبان دیگه با متغییر i از 1 تا 10 یکی یکی اضافه شه ، وقتی به 5 رسید ، مقدار i را برابر -1000 کنیم ، دفعه ی بعد 5 تا بیشتر از -1000 یعنی تا -995 میره و حالا که شد کلا 10 بار تکرار ، حلقه تموم میشه؟
    تو لوا آره همونطوره که گفتین . اگه همچین کاری رو میخاین تو لوا ، چاره ای جز تعریف متغییر جداگانه ندارین
    دانلود فیلم آموزش برنامه نویسی Visual Studio C#.NET
    فیلم آموزش کامل Autoplay Media Studio


    وقتی انسان ، حیوان هست ، پس قیمت میتونی براش بذاری ولی وقتی انسان حَیّ متاله هست که قیمت نداره ، بها داره. "دکتر حسن عباسی"


  18. تشکرها از این نوشته :


  19. #20
    عضو متخصص
    تاریخ عضویت
    Sep 2014
    ارسال ها
    1,773
    محل سکونت
    مازندران
    تشکر تشکر کرده 
    3,259
    تشکر تشکر شده 
    4,273
    اعتبار کاربر
    1

    پیش فرض

    استاد ، الان رفتم تو یه مرحله ی دیگه
    تو قضیه ی userdata و io file
    نوع داده ای userdata ها چون این طور که از توضیحات سایتش برمیاد به c مربوط میشه ، بازم برام گیج کننده هست. توضیحات شم اینجاست :

    Programming in Lua : 28.1

    اون طور که خودش تعریف کرد ، userdata با برنامه نویسی c انگار ربط داره و انگار (دقیق نمیدونم) یه چیزی هم در سبک اشاره گرها تو c هست
    اون کدهاشم خیلی برام گنگ هه . انگار مخلوطی از لوا و c هه (بازم نمیدونم) . مثلا من از این کد چیزی متوجه نشدم :

    کد:
    static int newarray (lua_State *L) {
          int n = luaL_checkint(L, 1);
          size_t nbytes = sizeof(NumArray) + (n - 1)*sizeof(double);
          NumArray *a = (NumArray *)lua_newuserdata(L, nbytes);
          a->size = n;
          return 1;  /* new userdatum is already on the stack */
        }
    در وهله ی اول زیاد شباهتی به دستورات و قواعد لوا ندارن
    io file هم اگه اشتباه نکنم ، همون کارهایی رو میکنه که گفته بودین بیت به بیت یه فایل رو میخونه (دقیق بازم نمیدونم)
    دانلود فیلم آموزش برنامه نویسی Visual Studio C#.NET
    فیلم آموزش کامل Autoplay Media Studio


    وقتی انسان ، حیوان هست ، پس قیمت میتونی براش بذاری ولی وقتی انسان حَیّ متاله هست که قیمت نداره ، بها داره. "دکتر حسن عباسی"


  20. تشکرها از این نوشته :


صفحه 2 از 12 اولیناولین 1234 ... آخرینآخرین

اطلاعات تاپیک

Users Browsing this Thread

در حال حاضر 1 در حال مشاهده این موضوع می باشد.. (0 کاربر و 1 مهمان در این انجمن حضور دارند)

برچسب برای این موضوع

بوک مارک ها

بوک مارک ها

مجوزهای ارسال و ویرایش

  • شما نمی توانید موضوع جدید ارسال کنید
  • شما نمی توانید به پست ها پاسخ دهید
  • شما نمی توانید فایل پیوست ضمیمه کنید
  • شما نمی توانید پست های خود را ویرایش کنید
  •