প্রধান () দ্বারা প্রত্যাবর্তিত মান কে পাবে?


34

আমি জানি যে কম্পিউটারগুলিতে, main()ফাংশন দ্বারা প্রত্যাশিত মান অপারেটিং সিস্টেমের দ্বারা প্রাপ্ত হয়। কিন্তু, main()একটি মাইক্রোকন্ট্রোলারের কাজগুলিতে কী ঘটে ?


7
আমি যখন পিসি মাইক্রোকন্ট্রোলারদের জন্য সি ব্যবহার করি তখন আমি সর্বদা অকার্যকর প্রধান () ব্যবহার করি। মাইক্রোকন্ট্রোলারদের জন্য সি সংকলক ব্যবহার করার সময়, এটি মোটেও কিছু যায় আসে না। কারণ এমন কোনও অপারেটিং সিস্টেম নেই যা (মেনক) বলুন। যদি সেই মাইক্রোকন্ট্রোলারে আরটিওএস-এর মতো কিছু চলমান থাকে তবে অপারেটিং সিস্টেমটি হ'ল "মেইন.সি"।
আবদুল্লাহ কাহরামান


1
স্টার্টআপ ফাংশনটি কীভাবে সংজ্ঞায়িত করা হয় তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে আপনার উপর নির্ভর করে না। আপনি যে পরিবেশটি ব্যবহার করছেন তা সমর্থিত স্টার্টআপ ফাংশন ফর্মগুলি নথি করবে। হোস্টেড সি বাস্তবায়নের জন্য mainদুটি ভিন্ন স্বাক্ষরযুক্ত দুটি ফর্মকে সমর্থন করা প্রয়োজন , উভয়ই ফিরে আসে int। আপনি যদি একটি ফ্রিস্ট্যান্ডিং সি প্রয়োগকারী ব্যবহার করছেন, তবে সেই বাস্তবায়ন আপনাকে কীভাবে স্টার্টআপ ফাংশনটি লিখতে হবে তা নির্দেশ করে। voidফিরে আসার ফাংশনটি লিখতে পারে না কারণ এটি ফিরে আসে না। আচরণ ফিরে না এর ফাংশন থেকে ভিন্ন ধরনের সামগ্রিক কলিং নিয়মাবলী প্রভাবিত পারে।
কাজ

উত্তর:


42

একটি মাইক্রোকন্ট্রোলারের ক্ষেত্রে, main()কখনই প্রস্থান করা প্রত্যাশিত নয় এবং আচরণটি যদি এটি সংজ্ঞায়িত না করা হয় - তবে এটি মাইক্রোকন্ট্রোলারের জন্য সি রানটাইম যারাই লিখেছিল, এটি নির্ভর করে। আমি সিস্টেমগুলি দেখেছি যে:

  • চারপাশে একটি অন্তর্নিহিত লুপ রাখুন main(), যাতে এটি প্রস্থান করে, কেবল এটিকে আবার কল করা হবে।
  • একটি সরল "জাম্প-টু-সেল্ফ" লুপ রয়েছে যা যদি main()কখনও বাইরে চলে যায় তবে কার্যকর করা হবে ।
  • কেবলমাত্র কোড মেমরির বাকি যে থেকে কল অনুসরণ করে চালানো main()। একে বলা হয় "আগাছায় ছুটে যাওয়া"।

আমি এমনটি কখনও দেখিনি যা প্রত্যাবর্তিত মূল্য দিয়ে আসলে কিছু করে main()। এটি যদি আপনি আসলে যত্নবান হন তবে আপনার সিস্টেমের সি রানটাইম লাইব্রেরির উত্স কোড - এবং সম্ভবত সংশোধন করা উচিত।


1
তুমি আমাকে এটা দ্বারা মেরেছ. সিঙ্ক্রোনসিটির জন্য +1।
অ্যাডাম লরেন্স

9
প্রত্যাবর্তন মূল্যের মান নির্দিষ্ট main()করে সি স্ট্যান্ডার্ডটি intকোনও ওএস-কম মাইক্রোকন্ট্রোলারের কথা মাথায় রেখে ডিজাইন করা হয়নি। সুতরাং এটি অনির্দিষ্ট আচরণ এবং ডেভ তালিকাভুক্ত হিসাবে আপনার সি রানটাইমের উপর নির্ভর করে কিছু ঘটতে পারে।
ndim

4
সি একটি অপারেটিং সিস্টেম-কম মাইক্রোকন্ট্রোলার উপর চলমান একটি freestanding বাস্তবায়ন বিবেচনা করা যেতে পারে, এবং সি মান এমনকি একটি freestanding environent প্রয়োজন হয় না আছে একটি main()অনেক কম তার ফেরত মান নির্ধারণ। এটি বাস্তবায়নকারী পর্যন্ত।
কুতুলু মাইক 22'13

2
@ ইন্ডিম - কেশ বিভক্ত করা void main( void )হ'ল বাস্তবায়ন সংজ্ঞায়িত আচরণ , অনির্দিষ্ট আচরণ নয়
অ্যান্ড্রু

1
@ মিশেল ইডেনফিল্ড: আসলেই। যাইহোক, সি এর সমস্ত কোড ফাংশনগুলির ক্ষেত্রে সংজ্ঞায়িত করা হয়, তাই সিতে সম্পূর্ণরূপে কোনও ফ্রেসস্ট্যান্ডিং সিস্টেম লেখা কখনও সম্ভব হয় না ; সেখানে কমপক্ষে একটি অল্প বিস্তৃত সমাবেশের ভাষা থাকতে হবে (বা যাই হোক না কেন) যা একটি ন্যূনতম পরিবেশ স্থাপন করে যাতে সি ফাংশন বলা যায়। এই ফাংশনের সর্বাধিক সুস্পষ্ট নাম main()
ডেভ টুইট করেছেন

5

একটি সাধারণ ভুল বোঝাবুঝি / পৌরাণিক কাহিনীটি হ'ল int mainমান দ্বারা নির্দিষ্ট একমাত্র বৈধ ফর্ম। ওটা সত্যি না.

সি স্ট্যান্ডার্ড দুটি বাস্তবায়নের কথা বলে: হোস্টেড এবং ফ্রিস্ট্যান্ডিং। এই ক্ষেত্রে "বাস্তবায়ন" অর্থ সংকলক। একটি নির্দিষ্ট ওএসের জন্য হোস্ট করা সংকলক সংকলন করে এবং একটি নির্দিষ্ট বেয়ার ধাতব অ্যাপ্লিকেশনটির জন্য ফ্রিস্ট্যান্ডিং সংকলকগুলি সংকলন করে। এম্বেড থাকা সিস্টেমগুলি প্রায় সর্বদা ফ্রিস্ট্যান্ডিং সিস্টেম are এমনকি আরটিওএসের ক্ষেত্রেও।

ফ্রিস্ট্যান্ডিং বাস্তবায়নগুলির জন্য যে কোনও ফর্ম ব্যবহার করা যেতে পারে main(), তাদের এমনকি মূল নামে একটি ফাংশন থাকা প্রয়োজন। প্রায়শই, তারা ফর্মটি ব্যবহার করে void main (void), যেহেতু কোনও কিছু ফেরত দেওয়ার কোনও মানে হয় না।

এখানে উপলব্ধি করার জন্য গুরুত্বপূর্ণ যেটি হ'ল এটি সর্বদা সংকলক যা main()প্রোগ্রামারটির রূপটি কখনই স্থির করে না।

Freestanding বাস্তবায়নের যে কি করতে থেকে ফেরত কিছু main()খুব সন্দেহজনক হয়। আপনাকে অবাক করে তোলে যে সংকলকটি তৈরি করা লোকেরা আসলে মানটি পড়ে ...

বিশদ এখানে


3

সি ভাষার মান বাস্তবায়িত সংজ্ঞায়িত প্রকরণের জন্য অনুমতি দেয় void main( void )এবং এম্বেডড সিস্টেমে এটি সাধারণ ফর্ম - কেবল কারণ এগুলি প্রত্যাশিত হয় না।

আপনি যদি সংকলক সেটআপটি দেখেন তবে সাধারণত কোডের বুটস্ট্র্যাপ স্নিপেট থাকে যা রিসেট ভেক্টর থেকে ডাকে, যা মূল () পরিবর্তে কল করার আগে কিছু প্রাথমিক সূচনা (যেমন ভেরিয়েবলগুলিতে সূচনাকরণের মানগুলি সহকর্মী সহ) সম্পাদন করে।

এটিও (সাধারণত) অসীম লুপের মধ্যে থাকবে, অথবা যদি main()ফিরে আসে তবে পুনরায় সেট করুন


0

এটি (অন্যান্য উত্তর হিসাবে উল্লিখিত) আপনার সরঞ্জামচেনের উপর নির্ভর করে, তবে জিসিসিতে উদাহরণস্বরূপ mainঅন্যান্য ফাংশন হিসাবে সংকলিত হয়েছে, সুতরাং এর রিটার্নের মান কলিং কনভেনশনগুলিতে সেই অনুযায়ী সংরক্ষণ করা হবে (এআরএম-তে আমি জিসিসির সাথে না সঠিকভাবে ব্যবহার করছি এটি আর-তে রাখা হবে) ফিরে আসার ঠিক আগে)।

আমি অনুমান করি যে এটিআভিআর-জিসিসিতে সিমিলার, তাই কাস্টম স্ক্রিপ্টটি মূল আয়গুলির পরে এই মানটি ব্যবহার করতে পারে।


এটি বরং বিন্দুটি মিস করে
ক্রিস

এটি জোর দিয়েছিল যে যে ফোন করে সে mainতার রিটার্নের মান পেতে পারে। অবশ্যই এটি 99.9% পরিস্থিতিতে উপেক্ষা করা হয়েছে, তবে উত্তরটি এই রিটার্ন মানটি পেতে পারে এমন তথ্য সরবরাহ করে।
kwesolowski
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.