Arrayer är en av de mest använda formerna av strukturerad datalagring i datorprogram. Deras bearbetning kan göras med olika algoritmer implementerade i klassmetoder och funktioner. Följaktligen krävs det ofta att en matris överförs till en funktion. Språken C och C ++ erbjuder stor frihet att välja metoder för att utföra denna åtgärd.
Det är nödvändigt
kompilatorer av C- och C ++ -språk
Instruktioner
Steg 1
Skicka en matris med fast storlek till funktionen. Ändra funktionens prototyp så att den innehåller ett argument av lämplig typ. Till exempel kan deklarationen av en funktion som tar en matris med heltal numeriska värden för tre element som en parameter se ut så här:
ogiltig ArrayFunction (int aNumbers [3]);
En sådan funktion kallas genom att skicka en matris direkt till den som ett argument:
ogiltig SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (aNumbers);
}
De överförda data kopieras till stacken. Att ändra arrayen i den anropade funktionen ändrar inte källan.
Steg 2
Skicka arrayer med variabel längd till funktionen. För att göra detta, ange helt enkelt inte dimensionen för motsvarande argument:
ogiltig ArrayFunction (int aNumbers );
Flerdimensionella matriser kan också skickas på liknande sätt (endast den första "dimensionen" kan vara variabler):
ogiltig ArrayFunction (int aNumbers [3] [2]);
Dessa funktioner kallas på samma sätt som i det första steget.
För att korrekt kunna bearbeta matriser med variabel längd i en funktion måste du antingen uttryckligen skicka antalet element genom en ytterligare parameter eller använda konventioner som inför begränsningar för värdena på själva elementen måste vara ett tecken på slutet av matrisen).
Steg 3
Skicka matrisen efter pekaren. Funktionsargumentet måste vara en pekare till ett värde med en typ som motsvarar elementen i matrisen. Till exempel:
ogiltigt ArrayFunction (int * pNumbers);
Åtkomst till data i en funktion kan utföras både i notationen för att arbeta med arrayelement och med adressräkning:
ogiltigt ArrayFunction (int * pNumbers)
{
pNumbers [0] = 10; // tillgång till element 0
* (pNummer + 1) = 20; // tillgång till artikel 1
}
Var försiktig! Eftersom funktionen skickas inte en kopia av data utan en pekare till den kommer den ursprungliga matrisen att ändras.
Fördelen med denna metod är hastighet, beräkning av beräkningsresurser och en viss flexibilitet. Så du kan ringa målfunktionen genom att skicka den till en pekare till ett godtyckligt element i matrisen:
ogiltig SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (aNumbers); // hela matrisen
ArrayFunction (& aNumbers [1]); // från det andra elementet
}
Denna metod innebär vanligtvis också att man skickar antalet tillgängliga element i en ytterligare parameter eller använder en arrayterminator.
Steg 4
Skicka data till en funktion med en parameter som är ett objekt eller en referens till ett objekt i klassen som implementerar arrayfunktionaliteten. Sådana klasser eller klassmallar finns vanligtvis i populära bibliotek och ramar (QVector i Qt, CArray i MFC, std:: vector i STL, etc.).
Ofta implementerar dessa klasser en implicit datadelningsstrategi med referensräkning och utför en djupkopia endast när data modifieras (kopia vid skrivning). Detta gör att du kan minimera förbrukningen av beräkningsresurser även vid överföring av matrisobjekt efter värde genom argumenten för funktioner och metoder:
void ArrayFunction (QVector oArray)
{
int nItemCount = oArray.count ();
int nItem = oArray [0];
}
ogiltig SomeFunction ()
{
QVector oArray (10);
för (int i = 0; i