কেন এমন কাঠামো ঘোষণা করবেন যা কেবলমাত্র সি-তে একটি অ্যারে রয়েছে?


131

আমি নিম্নলিখিত কোড সহ কিছু কোড জুড়ে এসেছি:

struct ABC {
    unsigned long array[MAX];
} abc;

কখন এই জাতীয় ঘোষণা ব্যবহার করা বোধগম্য?

উত্তর:


184

এটি আপনাকে মান দ্বারা অ্যারে পাস করার অনুমতি দেয় বা কোনও ফাংশন থেকে মান দ্বারা এটি ফেরত পেতে দেয়।

স্ট্রাক্ট মান দ্বারা পাস করা যেতে পারে, অ্যারে থেকে পৃথক যা এই প্রসঙ্গে একটি পয়েন্টারের ক্ষয় হয়।


1
ইনলাইন না করে এমন ফাংশনগুলির জন্য 16 বা 32 বাইটের চেয়ে বেশি অ্যারে দিয়ে এই কাজটি সম্পর্কে সতর্ক থাকুন: কনস্ট-রেফারেন্স দিয়ে এগুলি পাস করা আরও দক্ষ, যদি না ক্যালিকে ইতিমধ্যে কোনও টিএমপি অনুলিপিটি ধ্বংস করতে পারে তবে এটি প্রয়োজন হয়। যদি কল / রিটার্নটি অপ্টিমাইজ না করে তবে একটি মাধ্যম থেকে বড় অ্যারে (হাজার হাজার বাইট) মান দ্বারা পাস করা ভয়ানক জিনিস।
পিটার কর্ডেস

84

আরেকটি সুবিধা হ'ল এটি আকারটিকে বিমূর্ত করে তোলে যাতে আপনি [MAX]যেখানেই এই জাতীয় কোনও বিষয় ঘোষণা করেন সেখানে আপনার সমস্ত কোড ব্যবহার করতে হবে না । এটি দিয়েও অর্জন করা যেত

typedef char ABC[MAX];

তবে তারপরে আপনার আরও অনেক বড় সমস্যা রয়েছে: আপনাকে সচেতন হতে হবে যে ABCএটি একটি অ্যারে টাইপ (যদিও আপনি যখন টাইপের ভেরিয়েবলগুলি ঘোষণার সময় এটি দেখতে পাচ্ছেন না ABC) অথবা অন্যথায় আপনি ABCঅন্যরকম কিছু বোঝাতে চাইবেন বলে আটকে যাবেন একটি চলক ঘোষণা / সংজ্ঞা বনাম একটি ফাংশন আর্গুমেন্ট তালিকায়।

আরও একটি সুবিধা হ'ল স্ট্রাক্ট আপনাকে প্রচুর কোড পুনরায় লেখার প্রয়োজন ছাড়াই পরে আপনাকে আরও বেশি উপাদান যুক্ত করতে দেয়।


45

আপনি কোনও স্ট্রাক্ট অনুলিপি করতে পারেন এবং কোনও ফাংশন থেকে কোনও কাঠামো ফেরত দিতে পারেন।

আপনি এটি অ্যারে দিয়ে করতে পারবেন না - যদি না এটি কোনও কাঠামোর অংশ না হয়!


26

আপনি এটি এইভাবে অনুলিপি করতে পারেন।

struct ABC a, b;
........
a = b;

একটি অ্যারের জন্য আপনাকে প্রতিটি উপাদান বরাদ্দ করার জন্য মেমকি ফাংশন বা একটি লুপ ব্যবহার করতে হবে ।


6
(সুতরাং এটি ক্লিনার কোডের অনুমতি দেয় - এটি গতির ক্ষেত্রে কোনও তাত্পর্যপূর্ণ করবে না)
জন কার্টার

3
এটি দরকারী। দুর্ভাগ্যক্রমে আপনি যদি না করতে পারেন তবে (a == খ)!?! কতটা বেমানান। সি ++ এর জন্য এটি একটি == অপারেটরের সন্ধান করে। সিতে এটি "বাইনারি === অবৈধ অপারেশনগুলি" বলে।
ম্যাট

11

আপনি স্ট্রিংয়ের মতো নতুন ধরণের ডেটা তৈরি করতে স্ট্রাক্ট ব্যবহার করতে পারেন । আপনি নির্ধারণ করতে পারেন:

struct String {
    char Char[MAX];
};

অথবা আপনি ডেটাগুলির একটি তালিকা তৈরি করতে পারেন যা আপনি এটি কার্যকারিতা যুক্তি দ্বারা ব্যবহার করতে পারেন বা আপনার পদ্ধতিতে এটি ফিরিয়ে দিতে পারেন। স্ট্রাকটি অ্যারের চেয়ে আরও নমনীয়, কারণ এটি কিছু অপারেটরকে সমর্থন করতে পারে = এবং আপনি এটিতে কিছু পদ্ধতি সংজ্ঞায়িত করতে পারেন।

আশা করি এটি আপনার পক্ষে কার্যকর হবে :)


2
মূলত, এটি একটি ক্লাস তৈরির নিকটতম জিনিস। আমি এই উত্তরটি পছন্দ করি কারণ এটি এটিকে নির্দেশ করার নিকটে আসে।
নাট সি কে

1
সি এর স্ট্রাক্টের মতো কোনও পদ্ধতি সি স্ট্র্টগুলি পুরানো ডেটা নয়। এটির একটি ডিফল্টর সাহায্যে অপারেটর রয়েছে (যা অন্য উত্তরগুলি দেখায় এটি করার কারণ), তবে এটি বিভ্রান্তিকর এবং বেশিরভাগ সি
জোনাথন স্টার্নবার্গ

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

এছাড়াও, আপনি যদি সিতে সত্যই "পদ্ধতি" তৈরি করতে চান, আপনি যে ফাংশনটি পরিচালনা করেন তার সাথে ফাংশন সংযুক্ত করতে আপনি ফাংশন পয়েন্টার (হ্যাঁ, হ্যাঁ, ছদ্মবেশী বাক্য গঠন, কোনও ডেটা সুরক্ষা ইত্যাদি) ব্যবহার করতে পারেন। আপনাকে প্রথম যুক্তিতে "স্ব" পাস করতে হবে (আপনি চাইলে এটির নামও "এটি" দিতে পারেন, আপনি চাইলে), যেহেতু সিটিতে ফাংশনের অভ্যন্তরে এই পয়েন্টারের কোনও স্বয়ংক্রিয় সৃষ্টি নেই, অবশ্যই এটি সমস্ত জিমন্যাস্টিকস, আপনি পান সি ++ এ ডিফল্টরূপে এই জিনিসগুলি সত্য, যদিও এটি বোনাস হিসাবে ওভারহেড লুকিয়ে থাকতে পারে ...
বেনপেন

2

এ জাতীয় ব্যবহারের আরেকটি সুবিধা structহ'ল এটি যেখানে - সেখানে structব্যবহৃত হয় যেখানে এটি সুরক্ষা প্রয়োগ করে ; বিশেষত আপনার যদি একই উদ্দেশ্যে বিভিন্ন উদ্দেশ্যে ব্যবহৃত একই আকারের অ্যারে সমন্বিত দুটি প্রকার থাকে, তবে এই ধরণেরগুলি আপনাকে দুর্ঘটনাক্রমে একটি অ্যারে যথাযথভাবে এড়াতে সহায়তা করবে।

আপনি যদি একটিতে অ্যারে না জড়ান struct, আপনি এখনও এর জন্য একটি ঘোষণা করতে পারেন typedef: এর কিছু সুবিধা রয়েছে struct- type টাইপটি একবার ঘোষণা করা হয়, automatically আকারটি স্বয়ংক্রিয়ভাবে সঠিক হয়, code কোডের উদ্দেশ্যটি আরও পরিষ্কার হয়, • এবং কোডটি আরও রক্ষণাবেক্ষণযোগ্য - তবে আপনি হারাবেন ◦ কঠোর প্রকারের সুরক্ষা, copy প্রকারের মানগুলি অনুলিপি করার এবং ফিরিয়ে দেওয়ার ক্ষমতা এবং আপনার বাকী কোডটি না ভেঙে পরে সদস্য যুক্ত করার ক্ষমতা। typedefপ্রদত্ত প্রকারের খালি অ্যারেগুলির জন্য দুটি গুলি কেবলমাত্র বিভিন্ন আকারের হলে বিভিন্ন ধরণের উত্পাদন করে। তদুপরি, আপনি যদি কোনও ফাংশন আর্গুমেন্ট typedefব্যতীত ব্যবহার করেন তবে এটি টাইপ-সুরক্ষা মারাত্মকভাবে হ্রাস *করার সমতুল্য char *

সংক্ষেপে :

typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char   A_c_t[113];                   // Partial type-safety, not assignable

A_s_t          v_s(void);     // Allowed
A_c_t          v_c(void);     // Forbidden

void           s__v(A_s_t);     // Type-safe, pass by value
void           sP_v(A_s_t *);   // Type-safe
void           c__v(A_c_t);     // UNSAFE, just means char * (GRRR!)
void           cP_v(A_c_t *);   // SEMI-safe, accepts any array of 113

1

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

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


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