FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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; 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; 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]; } } 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; } |
#2
|
|||
|
|||
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.
|
#3
|
|||
|
|||
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 ]; Salu2. Última edición por darkone2k3 fecha: 01-11-2003 a las 16:03:35. |
#4
|
|||
|
|||
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. |
#5
|
|||
|
|||
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" |
#6
|
|||
|
|||
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.
|
#7
|
|||
|
|||
Sludos Julià T.
No me queda claro lo que dices: Cita:
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. |
#8
|
|||
|
|||
Ya he encontrado uno de tus fallos:
Pones: Código:
Function Pide_Poli( Lista: Array Of Double ): Double; Código:
Function Pide_Poli(var Lista: Array Of Double ): Double; Después de esa modificación, faltará saber si te da algún otro error. |
#9
|
|||
|
|||
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 ) |
#10
|
||||
|
||||
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 Código:
Function Pide_Poli( Lista: Array Of Double ): Double; 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 |
#11
|
|||
|
|||
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; |
#12
|
|||
|
|||
Muchísimas gracias a todos los que han respondido, ya que gracias a ustedes he podido solucionar el problema.
Salu2 desde Chile. |
|
|
|