PDA

Ver la versión completa : [Programación C/C++] Fuuuuuuuuuuuuuuuuuuu



GameMaster
04/01/2012, 13:02
Si programais en C/C++ GNU donde los breakpoints o comodos debugs brillan por su ausencia, os aconsejo que siempre que declareis una variable la asigneis ni que esta sea null o 0.

Eso sólo para evitar estar dos dias buscando un error imposible....

La madilta variable se cambiaba del valor 1 (asignado durante el programa) al valor 58 dentro de un handler sin mas ni menos, me recuerda al if que tuve hace meses donde una variable era false pero insistia en entrar en la condición true... ver para creer....
Estas cosas se las cuentas a tu colega programador, aparte de no creerte, se rie en tu cara pensando que eres un inutil programador sin pajolera idea de programación, lo mas curioso es que si se lo enseñas tampoco se lo cree aunque lo este viendo, tal como si ve un fantasma el dia anterior ...

http://meme.zenfs.com/u/2903ae7ec509784186a4967208d167937c2188f6.jpeg

static int tmpPin = 0;

swapd0
04/01/2012, 13:20
Es que cuando declares una variable la deberias inicializar o te pueden pasar cosas de esas. De todas formas ¿no tenias un warning diciendo que estabas usando una variable sin inicializar? Aunque si la que te petaba es la que has puesto abajo (static int tmpPin = 0) creo que no avisa por se static.

Por eso yo no uso variables globales static, las intento agrupar y las meto dentro de una clase singleton.

GameMaster
04/01/2012, 13:22
Lo curisoso es que son copy/paste de otros menus, en los otros no esta inicializada y el error no ocurre...

ChUKii
04/01/2012, 13:49
I (L) eclipse

Jurk
04/01/2012, 13:49
No seria que algun array accedido con punteros.sobreesxrbia.esa variable al salir de su rango?

jduranmaster
04/01/2012, 13:53
molaba más el primer Fuuuu que has puesto.

GameMaster
04/01/2012, 13:56
Lo he mirao, no me parece...

saucjedi
04/01/2012, 14:24
Lo curisoso es que son copy/paste de otros menus, en los otros no esta inicializada y el error no ocurre...

Pues por pura lotería... vete preparando para que ocurra porque sí en caso de que sea algún overflow en sitios donde ni te imaginas.

¿Qué es C/C++ GNU? ¿Te refieres al compilador? Porque C/C++ es C/C++, no depende de que sea GNU ni nada ¿Donde brillan por su ausencia los breakpoints? Porque vale que el GDB podría ser más amigable, pero se defiende bien.

hardyx
04/01/2012, 14:37
Eso de que los breakpoints y debugs brillan por su ausencia está por ver, porque tienes el Dev-C++ o Codeblocks que es multiplataforma, y puedes ir paso a paso por el código y ver las variables en cada momento. Usa por debajo el gdb, que es el debugger de GNU, pero te lo muestra de manera gráfica.

Sobre el error, pues es lo que tiene C y C++, puedes hacer lo que quieras pero también puedes sobreescribir la memoria o cargarte la pila. Revisa los strcpy(), memcpy() y posibles fallos que pueda desencadenar el programa. Valida todos los punteros que no sean NULL.

También puedes usar assert() para asegurarte de que se cumplen ciertas condiciones, por ejemplo: assert(ptr != NULL). Y usa printf() o fprintf(stderr,...), (o OutputDebugString() si estás en Windows) para mostrar mensajes de depuración.

Por cierto, las variables static *siempre* se inicializan, si no quieres tener problemas luego. El resto si tienes los warnings activados, te avisará el compilador si la intentas usar sin un valor inicial.

Jurk
04/01/2012, 15:26
Esa varable stqtic es miembro de una clase? Porque si es asi, hay que tener en cuenta que todos los objetos de esa y todos los que heredan de esa clase COMPARTEN UN UNICO STATIC. Ademas, ya que es compartida existe incluso sin objetos.

GameMaster
04/01/2012, 15:28
Es una variable suelta, gracias chicos por los consejos

Jurk
04/01/2012, 19:09
y bueno, puede que la utilices en mas de un fichero?

Lo digo porque si no pones en los otros ficheros extern static int tmpPin = 0;
... pues como que no va o directamente ni compila, no me acuerdo...

juanvvc
04/01/2012, 19:13
No sé qué es peor, si decir que las herramientas gnu no tienen breakpoints, desproticar sobre problemas sin dar más detalles del problema para saber "de quién es la culpa" o que una variable estática tenga el sospechoso nombre de tmpPin...

^MiSaTo^
04/01/2012, 19:18
No sé qué es peor, si decir que las herramientas gnu no tienen breakpoints, desproticar sobre problemas sin dar más detalles del problema para saber "de quién es la culpa" o que una variable estática tenga el sospechoso nombre de tmpPin...

:quepalmo::quepalmo::quepalmo::quepalmo::quepalmo: XDD Toda la razón sobre todo a lo último!

Jurk
04/01/2012, 19:30
:lol:

GameMaster
04/01/2012, 20:11
Que no puedo debbuger, salvo con printf... Se ejecuta en un device con linux embebido, y se compila en una maquina virtual...

Se usa en varios ficheros, que en realidad son menu's muy parecidos, pero con distintos controles.

^MiSaTo^
04/01/2012, 20:13
Que no puedo debbuger, salvo con printf... Se ejecuta en un device con linux embebido, y se compila en una maquina virtual...

Se usa en varios ficheros, que en realidad son menu's muy parecidos, pero con distintos controles.
No se cómo lo tienes montado, pero sí se puede usar debugger en esos casos... de hecho cuando programas para móviles cómo lo haces? Pues de la misma manera que dices tu xD

Es más, para Win Phone yo uso Virtual Box en un Mac OS y puedo debuggar sin problemas XD

Otra cosa que no sepas configurar gdb o que lo tengas mal montado, pero poderse, se puede

GameMaster
04/01/2012, 20:19
Porque para mobiles tienes un emu, cosa que aqui no, he.

^MiSaTo^
04/01/2012, 20:20
Porque para mobiles tienes un emu, cosa que aqui no, he.

Nunca uso el emu eh? Te hablo de debugar en el propio dispositivo.
Aparte, tb he programado para chismes con linux embebidos.

GameMaster
04/01/2012, 20:22
Ya, pero copiamos el main por telnet, debugear por cable tb es posible pero en este caso no se como seria posible, pues tendria que ser por internet

juanvvc
04/01/2012, 20:33
http://davis.lbl.gov/Manuals/GDB/gdb_17.html

En el dispositivo remoto corres gdbserver y en tu ordenador gdb o cualquiera de sus múltiples interfaces gráficas.

GameMaster
04/01/2012, 20:40
Ya, pero lo tendria que compilar para el dispositivo remoto para poder ejecutarlo en el, no ?

^MiSaTo^
04/01/2012, 20:41
http://davis.lbl.gov/Manuals/GDB/gdb_17.html

En el dispositivo remoto corres gdbserver y en tu ordenador gdb o cualquiera de sus múltiples interfaces gráficas.

Ni te molestes juan xD Ya he dicho yo que esque lo tendría mal configurado o no lo tenía montado o lo que fuera, pero que poderse se puede...

GameMaster
04/01/2012, 20:43
Misato no seas mala, quiero saber mas sobre esa opcion. Gracias juan

juanvvc
04/01/2012, 21:18
Si, tendrias que compilar gdbserver para tu dispositivo. Deberia ser facil y si es un Linux usual probablemente ya lo haya hecho alguien.

Logann
04/01/2012, 21:19
En C, y creo que en C++ (la cosa es mas complicada con variables de objectos)

static int a; y static int a = 0; es lo mismo por definición, las variables static se autoinician obligatoriamente a 0.

Por cierto:
http://en.wikipedia.org/wiki/Shotgun_debugging

GameMaster
04/01/2012, 21:38
ya es lo mismo, pero os juro que el problema ha desaparecido iniciando manualmente la variable...

Logann
04/01/2012, 21:54
Un buen ejercicio es desensamblar ambos programas y ver la diferencia.

xzakox
04/01/2012, 22:17
Breakpoints are set with the break command (abbreviated b). The debugger convenience variable `$bpnum' records the number of the breakpoints you've set most recently; see section Convenience variables, for a discussion of what you can do with convenience variables.

You have several ways to say where the breakpoint should go.

break function
Set a breakpoint at entry to function function. When using source languages that permit overloading of symbols, such as C++, function may refer to more than one possible place to break. See section Breakpoint menus, for a discussion of that situation.
break +offset
break -offset
Set a breakpoint some number of lines forward or back from the position at which execution stopped in the currently selected frame.
break linenum
Set a breakpoint at line linenum in the current source file. That file is the last file whose source text was printed. This breakpoint stops your program just before it executes any of the code on that line.
(...)


Documentación de GDB


Y si no te mola la linea de comandos...
http://www.losersjuegos.com.ar/incoming/descargas/20070928/ddd1.png

DDD

NO haré más comentarios sobre cosas que brillan por su ausencia.

Eskema
05/01/2012, 03:10
No se supone que las variables en C++ se inician automaticamente?, ¿o eso es cosa del visual studio?, yo siempre las inicio pero suena que lei por algun lado que se iniciaban a 0 automaticamente igual lo soñe o es cosa de segun que IDEs o compiladores......

Haohmaru
05/01/2012, 10:46
xDDDD Me parto, me ha pasado más de una vez este tipo de cosillas programando y tener al coelga al lado y mirarte con cara de..."venga tío.."

Que sensación más incomoda, peor que tu tía la del pueblo te coma a besos.

Jurk
05/01/2012, 11:44
No se supone que las variables en C++ se inician automaticamente?, ¿o eso es cosa del visual studio?, yo siempre las inicio pero suena que lei por algun lado que se iniciaban a 0 automaticamente igual lo soñe o es cosa de segun que IDEs o compiladores......

Lo soñaste

Si no para que existen, incluso como.concepto, los constructores?

GameMaster
05/01/2012, 11:49
En C# no necesitas, ni en otros lenguajes mas facilones como bennu o fenix

^MiSaTo^
05/01/2012, 12:18
En C# no necesitas, ni en otros lenguajes mas facilones como bennu o fenix

Lo cual no quita que no sea una guarrada ;)

GameMaster
05/01/2012, 12:25
por ? Me parece cojonudo que haga eso, se inicien a null / 0 por defecto y que si quieres otro valor lo pongas tu.

Si te sigue pareciendo guarrada pasate al assembler xD

Jurk
05/01/2012, 12:27
Lo de las incializaciones automaticas genera defectos de programacion. Hay que inicializar todooo

^MiSaTo^
05/01/2012, 12:28
Lo de las incializaciones automaticas genera defectos de programacion. Hay que inicializar todooo

Exacto, buenas prácticas de programación se llama.
Que luego cambiamos de lenguaje, y vienen los sustos ;)

GameMaster
05/01/2012, 12:28
Que defectos ? Si te las inicializa de forma automatica a null cuando no defines su valor no veo que defecto puede ser.

Eskema
05/01/2012, 12:32
Lo soñaste

Si no para que existen, incluso como.concepto, los constructores?

Pues entonces ha sido el C#, si al final tanto cambiar de lenguajes uno se hace la picha un lio y ya no sabe ni en que mundo vive :lol2:

De todas maneras no creo que sea una cuestion de buenas o malas practicas si no de hacer lo que el lenguaje te pida, si trabajas con C/C++ deberas ponerlo todo a 0/null, pero si en c# todo se me inicia a 0/null no veo porque he de perder el tiempo yo, se supone que es la gran ventaja de ese lenguaje el reducir mi trabajo aliviando estas pequeñas "tonterias". Como bien decis tambien se puede ir un poco en plan cabeza cuadrada y ponerlo todo 0 por si las moscas, me la suda si este lenguaje me lo pone a 0 o si me saca al perro a pasear, !!yo!! le dire lo que tiene que hacer XD

juanvvc
05/01/2012, 12:35
De todas formas estamos hablando de C. Que se haga automáticamente una inicialización "int i=0" pues vale, pero que un sistema embebido pierda tiempo inicializando a cero todas las posiciones de "int buffer[800*600*3]" cuando no lo necesitas a lo mejor no te hace mucha gracia.

C es C: control a bajo nivel de la memoria para lo bueno y lo malo. Un gran poder conlleva una gran responsabilidad.

Eskema
05/01/2012, 12:36
Obviamente el C es C, pero ahi como dices supongo que es cosa del programador quien debe saber lo que esta haciendo y con que trabaja para manejarlo todo como se debe.....

saucjedi
05/01/2012, 12:49
Que defectos ? Si te las inicializa de forma automatica a null cuando no defines su valor no veo que defecto puede ser.

Lo ves cuando cambias de lenguaje y tu cerebro ha asumido que se inicializan solas... luego vienen los sustos hasta que caes en el asunto.

¿Qué tiene el assembler de guarro? Guarro será el que programa mal.

GameMaster
05/01/2012, 12:51
Que el problema no es ese, yo no me guio por lo que hago en otros lenguajes, separo muy bien de mi mente el entorno en que trabajo.
Me guio por el resto y logica del restante codigo ya hecho, en este caso C.

En los otros menus no esta inicializada, pero no da error, con lo cual los voy a dejar tal como estan, C# no tiene nada que ver con el tema, lo habeis llamao vosotros al hilo xD

saucjedi
05/01/2012, 12:55
Que el problema no es ese, yo no me guio por lo que hago en otros lenguajes, separo muy bien de mi mente el entorno en que trabajo.
Me guio por el resto y logica del restante codigo ya hecho, en este caso C.

En los otros menus no esta inicializada, pero no da error, con lo cual los voy a dejar tal como estan, C# no tiene nada que ver con el tema, lo habeis llamao vosotros al hilo xD

Eso que te marco en negrita, si no lo has programado tú... es un suicidio tío, garantía de que algún día saltará la liebre... y a veces hasta habiéndolo hecho tú se te puede olvidar exactamente la lógica.

Jurk
05/01/2012, 12:58
Que defectos ? Si te las inicializa de forma automatica a null cuando no defines su valor no veo que defecto puede ser.

Pues que todo que en manos del compilador, tu no lo controlas. Si cambias de compilador te puedes llevar sustos como los tuyos

The_Punisher
05/01/2012, 12:59
Yo no entiendo mucho de C/C++ pero las veces que mas tiempo me ha llevado localizar errores ha sido debido a no inicializar las variables. A mí es lo que siempre me han dicho, que las inicialice.

Jurk
05/01/2012, 13:07
Todo ese tiempo perdidote parece poco?