[Powered by Google Translate] structs کے بارے میں بات کرنے دو
Structs ہمیں متغیرات میں سے ایک گروپ کے ساتھ گروپ کا ایک طریقہ کے ساتھ فراہم کرتے ہیں
ایک اچھا پیکیج میں.
یہ شاید سب سے آسان ایک مثال سے دور دیکھنا،
تو ہم کا کہنا ہے کہ struct
پھر گھوبگھرالی تسمہ کھولنے،
اور ہم اس struct میں ایک int عمر پڑے گا،
ایک چار * نام،
اور یہ کہ یہ ہے.
گھوبگھرالی تسمہ کے بعد یہ ایک نیم وقفہ کے ساتھ عجیب لگ سکتا ہے،
لیکن یہ structs کے ساتھ ضروری یہ حقیقت میں ہے.
کوئی درست قسم struct تعریف کے اندر اندر جا سکتے ہیں.
یہاں، ہم نے ایک int اور حروف * کا استعمال کیا ہے،
لیکن آپ کو ایک صف بھی کا کہنا ہے استعمال، 100 عناصر سکتا ہے
یا اس سے بھی ایک اور struct.
جب آپ C میں structs استعمال کر رہے ہیں،
آپ نئے اقسام پیدا کر رہے ہیں
دوسری اقسام کا ایک مجموعہ کے باہر.
یہاں، ہم ایک نئی قسم بنا رہے ہیں
باہر ایک عددی اور حروف *.
جیسا کہ ہم بعد میں دیکھیں گے، ایک struct کی قسم
آپ استعمال کرتے رہے ہیں کسی دوسرے کی قسم کے برابر طریقوں میں سے ایک بہت میں ہے.
عام طور پر، میں کس طرح ایک struct قسم کا موازنہ کریں گے
ایک عددی قسم کی طرح ہے.
اگرچہ کوڈ لکھا صحیح C ہے،
یہ بہت مفید نہیں ہے،
اور بجنا ہمیں ایک انتباہ دے گا.
یاد رکھیں کہ کس طرح 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 طالب علم.
arrays کی طرح، structs ایک شارٹ کٹ ابتدا نحو فراہم کرتے ہیں،
تو ہم کا کہنا ہے کہ کر سکتے ہیں، طالب علم S2 struct
برابر
بائیں گھوبگھرالی 3 تسمہ، S2.
یہاں، S2.age 3 ہو جائے گا،
اور S2.name S2 کی طرف اشارہ کریں گے.
ایک int قسم کے ساتھ تمام چیزیں جو آپ کر سکتے ہیں کے بارے میں سوچو
اور ان میں سے زیادہ تر آپ ایک struct طالب علم قسم کے ساتھ کر سکتے ہیں.
ہم نے ایک تقریب کے پیرامیٹر کی ایک قسم کے طور پر ایک struct طالب علم کو استعمال کر سکتے ہیں.
ہم ایک نیا struct کے اندر struct طالب علم کو استعمال کر سکتے ہیں.
ہم struct طالب علم کو ایک پوائنٹر کر سکتے ہیں.
ہم struct طالب علم کا سائز کر سکتے ہیں.
Struct طالب علم کو ایک قسم ہے
صرف int کی طرح ایک قسم ہے.
ہم S1 بھی S2 کی وضاحت کر سکتے ہیں
کے بعد دونوں کو ایک ہی قسم کی ہیں، ہم ایسا کر سکتے ہیں
S1 = S2.
اگر ہم ایسا کرتے ہیں تو کیا ہوتا ہے
S1.age 10 =؟
S2 تبدیلی بالکل کیا ہے؟
پھر، صرف باقاعدہ integers کے طور پر structs کی بارے میں سوچو.
اگر ہم کچھ int Y کچھ int X تفویض،
X = Y طرح
اور پھر X تبدیل،
کے طور پر میں X + +،
کیا Y بالکل تبدیل نہیں کیا؟
Y یہاں تبدیل نہیں کرتا ہے، اور تو نہ تو اوپر S2 کرتا ہے.
S2.age اب بھی 3 ہے.
لیکن براہ مہربانی نوٹ کریں، جب دوسرے ایک struct بتائے کہ
اشارہ کے تمام اب بھی ایک ہی بات کی طرف اشارہ،
کیونکہ وہ صرف کاپی کیا گیا ہے.
اگر آپ اشارہ مشترکہ نہیں کرنا چاہتے ہیں،
آپ کو دستی طور پر اس کو سنبھال کی ضرورت پڑے گی،
شاید اشارہ میں سے ایک کے لئے میموری کا ایک بلاک malicking کی طرف سے کی طرف اشارہ کرنے کے لئے
اور ڈیٹا کاپی سے زیادہ ہے.
یہ struct طالب علم کو ہر جگہ لکھنے کی ضرورت پر پریشان ہو سکتا ہے.
ایک قسم def کا استعمال کرتے ہوئے، ہم کرتے ہیں، کر سکتے ہیں
قسم def
struct
اور ہم اس طالب علم کو بلاتا ہوں.
اب، ہم طالب علم ہر جگہ استعمال کر سکتے ہیں
کہ ہم struct طالب علم کو استعمال کرنے کے لئے کرتے تھے.
اس قسم def ایک گمنام struct
اور یہ طالب علم کہتے ہیں.
لیکن اگر ہم بھی طالبعلم کی شناخت کنندہ رکھنے
لفظ struct کے ساتھ دیئے گئے، جیسا کہ کو typedef struct طالب علم میں
interchangeably اب ہم دونوں struct کے طالب علم اور طالب علم استعمال کر سکتے ہیں.
انہوں نے اسی نام کو بھی نہیں ہے.
ہم باب def struct طالب علم کو ٹائپ کر سکتا
اور اس کے بعد طالب علم اور باب struct
تبادلہ اقسام ہو گی.
قسم def سے قطع نظر،
ہم اگلے شناخت کنندہ struct کی ضرورت ہے
اگر struct کی تعریف
پنراورتی ہے.
مثال کے طور پر،
قسم def struct نوڈ
اور اس کو ایک int ویل کے طور پر تعریف یوں کی جائے گی
اور یہ ایک پوائنٹر کہ ایک اور struct نوڈ اشارہ کرنا پڑے گا.
struct اگلے * نوڈ.
اور پھر ہم یہ نوڈ کو بلاتا ہوں.
یہ struct پنراورتی ہے،
سے 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 *،
لیکن یہ بالکل کام نہیں کریں گے.
چونکہ یہ واقعی تشریح کے طور پر رکھا جائے گا
قوسین = 4 * S.age،
جو بھی مرتب نہیں ہوں گے،
کے بعد S بلکہ یا struct struct پوائنٹر نہیں ہے،
اور اس نقطہ یہاں کام نہیں کریں گے.
ہم کر سکتے ہیں
(* S) = 4 عمر
لیکن قوسین پریشان اور مبہم حاصل کر سکتے ہیں.
شکر ہے، ہم نے ایک خصوصی تیر آپریٹر ہے
ایسا لگتا ہے
S> عمر = 4.
عمر کے حوالہ کی یہ 2 طریقوں
کے برابر ہیں
اور ہم نے کبھی نہیں تیر آپریٹر کی ضرورت ہے،
لیکن اس سے چیزیں اچھے نظر آتے ہیں.
چونکہ S میموری کے کچھ بلاک ہے کہ struct پر مشتمل ایک پوائنٹر ہے،
آپ S> عمر کے بارے میں سوچ پوائنٹر تیر کی پیروی کر سکتے ہیں
اور عمر کے رکن قبضہ.
تو کبھی ہم کیوں structs استعمال کرنا چاہئے؟
یہ ضرور ممکن ہے صرف آدم integers کے ساتھ دور حاصل کرنے کے لئے،
حروف، اشارہ اور اس طرح
کہ ہم استعمال کرتے رہے ہیں؛
بجائے سے پہلے S1 اور S2
ہم age1، age2، NAME1، اور NAME2 تھا
علیحدہ متغیر بالکل.
یہ صرف 2 طالب علموں کے ساتھ ٹھیک ہے،
لیکن کیا ہوا اگر ہم ان میں سے 10 تھا؟
اور اگر کی بجائے صرف 2 شعبوں
طالب علم struct 100 شعبوں تھا؟
GPA، کورس، بالوں کا رنگ، جنس، اور اسی طرح کی.
صرف 10 structs کے بجائے، ہم 1،000 علیحدہ متغیر کی ضرورت ہے.
اس کے علاوہ، ایک تقریب پر غور
جو کہ 100 شعبوں کے ساتھ ہے کہ اس کے صرف دلیل کے ساتھ struct لیتا ہے
اور تمام شعبوں کو پرنٹ ہے.
اگر ہم ایک struct کا استعمال نہیں کیا،
ہر وقت ہے کہ ہم اس تقریب کو فون،
ہم نے تمام 100 متغیر کو منتقل کرنے کی ضرورت ہے،
اور اگر ہم 1 طالب علم کے لئے 100 متغیر ہے،
اور 2 طالب علم کے لئے 100 متغیر،
ہمیں یقین ہے کہ ہم نے کچھ متغیر 1 طالب علم سے اتفاقی طور پر نہیں گزر کرنے کی ضرورت ہے
اور 2 طالب علم سے کچھ متغیر ہے.
یہ ناممکن ہے ایک struct کے ساتھ اس غلطی کرنا،
سے لے کر 100 متغیر ایک ایک پیکیج میں موجود رہے ہیں.
آخری نوٹوں کی صرف ایک جوڑے:
اگر آپ اس نقطہ پر سب کچھ ہے، بہت اچھا سمجھ گیا ہوں.
ویڈیو کے باقی 'کاملیت کے لیے ہے.
کیونکہ structs پوائنٹر کے کسی بھی قسم کی کر سکتے ہیں،
وہ تقریب کے اشارہ بھی کر سکتے ہیں.
اگر آپ شئی کو پر مبنی پروگرامنگ سے واقف ہیں،
کیا یہ کسی چیز پر مبنی انداز میں پروگرام structs کا استعمال کرنے کا طریقہ فراہم کرتا ہے.
کسی اور وقت میں تقریب اشارہ.
اس کے علاوہ، کبھی کبھی آپ کو 2 structs کر سکتے ہیں
جس کی تعریف ایک دوسرے پر انحصار کرتے ہیں.
مثال کے طور پر،
ہم struct ایک کر سکتے ہیں،
جس کے طور پر بیان کیا جاتا ہے
ایک struct B پر ایک پوائنٹر،
struct B X *،
اور اب ہم نے ایک struct B کر سکتے ہیں
جو ایک پوائنٹر کے طور پر بیان کیا جاتا ہے
ایک struct A،
Y. struct * A
لیکن یہ نہیں مرتب گا،
سے struct B اب وقت آ گیا ہے کہ struct A مرتب کیا جا رہا ہے میں موجود نہیں ہے.
اور اگر ہم struct A اور struct تبادلہ B،
اس وقت ہم صرف اسی مسئلے سے چھوڑا جائے گی؛
اس وقت، کے ساتھ ایک نہیں موجودہ struct.
اس کو حل کرنے کے لیے ہم لکھتے ہیں، کر سکتے ہیں
struct B؛
A. struct کی تعریف سے پہلے
یہ ایک فارورڈ اعلان کے نام سے جانا جاتا ہے.
یہ صرف کی اجازت دیتا ہے کمپائلر معلوم ہے کہ
struct B منظور کی قسم ہے جو مکمل طور پر بعد میں یا کہیں اور کی وضاحت ہے.
میرا نام Rob Bowden ہے، اور اس CS50 ہے.
[CS50.TV]