Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Redimensionar un arreglo (https://www.clubdelphi.com/foros/showthread.php?t=4905)

darkone2k3 01-11-2003 09:11:34

Redimensionar un arreglo
 
Saludos amigos foristas.
Alguien sabe como puedo redimensionar un arreglo en tiempo de ejecución.

Código:

Function Pide_Poli( Lista: Array Of Double ): Double;
  Var
      Truco, Grado, Seguro, Seguros: String;
      ClickedOK1, ClickedOK2, ClickedOK3, ClickedOK4: Boolean;
      J: Array Of Double;
      n, i: Integer;
  Begin
      Seguros := '';
      ClickedOK1 := InputQuery( '', 'De que grado deseas tu polinomio (De grado 3 en delante)?', Grado );
      While LowerCase( Seguros ) <> 's' Do
      Begin
        ClickedOk2 := InputQuery( '', 'Estás seguro que deseas un polinomio de grado: ' + Grado + ' (s/n)?', Seguros );
        If ClickedOK2 Then
            If LowerCase( Seguros ) <> 's' Then
              ClickedOK3 := InputQuery( '', 'De que grado deseas tu polinomio (De grado 3 en delante)?', Grado );
      End;
      n := StrToint( Grado ) + 1;

//      SetLength( lista, n );
//      ReAllocMem( Lista, n * sizeof( integer ) );

      For i := 0 To Length( j ) - 1 Do
      Begin
        ClickedOK4 := InputQuery( '', 'Introduce el termino a ' + IntToStr( i ) + ' x^' + IntToStr( i ), Truco );
        j [i ] := StrToFloat( Truco );
        showmessage( inttostr( i ) + ' ' + floattostr( j [i ] ) );
      End;
      For i := 0 To length( j ) - 1 Do
        Lista [i ] := j [i ];
      showmessage( 'largo de lista: ' + inttostr( length( lista ) ) );
  End;

Lo que pasa es que necesito redimensionar el arreglo llamado "Lista", y como pueden ver en el código resaltado de azul, he tratado de hacerlo de esas 2 formas, pero me arroja el siguiente error: "Incompatible types"
Si alguien conoce otra forma de redimensionar arreglos en tiempo de ejecución, me avisa por favor.

PD 1 : A esta función, la "llamo" desde un Boton, de la siguiente manera:
Código:

        Var
  Poli: Array Of Double;
  Tol, Val: Double;
  x: String;
  ClickedOK: Boolean;
Begin
  x := 's';
  While LowerCase( x ) = 's' Do
  Begin
      Pide_Poli( Poli );
      checa_valor( Poli, val, tol ); //Se pide la aproximación inicial y se revisa que cumpla la condición.
      despliega_raiz( Poli, tol, val ); //Por ultimo despliega el polinomio y la raiz.
      ClickedOK := InputQuery( '', 'Deseas resolver otro polinomio?( s / n )', x );
  End;

Donde "Poli" es un arreglo del mismo tipo que el de la función "Pide_Poli"

PD 2: A todo esto, está funcion está originalmente en c++ y la estoy "transformando" a Delphi 6(espero que la haya "transformado" bien), aquí les pongo el código en c++:
Código:

void pide_poli(vector<double> &lista)
{        int  n;
        char x;
        cout<<"Este es un programa que resuelve polinomios "<<endl;
        cout<<"De que grado deseas tu polinomio (De grado 3 en delante) ?"<<endl;
        //Aqui se revisa que ese sea el dato correcto elegido por el usuario.
        do
        {
        cin>>n;
        cout<<"Estas seguro que deseas un polinomio de grado "<<n<<"?"<<endl;
        cin>>x;
                        if(tolower(x) != 's')
                        cout<<"¿Cual es el grado que deseas para tu polinomio?"<<endl;
               
        }while(tolower(x) !='s');
        lista.resize(n+1);//Se crea el vector del tamaño deseado por el usuario.
                for(int i=0; i<lista.size();i++)
                {
                        cout<<"Introduce el termino a"<<i<<" x^"<<i<<endl;
                        cin>>lista[i];
                }
}

Y así se llama a la función en c++:
Código:

int main()
{       
        vector<double> poli;
        double    tol, val;
        char x;
        do
        {
        system("cls");
        pide_poli(poli);//Se crea el nuevo polinomio deseado.
        checa_valor(poli,val,tol);//Se pide la aproximación inicial y se revisa que cumpla la condición.
        system("cls");                        //        Al igual que la tolerancia.
        despliega_raiz(poli,tol,val);//Por ultimo despliega el polinomio y la raiz.
        cout<<"Deseas resolver otro polinomio?"<<endl;
        cin>>x;
        }while(tolower(x) =='s');
        return 0;
}

Espero haber sido lo más claro posible, me despido. Salu2 desde Chile.

obiwuan 01-11-2003 13:44:03

En Delphi existe una función que se llama Val, por lo que si usas una variable con dicho nombre, posiblemente estés provocando un error involuntario. Prueba primero a cambiar el nombre de val por otro y ya comentas si tu primer error ha desaparecido y ahora te aparece otro diferente.

darkone2k3 01-11-2003 15:56:54

Gracias por contestar, pero ya cambie lo que me dices, pero ese no es el problema(el problema es que debo redimensionar "lista" y no puedo), el problema me lo da aqui:
Código:

For i := 0 To length( j ) - 1 Do
        Lista [i ] := j [i ];

Este ciclo for lo hice porque como debia redimensionar Lista y no he podido, he usado un array temporal, en este caso j. Por lo que hice este ciclo for para traspasar los valores almacenado en j a Lista.

Salu2.

obiwuan 01-11-2003 16:18:25

Tienes una línea con el SetLength la cual has comentado en tu código.

Mira la ayuda de este procedimiento a ver si es lo que estás buscando.

Consejo:
Nada más empezar el procedimiento, haz un

SetLength(MyFlexibleArray, 1); {por ejemplo}

para luego poder asignarle el tamaño que desees. Creo que ese "pequeño truco" el que permite redimensionar un array en tiempo de ejecución sin problemas.

Julià T. 01-11-2003 16:21:19

si quieres redimensionar un array la función es setlength

ojo si quieres redimensionar la variable lista que pasas a la función, ya que la pasas como "constante" y no como "variable"

darkone2k3 01-11-2003 16:35:04

Salud2, la linea con SetLength la tengo como comentario porque es ahí donde me da el error de "Incompatible types" y realmente no se porque me da ese error.

darkone2k3 01-11-2003 16:54:26

Sludos Julià T.

No me queda claro lo que dices:
Cita:

ojo si quieres redimensionar la variable lista que pasas a la función, ya que la pasas como "constante" y no como "variable"
Me podrías explicar con más detalle por favor.
Gracias.


PD: Una consulta, existe alguna funcion para copiar el contenido de un array a otro?.

obiwuan 01-11-2003 19:30:58

Ya he encontrado uno de tus fallos:

Pones:
Código:

Function Pide_Poli( Lista: Array Of Double ): Double;
cuando debes poner:

Código:

Function Pide_Poli(var Lista: Array Of Double ): Double;
La variable lista la modificas dentro de tu función, por lo que debes pasarla como referencia (2º caso), mientras que lo que tú pones (1er. caso) es paso de variables como valor, por eso no te deja modificar su longitud.

Después de esa modificación, faltará saber si te da algún otro error.

darkone2k3 01-11-2003 21:01:58

Gracias por responder Obiwuan, hice el cambio que me comentaste y aún así me sigue dando el error de Incompatible types en
Código:

SetLength( Lista, n )
Y realmente no se que puedo hacer o a que se debe ese error.:confused: :confused:

roman 01-11-2003 21:24:35

No he leído todo el hilo con detalle pero el error que te indica Obiwan no se debe al especificador var.

Lo que pasa es que no es lo mismo arreglos dinámicos que parámetros abiertos.

Un arreglo dinámico se declara:

Código:

var
  Lista: array of Double

Y el parámetro abierto se pasa a un procedimiento o función:

Código:

Function Pide_Poli( Lista: Array Of Double ): Double;
Se ven iguales pero no lo son. Busca en la ayuda de Delphi los tópicos "Dynamic arrays" y "Open array parameters" para que notes mejor la diferencia.

Puedes pasar un arreglo dinámico como parámetro a un procedimiento o función pero entonces no puedes pasarlo como lo harías con un parámetro abierto, es decir, como una lista entre corchetes, sino que primero llenas el arreglo y luego lo pasas a la función.

// Saludos

Julià T. 02-11-2003 00:05:08

en resumen para aclarar
Código:


//definición del tipo TLista
Type
 TLista=Array Of Double;
end;

procedure zzzzzz;
Var
 Lista:TLista;
begin
 SetLength(Lista,x); //deberemos indicar el tamaño para poder utilizarlo
 ...
 Pide_Poli(Lista);
end;

//en la función indicaremos que el array puede cambiar (paso por referéncia o variable)
function Pide_Poli(Var  Lista:TLista): Double;
Begin
 SetLength(Lista,y);
end;


darkone2k3 02-11-2003 01:14:40

Muchísimas gracias :D :D :D :D a todos los que han respondido, ya que gracias a ustedes he podido solucionar el problema.
Salu2 desde Chile.


La franja horaria es GMT +2. Ahora son las 12:37:02.

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