اطلاعیه

Collapse
No announcement yet.

ذخیره data در C

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

    ذخیره data در C

    data هایی که online داره تولید میآ‌شه رو چطوری توی c ذخیره میآ‌کنین؟

    #2
    پاسخ : ذخیره data در C

    شما با کمک تابع malloc یه قسمتی از حافظه رو به صورت داینامیک در اختیار میگیرید. بعد به کمک یه پوینتر دیتا رو ذخیره میکنید. در آخر هم با تابع free میتونید فضا رو به سیستم برگردونید.
    اگر حجم داده هم زیاد نیست میتونید یه آرایه به صورت استاتیک تعریف کنید و از اون استفاده کنید. تو این روش در آخر کار حافظه آزاد نمیشه.
    روش اول دیتا رو تو heap نگه میداره ولی دومی تو stack.خودتون بر اساس نیاز و نوع دیتا و ..... یکی از این روش ها رو انتخاب کنید.
    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

    دیدگاه


      #3
      پاسخ : ذخیره data در C

      از list و vector هم میآ‌تونم استفاده کنم؟ توی c++ منظورمه.. چطوری؟

      دیدگاه


        #4
        پاسخ : ذخیره data در C

        نوشته اصلی توسط negin-bahadori
        از list و vector هم میآ‌تونم استفاده کنم؟ توی c++ منظورمه.. چطوری؟
        شما گفته بودید C واسه همین من تابع malloc رو معرفی کردم وگرنه تو سی ++ راحت تر میتونید با new و delete حافظه رو به صورت داینامیک از حافظه بگیرید.
        شدنش که بله میشه اما این نکته رو یادتون باشه که کمی سرعت کار کمتر میشه به خاطر امکانات زیادی که این ها میدن. ولی اگه سرعت دریافت اونقدر بالا نیست و یا پردازنده به قدر کافی هست, این ها ساده تر میشه.
        اگر میخواید به صورت سطح بالا کار کنید و درگیر آدرس دهی و این حرف ها نشید, این سوال پیش میاد که وکتور یا لیست؟ ( یا حتی stack,queue ,string,deque,map,......)
        همه این ها data container های سی ++ هستند و بسته به این که دیتای دریافتی به چه شکل هست و چه جوری قرار هست خونده بشه,استفاده میشه. مثلا شما داده ها رو توی یه وکتور ذخیره میکنید. بعد از دریافت لازم میشه که چند تا ایتم رو از وسط این وکتور پاک کنید. به دلیل ماهیت وکتور برای پاک کردن یه ایتم تمام ایتم های بعد از این ایتم باید یه خونه حرکت کنند و این یعنی کلی انتقال بی مورد دیتا. تو همین مثال اگر به جای وکتور از لیست استفاده میشد برای پاک کردن یه ایتم به طور تصادفی از وسط لیست نیازی به جابجا کردن بقیه ایتم ها نیست! پس تو این مورد لیست مناسب تر هست.
        شما باید این که دیتا به چه شکل وارد میشن و به چه شکل استفاده میشن رو بررسی کنید تا بتونید یه container مناسب انتخاب کنید.
        قدیم ها یه تاپیک زده بودم و توابع string رو توضیح داده بودم. لینکش رو میزارم یه نگاهی بندازید. در تمام این کانتینر ها متد ها تقریبا شبیه هم هستند و با خوندن توضیحت اون تاپیک دیدتون به توابع باز تر میشه. برای اینکه در مورد این کانینر ها به طور کامل اطلاعات بگیرید هم لینک دوم عالیه!
        http://www.eca.ir/forum2/index.php?t...9691.msg330745
        http://www.cplusplus.com/reference/stl/
        [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

        دیدگاه


          #5
          پاسخ : ذخیره data در C

          wow..مرسیآ‌ از جوابتون
          میآ‌شه بگین فرق stack با heap چیه؟ و اینکه چه وقت اطلاعات توی stack و چه وقت اطلاعات توی heap ذخیره میآ‌شه؟

          دیدگاه


            #6
            پاسخ : ذخیره data در C

            نوشته اصلی توسط negin-bahadori
            wow..مرسیآ‌ از جوابتون
            میآ‌شه بگین فرق stack با heap چیه؟ و اینکه چه وقت اطلاعات توی stack و چه وقت اطلاعات توی heap ذخیره میآ‌شه؟
            به طور خلاصه میشه گفت که استک فضای آدرس دهی استاتیک هست ولی هیپ فضای داینامیک. حالا این یعنی چی؟! وقتی شما متغییری رو به صورت گلوبال تو برنامه به صورت معمول ( int a=3 ) تعریف میکنید, این متغییر در فضای استک به اندازه ی متغییر تعریف شده جا اشغال کرده. وقتی شما یه تابع رو صدا میزنید, آرگومان های اون از طریق استک به تابع منتقل میشه. حالا شما شرایطی رو در نظر بگبرید که به جای عدد صحیح یه ابجکت تعریف کردیم که 2 مگ از رم رو اشغال میکنه.مقدار داده ای که با هر بار صدا زدن تابع به استک اضافه میشه رو در نظر بگیرید......
            برای حل این مشکل آدرس دهی داینامیک رو ایجاد کردند. وقتی شما یه متغییر رو به صورت داینامیک ایجاد میکنید در فضای استک حجمی به اندازه یک پوینتر اشغال میکنه. وقتی اون رو مقدار دهی میکنید ( با صدا زدن تابع سازنده ابجکت) , در فضای هیپ اون ابجکت ساخته میشه و این که در کجای حافظه قرار گرفته در پوینتری که تو فضای استک ساخته شده بود قرار میگیره.حالا با صدا زدن توابع دیگر به جای انتقال یک ابجکت سنگین فقط یک پوینتر (4 بایت ) منتقل میشه.
            تو زبان هایی که سطح بالا تری دارند (مثل جاوا و سی شارپ) دیگه مفهومی به اسم پوینتر نداریم چون به طور پیش فرض آدرس دهی ها به صورت داینامیک صورت میگیره.مثلا تو زبان جاوا:
            Bitmap my_bitmap=null;
            با نوشتن این دستور اون پوینتری که صحبتش رو کردیم تو استک ساخته میشه و مقدار اون برابر 0 میشه که به این معنی این شی هنوز مقدار دهی نشده.
            تو توابعی این خط رو مینویسیم:
            my_bitmap=new Bitmap();
            با اجرای این دستور در هیپ این شی ساخته میشه و آدرس اون توی اون پوینتر قرار میگیره.شما این پوینتر رو هیچ وقت مستقیم بهش دسترسی ندارید اما سیستم داره از اون استفاده میکنه. ( برای اثباتش حالتی رو در نظر بگیرید که ابجکت هنوز برابر نال هست ولی شما یکی از متد های اون رو صدا میکنید.خیلی راحت با این کار سیستم کرش میکنه.چراش رو هم فکر کنم واضح هست)
            یه نکته جالب دیگه که این روش ایجاد میکنه این هست که با انتقال دادن اون از طریق تابع ها شی جدیدی ساخته نمیشه و عملیات روی همون شی انجام میشه. واسه همین وقتی یه شی رو به تابعی میفرستیم و اون تابع روی اون عملیاتی رو انجام میده, درآخر نیاز به return کردن اون شی نیست! همه ی بحث روی یه شی بوده و چیز جدیدی ایجاد نشده که برگردونده بشه!!!
            در این مورد کلی میشه حرف زد و مطالبی مثل garbage collector و.... رو بیان کرد که دیگه اینجا جاش نیست.( البته تو سی++ garbage collector نداریم و مدیریت حافظه با برنامه نویس هست!)
            خلاصه کنم مصالب رو!
            وقتی شما از توابع malloc ,free و کلمات کلیدی مثل new , delete استفاده نکردید! مقدار هیپ صفر هست. وقتی این ها وسط میان دیگه حجم هیپ و استک جدا جدا حساب میشه!
            [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

            دیدگاه

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