اطلاعیه

Collapse
No announcement yet.

تعریف یه اشاره گر به عنوان آرگومان تابع؟

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

    تعریف یه اشاره گر به عنوان آرگومان تابع؟

    سلام
    تو کد زیر اومده آرگومان تابع رو یه اشاره گر تعریف کرده(اشاره گر ها هم محل ذخیره آدرس هایی از حافظه هستن) و حالا ما باید چه داده ای بهاین تابع بدیم؟
    چون اگه الان نه ارسال از طریق مقدار داریم، نه ارسال از طریق ارجاع و نه ارجاع ثابت........این تابع رو تو پروژه هامون چطور میتونیم فراخونی کنیم/؟؟؟

    همچین تابعی تو کتاب خونه یکی از نمایشگر ها بود.... :mrgreen:....این آخرین تابعی هستش که من توش موندم....کار این تابع رو بفهمم مطلبم کامل میشه و میتونم به صورت pdf بزارم اینجا(منظورم اینه که جان داش کمک کنید ثواب داره :mrgreen

    [code=c]function(int *test) {...}[/code]
    اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

    #2
    پاسخ : تعریف یه اشاره گر به عنوان آرگومان تابع؟

    همیشه به ارگومان تابع مقدار نمیدن و بعضی اوقات نیازه که شما یه مقداری رو از یه تابع بگیری که POINTER روش مناسبیه.
    مثال :
    کد:
      while(1)
      {
       if(!(PINC&(1<<0)))
        { 
         delay_ms(200);
         function(&var);
         PORTB=var; 
        }       
      }
    
    void function(unsigned char * test)
    {
      unsigned char a;
      a=129;
      *test = a;
    }

    دیدگاه


      #3
      پاسخ : تعریف یه اشاره گر به عنوان آرگومان تابع؟

      ممنون از شما
      ببینید درست متوجه شدم یا نه
      تو خط 6 برنامه (;(function(&var) اومدیم آدرس یه متغییر رو ارسال کردیم، و این آدرس در اشاره گر test ذخیره شده و بعد مقدار 129 در این آدرس از حافظه ذخیره شده، یعنی 129 داخل متغییر var ذخیره شده ... درسته؟


      خب اگه درست گفته باشم ... اون وقت این حالت چه فرقی با ارسال از طریق ارجاع داره؟ اونجا هم آدرس یه متغییر ارسال میشه که....؟!؟
      مثل مثال زیر
      [code=c] while(1)
      {
      if(!(PINC&(1<<0)))
      {
      delay_ms(200);
      function(var);
      PORTB=var;
      }
      }

      void function(unsigned char &test)
      {
      unsigned char a;
      a=129;
      test = a;
      }[/code]
      اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

      دیدگاه


        #4
        پاسخ : تعریف یه اشاره گر به عنوان آرگومان تاب

        نوشته اصلی توسط md3848
        سلام
        تو کد زیر اومده آرگومان تابع رو یه اشاره گر تعریف کرده(اشاره گر ها هم محل ذخیره آدرس هایی از حافظه هستن) و حالا ما باید چه داده ای بهاین تابع بدیم؟
        چون اگه الان نه ارسال از طریق مقدار داریم، نه ارسال از طریق ارجاع و نه ارجاع ثابت........این تابع رو تو پروژه هامون چطور میتونیم فراخونی کنیم/؟؟؟

        همچین تابعی تو کتاب خونه یکی از نمایشگر ها بود.... :mrgreen:....این آخرین تابعی هستش که من توش موندم....کار این تابع رو بفهمم مطلبم کامل میشه و میتونم به صورت pdf بزارم اینجا(منظورم اینه که جان داش کمک کنید ثواب داره :mrgreen

        [code=c]function(int *test) {...}[/code]
        خیلی جالبه بحث اشاره گر ها
        آرایه های چند بعدی اصلا هیچی نمی خوان:
        کد:
        typedef unsigned char ubyte;
        
        void function (ubyte array[], ubyte length){
          ubyte counter;
          for(counter = 0; counter < length; counter++){
            array[counter] = counter;
          }
        }
        
        void main(void){
          const ubyte length = 10;
          ubyte buff[length];
          function(buff, length);
        }
        کاملا عادی ارایه را ویرایش کنید
        خواهید دید که هر تغییری که بر روی آن انجام دهید در خارج از تابع نیز ذخیره خواهد شد
        If the wind will not serve, take to the oars

        دیدگاه


          #5
          پاسخ : تعریف یه اشاره گر به عنوان آرگومان تاب

          نوشته اصلی توسط md3848
          ممنون از شما
          ببینید درست متوجه شدم یا نه
          تو خط 6 برنامه (;(function(&var) اومدیم آدرس یه متغییر رو ارسال کردیم، و این آدرس در اشاره گر test ذخیره شده و بعد مقدار 129 در این آدرس از حافظه ذخیره شده، یعنی 129 داخل متغییر var ذخیره شده ... درسته؟


          خب اگه درست گفته باشم ... اون وقت این حالت چه فرقی با ارسال از طریق ارجاع داره؟ اونجا هم آدرس یه متغییر ارسال میشه که....؟!؟
          مثل مثال زیر
          [code=c] while(1)
          {
          if(!(PINC&(1<<0)))
          {
          delay_ms(200);
          function(var);
          PORTB=var;
          }
          }

          void function(unsigned char &test)
          {
          unsigned char a;
          a=129;
          test = a;
          }[/code]
          ارسال از طریق ارجاع در زبان سی وجود ندارد.
          این روش ارسال برای سادگی کار با اشاره گرها در زبان سی پلاس پلاس اضافه شد.
          بله ارسال از طریق ارجاع پیچیدگی کمتری داره و بهتره از این روش استفاده بشه
          ولی در زبان سی وجود نداره و شما در زبان سی باید از اشاره گر ها استفاده کنید
          If the wind will not serve, take to the oars

          دیدگاه


            #6
            پاسخ : تعریف یه اشاره گر به عنوان آرگومان تابع؟

            ممنون از شما دوستان
            همه ide ها هم که با c کار نمیکنن که ^_^ بعضیاشون با c++ کار میکنن
            بگذریم و از بحث خارج نشیم
            الان من متوجه فرق این دو مورد نشدم...؟؟؟؟
            الان این تحلیل من درسته یا نه(در مورد مثالی که دوستمون در اول این صفحه گزاشتن)

            نوشته اصلی توسط md3848
            ببینید درست متوجه شدم یا نه
            تو خط 6 برنامه (;(function(&var) اومدیم آدرس یه متغییر رو ارسال کردیم، و این آدرس در اشاره گر test ذخیره شده و بعد مقدار 129 در این آدرس از حافظه ذخیره شده، یعنی 129 داخل متغییر var ذخیره شده ... درسته؟
            اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

            دیدگاه


              #7
              پاسخ : تعریف یه اشاره گر به عنوان آرگومان تابع؟

              نوشته اصلی توسط md3848
              سلام
              تو کد زیر اومده آرگومان تابع رو یه اشاره گر تعریف کرده(اشاره گر ها هم محل ذخیره آدرس هایی از حافظه هستن) و حالا ما باید چه داده ای بهاین تابع بدیم؟
              چون اگه الان نه ارسال از طریق مقدار داریم، نه ارسال از طریق ارجاع و نه ارجاع ثابت........این تابع رو تو پروژه هامون چطور میتونیم فراخونی کنیم/؟؟؟

              همچین تابعی تو کتاب خونه یکی از نمایشگر ها بود.... :mrgreen:....این آخرین تابعی هستش که من توش موندم....کار این تابع رو بفهمم مطلبم کامل میشه و میتونم به صورت pdf بزارم اینجا(منظورم اینه که جان داش کمک کنید ثواب داره :mrgreen

              [code=c]function(int *test) {...}[/code]
              سلام اقا مهدی
              شما خودتون استاد هستین ، به اندازه ای که فهمیدم من هم توضیح میدم ، ان شاالله که مفید باشه.
              توابعی که پارامترهای اون بصورت اشاره گره باشه ، مسلما باید ادرس بخشی از حافظه از همون نوع از متغیر رو بگیرن .
              فرض کنید شما میخاین که تابعتون مقدار بازگشتیش یکی نباشه و چندتا باشه ، خب بهترین کار استفاده از از اشاره گرهاست.
              اون مطلبی رو هم که درباره ارجاع گفتین تا اونجایی که من میدونم یکی از قابلیت های c++ هست ( البته اگر اشتباه نکنم ) و در c قابل استفاده نیست .( اگر اشتباه می کنم دوستان تصحیح کنن)
              یاعلی مدد
              در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

              دیدگاه


                #8
                پاسخ : تعریف یه اشاره گر به عنوان آرگومان تابع؟

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

                دیدگاه


                  #9
                  پاسخ : تعریف یه اشاره گر به عنوان آرگومان تابع؟

                  سلام داداش

                  شما خودتون استاد هستین ،
                  هندونه زیر بقم نزار :redface:

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

                  اصلا میتونی بدون pointer برنامه بنویسی و با تعریف چندتا متغیر سراسری هر موقع و هرجا که خواستی اونا رو تغییر بدی و ازشون استفاده کنی
                  بازم اینم صحیح :mrgreen: .......یه وقتی نباید از متغییر سراسری استفاده کنینم، باید از اشاره گر استفاده کرد.(حالا این یه وقتی کجاس خدا میدونه )


                  c++ هست ( البته اگر اشتباه نکنم ) و در c قابل استفاده نیست .
                  اینم قبوللللل



                  ولی سوال من اینه که (غیر از این که این برا c هستش و اون برا C++) فرق "این روش!" با روش "ارسال از طریق ارجاع" چیه؟........در ظاهر چیزی که من فهمیدم کاربرد جفتش مثل هستش....,ولی این که فرقی دارن یا نه....مثئله! این است

                  خوشم اومد از کار دوستان ... که هر کی نظر و تجربیاتش رو گفت.....این درسته :applause:
                  اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

                  دیدگاه


                    #10
                    پاسخ : تعریف یه اشاره گر به عنوان آرگومان تابع؟

                    1. اگر ورودی تابع به صورت اشاره گر باشد ، ارگومانی که به ان فرستاده میشود باید از نوع ادرس باشد.
                    کد:
                    void func(int* x,int* y);
                    int a,b;
                    .
                    .
                    .
                    func(&a,&b);
                    2. ارسال به طریق ارجاع ، همون ارسال به روش ادرس هست ، فقط نوع نوشتنش فرق کرده. که مختص به C++ قرارش میده.
                    که با تغییر مقدار متغیرهای محلی تابع ، مقدار متغیرهایی هم که به عنوان ارگومان فرستاده شده تغییر میکنه.

                    کد:
                    void func(int& x,int& y);
                    int a,b;
                    .
                    .
                    .
                    func(a,b);

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

                    کد:
                    void func(const int& x);
                    int a;
                    .
                    .
                    .
                    func(a);
                    دیگه همین قدر بلدم :read:
                    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                    دیدگاه


                      #11
                      پاسخ : تعریف یه اشاره گر به عنوان آرگومان تابع؟

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

                      در ارسال به روش ارجاع برنامه خود متغیر رو می فرسته (خود همون متغییری که قراره استفاده بشه)
                      در ارسال به روش اشاره گر برنامه آدرس متغیر رو میفرسته
                      در ارسال عادی برنامه یک کپی از اون متغیر ایجاد میکنه و از اون کپی استفاده میکنه
                      If the wind will not serve, take to the oars

                      دیدگاه


                        #12
                        پاسخ : تعریف یه اشاره گر به عنوان آرگومان تابع؟

                        ممنون از شما
                        تست کردم و دیدم که ارسال از طریق ارجاع تو C نیست...همون طور که شما دوستان گفتید
                        باید برم درباره تفاوت های این دو تحقیق کنم(c و c++)
                        ================================================== ==
                        ولی ارجاع اون طوری که فهمیدم یه متغییر مجازی هستش....که آدرس و مقدارش با متغییر اصلی برابر هستش.....

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

                        و تو روش ارسال آدرس متغییر با & و در یافت درس متغییر در قسمت پارامتر های تابع به کمک * در واقع میایم آدرس متغییر رو دریافت میکنیم، و لذا میتونیم با گزاشتن یه * در کنار آدرس دریافتی، به مقدار اون آدرس دست پیدا کنیم و تغییرش بدیم و ....

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

                        تنها تفاوتی که من به ذهنم میرسه(علاوه بر این که در ظاهر ارسال و دریافت تفاوت دارن)، اینه که تو تابع، برا روش اول یه متغییر داریم و در روش دوم یه اشاره گر داریم
                        تنها تفاوت کار به نظرم همینه، و به قول دوستمون که میگه این کار در c++ برا راحتی کار انجام شده، فقط اومدن کاری کردن که کاربر به جای استفاده از اشاره گر از متغییر استفاده کنه

                        کسی تفاوت های دقیق ترش رو میتونه بگه؟(روش ارسال از طریق ارجاع و آدرس)
                        اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

                        دیدگاه


                          #13
                          پاسخ : تعریف یه اشاره گر به عنوان آرگومان تاب

                          نوشته اصلی توسط md3848
                          ممنون از شما
                          تست کردم و دیدم که ارسال از طریق ارجاع تو C نیست...همون طور که شما دوستان گفتید
                          باید برم درباره تفاوت های این دو تحقیق کنم(c و c++)
                          ================================================== ==
                          ولی ارجاع اون طوری که فهمیدم یه متغییر مجازی هستش....که آدرس و مقدارش با متغییر اصلی برابر هستش.....

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

                          و تو روش ارسال آدرس متغییر با & و در یافت درس متغییر در قسمت پارامتر های تابع به کمک * در واقع میایم آدرس متغییر رو دریافت میکنیم، و لذا میتونیم با گزاشتن یه * در کنار آدرس دریافتی، به مقدار اون آدرس دست پیدا کنیم و تغییرش بدیم و ....

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

                          تنها تفاوتی که من به ذهنم میرسه(علاوه بر این که در ظاهر ارسال و دریافت تفاوت دارن)، اینه که تو تابع، برا روش اول یه متغییر داریم و در روش دوم یه اشاره گر داریم
                          تنها تفاوت کار به نظرم همینه، و به قول دوستمون که میگه این کار در c++ برا راحتی کار انجام شده، فقط اومدن کاری کردن که کاربر به جای استفاده از اشاره گر از متغییر استفاده کنه

                          کسی تفاوت های دقیق ترش رو میتونه بگه؟(روش ارسال از طریق ارجاع و آدرس)
                          تفاوت های اصلیش همونایی هستن که خود شما گفتین
                          ارجاع فقط یک نام مستعار برای یک متغیر هستش. وجود خارجی نداره یک موجودیت مستقل نیست پس فضای حافظه ای اشغال نمی کنه.
                          اشاره گر ها کاربرد خیلی گسترده تری دارن. با اینکه فقط آدرس رو منتقل می کنن ولی با همین آدرس و دونستن حجم متغیر میشه همه کاری کرد
                          با اشاره گر ها نه فقط آدرس متغیر ها بلکه حتی میشه آدرس توابع رو هم ارسال کرد که توی API نویسی کاربرد خیلی زیادی داره

                          ولی باید با احتیاط از اشاره گر ها استفاده کرد.
                          If the wind will not serve, take to the oars

                          دیدگاه


                            #14
                            پاسخ : پاسخ : تعریف یه اشاره گر به عنوان آرگومان تاب

                            نوشته اصلی توسط ASHIT AXAR
                            ولی باید با احتیاط از اشاره گر ها استفاده کرد.
                            یعنی تو میکرو هم ممکنه اشتباهی یه آدرس از حافظه رو تغییر بدیم که مربوطه به کدهای میکرو؟
                            متغییر ها داخل حافظه flash مگه نیستن؟ برنامه میکرو تو کدوم قسمت از حافظه میکرو هستش؟
                            اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

                            دیدگاه


                              #15
                              پاسخ : پاسخ : تعریف یه اشاره گر به عنوان آرگومان تاب

                              نوشته اصلی توسط md3848
                              یعنی تو میکرو هم ممکنه اشتباهی یه آدرس از حافظه رو تغییر بدیم که مربوطه به کدهای میکرو؟
                              متغییر ها داخل حافظه flash مگه نیستن؟ برنامه میکرو تو کدوم قسمت از حافظه میکرو هستش؟
                              درسته. کدهای میکرو تغییر نمی کنن. چون توی حافظه ی فلش هستن. هر خط کدی که باید اجرا بشه از فلش خونده میشه و اجرا میشه (حتی به SRAM هم احتیاجی نیست - واسه همین بعضی میکروها اصلا رم ندارن - مثل tiny15)
                              متغیر ها هم که در رم ذخیره میشن (البته به غیر از متغیر های موقتی و اونایی که با کلمه ی register تعریف شدن)
                              حالا اگه یک اشاره گر از فضای حافظه ی خودش تجاوز کنه داده های دیگه ای رو بی اجازه تغییر میده و بی اعتبار میکنه.
                              نتیجه این چیزی نیست جز ناهنجاری
                              If the wind will not serve, take to the oars

                              دیدگاه

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