اطلاعیه

Collapse
No announcement yet.

راهنمایی پیرامون عبارت

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

    راهنمایی پیرامون عبارت

    سلام
    لطفا در رابطه با عبارت زیر توضیح دهید .
    تشکر.

    کد:
    #define COUNTOF(__BUFFER__)  (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))

    #2
    پاسخ : راهنمایی پیرامون عبارت

    مشابه یک آرایه سایز بافر رو تعیین و با دیفاین تعدادش رو مشخص میکنه!
    با تقسیم سایز - تعداد بایت کل بافر به تعداد بایت یک عضو بافر میشه تعداد اعضای بافر!

    دیدگاه


      #3
      پاسخ : راهنمایی پیرامون عبارت

      سلام
      فرض بفرمایید آرایه زیر تعریف شده است:

      کد:
      uint8_t aTxBuffer[] = "****";
      و این آرایه به تابعی با پروتوتایپ زیر ارسال میشود:
      کد:
      void function((uint8_t*)aTxBuffer);
      و تعریف تابع بصورت زیر است:
      کد:
      void function(uint8_t *pTxData){
      hspi->pTxBuffPtr = pTxData;}
      چرا ارسال آرایه به تابع بصورت زیر نیست؟چرا که تا اونجا که میدونم، اسم یک آرایه، آدرس عضو اول آن است.

      کد:
      void function(aTxBuffer);

      دیدگاه


        #4
        پاسخ : راهنمایی پیرامون عبارت

        این هم همون کاری رو کرده که منظور شماست فرقی نداره! اگر منظورتون این (uint8_t*) هست تو لیست ارگومان ها! فقط داره به تابع میگه این ادرسی که به تابع ارسال شده میتونه در پوینتر با سایز uint8_t قرار بگیره! چون در لیست پارامتر ها پوینتر از نوع (uint8_t*) تعریف شده ارگومان هم باید از همین نوع باشه تا کامپایلر ایراد نگیره و در c++ اینطور هست نه در c
        تاکید هست و برای محافظت از نوع کار خاصی روی داده انجام نمیده

        دیدگاه


          #5
          پاسخ : راهنمایی پیرامون عبارت

          سلام
          c++ اینطور هست نه در c
          البته این ، قسمتی از یک کد به زبان c بود.
          سوال(زبان c):
          فرض بفرمایید استراکچر زیر تعریف شده است:
          کد:
          typedef struct
          {
           void   (*Init)(uint16_t, uint32_t);
           uint16_t (*ReadID)(uint16_t); 
           void   (*Config)(uint16_t, uint32_t, uint32_t, uint32_t);
          }CAMERA_DrvTypeDef;
          و همچنین عبارت زیر:
          کد:
          CAMERA_DrvTypeDef  ov7670_drv = 
          {
          	ov7670_Init,
          	ov7670_ReadID,
          	ov7670_Config,
          };
          کد:
          void   ov7670_Init(uint16_t DeviceAddr, uint32_t resolution);
          void   ov7670_Config(uint16_t DeviceAddr, uint32_t feature, uint32_t value, uint32_t BR_value);
          uint16_t ov7670_ReadID(uint16_t DeviceAddr);
          در قسمتی از کد ، عبارتی به صورت زیر استفاده شده است:
          کد:
          ov7670_drv.ReadID(CAMERA_I2C_ADDRESS)
          سوالم این هست که تناظر میان توابع عبارت دوم و استراکچر اول (مثلا تابع ReadIDبه ov7670_ReadID ) بر چه اساس است؟ چرا که صرفا تشابه اسمی وجود دارد.
          سوال دوم :

          کد:
          #define buff        0x64000000
          کد:
          F1((uint8_t *)buff);
          تابع F1 به صورت زیر تعریف شده است:
          کد:
          void F1(uint8_t *buff)
          {  
           /* Start the Camera capture */
           F2(&hdcmi_eval, DCMI_MODE_CONTINUOUS, (uint32_t)buff, GetSize(current_resolution)); 
          }
          سوالم این هست که نقش اشاره گر buff در این بین چیست و اینکه آیا مقدار ارسال شده توسط buff به تابع F2 همان 0x64000000 است؟
          تشگر.

          دیدگاه


            #6
            پاسخ : راهنمایی پیرامون عبارت

            منظورم از c++ بودنش این بود کامپایلر های جدیدتر این موارد رو ایراد میگیرن وگرنه در c این کد بدون تاکید هم جواب میده
            سوال اول:
            بر اساس ارگومان ها مشابه اورلود کردن توابع
            دوم:
            این هم همون تاکید هست اینکه پارامتر تابع اف حتما از نوع uint8_t * هست تا کامپایلر ایراد نگیره! چون مقدار 640000.. برای buff ادرس هست نه خود مقدار داخل این ادرس! ولی تابع با مقدار داخل buff یا همون مقداری که در خانه ی 64000... ذخیره شده کار میکند برای همین باید به تابع فهماند که این مقداری که به تابع ارسال شده محتوای خانه ی 640000.. هست که ممکن هست هر مقداری باشد

            دیدگاه


              #7
              پاسخ : راهنمایی پیرامون عبارت

              بر اساس ارگومان ها مشابه اورلود کردن توابع
              (منظور از اُوِرلود رو نفهمیدم )اگر منظورتون آرگومان های ورودی است ، در صورت مشابه بودن آنها ، تعیین تناظر به چه صورت خواهد شد؟

              دیدگاه


                #8
                پاسخ : راهنمایی پیرامون عبارت

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

                دیدگاه


                  #9
                  پاسخ : راهنمایی پیرامون عبارت

                  سلام
                  فرض بفرمایید که یک اشاره گر در حال اشاره به عضو اول یک آرایه دوبعدی است([0][0])
                  آیا در صورت اضافه شدن به مقدار اشاره گر و رسیدن به انتهای سطر اول، با اضافه شدن یک مقدار دیگر، به سطر دوم و ستون اول اشاره خواهد کرد و به همین ترتیب تا آخرین عضو(سطر و ستون آخر) پیش خواهد رفت؟
                  تشکر.

                  دیدگاه


                    #10
                    پاسخ : راهنمایی پیرامون عبارت

                    همینطوره!
                    و برای اشاره به عضو ij از ارایه ی a با دیمانسیون X.Y میتونید به جای حالت معمول از i*Y+j استفاده کنید
                    دوست من شما یه کتابی پی دی افی چیزی در مورد c++ مطالعه کنید

                    دیدگاه


                      #11
                      پاسخ : راهنمایی پیرامون عبارت

                      به ساخت توابع هم نام با خروجی یکسان ولی حتما ارگومان های متفاوت اورلود کردن میگن! کامپایلر از روی لیست ارگومان ها تابع مورد نظر رو پیدا میکنه! نمیشه دو تابع داشت با اسم یکسان و لیست ارگومان یکسان و خروجی یکسان ولی میشه دو تابع با لیست ارگومان متفاوت داشت
                      این مطلب درست ولی فرض این سوال غیر از مطلب بالا است.
                      ببینید با استفاده از دستور ov7670_drv.ReadID باید احتمالا تابع ov7670_ReadID فراخوانی شود(صرفا از روی تشابه اسمی و آرگومان ها حدس میزنم) ، چرا که تابع (ReadID*) فاقد تعریف است و بصورت اشاره گر تعریف شده است ، حتی اگر دقت بفرمایید میبینید که آرگومان های ورودی دو تابع عینا یکسان نیست .
                      سوالم این هست که چگونه دستور ov7670_drv.ReadID معادل فراخوانی تابع ov7670_ReadID خواهد شد؟
                      تشکر.


                      اضافه شده در تاریخ :
                      همینطوره!
                      و برای اشاره به عضو ij از ارایه ی a با دیمانسیون X.Y میتونید به جای حالت معمول از i*Y+j استفاده کنید
                      دوست من شما یه کتابی پی دی افی چیزی در مورد c++ مطالعه کنید
                      http://www.eca.ir/forum2/index.php?t...2729#msg702729
                      سلام.
                      نه دوسته عزیز ، اینطور نیست که با اضافه شدن یک عدد ، به آخرین عدد یک سطر ، خودش به طور اتوماتیک بره به اول سطر بعدی و اول ستون بعدی . در سی /سی++ وقتی که بیاید هچین کاری بکنید ، از آرایه خارج میشید و به حافظه های دیگر اشاره میکنید ، با یه مقدار نامعلوم و کدتون با یه مقدار نامعلوم به کار خود ادامه میده ، و کامپایلر سی خارج شدن از این محدوده رو خطا نمیگیره ، برخلاف بقیه کامپایلر ها. یعنی شما اجاه دسترسی به حافطه خارج از محدوده رو خواهید داشت ، ولی مسئولیتش با خودتون هست.
                      شما یک برنامه نویس هستید ، باید اینطور چیزها رو خودتون طراحی کنید ، که میتونید با دوتا حلقه طراحی کرد.

                      دیدگاه


                        #12
                        پاسخ : راهنمایی پیرامون عبارت

                        نوشته اصلی توسط aseok
                        دوست من این چیزی که اینجا گفته برای ایندکس هست نه پوینتر! و نه ارایه ی چند بعدی
                        اگر در ارایه ی چند بعدی هم اگر نامساوی روبرو صحیح باشد X*Y<i*y+j به حافظه ی اختصاص نیافته اشاره کرده اید


                        نوشته اصلی توسط aseok
                        این مطلب درست ولی فرض این سوال غیر از مطلب بالا است.
                        ببینید با استفاده از دستور ov7670_drv.ReadID باید احتمالا تابع ov7670_ReadID فراخوانی شود(صرفا از روی تشابه اسمی و آرگومان ها حدس میزنم) ، چرا که تابع (ReadID*) فاقد تعریف است و بصورت اشاره گر تعریف شده است ، حتی اگر دقت بفرمایید میبینید که آرگومان های ورودی دو تابع عینا یکسان نیست .
                        سوالم این هست که چگونه دستور ov7670_drv.ReadID معادل فراخوانی تابع ov7670_ReadID خواهد شد؟
                        تشکر.
                        با اون مساوی که در تعریف استراکچر دوم گذاشته شده استراکپر اول به دومی کپی شده

                        دیدگاه

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