নিম্নলিখিত "সি" কোডটি বিবেচনা করুন:
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
উত্স কোডের শেষে সংজ্ঞায়িত করা হয়েছে এবং এটির ব্যবহারের আগে কোনও ঘোষণা সরবরাহ করা হয় না main()
। খুব সময় যখন কম্পাইলার সূচিত এ Func_i()
মধ্যে main()
, তা থেকে বেরিয়ে আসে main()
এবং আউট খুঁজে বের করে Func_i()
। কম্পাইলার একরকম দ্বারা ফিরে মান খুঁজে বের করে Func_i()
এবং তা দেয় printf()
। আমি আরও জানতে পারি যে কম্পাইলার খুঁজে পাচ্ছি না রিটার্ন টাইপ এর Func_i()
। এটা করে ডিফল্ট (অনুমান?) লাগে রিটার্ন টাইপ এর Func_i()
হতে int
। যদি কোডটি থাকে float Func_i()
তবে সংকলকটি ত্রুটি দেয়: এর জন্য দ্বন্দ্বমূলক প্রকারFunc_i()
।
উপরের আলোচনা থেকে আমরা দেখতে পাই যে:
সংকলক দ্বারা প্রত্যাশিত মানটি খুঁজে পেতে পারে
Func_i()
।- যদি সংকলকটি
Func_i()
বেরিয়ে এসেmain()
উত্স কোডটি অনুসন্ধান করে ফিরে পাওয়া মানটি খুঁজে পেতে পারে , তবে কেন এটি স্পষ্টভাবে উল্লিখিত ফানক_আই () এর ধরণটি খুঁজে পাবে না ।
- যদি সংকলকটি
সংকলকটি অবশ্যই জেনে রাখতে হবে যে
Func_i()
এটি টাইপ ফ্লোট - এ কারণেই এটি বিরোধী প্রকারের ত্রুটি দেয়।
- যদি সংকলক জানে যে
Func_i
এটি টাইপ ফ্লোটের, তবে কেন এটি এখনওFunc_i()
টাইপ ইন্টের মতো বলে ধরে নেওয়া হয় এবং বিবাদী প্রকারের ত্রুটি দেয়? কেন এটি জোর করেFunc_i()
প্রকারের ভাসমান হতে পারে না।
আমি পরিবর্তনশীল ঘোষণার সাথে একই সন্দেহ করেছি । নিম্নলিখিত "সি" কোডটি বিবেচনা করুন:
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
সংকলক ত্রুটি দেয়: 'ডেটা_আই' অঘোষিত (এই ফাংশনে প্রথম ব্যবহার)।
- যখন কম্পাইলার দেখেন
Func_i()
, এটা () মান Func_ দ্বারা ফিরে এটি সোর্স কোড যায় নিচে। সংকলক কেন ডেটা ভেরিয়েবলের জন্য একই কাজ করতে পারে না?
সম্পাদনা:
সংকলক, এসেম্বলার, প্রসেসর ইত্যাদির অভ্যন্তরীণ কাজের বিবরণ আমার জানা নেই আমার প্রশ্নের প্রাথমিক ধারণাটি হ'ল আমি যদি ব্যবহারের পরে সোর্স কোডটিতে ফাংশনের রিটার্ন-মানটি লিখি (লিখি) তবে সেই ফাংশনটির পরে "সি" ভাষা কম্পিউটারকে কোনও ত্রুটি না করেই সেই মানটি খুঁজে পেতে দেয়। এখন কেন কম্পিউটার একই ধরণের সন্ধান করতে পারে না। Func_i () এর রিটার্ন মান পাওয়া যাওয়ায় ডেটা_আইয়ের ধরণটি কেন খুঁজে পাওয়া যাবে না। এমনকি যদি আমি extern data-type identifier;
বিবৃতিটি ব্যবহার করি তবে আমি সেই শনাক্তকারী (ফাংশন / ভেরিয়েবল) দ্বারা ফিরিয়ে দেওয়া মানটি বলছি না। কম্পিউটার যদি সেই মানটি খুঁজে পেতে পারে তবে কেন এটি টাইপটি খুঁজে পাচ্ছে না। কেন আমাদের মোটামুটি ফরওয়ার্ড ডিক্লেয়ারেশন দরকার?
ধন্যবাদ.
Func_i
। সুস্পষ্টভাবে অপরিজ্ঞাত ভেরিয়েবলগুলি ঘোষণার নিয়ম ছিল না, তাই দ্বিতীয় খণ্ডটি সর্বদা ত্রুটিযুক্ত ছিল। (হ্যাঁ, সংকলকগণ প্রথম নমুনাটি এখনও গ্রহণ করেন কারণ এটি বৈধ ছিল, যদিও opালু, C89 / C90 এর অধীনে))