FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
¿Por que funciona al revés el "For to"?
Depurando un código me encontré con este comportamiento raro, primero veamos la imagen:
La variable i como vemos la inicializo "a fuerza" en 1 antes de entrar al bucle, como podemos ver, ya dentro del bucle teóricamente la variable tendría que ir valiendo desde 1 hasta 12, sin embargo como se ve en el watchlist empieza en 12!! Si seguimos dando F8 para irnos paso a paso la variable va disminuyendo hasta 1, es decir, como si hubiera puesto un "For downto". ¿Alguien tiene alguna idea de por qué pasa esto o a alguien más le ha pasado?
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#2
|
||||
|
||||
Hola César.
Esto se debe a la manera en que el compilador genera el código máquina. A fin de optimizar éste, si la variable contador no es referida dentro del For, su existencia es obviada y el código máquina solamente cumple el requisito de repetir el ciclo tantas veces como la cabecera del for lo indica.
En cambio, si la variable contador es referida dentro del ciclo, ésta contendrá el valor que se espera.
Puedes comprobar lo que hay detrás de segmentos de código como los anteriores, ejecutando paso a paso y mirando la ventana CPU del depurador. Notarás que para el primero usa una instrucción DEC mientras que para el segundo emplea una instrucción INC. Como dato adicional, algo de la ayuda de Delphi que lleva cierta relación con el tema: Cita:
Al González. |
#3
|
||||
|
||||
Cita:
Un poco extraño lo que sucede.
__________________
[Crandel] |
#4
|
||||
|
||||
Cita:
Es decir: a menos que existan instrucciones que afecten el flujo normal de las operaciones, o mientras no existe cierta dependencia de orden entre las propias instrucciones el for será descendente. Si te fijas en la imagen, da lo mismo que se empiece por CampoDif[1] como por campoDif[12]... siempre logrará hacerlo, en cualquier sentido. Distinto sería si por ejemplo el valor i-ésimo se viera afectado por alguna otra condición o dependencia incluso de algún otro CampoDif[j-ésimo]. Otra manera de "forzar" el for a seguir el camino correcto es desactivar la optimización. Saludos, |
#5
|
||||
|
||||
Cita:
Delphius: Lo que dices tiene lógica, pero creo que sería muy difícil para el compilador determinar si una referencia de la variable contador dentro del ciclo puede o no puede alterar el resultado de las cosas, cuando tal referencia forma parte de una expresión como "FieldByName...AsFloat". Asumiendo que estamos hablando del FieldByName de TDataSet, esas sentencias involucran llamadas a varios métodos virtuales que según su implementación podrían realizar cualquier cosa. Dichos métodos serían ejecutados en primer lugar con un campo o con otro, dependiendo de si la variable es incrementada o disminuida. En un código como el que ha mostrado AzidRain, el compilador no debería realizar la optimización mencionada. César, ¿qué versión del compilador es? Y, aunque la pregunta parezca tonta, ¿el código que muestras es real? ¿Podrías pegar más del mismo aquí? Saludos. |
#6
|
||||
|
||||
Gracias por las respuestas, luego les traigo otras más a modo de curiosidades.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
El programa se queda "colgado" mientras copia y luego "despierta" | NeWsP | OOP | 5 | 10-03-2010 22:05:40 |
No funciona "AGREGAR O QUITAR PROGRAMAS" | soler | Varios | 3 | 13-01-2008 23:28:12 |
"(nombre + ' ' + apellidos)" no funciona | molina669 | SQL | 9 | 07-12-2007 16:36:08 |
Necesito llamar a métodos de clases "hija" desde su clase "padre" | Flecha | OOP | 17 | 20-04-2007 00:03:53 |
Código "erroneo" pero que funciona | ixMike | Varios | 8 | 11-04-2007 18:57:08 |
|