Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-12-2006
Avatar de bosterito
bosterito bosterito is offline
Miembro
 
Registrado: nov 2006
Ubicación: Tucumán, Argentina
Posts: 39
Poder: 0
bosterito Va por buen camino
Unhappy Cosa de locos

Hola amigos del foro.
Tengo un problema que me está volviendo loco . El problema es que tengo un valor que lo veo en el wath, pero la comparación dice que no es igual. Ahí les mando el código:


Código Delphi [-]
procedure Prueba22( );
Var
i, j, va : Integer;
mm1 : array [1..2, 1..2] of integer;
begin
mm1[1,1]:= 10;mm1[1,2]:= 20;
mm1[2,1]:= 30;mm1[2,2]:= 90;
va := 0;
j := 1;
while ( j <= 2 ) do
begin
i := 1;
while ( i <= 2 ) do
begin
if ( mm1[j,i] = 90 ) then
begin
va := -1000;
va := -1000;
va := -1000;
end;
inc(i);
end;
inc (j);
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Prueba22( );
end;


Salu2

Última edición por dec fecha: 20-12-2006 a las 07:51:10.
Responder Con Cita
  #2  
Antiguo 20-12-2006
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Adivina, adivinanza...
Responder Con Cita
  #3  
Antiguo 20-12-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Y esto???

Cita:
Empezado por bosterito
Código Delphi [-]
if ( mm1[j,i] = 90 ) then
begin
  va := -1000;
  va := -1000;
  va := -1000;
end;

En este caso me gustaria poder poner el avatar de jachguate. No entiendo nada...

Saludos
Responder Con Cita
  #4  
Antiguo 20-12-2006
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Poder: 20
rcarrillom Va por buen camino
Sé más específico, con que variables, en que línea de código...
Recuerda las buenas costumbres al escribir código, como la indentación.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita
  #5  
Antiguo 20-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Parece que nos encontramos ante otro misterioso caso de optimización de código

bosterito, lo que ocurre es lo siguiente como no utilizas el valor de "va" para nada, el compilador, que es muy listo, simplemente omite todo ese código innecesario. Por ejemplo, prueba a colocar esto en tu código:

Código Delphi [-]
if ( mm1[j,i] = 90 ) then
begin
va := -1000;
va := -1000;
va := -1000;
ShowMessage(IntToStr(va)); // <- Linea nueva
end;

Ahora ya utilizamos la variable va para algo, así que el compilador ya no puede omitir ese bloque de código.
Responder Con Cita
  #6  
Antiguo 20-12-2006
Avatar de bosterito
bosterito bosterito is offline
Miembro
 
Registrado: nov 2006
Ubicación: Tucumán, Argentina
Posts: 39
Poder: 0
bosterito Va por buen camino
Hola a todos.
El código que puse es un ejemplo. El problema que tengo es la parte del if, porque la matriz tiene algunos elementos con el valor 1.5707963268, pero cuando llega a la parte del if, nunca entra, siendo que debería hacerlo.
A continuación va el código:

Código:
Procedure Dibujar( Matriz : Tmatriz1 );
var
 Bloque, Ancho, Alto, i, j : Integer;
 Pendiente, X0, Y0 : Real;
begin
  Bloque := 16;
   Alto := 7;
  j := 1;
  while ( Alto <= (Form1.Image1.Picture.Bitmap.Height - ( (Bloque div 2)+1 ) ) ) do
   begin
    Ancho := 7;
    i := 1;
    while ( Ancho <= (Form1.Image1.Picture.Bitmap.Width - (( Bloque div 2 )+1) ) ) do
     begin
      if ( Matriz[j,i] = 1.5707963268 )then
       begin
        Pendiente := tan(Matriz[j,i]);
        X0 := 1;
        Y0 := 1;
        Obtener_Puntos( X0, Y0, Pendiente );
        X0 := X0-1;
        Graficar ( Ancho, Alto, X0, Y0, clFuchsia, 3 );
       end;
       inc(i);
       Ancho := Ancho + 16;
     end;
    Alto := Alto + 16;
    inc(j);
   end;
   Form1.Label1.Caption := 'ya está';
end;
Saludos.
Responder Con Cita
  #7  
Antiguo 20-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
No entiendo, el codigo de "ejemplo" y el real no se parecen en nada. No entiendo porque no pusiste el codigo "real" la primera vez. No lo entiendo ...

Volviendo a tu pregunta, tu dices lo siguiente:
Cita:
pero cuando llega a la parte del if, nunca entra, siendo que debería hacerlo.
¿Por que estas tan seguro de que debería entrar? ¿Como esta declarada la matriz? ¿Donde se asignan los valores a esa matriz?
Responder Con Cita
  #8  
Antiguo 20-12-2006
Avatar de bosterito
bosterito bosterito is offline
Miembro
 
Registrado: nov 2006
Ubicación: Tucumán, Argentina
Posts: 39
Poder: 0
bosterito Va por buen camino
  • Son parecidos, este es más complejo, pero la idea es similar. Llamo a una matriz por parámetro, y al comparar cada uno de los valores, veo que no entra en el if, cuando si debería hacerlo.
  • La matriz esta definida de la siguiente manera:
type = TMatriz1 array[1..16,1..16] of real;
  • Los valores se asignan en un procedimiento anterior y aquí se la llama por parámetro.
  • Si estoy seguro que debería entrar porque veo los valores en el Watch List
Responder Con Cita
  #9  
Antiguo 20-12-2006
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Este hilo tiene el misterio de un cuento de navidad, con sorpresa incluida, el que era, ahora no es, el que es, no es el que parecía que era, jejeje...

Última edición por Casimiro Notevi fecha: 20-12-2006 a las 21:25:27.
Responder Con Cita
  #10  
Antiguo 20-12-2006
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Solo quiero comentar que si el código ejemplo es similar al código real (según tú) a nadie beneficia haber mostrado el primero, es decir, no se ha resuelto tu problema y por otro lado pienso que le hiciste perder el tiempo a la gente que amablemente trato de colaborar.

Tu problema es específico en el código real y nunca se va a localizar el mismo error/problema/defecto (llamalo como quieras) en el código ejemplo.

Hasta pronto

Edito:

Lo único congruente es el titulo del hilo (COSA DE LOCOS)
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #11  
Antiguo 20-12-2006
Robert01 Robert01 is offline
Miembro
 
Registrado: feb 2006
Ubicación: Córdoba, Argentina
Posts: 895
Poder: 19
Robert01 Va por buen camino
No es posible que si se cumplen las condiciones no entre al if, ¿seguro que no en alguno de los bucles while no se cumple y sale?
Responder Con Cita
  #12  
Antiguo 21-12-2006
Avatar de bosterito
bosterito bosterito is offline
Miembro
 
Registrado: nov 2006
Ubicación: Tucumán, Argentina
Posts: 39
Poder: 0
bosterito Va por buen camino
Disculpá Seoane, pero lo que hice fué porque pensé que haciendo esto iba a resultar mucho más simple la comprensión de mi problema. Con la ayuda que me diste si me funciona para el ejemplo 1 pero cuando quise adaptar la situación para mi problema real (ejemplo 2), sigo con el mismo problema. Te agradecería una respuesta favorable de tu parte, ya que estoy trabado y no puedo avanzar en el tema. Desde ya muchas gracias.
Responder Con Cita
  #13  
Antiguo 21-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Pero todavía sigo sin saber como llenas los valores de la matriz La única razón para que no entre en el if, es que no se cumpla la condición. No te fíes de la información que se ve en los watch, tratándose de valores de punto flotante puede que se trate de una aproximación y no del valor real. Por eso te preguntaba, como llenabas la matriz, para estar seguro de que valores se guardaban en ella. Si pudieras poner el código, donde llenas la matriz, por lo menos a mi, me aclararía muchas cosas.
Responder Con Cita
  #14  
Antiguo 21-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Mientras pones algo mas de codigo, permiteme adivinar un par de soluciones.

Esto es lo que tienes ahora:
Código Delphi [-]
  if (Matriz[j,i] = 1.5707963268)then

Solución 1:
Código Delphi [-]
  if SameValue(Matriz[j,i],1.5707963268)then

Solución 2:
Código Delphi [-]
  if SameValue(Matriz[j,i],pi/2)then

PD: Para que funcione, necesitas incluir en la uses la unit math.
Responder Con Cita
  #15  
Antiguo 21-12-2006
Avatar de bosterito
bosterito bosterito is offline
Miembro
 
Registrado: nov 2006
Ubicación: Tucumán, Argentina
Posts: 39
Poder: 0
bosterito Va por buen camino
Hola Seoane
Ahí pongo algo de código

Código:
Type Tmatriz1 = array[1..16,1..16] of Real; // Aquí defino la matriz

Código:
Theta := Angulo1 ( Gxx, Gyy, Gxy );  // En esta función se obtiene un determinado ángulo
Angulos[(((Alto+Bloque-1) div Bloque), ((Ancho-1) div Bloque)] := Theta; //Aquí le asigno el valor a la matriz
y luego la llamo por parámetros por el código que ya puse
Responder Con Cita
  #16  
Antiguo 21-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿Has probado las soluciones que te propuse? ¿funcionaron o sigues teniendo el mismo problema?
Responder Con Cita
  #17  
Antiguo 21-12-2006
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Poder: 20
rcarrillom Va por buen camino
Cita:
Empezado por egostar
Solo quiero comentar que si el código ejemplo es similar al código real (según tú) a nadie beneficia haber mostrado el primero, es decir, no se ha resuelto tu problema y por otro lado pienso que le hiciste perder el tiempo a la gente que amablemente trato de colaborar.

Tu problema es específico en el código real y nunca se va a localizar el mismo error/problema/defecto (llamalo como quieras) en el código ejemplo.

Hasta pronto

Edito:

Lo único congruente es el titulo del hilo (COSA DE LOCOS)
Coincido totalmente, siempredebe ser el código real.
Las comparaciones de tipos que tienen decimales es uno de los mayores problemas que hay en el mundo de la PC, al menos para mí ; es un problema inherente al diseño del procesador para almacenar y manejar las precisiones y no es específico a un lenguaje, vamos, no es de Delphi. Yo lo viví en carne propia al crear una aplicación para tratamiento de señales de sensores que deben ser procesados con precisiones de 9 posiciones decimales, o mejor dicho 0.00000001 unidades de error máximo en los cálculos, ncluyendo las maditas comparaciones de floats. También me quebré la cabeza y por 2 semanas investigando la comparación que fallaba a partir de los 6 decimales y en el Watch salían valores <> 0 (por eso nunca entraba al if) al restar el valor comparado contra el valor de la condición, que según yo y la lógica de este universo eran valores iguales; y buscando por Internet encontré la causa, que es la forma cómo el procesador almacena y reconstruye el valor original (que al final no siempre resulta el original); como no es entero, usa una serie de estratagemas para almacenar la parte decimal. La solución en mi caso fué limitar la precisión máxima de 9 decimales para todos los cálculos, truncando lo demás. Para esto se puede usar SimpleRoundTo de la unidad Math ó la combinación de RoundTo / SetRoundMode. Sería algo similar al hilo
quedarme con Centésimas en un float.
Saludos
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita
Respuesta



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
Están locos estos romanos dec Humor 3 09-10-2006 11:49:32
Los virus estan mas locos cada dia el_barto Noticias 6 14-09-2005 17:54:18
...de locos... Jure Humor 2 23-08-2004 12:43:20
¿Estamos locos o que? kokoon Humor 3 28-05-2004 21:25:33
Locos obiwuan Humor 0 13-05-2003 19:05:19


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


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