Code Blocks, función: IF()

Code Blocks, función: IF()

Postby JMFS-D » Mon Jan 30, 2006 12:55 pm

Estimados colegas:

¿Es conveniente, pasar a Code Blocks, todas las líneas, que se puedan de un fuente?.

¿Y sustituir, todos los IF ELSE ENDIF, por IF()?

¿Poner, todo lo que sea factible, de los IF(), a IF( condición, EVAL( bCode1 ), EVAL( bCode2 ) )

Ya que los, Code Blocks, y la función IF(), son más rapidos. Me podrías decir, que ya me he contestado yo mismo, pero nunca esta de más segundas, terceras,... opiniones. Por las experiencias de cada uno.

Por ello, pido opinión, a todos los que quieran participar.

Saludos, y ¡¡¡GRACIAS!!! anticipadas.
JMFS-D
 
Posts: 40
Joined: Thu Jan 12, 2006 5:10 pm

No afecta

Postby leandro » Mon Jan 30, 2006 11:56 pm

JMFS-D, no se que procesos estes corriendo y son muy pesados, pero dejame decirte que según mi experiencia la verdad no afecta mucho en manera que definas tus if(). IF;ELSE;ENDIF.

Pero por calidad de codigo. Lo haria con los codebloks.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Postby manuramos » Wed Feb 01, 2006 5:19 pm

La verdad es que a nuestro nivel no se nota mucho, a no ser que crees alguna clase que necesite rapidez de refresco o algo así.

Pero sin duda lo más importante de los Codeblocks es que se encapsulan en una variable y se ejecutan del tirón sin necesidad de tener que buscarlos por la memoria a cada llamada a función. Son como las funciones INLINE pero transportables. Adermás la variable sirve de transporte y puedes pasorlos a una función o a un método de una clase con sus variables internas y todo. No se pueden concebir las clases de FW sin ellos. ¿Como sinó llamarías al Valid de un Get o a una accion al pulsar un botón. Tendrían que inventar otra cosa o aplicar los punteros de función.

En cuanto a los IF(). Idem de los mismo. Son INLINE y se pueden anidar y utilizar dentro de una variable, una llamada a función, etc. Ahorran mucho código. Por Ejemplo:

ColorearObjeto(if(oBJ=1,CRL_RED,if(oBJ=2,CLR_BLUE,CLR_GREEN)))

A ver como lo traduces a if / else / endif. Como mínimo 6 líneas con sus ciclos de reloj correspondiente.

O mejor: bColObj := { |oBj| if(oBJ=1,CRL_RED,if(oBJ=2,clr_blue,CLR_GREEN)), MsgBeep() }
ColorearCaja(bColObj,oCaja)
Por decir algo sencillo...
Nos Gusta Programar
manuramos
 
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

Os pongo un ejemplo de mi codigo.

Postby JMFS-D » Wed Feb 01, 2006 9:32 pm

IF( oParamtros:lPresupu , ;
( oDbfPresup:Load() , ;
nSiguiente := oDatos:Current()[ 1 ] , ;
oDatos:Current()[ 1 ] := nAnterior , ;
oDbfPresup:tipo := oPresupu:nTipo , ;
oDbfPresup:estado := oPresupu:nEstado , ;
oDbfPresup:codigo := oCliente:cCodigo , ;
oDbfPresup:numpresup := oPresupu:cNumero , ;
oDbfPresup:fechapres := oPresupu:dFecha , ;
oDbfPresup:descripcio := oDatos:Current()[ 2 ] , ;
oDbfPresup:cantidad := oDatos:Current()[ 3 ] , ;
oDbfPresup:precio := oDatos:Current()[ 4 ] , ;
oDbfPresup:Save() , ;
oDbfPresup:GoTo( nSiguiente ) ) , ;
( nSiguiente := oDatos:Current()[ 1 ] , ;
oDatos:Current()[ 1 ] := nAnterior , ;
oDbfFactC:tipo := oFactura:nTipo , ;
oDbfFactC:estado := oFactura:nEstado , ;
oDbfFactC:codigo := oCliente:cCodigo , ;
oDbfFactC:numfactura := oFactura:cNumero , ;
oDbfFactC:fechafactu := oFactura:dFecha , ;
oDbfFactC:descripcio := oDatos:Current()[ 2 ] , ;
oDbfFactC:cantidad := oDatos:Current()[ 3 ] , ;
oDbfFactC:precio := oDatos:Current()[ 4 ] , ;
oDbfFactC:Save() , ;
oDbfFactC:GoTo( nSiguiente ) ) )

Poner las lineas de codigo, para cuando se cumple la condición del IF, y para cuando no se cumple, en un EVAL, ¿sería lo más conveniente?.

Saludos, José Mª
JMFS-D
 
Posts: 40
Joined: Thu Jan 12, 2006 5:10 pm

Postby Antonio Linares » Thu Feb 02, 2006 12:00 am

Jose Mª,

Practicamente no habrá diferencia en la velocidad de ejecución y el código se volverá más complicado de mantener.

Piensa que tanto las líneas de código de un PRG como el contenido de un codeblock, el compilador lo convierte a pcode (una serie de bytes) que la maquina virtual procesa.

Sólo en procesos en los que se requiere la máxima velocidad, la solución es codificar ciertas partes en C para que la máquina virtual no intervenga y así ganar ciclos de reloj.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby manuramos » Thu Feb 02, 2006 5:08 pm

No hay que buscarle tres pies al gato, los manuales de programación dicen que siempre hay que buscar velocidad y ahorro de memoria, o elejir uno de los dos cuando no se no se pueden cumplir ambos.
De lo que se olvidan es de nuestra comodidad y de la claridad del código, y reza por no saltarte un paréntesis.
En el caso de tu trozo de codigo, lo mas convenientes es un IF / ELSE / ENDIF sin lugar a dudas. Otras veces serán más adecuados los DO CASE. Otras veces te convendrá encapsular el código vía IF() y CodeBloks. Busca siempre lo que más cómodo te resulte y no te calientes la cabeza.
Un saludo....
Nos Gusta Programar
manuramos
 
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)


Return to FiveWin para CA-Clipper

Who is online

Users browsing this forum: No registered users and 14 guests