Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #8  
Antiguo 05-10-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Asignación de matrices dinámicas

Me he permitido elaborar un par de ejemplos sobre la asignación de matrices dinámicas (dynamic arrays). Van a perdonar las posibles faltas ortográficas, pero es que mi Word se trabó.

Código Delphi [-]
Type
  TDynArray = Array Of Integer;

Var
  // Variable global de prueba A1 (ver sección Initialization al final)
  A1 :TDynArray;

// Ejemplo 1
procedure TForm1.Button1Click(Sender: TObject);
Var
  A2 :TDynArray;
begin
  { Asignamos la matriz A1 a A2.  Ambas variables apuntarán a la misma
    región de memoria, la cual cambia su contador de referencias interno de
    1 a 2 (ahora hay dos variables apuntando a ella). }
  A2 := A1;

  { Aumentamos a 6 la longitud de la matriz A2.  Esto implícitamente
    genera una copia de los elementos desde A [0] hasta A [4] a una nueva
    región de memoria, y A2 apuntará a ésta, mientras que A1 seguirá
    apuntando a la matriz original de 5 elementos, la cual reduce su
    contador de referencias a 1 (de nuevo sólo A1 apunta a ella). }
  SetLength (A2, 6);
  ShowMessage (Format ('Longitud de A1: %d', [Length (A1)]));
  ShowMessage (Format ('Longitud de A2: %d', [Length (A2)]));

  { Modificamos el primer elemento de A2 y lo mostramos en contraste con el
    primer elemento de A1 }
  A2 [0] := 30;
  ShowMessage (IntToStr (A1 [0]));  // Muestra 10 (de la original)
  ShowMessage (IntToStr (A2 [0]));  // Muestra 30 (de la copia modificada)

  // Mostramos el quinto elemento de A1 y el quinto elemento de A2
  ShowMessage (IntToStr (A1 [4]));  // Muestra 14 (de la original)
  ShowMessage (IntToStr (A2 [4]));  // Muestra 14 (de la copia)

  { Las variables que usan contadores de referencias se desechan en
    automático al quedar fuera de alcance.  En este "end", la región de
    memoria a la que apunta A2 será liberada por la así llamada "magia del
    compilador" (el compilador agrega al código máquina las instrucciones
    necesarias para ello). } 
end;

// Ejemplo 2
procedure TForm1.Button2Click(Sender: TObject);
Var
  A2 :TDynArray;
begin
  { Como ya vimos, esta asignación hace que ambas variables apunten a la
    misma región de memoria. }
  A2 := A1;

  { Pero si queremos una copia particular de la matriz dinámica, en lugar
    de asignación directa debemos usar la función estándar Copy. }
  A2 := Copy (A1);

  // Demostramos que realmente se trata de una copia
  A2 [0] := 30;
  ShowMessage (IntToStr (A1 [0]));  // Muestra 10 (de la original)
  ShowMessage (IntToStr (A2 [0]));  // Muestra 30 (de la copia modificada)
end;
                          
Initialization
  { Al comienzo del programa, asignamos memoria a la variable global A1
    para que contenga cinco números Integer (el tipo de nuestro TDynArray),
    y establecemos los valores 10, 11, 12, 13 y 14 en esa matriz.  NOTA:
    Esto está hecho en Delphi 7, pero al parecer desde la versión XE7 puede
    inicializarse una matriz dinámica en su propia declaración como
    variable global (nos ahorraríamos esta sección). }
  SetLength (A1, 5);
  A1 [0] := 10;
  A1 [1] := 11;
  A1 [2] := 12;
  A1 [3] := 13;
  A1 [4] := 14;

end.

Una aclaración que considero importante: A diferencia de las cadenas de caracteres, las matrices dinámicas no emplean el mecanismo de "copiar al escribir", por lo cual es necesario asegurarnos de tener una copia verdadera antes de hacer algo como:
Código Delphi [-]
A2 [0] := 30
Las funciones SetLength y Copy garantizan lo anterior.

Un saludo.

Al González.
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
funcion que me regresa un arreglo julyus OOP 14 27-08-2010 23:49:01
Funcion Array Dinamico??? franss Varios 4 28-08-2008 21:33:23
Arreglo de Registros, con arreglos de Registros(Dinamico) PiornoCKA&G Varios 4 05-01-2007 08:53:30
arreglo dinamico prubtest C++ Builder 1 31-07-2004 23:54:45
Como devuelvo un Arreglo en Función Prophoenix Varios 1 30-05-2003 19:40:58


La franja horaria es GMT +2. Ahora son las 21:24:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi