اطلاعیه

Collapse
No announcement yet.

c++ گروهی

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

    #31
    پاسخ : c++ گروهی

    نوشته اصلی توسط SAJAD-G
    خود حلقه مصرف نمیکنه، ولی به نظر خودم اون خروجی هایی که تو کنسول چاپ شدن باعث مصرف اینقدر حافظه شدن.
    دقیقا
    ولی سوال اینجاست که خروجی که نباید حافظه مصرف کنه. مستقیم باید بره رو خروجی دیگه درسته؟
    پس چرا حافظه مصرف میکنه؟

    دیدگاه


      #32
      پاسخ : c++ گروهی

      نوشته اصلی توسط hamidreza.nayeri
      دقیقا
      ولی سوال اینجاست که خروجی که نباید حافظه مصرف کنه. مستقیم باید بره رو خروجی دیگه درسته؟
      پس چرا حافظه مصرف میکنه؟
      اگه خروجیمون پرینتر بود آره حرف شما درست بود، ولی خروجیمون کنسوله.
      تمام خروجی ها تو پنجره کنسول نشون داده میشه و محتوای این پنجره خودش باید یه جایی تو حافظه داشته باشه.
      ;()((void (*)(void))0x0000))

      دیدگاه


        #33
        پاسخ : c++ گروهی

        نوشته اصلی توسط SAJAD-G
        اگه خروجیمون پرینتر بود آره حرف شما درست بود، ولی خروجیمون کنسوله.
        تمام خروجی ها تو پنجره کنسول نشون داده میشه و محتوای این پنجره خودش باید یه جایی تو حافظه داشته باشه.
        این حرف اشتباهه.
        حافظه مونیتور محدوده. اینطوری نیست که به صورت نامحدود باشه.
        وقتی شما مرتب روی خروجی اطلاعات چاپ میکنید، به پایین صفحه که میرسید دیگه حافظه جدید بهتون داده نمیشه عملا مثل تابلوی روان، همه خط ها یک خط میرن بالا و خط جدید روی پایین ترین خط overwrite میشه.

        اضافه شده در تاریخ :
        نوشته اصلی توسط hamidreza.nayeri
        این حرف اشتباهه.
        حافظه مونیتور محدوده. اینطوری نیست که به صورت نامحدود باشه.
        وقتی شما مرتب روی خروجی اطلاعات چاپ میکنید، به پایین صفحه که میرسید دیگه حافظه جدید بهتون داده نمیشه عملا مثل تابلوی روان، همه خط ها یک خط میرن بالا و خط جدید روی پایین ترین خط overwrite میشه.
        این به خاطر اینه که کتابخونه iostream خودش از بافر استفاده میکنه و یکی از باگهاش هم همینه.
        عملا وقتی سرعت پردازشتون زیاد باشه، نمیتونه به موقع اطلاعات رو روی خروجی چاپ کنه و شاید هم این کار رو میکنه تا وقت بیشتری به پردازنده داده بشه.
        در هر حال شما با استفاده از endl به جای "\n" یا cout.flush() میتونید این مشکل رو حل کنید.
        هم بافرتون به موقع خالی میشه و هم اطلاعاتتون به موقع روی صفحه نمایش داده میشه.

        دیدگاه


          #34
          پاسخ : c++ گروهی

          نوشته اصلی توسط hamidreza.nayeri
          این حرف اشتباهه.
          حافظه مونیتور محدوده. اینطوری نیست که به صورت نامحدود باشه.
          وقتی شما مرتب روی خروجی اطلاعات چاپ میکنید، به پایین صفحه که میرسید دیگه حافظه جدید بهتون داده نمیشه عملا مثل تابلوی روان، همه خط ها یک خط میرن بالا و خط جدید روی پایین ترین خط overwrite میشه.
          هیچ ربطی به مانیتور نداره، وقتی این همه دیتا چاپ بشن تو کنسول، مسلما همشون با هم اون تو جا نمیشن و کنسول اسکلرول میخوره و اسکلرول هم برای پیمایش خروجی ها استفاده میشه، پس خروجی جاش تو رمه که توسط کنسول نمایش داده میشه، و اگه اسکلرول کنسول هم بالا یا پایین کنید، خروجی های قدیمی تر و جدیدتر برای نمایش از حافظه به کنسول آورده میشن.
          این عکس مال بعد از توقف برنامه بود. و خروجی ها هنوز تو کنسول قابل پیمایش بودن.
          ;()((void (*)(void))0x0000))

          دیدگاه


            #35
            پاسخ : c++ گروهی

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

            من روی مانیتور به صورت مستقیم اطلاعات فرستاده ام. میدونم این طوریه. حافظه خروجی محدوده.
            این هم بخون خوبه.
            http://www.cplusplus.com/reference/ostream/ostream/flush/

            دیدگاه


              #36
              پاسخ : c++ گروهی

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

              دیدگاه


                #37
                پاسخ : c++ گروهی

                نوشته اصلی توسط hamidreza.nayeri
                1- تا چند سطر میتونستی خروجی های قبلیت رو ببینی؟
                تو برنامه های معمولیم تست کردم تقریبا همه خط ها رو میشد دید. ولی تو این کد چون سیستم فول تو هنگ بود، تست نکردم که چند خط رو میشد دید و رفتم رم رو چک کردم دیدم پره و زدم که رم خالی بشه این عکس رو گرفتم و بعد برنامه هارو بستم.
                نوشته اصلی توسط hamidreza.nayeri
                2- سیستم عاملت چیه و با چه محیطی برنامه نویسی میکنی؟
                مکینتاش، و تو محیط Xcode کد مینویسم.
                ;()((void (*)(void))0x0000))

                دیدگاه


                  #38
                  پاسخ : c++ گروهی

                  سلام
                  به دلیل اینکه این تابع جزء توابع کتابخانه ای استاتیک کامپایلر میباشد ، پس این مشکل مربوط به کامپایلر مورد نظر است. چون به احتمال زیاد در تابع cout دیتا آبجکت ها به صورت داینامیک ایجاد شده و به صورت هیپ حافظه گرفته میشود و حافظه ی مورد نظر به سیستم عامل پس داده نمیشود و با افزایش مقدار این حافظه سیستم عامل برای فرایندهای دیگر حافظه کم آورده و crash میکند. البته رفتار سیستم عامل بسته به طراحیش به این قضیه متفاوت است و در برخی سیستم عامل ها ، فرایند خاطی بسته میشود( kill ) )
                  توجه کنید که cout یک تابع در قسمت std name space فایل iostream می باشد که با استفاده از overload کردن اوپرندها به این شکل در آمده .

                  برای اطمینان بنده همین کد را درون ویژوال استادیو امتحان کردم وبه مشکلی بر نخوردم.

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

                  (این مشکل تابع در برنامه های عادی باعث مشکل نمیشود ولی اینجا چون تو حلقه بینهایت افتاده ، مشکل ایجاد کرده)




                  اضافه شده در تاریخ :
                  راستی مساله ی دیگر در رابطه با کلمه ی کلیدی endl برای این تابع:

                  به صورت خیلی ساده ، cout به شکل یک بافر محدود عمل میکند و در صورتی که این بافر پر شود خود بخود اطلاعات را نمایش می دهد.

                  میتوان برای اینکه به تابع بگیم اطلاعات را بریزه بیرون از endl استفاده کنیم و تابع با رسیدن به endl ، بافر را خالی میکند.

                  این مشکل اصلا به endl و... ربطی پیدا نمیکند.
                  راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                  کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                  نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                  http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                  انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                  دیدگاه


                    #39
                    پاسخ : c++ گروهی

                    سلام.
                    ببینید من جدیدا رفتم سراغ یاد گیری زبان سی++ ،اما یه کتاب خود آموز سی دارم .
                    به نظر شما این خوبه یا برم کتاب سی ++ بخرم؟
                    اصلا فرقی هم داره؟ :nerd: :nerd:
                    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                    (پيش به سوي هدف)

                    دیدگاه


                      #40
                      پاسخ : c++ گروهی

                      من یه بار دیگه همون کد رو اجرا کردم، و یه سری چیزای دیگه هم بررسی کردم:
                      اول اینکه: مقدار a رو از محدوده خودش هم رد کرد و تا مقدار 5میلیون هم رسید!
                      دوم اینکه: در کنار وضعیت رم ، وضعیت هارد هم بررسی کردم، و بعد از اینکه رم تا حدود 20مگابایت رسید، هارد شروع به دیتا نوشتن کرد، و کار به سواپینگ کشید.
                      بعد از توقف برنامه: اسکلرول خروجی رو بالا پایین کردم و دیدم که تمام مقدار ها از 0 تا 5میلیون رو داره.
                      علت همون چیزیه که گفتم.
                      ;()((void (*)(void))0x0000))

                      دیدگاه


                        #41
                        پاسخ : c++ گروهی

                        نوشته اصلی توسط SAJAD-G
                        من یه بار دیگه همون کد رو اجرا کردم، و یه سری چیزای دیگه هم بررسی کردم:
                        اول اینکه: مقدار a رو از محدوده خودش هم رد کرد و تا مقدار 5میلیون هم رسید!
                        دوم اینکه: در کنار وضعیت رم ، وضعیت هارد هم بررسی کردم، و بعد از اینکه رم تا حدود 20مگابایت رسید، هارد شروع به دیتا نوشتن کرد، و کار به سواپینگ کشید.
                        بعد از توقف برنامه: اسکلرول خروجی رو بالا پایین کردم و دیدم که تمام مقدار ها از 0 تا 5میلیون رو داره.
                        علت همون چیزیه که گفتم.
                        من ندیدم شما چه فرمودید . الان میرم میبینم.

                        راستی یک سوال داشتم خدمتتون . در رابطه به جمله ی زیر:
                        اول اینکه: مقدار a رو از محدوده خودش هم رد کرد و تا مقدار 5میلیون هم رسید!


                        منظورتون چیه؟

                        (میشه بگید علت را در چه پستی گفتید؟ این مساله برام خیلی جالب شده :rolleyes


                        اضافه شده در تاریخ :
                        راستی در رابطه با مورد دوم که فرمودید:

                        دقیقا این رفتار (swap) کاملا منطقی است.

                        اتفاقا دقیقا مواجهه با همین مساله در کتاب استالینگز بررسی شده ، همچنین در کتاب استاد داوودیان هم در صفحه ی 257 به این مساله پرداخته شده. من با دیدن پستتون یادم اومد و سریع رفتم سراغ کتاب :icon_razz: :rolleyes:

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

                        دیگه صد در صد به پست یکی مونده به آخر صفحه ی قبلم مطمئن شدم
                        راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                        کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                        نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                        انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                        دیدگاه


                          #42
                          پاسخ : c++ گروهی

                          با احترام به همهٔ دوستانی که اینجا تبادل اطلاعات کردن ...میآ‌شه خواهش کنم این بحثِ شیرین و دیگه ادامه ندید؟ خیلی اطلاعات خوبیآ‌ توش رد و بدل میآ‌شه اما هدف اصلیآ‌ و کمرنگ میآ‌کنه..دقیقا شبیه همهٔ پستآ‌های خوبیآ‌ که توی این فروم گذاشته میآ‌شه و به ناگاه به بیراهه میره و دیگه ادامه دار نمیآ‌شه...

                          دیدگاه


                            #43
                            پاسخ : c++ گروهی

                            بله، سواپینگ کاملا روش به جایی هست.
                            نوشته اصلی توسط RubeuS
                            در رابطه به جمله ی زیر:
                            اول اینکه: مقدار a رو از محدوده خودش هم رد کرد و تا مقدار 5میلیون هم رسید!
                            منظورتون چیه؟
                            a از نوع اینتیجر تعریف شده و باید نهایت به اندازه 2 بایت مقدار بگیره، ولی این تا 5میلیون مقدار گرفت.
                            دلیلم هم تو این پست گفتم:
                            نوشته اصلی توسط SAJAD-G
                            هیچ ربطی به مانیتور نداره، وقتی این همه دیتا چاپ بشن تو کنسول، مسلما همشون با هم اون تو جا نمیشن و کنسول اسکلرول میخوره و اسکلرول هم برای پیمایش خروجی ها استفاده میشه، پس خروجی جاش تو رمه که توسط کنسول نمایش داده میشه، و اگه اسکلرول کنسول هم بالا یا پایین کنید، خروجی های قدیمی تر و جدیدتر برای نمایش از حافظه به کنسول آورده میشن.
                            این عکس مال بعد از توقف برنامه بود. و خروجی ها هنوز تو کنسول قابل پیمایش بودن.
                            ************************************************** ***************************************
                            خب
                            از اصل مطلب خیلی منحرف شدیم، اگه اجازه بدین بریم سر اصل موضوع.
                            تا اینجا شرط ها و حلقه ها رو بررسی کردیم و در مورد یه سری نکاتش بحث کردیم.
                            بریم دنبال ادامه تاپیک. موضوع بعدی رو مشخص کنید. :smile:

                            ;()((void (*)(void))0x0000))

                            دیدگاه


                              #44
                              پاسخ : c++ گروهی

                              نوشته اصلی توسط SAJAD-G
                              بله، سواپینگ کاملا روش به جایی هست.a از نوع اینتیجر تعریف شده و باید نهایت به اندازه 2 بایت مقدار بگیره، ولی این تا 5میلیون مقدار گرفت.
                              دلیلم هم تو این پست گفتم:********************************************* ********************************************
                              خب
                              از اصل مطلب خیلی منحرف شدیم، اگه اجازه بدین بریم سر اصل موضوع.
                              تا اینجا شرط ها و حلقه ها رو بررسی کردیم و در مورد یه سری نکاتش بحث کردیم.
                              بریم دنبال ادامه تاپیک. موضوع بعدی رو مشخص کنید. :smile:
                              من یک پست دیگه میدم و وااسلام ،(اگرم در رابطه ++C مشکلی بود در خدمتم )

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

                              مثال : در کامپایلر turbo C مقدار دیتا آبجکت از نوع int دو بایته.

                              در VS2008 و VS2010 این مقدار 4 بایته

                              در VS2012 این مقدار 8 بایته !!!

                              اتفاقا این مساله مربوط به همین تاپیک میشه. و مساله ی بسار مهمیه که اکثرا را دیدم که درش اشتباه میکنن .

                              برای عملگر ++ تایپ دیتا آبجکت بسیار مهم است. به طوری که اگر اندازه ی آن دو بایت باشد بعد از مقدار 0xFFFF در محل آن دیتا آبجکت 0x0000 قرار داده میشود و zero flag ست میشود


                              در این رابطه عبارت زیر را گوگل کنید:
                              sizeof int xcode

                              --------------------------------------------------------------------------
                              ویرایش:

                              راستی من الان پستهاتون تو صفحات قبل دیدم و برای پاسخ ها ازتون تشکر میکنم . عالیست
                              راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                              کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                              نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                              http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                              انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                              دیدگاه


                                #45
                                پاسخ : c++ گروهی

                                نوشته اصلی توسط RubeuS
                                برای عملگر ++ تایپ دیتا آبجکت بسیار مهم است. به طوری که اگر اندازه ی آن دو بایت باشد بعد از مقدار 0xFFFF در محل آن دیتا آبجکت 0x0000 قرار داده میشود و zero flag ست میشود

                                میآ‌شه براش یه مثال بزنین؟

                                دیدگاه

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