সি প্রোগ্রামিং ভাষার মান অনুযায়ী কোনও কাঠামো কীভাবে শুরু করবেন


465

আমি একটি স্ট্রাক্ট উপাদানটি আরম্ভ করতে চাই, ঘোষণা এবং আরম্ভের মধ্যে বিভক্ত হয়ে যাই। এটি আমার কাছে রয়েছে:

typedef struct MY_TYPE {
  bool flag;
  short int value;
  double stuff;
} MY_TYPE;

void function(void) {
  MY_TYPE a;
  ...
  a = { true, 15, 0.123 }
}

MY_TYPEসি প্রোগ্রামিং ভাষার মান (সি 98, সি 90, সি 99, সি 11 ইত্যাদি) অনুসারে কোনও স্থানীয় ভেরিয়েবলটি ঘোষণা এবং সূচনা করার উপায় কি এটি ? বা আরও ভাল কিছু আছে বা কমপক্ষে কাজ করছে?

আপডেট আমি স্থির সূচনা উপাদান পেয়ে শেষ করেছি যেখানে আমি আমার প্রয়োজন অনুসারে প্রতিটি সাবিলেট সেট করি।


3
আপনার সত্যিকারের আরও ভাল উত্তরটি গ্রহণ করা উচিত, আমি দেখতে পাচ্ছি আপনাকে কিছু খারাপ কোডিং গাইড ব্যবহার করতে হবে, তবে এখনও অন্য লোকদের কাছে এমনটি করা উচিত নয় যে এটি করার সঠিক উপায় ..
কারোলি হরভাথ

@ কারোলি হরভথ ভাল, বেশিরভাগ ভাল উত্তর C99 এর সাথে নির্দিষ্ট। হতে পারে আমার প্রশ্নটি স্ট্যাকওভারফ্লো ডাব্লিকেট ? প্রশ্নগুলি / 6624975/… ?
ধামা ধরা

যদি এটিই ছিল আপনার আসল উদ্দেশ্য, তবে সম্ভবত হ্যাঁ তবে 1) ভোটগুলি খুব বিভ্রান্তিকর হবে। 2) শীর্ষ অনুসন্ধানগুলি হিট থেকে এটি কেবলমাত্র C99 উপায়টি দেখায় ..... C99 প্রদর্শনের জন্য এই পৃষ্ঠাটি পুনরায় ব্যবহার করা আরও ভাল হবে ... (আপাতদৃষ্টিতে লোকেরা কীভাবে কীভাবে তা দেখানোর জন্য এই পৃষ্ঠাটি লিঙ্ক করা শুরু করেছেন) এটি করুন)
করলি হরভাথ

10
আকর্ষণীয় যে গৃহীত (এবং প্রচুরভাবে উত্সাহিত) উত্তর আসলে পোস্ট করা হলেও প্রশ্নের উত্তর দেয় না। মনোনীত ইনিশিয়ালাইজারগুলি ওপি'র সমস্যাটির সমাধান করে না, যা প্রারম্ভিককরণ থেকে ঘোষণাটি বিভক্ত করা। প্রাক-1999 সি-এর জন্য, প্রতিটি আসলকে একমাত্র আসল সমাধান প্রদান করা; সি 99 এর পরে এবং পরবর্তীকালে, সিএসআরবির উত্তর অনুসারে একটি যৌগিক আক্ষরিক, এটি সমাধান। (ডিজাইনারদের সাথে বা ছাড়াই অবশ্যই একটি প্রকৃত সূচনাকারী আরও ভাল হতে পারে, তবে দৃশ্যত ওপি একটি সত্যিকারের খারাপ কোডিং মান দিয়ে
কীথ থম্পসন

31
কড়া কথায় বলতে গেলে, "এএনএসআই সি" শব্দটি এখন ২০১১ এর আইএসও মানকে বোঝায়, যা এএনএসআই গ্রহণ করেছে। তবে অনুশীলনে "এএনএসআই সি" শব্দটি সাধারণত (সরকারীভাবে অপ্রচলিত) 1989 মানকে বোঝায়। উদাহরণস্বরূপ, "gcc -ansi" এখনও 1989 এর মান প্রয়োগ করে। যেহেতু এটি আইএসও যে 1990, 1999 এবং 2011 এর মান প্রকাশ করেছিল তাই "এএনএসআই সি" শব্দটি এড়ানো এবং বিভ্রান্তির কোনও সম্ভাবনা থাকলে মানকটির তারিখ উল্লেখ করা ভাল।
কিথ থম্পসন

উত্তর:


726

(এএনএসআই) সি 99 এ, আপনি কোনও কাঠামো সূচনা করার জন্য একটি মনোনীত প্রারম্ভিক ব্যবহার করতে পারেন :

MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 };

সম্পাদনা: অন্যান্য সদস্যদের শূন্য হিসাবে আরম্ভ করা হয়: "অনুমোদিত ক্ষেত্রের সদস্যদের স্থির স্টোরেজ সময়কালের অবজেক্টগুলির মতো স্পষ্টতই আরম্ভ করা হয়" " ( https://gcc.gnu.org/onlinesocs/gcc/Designated-Inits.html )


87
অান্তরিক ধন্যবাদ. আপনি এমনকি নীড় করতে পারেন এম: স্ট্যাটিক অক্সেআরএ রেফ 2 রে, {। ইউনিটডির = {.x = 1.0f, .y = 0.0f}};
ওরিওন এলিজিল

4
এটি প্রশ্নের কোনও উত্তর দেয় না। ওপি ঘোষণা থেকে আদিমনীকরণ পৃথক করতে চায়।
osvein

3
C99! = এএনএসআই সি - সুতরাং এটি সি 98 বা সি 90 তে কাজ করে না।
টিম ওয়াইমেন

3
C99 হয় ANSI সি, দেখতে এই
Cutberto ওকাম্পো

3
@ কুটার্টো ওক্যাম্পো আমি বুঝতে পারি এখন কী ঘটেছে। মূল প্রশ্নটি এএনএসআই সি-তে সমাধানের জন্য জিজ্ঞাসা করছিল, সম্ভবত তিনি কেবল সি 98 এর উত্তর চেয়েছিলেন। ২০১ In সালে প্রশ্নটি সম্পাদনা করা হয়েছিল এবং "এএনএসআই সি" সরানো হয়েছে, যা এখন এই উত্তর এবং মন্তব্যে কেন "(এএনএসআই) সি 99" উল্লেখ করেছে তা বুঝতে অসুবিধা হয়।
Étienne

198

আপনি এটি একটি যৌগিক আক্ষরিক দিয়ে করতে পারেন । পৃষ্ঠাটি অনুসারে, এটি সি 99 (যা এএনএসআই সি হিসাবেও গণনা করা ) কাজ করে।

MY_TYPE a;

a = (MY_TYPE) { .flag = true, .value = 123, .stuff = 0.456 };
...
a = (MY_TYPE) { .value = 234, .stuff = 1.234, .flag = false };

প্রারম্ভিকগুলির মধ্যে উপাধিগুলি alচ্ছিক; আপনি এটি লিখতে পারেন:

a = (MY_TYPE) { true,  123, 0.456 };
...
a = (MY_TYPE) { false, 234, 1.234 };

সুতরাং, আপনি একই সাথে ঘোষণা এবং সংজ্ঞা দেওয়ার জন্য মনোনীত ইনিশিয়ালাইজারগুলি হ'ল তবে আপনি ইতিমধ্যে ঘোষিত ভেরিয়েবলটি সংজ্ঞায়িত করার সময় যৌগিক আক্ষরিক জন্য রয়েছে?
জেরেমিয়া

@ জেরেমিয়া আপনাকে প্রথমে উভয় ক্ষেত্রে স্ট্রাক্টটি সংজ্ঞায়িত করতে হবে, তবে মনোনীত ইনিশিয়েলাইজারগুলির সাহায্যে আপনি কাঠামোর পরিবর্তনের ক্ষেত্রে কোডটি আরও পঠনযোগ্য এবং ত্রুটির প্রতি আরও স্থিতিশীল করে তুলুন।
হোইজুই

2
এটি কিছুটা কৌতূহলজনক। অনেকবার (কিছু সফল) আমি মনোনীত প্রাথমিক ব্যবহারের চেষ্টা করেছি। তবে এটি কেবল এখন স্পষ্ট হয়ে গেছে (আপনার এবং @ দানকারীর উদাহরণের জন্য ধন্যবাদ) যে কোনও বস্তু তৈরির সময় আরম্ভকর্তা ব্যবহার না করা থাকলে অবশ্যই একটি নিক্ষেপ উপস্থিত থাকতে হবে। যাইহোক, আমি এখন আরও শিখেছি যে যদি প্রাথমিককরণগুলি অবজেক্ট তৈরি ছাড়া অন্য সময়ে (যেমন আপনার উদাহরণ হিসাবে) ব্যবহৃত হয় তবে এটি কোনও যৌগিক আক্ষরিক হিসাবে উল্লেখ করা হয় , কঠোরভাবে কোনও মনোনীত আরম্ভকারী হিসাবে নয়ideone.com/Ze3rnZ
sherrellbc

93

আমি দেখতে পেয়েছি যে আপনি ইতিমধ্যে এএনএসআই সি 99 সম্পর্কে একটি উত্তর পেয়েছেন, তাই আমি এএনএসআই সি 89 সম্পর্কে একটি হাড় ফেলে দেব AN এএনএসআই সি 89 আপনাকে এভাবে কোনও কাঠামো শুরু করার অনুমতি দেয়:

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = { 5, 2.2, "George" };
    return 0;
}

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

আপনি যদি আপনার কাঠামোর মানগুলি আরম্ভ না করেন, সমস্ত ভেরিয়েবলগুলিতে "আবর্জনা মান" থাকবে।

শুভকামনা!


3
শুরুতে ভেরিয়েবল ব্যবহার করা কি সম্ভব?
সায়ান

2
@ সায়ান এটি স্বয়ংক্রিয় স্টোরেজ সময়কাল সহ বস্তুর জন্য। মধ্যে 6.7.9 13) দেখুন open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf । বিশ্বব্যাপী অবজেক্টগুলির জন্য আক্ষরিক অর্থেই যথেষ্ট সীমাবদ্ধ। এমনকি আপনি অন্যান্য গ্লোবাল অবজেক্টগুলিও ব্যবহার করতে পারবেন না, যদিও সেগুলি কনস্টেট।
পিএসকোকিক

সুতরাং সি 99 এর সাথে একমাত্র পার্থক্য হ'ল আপনি কি উপাধি নির্দিষ্ট করতে পারবেন না?
আকাইস্টেফ 7

42

a = (MYTYPE){ true, 15, 0.123 };

সি 99 এ জরিমানা করবে


1
আমি সত্যই উত্তরটি সবচেয়ে কার্যকর বলে মনে করি, তবে যাই হোক না কেন।
ব্যবহারকারী 12211554

21

আপনি এটি প্রায় পেয়েছেন ...

MY_TYPE a = { true,15,0.123 };

'স্ট্রাইক ইনিশিয়াল সি'-তে দ্রুত অনুসন্ধান আমাকে এটি দেখায়


1
আমি মনে করি এটি স্ট্যান্ডার্ড সি এর জন্য সত্য তবে এএনএসআই সি (99?) এর জন্য নয়। এছাড়াও আমি কোডিং বিধিগুলিতে আবদ্ধ আছি যা আমাকে একবারে ঘোষণা এবং আরম্ভ করার অনুমতি দেয় না, তাই আমাকে এটিকে বিভক্ত করতে হবে এবং প্রতিটি একক সূচনাটি আরম্ভ করতে হবে।
ধামা ধরা

8
সূচনাটি কেবলমাত্র ঘোষণার পয়েন্টে ঘটতে পারে। এর অর্থ 'আরম্ভ করা'। অন্যথায় আপনি কোনও পরিবর্তনযোগ্য মানটিকে আপনার ভেরিয়েবল / স্ট্রাক্টের আদি মান হিসাবে মঞ্জুরি দিচ্ছেন, এবং তারপরে একটি মান নির্ধারণ করুন।
কিভেলি

8
উম ... আপনার কোডিং বিধি আছে যা ইচ্ছাকৃতভাবে খারাপ? সম্ভবত আপনার সেই ছেলেটির সাথে পরিচয় করিয়ে দেওয়া উচিত যিনি তাদের লিখেছিলেন "রিসোর্স অ্যাকুইজিশন ইজ ইনিশিয়ালাইজেশন" ( en.wik વિક.org.org/wiki/RAII )
জেমস কারান

আমাকে বিশ্বাস করুন, আমি সত্যই সত্যই এই মুহুর্তে এই নিয়মের কিছুটা পরিবর্তন করতে পারি না। এটি কোডিং করতে ভয়ঙ্কর লাগে। এবং 70 এর দশকের ঠিক মধ্যে অনেকগুলি বিধি রয়েছে, যেমন সংশোধন নম্বরের মতো পরিচালনার তথ্য সহ স্থির কোড শিরোনাম ers প্রতিটি রিলিজের জন্য পরিবর্তনগুলি, উত্সটি পরিবর্তিত না হলেও ...
ডিসি

19

সি প্রোগ্রামিং ল্যাঙ্গুয়েজ স্ট্যান্ডার্ড আইএসও / আইইসি 9899: 1999 (সাধারণত সি 99 হিসাবে পরিচিত) একটি কাঠামো বা ইউনিয়নের সদস্যদের সূচনা করার জন্য একজনকে একটি মনোনীত ইনিশিয়ালাইজার ব্যবহার করার অনুমতি দেয় :

MY_TYPE a = { .stuff = 0.456, .flag = true, .value = 123 };

এটি আইএসও / আইইসি 9899: 1999 স্ট্যান্ডার্ডের paragraph 7বিভাগে সংজ্ঞায়িত হয়েছে 6.7.8 Initialization:

যদি কোনও ডিজাইনারের ফর্ম থাকে
। সনাক্তকারী
তারপরে বর্তমান অবজেক্টের (নীচে সংজ্ঞায়িত) কাঠামো বা ইউনিয়নের ধরণ থাকবে এবং সনাক্তকারী সেই ধরণের কোনও সদস্যের নাম হবে।

লক্ষ্য করুন paragraph 9একই ধারার যে বলে:

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

জিএনইউ জিসিসি বাস্তবায়নে তবে বাদ পড়া সদস্যদের শূন্য বা শূন্যের মতো টাইপ-উপযুক্ত মান হিসাবে শুরু করা হয়। বিভাগে .2.২7 অনুযায়ী জিএনইউ জিসিসি ডকুমেন্টেশনের মনোনীত প্রারম্ভিকদের মধ্যে বলা হয়েছে :

অনুমোদিত ক্ষেত্রের সদস্যদের স্থির সঞ্চয়স্থানের সময়কালের মতো অবজেক্টগুলির মতো স্পষ্টভাবে সূচনা করা হয়।

মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ সংকলকটি অফিসিয়াল ব্লগ পোস্ট সি ++ কনফরমেশন রোডম্যাপ অনুসারে সংস্করণ ২০১৩ সাল থেকে মনোনীত প্রারম্ভিকদের সমর্থন করা উচিত । অনুচ্ছেদ Initializing unions and structsএর Initializers দুটিই MSDN ভিসুয়াল স্টুডিও ডকুমেন্টেশনের নিবন্ধ দাড়ায় যে নামহীন সদস্যদের শূন্য মত উপযুক্ত মান গনুহ জিসিসি একইভাবে সক্রিয়া।

আইএসও / আইসিসি 9899: 2011 স্ট্যান্ডার্ড (সাধারণত সি 11 হিসাবে পরিচিত) যা আইএসও / আইসিসি 9899: 1999 বাতিল করেছে বিভাগের অধীনে মনোনীত ইনিশিয়েলজারকে ধরে রেখেছে 6.7.9 Initialization। এটিও ধরে রাখেparagraph 9 রয়েছে।

নতুন আইএসও / আইইসি 9899: 2018 স্ট্যান্ডার্ড (সাধারণত সি 18 হিসাবে পরিচিত) যা আইএসও / আইসিসি 9899: 2011 বাতিল করেছে বিভাগের অধীনে মনোনীত প্রারম্ভিকদের ধরে রেখেছে 6.7.9 Initialization। এটিও অপরিবর্তিত paragraph 9রয়েছে।


2
প্রথমদিকে আমি এটিকে গৃহীত উত্তরের সম্পাদনা হিসাবে প্রস্তাব দিয়েছিলাম, তবে তা প্রত্যাখ্যান করা হয়েছিল। এইভাবে আমি উত্তর হিসাবে এটি পোস্ট।
পিএফ

আমি বিশ্বাস করি "অজ্ঞাতনামা সদস্য" এর অর্থ "বাদ পড়া ক্ষেত্রগুলি" নয়, বরং "বেনামে সদস্য" যেমন ইউনিয়ন struct thing { union { char ch; int i; }; };। মানকটি পরে বলেছে: "যদি একটি ব্রেস-আবদ্ধ তালিকায় কম সংখ্যক উপাদান বা সমষ্টিগত সদস্যের চেয়ে কম সংখ্যক অক্ষর থাকে, বা অ্যারের উপাদানগুলির তুলনায় পরিচিত আকারের অ্যারে শুরু করতে স্ট্রিং আক্ষরিকের কম অক্ষর থাকে, সামগ্রিক অবশিষ্ট অংশ স্থিতিশীল স্টোরেজ সময়কাল আছে যে অবজেক্টস হিসাবে সুস্পষ্টভাবে আরম্ভ করা হবে। "
নিমজ্জন

14

যেমন রন নুনি বলেছেন:

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = {5, 2.2, "George"};
    return 0;
}

একটি গুরুত্বপূর্ণ বিষয় মনে রাখবেন: এই মুহুর্তে আপনি স্ট্রাক্টে এমনকি একটি অবজেক্ট / ভেরিয়েবল শুরু করবেন, এর অন্যান্য সমস্ত ভেরিয়েবলগুলি ডিফল্ট মানতে আরম্ভ করা হবে।

আপনি যদি আপনার কাঠামোর মানগুলি আরম্ভ না করেন (যেমন আপনি যদি কেবল সেই পরিবর্তনশীল হিসাবে ঘোষণা করেন) variable.membersতবে সবগুলিতে "আবর্জনা মান" থাকবে, কেবলমাত্র ঘোষণাটি স্থানীয় হলে!

যদি ঘোষণাটি বিশ্বব্যাপী বা স্থিতিশীল হয় (যেমন এই ক্ষেত্রে), সমস্ত অবিস্মরণীয় variable.membersস্বয়ংক্রিয়ভাবে এখান থেকে শুরু করা হবে:

  • 0 পূর্ণসংখ্যা এবং ভাসমান পয়েন্টের জন্য
  • '\0'জন্য char(অবশ্যই এটি ঠিক একই 0, এবংchar একটি পূর্ণসংখ্যা প্রকার)
  • NULL পয়েন্টার জন্য।

স্থানীয় / গ্লোবাল সম্পর্কে আকর্ষণীয়, এটি স্ট্রাক্ট টিএম সময়ের মানগুলির ক্ষেত্রেও প্রযোজ্য। আমার একটি স্থানীয় ছিল এবং এক্ষেত্রে ডিএসটি চালু ছিল, অন্য ক্ষেত্রে এটি ছিল না, আমার কিছু করার কারণে নয়। আমি ডিএসটি (টিএম_আইএসডিস্ট ফিল্ড) ব্যবহার করছিলাম না, এটি স্ট্রিমটাইম থেকেই ছিল, কিন্তু যখন আমি টাইম_টে রূপান্তরিত হয়েছিলাম তখন কেউ কেউ এক ঘণ্টার ছুটি ছিল।
অ্যালান কোরে

3
void function(void) {
  MY_TYPE a;
  a.flag = true;
  a.value = 15;
  a.stuff = 0.123;
}

23
একবার শুনেছি 'প্রাথমিককরণ অ্যাসাইনমেন্টের চেয়ে আলাদা'। সুতরাং এটি আরম্ভের পরিবর্তে কোনও অ্যাসাইনমেন্ট নয়?
হ্যারি উউর কলটুক 12'12

2

এমএস যদি C99 এ আপডেট না হয়, MY_TYPE a = {সত্য, 15,0.123};


2

স্ট্রাক্টগুলি আরম্ভ করার জন্য আমি অন্য একটি উপায় পেয়েছি।

কাঠামো:

typedef struct test {
    int num;
    char* str;
} test;

আরম্ভ:

test tt = {
    num: 42,
    str: "nice"
};

জিসিসির ডকুমেন্টেশন অনুসারে, এই সিনট্যাক্সটি জিসিসি 2.5 থেকে অপ্রচলিত


2

আমি এই উত্তরগুলির কোনও পছন্দ করি না তাই আমি নিজের তৈরি করেছি। আমি জানি না এটি এএনএসআই সি কিনা, এটি কেবলমাত্র জিসিসি ৪.২.১ এর ডিফল্ট মোডে। আমি কখনই বন্ধনীর কথা মনে করতে পারি না তাই আমি আমার ডেটার একটি উপসেট দিয়ে শুরু করি এবং সংযোজন ত্রুটি বার্তাগুলি বন্ধ না হওয়া পর্যন্ত যুদ্ধ করি। পঠনযোগ্যতা আমার প্রথম অগ্রাধিকার।

    // in a header:
    typedef unsigned char uchar;

    struct fields {
      uchar num;
      uchar lbl[35];
    };

    // in an actual c file (I have 2 in this case)
    struct fields labels[] = {
      {0,"Package"},
      {1,"Version"},
      {2,"Apport"},
      {3,"Architecture"},
      {4,"Bugs"},
      {5,"Description-md5"},
      {6,"Essential"},
      {7,"Filename"},
      {8,"Ghc-Package"},
      {9,"Gstreamer-Version"},
      {10,"Homepage"},
      {11,"Installed-Size"},
      {12,"MD5sum"},
      {13,"Maintainer"},
      {14,"Modaliases"},
      {15,"Multi-Arch"},
      {16,"Npp-Description"},
      {17,"Npp-File"},
      {18,"Npp-Name"},
      {19,"Origin"}
    };

ডেটা জীবনকে ট্যাব-সীমাবদ্ধ ফাইল হিসাবে শুরু করতে পারে যা আপনি অন্য কোনও কিছুতে ম্যাসেজ করার জন্য অনুসন্ধান-প্রতিস্থাপন করেন। হ্যাঁ, এটি দেবিয়ান স্টাফ। সুতরাং বাহিরের একটি জোড়া {} (অ্যারে নির্দেশ করে), তারপরে প্রতিটি স্ট্রাক্টের জন্য অন্য জোড়া। মধ্যে কমা সহ। জিনিসগুলিকে একটি শিরোনামে রাখা কঠোরভাবে প্রয়োজনীয় নয়, তবে আমার স্ট্রাক্টে প্রায় 50 টি আইটেম পেয়েছি যাতে আমি এগুলিকে একটি পৃথক ফাইলে রাখতে চাই, উভয়ই আমার কোড থেকে জগাখিচুড়ি রাখে এবং তাই এটি প্রতিস্থাপন করা সহজ।


3
কাঠামোগুলির অ্যারের সূচনা সম্পর্কে কোনও প্রশ্ন ছিল না! মানে আপনার উত্তরটিতে ওভারহেড রয়েছে।
ভিক্টর সিগনেভস্কিই

আমার ধারণা আমার বিন্দুটি ইতিমধ্যে এর মানগুলির সাথে কাঠামো ঘোষনা করছিল বনাম। প্রতিটি মান পরে স্থির করে = ব্যবহার করে।
অ্যালান কোরে

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

0

সি-তে কাঠামো এ জাতীয়ভাবে ঘোষণা এবং সূচনা করা যেতে পারে:

typedef struct book
{
    char title[10];
    char author[10];
    float price;
} book;

int main() {
    book b1={"DS", "Ajay", 250.0};

    printf("%s \t %s \t %f", b1.title, b1.author, b1.price);

    return 0;
}

0

আমি এখনও সামগ্রিক প্রারম্ভিককরণের জন্য মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও 2015 ডকুমেন্টেশনটি পড়েছি , সাথে প্রাথমিককরণের সমস্ত ফর্মটি {...}এখানে ব্যাখ্যা করা হয়েছে, তবে '' ডিজাইনার '' নামে ডট দিয়ে আরম্ভ করার কথা এখানে উল্লেখ করা হয়নি। এটিও কাজ করে না।

সি 99 স্ট্যান্ডার্ড অধ্যায় 6.7.8 প্রারম্ভিককরণ ডিজাইনারদের সম্ভাবনার ব্যাখ্যা দেয়, তবে আমার মনে এটি জটিল স্ট্রাক্টগুলির জন্য সত্যই পরিষ্কার নয়। PDF হিসেবে C99 মান

আমার মনে, এটি ভাল হতে পারে

  1. ব্যবহার করুন = {0};সব স্ট্যাটিক ডেটার জন্য -initialization। এটি মেশিন কোডের জন্য কম প্রচেষ্টা।
  2. আরম্ভের জন্য ম্যাক্রোগুলি ব্যবহার করুন, উদাহরণস্বরূপ

    typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}

ম্যাক্রো অভিযোজিত হতে পারে, তার যুক্তি তালিকা পরিবর্তিত কাঠামোগুলির থেকে পৃথক হতে পারে। কম উপাদানগুলির আরম্ভ করা উচিত যদি এটি উপযুক্ত। এটি নেস্টেড স্ট্রাক্টের জন্যও উপযুক্ত। ৩. একটি সাধারণ ফর্মটি হ'ল: সাবরুটিনে সূচনা করুন:

void init_MyStruct(MyStruct* thiz, int a, int b) {
  thiz->a = a; thiz->b = b; }

এই রুটিনটি সি-তে অবজেক্টঅরিয়েন্টেড মত দেখাচ্ছে thiz, thisএটি সি ++ দিয়েও সংকলন করার জন্য ব্যবহার করবেন না !

MyStruct data = {0}; //all is zero!
init_MyStruct(&data, 3, 456);

0

আমি আমার স্ট্রাক্ট শুরু করার জন্য একটি দুর্দান্ত উপায় খুঁজছিলাম এবং নীচে (সি 99) ব্যবহার করতে পেরেছি। এটি আমাকে একটি একক কাঠামো বা কাঠামোগুলির একটি অ্যারে সরল প্রকারের মতো একইভাবে আরম্ভ করতে দেয়।

typedef struct {
    char *str;
    size_t len;
    jsmntok_t *tok;
    int tsz;
} jsmn_ts;

#define jsmn_ts_default (jsmn_ts){NULL, 0, NULL, 0}

এটি কোডে এটি ব্যবহার করা যেতে পারে:

jsmn_ts mydata = jsmn_ts_default; /* initialization of a single struct */

jsmn_ts myarray[10] = {jsmn_ts_default, jsmn_ts_default}; /* initialization of
                                                    first 2 structs in the array */

তবে এটি ডিফল্ট মানগুলিতে স্ট্রাকচারের অ্যারেটিকে আরম্ভ করে না। এটি প্রদত্ত মানগুলিতে অ্যারেতে প্রথম কাঠামো সূচনা করে jsmn_ts_defaultতবে বাকী কাঠামোগুলি সূচিত হয় যেন অ্যারের স্থির স্টোরেজ সময়কাল থাকে যার অর্থ সদস্যরা আরম্ভ হয় NULLএবং 0। তবে আপনি যদি আপনার কাছে পরিবর্তন করেন তবে #define jsmn_ts_default (jsmn_ts){"default", sizeof "default", NULL, 0}দেখবেন যে কেবলমাত্র প্রথম অ্যারে উপাদানটি এত প্রাথমিক হয়ে গেছে।
প্রাক্তন নিহিলো

হ্যাঁ, আমি আরও পরীক্ষা থেকে ফিরে এসেছি, পোস্টটি সম্পাদনা করতে চেয়েছিলাম :) বিটিডব্লিউ, একই আচরণ int a[10] = {1};কেবলমাত্র 1 ম উপাদানটিই হবে==1
Div0man
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.