Raանգվածները համակարգված ծրագրերում տվյալների կառուցվածքային պահպանման առավելապես օգտագործվող ձևերից մեկն են: Դրանց մշակումը կարող է կատարվել դասի մեթոդներում և գործառույթներում ներդրված տարբեր ալգորիթմներով: Ըստ այդմ, հաճախ պահանջվում է զանգվածը փոխանցել ֆունկցիային: C և C ++ լեզուները մեծ ազատություն են առաջարկում այս գործողության կատարման մեթոդներն ընտրելու հարցում:
Դա անհրաժեշտ է
C և C ++ լեզուների կազմողներ:
Հրահանգներ
Քայլ 1
Գործառույթին փոխանցեք ֆիքսված չափի զանգված: Փոխեք ֆունկցիայի նախատիպը ՝ համապատասխան տեսակի փաստարկ պարունակելու համար: Օրինակ, ֆունկցիայի հայտարարագրումը, որը որպես պարամետր վերցնում է երեք տարրերի ամբողջ թվային արժեքների զանգված, կարող է նման լինել.
անվավեր ArrayFunction (int aNumbers [3]);
Նման ֆունկցիան կոչվում է զանգված ՝ ուղղակիորեն դրան փոխանցելով, որպես փաստարկ.
ուժը կորցրած SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (aNumbers);
}
Փոխանցված տվյալները պատճենվում են դեղի վրա: Կոչված գործառույթում զանգվածը փոփոխելը չի փոխում աղբյուրը:
Քայլ 2
Փոփոխական երկարության զանգվածները փոխանցեք գործառույթին: Դա անելու համար պարզապես մի նշեք համապատասխան փաստարկի չափը.
անվավեր ArrayFunction (int aNumbers );
Բազմաչափ զանգվածները կարող են փոխանցվել նաև նման ձևով (միայն առաջին «չափումը» կարող է փոփոխական լինել).
անվավեր ArrayFunction (int aNumbers [3] [2]);
Այս գործառույթները կոչվում են նույն կերպ, ինչպես առաջին քայլում:
Որպեսզի ֆունկցիայի մեջ փոփոխական երկարության զանգվածներ ճիշտ մշակվեն, դուք պետք է կամ հստակորեն փոխանցեք դրանց տարրերի քանակը լրացուցիչ պարամետրով, կամ օգտագործեք պայմանագրեր, որոնք սահմանափակումներ են դնում հենց դրանց տարրերի արժեքների վրա (որոշակի արժեք պետք է լինի զանգվածի վերջի նշան):
Քայլ 3
Անցեք զանգվածը ցուցիչով: Ֆունկցիայի փաստարկը պետք է լինի զանգվածի տարրերին համապատասխան տիպի արժեքի ցուցիչ: Օրինակ:
անվավեր ArrayFunction (int * pNumbers);
Ֆունկցիայի մեջ տվյալների հասանելիությունը կարող է իրականացվել ինչպես զանգվածի տարրերի հետ աշխատելու նշման մեջ, այնպես էլ հասցեի թվաբանության օգտագործմամբ.
անվավեր ArrayFunction (int * pNumbers)
{
pNumbers [0] = 10; // մուտք դեպի 0 տարր
* (pNumbers + 1) = 20; // 1-ին կետի հասանելիություն
}
Զգույշ եղիր! Քանի որ գործառույթը փոխանցվում է ոչ թե տվյալների պատճենը, այլ դրան ցուցիչ է, սկզբնական զանգվածը կփոփոխվի:
Այս մեթոդի առավելությունն է արագությունը, հաշվարկային ռեսուրսների խնայողությունը և որոշակի ճկունությունը: Այսպիսով, դուք կարող եք անվանել թիրախային գործառույթը ՝ այն ցուցիչ փոխանցելով զանգվածի կամայական տարրի:
ուժը կորցրած SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (aNumbers); // ամբողջ զանգված
ArrayFunction (& թվեր [1]); // սկսած երկրորդ տարրից
}
Այս մեթոդը սովորաբար ներառում է նաև լրացուցիչ պարամետրում առկա տարրերի քանակի փոխանցում կամ զանգվածի տերմինատորի օգտագործում:
Քայլ 4
Տվյալներ փոխանցեք գործառույթին այն պարամետրով, որը օբյեկտ է կամ հղում է այն դասի օբյեկտին, որն իրականացնում է զանգվածի ֆունկցիոնալությունը: Նման դասերը կամ դասի ձևանմուշները սովորաբար հանդիպում են հանրաճանաչ գրադարաններում և շրջանակներում (QVector in Qt, CArray in MFC, std:: vector in STL և այլն):
Հաճախ այս դասերը իրականացնում են տվյալների փոխանակման անուղղակի ռազմավարություն `հղումների հաշվարկով` խորը պատճեն կատարելով միայն տվյալների փոփոխման ժամանակ (պատճենը գրելու վրա): Սա թույլ է տալիս նվազագույնի հասցնել հաշվարկային ռեսուրսների սպառումը նույնիսկ զանգվածի օբյեկտները ըստ արժեքի գործառույթների և մեթոդների փաստարկների միջոցով փոխանցելու դեպքում.
անվավեր ArrayFunction (QVector oArray)
{
int nItemCount = oArray.count ();
int nItem = oArray [0];
}
ուժը կորցրած SomeFunction ()
{
QVector oArray (10);
համար (int i = 0; i