اطلاعیه

Collapse
No announcement yet.

cast

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

    cast

    سلام
    دوستان میشه بگین تو قطعه کد زیر درسته یا نه.
    من یه متغیر از نوع unsigned short دارم ، و میخام اونو تو دوتا متغیر از نو unsigned char بریزم
    قطعه کد زیر را ببینید
    کد:
    unsigned short i=4098  // binary : 0000111111111111
    unsigned char a[2];
    a[0]=i;
    a[1]=(i>>8);
    سوال لینه که ایا تو قطعه کد زیر ، 8بیت اول در a[0 و 8 بیت دوم در a[1 قرار میگیره؟
    باتشکر
    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

    #2
    پاسخ : cast

    من تقریبا فکر میکنم درسته (چون نرم افزار شبیه سازی ندارم که مطمئن شم)
    بتهره در این مواقع از اشاره گرها استفاده بشه اینطوری

    unsigned short int i=4098;
    unsigned char a[2];
    unsigned char* chptr=(unsigned char*)&i;
    a[0]= *chptr;
    chptr++;
    a[1]= *chptr;

    دیدگاه


      #3
      پاسخ : cast

      نوشته اصلی توسط mojalan
      من تقریبا فکر میکنم درسته (چون نرم افزار شبیه سازی ندارم که مطمئن شم)
      بتهره در این مواقع از اشاره گرها استفاده بشه اینطوری

      unsigned short int i=4098;
      unsigned char a[2];
      unsigned char* chptr=(* unsigned char)&i;
      a[0]= *chptr;
      chptr++;
      a[1]= *chptr;
      مهندس این قسمت چطور عمل میکنه
      کد:
      unsigned char* chptr=(* unsigned char)&i;
      خب شما اومدین i رو cast کردین.
      این قسمت به نظرم اشتباست. دلیل اول اینکه شما اگرم قرار باشه cast کنین ، چرا پشت unsigned char علامت * گذاشتین. دلیل دوم اینکه اگه شما i رو به unsigned cha تبدیل کنین ، 1 بایت دادمون از دست میره . کلا با فرض درست بودن با این خط مشکل دارم
      در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

      دیدگاه


        #4
        پاسخ : cast

        اشاره گرها با توجه به نوع داده ای که بهش اشاره میکنن رفتارشون کمی فرق داره مثلا وقتی به یه int دوباتی اشاره میکنند (یعنی آدرس یه int دوبایتی داخلشون ذخیره شده ) اونوقت جهششون در فضای آدرس دو تا دوتا میشه ولی اگه مثلا به یه char اشاره کنند جهشها هم یکی یکی میشه.
        خب ما در این قسمت کد
        نوشته اصلی توسط mojalan

        unsigned char* chptr=(unsigned char*)&i;
        به کامپایلر میفهمونیم که میخوایم از آدرس intآ‌ دو بایتی بصورت کاراکتری استفاده کنیم (یعنی جهشها یکی یکی باشه)
        از طرفی آدرس هر متغیر در واقع آدرس اولین بایت کم ارزش (در حالت little Endian) اون متغیر هست
        بعد محتویات جاییکه حالا chptrآ‌ (در واقع همون بایت اول متغیر i) رو داخل خونه a[0] میریزیم
        بعد اشاره گر یه خونه جلو میره (و چون نوع اشاره گر از int* به char* کست شده) پرش یه خونه به سمت جلو هست که در واقع میشه بایت دوم i

        اون گاف ستاره پشت unsigned charآ‌ هم اصلاح شد

        دیدگاه


          #5
          پاسخ : cast

          نوشته اصلی توسط mojalan
          اشاره گرها با توجه به نوع داده ای که بهش اشاره میکنن رفتارشون کمی فرق داره مثلا وقتی به یه int دوباتی اشاره میکنند (یعنی آدرس یه int دوبایتی داخلشون ذخیره شده ) اونوقت جهششون در فضای آدرس دو تا دوتا میشه ولی اگه مثلا به یه char اشاره کنند جهشها هم یکی یکی میشه.
          خب ما در این قسمت کد به کامپایلر میفهمونیم که میخوایم از آدرس intآ‌ دو بایتی بصورت کاراکتری استفاده کنیم (یعنی جهشها یکی یکی باشه)
          از طرفی آدرس هر متغیر در واقع آدرس اولین بایت کم ارزش (در حالت little Endian) اون متغیر هست
          بعد محتویات جاییکه حالا chptrآ‌ (در واقع همون بایت اول متغیر i) رو داخل خونه a[0] میریزیم
          بعد اشاره گر یه خونه جلو میره (و چون نوع اشاره گر از int* به char* کست شده) پرش یه خونه به سمت جلو هست که در واقع میشه بایت دوم i

          اون گاف ستاره پشت unsigned charآ‌ هم اصلاح شد
          ممنون از پاسختون
          کد تصحیح شده تو کامپابلر DEV جواب نمیده ، خطا میگیره
          i was not decleared in this scop
          مهندس باز متوجه نشدم :sad:
          من میدونم اشاره گرها چجوری کار میکنن .
          الان تو همین خط تصحیح شده ما اومدیم یه اشاره گر از نوع unsigned char بنام chptr تعریف کردیم. تا اینجا خب درسته. حالا برای مقدار دادن به این متغیر که از نوع اشاره گر هست ؛ ما باید ادرس یه متغیر از نوع unsigned char بهش بدیم. متغیری که ما داریم i هست و نوع اونم unsigned short هست .
          خب شما واسه اینکه i رو با اشاره گر chptr هماهنگ کنین ، نیازه که متغیر i به نوع unsigned char تبدیل بشه و ادرس اولین خونه درون chptr قرار بگیره .
          خب مشکل همینجاست ( ینی مشکل من )
          اون چیزی که من فک میکنم اینه که شما تو این خط اومدین i رو به یه اشاره گری از نوع unsigned char تبدیل کردین.
          ممنون میشم بیشتر توضیح بدین
          یاعلی
          در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

          دیدگاه


            #6
            پاسخ : cast

            آدرس i با دستور i& بدست میاد. این آدرس ؛ آدرس بایت با ارزش کمتر i هست (در فرمت Little Endian)
            برای اینکه از این آدرس استفاده کنیم و تک تک بایتهای i رو بدست بیاریم نیاز داریم که به کامپایلر بفهمونیم میخوایم اینکار رو بکنیم
            چون در غیر اینصورت کامپایلر گیر میده و از طرفی چون نوع اشاره گر int بوده پرشهای اون در حافظه دو بایت دوبایت هست
            اینجاست که cast انجام میشه و با یه دستور به کامپایلر میگیم این آدرس i رو بصورت * unsigned char استفاده کن

            نوشته اصلی توسط sejil
            خب شما واسه اینکه i رو با اشاره گر chptr هماهنگ کنین ، نیازه که متغیر i به نوع unsigned char تبدیل بشه و ادرس اولین خونه درون chptr قرار بگیره .
            خب مشکل همینجاست ( ینی مشکل من )
            اون چیزی که من فک میکنم اینه که شما تو این خط اومدین i رو به یه اشاره گری از نوع unsigned char تبدیل کردین.
            من آدرس iآ‌ رو تغییر نوع دادم نه خود i رو (به اون علامت & پشت i دقت کنید)

            دیدگاه


              #7
              پاسخ : cast

              ممنون گیر من هم همین بود عجب دستور باحالی بود میشه بگید از کجا اوردینش داخل کدویژن گشتم این دستور به این شکل نبود که بشه به کامپایلر فهموند...
              واقعا ممنون
              ومیشه برعکسش رو هم توضیح بدین؟
              درد من تنهايي نيست ، بلکه مرگ ملتي است که گدايي را قناعت، بي عرضگي را صبر، و باتبسمي بر لبان اين حماقت را حکمت خداوند مي نامند. ---((گاندي))---

              دیدگاه


                #8
                پاسخ : cast

                نوشته اصلی توسط b.saeed65
                ممنون گیر من هم همین بود عجب دستور باحالی بود میشه بگید از کجا اوردینش داخل کدویژن گشتم این دستور به این شکل نبود که بشه به کامپایلر فهموند...
                واقعا ممنون
                مهندس این کد نویسیه . مراجعه کن به مفهوم اشاره گرها . بالا هم تا حدودی گفتم چی به چیه.
                مهندس پروژه به نتیجه رسید قرار بده بقیه هم استفاده کنن :smile:
                یاعلی
                در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                دیدگاه


                  #9
                  پاسخ : cast

                  نوشته اصلی توسط sejil
                  مهندس این کد نویسیه . مراجعه کن به مفهوم اشاره گرها . بالا هم تا حدودی گفتم چی به چیه.
                  مهندس پروژه به نتیجه رسید قرار بده بقیه هم استفاده کنن :smile:
                  یاعلی
                  چشم سعی میکنم به صورت یک lib قرار بدم تا دوستان بتونن خیلی راحت با AT24cxx کار کنن

                  به مرجع c++ رجوع کنم؟
                  درد من تنهايي نيست ، بلکه مرگ ملتي است که گدايي را قناعت، بي عرضگي را صبر، و باتبسمي بر لبان اين حماقت را حکمت خداوند مي نامند. ---((گاندي))---

                  دیدگاه


                    #10
                    پاسخ : cast

                    نوشته اصلی توسط b.saeed65
                    چشم سعی میکنم به صورت یک lib قرار بدم تا دوستان بتونن خیلی راحت با AT24cxx کار کنن

                    به مرجع c++ رجوع کنم؟
                    فرق نمیکنه. تو اینترنت سرچ بزنی مطلب زیاد هست در موردش
                    یا اگه کتاب C هم داری میتونی استفاده کنی
                    سعی کن مفهومشو بفهمی. این فهمیدنش خیلی مهمه
                    یاعلی
                    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                    دیدگاه

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