• Sábado 14 de Diciembre de 2024, 21:59

Autor Tema:  Problemas Con Variables  (Leído 2792 veces)

mmerlo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Problemas Con Variables
« en: Miércoles 14 de Mayo de 2008, 11:19 »
0
Hola a todos. Estoy progamando unas cosillas para una asignatura, pero hay un pequeño problema que me trae de cabeza. En un momento del programa, le asigno a unas variables sus correspondientes valores, pero el valor de estas se modifica como por arte de magia!! Es un programa muy simple, y aunque no soy un experto, tengo algo de conocimientos de programación. Y la verdad, no veo donde está el problema. Como control, imprimo en pantalla mis variables para ver que pasa con ellas y esto es lo que ocurre:

En un momento del programa tengo esto:

...
  x=3.2;
  y=3.;
  z=10.;
  d=1.E-10;

  limit=50;
 
  printf("\n%f",x)  ;
 
  pos[1]=x;
  pos[2]=y;
  pos[3]=z;

  printf(".....%f\n",x);

...

Esto me devuelve:   3.200000.....10.000000

No es extraño???Quien modifica mi x???

programo con opensuse y esto me trae de cabeza. Ayuda!!!!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Con Variables
« Respuesta #1 en: Miércoles 14 de Mayo de 2008, 11:50 »
0
Lo que yo haria, aunque trabajo bajo Windows, seria depurar el programa poniendo un breakpoint en memoria de tipo escritura entonces sabria desde donde se hace. Supongo que con gdb se podra hacer tambien. Otra opcion es tratar de reducir el codigo a la minima expresion que siga generando el problema e ir descartando codigo para saber desde donde se hace.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

mmerlo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Problemas Con Variables
« Respuesta #2 en: Miércoles 14 de Mayo de 2008, 12:09 »
0
En primer lugar, muchas gracias por tu rápida respuesta.

Bueno, no se como debería poner un breakpoint en memoria. Si me dieras algunas indicaciones... creo que sabría hacerlo.

Y reducir más el código... más que eso...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Con Variables
« Respuesta #3 en: Miércoles 14 de Mayo de 2008, 12:12 »
0
Cita de: "mmerlo"
Bueno, no se como debería poner un breakpoint en memoria. Si me dieras algunas indicaciones... creo que sabría hacerlo.

http://www.linuxtopia.org/online_books/red...db/packets.html

Me suena a que sera eso de write watchpoint pero como te decia yo trabajo bajo Windows.


Cita de: "mmerlo"
Y reducir más el código... más que eso...

Me referia a reducirlo a una expresion compilable.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Problemas Con Variables
« Respuesta #4 en: Miércoles 14 de Mayo de 2008, 12:33 »
0
Hola,
Casi con seguridad te digo que tú mismo modificas el valor de la x... en algún punto estás entrando en la dirección de x y estás sobrescribiéndola...  Cómo has creado el array pos?? parece que pos[3] está apuntando a la dirección de x...

si nos das algo más de código compilable (como bien dice Eternal Idolte podremos ayudar...

Un saludo,
 :lightsabre:
No hay tonto más molesto que el ingenioso.

mmerlo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Problemas Con Variables
« Respuesta #5 en: Miércoles 14 de Mayo de 2008, 12:51 »
0
Veamos. Doy más detalles. Este es mí programa (no incluyo declaraciones de funciones ni tal por simplificar)

main ()
{
 
  double x,y,z,d,h,limit,r,t;
  double pos[3];
  double pos2[3];

  h=0.001;
  x=3.2;
  y=3.;
  z=10.;
  d=1.E-10;

  limit=1000;

  printf("\n%f",x);

  pos[1]=x;
  pos[2]=y;
  pos[3]=z;

  printf(".....%f\n",x);

  pos2[1]=pos[1]+d;
  pos2[2]=pos[2]+d;
  pos2[3]=pos[3]+d;

  r=21.;

  liavponov (pos,pos2,r,h,d,limit);

  //  fases (pos,r,h,limit,"fases1.dat");


  printf("\n%f   %f\n",x,x+d);
 
 fases (pos2,r,h,limit,"fases2.dat");

}

He investigado un poco acerca de lo que me comentó Eternal Idol y he conseguido esto. Usando GDB (nunca lo había hecho antes XDD de todo se aprende) obtengo esto:

GNU gdb 6.6.50.20070726-cvs
Copyright © 2007 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i586-suse-linux"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x8048518: file problema2.c, line 27.
(gdb) run
Starting program: /home/manuel/Asignaturas/Fisica no lineal/relacion4/problema2/problema2

Breakpoint 1, main () at problema2.c:27
27        h=0.001;
(gdb) next
28        x=3.2;
(gdb) next
29        y=3.;
(gdb) next
30        z=10.;
(gdb) next
31        d=1.E-10;
(gdb) next
33        limit=1000;
(gdb) next
36        printf("\n%f",x);
(gdb) next

38        pos[1]=x;
(gdb) next
39        pos[2]=y;
(gdb) next
40        pos[3]=z;
(gdb) print x                                <--- En este punto le pido que me muestre el valor de x
$1 = 3.2000000000000002
(gdb) next
42        printf(".....%f\n",x);
(gdb) print x
$2 = 10                                       <--- hago lo mismo aquí y resulta que es la funcion printf???
(gdb)

No lo entiendo...

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Problemas Con Variables
« Respuesta #6 en: Miércoles 14 de Mayo de 2008, 13:12 »
0
vale,
tenia razón
estas escribiendo en una zona de memoria que no te corresponde:
Código: Text
  1. double pos[3];
  2.  
este array tiene 3 posiciones...
Código: Text
  1. pos[1]=x;
  2. pos[2]=y;
  3. pos[3]=z;
  4.  
  5.  
el array empieza en 0 y llega hasta 2, tú te estás saliendo de tu zona de memoria...
solución:
Código: Text
  1. pos[0]=x;
  2. pos[1]=y;
  3. pos[2]=z;
  4.  
  5.  

A ver ahora.
 :lightsabre:
No hay tonto más molesto que el ingenioso.

mmerlo

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Problemas Con Variables
« Respuesta #7 en: Miércoles 14 de Mayo de 2008, 13:16 »
0
Juasssss solo era eso XDDDDDDDDD Toda una mañada perdida por semejante tontería, y no es la primera vez que me pasa. Espero que esta sea la última.

Bueno, por lo menos he aprendido a usar un depurador... noy hay mal que por bien no venga

Muchísimas gracias por vuestra ayuda.

Saludos

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Problemas Con Variables
« Respuesta #8 en: Miércoles 14 de Mayo de 2008, 13:24 »
0
no te golpees la cabeza contra las paredes... Este fallo es uno de los más dificiles de ver cuando estás ofuscado... si hubieras tenido suerte, en vez de escribir sobre tu mapa de memoria (sobreescribiendo tus propias variables) hubieras escrito en una zona que no te corresponde y el SO te hubiera detenido de inmediato con una interrupción (el famoso "unhandled exception" de windows que en linux no sé muy bien como será)  Así te das cuenta rápido de que alguna variable se te ha ido... Pero cuando te pasa esto, es dificil darte cuenta, entre otras cosas porque siempre crees que el problema está en otra parte...

Un saludo y suerte.
 :lightsabre:
No hay tonto más molesto que el ingenioso.