اطلاعیه

Collapse
No announcement yet.

یک راه حل در اشغال رم(ارسال رشته)

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

    یک راه حل در اشغال رم(ارسال رشته)

    سلام به همه و عید فطر مبارک
    در برنامه نویسی به موضوعی برخورد کردم که تابحال راه حل ساده ای براش پیدا نکردم!
    تابع زیر رو در نظر بگیرید: (تابعی جهت ارسال یک رشته)

    کد:
    void send_str(char *const pStr, const int lenStr);
    یه تابع ساده که دوتا آرگومان داره:
    اولی یک اشاره گر به یک رشته هستش. (اون کلمه const که بعد از علامت “*” اومده باعث میشه از تغییر دادن آدرس درون اشاره گر جلوگیری بشه تا مطمئن باشیم به طور اشتباهی درون تابع آدرس اشاره گر تغییر نمیکنه)
    دومی طول دیتا جهت ارسال رو مشخص میکنه.

    -----------------------------
    مشکل: وقتی از این تابع به شکل زیر استفاده بشه:

    کد:
    send_str( “salam”, 5);
    رشته salam ارسال میشه و به میزان 5 Byte از ram اشغال میشه.
    حالا اگر دوبار از این تابع استفاده بشه:

    کد:
    send_str( “salam”, 5);
    send_str( “salam”, 5);
    رشته salam دو بار ارسال میشه اما این بار 10 Byte از Ram اشغال میشه.
    درواقع پس از هر بار استفاده از این تابع شاهد این هستیم که ram اشغالی هم افزایش پیدا میکنه.
    برای رفع این مشکل اشغال زیاد ram اومدم یه رشته به طول طولانی ترین متن ایجاد کردم و هر بار که قصد ارسال متنی رو دارم اول اون متن رو به صورت کاراکتر به کاراکتر درون اون رشته قرار میدم وبعد اراسل میکنم.
    اینجوری تنها به اندازه اون رشته فضای ram اشغال شده.
    مثال از این روش:
    کد:
    char mainStr[10] = “123”; //10 Byte use of Ram
    send_str( mainStr, 3); //not need to use new Ram.
    str[0] = ‘s’;
    str[1] = ‘a’;
    str[2] = ‘l’;
    str[3] = ‘a’;
    str[4] = ‘m’;
    send_str( mainStr, 5); //not need to use new Ram.
    send_str( mainStr, 5); //not need to use new Ram.
    مزیت این کار: اشغال شدن ram تنها به اندازه رشته ای که برای ارسال متن ها ساختیم.
    عیب کار: وقتی با یه متن طولانی روبه رو میشیم بار گذاری اون متن طولانی درون رشته خیلی وقت گیر هست.(فکر کنید بخوایم 200 متن 300 کاراکتری رو ارسال کنیم)

    دوستان راه حلی برای این هست که بشه به شیوه دیگه ای این کار رو کرد تا رم زیادی اشغال نشه و تا این حد هم استفاده وقت گیر نشه؟
    اي خدا ، من بايد از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از اين راه طعنه زنند. بايد به آن سنگدلاني که علم را بهانه کرده و به ديگران فخر ميآ*فروشند، ثابت کنم که خاک پاي من هم نخواهند شد. بايد همه آن تيره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترين و افتاده ترين مرد روي زمين باشم.
    شهيد دکتر مصطفي چمران
    اللهم صل علي محمد و ال محمد و عجل فرجهم
    ; C is not for children

    #2
    پاسخ : یک راه حل در اشغال رم(ارسال رشته)

    نوشته اصلی توسط mahdi89 نمایش پست ها
    سلام به همه و عید فطر مبارک
    در برنامه نویسی به موضوعی برخورد کردم که تابحال راه حل ساده ای براش پیدا نکردم!
    تابع زیر رو در نظر بگیرید: (تابعی جهت ارسال یک رشته)

    کد:
    void send_str(char *const pStr, const int lenStr);
    یه تابع ساده که دوتا آرگومان داره:
    اولی یک اشاره گر به یک رشته هستش. (اون کلمه const که بعد از علامت “*” اومده باعث میشه از تغییر دادن آدرس درون اشاره گر جلوگیری بشه تا مطمئن باشیم به طور اشتباهی درون تابع آدرس اشاره گر تغییر نمیکنه)
    دومی طول دیتا جهت ارسال رو مشخص میکنه.

    -----------------------------
    مشکل: وقتی از این تابع به شکل زیر استفاده بشه:

    کد:
    send_str( “salam”, 5);
    رشته salam ارسال میشه و به میزان 5 Byte از ram اشغال میشه.
    حالا اگر دوبار از این تابع استفاده بشه:

    کد:
    send_str( “salam”, 5);
    send_str( “salam”, 5);
    رشته salam دو بار ارسال میشه اما این بار 10 Byte از Ram اشغال میشه.
    درواقع پس از هر بار استفاده از این تابع شاهد این هستیم که ram اشغالی هم افزایش پیدا میکنه.
    برای رفع این مشکل اشغال زیاد ram اومدم یه رشته به طول طولانی ترین متن ایجاد کردم و هر بار که قصد ارسال متنی رو دارم اول اون متن رو به صورت کاراکتر به کاراکتر درون اون رشته قرار میدم وبعد اراسل میکنم.
    اینجوری تنها به اندازه اون رشته فضای ram اشغال شده.
    مثال از این روش:
    کد:
    char mainStr[10] = “123”; //10 Byte use of Ram
    send_str( mainStr, 3); //not need to use new Ram.
    str[0] = ‘s’;
    str[1] = ‘a’;
    str[2] = ‘l’;
    str[3] = ‘a’;
    str[4] = ‘m’;
    send_str( mainStr, 5); //not need to use new Ram.
    send_str( mainStr, 5); //not need to use new Ram.
    مزیت این کار: اشغال شدن ram تنها به اندازه رشته ای که برای ارسال متن ها ساختیم.
    عیب کار: وقتی با یه متن طولانی روبه رو میشیم بار گذاری اون متن طولانی درون رشته خیلی وقت گیر هست.(فکر کنید بخوایم 200 متن 300 کاراکتری رو ارسال کنیم)

    دوستان راه حلی برای این هست که بشه به شیوه دیگه ای این کار رو کرد تا رم زیادی اشغال نشه و تا این حد هم استفاده وقت گیر نشه؟
    سلام
    ببخشید من متوجه منظورتون نمیشم. ولی وقتی یک تابع فراخوانی میشه، به اندازه نیازش رم رو اشغال میکنه و بعد از خروج از تابع، حافظه اشغال شده به سیستم بر میگرده.
    اگر شما میخوایید یک رشته رو در یک آرایه کپی کنید، میتونید از تابع strcpy استفاده کنید که در فایل string.h قرار گرفته.

    char str[20];
    strcpy(str, "Hello World!");

    ضمنا توجه داشته باشید که رشته یک کاراکتر پایانی هم داره که به شکل '0\' هستش. اگر شما فرضا به صورت خونه به خونه عبارت salam رو در یک آرایه کپی میکنید، توی خونه بعد از کاراکتر m باید یک کاراکتر پایانی به شکلی که گفتم قرار بدید تا پایان رشته مشخص بشه.
    جدیدترین ویرایش توسط hossein.m98; ۱۵:۲۶ ۱۳۹۹/۰۳/۰۴. دلیل: تکمیل

    دیدگاه


      #3
      پاسخ : یک راه حل در اشغال رم(ارسال رشته)

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      ببخشید من متوجه منظورتون نمیشم. ولی وقتی یک تابع فراخوانی میشه، به اندازه نیازش رم رو اشغال میکنه و بعد از خروج از تابع، حافظه اشغال شده به سیستم بر میگرده.
      ممنون بابت راهنمایی
      چند موضوع برای روشن تر شدن:
      1- تابع برای متن های مختلف در جاهای مختلف و همینطور در main فراخونی میشه که در نتیجه رم اشغال شده رو آزاد نمیکنه و بعد کامپایل چندین کیلوبایت رم رو فقط برای این موضوع اختصاص میده.
      2- این تابع جهت منتقل کردن متن به واحد های مختلف ارسال میکرو مثل uart ، i2c ، spi و ... استفاده میشه برای همین به کاراکتر تهی نیازی نیست.

      مشکل اصلیه من همین قسمته که از پاسخ شما نقل قول کردم.
      اي خدا ، من بايد از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از اين راه طعنه زنند. بايد به آن سنگدلاني که علم را بهانه کرده و به ديگران فخر ميآ*فروشند، ثابت کنم که خاک پاي من هم نخواهند شد. بايد همه آن تيره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترين و افتاده ترين مرد روي زمين باشم.
      شهيد دکتر مصطفي چمران
      اللهم صل علي محمد و ال محمد و عجل فرجهم
      ; C is not for children

      دیدگاه


        #4
        پاسخ : یک راه حل در اشغال رم(ارسال رشته)

        نوشته اصلی توسط mahdi89 نمایش پست ها
        ممنون بابت راهنمایی
        چند موضوع برای روشن تر شدن:
        1- تابع برای متن های مختلف در جاهای مختلف و همینطور در main فراخونی میشه که در نتیجه رم اشغال شده رو آزاد نمیکنه و بعد کامپایل چندین کیلوبایت رم رو فقط برای این موضوع اختصاص میده.
        2- این تابع جهت منتقل کردن متن به واحد های مختلف ارسال میکرو مثل uart ، i2c ، spi و ... استفاده میشه برای همین به کاراکتر تهی نیازی نیست.

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

        دیدگاه

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