Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-11-2003
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 01-11-2003
obiwuan obiwuan is offline
Miembro
 
Registrado: may 2003
Posts: 488
Poder: 22
obiwuan Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 01-11-2003
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
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.

Última edición por darkone2k3 fecha: 01-11-2003 a las 16:03:35.
Responder Con Cita
  #4  
Antiguo 01-11-2003
obiwuan obiwuan is offline
Miembro
 
Registrado: may 2003
Posts: 488
Poder: 22
obiwuan Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 01-11-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 22
Julià T. Va por buen camino
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"
Responder Con Cita
  #6  
Antiguo 01-11-2003
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 01-11-2003
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
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?.

Última edición por darkone2k3 fecha: 01-11-2003 a las 17:19:10.
Responder Con Cita
  #8  
Antiguo 01-11-2003
obiwuan obiwuan is offline
Miembro
 
Registrado: may 2003
Posts: 488
Poder: 22
obiwuan Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 01-11-2003
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
Unhappy

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.
Responder Con Cita
  #10  
Antiguo 01-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #11  
Antiguo 02-11-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 22
Julià T. Va por buen camino
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;
Responder Con Cita
  #12  
Antiguo 02-11-2003
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
Thumbs up

Muchísimas gracias a todos los que han respondido, ya que gracias a ustedes he podido solucionar el problema.
Salu2 desde Chile.
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


La franja horaria es GMT +2. Ahora son las 16:53:52.


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