Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   copiar un array mas grande en otro mas chico (https://www.clubdelphi.com/foros/showthread.php?t=77107)

jars 21-12-2011 21:02:45

copiar un array mas grande en otro mas chico
 
Hola amigos, tengo el siguiente problema:

Código Delphi [-]
type  
  TFrame20ms = packed record
    Lc: SmallInt;   // canal izquierdo
    Rc: SmallInt;   // canal derecho
  end;

En un procedimiento defino lo siguiente:
Código Delphi [-]
const
  RBUFLEN = 32000 / 4;
var
  rbuf: array of TFrame20ms;
  fbuf: array of TFrame20ms;
begin
  SetLength(rbuf, RBUFLEN);
  SetLength(fbuf, 160); //160 elementos
  ....
  rcnt := FileRead(InHandle, rbuf[0], RBUFLEN * SizeOf(rbuf[0]));

  l := 0;
  h := 159;
  for i := 1 to NumFrames do
  begin
    //  este es el problema
    // necesito ir avanzando en el array rbuf tomando en cada iteracion 160 elementos
    // e ir copiandolos en el array fbuf. Que hago mal porque solo me copia el primer elemento en cada pasada.
    Move(rbuf[l], fbuf[0], SizeOf(fbuf));
    .....
    l := h+1;
    h := h+160;
    ....
  end;

Gracias y espero haberme explicado.

Al González 22-12-2011 07:22:01

No queda muy claro el planteamiento, pero quizá sirva de algo aclarar que la función SizeOf no regresa el tamaño de una matriz (número de elementos) sino el monto de bytes que ocupa una variable o tipo de dato. Las variables de tipo matriz dinámica (como rbuf y fbuf, en tu código) son simples punteros hacia la región de memoria donde se almacena la matriz en sí. Y, como todo puntero estándar, su tamaño es de 32 bits (4 bytes).

Si quieres obtener la cantidad de elementos de una matriz, usa la función Length.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
  A :Array Of Integer;
begin
  SetLength (A, 10);
  ShowMessage (IntToStr (SizeOf (A)));  // 4, tamaño del puntero A
  ShowMessage (IntToStr (Length (A)));  // 10, cantidad de elementos de A
end;

Saludos. :)

Al González.

Ñuño Martínez 22-12-2011 10:22:23

Como complemento al comentario de Al:

Hay, también, dos funciones que devuelven los límites de un vector (lista o array) que son High y Low. Es decir, Low devuelve el índice del primer elemento y High devuelve el índice al último. Funciona con cualquier tipo de vector, tanto dinámico como estático, lo que facilita mucho el trabajo cuando tienes que recorrer listas de las que no sabes cuántos elementos tienen o cuál es elemento inicial (ya sabes que en Pascal puedes elegir el índice del primer elemento). Por ejemplo:
Código Delphi [-]
PROCEDURE MuestraInfoVector (Vector: ARRAY OF INTEGER);
VAR
  Ndx: INTEGER
BEGIN
  WriteLn ('Los límites del vector son ', Low (Vector), ' y ', High (Vector), '.');
  Write ('Y sus elementos son: v = {');
  FOR Ndx := Low (Vector) TO High (Vector) DO
    Write (Vector[Ndx], ' ');
  WriteLn ('}');
END;

VAR
  Vector1: ARRAY [0..9] OF INTEGER;
  Vector2: ARRAY [7..15] OF INTEGER;
BEGIN
  ...
  MuestraInfoVector (Vector1);
  MuestraInfoVector (Vector2);
END.
Nota: Estoy en la oficina y no tengo ni Delphi ni FreePascal para probar el código anterior, pero debería funcionar.

Nota2: No confundir con las funciones Hi y Lo. Estas devuelven el octeto alto o el bajo de un entero.

Nota3: High y Low también permiten conocer los límites de un tipo de dato. Por ejemplo, si "Variable" es un entero, entonces "High (Variable)" te devolverá el valor máximo que puede almacenar. También puede usarse con tipos (por ejemplo "Low (INTEGER)") pero no con todos ellos.

jars 22-12-2011 13:39:24

Gracias Al y Nuño.
La solución fue lo sugerido por Al, usar Length:

Código Delphi [-]
  Move(rbuf[l], fbuf[0], Length(fbuf));

Gracias.


La franja horaria es GMT +2. Ahora son las 19:59:32.

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