HispaMSX

Re: [hispamsx] Programa en C para MSX (hilo de www.msx.org)

2006-09-11 01:28:10
Carlos de Santa-Ana Garcia escribió:
David Lucena escribió:
> La versión con punteros también me funciona. Una curiosidad: ¿Las
> variables que usas son globales
> o locales a la función? Estas que ahora uso son locales por lo que las
> define en pila. Si son
> globales quizá esté en el tratamiento de éstas el bug.
>
>       int i;
>       int i2;
>       int i3;
>       int pos_ult;
>       int pos_prim;
>       int pos_nick;
>       char tempchar[1];
>       char buf[100];
> > buf[0] = '\0'; > > putchar( 0x1b );
>       putchar( 0x45 );
>       LOGLN("Begin");
> > pos_nick = 13;
>       i3 = pos_nick;
>       pos_prim = 0;
>       i = 100;
>
>       printf( "pos_nick %d\n\r", pos_nick );
>       printf( "i3 %d\n\r", i3 );
>       printf( "pos_prim %d\n\r", pos_prim );
>       for( i2=pos_prim+1; *((int*)(&i2)) < pos_nick; i2++ )
>       {
>             LOGLN("Inside");
> > tempchar[0] = ((char*)0x8000)[i2];
>             printf( "Enviar version %c\n\r", tempchar[0] );
>       }
>       printf( "pos_nick %d\n\r", pos_nick );
>       printf( "i3 %d\n\r", i3 );
>       printf( "pos_prim %d\n\r", pos_prim );
>       printf( "i2 %d\n\r", i2 );
>
>       printf( "Hola\r\n" );
> > while(1);
>
>
> El bug es mas difícil aun de tratar por eso me tiene loco, si compilo la
versión 09 de c-irccom no falla (al menos en ese punto que es donde el
cliente de irc responde a un CTCP VERSION) pero en este que es la
versión 10 si falla. Aun peor falla aquí y en otros puntos del programa
no, por eso llegue a la conclusión que decía antes de la contaminación
de las variables. Esto seria el caso del png: el for de 1 a 12 el índice
no contiene en realidad un 1 aunque al imprimirlo si salga, voy a
acceder por punteros a nivel byte en vez de int a las variables y así
ver el valor real de la variable en memoria, aunque lo único que podría
ser en vez de 1, -1, con lo cual seguiría funcionando el for: (-1 a 12).
El problema podría estar en el 12 que fuese -12 entonces si que debería
pasarse el for de largo: (1 a -12), pero resulta que el nuevo truco (por
punteros) solo afecta al 1, (supongo que ya nadie me sigue).


Bueno, las variables son globales y todo esta en la función main.
Adjunto los fuentes tal y como estan, fallan todos los comandos ctcp
(toda esa area), pero los for por ejemplo que scanean al principio de
cada bucle del programa lo que se ha recibido (linea 339) para encontrar
cada parte del mensaje (usuario/canal de origen/destino, comanto ctcp,
etc), o los de (linea: 646, 660, 669) que imprimen por pantalla los
mensajes de los usuarios y el servidor, si funcionan, y son las mismas
variables siempre.

Una locura vamos.

He subido toda la carpeta del programa, dentro va el fuente y todo los
resultados de la compilación.

http://hideoworld.iespana.es/msx/irc.rar

No le recomiendo a nadie que use lo que hay dentro en el msx pues esta
en estado catastrófico, aunque si hay algún valiente alla el.


Un saludo.


Antes de irme a la cama doy el ultimo repaso.


Si se usan los punteros para el indice funciona perfecto.

Si no se usa:

Si el numero con el que se compara es mayor de 255 funciona.

Si es menor de 256 la comparacion da false.



for(i=0;i2<i3;i2++) --------------> para i3>255 perfecto. Lo que refuerza a un mas mi teoria de un byte alto contaminado, por ejemplo cuando haces i3=18, solo se actualiza el byte bajo.




Un saludo.

<Anterior en la conversación] Conversación actual [Siguiente en la conversación>