

Esperaré pacientemente


Escrito 11 diciembre 2008 - 08:08
Escrito 11 diciembre 2008 - 08:14
Hola
Que bueno, eso si me da mucha mas claridad en el asunto.
Hombre, Maestro, como me ayudas.
Gracias amigo.
Saludos
Jejeje, qué obsesión de preguntar cosas en las que si puedo ayudar justo cuando no estoy
![]()
Esperaré pacientemente![]()
Escrito 11 diciembre 2008 - 08:18
function Nombre(dato1, datoN: tipo; var datoM: tipo_M): tipo; ...
Escrito 11 diciembre 2008 - 08:22
.....
delphi
function Nombre(dato1, datoN: tipo; var datoM: tipo_M): tipo; ...
Ese parámetro datoM es tanto como de entrada como de salida. Se trata de un parámetro especial: nos permite que una función nos regrese otro valor más. Los procedimientos no regresan ningún valor, pero gracias a éste tipo de parámetro es posible devolver un valor.
Este parámetro por lo general es para "notificar" que algo ha cambiado dentro de la sentencia. Se lo suele emplear para variables de control.
Los parámetros se clasifican en dos: Parámetros por referencia, y parámetros por valor. Los de valor son los comunes de siempre, los que no tienen el "var". Se llaman "por valor" porque en realidad lo que hace el compilador es "copiar" el valor de la variable o constante del parámetro y trabajar dentro de la función con dicha copia. Una vez que la función termina, el valor de los parámetros queda como están: no cambian. Supongamos que datoM sea "por valor", y que se pasa el valor 5... al finalizar la función seguiremos teniendo ese 5.
En cambio, los parámetros por referencia son aquellos en donde ves el "var". Lo que hace el compilador es trabajar con la variable exacta, por tanto se hace referencia a dicha zona de memoria. Si dentro de la función se cambia el valor de la variable, al finalizar no recuperaremos el valor original. Ahora en cambio, digamos que datoM es por referencia, al finalizar es posible que no sea 5, sino 8000 o vaya a saber uno.
Por ello he dicho que por lo general estos tipos de parámetros se emplean para "comunicar" que algo ha cambiado dentro de la función, son variables de "control". No se los suele usar como un dato de entrada. Puedes ver un ejemplo de uso de esta función en el evento OnCloseQuery, y en OnClose. Si te fijas, puedes cambiar el valor de CanClose y Action... dependiendo de como sea el valor final que obtengan, se hará una u otra cosa.
Saludos,
Escrito 11 diciembre 2008 - 08:31
Los procedimientos no regresan ningún valor,
procedure suma(dato1,dato2:integer; var dato3:integer); begin dato3 := dato1+dato2; end; procedure TForm1.Button1Click(Sender: TObject); var uno,dos,tres: integer; begin uno := 3; dos := 5; suma(uno,dos,tres); showmessage(inttostr(tres)); end;
Escrito 11 diciembre 2008 - 08:43
procedure suma(dato1,dato2:integer; var dato3:integer); begin dato3 := dato1+dato2; end; function resta(dato1,dato2:integer):integer; begin result := dato2-dato1; end; procedure TForm1.Button1Click(Sender: TObject); var uno,dos,tres: integer; begin uno := 3; dos := 5; suma(uno,dos,tres); //procedimiento showmessage(inttostr(tres)); tres := resta(uno,dos); //función showmessage(inttostr(tres)); end;
Escrito 11 diciembre 2008 - 09:07
function PuedeLanzarCohete(NumeroCohete, Peso, Tamanno, CapacidadCombustible: integer): boolean; var CoheteValido: boolean; begin CoheteValido := ValidarCohete(NumeroCohete); // Aquí se llama a una función! if CoheteValido then begin result := (CapacidadCombustible <= (0.5 * Peso)) AND ((Peso/Tamanno) <= 1.5) // Para poder lanzar el cohete, la capacidad del combustible debe ser cuanto mucho // la mitad del peso y la proporción entre el Peso y el Tamaño no debe ser mayor a 1.5 end result := False; // No se puede lanzar el cohete end;
var Puede: boolean; UnPeso, UnTamanno, UnaCapacidad: integer; ... UnPeso := 5000; unTamanno := 3400; UnaCapacidad := 2600; ... Puede := PuedeLanzarCohete(1,UnPeso,UnTamanno,UnaCapacidad);
function PuedeLanzarCohete(NumeroCohete, Peso, Tamanno, CapacidadCombustible: integer; var EstadoError: integer): boolean; var CoheteValido: boolean; begin CoheteValido := ValidarCohete(NumeroCohete); if CoheteValido then begin EstadoError := 0; // No hay error result := True; if (CapacidadCombustible > (0.5 * Peso) then begin EstadoError := EstadoError + 1; result := False; end; if ((Peso/Tamanno) > 1.5) then begin EstadoError := EstadoError + 2; result := False; end; end else result := False; end;
var Error: integer; ... Error := 5; Puede := PuedeLanzarCohete(1,UnPeso, UnTamanno, UnaCapacidad, Error);
Case Error of: 1: QuitarPesoCombustible(...); 2: QuitarPeso(...); 3: begin ResidennarCohete(...) end; else Lanzar(...); end; ...
Escrito 11 diciembre 2008 - 11:25
Escrito 12 diciembre 2008 - 06:37
Amiguito Delphius, me queda PERFECTAMENTE claro
Te agradezco muchisimo tu tiempo para explicarlo, sinceramente disfruto aprendiendo mucho de tus hilos![]()
Escrito 12 diciembre 2008 - 07:27
Escrito 12 diciembre 2008 - 08:49
Muchas gracias Eduardo,ok, esa si me la se...
Los parametros por referencia son los var, y se llaman asi debido a que la funcion lo que recibe es la referencia de memoria (puntero) donde reside la variable, por eso se puede modificar. Los parametros por valor reciben es el contenido de la direccion de memoria y lo carga en otro bloque.
Ahora quien se lanza con una de recursividad?? jejeje
Escrito 12 diciembre 2008 - 09:02
Escrito 12 diciembre 2008 - 10:00
function factorial(x: Integer): Integer; begin if x = 1 then Result:= 1 else Result:= x * factorial(x-1); end;
Escrito 12 diciembre 2008 - 10:07
Escrito 12 diciembre 2008 - 11:22
function Fibonachi(N: integer): integer; begin if N < 2 then result := N else result := Fibonachi(N - 1) + Fibonachi(N - 2); end;
Escrito 14 diciembre 2008 - 11:04
function MiFuncion(Param1,Param2:alguntipo):integer,double,tdatetime; begin //Lo que tenga que hacer end;
Escrito 15 diciembre 2008 - 07:28
Escrito 15 diciembre 2008 - 07:54
O tambien se puede declarar un tipo record y usarlo como resultado de la funcion.Hasta donde llegan mis conocimientos eso no se puede, para poder retornar mas de un valor puedes utilizar los parametros por referencia
type TResultado = record Entero: Integer; Doble: double, Fecha: TDatetime; end; function MiFuncion(Param1,Param2:alguntipo): TResultado; begin //Lo que tenga que hacer end; // Y usarioamos la funcion asi: var Resultado: TResultado; begin Resultado:= MiFuncion(P1,P2); ShowMessage('El entero es: ' + IntToStr(Resultado.Entero)); ShowMessage('La fecha es: ' + DateToStr(Resultado.Fecha)); end;
Escrito 15 diciembre 2008 - 08:28
Escrito 15 diciembre 2008 - 09:37
function MiFuncion(Param1,Param2:integer): TResultado; begin Result.Entero := 102; Result.Doble := 12345; Result.Fecha := Now; end; procedure TForm1.Button1Click(Sender: TObject); var Resultado: TResultado; begin Resultado := MiFuncion(122,132); ShowMessage('El entero es: ' + IntToStr(Resultado.Entero)); ShowMessage('El doble es: ' + IntToStr(Resultado.Doble)); ShowMessage('La fecha es: ' + DateToStr(Resultado.Fecha)); end;