کست کردن در برنامه نویسی

ممنون استاد.برای کست کردن یه مثال میزنید.مفهومشو خوب متوجه نشدم.مثلا توی اردوینو که میخاستیم دو strnig رو مقایسه کنیم متغییر هارو به string کست میکردیم.

درسته

ولی خیلی بهتر هست که اگه از c++ استفاده می کنید، از ابتدا از string استفاده کنید. کاری که ما کردیم جنبه آموزشی داشت.

لطف کردید مهندس.فقط من تفاوت string ها در c و c++ رو نفهمیدم.هردو که char array هستن و تهشون یک نال دارند.توی اردوینو و کد ویژن تفاوتی احساس نکردم

اون مثالی که توی arduino زدیم مورد خاصی بود. درواقع هدف ما مقایسه کردن دو string در c++ بود. ولی c به ما این ابزار رو نمی ده. (البته کتابخانه هایی برای کار با string در c وجود دارن ولی خوب c++ خیلی بهتر هست در این زمنیه)
ما با علم به اینکه string چطوری در زبان های c و c++ بوجود میاد، اومدیم string های مدل c ساختیم و موقع مقایسه، با استفاده از کست کردن به کامپایلر گفتیم که اینا string های مدل c++ هستن و به اون صورت مقایسه رو انجام دادیم. اینها همه برای آموزش مفاهیم و تمرین استفاده شدن.
ولی در دنیای واقعی، شما معمولا وقتی که دارید از کتابخانه های دیگه استفاده می کنید مجبور میشید از کست استفاده کنید. مثلا شما یک مقداری رو به صورت int در حافظه دارید و با یک کتابخانه می خواید عملیاتی روش انجام بدید. ولی کتابخانه شما ورودیش uint16_t هست و شما می دونید که این دو نوع زیاد فرقی با هم ندارن و برای جلوگیری از error و warning های کامپایلر، موقعی که دارید متغیر رو پاس میدید به تابع، کست شده اون رو پاس میدید.

البته یکی از کاربردهای خیلی خیلی مهم کست کردن در pointer ها اتفاق میفته. مثلا شما یک pointer به داده ای دارید که نمی دونید از چه نوعی هست. برای همین اون pointer رو از نوع void * تعریف می کنید و در طول برنامه هرجا که خواستید از اون استفاده کنید، با توجه به شرایط و تعریف برنامه، می تونید اون رو کست کنید به مثلا int و به کامپایلر بگید این pointer که من داشتم که معلوم نبود به چه نوع داده ای اشاره می کنه، به یک integer اشاره می کنه و کامپایلر هم از این به بعد اون رفتار رو با اون pointer می کنه. ولی این مبحث کاربردهای بسیار خاص و پیچیده داره و در قسمت های مقدماتی و متوسط زبان c جا نمیشه. اگه علاقه مند بودید به این مطلب، پیشنهاد می کنم توی گوگل c void pointer رو سرچ کنید و بخونید.

پس ما توی اردوینو یه سری string مدل c ساختیم و به جای اینکه بیایم دونه به دونه مولفه های این string ها رو بررسی کنیم به کامپایلر گفتیم این دو ارایه رو به چشم string ببین.یعنی اگه نمیگفیتم به چشم string ببین این مقایسه در ابعاد c اشتباه بود؟

مهندس برای نشون دادن اینکه یه عدد هرثانیه یه دونه بهش اضافه میشه و روی ال سی دی نمایش دادنش با sprintf خیلی جالب و عالی بود.سوالم اینه که میشد کاراکتر ‘0’ تو یه char ریخته بشه و ما از دستور ( lcd_putchar( (int) a استفاده کنیم ؟و هر بار کست شده اون کاراکتر رو یکی اضافه کنیم؟ (از اورفلو شدن و اینکه با کاراکتر میشه تا 255 رو نشون داد صرف نظر کنیم)

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

[upl-file uuid=90d91764-e811-4d84-9480-9afaa0361acd size=1kB]new-text-document.c[/upl-file]

با سلام، مطمئن نیستم که سوال رو درست متوجه شدم. ببینید cast کردن فقط نحوه دید برنامه به یک قسمت از حافظه رو عوض می کنه و کار خاصی انجام نمیده. برای همین شما اگر کاراکتر ۱ رو کست کنید به عدد، بهتون عدد ۱ رو نمیده. بهتون معادل ascii همون کاراکتر رو میده و صرفا به اون قسمت از حافظه با دید عددی نگاه می کنه.
در مورد سوال دوم هم به نظرم باید اطلاعات بیشتری بهم بدید. اگر می شه روی کاغذ سناریو رو رسم کنید تا بتونم شرح پروژه رو درک کنم. ولی حدس می زنم اون قسمت که ما روی lcd یک بازی می سازیم (اون آدمک که باید از دست موانع فرار کنه)، بهتون دید خیلی خوبی میده درباره کار اینچنینی با lcd.

تفاوتشون در نحوه برخورد کامپایلر باهاشون هست. چونکه c++ شی گرا هست، متغیرهای از نوع string در واقع object هایی از کلاس string هستن و یک سری method و property دارن که این مفاهیم برای c بی معنا هست.

کاملا درک شد.مرسی