Page 1 sur 1

bug C incompréhensible

Message non luPosté: 26 Mar 2020, 18:11
de pwouik
je viens de me mettre au C pour ti83ce mais je suis tombé sur un bug complétement incompréhensible
le carré doit pouvoir bouger dans deux directions et s’arrêter mais au lieu de ça quand il commence a aller a droite il accélère sans s'arreter.
Code: Tout sélectionner
#include <tice.h>
#include <string.h>
#include <graphx.h>
#include <keypadc.h>
int main(void)
{
    /* Clear the homescreen */
    os_ClrHome();
    gfx_Begin();
    uint24_t ticks=0;
    int16_t x=15,y=15,i,j,vx=0,vy=0;
    uint8_t map[12][15];
    for(i=0;i<8;i++)
    for(j=0;j<13;j++)
        if(randInt(0,1)==0)
           map[i][j]=1;
    while (!(kb_Data[7] & kb_Down))
    {
        delay(20);

        if (kb_Data[7] & kb_Right)vx=5;
        if (kb_Data[7] & kb_Left)vx=-5;
        x+=vx;
        y+=vy;
        if(vx>0)
        {
            vx--;
        }
        if(vx<0)
        {
            vx++;
        }
        gfx_FillScreen(255);
        gfx_SetColor(37);
        for(i=0;i<12;i++)
        for(j=0;j<15;j++)
            if(map[i][j]==1)
                gfx_FillRectangle_NoClip(j*20,i*20,20,20);
        ticks++;
        gfx_SetColor(0);
        gfx_FillRectangle(x,y,20,20);
        gfx_SwapDraw();
    }
    gfx_End();
    return 0;
}

EDIT:
mettre ça fixe le pb
Code: Tout sélectionner
{
            vx--;
            asm("nop");
        }

Mais ça n'a toujours AUCUN SENS
Je commence a penser de plus en plus que le backend llvm est buggé

Re: bug C incompréhensible

Message non luPosté: 27 Mar 2020, 00:08
de Adriweb
Euh ben le backend LLVM évolue de jour en jour, donc oui, c'est tout a fait possible qu'il y ait des bugs qui subsistent (meme s'il y en a de moins en moins, tout de meme).

Je vais regarder le code et tester, pour voir.

Re: bug C incompréhensible

Message non luPosté: 27 Mar 2020, 00:19
de Adriweb
Oui il semblerait que ça buggue du côté compileur sur au moins des comparaisons, jacobly étant au milieu de tentatives d'optimisations... Et certaines gestions de comparaisons sont à priori cassées.
Et j'update le PB assez souvent pour suivre les évolutions, là on a pas eu de pot vu que c'est tombé sur un truc cassé qui n'a pas été chopé par les tests.

Je te proposerais bien de mettre "-O0" dans les options de compilations (au lieu de -O3) par défaut mais même si du coup ca fait fonctionner la flèche droite, c'est la gauche qui déconne :troll:
Je confirme qu'avec un asm("nop") ca va mieux (en tout cas en -O3).

Bref, je vais voir si je peux rollback quelque peu mais sinon jacobly devrait être capable de s'occuper de ceci prochainement.

Merci pour ton bug report... et ta patience ^^

Re: bug C incompréhensible

Message non luPosté: 27 Mar 2020, 10:24
de pwouik
Merci pour ton message
je suis heureux que ça bouge toujours du coté de ce backend
Bon courage a vous :)

Re: bug C incompréhensible

Message non luPosté: 28 Mar 2020, 02:38
de Adriweb
Oui, ca bouge presque tous les jours en ce moment :)
En tout cas, il a pu corriger des problèmes (selon le niveau d'opti), et je garde le PB à jour :) Bref, le bug que tu rencontres est apparemment corrigé, je te laisse vérifier de ton côté !

Re: bug C incompréhensible

Message non luPosté: 28 Mar 2020, 17:20
de pwouik
Tout marche,parfait!
edit:au passage ça m'arrive souvent de bloquer l’émulateur par inadvertance, par exemple en testant un programme quand un autre tourne et peut etre inclure les clibs directement au lieu de devoir les remettre

EDIT 2:
HAAAAAAAA,ça refais n’importe quoi!
par exemple la ligne 45 s'execute alors qu'elle ne devrais jamais s'executer(pour le moment en tout cas)
Code: Tout sélectionner
#include <tice.h>
#include <string.h>
#include <graphx.h>
#include <keypadc.h>
int main(void)
{
    /* Clear the homescreen */
    os_ClrHome();
    gfx_Begin();
    uint24_t ticks=0;
    int16_t x=15,y=15,i,j,vx=0,vy=0;
    uint8_t map[12][15];
    for(i=0;i<15;i++)
    for(j=0;j<20;j++)
        if(randInt(0,4)==0)
           map[i][j]=1;
    while (!(kb_Data[7] & kb_Down))
    {
        delay(20);

        if (kb_Data[7] & kb_Right)vx=5;
        if (kb_Data[7] & kb_Left)vx=-5;
        gfx_FillScreen(255);
        if(vx>0)
        {
            vx--;
        }
        if(vx<0)
        {
            vx++;
        }
        vy++;
        for(i=0;i<15;i++)
        for(j=0;j<20;j++)
            if(map[i][j]==1)
                gfx_FillRectangle_NoClip(j*16,i*16,16,16);
        ticks++;
        x+=vx;
        y+=vy;
        if(vy<0)
            if(map[y/16][x/16]==1 || map[y/16][x/16]==1)
            {
                vy=0;
                y=0;//(y/16)*16;
                x+=5;//comme indicateur
            }
        if(vy>0)
            if(map[(y+8)/16][x/16]==1 || map[(y+8)/16][x/16]==1)
            {
                vy=0;
                y=0;//((y+8)/16)*16-8;
            }
        gfx_SetColor(0);
        gfx_FillRectangle(x,y,8,8);
        gfx_SwapDraw();
    }
    gfx_End();
    return 0;
}


Et me gratifie au passage d'un error duplicate a chaque fois

Re: bug C incompréhensible

Message non luPosté: 29 Mar 2020, 20:32
de Adriweb
1. Pour les clibs, oui j'ai en tête de prévoir quelque chose pour les transférer directement. En attendant tu peux te faire une ROM qui les contient deja :P
Par contre, pour les blocages, c'est à dire ? Parce que l'émulateur se met en pause quand il n'est pas utilisé, mais il suffit d'appuyer sur le bouton Resume, non ?

2. Je vais voir le problème avec jacobly :P
(Edit: avec "-Oz" ça fonctionne bien. Donc ca doit etre un bug des optimisations en -O3 qui provoque ça. Tu peux changer ce setting dans le PB dans ton projet, dans la sidebar)

Re: bug C incompréhensible

Message non luPosté: 29 Mar 2020, 22:59
de Adriweb
Bon alors il reste encore un bug par rapport a ça du côté du backend, mais il y avait quand même plusieurs problèmes dans ton code, dont voici une version corrigée:

Code: Tout sélectionner
#include <tice.h>
#include <string.h>
#include <graphx.h>
#include <keypadc.h>

#define MAP_W 15
#define MAP_H 12

int main(void)
{
    /* Clear the homescreen */
    os_ClrHome();
    gfx_Begin();

    uint24_t ticks=0;
    int16_t x=15,y=15,i,j,vx=0,vy=0;
    uint8_t map[MAP_H][MAP_W] = {0};

    for(i=0; i<MAP_H; i++)
        for(j=0; j<MAP_W; j++)
            if(randInt(0,4)==0)
                map[i][j]=1;

    while (!(kb_Data[7] & kb_Down))
    {
        delay(20);

        if (kb_Data[7] & kb_Right) vx=5;
        if (kb_Data[7] & kb_Left)  vx=-5;
        gfx_FillScreen(255);
        if(vx>0)
        {
            vx--;
        }
        if(vx<0)
        {
            vx++;
        }
        vy++;

        for(i=0; i<MAP_H; i++)
            for(j=0; j<MAP_W; j++)
                if(map[i][j]==1)
                    gfx_FillRectangle_NoClip(j*16,i*16,16,16);

        ticks++;
        x+=vx;
        y+=vy;
        if(vy<0)
        {
            if(map[y/16][x/16]==1 || map[y/16][x/16]==1)
            {
                vy=0;
                y=0;//(y/16)*16;
                x+=5;//comme indicateur
            }
        }
        if(vy>0)
        {
            if(map[(y+8)/16][x/16]==1 || map[(y+8)/16][x/16]==1)
            {
                vy=0;
                y=0;//((y+8)/16)*16-8;
            }
        }

        gfx_SetColor(0);
        gfx_FillRectangle(x,y,8,8);
        gfx_SwapDraw();
    }

    gfx_End();
    return 0;
}


  • Utilisation de constantes pour les tailles de la map -> ca evite des erreurs/differences entre la déclaration et l'usage dans les boucles (provoquant des buffer overflow etc) ;)
  • La map était à moitié remplie de valeur aléatoire car tu n'initialisais pas la variable. J'ai rajouté = {0} qui permet de tout mettre à 0.

Par ailleurs, le stack est très petit sur CE, et en fait si jamais tu en demandes un peu trop, ça fait foirer des choses (ça dépend des optis, c'est en fait pour ca que ca fonctionne bien en Oz et pas en O3)

Re: bug C incompréhensible

Message non luPosté: 30 Mar 2020, 11:05
de pwouik
Ok,merci!

Re: bug C incompréhensible

Message non luPosté: 03 Avr 2020, 19:20
de Adriweb
C'est corrigé côté LLVM (et PB) depuis hier :)