Club Delphi  
    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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-09-2008
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question Pasar array como parámetro

Buenas, tengo la siguiente definición:

Código Delphi [-]
interface

type
 TDatos = record
   temperatura:double;
   humedad:double;
 end;

procedure proceso(A:array of TDatos);

implementation

//por otro lado...

procedure proceso(A:array of TDatos);
begin
//...
end;

Ahora, hasta aquí todo bien pero resulta que quiero llamar al procedimiento de la siguiente forma y no me deja:

Código Delphi [-]
proceso([(20,78),(18,95),(23,93)]);

Se que de la manera tradicional puede hacerse pero necesitaría que el pasaje fuera de la manera que indico pues evitaría que yo inicializara el array dinámico, que armara uno por uno los registros y todo eso.
Creo que estoy haciendo algo mal por eso no me deja hacer el pasaje de esa manera. Pido que alguien me corrija o brinde alguna sugerencia.

Saludos.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #2  
Antiguo 17-09-2008
Avatar de Ana María
Ana María Ana María is offline
Miembro
 
Registrado: ago 2008
Posts: 40
Poder: 0
Ana María Va por buen camino
Ensaya con esto
Código Delphi [-]
interface

type
 TDatos = record
   temperatura:double;
   humedad:double;
 end;

type Miarray = array of TDatos;

procedure proceso(A:MiArray);

implementation

//por otro lado...

procedure proceso(A: MiArray);
begin
//...
end;
Responder Con Cita
  #3  
Antiguo 17-09-2008
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question Array

Cita:
Empezado por Ana María Ver Mensaje
Ensaya con esto
Código Delphi [-]
interface

type
 TDatos = record
   temperatura:double;
   humedad:double;
 end;

type Miarray = array of TDatos;

procedure proceso(A:MiArray);

implementation

//por otro lado...

procedure proceso(A: MiArray);
begin
//...
end;
He probado con esto pero no funciona, me sigue diciendo que no es una forma adecuada de pasar al array como parámetro.

Para citar un ejemplo aún mas claro, si hago lo siguiente no hay problemas:

Código Delphi [-]

procedure proceso(a:array of integer);
begin
//...
end;


//Ahora hago una llamada

procedure TForm1.buttonClick(sender);
begin
//Esto lo acepta perfectamente, quiero hacer lo mismo pero mandando
//dos valores en la componente en lugar de uno  
  proceso([5,4,3,10]);
end;

Gracias.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.

Última edición por santiago14 fecha: 17-09-2008 a las 03:13:31. Razón: Errores de ortografía
Responder Con Cita
  #4  
Antiguo 17-09-2008
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Smile array

Para ser mas gráfico, estoy ante un problema que se llama "Parámetros de vector abierto (Open Array)"

Espero que alguien tenga una idea de como arreglar la cosa.

Saludos.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #5  
Antiguo 17-09-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola santiago14,
La verdad es que no te sabría decir si es posible hacer lo que buscas.
Una posible alternativa es que el procedimiento reciba dos vectores dinámicos.
Se que no es demasiado elegante, pero es una opción.

La otra alternativa que se me ocurre es un tanto mas complicada y tal vez sea demasiado para tus propósitos:
en vez de tener un record, implementar una clase TDatos que tenga los mismos campos.

Después tener un TObjectList que hará de vector. De este modo el procedimiento puede recibir a un objeto TObjectList y recorrer todos los objetos TDatos que estén dentro de éste.

El asunto es que este enfoque obliga a crear cada objeto TDato y llenarlo por separado, y relacionarlo con el TObjectList.

Por esto digo que tal vez esta opción sea más complicada que tener dos vectores.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 17-09-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Santiago14, creo que así directamente no se puede, la forma que se me ocurre es inicializar como una constante de esta forma:

Código Delphi [-]
 
VarDatos : Array[1..3] of TDatos = ((temperatura : 20; humedad : 78), (temperatura : 20; humedad : 78), (temperatura : 20; humedad : 78));
.......

la otra forma es darle tu los valores correspondientes a cada atributo de tu registro, para luego pasar ese array como parametro.

Código Delphi [-]
var
 varDatos : Array[1..3] of TDatos;
begin
 varDatos[1].temperatura := 20;
 varDatos[1].humedad := 78;
 varDatos[2].temperatura := 20;
 varDatos[2].humedad := 78;
 varDatos[3].temperatura := 20;
 varDatos[3].humedad := 78;

 proceso(varDatos);

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #7  
Antiguo 17-09-2008
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Lightbulb agradecimentos

Quiero agradecerles a todos que a esta hora de la noche se han tomado la molestia de buscar una solución a todo esto.
Hasta ahora no he tenido buenos resultados; espero encontrar la respuesta en el corto plazo.

Agradecido nuevamente les deseo buenas noches.

Por supuesto que voy a considerar todas las respuestas y veo si haciendo un merengue entre todas puedo llegar a algo. Por favor, si tienen nuevas sugerencias no duden en ponerlas.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #8  
Antiguo 17-09-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Yo tengo esto funcionando en Delphi 6 desde hace mucho tiempo:

Código Delphi [-]
procedure DefaultSort(AttrIndex:array of integer;
                              AttrSortType: array of TSQLSortType);
....

Y la llamada...

Self.DefaultSort([1],[sstASC]);
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 17-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, es normal q te salte error puesto q no le estas pasando un array de TDatos, sino un array de enteros. Puedes hacer varias cosas (para mantener el formato de pares de numeros...).

1.- hacer overload de 'proceso' : mientras que en una acepte array de tdatos, en la otra acepte array de [0..1] real (pares de numeros), llamando, luego de transformar los parametros, una a la otra, segun te convenga.
2.- Crear una clase cuyo constructor acepte pares de numeros, tendras que llamar a proceso entonces de la manera proceso([TDatos(0,1),TDatos(20,3)]) etc...
3.- Crear una funcion que, a partir de pares de numeros, te devuelva un array de tdatos. Algo parecido a Rect()... te quedaria como proceso(A_Datos([(0,1),(20,80),(30,20)]));
4.- Crear una clase TDatos con un array [0..1] of double, y dentro ella crear dos propiedades, temperatura y humedad, con su read/write, los cuales devolverian v[0] i v[1];
5.- Que proceso solo acepte array de array[0..1] of double, y que TDatos sea eso (type TDatos : array [0..1] of double), sabiendo tu ya q el primer valor es temperatura y el segundo humedad.

... y alguna q otra manera mas hay, seguro...

Para mi la mejor de todas seria la primera (la menos laboriosa y visualmente mas entendible, una vez escrita) si bien segun para q lo quieras (si tiene q desarrollarse bastante) quizas te salga mas a cuenta crear una clase correctamente (la opcion 4). Creo q en c del antiguo si se podia tratar una struct (record) asi tal como escribes, colocandose cada valor en su sitio. Me parece q la OOP anulo esto , pues son necesarios los typecast para casi todo. Igualmente, no estoy seguro, investigo un poco. Saludos y a ver si te sirve lo escrito.

Última edición por coso fecha: 17-09-2008 a las 14:11:50.
Responder Con Cita
  #10  
Antiguo 17-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
 TPar = record
 temperatura : double;
 humedad : double;
end;

procedure Proceso( T: array of TPar);

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function Par(t, h : double) : TPar;
begin
        result.temperatura := t;
        result.humedad := h;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
        t : TPar;
begin
        t.temperatura := 50;
        t.humedad := 0;
        proceso([Par(20,78), Par(30,40),t]);
end;

procedure Proceso( T: array of TPar);
var
        i : integer;
begin
        for i := 0 to length(T) - 1 do
        begin
                SHowmessage(FormatFloat('0.00',T[i].temperatura) + ' ' + FormatFloat('0.00',T[i].humedad));
        end;
end;

otra...esta es analoga a como trabaja TPoint.

Última edición por coso fecha: 17-09-2008 a las 14:28:33.
Responder Con Cita
  #11  
Antiguo 17-09-2008
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Wink Muy bueno

Cita:
Empezado por coso Ver Mensaje
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
 TPar = record
 temperatura : double;
 humedad : double;
end;

procedure Proceso( T: array of TPar);

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function Par(t, h : double) : TPar;
begin
        result.temperatura := t;
        result.humedad := h;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
        t : TPar;
begin
        t.temperatura := 50;
        t.humedad := 0;
        proceso([Par(20,78), Par(30,40),t]);
end;

procedure Proceso( T: array of TPar);
var
        i : integer;
begin
        for i := 0 to length(T) - 1 do
        begin
                SHowmessage(FormatFloat('0.00',T[i].temperatura) + ' ' + FormatFloat('0.00',T[i].humedad));
        end;
end;

otra...esta es analoga a como trabaja TPoint.
Gracias Coso, la verdad que está bueno el proceso que mandaste.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
Respuesta


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
Como pasar un parametro? b3nshi Varios 3 18-08-2007 07:54:53
Pasar SQL como parametro veloki Impresión 7 16-04-2007 16:28:37
PLSQL - Pasar un array como parametro. movorack SQL 1 06-03-2007 21:07:59
pasar como parámetro un array bidimensional nsr048 Varios 2 08-11-2005 12:54:20
Pasar como parametro el where en una funcion cso2000 MS SQL Server 2 15-02-2005 03:49:47


La franja horaria es GMT +2. Ahora son las 23:05:00.


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