اطلاعیه

Collapse
No announcement yet.

محاسبه طول آرایه تک بعدی

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

    محاسبه طول آرایه تک بعدی

    با سلام
    آیا میشه طول یک آرایه را با یک دستوری و در یک تابعی محاسبه کرد ؟ و بعد ریخته بشه داخل یک متغیر ؟

    مثل: A[]={0x00,0x00,0x00,0x00
    از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

    #2
    پاسخ : محاسبه طول آرایه تک بعدی

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


    #define dim(x) (sizeof(x)/sizeof((x)[0]))

    int a[] = {...};

    for(i=0; i<dim(a); i++)
    a[i] = i;


    دیدگاه


      #3
      پاسخ : محاسبه طول آرایه تک بعدی

      با سلام

      خیلی ممنون که جواب دادین آقای آقازاده :nice:

      ولی من از دستورات چیزی متوجه نشدم

      میشه بیشتر توضیح بدین :redface:

      از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

      دیدگاه


        #4
        پاسخ : محاسبه طول آرایه تک بعدی

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

        راجع به مثال:
        خیلی وقتها هست که یا آرایه ای به طول نامشخص تعریف کردیم که خود کامپایلر بنا بر مقتضیاتی طول خاصی براش میگیره که ما نمیدونیم. و یا میخواییم کد قابل انعطاف تری بنویسیم. مثالی که زدم صرف نظر از اینکه آرایه a چند تا المان داره همواره درست کار میکنه. اگر آرایه 10 عنصری باشه (dim(a مساوی با مقدار 10 میشه و اگر 17 عنصری باشه مساوی با 17. در فرم عادی میبایستی توسط یک سمبل مثل N اول تعداد عناصر آرایه رو مشخص میکردیم و بعد برای تعریف و استفاده در for از اون N استفاده میکردیم:

        متد اول:

        #define N 10
        int a[N];

        for(i=0; i<N; i++)
        a[i] = i;


        متد دوم:

        int a[10];

        for(i=0; i<dim(a); i++)
        a[i] = i;


        کدومش راحتتره؟

        دیدگاه


          #5
          پاسخ : محاسبه طول آرایه تک بعدی

          هر دو رو فکر کنم متوجه شدم ولی یه مشکلی !

          تو هردو که طولشون رو به یه طریقی خودمون تعیین کردیم ! درسته ؟

          گفتین که این روش فقط تو کامپایلر جواب میده ولی من اینو میخوام بریزم تو میکرو , یعنی جواب نمیده ؟
          از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

          دیدگاه


            #6
            پاسخ : محاسبه طول آرایه تک بعدی

            ببین عزیز من. هر برنامه تا به مرحله اجرا برسه دو تا فاز بیشتر نداره.

            1- فاز کامپایل یعنی اون موقعی که کامپایلر داره زور میزنه از جفنگیاتی که نوشتیم سر در بیاره و بفهمه a یک آرایه هست و main یک تابع در فلان آدرس.

            2- فاز اجرا که درسته شما میدونی که main در آدرس مثلا 1000 نشسته و وقتی داره اونجا اجرا میشه یعنی که main داره اجرا میشه. ولی در اون زمان mainی وجود نداره و همش یک مشت کد و دیتا هست.

            حالا میخواد این دو تا فاز هر دو روی یک سیستم یکسان باشه مثل برنامه ای که روی PC مینویسین و اجرا میکنین و یا روی 2 سیستم متفاوت. مثل موقعی که با کد ویژن و WinAVR کد میزنین و بعد روی میکرو اجرا میکنین.

            استفاده از این ماکرو در زمان کامپایل منجر به تولید کد درست میشه. ولی این کد تا اجرا نشه نتیجه ای حاصل نمیشه. میخواد روی PC باشه میخواد میکرو.

            دیدگاه


              #7
              پاسخ : محاسبه طول آرایه تک بعدی

              ببخشید سرتونو درد آوردم :redface:

              متوجه منظورتون شدم :wow:

              نوشته اصلی توسط رضا آقازاده

              #define dim(x) (sizeof(x)/sizeof((x)[0]))

              int a[] = {...};

              for(i=0; i<dim(a); i++)
              a[i] = i;


              ولی بهتر نیست به جای دستور define# از یک تابع استفاده کنم ؟؟؟
              از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

              دیدگاه


                #8
                پاسخ : محاسبه طول آرایه تک بعدی

                نشد! نوشتن تابع دردی رو دوا نمیکنه. اگر میکرد که میرسیدیم سر مشکل اولیه شما. در حقیقت این ماکرو هم به نوعی یک تابع هست. منتهی تابعی که در زمان کامپایل اجرا میشه. ضمنا من باب اطلاعتون اپراتور sizeof جز اپراتور هایی هست که باید در زمان پیش پردازش برنامه تفسیر بشه و ما میخواستیم محاسبه حجم کل آرایه و حجم یک عنصر از آرایه رو به کامپایلر وا بذاریم. اگر این مورد رو میشد به زمان اجرا واگذار کرد که دیگه چکاری بود؟ بقول شما همون تابع رو استفاده میکردیم.
                تنها جایی که ممکنه بشه از یک تابع برای این کار استفاده کرد جاهایی هست که آرایه قبل از هر چیز به عنوان یک شیئ دیده میشه و طول این آرایه داخل خود آرایه نگهداری میشه. مثل محیط دات نت. که تازه اون موقع هم به نوشتن تابع احتیاجی نیست. البته مورد دومی هم هست. اگر فرض کنیم که کلیه آرایه ها بطور داینامیک تخصیص حافظه میشن و از اونجایی که معمولا مکانیسم هایی برای اخذ حجم حافظه تخصیص داده شده در این موارد وجود داره؛ و حجم یک عنصر معمولا در همه جای برنامه قابل دسترسی هست میشد برای این کار یک تابع هم نوشت. ولی اینجا اینجوری نیست.

                دیدگاه


                  #9
                  پاسخ : محاسبه طول آرایه تک بعدی

                  مرسی , توضیحات شما کاملا گویا و روان بود
                  فقط یه سوال
                  برداشتم از مورد دوم این بود که : چون طول آرایه مشخص نیست پس نمیشه تو حافظه ذخیره کرد (مثل eeprom) تا بتونیم از تابع برای اینکار استفاده کنیم , درسته ؟
                  از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

                  دیدگاه


                    #10
                    پاسخ : محاسبه طول آرایه تک بعدی

                    من همچین چیزی نگفتم. و واقعا هم منظورتون رو متوجه نشدم.

                    دیدگاه


                      #11
                      پاسخ : محاسبه طول آرایه تک بعدی

                      نوشته اصلی توسط رضا آقازاده
                      البته مورد دومی هم هست. اگر فرض کنیم که کلیه آرایه ها بطور داینامیک تخصیص حافظه میشن و از اونجایی که معمولا مکانیسم هایی برای اخذ حجم حافظه تخصیص داده شده در این موارد وجود داره؛ و حجم یک عنصر معمولا در همه جای برنامه قابل دسترسی هست میشد برای این کار یک تابع هم نوشت. ولی اینجا اینجوری نیست.
                      منظورم این جمله بود :mrgreen: اگه میشه بیشتر توضیح بدین در صورت امکان با مثال :redface:
                      از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

                      دیدگاه


                        #12
                        پاسخ : محاسبه طول آرایه تک بعدی

                        نوشته اصلی توسط shahin2222
                        منظورم این جمله بود :mrgreen: اگه میشه بیشتر توضیح بدین در صورت امکان با مثال :redface:
                        فکر کنم منظورتون وکتور باشه
                        برای وکتور یه تابع هست که size اون رو میده

                        دیدگاه


                          #13
                          پاسخ : محاسبه طول آرایه تک بعدی

                          سلام آقای رجب زاده
                          دیگه بدتر !!! :mrgreen: وکتور چی هست حالا ؟؟؟ :biggrin:
                          از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

                          دیدگاه


                            #14
                            پاسخ : محاسبه طول آرایه تک بعدی

                            آقای آقازاده ممنون که با جون و دل اطلاعاتتون رو در اختیار من و دوستان دیگه قرار میدید.

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

                            دیدگاه


                              #15
                              پاسخ : محاسبه طول آرایه تک بعدی

                              بعضی جاها؛ مثلا در visual studio؛ تابعی داریم بنام msize_ که حجم بلوک تخصیص داده شده توسط یکی از توابع malloc و calloc و realloc رو برمیگردونه. اگر فرض کنیم که آرایه شما در heap تخصیص حافظه داده شده باشه میشه حجم این حافظه رو با این تابع گرفت و بر اساس روشی که عرض کردم طول آرایه ای رو که داخل این حافظه جا میشه رو پیدا کرد. که بهش میگیم: طول آرایه.

                              دیدگاه

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