(কীভাবে) আমি এনামগুলিতে আইটেমগুলি গণনা করতে পারি?


99

এই প্রশ্নটি আমার মনে এলো, যখন আমার এমন কিছু ছিল

enum Folders {FA, FB, FC};

এবং প্রতিটি ফোল্ডারের জন্য ধারকগুলির একটি অ্যারে তৈরি করতে চেয়েছিলেন:

ContainerClass*m_containers[3];
....
m_containers[FA] = ...; // etc.

(মানচিত্র ব্যবহার করা এটি ব্যবহারে আরও মার্জিত std::map<Folders, ContainerClass*> m_containers;:)

তবে আমার আসল প্রশ্নে ফিরে আসতে: আমি যদি অ্যারের আকারটি হার্ড-কোড করতে না চাই, ফোল্ডারে কত আইটেম রয়েছে তা বের করার কোনও উপায় আছে কি? ( FCতালিকার সর্বশেষ আইটেম হিসাবে নির্ভর না করে যেমন ContainerClass*m_containers[FC+1]আমার ভুল না হলে এমন কিছু করার অনুমতি দেয় ))


এই পোস্টটি আপনার প্রশ্নের উত্তর দিতে পারে: stackoverflow.com/questions/1390703/enumerate-over-an-enum-in-c
স্ট্যাকড ক্রোকড

4
প্রশ্নটি কিছুটা অপ্রকাশিত। সি ++ স্ট্যান্ডার্ড অনুযায়ী, int(FA) | int(FB) | int (FC)একটি Foldersভেরিয়েবলের জন্য আইনী মান is আপনি যদি আকার পরিবর্তন করেন m_containersযাতে কোনও Foldersভেরিয়েবল একটি বৈধ সূচক হয়, [FC+1]তবে এটি যথেষ্ট বড় হবে না।
MSalters

আমি একটি খুব সংশ্লিষ্ট জিনিস জিজ্ঞাসা করেছি stackoverflow.com/questions/12972317/count-on-enum-c-automatic
sergiol

আমি আপনার কাছ থেকে সমাধান recomend চাই stackoverflow.com/a/60216003/12894563 থেকে এবং উন্নত বৈকল্পিক stackoverflow.com/a/60271408/12894563
ixjxk

উত্তর:


123

এটি করার সত্যিই ভাল উপায় নেই, সাধারণত আপনি এনামে একটি অতিরিক্ত আইটেম দেখতে পাবেন, যেমন

enum foobar {foo, bar, baz, quz, FOOBAR_NR_ITEMS};

তাহলে আপনি এটি করতে পারেন:

int fuz[FOOBAR_NR_ITEMS];

এখনও খুব সুন্দর না।

তবে অবশ্যই আপনি বুঝতে পেরেছেন যে এনামে কেবলমাত্র আইটেমের সংখ্যা নিরাপদ নয়, যেমন given

enum foobar {foo, bar = 5, baz, quz = 20};

আইটেমের সংখ্যা 4 হবে, তবে এনাম মানগুলির পূর্ণসংখ্যার মানগুলি অ্যারে সূচক সীমার বাইরে চলে আসবে। অ্যারে সূচকের জন্য এনাম মানগুলি ব্যবহার করা নিরাপদ নয়, আপনার অন্যান্য বিকল্পগুলি বিবেচনা করা উচিত।

সম্পাদনা করুন: অনুরোধ অনুসারে, বিশেষ এন্ট্রি আরও বাড়িয়ে তোলে।


27
এটিকে শেষ বা সর্বদা বলুন বা এ জাতীয় রহস্যজনক কিছু নয়। এটি আটকে রাখুন । যাতে পরবর্তী রক্ষণাবেক্ষণকারীরা আপনার চিহ্নিতকরণ শেষ হওয়ার পরে ঘটনাক্রমে নতুন এন্ট্রি যুক্ত না করে।
মার্টিন ইয়র্ক

4
আরও ভাল বা খারাপের জন্য, আমরা আমাদের সংস্থায় এটি গ্রহণ করি। আমরা সাধারণত এটিকে FINAL_enumname_ENTRY বলি, যেমন FINAL_foobar_ENTRY। আমি এনাম ঘোষণার ঠিক পরে লোকেরা পৃথক স্ট্যাটিক কনস্ট FOOBAR_COUNT পরিবর্তনশীল সংজ্ঞায়িত করার ব্যবহারও দেখেছি, এমন একটি পদ্ধতির যা কিছুটা ত্রুটি প্রবণ।
ড্যারিল

4
কমপক্ষে এটি দেখতে মোটামুটি সহজ যে "এনাম ফু {এ = 10, লাস্ট}" বিজোড় হতে চলেছে। এবং আমি ভেবেছিলাম "ইনট আরআর [লাস্ট]" এই ক্ষেত্রে 11 টি আইটেম হবে, 2 নয়, তাই বেশিরভাগ কোড কাজ করবে (তবে আপনি অবৈধ সূচকের মানগুলিতে মেমরি নষ্ট করছেন)
কোড অ্যাবমিনেটর

32

সি ++ এর জন্য, বিভিন্ন ধরণের নিরাপদ এনাম কৌশল উপলব্ধ রয়েছে এবং এর মধ্যে কয়েকটি (যেমন প্রস্তাবিত-তবে-কখনও জমা দেওয়া হয়নি বুস্ট.ইনাম ) এনামের আকার পাওয়ার জন্য সমর্থন অন্তর্ভুক্ত করে।

সিম্পল অ্যাপ্রোচ, যা সি এর পাশাপাশি সি ++ তে কাজ করে তা হ'ল আপনার প্রতিটি এনাম ধরণের জন্য একটি ... ম্যাক্স মান ঘোষণা করার একটি কনভেনশন গ্রহণ করা:

enum Folders { FA, FB, FC, Folders_MAX = FC };
ContainerClass *m_containers[Folders_MAX + 1];
....
m_containers[FA] = ...; // etc.

সম্পাদনা : { FA, FB, FC, Folders_MAX = FC}বনাম সম্পর্কিত {FA, FB, FC, Folders_MAX]: আমি কয়েকটি কারণে এনামের সর্বশেষ আইনী মানকে ম্যাক্স নির্ধারণ করতে পছন্দ করি:

  1. ধ্রুবকের নাম প্রযুক্তিগতভাবে আরও নির্ভুল (যেহেতু Folders_MAXসর্বাধিক সম্ভব এনাম মান দেয়)।
  2. ব্যক্তিগতভাবে, আমার মনে Folders_MAX = FCহয় অন্য এন্ট্রিগুলি থেকে কিছুটা বেশি দাঁড়িয়ে আছে (মার্টিন ইয়র্ক উল্লেখ করা সমস্যা, সর্বাধিক মান আপডেট না করে দুর্ঘটনাক্রমে এনাম মান যুক্ত করা কিছুটা শক্ত করে তোলে)।
  3. নীচের মতো কোডের জন্য জিসিসিতে "গণনার মান স্যুইচটিতে অন্তর্ভুক্ত নয়" এর মতো সহায়ক সতর্কতা অন্তর্ভুক্ত রয়েছে। ফোল্ডার_ম্যাক্স == এফসি + 1 দেওয়া এই সতর্কতাগুলিকে ভেঙে দেয়, যেহেতু আপনি একগুচ্ছ ... ম্যাক্সের গণনা মানগুলি স্যুইচটিতে অন্তর্ভুক্ত করা উচিত নয়।
স্যুইচ (ফোল্ডার) 
{
  কেস এফএ: ...;
  কেস এফবি: ...;
  // উফ, ভুলে গেছি এফসি!
}

4
কেন করবেন না: enum Folders { FA, FB, FC, Folders_MAX }; ContainerClass *m_containers[Folders_MAX];?
বিল 15

4
আমি স্পষ্ট করে বলতে পছন্দ করি যে শেষটি একটি সংখ্যা, এবং তাদের সকলের একই নাম ধন্যবাদ রয়েছে:struct SomeEnum { enum type {FA, FB, FC, NB__};};
লুস হার্মিটে

4
আসলে আমি অনুভব করি এই "সহায়ক" সতর্কতাগুলি গাধাটির একটি সঠিক ব্যথা। আমি যখন ভাল বিকাশ করি তখন আমি সর্বদা ওয়াল-স্পেসেন্টিক ইত্যাদির ভাল সতর্কতা পছন্দ করি তবে এই সতর্কতাগুলি কেবল বোকা। আরও কয়েকটি খারাপ আছে, যেমন && || এর জন্য প্যারেনস প্রস্তাব করুন এবং & ^ | অপারেটর অগ্রাধিকার। আমি বলতে চাচ্ছি, আমি ভেবেছিলাম জাভা কাজের মেয়ে ভাষা, কি জাহান্নাম সি এবং সি ++ ঘটছে ... ছিল
কোনটা

4
ফোল্ডার_ম্যাক্স = এফসি থাকার নেতিবাচকতা হ'ল প্রতিবার আপনি এনামে কিছু যুক্ত করার সময় আপনাকে এটি পরিবর্তন করতে হবে!
Étienne

4
এনাম ফোল্ডার {এফএ, এফবি, এফসি, ফোল্ডার_মিন = এফএ, ফোল্ডার_ম্যাক্স = এফসি}; এটি পুনরুক্তির জন্য দরকারী যে জোর দেওয়া?
gjpc

7

বৈশিষ্ট্য সম্পর্কে, একটি এসটিএল ফ্যাশন? এই ক্ষেত্রে:

enum Foo
{
    Bar,
    Baz
};

একটি লিখুন

std::numeric_limits<enum Foo>::max()

বিশেষায়িতকরণ (সম্ভবত আপনি সি ++ 11 ব্যবহার করেন তবে কনসেক্সট্রপ) তারপরে, আপনার পরীক্ষার কোডে স্ট্যান্ড :: সংখ্যাসূচক_লিট :: সর্বাধিক () = সর্বশেষ_সীমা প্রতিবন্ধকতা বজায় রাখার জন্য কোনও স্থিতিশীল জবাব সরবরাহ করুন।


4
দুর্ভাগ্যক্রমে এই উত্তর হিসাবে কাজ করবে না ।
rr-

4
std::numeric_limits<enum Foo>::max()সর্বদা শূন্য ফেরায় ... (লিঙ্কযুক্ত উত্তরের জন্য প্রশ্নটি দেখুন) সাধারণ এনামগুলিতে পরীক্ষিত ( enum Foo { ... }), enum class Foo : uint8_t { ... }জিপিসি 5.2.0 @ লিনাক্স এবং মিনজিডাব্লু 4.9.3 @ উইন্ডোজ সহ টাইপ- ইঙ্গিতযুক্ত এনাম ( )।
rr-

4
(... এবং এর ক্ষেত্রে std::numeric_limits<std::underlying_type<Foo>::type>::max()এটি 32-বিট পূর্ণসংখ্যার জন্য অন্তর্নিহিত প্রকারের সর্বোচ্চ মানের 0xFFFFFFFF প্রদান করে, যা এই প্রসঙ্গে কার্যকর নয়))
rr-

4
আশ্চর্যজনক, কারণ আমার কাছে ওয়ার্কিং কোড রয়েছে যা আমি বর্ণনা করে যা তা করে। namespace gx { enum struct DnaNucleobase : char { A, C, G, T }; } তারপরে: namespace std { template<> struct numeric_limits<enum ::gx::DnaNucleobase> { typedef enum ::gx::DnaNucleobase value_type; static constexpr value_type max() { return value_type::T; } (...) এবং std::cout << std::numeric_limits<::gx::DnaNucleobase>::max() << std::endl;প্রত্যাশিত ফলাফল প্রিন্ট করে। জিসিসি 5.2.1 এবং 4.8 / 4.9 স্বাদে পরীক্ষিত।
Wojciech Migda

4
-1; আপনি উত্তর পরিবর্তন হলে আমাকে পিং করুন, তাই আমি ডাউনওয়েটটি পূর্বাবস্থায় ফেরাতে পারি। এই উত্তরটি অনুসরণ করা একটি খারাপ সম্মেলন। এটি ধারণার অপব্যবহার numeric_limits<T>::max()। একমাত্র জিনিস যা ফাংশনটি যুক্তিসঙ্গতভাবে ফিরিয়ে দিতে পারে তা হ'ল সর্বাধিক গণিত মান। এটি ফিরে আসবে 2, তবে ওপি (এই নির্দিষ্ট ক্ষেত্রে) এটির ফিরে আসার প্রয়োজন হবে 3। এনাম ( FB = 2057) এর জন্য আপনার অ-ডিফল্ট মানগুলি একবার হয়ে গেলে , সমস্ত বেট বন্ধ হয়ে যায়, এমনকি + 1একের পর এক ত্রুটিটিও হ্যাক করতে পারে না । যদি কোনও numeric_limits<T>::number_of_elements_of_the_set()(বা সংক্ষিপ্ত নাম) থাকত তবে তা অস্পষ্টতা ছাড়াই ব্যবহার করা যেতে পারে।
মের্লিন মরগান-গ্রাহাম

3

আপনার এনামের শেষে একটি এন্ট্রি যুক্ত করুন, যাকে ফোল্ডার_ম্যাক্স বলা হয় বা এর অনুরূপ কিছু এবং আপনার অ্যারেগুলি শুরু করার সময় এই মানটি ব্যবহার করুন।

ContainerClass* m_containers[Folders_MAX];

2

আমি আমার কাজগুলিতে যুক্তি হিসাবে এনাম ব্যবহার করতে চাই। এটি "বিকল্পগুলির" একটি নির্দিষ্ট তালিকা সরবরাহ করার একটি সহজ উপায়। এখানে শীর্ষে ভোট দেওয়া উত্তরের সমস্যাটি হ'ল এটি ব্যবহার করে কোনও ক্লায়েন্ট একটি "অবৈধ বিকল্প" নির্দিষ্ট করতে পারে। স্পিন অফ হিসাবে, আমি মূলত একই জিনিসটি করার পরামর্শ দিচ্ছি, তবে তাদের সংখ্যা নির্ধারণের জন্য এনামের বাইরে একটি ধ্রুবক ব্যবহার করুন।

enum foobar { foo, bar, baz, quz };
const int FOOBAR_NR_ITEMS=4;

এটি আনন্দদায়ক নয়, তবে যদি আপনি ধ্রুবকটি আপডেট না করে এনাম পরিবর্তন না করেন তবে এটি একটি পরিষ্কার সমাধান।


1

আমি সত্যিই সি ++ তে একটি গণনায় মানের সংখ্যায় পাওয়ার কোনও উপায় দেখতে পাচ্ছি না। পূর্বে উল্লিখিত সমাধানগুলির যে কোনও কাজ যতক্ষণ না আপনি আপনার গণনাগুলির মূল্য নির্ধারণ করেন না যদি আপনি নিজের মূল্য নির্ধারণ করেন যে আপনি এমন পরিস্থিতিতে চলে যেতে পারেন যেখানে আপনি অ্যারেগুলি খুব বড় বা খুব ছোট তৈরি করেন either

enum example{ test1 = -2, test2 = -1, test3 = 0, test4 = 1, test5 = 2 }

উদাহরণস্বরূপ এই ফলাফলগুলিতে 3 আইটেমের অ্যারে তৈরি করা হবে যখন আপনার 5 টি আইটেমের অ্যারে প্রয়োজন

enum example2{ test1 , test2 , test3 , test4 , test5 = 301 }

উদাহরণস্বরূপ এই ফলাফলগুলিতে 301 আইটেমের অ্যারে তৈরি করা হবে যখন আপনার 5 টি আইটেমের অ্যারে প্রয়োজন need

সাধারণ ক্ষেত্রে এই সমস্যাটি সমাধানের সর্বোত্তম উপায়টি হবে আপনার গণনাগুলির মাধ্যমে পুনরাবৃত্তি করা তবে এটি এখনও মান হিসাবে নেই যতটা আমি জানি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.