Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cómo lograr que un mismo procedimiento funcione para varios arreglos? (https://www.clubdelphi.com/foros/showthread.php?t=92503)

Aszael 15-11-2017 05:00:51

Cómo lograr que un mismo procedimiento funcione para varios arreglos?
 
Saludos, señores. Estoy trabajando con varios arreglos y preciso que un mismo procedimiento funcione para todos ellos. Cada arreglo guarda distintos números, números que alguien introduzca a través de un Edit. Es decir:
Elem1[dim1]:=2,4,1
Elem2[dim2]:=9,8
Elem3[dim3]:=8,5,3

Tengo este procedimiento, que ordena el arreglo de menor a mayor:
Código Delphi [-]
procedure Vector.ordenarvector;
var c,m:integer;
begin
  for t:=1 to dim1 do begin
    c:=1;
    repeat
      if (elem1[t]>elem1[t+c]) and (elem1[t+c]>0)then begin
        m:=elem1[t];
        for i:=t+c to t+c do
          elem1[t]:=elem1[t+c];
        elem1[t+c]:=m
      end else
      c:=c+1;
    until c=dim1;
  end;
end;
Ahora como bien dicta la pregunta, ¿cómo puedo lograr que funcione para mis tres arreglos? Ya que este procedimiento solo me funciona para "Elem1".

Intente pasar Elem2[dim2]=9,8 a Elem1[dim1] y desde ahí ordenarlo, y luego pasarlo de Elem1 a Elem2 nuevamente, -funciona- pero interfiere con otros procedimientos que tengo.

PD: No puedo usar Sort's. Muchas gracias y saludos. ^\||/

Neftali [Germán.Estévez] 15-11-2017 09:24:40

Para eso se utilizan los parámetros en procedimientos y funciones.
Revisa estos links o si buscas en internet encontrarás muchos más.

http://docwiki.embarcadero.com/RADSt...ctions_(Delphi)
http://docwiki.embarcadero.com/RADSt...meters_(Delphi)

Se trata al final de modificar ese procemiento para que admita un parámetro de tipo array. De esa forma funcionará con todos los arrays (siempre que sean similares).

Haz pruebas y si no te sale comenta lo que has hecho aquí y iremos ayudándote.

Aszael 16-11-2017 01:33:33

Cita:

Empezado por Neftali (Mensaje 522520)
Se trata al final de modificar ese procemiento para que admita un parámetro de tipo array. De esa forma funcionará con todos los arrays (siempre que sean similares).

Haz pruebas y si no te sale comenta lo que has hecho aquí y iremos ayudándote.

¿Te refieres a hacer esto? No pude ir ni para atrás ni para adelante, mi arreglo se desbordaba, falta de conocimiento debo decir:
Código Delphi [-]
procedure Vector.ordenarvector(elem:array of integer; dim: integer);
Hum, me falto decir que quería el mismo procedimiento para cada arreglo, y cada arreglo tiene su propio botón. No buscaba que con un solo botón se me ordenaran todos mis arreglos sino, solo los que yo quisiera. Encontré otra manera, bueno, al menos funciona -llorando por dentro-:

Cree dos procedimientos más y luego desde el programa principal hago la llamada:
Código Delphi [-]
//Unidad donde va la clase...
procedure Vector.copia(num:integer);
begin
  case num of
    1: for t:=1 to getDim(1) do
       x[t]:=getElem(t,1);
    2: for t:=1 to getDim(2) do
       x[t]:=getElem(t,2);
  end;
end;

procedure Vector.copiafinal(num: integer);
begin
  case num of
    1: for t:=1 to getDim(1) do
       elem1[t]:=x[t];
    2: for t:=1 to getDim(2) do
       elem2[t]:=x[t];
  end;
end; 

procedure Vector.ordenarvector(dim: integer);
var c,m:integer;
begin
  for t:=1 to dim do begin
    c:=1;
    repeat
      if (x[t]>x[t+c]) and (x[t+c]>0)then begin
        m:=x[t];
        for i:=t+c to t+c do
          x[t]:=x[t+c];
        x[t+c]:=m
      end else
      c:=c+1;
    until c=dim;
  end;
end;
//Fin unidad.               

//Programa principal...
procedure TP2.B1OrdenarClick(Sender: TObject);
begin
  v.copia(1);
  v.ordenarvector(v.getDim(1));
  v.copiafinal(1);
  ActualizarSG1;
end;  

procedure TP2.B2OrdenarClick(Sender: TObject);
begin
  v.copia(2);
  v.ordenarvector(v.getDim(2));
  v.copiafinal(2);
  ActualizarSG2;
end; 
//Fin programa principal.
Lo hago de esta manera para darle independencia a cada arreglo y que cuando haga una operación, el arreglo 2 o 3 no se una al 1 y viceversa.

Cómo habrás notado, estoy en pañales, trato de aprender, pero "¿arreglos en parámetros?" No, aún no he visto a fondo este tema. Te agradezco por tu tiempo y si tienes algún consejo para hacer más pequeño todo este código, o para no darle tantas vueltas al asunto, estoy más que dispuesto a leerte, gracias.

mamcx 16-11-2017 03:04:31

No se entiende lo que quieres y el codigo no ayuda.

Como debe quedar los datos ordenados?

Aszael 16-11-2017 04:07:59

Cita:

Empezado por mamcx (Mensaje 522555)
No se entiende lo que quieres y el codigo no ayuda.

Como debe quedar los datos ordenados?

Ya solucioné, gracias.

Neftali [Germán.Estévez] 16-11-2017 12:54:39

Cita:

Empezado por Aszael (Mensaje 522553)
¿Te refieres a hacer esto? No pude ir ni para atrás ni para adelante, mi arreglo se desbordaba, falta de conocimiento debo decir:
Código Delphi [-]

procedure Vector.ordenarvector(elem:array of integer; dim: integer);

Si, a eso me refería.

hal1967 18-11-2017 23:20:04

¿Por qué pasan un parámetro de nombre dim?

¿No debería bastar con usar low y high?

algo como

Código:

for i:= low(v) to high(v) do
              ...


Neftali [Germán.Estévez] 20-11-2017 09:10:53

Cita:

Empezado por hal1967 (Mensaje 522630)
¿Por qué pasan un parámetro de nombre dim?
¿No debería bastar con usar low y high?

Es correcto.
Y también se puede usar la función Length para saber la longitud del array, pero en este caso (yo al menos) no quise distraerle con más cosas que no fueran estrictamente del problema que tenía este usuario.

Tal vez él lo ve más claro así. Una vez solucionado el problema, se le puede añadir ese comentario como "mejora/optimización".

Aszael 26-11-2017 01:40:13

No me permiten llamar a las funciones del programa, como ser Length, o esas mismas Low, High.

Simplemente no quería parecer descortés no contestando sus observaciones. Gracias por los consejos.


La franja horaria es GMT +2. Ahora son las 19:00:40.

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