Os arrays são uma das formas mais utilizadas de armazenamento de dados estruturados em programas de computador. Seu processamento pode ser feito por vários algoritmos implementados em métodos e funções de classe. Conseqüentemente, geralmente é necessário passar um array para uma função. As linguagens C e C ++ oferecem grande liberdade na escolha dos métodos de execução desta ação.
É necessário
compiladores de linguagens C e C ++
Instruções
Passo 1
Passe uma matriz de tamanho fixo para a função. Altere o protótipo da função para conter um argumento do tipo apropriado. Por exemplo, a declaração de uma função que recebe uma matriz de valores numéricos inteiros de três elementos como parâmetro pode ter a seguinte aparência:
void ArrayFunction (int aNumbers [3]);
Essa função é chamada passando um array diretamente para ela como um argumento:
void SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (aNumbers);
}
Os dados transferidos são copiados para a pilha. Modificar a matriz na função chamada não altera a fonte.
Passo 2
Passe matrizes de comprimento variável para a função. Para fazer isso, simplesmente não especifique a dimensão do argumento correspondente:
void ArrayFunction (int aNumbers );
Matrizes multidimensionais também podem ser passadas de maneira semelhante (apenas a primeira "dimensão" pode ser variáveis):
void ArrayFunction (int aNumbers [3] [2]);
Essas funções são chamadas da mesma forma que na primeira etapa.
Para poder processar corretamente os arrays de comprimento variável em uma função, você deve passar explicitamente o número de seus elementos por meio de um parâmetro adicional ou usar convenções que impõem restrições aos valores dos próprios elementos (um determinado valor deve ser um sinal do fim da matriz).
etapa 3
Passe a matriz por ponteiro. O argumento da função deve ser um ponteiro para um valor com um tipo correspondente aos elementos da matriz. Por exemplo:
void ArrayFunction (int * pNumbers);
O acesso aos dados em uma função pode ser realizado na notação para trabalhar com elementos da matriz e usando aritmética de endereço:
void ArrayFunction (int * pNumbers)
{
pNumbers [0] = 10; // acesso ao elemento 0
* (pNúmeros + 1) = 20; // acesso ao item 1
}
Tome cuidado! Como a função não é passada como uma cópia dos dados, mas um ponteiro para eles, o array original será modificado.
A vantagem deste método é a velocidade, economia de recursos computacionais e uma certa flexibilidade. Portanto, você pode chamar a função de destino passando um ponteiro para um elemento arbitrário da matriz:
void SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (aNumbers); // array inteiro
ArrayFunction (& aNumbers [1]); // começando do segundo elemento
}
Esse método também geralmente envolve a passagem do número de elementos disponíveis em um parâmetro adicional ou o uso de um terminador de matriz.
Passo 4
Passe dados para uma função com um parâmetro que seja um objeto ou uma referência a um objeto da classe que implementa a funcionalidade de array. Essas classes ou modelos de classe são normalmente encontrados em bibliotecas e estruturas populares (QVector em Qt, CArray em MFC, std:: vector em STL, etc.).
Freqüentemente, essas classes implementam uma estratégia de compartilhamento de dados implícita com contagem de referência, realizando uma cópia profunda apenas quando os dados são modificados (cópia na gravação). Isso permite que você minimize o consumo de recursos computacionais, mesmo no caso de passar objetos de matriz por valor por meio de argumentos de funções e métodos:
void ArrayFunction (QVector oArray)
{
int nItemCount = oArray.count ();
int nItem = oArray [0];
}
void SomeFunction ()
{
QVector oArray (10);
para (int i = 0; i