Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-01-2010
sergiovalp sergiovalp is offline
Registrado
 
Registrado: may 2007
Posts: 9
Poder: 0
sergiovalp Va por buen camino
comportamiento extraño de variables en debug

Me sucede algo raro, cuando tengo la variable "i" en el watch-list, a medida que voy ruteando el for va decreciendo a partir del valor 5 !!!

como es posible si el for dice claramente " for i:=0 to 4 "

a alguien le ha pasado algo parecido ?


Código Delphi [-]
 
type mensaje_letrero = record
  mensaje : array[1..5] of byte;
end;
 
var
  Form1: TForm1;
  Pool : array[1..30] of mensaje_letrero;
 
-------------
procedure TForm1.Button1Click(Sender: TObject);
var
    m : mensaje_letrero;
    i : integer;
begin
  for i:=0 to 4 do begin
    m.mensaje[i]:=$20;
  end;
end;
Responder Con Cita
  #2  
Antiguo 01-02-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Lo que ves en la lista de observaciones (watch list) es normal y se debe a la optimización que hace el compilador al generar el código máquina resultante.

En teoría, desactivando la optimización deberías ver el valor que esperas.

Otra forma de conocer el valor de la variable contador, sin desactivar la optimización, es "provocar" que dicha variable tenga mayor uso dentro del ciclo. Por ejemplo:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
    m : mensaje_letrero;
    i : integer;
begin
  for i:=0 to 4 do begin
    If I = I Then;  // Sentencia para poder ver a I con su valor "real"
    m.mensaje[i]:=$20;
  end;
end;

Cabe mencionar que, aún con la optimización que Delphi hace del código máquina, tu programa se ejecutará como lo esperas (internamente el programa usa otro "contador" para la asignación, en lugar de I).

Espero te resulte útil.

Hasta pronto.

Al González.
Responder Con Cita
  #3  
Antiguo 02-02-2010
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola,
Se que no voy a poder aportar mucho al tema. Lo mío es más una duda.

Aparte de que esto se ve afectado por el optimizador de código, y como dice Al que el valor de i "poco se usa" y significado tiene a efectos del algoritmo (según lo poco que tengo entendido) ¿es posible que en última juegue el modo en como "traduce" el compilador las líneas?.

Yo me imagino, puesto que yo le escapo al assembler y niveles tan bajos, que internamente el compilador traduce a esas líneas como una instrucción del tipo "brinco si es cero"... no estoy totalmente seguro de como sería en inglés... ¿jump to zero"? Y creería que se basa en que alguna variable (o mejor dicho, registro) va decrementando hasta llegar a cero lo cual hace que se salte a la siguiente rutina fuera del ciclo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 02-02-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow Solo una observacion

Aparte de lo comentado por Alberto y Delphius ,te hago una observacion:
Si has declarado tu Array asi:
Código Delphi [-]
type mensaje_letrero = record
  mensaje : array[1..5] of byte;//<---
end;
Eso siginifica que tus indices deben empezar en uno (1) y no en cero (0).
por lo que tu ciclo for deberia ser asi:
Código Delphi [-]
for i:=1 to 5 do begin
...
...
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Extraño comportamiento de ADO r1d2m3 Conexión con bases de datos 3 12-12-2009 20:08:32
comportamiento extraño ClientDataSet con DBX TrUnkS Conexión con bases de datos 6 31-03-2009 02:50:28
Comportamiento extraño en StringList MaMu Varios 7 19-06-2007 20:07:07
Comportamiento extraño de DisplayFormat Thales Conexión con bases de datos 0 02-12-2005 22:56:32
Comportamiento extraño con InnoBD brandolin MySQL 0 20-10-2003 15:34:09


La franja horaria es GMT +2. Ahora son las 10:15:53.


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