Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-12-2011
jars jars is offline
Miembro
 
Registrado: mar 2004
Posts: 279
Poder: 21
jars Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 22-12-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
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
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.
Responder Con Cita
  #3  
Antiguo 22-12-2011
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 22-12-2011 a las 10:26:23.
Responder Con Cita
  #4  
Antiguo 22-12-2011
jars jars is offline
Miembro
 
Registrado: mar 2004
Posts: 279
Poder: 21
jars Va por buen camino
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.
Responder Con Cita
Respuesta



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
Copiar De Un Pc A Otro De La Red Un Archivo ingabraham Redes 2 08-04-2011 00:41:27
Y Linux me empezó a quedar chico. AzidRain Debates 4 03-05-2008 03:37:28
insertar un array dentro de otro Yoli PHP 2 30-10-2007 22:06:45
Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo morfeo21 Varios 5 17-08-2004 17:39:51
Copiar Parte de un BMP a otro craven API de Windows 1 07-07-2003 10:45:34


La franja horaria es GMT +2. Ahora son las 07:29:39.


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