ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 18
  1. #1
    2011/07/13
    484
    4

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

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

    مثل: A[]={0x00,0x00,0x00,0x00
    از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...
  2. #2
    2008/09/02
    اصفهان
    1,897
    37

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

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


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

    int a[] = {...};

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


  3. #3
    2011/07/13
    484
    4

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

    با سلام

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

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

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

    از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...
  4. #4
    2008/09/02
    اصفهان
    1,897
    37

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

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

    راجع به مثال:
    خیلی وقتها هست که یا آرایه ای به طول نامشخص تعریف کردیم که خود کامپایلر بنا بر مقتضیاتی طول خاصی براش میگیره که ما نمیدونیم. و یا میخواییم کد قابل انعطاف تری بنویسیم. مثالی که زدم صرف نظر از اینکه آرایه 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. #5
    2011/07/13
    484
    4

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

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

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

    گفتین که این روش فقط تو کامپایلر جواب میده ولی من اینو میخوام بریزم تو میکرو , یعنی جواب نمیده ؟
    از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...
  6. #6
    2008/09/02
    اصفهان
    1,897
    37

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

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

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

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

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

    استفاده از این ماکرو در زمان کامپایل منجر به تولید کد درست میشه. ولی این کد تا اجرا نشه نتیجه ای حاصل نمیشه. میخواد روی PC باشه میخواد میکرو.
  7. #7
    2011/07/13
    484
    4

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

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

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

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

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

    int a[] = {...};

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


    ولی بهتر نیست به جای دستور define# از یک تابع استفاده کنم ؟؟؟
    از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...
  8. #8
    2008/09/02
    اصفهان
    1,897
    37

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

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

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

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

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

    من همچین چیزی نگفتم. و واقعا هم منظورتون رو متوجه نشدم.
صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 18

موضوعات مشابه

  1. پاک کردن محتویات یک آرایه ی دو بعدی
    توسط ma-bah در انجمن میکروکنترلرهای AVR
    پاسخ: 2
    آخرين نوشته: 2011/12/28, 14:11
  2. سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)
    توسط arya1348 در انجمن میکروکنترلرهای AVR
    پاسخ: 10
    آخرين نوشته: 2011/05/28, 22:25
  3. بسکام آرایه چند بعدی نداره؟
    توسط narek در انجمن میکروکنترلرهای AVR
    پاسخ: 4
    آخرين نوشته: 2011/04/18, 23:54
  4. عینک های 3 بعدی برای دیدن فیلم های 3 بعدی ؟؟؟
    توسط مهدی مهری در انجمن مباحث علمی عمومی
    پاسخ: 3
    آخرين نوشته: 2010/06/01, 04:03
  5. مشکل با ارسال آرایه 3 بعدی به تابع
    توسط magician در انجمن میکروکنترلرهای AVR
    پاسخ: 10
    آخرين نوشته: 2009/05/30, 14:01

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

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

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