π
<-
Chat plein-écran
[^]

bug C incompréhensible

Assembleur, Axe, C/C++, ICE...

bug C incompréhensible

Unread postby pwouik » 26 Mar 2020, 18:11

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: Select all
#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: Select all
{
            vx--;
            asm("nop");
        }

Mais ça n'a toujours AUCUN SENS
Je commence a penser de plus en plus que le backend llvm est buggé
User avatar
pwouik
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Level up: 12%
 
Posts: 11
Joined: 10 Sep 2018, 22:46
Gender: Not specified
Class: 1ere

Re: bug C incompréhensible

Unread postby Adriweb » 27 Mar 2020, 00:08

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.
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 56.1%
 
Posts: 13164
Images: 1087
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Class: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: bug C incompréhensible

Unread postby Adriweb » 27 Mar 2020, 00:19

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 ^^
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 56.1%
 
Posts: 13164
Images: 1087
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Class: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: bug C incompréhensible

Unread postby pwouik » 27 Mar 2020, 10:24

Merci pour ton message
je suis heureux que ça bouge toujours du coté de ce backend
Bon courage a vous :)
User avatar
pwouik
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Level up: 12%
 
Posts: 11
Joined: 10 Sep 2018, 22:46
Gender: Not specified
Class: 1ere

Re: bug C incompréhensible

Unread postby Adriweb » 28 Mar 2020, 02:38

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é !
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 56.1%
 
Posts: 13164
Images: 1087
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Class: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: bug C incompréhensible

Unread postby pwouik » 28 Mar 2020, 17:20

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: Select all
#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
User avatar
pwouik
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Level up: 12%
 
Posts: 11
Joined: 10 Sep 2018, 22:46
Gender: Not specified
Class: 1ere

Re: bug C incompréhensible

Unread postby Adriweb » 29 Mar 2020, 20:32

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)
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 56.1%
 
Posts: 13164
Images: 1087
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Class: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: bug C incompréhensible

Unread postby Adriweb » 29 Mar 2020, 22:59

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: Select all
#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)
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 56.1%
 
Posts: 13164
Images: 1087
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Class: (ingénieur)
Twitter: adriweb
GitHub: adriweb

Re: bug C incompréhensible

Unread postby pwouik » 30 Mar 2020, 11:05

Ok,merci!
User avatar
pwouik
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Level up: 12%
 
Posts: 11
Joined: 10 Sep 2018, 22:46
Gender: Not specified
Class: 1ere

Re: bug C incompréhensible

Unread postby Adriweb » 03 Apr 2020, 19:20

C'est corrigé côté LLVM (et PB) depuis hier :)
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 56.1%
 
Posts: 13164
Images: 1087
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Class: (ingénieur)
Twitter: adriweb
GitHub: adriweb


Return to Langages alternatifs

Who is online

Users browsing this forum: No registered users and 3 guests

-
Search
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Découvre les nouvelles fonctionnalités en Python de l'OS 5.2 pour les Nspire CX II
Découvre les nouvelles fonctionnalités en Python de l'OS 5.5 pour la 83PCE/84+C-T Python Edition
Omega, le fork étendant les capacités de ta NumWorks, même en mode examen !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...

Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
494 utilisateurs:
>486 invités
>2 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)

-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)