Arrays er en af de mest anvendte former for struktureret datalagring i computerprogrammer. Deres behandling kan udføres af forskellige algoritmer implementeret i klassemetoder og funktioner. Derfor er det ofte nødvendigt at videregive en matrix til en funktion. C- og C ++ -sprogene giver stor frihed til at vælge metoderne til at udføre denne handling.
Er det nødvendigt
kompilatorer af C og C ++ sprog
Instruktioner
Trin 1
Send et array i fast størrelse til funktionen. Skift prototypen for funktionen, så den indeholder et argument af den relevante type. For eksempel kan erklæringen af en funktion, der tager en matrix med heltalsværdier af tre elementer som en parameter, se sådan ud:
ugyldig ArrayFunction (int aNumbers [3]);
En sådan funktion kaldes ved at sende en matrix direkte til den som et argument:
ugyldig SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (aNumbers);
}
De overførte data kopieres til stakken. Ændring af arrayet i den kaldte funktion ændrer ikke kilden.
Trin 2
Send arrays med variabel længde til funktionen. For at gøre dette skal du simpelthen ikke angive dimensionen for det tilsvarende argument:
ugyldig ArrayFunction (int aNumbers );
Flerdimensionelle arrays kan også sendes på en lignende måde (kun den første "dimension" kan være variabler):
ugyldig ArrayFunction (int aNumbers [3] [2]);
Disse funktioner kaldes på samme måde som i det første trin.
For at kunne behandle arrays med variabel længde korrekt i en funktion skal du enten eksplicit sende antallet af deres elementer gennem en yderligere parameter eller bruge konventioner, der pålægger begrænsninger for selve elementernes værdier (en bestemt værdi skal være et tegn på slutningen af arrayet).
Trin 3
Send matrixen efter markør. Funktionsargumentet skal være en markør til en værdi med en type, der svarer til elementerne i arrayet. For eksempel:
ugyldig ArrayFunction (int * pNumbers);
Adgang til data i en funktion kan udføres både i notationen til at arbejde med matrixelementer og ved hjælp af adressearitmetik:
ugyldig ArrayFunction (int * pNumbers)
{
pNumre [0] = 10; // adgang til element 0
* (pNumre + 1) = 20; // adgang til punkt 1
}
Vær forsigtig! Da funktionen sendes ikke en kopi af dataene, men en markør til den, vil den oprindelige matrix blive ændret.
Fordelen ved denne metode er hastighed, økonomi i beregningsressourcer og en vis fleksibilitet. Så du kan kalde målfunktionen ved at sende den en markør til et vilkårligt element i arrayet:
ugyldig SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (aNumbers); // hele array
ArrayFunction (& numre [1]); // startende fra det andet element
}
Denne metode involverer normalt også videregivelse af antallet af tilgængelige elementer i en yderligere parameter eller brug af en array-terminator.
Trin 4
Send data til en funktion med en parameter, der er et objekt eller en henvisning til et objekt i klassen, der implementerer array-funktionaliteten. Sådanne klasser eller klasseskabeloner findes normalt i populære biblioteker og rammer (QVector i Qt, CArray i MFC, std:: vector i STL osv.).
Ofte implementerer disse klasser en implicit datadelingsstrategi med referencetælling, der kun udfører en dyb kopi, når dataene er modificeret (kopi ved skrivning). Dette giver dig mulighed for at minimere forbruget af beregningsressourcer, selv i tilfælde af at matche array-objekter efter værdi gennem argumenterne for funktioner og metoder:
ugyldig ArrayFunction (QVector oArray)
{
int nItemCount = oArray.count ();
int nItem = oArray [0];
}
ugyldig SomeFunction ()
{
QVector oArray (10);
for (int i = 0; i