Internet Derazalar Android
Kengaytirmoq

Havola va qiymatdagi parametrlarni o'tkazish. Ma'lumot yoki qiymat bo'yicha pul o'tkazish? Parametri qiymati c

Parametrlar quyidagi usullardan birida uzatilishi mumkin:

Argumentlarni qiymati bo'yicha uzatishda kompilyator ob'ektning vaqtinchalik nusxasini yaratadi va uni mahalliy ob'ektlarni saqlash uchun mo'ljallangan Stack Xizmat maydoniga joylashtiradi. Deb nomlangan funktsiya asl ob'ektga ta'sir qilmasdan ushbu nusxada ishlaydi. Argumentlarni qabul qiluvchi funktsiyalarning prototiplari uning manzilini emas, balki ob'ekt turini ko'rsatuvchi parametr sifatida taqdim etiladi. Masalan, funktsiya

int gotmax (int, int);

ikki butun sonli bahsni qiymati bo'yicha oladi.

Agar funktsiya asl ob'ektni o'zgartirishi kerak bo'lsa, parametrlar parametrlari qo'llaniladi. Bunday holda, funktsiya funktsiya o'z vazifasiga berilmaydi, ammo faqat uning manzili. Shunday qilib, funktsiya tanasidagi barcha o'zgarishlar unga argument ma'lumotnomasi bilan topshiriladi ob'ektga ta'sir qiladi. Funktsiya faqat yagona qiymatni qaytarishi, ob'ektning manzilini topshirishdan foydalanish juda ko'p ma'lumot bilan ishlashning juda samarali usulidir, deb hisoblash. Bundan tashqari, manzilning o'zi emas, balki manzil uzatilayotganda, Stack xotirasi sezilarli darajada saqlanadi.

Ko'rsatmalar yordamida.

Hyuralar yordamida elektr uzatish sintaksisi ob'ekt turi bilan argument havolasi sifatida belgilangan. Masalan, funktsiya

ikki tomonlama elim (uzun va var1, int & Var2);

uzun va int kabi o'zgaruvchilar uchun ikkita havola oladi. Parameter-ma'lumot funktsiyasini uzatishda kompilyator avtomatik ravishda funktsiyaga dalil sifatida ko'rsatilgan o'zgaruvchining manzilini uzatadi. Siz qo'ng'iroq funktsiyasida argument oldida ampersand belgisini qo'yishingiz shart emas. Masalan, avvalgi funktsiya uchun parametrlarni ma'lumot orqali topshirish bilan qo'ng'iroq quyidagicha:

Elim (Var1, Var2);

Ko'rsatkichni ko'rsatadigan parametrlarni uzatishda prototip funksiyasiga misol quyida keltirilgan:

bo'sh sarmumber (int *, uzun *);

Bundan tashqari, funktsiyalar nafaqat ma'lum bir o'zgaruvchining qiymatini, balki ko'rsatgich yoki unga murojaat qilishlari mumkin. Masalan, funktsiya, ularning prototipi:

* ST soni (int); & Int o'sish ();

mos ravishda sgetchani va ma'lumotni butun songa qaytaring o'zgaruvchan tur int. Shuni yodda tutish kerakki, funktsiyadan mos yozuvlar yoki ko'rsatgichning qaytishi muammolarga olib keladigan o'zgaruvchi bo'lsa, muammolarga olib kelishi mumkin. Masalan,

O'zgaruvchanligi o'rniga ob'ektning manzili unumdorligi sezilarli va tezlikda, ayniqsa katta narsalar ishlatilgan bo'lsa, ayniqsa massivlar (keyinroq ko'rib chiqiladi).

Agar siz funktsiyaga juda katta ob'ektni yuborishingiz kerak bo'lsa, uning o'zgarishi ta'minlanmaydi, doimiy ko'rsatgichning uzatilishi amalda qo'llaniladi. Ushbu turdagi qo'ng'iroq Konstal kalit so'zni, masalan, funktsiyadan foydalanishni o'z ichiga oladi

const In St * Fname (Int * Const raqami)

ko'rsatgichni doimiy ravishda qabul qiladi va ST doimiy ob'ektga qaytaradi. Ushbu ob'ektni tanadagi har qanday urinish xato kompilyator xabariga olib keladi. Doimiy ko'rsatgichlardan foydalanishni ko'rsatadigan misolni ko'rib chiqing.

#Include.

int * Const Cance Call (int * cont);

int X \u003d 13; int * px \u003d qo'ng'iroq (PX);

int * Const Cance Call (Int * Con X)

// * x ++; II siz ob'ektni o'zgartira olmaysiz! X ni qaytaring;

Doimiy ko'rsatgichning yuqoridagi ko'rsatgichning o'rniga parametrlarni uzatish uchun alternativa sifatida siz doimiy ma'lumotnomalardan foydalanishingiz mumkin, masalan:

dost In St va Fname (Const State va raqam)

doimiy nuqta kabi bir xil ma'noga ega.

#Include.

const In St va Call (COST INT & X)

// Siz ob'ektni o'zgartira olmaysiz!

Tarkibdan foydalangan holda dasturlash usullari

maqsad laboratoriya ishlari : C # usullarini ko'rib chiqing, belgilar ma'lumotlari bilan ishlash qoidalari va ro'yxat qutisi komponenti bilan. Qatorlar bilan ishlash uchun dastur yozing.

Usul

Usul dastur kodini o'z ichiga olgan sinf elementidir. Usul quyidagi tuzilishga ega:

[Attributes] [Belgilangan] turini ([parametrlar])

Usulning usuli;

Atribonliklar - bu usul xususiyatlari bo'yicha kompilyatorga maxsus ko'rsatmalar. Atributlar kamdan-kam ishlatiladi.

Spectiviters turli maqsadlar uchun mo'ljallangan kalit so'zlar, masalan:

Boshqa sinflar uchun usulning mavjudligini aniqlash:

o. o. xususiy - Usul faqat ushbu sinf doirasida mavjud bo'ladi.

o. o. himoyalangan. - Bu usul bolalar sinflarida ham mavjud bo'ladi.

o. o. ommaviy - Usul ushbu sinfga kirishi mumkin bo'lgan boshqa har qanday sinfga taqdim etiladi.

Bir sinfni yaratmasdan usulning mavjudligini bildirish

· Belgilash turi

Turiy tur usulini qaytaradi degan natijani aniqlaydi: u C # da, shuningdek bo'shliqni to'ldirish mumkin bo'lgan har qanday turdagi bo'lishi mumkin, agar natijasi talab qilinmasa.

Usul nomi usulni chaqirish uchun ishlatiladigan identifikatordir. Bir xil talablar identifikatorga o'zgaruvchiga nisbatan qo'llaniladi, chunki u harflar, raqamlar va yopishqoq belgidan iborat bo'lishi mumkin, ammo raqamlardan boshlana olmaydi.

Parametrlar - bu qo'ng'iroq paytida usulga uzatilishi mumkin bo'lgan o'zgaruvchilar ro'yxati. Har bir parametr turi va nomi o'zgaruvchidan iborat. Parametrlar vergul bilan ajratilgan.

Usul usuli odatiy dastur kodidir, bundan tashqari boshqa usullar, sinflar, nomlarning ta'riflari va boshqalarning ta'riflarini o'z ichiga olmaydi, agar usul ba'zi natijalarni qaytarishi kerak bo'lsa, unda qaytish bilan kalit so'zning qaytishi tugashi kerak ma'nosi. Agar natijalar qaytarilmasa, ruxsat berilmasa ham, qaytish kalit so'zidan foydalanish kerak emas.

Ifodani hisoblaydigan usul namunasi:

jamoat juft kaliti (ikki juft b, juft c)

matematika (a) * matematika (b) ni qaytaring;

juft k \u003d Math.tan (A * B);

k * Math.Exp (C / K) ni qaytaring;

Ortiqcha yuklash usullari

C # til bir xil nomlar bilan bir nechta usullarni yaratishga imkon beradi, ammo turli parametrlar. Kompaniya qurish paytida kompilyator avtomatik ravishda eng mos usulni tanlaydi. Masalan, siz ikkita alohida erektsiya usulini yozishingiz mumkin: bitta algoritm butun sonlar va real - boshqasi:

///

/// hisoblash X daraja uchun y

///

xususiy int Pow (int X, int y)

///

/// hisoblash X haqiqiy raqamlar uchun y

///

xususiy juftlik (ikki juft x, juft y)

mate.Exp (y * matematika (x)) ni qaytaring);

boshqa if (y \u003d\u003d 0)

Ushbu kod bir xil deb ataladi, farq faqat parametrlarda - birinchi holatda kompilyator butun son va ikkinchisida - real bilan tranzonni keltirib chiqaradi:

Odatiy parametrlar

C # 4.0 versiyasi bilan boshlanadi ( Vizual studiya. 2010 yil sizga biron bir parametrlarga standart qiymatni o'rnatishga imkon beradi - shunda parametrlarning bir qismi parametrlarning bir qismi qoldirilishi mumkin. Buning uchun usulni amalga oshirishda kerakli parametrlar to'g'ridan-to'g'ri parametrlar ro'yxatiga qiymatni belgilash kerak:

xususiy Hiscous GetData (Int raqami, intfital = 5 )

Konsol.writine ("raqami: (0)", raqam);

Konsol.writine ("Ixtiyoriy: (0)", ixtiyoriy);

Bunday holda, usul quyidagicha deb atash mumkin:

Getdata (10, 20);

Birinchi holda, ixtiyoriy parametr 20 bo'ladi, chunki u aniq belgilangan va ikkinchisida 5 ga teng bo'ladi, chunki Shubhasiz, bu ko'rsatilmagan va kompilyator standart qiymatni oladi.

Odatiy parametrlar faqat parametrlar ro'yxatining o'ng tomonida o'rnatilishi mumkin, masalan, kompilyator usulining imzosi qabul qilinmaydi:

xususiy Hiscous GetData (Tarkibingiz majburiy) = 5 , INT raqami)

Parametrlar odatdagi usulda (qo'shimcha kalit so'zlarsiz reflik va o'chirilmasdan), usul ichidagi parametrlardagi o'zgarishlar asosiy dasturdagi qiymatga ta'sir qilmaydi. Bizda bor deb o'ylaymiz keyingi usul:

xususiy Vosqinchi Calce (Int raqami)

Ko'rinib turibdiki, usul ichida parametr sifatida uzatiladigan o'zgaruvchan raqamning o'zgarishi mavjud. Usulni chaqirishga harakat qilaylik:

Konsol.writine (n);

1-ekranda ekran paydo bo'ladi, ya'ni Calc usuli o'zgaruvchisining o'zgaruvchisiga qaramay, asosiy dasturning qiymati o'zgarmadi. Buning sababi, bu usulni chaqirish paytida yaratilganligi sababli nusxa ko'chirmoq Transport qilingan o'zgaruvchi, bu usulni o'zgartiradi. Usul tugagach, nusxalari yo'qoladi. Ushbu parametrni uzatish usuli deb nomlanadi qiymat bo'yicha uzatish.

Unga uzatiladigan o'zgaruvchini o'zgartirish usulini tuzish uchun uni kalit so'zlarning xatosi bilan uzatilishi kerak - bu usul imzosida ham bo'lishi kerak va qo'ng'iroq qachon bo'lishi kerak:

xususiy Bo'shliqni Clom (ref int raqam)

Konsol.writine (n);

Bunday holda, ekranda 10 raqami ko'rinadi: usuldagi qiymat asosiy dasturga ta'sir ko'rsatdi. Bu usulning bunday uzatilishi deyiladi linkni uzatish. Nusxasi uzatilmaydi, ammo xotirada haqiqiy o'zgaruvchan narsaga havola.

Agar usul o'zgaruvchilardan foydalansa, faqat qadriyatlarni qaytarish uchun foydalansa va u ularda paydo bo'lsa, unda siz bunday o'zgaruvchini boshlamaysiz, lekin ularni kalit so'zga o'tishingiz mumkin emas. Tuzuvchi o'zgaruvchining boshlang'ich qiymati muhim emasligini tushunadi va boshlang'ich bo'lmaganda qasam ichmaydi:

xususiy bo'sh bo'shliq Calce (INT raqami)

int n; // Hech narsa tayinlamang!

String ma'lumot turi

C # dagi satr ishlatiladi. Satr o'zgaruvchisini e'lon qilish uchun (va qoida tariqasida) tor string o'zgaruvchini yozishingiz mumkin, siz quyidagi kodni yozishingiz mumkin:

a \u003d "matn";

b \u003d "qatorlar";

Qo'llar davomida siz qo'shimcha operatsiyani bajarishingiz mumkin - bu holda bir xil chiziqning matni ikkinchisining matniga qo'shiladi:

c \u003d A + "" + b; // natija: satr matni

Satr turi aslida satr sinfining taxallusi bo'lib, u bilan bir qator murakkab operatsiyalar qator ustalardan yuqori bo'lgan. Masalan, indeksning indekslari satrni qidirishi mumkin va pastki chiziq usuli belgilangan holatdan boshlab belgilangan uzunlikning bir qismini qaytaradi:

a \u003d "ABCDDDEFGJHJTLMNOPRSKYZ";

int indeks \u003d a.indexof ("OP"); // Natija: 14 (0 hisobida)

b \u003d A.Substring (3, 5); // Natija: defgh

Agar satrga qo'shish kerak bo'lsa maxsus belgilarBu teskari slipdan boshlangan qochqinlar-ketmatlardan foydalanish mumkin:

Komponentlar ro'yxati.

Tarkibiy qism Ro'yxat qutisi. Bu elementlari klaviatura yoki sichqoncha yordamida tanlanganlar ro'yxati. Elementlar ro'yxati mol-mulk tomonidan o'rnatiladi. Buyumlar.. Elementlar o'z xususiyatlariga ega va uning usullariga ega bo'lgan elementdir. Usul Qo'shish., Xafa bo'lish. va Kiritmoq. Narsalarni qo'shish, o'chirish va qo'shish uchun ishlatiladi.

Ob'ekt Buyumlar. Ro'yxatda ko'rsatilgan ob'ektlar. Ob'ekt har qanday sinf bo'lishi mumkin - sinf ma'lumotlari strtring usuliga satr ko'rinishga aylantiriladi. Bizning holatlarimizda qatorlar ob'ekt sifatida amalga oshiriladi. Biroq, buyumlar ob'ekt turiga berilgan ob'ektlar ob'ektlar turlari, asl nusxaga qaytarish kerak, shuning uchun satrda:

a \u003d (string) ro'yxat qutisi1.itmlar;

Tanlangan element sonini aniqlash uchun, mulk ishlatiladi. Tanlangan..

"Punktlarni joylashtirish" haqidagi "Patho" ni oldindan so'rayman, ammo men sizni biron bir maqolaga olib borishi kerak, menimcha, men sizning umidlaringizni oqlashga harakat qilaman.

Nima bo'lgani haqida qisqacha

Bularning barchasi ham ma'lum, ammo boshida men sizga usul parametrlari 1Cda qanday qilib o'tkazilishi mumkinligini eslatib turaman. Ularni "havolada" va "ma'nosi" deb uzatish mumkin. Birinchi holda, biz bir xil qiymatni qo'ng'iroq nuqtasida va ikkinchisida - nusxasini o'tkazamiz.

Odatiy bo'lib, 1C argumenti ma'lumot orqali uzatiladi va usul ichidagi parametrning o'zgarishi tashqi usuldan ko'rinadi. Bu erda muammoni yanada tushunish, "o'zgartirish parametr" so'zi ostida nimani tushunganingizga bog'liq. Shunday qilib, qayta tayinlash va boshqa hech narsa yo'q. Bundan tashqari, tayinlash, masalan, chiqish parametridagi biror narsani qaytaradigan platformaning usulini chaqirish orqali berkitilishi mumkin.

Ammo agar biz parametrimiz mos ravishda uzatilishini istamasak, parametrdan oldin kalit so'zni belgilashimiz mumkin Belgi

Kadrlar qilish tartibi (qiymat parametr) parametr \u003d 2; Ajratish parametr \u003d 1; Yaratilish (parametr); Hisobot (parametr); // 1 ni oladi 1.

Hamma narsa va'da qilinganidek ishlaydi - o'zgarish (va boshqa to'g'ri "almashtirish" o'zgarishi (va boshqa to'g'ri "almashtirish") ning qiymati bu usuldan tashqarida qiymat o'zgarishga olib kelmaydi.

Xo'sh, hazil nima?

Qiziqarli daqiqalar parametrlar sifatida o'tishni boshlaganda boshlanadi ibtidoiy tur (chiziqlar, raqamlar, xurmo va boshqalar) va ob'ektlar. Bu erda ob'ektning "kichik" va "chuqur" nusxasi, shuningdek C ++ va mavhum nomlar (tutunlar), pop bilan emas.

Ma'lumot bilan ob'ektni (masalan, jadvallar uchun) uzatishda biz ob'ektni xotirada "ushlab turadigan" platforma xotirasida ko'rsatgich qiymatini (ba'zi tutqichni) uzatamiz. Qiymatni uzatishda platforma ushbu ko'rsatgichning nusxasini yaratadi.

Boshqacha qilib aytganda, agar ob'ektni moslashtirish orqali topshirsangiz, biz qiymatni "qator" parametriga tayinlaymiz, keyin qo'ng'iroq nuqtasida biz qator olamiz. Ma'lumot uzatilgan qiymatni qayta tayinlash qo'ng'iroq saytidan ko'rinadi.

Davolash tartibi (parametr) parametr \u003d yangi massiv; Extruza hujayrali stol \u003d yangi dastur; Davolash (jadval); Hisobot (Tinch (jadval)); // qatorni yuklang

Agar biz ob'ektni qiymat bo'yicha beramiz, keyin qo'ng'iroq qilish nuqtasida stol yo'qolmaydi.

Ob'ektning mazmuni va uning holati

Qiymat uzatilganda, butun ob'ekt nusxa ko'chirilmaydi, lekin faqat uning ko'rsatkichi. Ob'ektning namunasi bir xil bo'lib qoladi. Ob'ektni qanday qilib moslashtirish yoki qiymatni tozalashning ahamiyati yo'qligidan qat'iy nazar, qiymatlarning qiymatlarini tozalash jadvalni tozalashda olib keladi. Ushbu tozalash hamma joyda ko'rinadi, chunki Ob'ekt bitta va noyob edi va u qanday usulga etkazilgan bo'lsa ham.

Jarayonni qayta ishlash (parametr) parametr. Operatsiya (); Extruza hujayrali stol \u003d yangi dastur; Jadval. Qo'shimcha (); Davolash (jadval); Hisobot (jadval () raqam ()); // 0

Ob'ektlarni usullarga uzatishda platforma strelkalar (an'anaviy, to'g'ridan-to'g'ri o'xshash analoglardan C ++ dan) ishlaydi. Agar ob'ekt ma'lumotnoma orqali uzatilgan bo'lsa, unda xotira hujayrasi virtual mashinada Yallig'ida 1c bu ob'ektboshqa narsa tomonidan qayta yozilishi mumkin. Agar ob'ekt qiymati bo'yicha uzatilgan bo'lsa, ko'rsatgich ko'chirilgan va ob'ektni qayta yozish moslamasining manba ob'ekti bilan xotira kamerasini qayta yozishga olib kelmaydi.

Bir vaqtning o'zida har qanday o'zgarish davlat Ob'ekt (tozalash, xususiyatlarni qo'shish va boshqalar) ob'ektning o'zida o'zgaradi va umuman u ob'ekt qanday va qayerda yuqish bilan bog'liq emas. Ob'ekt holatining holati o'zgardi, u bir nechta "mos yozuvlar" va "qadriyatlar" bo'lishi mumkin, ammo namuna doimo bir xil bo'lishi mumkin. Biror narsani usulga o'tish orqali biz butun ob'ektning nusxasini yaratmaymiz.

Va bundan tashqari har doim haqiqatdir ...

Mijoz-server o'zaro ta'siri

Platforma server qo'ng'iroqlari bilan juda shaffof amalga oshiriladi. Biz shunchaki usulni chaqiramiz va kaput ostida barcha usul parametrlari (satrga buriling). Serverga uzatiladi va keyin ular yo'q bo'lib ketmaydi har qanday serverga o'ting.

Ma'lumki, barcha platforma ob'ektlari serializatsiya qilinmaydi. Bu shundan beri cheklovlar mijozning server usuliga o'tkazilishi mumkin emas. Agar siz eng og'ir bo'lmagan ob'ektni uzatsangiz, platforma yomon so'zlarni boshlaydi.

  • Dasturchi niyatlarini aniq e'lon qilish. Usul imzosiga qarab, siz qaysi parametrlarni kiritish va qanday natijalarga erishishingiz mumkinligini aniq aytishingiz mumkin. Ushbu kodni o'qish va o'qishni osonlashtiradi
  • Serverdagi "havola" parametrini o'zgartirish uchun u mijozning qo'ng'iroq nuqtasida ko'rinadi,arametriyalar serverga havola orqali uzatdilar, platforma maqolaning boshida tavsiflangan xatti-harakatlarini ta'minlash uchun mijozga qaytib keladi. Agar parametrni qaytarish kerak bo'lmasa, trafik haddan tashqari oshiriladi. Ma'lumot almashishni optimallashtirish uchun biz qiymatni ishlab chiqarishda biz uchun kerak bo'lmagan parametrlar, ma'nosini anglatadi.

Ikkinchi nuqta bu erda juda mos emas. Trafikni optimallashtirish uchun, agar parametr so'z qiymati bilan belgilansa, platforma mijozga parametr qiymatini qaytarib bermaydi. Bularning barchasi ajoyib, ammo qiziqarli ta'sirga olib keladi.

Aytganimdek, ob'ekt serverga o'tkazilganda serializatsiya sodir bo'ladi, I.E. Ob'ektning "chuqur" nusxasi amalga oshiriladi. Va agar so'zlar bo'lsa Qiymatiob'ekt serverdan mijozga qaytib bormaydi. Biz ushbu ikkita faktlarni katlayapmiz va quyidagilarni olishimiz mumkin:

& Chiqish protsessualini oshirish (parametr) parametr. Tavsiya (); Tanishish uchun ekstrustries va Nasserver protsedurasi (qiymat parametr) parametr. Tavsiya (); Ekstraqrlar va shikoyat qilish tartibini tan olish (qiymat parametr) parametr. Tavsiya (); Oxiratni tugatish va da'vo qilish tartibi Signal () Ro'yxat1 \u003d Yangi Skralalar; Ro'yxati1. Qo'shing ("salom"); List2 \u003d ro'yxati1.copy (); Ro'yxati3 \u003d ro'yxati1.copy (); // ob'ekt to'liq nusxalangan, // serverga uzatiladi, keyin qaytib keladi. // Ro'yxatni tozalash tez (Lat1) post nuqtasida ko'rinadi; // ob'ekt to'liq nusxalangan, // serverga o'tadi. Orqaga qaytmaydi. // Ro'yxatni tozalash Yaratilishning chaqiriq nuqtasida ko'rinmaydi (ro'yxati2); // faqat ob'ekt ko'rsatgichi // Tozalash kognitsiyaning chaqiriq nuqtasida ko'rinadi (ro'yxati3); Hisobot (ro'yxati. NOTVICE ()); Hisobot (ro'yxati2. Raqami ()); Hisobot (ro'yxati3. NDTB ()); Ekchis

Qisqacha ma'lumot

Agar qisqa bo'lsa, quyidagicha umumlashtirish mumkin:

  • Ma'lumot uzatish sizga ob'ektni mutlaqo boshqa ob'ekt bilan "ter" ga olib borishga imkon beradi
  • Etkazilish ob'ektni "ter" ga "ter" ga, ammo ob'ektning ichki holatiga o'zgarishi mumkin, chunki Ob'ektning bir xil namunasi bilan ishlash
  • Server qo'ng'iroq paytida ish ob'ektning turli xil ob'ektlari bilan birga keladi, chunki Chuqur nusxa ko'chirish amalga oshirildi. Kalit so'z Qiymati Server masalani nusxalashni mijozga qaytarib berishni o'chiring va Serverdagi ob'ektning ichki holatini o'zgartirish mijozga shunga o'xshash o'zgarishlarga olib kelmaydi.

Umid qilamanki, ushbu oddiy qoidalar ro'yxatga hamkasblar bilan parametrlarni "qiymati bo'yicha" va "Linkda" uzatilishlari haqida nizolarni hal qilishni osonlashtiradi.

Shunday qilib, faktorial (N) faktorial sonni hisoblash funktsiyasi bo'lsin. Keyin, biz "ma'lum" festientori ekanligimizni hisobga olib, 1 bu 1, siz quyidagi zanjirni qurishingiz mumkin:

Faktorial (4) \u003d faktorial (3) * 4

Fitna (3) \u003d faktorial (2) * 3

Faktorial (2) \u003d faktorial (1) * 2

Ammo, agar bizda n \u003d 1 bo'lsa, funktsional zanjir hech qachon qaytarilishi kerak, shunda bunday nazariy rang toshib ketishi mumkin. Balki stek nima ekanligini tushunish va qanday qilib toshib ketishi mumkinligini tushunish uchun, keling, bizning funktsiyamizni rekvizit bajarilishini ko'rib chiqaylik:

FOYDALANISh FOYDALANISH (N: butun son): uzun;

Agar n \u003d 1 bo'lsa

Fotiginar: \u003d faktorial (N-1) * n;

Oxiri;

Ko'rinib turibdiki, zanjir to'g'ri ishlashi uchun, har bir keyingi har bir funktsiyani saqlab qolish uchun har bir funktsiyani saqlab qolish uchun biron bir vazifani saqlang (N-1 N) tomonidan ko'paytirilgan) . Bizning holatlarimizda, har safar funktsiya funktsiya funktsiyasi, o'zgaruvchining barcha qadriyatlari saqlanishi kerak. Mahalliy o'zgaruvchan funktsiyalar o'z-o'zidan rekuctive kirish bilan qo'ng'iroq qilish, qo'ng'iroq stakan deb nomlanadi. Albatta, bu ustun cheksiz va rekursiv qo'ng'iroqlarni noto'g'ri qurish bilan amalga oshiriladi. Bizning misolni amalda qo'llashni amalga oshirish uchun bizning misollarimizning harakatlanishlari kafolatlanadi.

Qiymat va ma'lumotnoma bo'yicha parametrlarni o'tkazish

Hozircha biz subroutinda qiymatni o'zgartira olmadik haqiqiy parametr(i.e., subroutinni chaqirish paytida ko'rsatilgan parametr va ba'zi qo'llanma qilingan vazifalarda qulay bo'ladi. Birdan ikki haqiqiy parametrlarning qiymatini o'zgartiradigan protsessurevalni eslang: birinchi navbatda o'zgaruvchan qahramonning xato joylashtirilgan bo'lsa, ikkinchi parametr - bu xato holatida xato bo'lgan parametrlar mavjud turini o'zgartirganda. Ular. Shunga qaramay, subroutin haqiqiy parametrlarni o'zgartirishi mumkin bo'lgan mexanizm mavjud. Bu mumkin rahmat turli xil usullar Parametrlarni topshirish. Keling, bu usulda batafsil tushunamiz.

Paskal dasturlash

Qiymati bo'yicha parametrlarni o'tkazish

Aslida, biz barcha parametrlarni bizning subprogrammalarimizga topshirdik. Quyidagi mexanizm: haqiqiy parametrini belgilashda, uning qiymati quyi tarmoq joylashgan xotira zonasiga ko'chirilgan va keyinchalik funktsiya yoki protsedura o'z ishini tugatgandan so'ng, bu hudud tozalangan. Taxminan aytishicha, pastki laROGE ishi paytida uning ikkita nusxasi mavjud: bir qatorda qo'ng'iroqlar dasturiIkkinchisi esa funktsiyaning ko'rinishi sohasida.

Ushbu usul bilan parametrlarni uzatish usuli bilan quyi vaqtni chaqirish uchun ko'proq vaqt talab qilinadi, chunki qo'ng'iroqning o'zi uchun qo'shimcha ravishda barcha haqiqiy parametrlarning barcha qiymatlarini nusxalashingiz kerak. Agar katta miqdordagi ma'lumotlar subprogrammaga uzatilsa (masalan, ko'p sonli narsalar bilan massivlar), mahalliy hududga ma'lumotlarni nusxalash uchun zarur bo'lgan vaqt muhim bo'lishi va uni ishlab chiqishda amalga oshirilishi kerak ularning ishlashida muammolar uchun.

Ushbu uzatish usuli bilan, haqiqiy parametrlarni almashtirish mumkin emas, chunki o'zgarishlar faqat operatsiya tugagandan keyin chiqarilishi yoki protsedura amalga oshirilganidan keyin chiqariladi.

Muloqot orqali parametr uzatish

Ushbu usul bilan, haqiqiy parametrlarning qiymatlari quyi qismga ko'chirilmaydi, va manzillar xotirada (o'zgaruvchilar sahifasiga) ular joylashgan. Bunday holda, quyi subroutin allaqachon mahalliy hududda bo'lmagan qiymatlarni o'zgartiradi, shuning uchun barcha o'zgarishlar ko'rinadi va qo'ng'iroqlar dasturi bo'ladi.

Har qanday argumentni ma'lumotnoma o'tkazishi kerakligini aniqlash uchun, kalit so'z reklama oldidan qo'shilganligini aniqlash uchun.

Protsedura gettworanandom (Var N1, N2: butun son; oralig'i);

n1: \u003d tasodifiy (diapazon);

n2: \u003d tasodifiy (diapazon); oxiri;

var Rand1, Rand2: butun son;

Boshlanishi. gettworanandom (rand1, rand2.10); WRITITELN (RAND1); Writeln (RAND2);

Oxiri.

Ushbu misolda, gettworanandom protsedurasi ikkita o'zgaruvchiga uzatiladi: Rand1 Andran2 haqiqiy parametrlar sifatida: Rand1 Andran2. Uchinchi haqiqiy parametr (10) qiymat bo'yicha uzatiladi. Jarayon rasmiy parametrlar orqali yozadi.