[Powered by Google Translate] চলুন structs সম্পর্কে কথা বলুন. Structs একটি উপায় একসঙ্গে ভেরিয়েবলের একটি গুচ্ছ গ্রুপ প্রদান মধ্যে একটা চমৎকার প্যাকেজ. এটা সম্ভবত সহজে একটি উদাহরণ সরাসরি দেখতে, সুতরাং আমরা বলতে struct, তারপর কোঁকড়া বক্রবন্ধনী খোলার, এবং এই struct, আমরা কোন int বয়স হবে, একটি গৃহস্থালি * নাম, এবং যে এটি. এটি একটি সেমিকোলন সঙ্গে মনে একটি কোঁকড়া বক্রবন্ধনী পরে অদ্ভুত হতে পারে, কিন্তু এটি আসলে structs প্রয়োজন আছে. কোন বৈধ টাইপ struct সংজ্ঞা মধ্যে যেতে পারেন. এখানে, আমরা কোন int এবং একটি গৃহস্থালি * ব্যবহার করেছি, কিন্তু আপনি ব্যবহার করার জন্য একটি অ্যারের বলার মধ্যে, হতে পারে, 100 উপাদান অথবা এমনকি অন্য struct. আপনি যখন C-structs ব্যবহার করছেন, আপনি নতুন ধরনের তৈরি করছেন আউট অন্যান্য ধরনের একটি সংকলন. এখানে, আমরা একটি নতুন ধরনের তৈরি করছি আউট একটি পূর্ণসংখ্যা এবং একটি গৃহস্থালি *. হিসাবে আমরা পরে দেখতে পাবেন, একটি struct টাইপ সমতুল্য অন্য কোন উপায়ে টাইপ করতে ব্যবহার করছি অনেক হয়. সাধারণত, আমি কিভাবে একটি struct টাইপ তুলনা করা হবে অনুরূপ একটি পূর্ণসংখ্যা টাইপ যাও. যদিও আমরা কোড লিখেছেন বৈধ সি, এটা খুব দরকারী নয়, ঝনঝন শব্দ এবং একটি সতর্কবার্তা আমাদের দিতে হবে. মনে রাখবেন কিভাবে structs এবং তার অনুরূপ হয়? ওয়েল, মূলত আমরা শুধু বলেন, int, যা খুবই সহায়ক লাইন হয় না. সুতরাং আসুন আসলে ঐ ধরনের একটি ভেরিয়েবল ডিক্লেয়ার সেমিকোলন দেবার আগে একটি নাম এটি. আমরা পরিবর্তনশীল ছাত্র ডাকবো. এখন আমরা একটি পরিবর্তনশীল তথাকথিত ছাত্র ঘোষণা করেছি সাথে টাইপ struct দ্বারা প্রদত্ত. কিভাবে আমরা struct ভিতরে ভেরিয়েবল পেতে? টেকনিক্যালি, এই ভেরিয়েবলগুলির জন্য নাম সমূহ সদস্য. কোনো একটি ছাত্র struct বিশেষত সদস্য অ্যাক্সেস, আপনি পরিবর্তনশীল নামের একটি বিন্দু যুক্ত করা, সদস্য করাতে চান তার নামের দ্বারা অনুসৃত. তাই এখানে, শুধুমাত্র 2 বৈধ সম্ভাবনার হয় student.age এবং student.name. এবং আমরা কিছু করতে পারি student.age = 12 এবং student.name = ছাত্র. এখন কি যদি আমরা একটি দ্বিতীয় ছাত্র করতে চেয়েছিলেন? আপনি এবং এই লাইন কপি পেস্ট করুন চিন্তা করি এবং ছাত্র 2 বা কোন কিছু পরিবর্তন ছাত্র, এবং যে কাজ করবেন, কিন্তু টেকনিক্যালি, ছাত্র এবং ছাত্র 2 একই টাইপ নেই. দেখুন, আপনি এক অন্য তাদের দায়িত্ব অর্পণ করা সক্ষম হবে না. এর কারণ হল, তাই অনেক দূরে, আপনার struct বেনামী হয়েছে. আমরা তাই একটি নাম দিন প্রয়োজন. কি সেটা, আমরা struct নাম সন্নিবেশ পরে শব্দ struct. ছাত্র, সংজ্ঞা অনুসরণ করে. আমরা এখনও অবিলম্বে ধরনের একটি ভেরিয়েবল ডিক্লেয়ার করতে পারেন ছাত্র, struct মত আমরাও আগে. আমরা এটা S1 ডাকবো দেবার একটি নাম struct, আমরা এখন struct ছাত্র ব্যবহার করতে পারেন প্রায় সঠিক একই ভাবে আমরা int-এ ব্যবহার করেন. সুতরাং আমরা টাইপ struct ছাত্র একটি ভেরিয়েবল ডিক্লেয়ার করতে পারেন, মত struct ছাত্র S2. অ্যারে লেগেছে, structs একটি শর্টকাট প্রদান প্রারম্ভিক বাক্য গঠন, তাই আমরা, ছাত্র S2 struct বলতে পারেন সমান বাম বক্রবন্ধনী কোঁকড়া 3, S2. এখানে, S2.age 3 হতে হবে, এবং S2.name S2 নির্দেশ করবে. কোন int টাইপ সঙ্গে সব জিনিষ আপনি করতে পারেন চিন্তা এবং তাদের অধিকাংশই আপনি একটি struct ছাত্র টাইপ করতে পারেন. আমরা একটি ফাংশন পরামিতির একটি ধরন হিসাবে একটি struct ছাত্র ব্যবহার করতে পারেন. আমরা একটি নতুন struct ভিতরে struct ছাত্র ব্যবহার করতে পারেন. আমরা একটি struct ছাত্র একটি পয়েন্টার হতে পারে. আমরা struct ছাত্র মাপ করতে পারেন. Struct ছাত্র একটি টাইপ শুধুমাত্র int-এর মত একটি প্রকার. আমরা S2 যাও S1 ধার্য করতে পারেন কারণ দুটোই একই ধরনের তাই, আমরা কি করতে পারি S1 = S2. যদি আমরা কি ঘটবে S1.age = 10? S2 পরিবর্তনের জন্য এ সব? আবার নিয়মিত শুধুমাত্র পূর্ণসংখ্যা হিসাবে structs মধ্যে, মনে হয়. আমরা যদি কিছু int-Y কিছু int-X দায়িত্ব অর্পণ করা, ভালো এক্স = ওয়াই এবং তারপর এক্স পরিবর্তন, যেমন এক্স + + ', কিন্তু Y এ সব পরিবর্তন? Y এখানে না, পরিবর্তন এবং তাই ত্ত আছে S2 উপরে. S2.age এখনও 3. কিন্তু মনে রাখবেন, যখন আরেকটি এক struct বরাদ্দ, পয়েন্টার সমস্ত এখনও একই জিনিস নির্দেশ, যেহেতু তারা শুধুমাত্র কপি করা হয়েছিল. আপনি যদি পয়েন্টার ভাগ করা হবে না চান, আপনি নিজে যে হ্যান্ডেল করতে হবে, সম্ভবত পয়েন্টার দ্বারা একটির জন্য মেমরি এক ব্লক malicking নির্দেশ এবং তথ্য অনুলিপি উপর. এটা যাও যাও সর্বত্র struct ছাত্র লিখুন আছে বিরক্তিকর হতে পারে. একটি টাইপ Def ব্যবহার করে, যা আমরা করতে পারি টাইপ Def struct এবং আমরা এটি ছাত্র ডাকবো. এখন, আমরা ছাত্র সর্বত্র ব্যবহার করতে পারেন যে আমরা struct ছাত্র ব্যবহার ব্যবহৃত. এই ধরনের Def এর একটি বেনামী struct এবং কল এটি ছাত্র. কিন্তু যদি আমরা ছাত্র শনাক্তকারী রাখা পরবর্তী শব্দ struct, হিসাবে মধ্যে typedef struct ছাত্র, আমরা উভয় struct ছাত্র এবং ছাত্র অদলবদল করে ব্যবহার করতে পারে এখন. তারা একই নাম আছে না. আমরা Def struct ছাত্র বব টাইপ করতে পারে এবং তারপর ছাত্র এবং বব struct বিনিমেয় ধরনের হবে. তথাপি টাইপ Def, আমরা শনাক্তকারী যাও struct পরের প্রয়োজন যদি struct সংজ্ঞা recursive হয়. উদাহরণস্বরূপ, টাইপ Def struct নোড এবং এটা কোন int Val হিসাবে নির্ধারণ করা হবে এবং এটি একটি পয়েন্টার অন্য struct নোড যে স্থানটিকে আছে. হবে, নোডের মধ্যে হিসাবে struct * পরের. এবং তারপর আমরা এটি নোডের মধ্যে ফোন করবো. এই struct হয় recursive, যেহেতু সংজ্ঞা struct নোডের মধ্যে উপস্থিত রয়েছে একটি struct নোডের একটি পয়েন্টার. উল্লেখ্য যে আমরা struct নোড * পরবর্তী বলার আছে ভিতর struct নোড সংজ্ঞা, যেহেতু এখনো টাইপ Def মঞ্জুরি দিন শেষ করেছে আমাদের এই সরলীকরণ শুধু নোড * পরের. আপনি structs অনুরূপ এই সম্পর্কে আরো জানতে পারবেন লিঙ্ক তালিকা এবং গাছ সঙ্গে যখন কারবারী. একটি ফাংশনে structs সম্পর্কে কি? এটি পুরোপুরি বৈধ. আমাদের সাথে আছে পারে func বাতিলযোগ্য যা একটি আর্গুমেন্ট হিসাবে গ্রহণ করে, ছাত্র গুলি এবং যে ছাত্র সঙ্গে কিছু আছে. এবং তখন আমরা ছাত্র struct হিসাবে তাই ভালো পাস করতে পারেন. S1 এর Func আগে থেকে. struct আচরণ ঠিক যেমন একটি পূর্ণসংখ্যা যখন একটি ফাংশন এর কাছে হস্তান্তর. Func S1 একটি অনুলিপি প্রাপ্ত এবং তাই S1 সংশোধন করতে পারে না; বরং, এটা শুধুমাত্র কপি যে এস সঞ্চিত আপনি যদি চান ফাংশন S1 সংশোধন করতে সক্ষম হবে, func একজন ছাত্র, S * নিতে হবে, এবং আপনার ঠিকানা দ্বারা যেমন S1 প্রেরণ করতে হবে. * ছাত্র, S, func & S1. অন্য কারণ ঠিকানা দ্বারা এখানে পাস আছে. যদি আমাদের struct 100 ক্ষেত্র আছে? প্রতি একক সময় আমরা func একজন ছাত্র পাস, আমাদের প্রোগ্রাম func এর যুক্তি, S মধ্যে যারা 100 ক্ষেত্র সব কপি করা প্রয়োজন, এমনকি যদি এটা ব্যবহার করে তাদের বেশীরভাগ না. তাই, এমনকি যদি func ছাত্র পরিবর্তন পরিকল্পনা না, যদি এখনও ঠিকানা দ্বারা পাস মূল্যবান পারেন. ঠিক আছে, যদি আমরা একটি struct একটি পয়েন্টার তৈরি করতে চান? আমরা ভালো কিছু করতে পারে * ছাত্র, S malloc সমান ছাত্র মাপ. এখনও এখানে কাজ যে আকার বিজ্ঞপ্তি. তাই এখন আমরা কিভাবে বয়স সদস্য অ্যাক্সেস ব্লক যে, S পয়েন্ট? আপনাকে প্রথমেই চিন্তা হতে পারে * S.age = 4, কিন্তু পুরোপুরি এই কাজ করবে না. যেহেতু এই সত্যিই হিসাবে ব্যাখ্যা করা এব w বন্ধনী ববহার = 4 * S.age, যা এমনকি না কম্পাইল হবে, যেহেতু, S একটি struct যাও struct বা বরং একটা পয়েন্টার হয় না, এবং তাই এখানে বিন্দু কাজ করবে না. আমরা পছন্দ করি পারে (* S). বয়স = 4 কিন্তু প্রথম বন্ধনী বিরক্তিকর এবং বিভ্রান্তিকর পেতে পারেন. সৌভাগ্যক্রমে, আমরা একটি বিশেষ দিন arrow অপারেটর আছে যে দেখায় কিছু ভালো S-> বয়স = 4. এই বয়স উল্লেখ 2 উপায় হয় সমতুল্য এবং আমরা তীর অপারেটর কি সত্যিই প্রয়োজন নেই, কিন্তু এটা জিনিস চেহারা nicer. যেহেতু, S মেমরি কিছু ব্লক যে struct ধারণকারী একটি পয়েন্টার, আপনি S> বয়সের হিসাবে পয়েন্টার অনুসরণ তীর মনে করতে পারেন এবং বয়স সদস্য দখল. তাই কখনও structs কেন আমরা ব্যবহার করব? এটা স্পষ্টভাবে এর শুধুমাত্র আদিম পূর্ণসংখ্যার সঙ্গে দূরে পাওয়ার সম্ভাবনা আছে, অক্ষর, পয়েন্টার এবং ভালো যে আমরা ব্যবহার করছি; পরিবর্তে S1 এবং S2 আগে, আমরা age1, age2, NAME1, এবং NAME2 হয়ে থাকতে পারে পৃথক ভেরিয়েবল এ সব. এই মাত্র 2 ছাত্র হয় জরিমানা, কিন্তু যদি আমরা তাদের 10 ছিল? এবং কি যদি পরিবর্তে শুধুমাত্র 2 ক্ষেত্র, ছাত্র struct 100 ক্ষেত্র ছিল? জিপিএ, কোর্স, চুলের রঙ, লিঙ্গ, এবং তাই. পরিবর্তে মাত্র 10 structs, আমরা 1,000 আলাদা ভেরিয়েবল প্রয়োজন. এছাড়াও, একটি ফাংশন বিবেচনা যে 100 ক্ষেত্রের সাথে একমাত্র আর্গুমেন্ট সহ যে struct লাগে এবং ছাপে সব ক্ষেত্র আউট. যদি আমরা একটি struct ব্যবহার না করে থাকেন, প্রতি একক সময় আমরা যে ফাংশন কল, আমরা সমস্ত 100 ভেরিয়েবল এ পাস করার জন্য প্রয়োজন, এবং যদি আমরা শিক্ষার্থীর জন্য 1 টি 100 ভেরিয়েবল আছে, এবং ছাত্র 2 জন্য 100 ভেরিয়েবল, আমরা নিশ্চিত আমরা ছাত্র 1 থেকে ঘটনাক্রমে কিছু ভেরিয়েবল না পাস হতে হবে এবং ছাত্র 2 থেকে কিছু ভেরিয়েবল. এটা একটি struct সঙ্গে যে ভুল করা অসম্ভব, যেহেতু সমস্ত 100 ভেরিয়েবলের একটি প্যাকেজের মধ্যে অন্তর্ভুক্ত করা হয়. শুধু চূড়ান্ত নোট একটি দম্পতি: যদি আপনি এই বিন্দু থেকে সবকিছু আপ, মহান বোঝা করেছি. ভিডিও বাকি মাত্র সম্পন্নতা 'হেতু জন্য হয়. কারণ structs পয়েন্টার কোনো ধরনের ধরে রাখতে পারেন, তারা ফাংশন পয়েন্টার রাখা যাবে. যদি আপনি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর সাথে পরিচিত, এই প্রোগ্রামের একটা অবজেক্ট ওরিয়েন্টেড বিন্যাস ব্যবহার structs একটি উপায় প্রদান করে. অন্য সময়ে ফাংশন পয়েন্টার আরও. এ ছাড়াও কখনও কখনও, আপনি 2 structs থাকতে পারে যার সংজ্ঞা একে অন্যের উপর নির্ভর করে. উদাহরণস্বরূপ, আমরা struct একটি হতে পারে, যা হিসাবে সংজ্ঞায়িত করা হয় একটি struct বি একটি পয়েন্টার, struct বি * এক্স, এবং এখন আমরা একটি struct বি থাকতে পারে যা একটি পয়েন্টার হিসাবে সংজ্ঞায়িত করা হয় একটি struct একটি, struct একটি * Y. কিন্তু এই না কম্পাইল হবে, যেহেতু struct বি সময় যে struct একটি হচ্ছে কম্পাইল বিদ্যমান নয়. এবং যদি আমরা struct একটি swap এবং struct বি, তারপর আমরা ঠিক একই সমস্যা অবশিষ্ট চাই করা হবে; সঙ্গে এই সময়, বিদ্যমান একটি struct না. এই সমস্যার সমাধানের উদ্দেশ্যে, আমরা লিখতে পারেন struct বি; আগে struct এ সংজ্ঞা এই একটা ফরওয়ার্ড ঘোষণা বলা হয়. এই মাত্র দেয় জানেন যে কম্পাইলার struct বি একটি বৈধ টাইপ যে সম্পূর্ণরূপে পরে বা অন্যত্র সংজ্ঞায়িত করা হবে. আমার নাম Rob Bowden, এবং এই CS50. [CS50.TV]