اطلاعیه

Collapse
No announcement yet.

حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

    سلام دوستان.
    فرض کنید ما تو برنامه مون یک متغیر سراسری به اسم a تعریف کردیم (نوعش مهم نیست). حالا یک یا چند تابع هم نوشتیم که داخلشون متغیر محلی به اسم a درست کردیم.
    1- کامپایلر a رو چظور تشخیص میده که محلی هست یا سراسری ؟
    2-اصلا کار درستی هست این کار رو انجام بدیم؟
    3- متغیری که به صورت volatile تعریف میشه چه تفاوتی با حالت عادی داره ؟
    4- فرض کنید قصه بالا طوری باشه که فقط متغیر سراسری به صورت volatile تعریف کنیم، جواب سوالات 1 و 2 چه تفاوتی خواهند داشت؟
    ممنون.
    ---------
    .
    .
    ...........

    #2
    پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

    1- متغیر های محلی داخل پشته و متغیر عمومی داخل heap قرار میگیرند. حوزه دید هر تابع متغیرهای داخل خودش هست (یعنی وقتی داخل تابع بنویسی a از متغیر محلی استفاده میشه ) و در این حال برای استفاده از متغیر عمومی a باید از دستور تعریف حوزه دید استفده کنی که در ویژوال سی بصورت a:: نوشته میشه
    2- بهترین کار اینه که نامگذاریهاتون رو درست انجام بدین (a اسم خوبی برای یه متغیر نیست)
    3- کلمه کلیدی volatile به کامپایلر میفهمونه که مقدار داخلی این متغیر ممکنه چیز دیگه ای (مثلا تایمر) تغییر کنه و لزوما داخل نرم افزار این تغییر انجام نمیشه (یا قابل دید نیست) در نتیجه مثلا کامپایلر از قضاوت در مورد مقدار داخلی متغیر و کامپایل هوشمندانه دست برداره
    4- ؟!

    دیدگاه


      #3
      پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

      خیلی ممنون از توضیحاتتون.
      a رو مثال زدم.
      volatile میشه یک مثال بزنید. چون وقتی متغیر رو سراسری تعریف کنیم همه جا امکانش هست اون متغیر تغییر کنه.
      4- می خواستم بدونم وقتی متغیر volatile تعریف میشه، امکان تداخل متغیر با متغیر محلی وجود داره یا نه؟
      ---------
      .
      .
      ...........

      دیدگاه


        #4
        پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

        در ادامه توضیح دوست قبلی در مورد متغیر volatile :
        وقتی متغیری بانام a بصورت غیر volatile تعریف کنید مقدار a یکبار خوانده شده در پردازش آن روتین مورد استفاده قرار میگیرد حال اگر در این حالت وقفه ای رخ دهد و متغیر a در وقفه استفاده شده باشد و چون در روتین عادی هنوز حاصل عملیات در a قرار نگرفته در نتیجه مقداری که از a در روتین وقفه خوانده می شود مقدار اولیه ( قبل از پردازش در روتین عادی ) می باشد و باعث خطا در کار می شود .

        ولی با تعریف a بصورت volatile به کامپایلر میگویید در هر قسمت از پردازش هر بار مقدار را از a بخوانید چون ممکن است در حین پردازش ، این متغیر در روتین وقفه مورد استفاده قرار گرفته و مقدارش تغییر کرده باشد.

        دیدگاه


          #5
          پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

          یک مثال میزنم ببینید درست متوجه شدم
          [code=c]int a,b,c;
          .
          .
          a=2;
          b=3;
          .
          .
          c=a*b ;
          .
          .
          .[/code]
          تو خط 4 متغیر a مقدار 2 رو داره و تو خط 8 مقدار c از مقدار a به دست میاد. حالا اگر در این حین (یعنی خط 4 تا 8) حتی اگر مقدار a توی یک وقفه عوض بشه و بشه مثلا 3، باز هم c با مقدار قبلی a یعنی 2 محاسبه میشه و نتیجه میشه 6 در حالی که باید بشه 9.
          درست متوجه شدم ؟

          اضافه شده در تاریخ :
          دوستان به نظرتون این حرفی که من زدم، درسته ؟
          ---------
          .
          .
          ...........

          دیدگاه


            #6
            پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

            وقتی یه محاسبه قراره انجام بشه مقدار متغیر از حافظه خونده میشه...پس آخرین تغییرات رو اون متغیر اهمیت داره..حالا هر کجا ک میخاد باشه...مهم نیس...
            تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

            www.intelart.ir


            ساخت کنترلر دما PID فازي با AVR [آموزشی]

            دیدگاه


              #7
              پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟


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

              دیدگاه


                #8
                پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

                نوشته اصلی توسط سایمون
                ببین دوست من یک مثال الکترونیکی میزنم
                فرض کن شما یک متغیر رو به صورت volatile تعریف کردید . و در حلقه main متغیر در حال استفاده است . از طرفی شما در برنامه تون یک وقفه دارید که مثلا هر 1 میلی ثانیه به زیر روتین وقفه سر میزنید و به برنامه اصلی برمیگردید . خب اگر در زیر روتین وقفه همون متغیر مقدارش تغییر کنه یا تغییر داده بشه ، در اون صورت در هنگام باز گشت به برنامه اصلی مقدار جدید متغیر ، در نظر گرفته میشه و پردازش روی اون مقدار جدید انجام میشه .
                امیدوارم کمک کرده باشم
                میشه نظرتون رو در مورد مثالی که زدم بگید.
                مگر وقتی ما متغیر رو global تعریف کنیم، هر جا (چه تو توابع دیگه مثل توابعی که خودمون تعریف کردیم یا وقفه یا ...) مقدارش عوض بشه، تو محاسبات این اتفاق نمی افته ؟
                ---------
                .
                .
                ...........

                دیدگاه


                  #9
                  پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

                  با سلام
                  نوشته اصلی توسط Des_B
                  میشه نظرتون رو در مورد مثالی که زدم بگید.
                  مگر وقتی ما متغیر رو global تعریف کنیم، هر جا (چه تو توابع دیگه مثل توابعی که خودمون تعریف کردیم یا وقفه یا ...) مقدارش عوض بشه، تو محاسبات این اتفاق نمی افته ؟
                  بحث بر سر بهینه سازی یا optimization هست، مقدار معلومه عوض میشه، اما وقتی قرار کد به کد ماشین تبدیل بشه شاید از مقدار اون متغیر صرف نظر بشه، مثلا
                  [code=c]
                  int a = 10;
                  while( a == 10 ){
                  //some work
                  }
                  [/code]
                  اگه کامپایلر بیاد کد بالا رو بهینه کنه، جاش اینو میزاره
                  [code=c]
                  while( true ){
                  //some work
                  }
                  [/code]
                  چون از دید کامپایلر چیزی که a رو تغییر بده وجود نداره و a برابر 10 هست، اما اگه a رو volatile تعریف کنیم به کامپایلر فهموندیم چیزی هست که این متغیر رو بدون اینکه بفهمی تغییر میده پس لطف کن و کد رو همین جوری تبدیل کن و بهینه نکن
                  The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                  دیدگاه


                    #10
                    پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

                    نوشته اصلی توسط hessam2013
                    با سلامبحث بر سر بهینه سازی یا optimization هست، مقدار معلومه عوض میشه، اما وقتی قرار کد به کد ماشین تبدیل بشه شاید از مقدار اون متغیر صرف نظر بشه، مثلا
                    [code=c]
                    int a = 10;
                    while( a == 10 ){
                    //some work
                    }
                    [/code]
                    اگه کامپایلر بیاد کد بالا رو بهینه کنه، جاش اینو میزاره
                    [code=c]
                    while( true ){
                    //some work
                    }
                    [/code]
                    چون از دید کامپایلر چیزی که a رو تغییر بده وجود نداره و a برابر 10 هست، اما اگه a رو volatile تعریف کنیم به کامپایلر فهموندیم چیزی هست که این متغیر رو بدون اینکه بفهمی تغییر میده پس لطف کن و کد رو همین جوری تبدیل کن و بهینه نکن
                    ممنون.
                    چه راه هایی هست که بشه فهمید کامپایلر میخواد دوستی خاله خرسه دربیاره ؟
                    اصلا میشه فهمید که کی قراره بهینه سازی کار مارو خراب کنه ؟
                    ---------
                    .
                    .
                    ...........

                    دیدگاه


                      #11
                      پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

                      خب بهینه سازی سطح های مختلفی داره، که میشه ازشون استفاده کرد یا نکرد، فکر کنم در سطوح پایین مشکلی وجود نداره، در سطوح بالا خب باید حواستون به کد نویسی بشه و قوانین از این دست )volatile) رو پیاده سازی کنید
                      The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                      دیدگاه


                        #12
                        پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

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

                        www.intelart.ir


                        ساخت کنترلر دما PID فازي با AVR [آموزشی]

                        دیدگاه


                          #13
                          پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

                          با توجه به مزیت های حالت volatile و اینکه حودم معنیشو تو عمل درک کردم، آیا استفاده از volatile معایبی هم داره؟
                          مثلا اگر متغیرهای زیادی به صورت volatile تعریف بشن (حتی اگر جند تا نیازی بهش نداشته باشند)، مشکلی پیش میاد؟
                          فکر کنم استفاده نکردن از volatile باعث کاهش حجم کد تولیدی میشه، درسته ؟
                          ---------
                          .
                          .
                          ...........

                          دیدگاه


                            #14
                            پاسخ : حالت volatile چه تاثیری روی متغیر در برنامه نویسی دارد؟

                            ُلام دوستان،ببخشید در ادامه همین بحث،من واسه خوندن ds1307 داخل یه وقفه تایمر استفاده کردم و ساعت رو میخونه،و داخل یه وقفه تایمر دیگه باید یه سری عملیات زیاضی انجام بده و همچنین یه سری مقادیر رو رو ال سی دی نشون بده،که زمان رو هم میخوام توی همین وقفه تایمر نشون بدم،حالا مشکلی که هست متغییر های زمان رو به صورت volatile تعریف کردم،ولی باز توی عمل درست نشون نمیده مقادیر رو،باید به چه شکل این کارو کرد؟کلا میخوام از وقفه ها استفاده کنم و حلقه while رو خالی بذارم

                            دیدگاه

                            لطفا صبر کنید...
                            X