[Delphi] Um passo além com matrizes

Matriz é uma coleção de indexada de elementos do mesmo tipo que podem ser estáticas ou criadas dinamicamente. Como cada elemento possui um índice próprio para ser acessado, seus valores podem se repetir sem nenhum problema. Os índices de uma matriz no Delphi são necessariamente do tipo Integer.

Sintaxe

A sintaxe base de uma matriz é bastante simples. Basta definir o nome da variável, o tamanho e o tipo de seus elementos:

Quando uma matriz estática é declarada, os valores de cada elemento assumem valores aleatórios vindos da memória. É possível acessa-los através de seus respectivos índices. Declarar uma matriz estática só é recomendável quando se há certeza de que todos os elementos serão utilizados, pois cada elemento ocupa espaço na memória e isso pode ser bastante problemático em métodos com recursividade ou loops encadeados.

Matrizes multidimensionais

Uma matriz pode conter elementos que também são matrizes. Isso é vantajoso quando existe a necessidade de armazenar informações que seguem o estilo [x, y] (plano cartesiano – méritos ao grande René Descartes). A sintaxe, declaração e características de memória seguem as mesmas regras de uma unidimensional.

Matrizes dinâmicas

Nem tudo é estático nessa vida. Na maioria dos casos trabalharemos com matrizes dinâmicas que precisam aumentar ou diminuir conforme a necessidade do método.

Existem algumas formas de se trabalhar com uma matriz dinâmica e todas elas envolvem diretamente a necessidade de manipular a quantidade de elementos que a matriz suporta.

No exemplo vemos que matriz “ArrayDinamica” foi dinamicamente “setada” para ter um tamanho de 5 elementos do tipo Integer. Ao acessar os índices 6 e 99 que não foram previamente definidos, o Delphi alocou de forma automática os índice 6 e 99 na matriz e armazenou seus valores na memória. A desvantagem dessa prática é que seus valores não podem ser acessados dentro um laço de repetição.

Havendo a necessidade de aumentar o tamanho dos elementos de uma matriz, devemos setar o seu tamanho máximo para o tamanho máximo atual + 1.

O Delphi também nos permite criar um tipo baseado em uma matriz para que possamos invocar o método construtor e passar por parâmetro no momento da criação da nossa matriz dinâmica.

Dinâmica como um ponteiro

Implicitamente as matrizes dinâmicas são tratadas pelo Delphi como ponteiros. Assim sendo, seus valores são referências à espaços na memória e podem conter N variáveis referenciando ao mesmo endereço.

Neste exemplo definimos que o valor de A[0] passa a ser 2 através de B[0]. Se neste exemplo A e B fossem matrizes estáticas ao invés de dinâmicas, A[0] continuaria a valer 1 e alterar o valor de B[0] não causaria impactos em A[0].

Havendo a necessidade de copiar o conteúdo de uma matriz dinâmica para a outra e criar uma nova referência na memória, devemos o usar o comando Copy.

Aqui o endereço do valor de B[0] não tem qualquer relação com o endereço de A[0]. Temos então A[0] = 1 e B[0] = 2.

Comparando matrizes

Quando comparamos a equivalência de duas matrizes dinâmicas, não são seus valores quem são comparados, mas sim a as suas referências:

Repare que ao fazer de C uma referência de A, o resultado é true na comparação.

Matrizes multidimensionais retangulares

Um uso comum para matrizes dinâmicas é a variação de uma planilha de dados onde temos um tipo de estrutura retangular com colunas e linhas:  matriz[colunas, linhas].

Para definirmos casos como este utilizamos também o comando SetLength que implementa uma sobrecarga onde o primeiro parâmetro é a matriz a ser manipulada, o segundo representa a capacidade de elementos da primeira dimensão (colunas) e o terceiro e último parâmetro indica a amplitude da segunda dimensão (linhas).

É possível reparar que para acessarmos os valores referentes ao índice de valor “Col” um laço de repetição foi criado em cima da segunda dimensão da matriz Planilha, representada por Planilha[n], onde o valor do índice é atribuído à variável Linha para ser acessado posteriormente dentro do loop: Planilha[Col][Linha] := ‘Algum valor’;.

Truncando matrizes

Para manipularmos de uma forma completa o tamanho da nossa matriz dinâmica, devemos ser capazes de também diminuir o seu tamanho. Os comandos SetLength e Copy nos oferece este recurso e cada um traz suas particularidades.

O SetLength “corta a capacidade” da matriz ignorando todos os índices que existem depois do valor passado como parâmetro.

Com o Copy, o índice informado no segundo parâmetro passa a ser o índice (zero) na matriz resultante do método e o terceiro determina a capacidade máxima da matriz resultante, subtraindo o valor do primeiro parâmetro. O método Copy não “expande” o tamanho de uma matriz, portanto, o tamanho máximo da matriz resultante está relacionado ao length da matriz informada no primeiro parâmetro.

Atribuição de matrizes

O Delphi faz o uso dos nomes do tipos (types) para verificar a compatibilidade de atribuição das variáveis. Quando a atribuição é feita de forma direta, o RAD Studio acusa o erro ainda em tempo de compilação.

Neste exemplo, temos duas matrizes que aparentemente compartilham o mesmo tipo, porém para o compilador não.

Erro retornado: [dcc32 Error] Unit1.pas(245): E2008 Incompatible types

Os exemplos a seguir ilustram a forma correta de atribuição para matrizes que realmente compartilham o mesmo tipo.

Operadores e matrizes

Podemos adicionar e remover elementos de matrizes utilizando os comandos Insert, Concat e Delete.

O Insert manipula diretamente em que posição os novos elementos serão inseridos. O Concat simplesmente concatena as matrizes 1 e 2 referenciadas nos parâmetros e resulta em uma nova matriz contendo todos os novos elementos concatenados. O Delete é bastante poderoso. Conhecendo os índices que se quer remover, basta informa-los para o método e os mesmos serão removidos da matriz informada no primeiro parâmetro.

 

A manipulação de matrizes é uma tarefa presente em todas as linguagens de programação das quais tive contato até hoje. Saber o básico é essencial, mas conhecer os helpers específicos da linguagem em questão, é o que faz a diferença no dia-a-dia.

6 respostas para “[Delphi] Um passo além com matrizes”

  1. seria mais fácil se estivesse escrito o codigo em vem vez das imagens, nossa senhora dá muito trabalho ter que digitar tudo isso pra testar kk

    valeu mesmo

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *