Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Varios
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read

Coloboración Paypal con ClubDelphi

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 16/12/2011
AzidRain's Avatar
[AzidRain] AzidRain is offline
Miembro Premium
 
Join Date: Sep 2005
Location: Córdoba, Veracruz, México
Posts: 2,914
Poder: 24
AzidRain Va camino a la fama
¿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||
Reply With Quote
  #2  
Old 16/12/2011
Al González's Avatar
[Al González] Al González is offline
In .pas since 1991
 
Join Date: May 2003
Posts: 5,621
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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.
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
  I :Integer;
begin
  For I := 1 To 12 Do
    Caption := Caption + 'x';
end;

En cambio, si la variable contador es referida dentro del ciclo, ésta contendrá el valor que se espera.
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
Var
  I :Integer;
begin
  For I := 1 To 12 Do
    Caption := Caption + IntToStr (I);
end;

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:
Quote:
Originally Posted by apartado "For statements"
After the for statement terminates (provided this was not forced by a break or an exit procedure), the value of counter is undefined.
Saludos y que haya concluido aquella restricción de teclados.

Al González.
__________________
Tras casi seis años de trabajar para una empresa alemana como desarrollador Delphi, se vieron forzados a dejarme ir (temas presupuestales). Así que ahora estoy abierto a escuchar nuevas ofertas.
Reply With Quote
  #3  
Old 16/12/2011
Crandel's Avatar
[Crandel] Crandel is offline
Miembro Premium
 
Join Date: May 2003
Location: Parana, Argentina
Posts: 1,475
Poder: 25
Crandel Va por buen camino
Quote:
Originally Posted by Al González View Post
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.
ok, eso es asi. Pero en su caso si utiliza la variable i dentro de su ciclo, salvo que lo halla modificado en tiempo de ejecución.

Un poco extraño lo que sucede.
__________________
[Crandel]
Reply With Quote
  #4  
Old 16/12/2011
Delphius's Avatar
[Delphius] Delphius is offline
Miembro Premium
 
Join Date: Jul 2004
Location: Salta, Argentina
Posts: 5,582
Poder: 28
Delphius Va camino a la fama
Quote:
Originally Posted by Crandel View Post
ok, eso es asi. Pero en su caso si utiliza la variable i dentro de su ciclo, salvo que lo halla modificado en tiempo de ejecución.

Un poco extraño lo que sucede.
Tengo entendido que mientras el compilador determine que no exista alguna condición de "orden" o que afecte o condicione la relación entre las sentencias que forman a bloque por más que se referencie la variable dentro dentro del ciclo seguirá implementando, internamente por optimización, un ciclo descendente.

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,
__________________
Delphius
[Guia de estilo][Buscar]
Reply With Quote
  #5  
Old 16/12/2011
Al González's Avatar
[Al González] Al González is offline
In .pas since 1991
 
Join Date: May 2003
Posts: 5,621
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Quote:
Originally Posted by Crandel View Post
ok, eso es asi. Pero en su caso si utiliza la variable i dentro de su ciclo, salvo que lo haya modificado en tiempo de ejecución.

Un poco extraño lo que sucede.
Gracias por la observación, Crandel. Es como si esa I no fuera esa I, algo está faltando...

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.
__________________
Tras casi seis años de trabajar para una empresa alemana como desarrollador Delphi, se vieron forzados a dejarme ir (temas presupuestales). Así que ahora estoy abierto a escuchar nuevas ofertas.
Reply With Quote
  #6  
Old 16/12/2011
AzidRain's Avatar
[AzidRain] AzidRain is offline
Miembro Premium
 
Join Date: Sep 2005
Location: Córdoba, Veracruz, México
Posts: 2,914
Poder: 24
AzidRain Va camino a la fama
Gracias por las respuestas, luego les traigo otras más a modo de curiosidades.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
El programa se queda "colgado" mientras copia y luego "despierta" NeWsP OOP 5 10/03/2010 22:05
No funciona "AGREGAR O QUITAR PROGRAMAS" soler Varios 3 13/01/2008 23:28
"(nombre + ' ' + apellidos)" no funciona molina669 SQL 9 07/12/2007 16:36
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20/04/2007 00:03
Código "erroneo" pero que funciona ixMike Varios 8 11/04/2007 18:57


All times are GMT +2. The time now is 01:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi