اطلاعیه

Collapse
No announcement yet.

یک مشکل کد نویسی در سی

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

    یک مشکل کد نویسی در سی

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

    سوال دوم رو اول میپرسم : خطوط زرد و سبز کنار IDE منظم نیس چطوریه ؟ هر رنگ مشخص کننده چیه
    سوال اولم هم این هست که قطعه کد بالا وقتی اجرا بشه روی ال سی دی عبارت زیر نمایش داده میشه چرا اینجور عبارتی نمایش میده ؟!
    اگه من متغیر b رو از 4 بایت به 0 بایت !! ( یعنی تعریف کنم char b[0] ) که اساسا اشتباس تو سی اندیس آرایه یکی بیشتر هست ، تعریف کنم این بار روی ال سی دی درست نشون میده و 1234 مینویسه


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

    #2
    پاسخ : یک مشکل کد نویسی در سی

    نوشته اصلی توسط mehran901
    سلام دوستان
    قطعه کد زیر رو ببینید :

    سوال دوم رو اول میپرسم : خطوط زرد و سبز کنار IDE منظم نیس چطوریه ؟ هر رنگ مشخص کننده چیه
    سوال اولم هم این هست که قطعه کد بالا وقتی اجرا بشه روی ال سی دی عبارت زیر نمایش داده میشه چرا اینجور عبارتی نمایش میده ؟!
    اگه من متغیر b رو از 4 بایت به 0 بایت !! ( یعنی تعریف کنم char b[0] ) که اساسا اشتباس تو سی اندیس آرایه یکی بیشتر هست ، تعریف کنم این بار روی ال سی دی درست نشون میده و 1234 مینویسه


    میخواستم دوستان راهنمایی کنن چطور آرایه ای شبیه به آرایه فوق رو میشه بدون اینکه با حلقه اندیس به اندیس کپی کرد تو آرایه دیگه کلش رو کپی کرد و به درستی روی ال سی دی نمایش داد
    اگه استرینگ بود فرضا دستور strcpy ... ولی strcpy برا ارایه char که این شکلی مقدار دهی شده باشه کارایی نداره
    سلام دوست عزیز
    سوال دومت رو اول پاسخ میدم:
    اگر از atmel studio استفاده میکنی اونوقت:
    رنگ سبز یعنی اون خط save شده
    رنگ زرد یعنی اونخط تغییر پیدا کرده

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

    دیدگاه


      #3
      پاسخ : پاسخ : یک مشکل کد نویسی در سی

      نوشته اصلی توسط مهدی رهی


      درمورد lcd نمیدونم چون از کتابخونه ای که شما باهاش کار کردین اطلاعی ندارم و همینطور از دستور sprintf هم تقریبا بخاطر حجم کد بالایی که تولید میکنه استفاده نمیکنم و از روش کارش خبر ندارم.
      سلام لطف کردین میشه بگین شما از چه کتابخونه ای استفاده میکنید و بجای sprintf از چی استفاده میکنین ؟ itoa ?
      کلا روش حل شما برای مورد بالا چیه

      و سوال دیگه ای هم داشتم تو اتمل استادیو جایی نیست نشون بده چند درصد فلش میکرو اشغال شده ؟

      تشکر
      اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

      دیدگاه


        #4
        پاسخ : یک مشکل کد نویسی در سی

        با سلام
        دلیل اشکال اینکه درست از تعریف رشته یا استرینگ اگاهی ندارین.
        استرینگ یا رشته چیزی نیست جز ارایه ای از char که اخرش 0 بذارن، پس یه موجود مجزا نیست یک ارایه هست با قیودی خاص، شما می تونید بعد از رعایت قیود در ساخت ارایه از توابع رشته ای استفاده کنید یا مثل هر ارایه دیگری با اون رفتار کنید. نکته اینه که معمولا ارایه char با رشته اشتباه گرفته میشه، در حالی که بدون صفر اخر رشته معنا نداره، حالا اشکال شما اینه که ارایه رو اومدی 4 تایی تعریف کردی و 4 تا ریختی توش، پس صفرش کو؟ باید 5 تا تعریف می کردی و و اخرش رو 0 میذاشتی، حالا امکان داره بگی من که از توابع رشته استفاده نکردم، در حالی که کردی s% داخل sprintf داره رسما به رشته اشاره می کنه، پس حواستون به 0 اخر باشه، کلا توابع رشته از اول ارایه اینقدر میرن جلو تا به 0 برسن، حالا اگه 0 نباشه محتویات ادرس های دیکه رو هم به عنوان رشته حساب می کنن و پیش بینی رفتارشون سخت میشه، مثلا میشه برنامه برای بار اول کار کنه بعد از اون خراب و رفتار های دیگه، دلیل این که مثلا strcpy هم طول رشته رو نمی پرشه همینه چون دنبال 0 می گرده،
        برای ارایه ها هم توابع داریم مثل memcpy و یا memmove که برای کپی هستند , یا memchr که دنبال یه char تو ارایه می گرده و کلی توابع دیگه، نکته لازم اینه که تو این حالات توابع مثل memmove حتما طول رو هم از شما می خوان چون دیگه راهی برای فهمیدن پایان ارایه ندارن.
        The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

        دیدگاه


          #5
          پاسخ : یک مشکل کد نویسی در سی

          نوشته اصلی توسط hessam2013
          با سلام
          دلیل اشکال اینکه درست از تعریف رشته یا استرینگ اگاهی ندارین.
          استرینگ یا رشته چیزی نیست جز ارایه ای از char که اخرش 0 بذارن، پس یه موجود مجزا نیست یک ارایه هست با قیودی خاص، شما می تونید بعد از رعایت قیود در ساخت ارایه از توابع رشته ای استفاده کنید یا مثل هر ارایه دیگری با اون رفتار کنید. نکته اینه که معمولا ارایه char با رشته اشتباه گرفته میشه، در حالی که بدون صفر اخر رشته معنا نداره، حالا اشکال شما اینه که ارایه رو اومدی 4 تایی تعریف کردی و 4 تا ریختی توش، پس صفرش کو؟ باید 5 تا تعریف می کردی و و اخرش رو 0 میذاشتی، حالا امکان داره بگی من که از توابع رشته استفاده نکردم، در حالی که کردی s% داخل sprintf داره رسما به رشته اشاره می کنه، پس حواستون به 0 اخر باشه، کلا توابع رشته از اول ارایه اینقدر میرن جلو تا به 0 برسن، حالا اگه 0 نباشه محتویات ادرس های دیکه رو هم به عنوان رشته حساب می کنن و پیش بینی رفتارشون سخت میشه، مثلا میشه برنامه برای بار اول کار کنه بعد از اون خراب و رفتار های دیگه، دلیل این که مثلا strcpy هم طول رشته رو نمی پرشه همینه چون دنبال 0 می گرده،
          برای ارایه ها هم توابع داریم مثل memcpy و یا memmove که برای کپی هستند , یا memchr که دنبال یه char تو ارایه می گرده و کلی توابع دیگه، نکته لازم اینه که تو این حالات توابع مثل memmove حتما طول رو هم از شما می خوان چون دیگه راهی برای فهمیدن پایان ارایه ندارن.
          ممنون از پاسخ کاملتون
          بنده به شکل زیر کد رو اصلاح کردم :
          کد:
          char b[4] ;
          
          char a2[] = {'1','2','3','4','\0'} ;
          
          
          sprintf(b,"%s",a2);
          LCDWriteStringXY(0,0,b) ;
          و کاملا درست شد واقعا تشکر
          اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

          دیدگاه


            #6
            پاسخ : یک مشکل کد نویسی در سی

            خواهش می کنم،
            یه سوال، خب خود a2 هست دیگه چرا یه sprintf اضافه برای ریختنش تو b؟
            The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

            دیدگاه


              #7
              پاسخ : یک مشکل کد نویسی در سی

              نوشته اصلی توسط hessam2013
              خواهش می کنم،
              یه سوال، خب خود a2 هست دیگه چرا یه sprintf اضافه برای ریختنش تو b؟
              چون اون a2 رو به طور مثال نوشتم درواقع بافر دریافتی از پورت سریال هست کد کارت RFID داخلش ذخیره میشه مشکل مسخره ای که شاید باورتون نشه اینه که این بافر مثلا وقتی پر میشه شامل کد کارته خب ؟ کد کارت مثلا 12345 هست اگه a2 رو رو ال سی دی نمایش بدم 12345 نمایش داده میشه ولی وقتی بخوام با ی کد دیگه مقایسش کنم ببینم کارت درسته یا نه ، هرکدوم از اندیس های a2 مقادیری غیر از 1 2 3 4 5 دارن !!
              مثلا اومدن اندیس فرضا اولش رو نمایش دادم میبینم ی حرف روسی نوشته بجای مقدار 2 !
              برای رفع این مشکل اومدم تک تک اندیس هاشو توسط تابع sprintf ریختم تو ی بافر دیگه اون بافر درسته اونوقت ! هرکدوم از اندیس هاش مقداری ک بر میگردونه عدد های کارته و در نتیجه میشه مقایسه کرد

              جالبتر اینکه صد نفر با کدویژن بدون نیاز به این کارا جواب گرفتن ولی من نمیدونم چرا به این مشکلی تو اتمل استادیو رسیدم

              اینم نمیدونم چ صیغه ای بود والا !
              اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

              دیدگاه


                #8
                پاسخ : یک مشکل کد نویسی در سی

                حواستون هست که عدد و نمایشش متفاوتن؟ یعنی کارت اگر ارسال کنه 1 شما همون یک میکیری و قابل نمایش نیست، چون 1 قابل نمایش در حقیقت 31 هگز هست، باید به تفاوت اسکی و هگز و اینا هم فکر کنید
                The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                دیدگاه


                  #9
                  پاسخ : یک مشکل کد نویسی در سی

                  نوشته اصلی توسط hessam2013
                  حواستون هست که عدد و نمایشش متفاوتن؟ یعنی کارت اگر ارسال کنه 1 شما همون یک میکیری و قابل نمایش نیست، چون 1 قابل نمایش در حقیقت 31 هگز هست، باید به تفاوت اسکی و هگز و اینا هم فکر کنید
                  اره حرف شما درسته ولی من وقتی مثلا آرایه بافرم char هست یکی از اندیس هاشو بخونم بریزم تو ی char دیگه و اونو نشون بدم قاعدتا به همون شکل اولیه باید نشون داده بشه که نمیشد و متاسفانه نشد درستش کنم ولی با این روش حل شد :biggrin:
                  اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

                  دیدگاه


                    #10
                    پاسخ : یک مشکل کد نویسی در سی

                    نوشته اصلی توسط hessam2013
                    با سلام
                    دلیل اشکال اینکه درست از تعریف رشته یا استرینگ اگاهی ندارین.
                    استرینگ یا رشته چیزی نیست جز ارایه ای از char که اخرش 0 بذارن، پس یه موجود مجزا نیست یک ارایه هست با قیودی خاص، شما می تونید بعد از رعایت قیود در ساخت ارایه از توابع رشته ای استفاده کنید یا مثل هر ارایه دیگری با اون رفتار کنید. نکته اینه که معمولا ارایه char با رشته اشتباه گرفته میشه، در حالی که بدون صفر اخر رشته معنا نداره، حالا اشکال شما اینه که ارایه رو اومدی 4 تایی تعریف کردی و 4 تا ریختی توش، پس صفرش کو؟ باید 5 تا تعریف می کردی و و اخرش رو 0 میذاشتی، حالا امکان داره بگی من که از توابع رشته استفاده نکردم، در حالی که کردی s% داخل sprintf داره رسما به رشته اشاره می کنه، پس حواستون به 0 اخر باشه، کلا توابع رشته از اول ارایه اینقدر میرن جلو تا به 0 برسن، حالا اگه 0 نباشه محتویات ادرس های دیکه رو هم به عنوان رشته حساب می کنن و پیش بینی رفتارشون سخت میشه، مثلا میشه برنامه برای بار اول کار کنه بعد از اون خراب و رفتار های دیگه، دلیل این که مثلا strcpy هم طول رشته رو نمی پرشه همینه چون دنبال 0 می گرده،
                    برای ارایه ها هم توابع داریم مثل memcpy و یا memmove که برای کپی هستند , یا memchr که دنبال یه char تو ارایه می گرده و کلی توابع دیگه، نکته لازم اینه که تو این حالات توابع مثل memmove حتما طول رو هم از شما می خوان چون دیگه راهی برای فهمیدن پایان ارایه ندارن.
                    سلام
                    کاملا حرفتون درسته
                    قبلا من هم چنین درد سری رو با sprintf داشتم
                    امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                    دیدگاه


                      #11
                      پاسخ : یک مشکل کد نویسی در سی

                      دوستان تو کد ویژن و بسکام موقع کامپایل میگه چقدر از فلش پر شده یا ... تو اتمل استادیو مشخص نیس ؟
                      اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

                      دیدگاه


                        #12
                        پاسخ : یک مشکل کد نویسی در سی

                        نوشته اصلی توسط mehran901
                        دوستان تو کد ویژن و بسکام موقع کامپایل میگه چقدر از فلش پر شده یا ... تو اتمل استادیو مشخص نیس ؟

                        سلام دوست عزیز
                        یک نکته :حتما در atmel studio7 از گزینه
                        Rebuild solution
                        برای کامپایل (ساخت پروژت) استفاده کن در غیر اینصورت ممکنه با مشکلاتی روبه رو بشی که بحثش کمی وقت گیره

                        و پس از هر بار که پروژت رو بسازی (در اصطلاح غلط کامپایلش کنی) در پنجره Output تمامی اطلاعات پروژت به نمایش میاد از جمله مقدار فضای استفاده شده از حافظه فلش و حافظه sram که هم به بایت نشون میده و هم به در صد:
                        که در قسمت بالای عکس زیر نحوه Rebuild solution رو نشون دادم و در قسمت زیری عکس پنجره ای که اطلاعات پروژه رو نشون میده.


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

                        دیدگاه

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