(এটি 1994-05-06-এ এর লেখক, ডেভিড অ্যান্ডারসন comp.lang.c-এ পোস্ট করেছিলেন।)
ডেভিড অ্যান্ডারসন দ্বারা
“ঘড়ির কাঁটা/সর্পিল নিয়ম’ নামে পরিচিত একটি কৌশল আছে যা যেকোনো সি প্রোগ্রামারকে তাদের মাথায় যেকোনো C ঘোষণা পার্স করতে সক্ষম করে!
অনুসরণ করার জন্য তিনটি সহজ পদক্ষেপ রয়েছে:
-
অজানা উপাদান দিয়ে শুরু করে, সর্পিল/ঘড়ির কাঁটার দিকে সরান; নিম্নলিখিত উপাদানগুলিকে মুখোমুখি করার সময় সংশ্লিষ্ট ইংরেজি বিবৃতি দিয়ে প্রতিস্থাপন করুন:
-
(X) বা ()
-
=> অ্যারে X এর আকার… বা অ্যারে অনির্ধারিত আকার…
-
(টাইপ 1, টাইপ 2)
-
=> ফাংশন পাসিং টাইপ 1 এবং টাইপ 2 রিটার্ন হচ্ছে…
-
*
-
=> পয়েন্টার(গুলি) থেকে…
-
-
সমস্ত টোকেন কভার না হওয়া পর্যন্ত এটি একটি সর্পিল/ঘড়ির কাঁটার দিকে করতে থাকুন।
-
সর্বদা প্রথম বন্ধনীতে কিছু সমাধান করুন!
উদাহরণ #1: সরল ঘোষণা
+-------+ | +-+ | | ^ | | char *str(10); ^ ^ | | | +---+ | +-----------+
প্রশ্ন আমরা নিজেদের জিজ্ঞাসা: str কি?
“str হল একটি…
-
আমরা `str’ দিয়ে শুরু করে ঘড়ির কাঁটার দিকে সর্পিলাকার দিকে চলে যাই এবং প্রথম অক্ষরটি হল একটি `(‘ সুতরাং, এর মানে আমাদের একটি অ্যারে আছে, তাই…
“str হল একটি অ্যারে 10 এর…
-
একটি সর্পিল ঘড়ির কাঁটার দিকে চালিয়ে যান, এবং পরবর্তী জিনিসটি হল `*’ তাই, এর মানে আমাদের পয়েন্টার আছে, তাই…
“str হল পয়েন্টার 10 এর একটি অ্যারে…
-
একটি সর্পিল দিকে চালিয়ে যান এবং আমরা লাইনের শেষ (`;’) দেখতে পাচ্ছি, তাই চালিয়ে যান এবং আমরা `char’ টাইপে চলে যাই, তাই…
“str হল একটি অ্যারে 10 এর চারের দিকে পয়েন্টার”
-
আমরা এখন প্রতিটি টোকেন “পরিদর্শন করেছি’; তাই আমরা শেষ!
উদাহরণ #2: ফাংশন ঘোষণার নির্দেশক
+--------------------+ | +---+ | | |+-+| | | |^ || | char *(*fp)( int, float *); ^ ^ ^ || | | | +--+| | | +-----+ | +------------------------+
প্রশ্ন আমরা নিজেদেরকে জিজ্ঞাসা করি: fp কি?
“এফপি একটি…
-
একটি সর্পিল ঘড়ির কাঁটার দিকে চলমান, প্রথম জিনিসটি আমরা দেখি একটি `)’; সুতরাং, fp বন্ধনীর ভিতরে রয়েছে, তাই আমরা বন্ধনীর ভিতরে সর্পিলটি চালিয়ে যাই এবং পরবর্তী অক্ষরটি হল `*’, তাই…
“fp একটি নির্দেশক…
-
আমরা এখন বন্ধনীর বাইরে চলে এসেছি এবং একটি সর্পিল ঘড়ির কাঁটার দিকে চালিয়ে যাচ্ছি, আমরা `(‘ দেখতে পাচ্ছি; অতএব, আমাদের একটি ফাংশন আছে, তাই…
“fp হল একটি ফাংশনের একটি পয়েন্টার যা একটি int পাস করে এবং একটি পয়েন্টার ফ্লোট রিটার্ন করে…
-
একটি সর্পিল ফ্যাশনে অবিরত, আমরা তারপর `*’ অক্ষর দেখতে পাই, তাই…
“fp হল একটি ফাংশনের একটি পয়েন্টার যা একটি int পাস করে এবং একটি পয়েন্টার ফ্লোট করার জন্য একটি পয়েন্টার…
-
ক্রমাগত একটি সর্পিল ফ্যাশনে আমরা `;’ দেখতে পাই, কিন্তু আমরা সমস্ত টোকেন পরিদর্শন করিনি, তাই আমরা চালিয়ে যাই এবং অবশেষে `char’ টাইপ এ যাই, তাই…
“fp একটি int পাস করে একটি ফাংশনের একটি পয়েন্টার এবং একটি পয়েন্টারকে একটি চর-এ একটি পয়েন্টার ফিরিয়ে আনার জন্য একটি পয়েন্টার’
উদাহরণ #3: The “আলটিমেট”
+-----------------------------+ | +---+ | | +---+ |+-+| | | ^ | |^ || | void (*signal(int, void (*fp)(int)))(int); ^ ^ | ^ ^ || | | +------+ | +--+| | | +--------+ | +----------------------------------+
প্রশ্ন আমরা নিজেদেরকে জিজ্ঞাসা করি: ‘সংকেত’ কি?
লক্ষ্য করুন যে সংকেত ভিতরে বন্ধনী, তাই আমরা প্রথম এই সমাধান করতে হবে!
-
চলন্ত a ঘড়ির কাঁটার দিকে যে দিকটি আমরা দেখি `(‘ তাই আমাদের আছে…
সংকেত হল একটি ফাংশন যা একটি int এবং একটি…
-
হুম, আমরা একই নিয়ম `fp’-এ ব্যবহার করতে পারি, তাই… fp কি? fp বন্ধনীর ভিতরেও রয়েছে তাই আমরা একটি `*’ দেখতে পাচ্ছি, তাই…
fp একটি নির্দেশক…
-
একটি সর্পিল ঘড়ির কাঁটার দিকে চালিয়ে যান এবং আমরা `(‘, তাই…
“fp একটি ফাংশন পাসিং int রিটার্নিং এর একটি পয়েন্টার…”
-
এখন আমরা ফাংশন বন্ধনী থেকে বেরিয়ে যাই এবং আমরা শূন্যতা দেখতে পাই, তাই…
“fp একটি ফাংশন পাসিং int রিটার্ন কিছুই (অকার্যকর)’ একটি পয়েন্টার
-
আমরা fp দিয়ে শেষ করেছি তাই আসুন `সিগন্যাল’ ধরি, আমাদের এখন আছে…
সিগন্যাল হল একটি ফাংশন যা একটি int পাস করে এবং একটি ফাংশনে একটি পয়েন্টার যা একটি int রিটার্ন করে কিছুই (অকার্যকর) ফেরত দেয় না…
-
আমরা এখনও বন্ধনীর ভিতরে রয়েছি তাই পরবর্তী অক্ষরটি একটি `*’, তাই…
সিগন্যাল হল একটি ফাংশন যা একটি int এবং একটি ফাংশনে একটি পয়েন্টার পাস করে একটি int ফেরত দেয় না (অকার্যকর) একটি পয়েন্টারকে…
-
আমরা এখন বন্ধনীর মধ্যে আইটেমগুলি সমাধান করেছি, তাই ঘড়ির কাঁটার দিকে চালিয়ে, আমরা তারপর আরেকটি `(‘, তাই…
“সিগন্যাল হল একটি ফাংশন যা একটি int পাস করে এবং একটি ফাংশনে একটি পয়েন্টার যা একটি int ফেরত দেয় না (অকার্যকর) একটি ফাংশনে একটি পয়েন্টার ফেরত দেয় যা একটি int ফেরত দেয়…
-
অবশেষে আমরা চালিয়ে যাচ্ছি এবং শুধুমাত্র ‘অকার্যকর’ শব্দটি অবশিষ্ট আছে, তাই সংকেতের চূড়ান্ত সম্পূর্ণ সংজ্ঞা হল:
“সংকেত হল একটি ফাংশন যা একটি int পাস করে এবং একটি ফাংশনে একটি পয়েন্টার যা একটি int ফেরত দেয় না (void) একটি ফাংশনে একটি পয়েন্টার ফেরত দেয় একটি int ফেরত দেয় না (void)”
একই নিয়ম const এবং volatile এর জন্য প্রযোজ্য। উদাহরণ স্বরূপ:
const char *chptr;
-
এখন, chptr কি??
“chptr একটি অক্ষর ধ্রুবকের একটি নির্দেশক”
এই একটি সম্পর্কে কিভাবে:
char * const chptr;
-
এখন, chptr কি??
“chptr একটি ধ্রুবক নির্দেশক চর’
অবশেষে:
volatile char * const chptr;
-
এখন, chptr কি??
“chptr একটি অক্ষরের উদ্বায়ী একটি ধ্রুবক নির্দেশক।’
122 পৃষ্ঠায় K&R II তে পাওয়া উদাহরণগুলির সাথে এই নিয়মটি অনুশীলন করুন।
কপিরাইট © 1993,1994 ডেভিড অ্যান্ডারসন
যতক্ষণ লেখকের নাম এবং এই নোটিশটি বহাল থাকবে ততক্ষণ এই নিবন্ধটি অবাধে বিতরণ করা যেতে পারে।