Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   comportamiento extraño de variables en debug (https://www.clubdelphi.com/foros/showthread.php?t=66076)

sergiovalp 31-01-2010 15:39:01

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;

Al González 01-02-2010 19:39:46

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. :)

Delphius 02-02-2010 05:01:39

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:rolleyes:) va decrementando hasta llegar a cero lo cual hace que se salte a la siguiente rutina fuera del ciclo.

Saludos,

rgstuamigo 02-02-2010 13:59:10

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...:)


La franja horaria es GMT +2. Ahora son las 09:22:19.

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