Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » Mon premier programme en C (35 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Folco Ecrit le: Mardi 31 août 2004 à 00:39 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


Voici mon premier programme en C, je le poste pour si possible avoir le plus de critiques constructibles possibles.
Il est simple, et j'ai mis tout juste assez de commentaires pour que vous compreniez mon charabia.
Au fait, je sauce/restaure l'écran "à la main", c'était juste pour manipuler un pointeur et un buffer, sinon je sais qu'on peut laisser à tigcc le soin d'inclure ça tout seul dans le prog.

Voici le source:
#include <tigcclib.h>


void _main(void)
{
  unsigned long *scrsave;                             //pointeur vers le buffer de sauvegarde de l'écran
  unsigned char input[8];                              //chaine ou on sauve le pass entré
  unsigned short key;                                   //valeur contenant ngetchx()
  unsigned int i=0;
  scrsave = HeapAllocPtr(3840);                    //adresse du buffer renvoyée dans scrsave
  memcpy(scrsave, LCD_MEM, 3840);           //copie de l'écran dans le buffer
  off();
  OSInitBetweenKeyDelay(20);                     //ça c mes réglages perso, je préfère ça comme ça
  OSInitKeyInitDelay(40);
  ClrScr();
  FontSetSys(F_8x10);
  DrawStr(20,40, "Entrer le code:", A_NORMAL);
  do
  {
    key = ngetchx();
    if(key>=65 && key<=123)                 //pour entrer minuscules et majuscules
    {
      input[ i ] = key;                                     //on écrit le code de la lettre dans le buffer de char
      DrawChar(20+17*i, 60, '*', A_NORMAL);                //et on affiche une étoile
      i++;                                            on augmente l'adresse où on écrit dans le buffer
    }
    if(key == KEY_BACKSPACE && i>0)            //si on efface une lettre
    {
      i--;                                                 //on décrémente l'adresse
      DrawChar(20+18*i, 60, ' ', A_REPLACE);       //on affiche un espace
      input[ i ] = 0;                                //on efface la valeur dans le buffer
    }
    if(key == KEY_ENTER && !memucmp("abcdef", input, 6))      //is on fait enter et si le texte entré == "abcde"
    {
      break;                    //si le code est bon et si on a fait enter, on quitte la boucle
    }
    else                
    {
      if(i == 8 || key == KEY_ENTER)  //si enter et code faux, ou les 8 caréactères atteints
      {
        i = 0;                        //on réinitialise l'adresse où on écrit
        unsigned int j;
        for (j=0; j<8; j++)
        {
          input[j] = 0;
          DrawChar(20+18*j, 60, ' ', A_REPLACE);     //on efface le texte
        }
      }
    }
  }
  while(i<=8);           //on boucle jusqu'à 8 caractères max
  memcpy(LCD_MEM, scrsave, 3840);        //on restaure l'écran
  HeapFreePtr(scrsave);                            //on libère le buffer
}

[edit: merci Kevin, et ajout de commentaires]
[EDIT par Kevin Kofler: P****n de tags [ i ]...]
-Edité le Mardi 31 août 2004 à 00:42 par Kevin Kofler-
-Edité le Mardi 31 août 2004 à 10:34 par Martial Demolins-
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°1   Marquer comme non lu.
Folco Ecrit le: Mardi 31 août 2004 à 00:49 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


Première critique, en tant que programmeur expérimenté, je peux te dire que ton code n'est pas assez aéré, on y voit rien pour déchiffrer ton shmilblick de n00b!!:D
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°2   Marquer comme non lu.
geogeo Ecrit le: Mardi 31 août 2004 à 01:18 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Non ton code est bien même si il est loin d'être optimisé et bien commenté.
Moi par contre j'utiliserai plutôt malloc et free au lieu de HeapAllocPtr et HeapFreePtr. Mais ça change pas grand chose. :D
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°3   Marquer comme non lu.
Folco Ecrit le: Mardi 31 août 2004 à 07:50 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


merci, c'est encourageant!!
Pour les fonctions de alloc.h, ce sont celles que j'utilise en asm, donc il faudra que je découvre dans la doc celles dont tu m'a parlé, je ne les connais pas
(vite fait: malloc is in fact an ANSI C alias for a TIOS routine originally called HeapAllocPtr (see description of it for more system info). ).
donc voila, grosso modo, c'est pareil :D

Mais au fait, que puis-je faire comme optimisations? (sur les types de données, les structures etc) ?

Merci geogeo!
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°4   Marquer comme non lu.
geogeo Ecrit le: Mardi 31 août 2004 à 12:31 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


#include <tigcclib.h>

void _main(void)
{
    unsigned long *scrsave;
    unsigned char input[8];
    unsigned short key;
    unsigned int i=0;
    scrsave = malloc (LCD_SIZE);
    memcpy(scrsave, LCD_MEM, LCD_SIZE);
    off();
    OSInitBetweenKeyDelay(20);
    OSInitKeyInitDelay(40);
    ClrScr();
    FontSetSys(F_8x10);
    DrawStr(20,40, "Entrer le code:", A_NORMAL);
    do
    {
        key = ngetchx();
        if((key>='A' && key<='Z") || (key>='a' && key<='z'))
        {
             input[ i ] = key;
             DrawChar(20+17*i++, 60, '*', A_NORMAL);
        }
        else if(key == KEY_BACKSPACE && i)
        {
              DrawChar(20+18*i--, 60, ' ', A_REPLACE);
              input[ i ] = 0;
        }
        else if(key == KEY_ENTER && !memucmp("abcdef", input, 6))
           break;
        else if(i == 8 || key == KEY_ENTER) 
        {
             i = 0; 

             unsigned int j;
             for (j=0; j<8; j++)
             {
                  input[j] = 0;
                  DrawChar(20+18*j, 60, ' ', A_REPLACE);
             }
         }
      }
      while(i<=8);
      memcpy(LCD_MEM, scrsave, LCD_SIZE); 
      free (scrsave);
}


Mais franchement ça apporte rien de plus, ton code est déjà très bien.
-Edité le Mardi 31 août 2004 à 12:32 par geogeo-
-Edité le Mardi 31 août 2004 à 12:33 par geogeo-
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°5   Marquer comme non lu.
Folco Ecrit le: Mardi 31 août 2004 à 13:16 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


ok, merci beaucoup, je regarderai ça chez moi, là je suis au boulot :D
Il faut dire que le code est si simple qu'il n'y a pas forcément grand chose à optimiser dedans... :(
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°6   Marquer comme non lu.
Folco Ecrit le: Mardi 31 août 2004 à 13:18 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


ah si, un petit truc qui me fait bizare, je copie un short (key) dans un tableau de char (input), comment se fait-il que ça marche sans problème, sachant que le short fait 2 octets, et le char un seul?
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°7   Marquer comme non lu.
geogeo Ecrit le: Mardi 31 août 2004 à 13:41 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Parce que tu dois seulement utiliser un nombre compris entre 0 et 255 ou -128 à 127 dans ton short se qui fait que ça tient sur 1 octet et donc que la copie est correcte.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°8   Marquer comme non lu.
Sasume Ecrit le: Mardi 31 août 2004 à 14:31 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

./6> C'est une conversion implicite. Le short est "transformé" en char (en fait, il plutôt simplement tronqué).
    
./Post n°9   Marquer comme non lu.
Folco Ecrit le: Mardi 31 août 2004 à 14:36 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


ok merci. et que se passerait-il si le short était supérieur à 255?
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°10   Marquer comme non lu.
Sasume Ecrit le: Mardi 31 août 2004 à 14:48 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Je ne sais pas.
Je suppose que le transtypage est un simple tronquage, je ne vois pas comment faire autrement (Kevin me rectifiera si je me suis trompé).
Donc en gros, le fait de transtyper en char réaliserait un modulo 256 (en arithmétique non signée).
    
./Post n°11   Marquer comme non lu.
Folco Ecrit le: Mardi 31 août 2004 à 23:24 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


pffff, j'ai pas eu le temps de bosser ce soir, avec la réinstallation de mon M$...
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°12   Marquer comme non lu.
Folco Ecrit le: Mercredi 1er septembre 2004 à 20:41 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


voila voila, j'ai optimisé un peu le prog, pouvez-vous me dire ce qui ne vas pas svp, j'attends beaucoup de vos conseils merci!!
#include <tigcclib.h>

void dchar(short, char, short);

void _main(void)
{
  unsigned long *scrsave;
  unsigned char input[8];
  unsigned short key=0;
  unsigned int i=0;
  scrsave = HeapAllocPtr(3840);
  memcpy(scrsave, LCD_MEM, 3840);
  ClrScr();
  off();
  OSInitBetweenKeyDelay(20);
  OSInitKeyInitDelay(40);
  FontSetSys(F_8x10);
  DrawStr(20,40, "Entrer le code:", A_NORMAL);
  do
  {
    if(i == 8 || key == KEY_ENTER)
    {
      for (i=0; i<8; i++)
      {
        input[ i ] = 0;
        dchar(i, ' ', A_REPLACE);
      }
      i = 0;
    }
    if(key == KEY_BACKSPACE && i)
    {
      dchar(--i, ' ', A_REPLACE);
      input[ i ] = 0;
    }
    key = ngetchx();
    if((key>='a' && key<='z') || (key>='A' && key<='Z'))
    {
      dchar(i, '*', A_NORMAL);
      input[i++] = key;
    }
  }
  while(key != KEY_ENTER || memucmp("abcdef", input, 6));
  memcpy(LCD_MEM, scrsave, 3840);
  HeapFreePtr(scrsave);
}

void dchar(short abcisse,char  x,short  attribute)
{
  DrawChar(20+18*abcisse, 60, x, attribute);
}

[edit]sacrées balises #rage#
-Edité le Mercredi 1er septembre 2004 à 20:51 par Martial Demolins-
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°13   Marquer comme non lu.
geogeo Ecrit le: Mercredi 1er septembre 2004 à 20:48 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Y a rien à optimiser. Toute façon pour un programme aussi simple que ça, optimiser est inutile. :)
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°14   Marquer comme non lu.
Folco Ecrit le: Mercredi 1er septembre 2004 à 20:50 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


je sais que c'est inutile, mais c'est pour commencer justement par des optimmisations de base. :)
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°15   Marquer comme non lu.
geogeo Ecrit le: Mercredi 1er septembre 2004 à 20:52 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


On peut juste ajouter un 'else if', je ne vois rien d'autre.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°16   Marquer comme non lu.
Folco Ecrit le: Mercredi 1er septembre 2004 à 20:54 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


si je rajoute juste un else, je perds 2 octets...
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°17   Marquer comme non lu.
geogeo Ecrit le: Mercredi 1er septembre 2004 à 21:02 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


else
{

}

ou else if?

Je pensais remplacer
if(key == KEY_BACKSPACE && i)

par
else if(key == KEY_BACKSPACE && i)


Mais bon ça change pas grand chose :D
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°18   Marquer comme non lu.
Folco Ecrit le: Mercredi 1er septembre 2004 à 22:05 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


C'est ce que j'ai essayé, c'est là que je perds deux octets.
De plus, la condition perd son sens logique.
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°19   Marquer comme non lu.
Benjy Ecrit le: Mercredi 1er septembre 2004 à 22:46 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


Non elle ne perd pas son sens logique!!
Le langage C y'a pas mieux!!!
    
  :: Index » Forum Ti68K » Programmation C » Mon premier programme en C (35 réponse(s))
Pages : 1/2     « [1] 2 » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 67.96ms avec 18 requetes