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 » Trop de typage tue la programmation (20 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Thor Ecrit le: Mercredi 4 janvier 2006 à 14:10 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


J'ai un problème structurel dans un programme.

J'ai 2 structures qui se ressemble sauf pour une seul et unique élément le composant. Imaginons une structure regroupant les données de Mario : lorsqu'il est petit, le pointeur pointant vers les données graphiques est un unsigned char alors que si il grandit, le pointeur doit être un unsigned short..

Moi le problème ce situe ici mais en plus il faut se placer dans une structure :

typedef struct
{
int position_en_x;
int position_en_y;
...
unsigned char *ptr_vers_gfx;
}

comment est ce que je peux faire pour éviter le problème au mieux (sachant que de toute façon je devrait détecter si c'est du char ou du short pour la fonction qui affichera le sprite)
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°1   Marquer comme non lu.
Folco Ecrit le: Mercredi 4 janvier 2006 à 14:22 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


un pointeur unsigned char ou unsigned short? ça veut dire que ça fait 1 ou deux octets? un pointeur (une adresse quoi) fait 4 octets sur TI. Je suppose que je comprends mal le typage de tes données, tu peux m'expliquer un peu? sinon, passe tout en unsigned short, c'est faisable?
<<< 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.
FpgForce Ecrit le: Mercredi 4 janvier 2006 à 14:44 Déconnecté(e)    Voir le profil de FpgForce Envoyer un email à FpgForce Envoyer un message privé à FpgForce  

Thor > utilise une union.
    
./Post n°3   Marquer comme non lu.
Folco Ecrit le: Mercredi 4 janvier 2006 à 14:45 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


ah... le pointeur unsigneg machin veut juste dire que c'est le type de la donnée pointée? je me trompe encore?
<<< 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.
FpgForce Ecrit le: Mercredi 4 janvier 2006 à 14:48 Déconnecté(e)    Voir le profil de FpgForce Envoyer un email à FpgForce Envoyer un message privé à FpgForce  

Ben non ce dont parle Thor si j'ai bien compris c'est qu'il a besoin d'un pointeur sur deux types différents, alternativement sur char et short.

    
./Post n°5   Marquer comme non lu.
Folco Ecrit le: Mercredi 4 janvier 2006 à 14:54 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


ok, j'ai compris. :)

rahlala, il y a pas à dire, l'assembleur est quand même beaucoup plus simple #langue#
<<< 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.
Thor Ecrit le: Mercredi 4 janvier 2006 à 15:30 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


FpgForce :
Ben non ce dont parle Thor si j'ai bien compris c'est qu'il a besoin d'un pointeur sur deux types différents, alternativement sur char et short.


C'est ça !!
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°7   Marquer comme non lu.
Thor Ecrit le: Mercredi 4 janvier 2006 à 15:33 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Merci je ne connaisais pas ce système d'union ! Ca simplifie drolement mon problème. Si j'ai bien compris j'arrive à ce code là :

typedef union
{
unsigned char ptr_char;
unsigned char ptr_short;
} PTR_VERS_GFX

typedef struct
{
int position_en_x;
int position_en_y;
...
PTR_VERS_GFX *ptr_vers_gfx;
}

C'est ça?
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°8   Marquer comme non lu.
Thor Ecrit le: Mercredi 4 janvier 2006 à 15:36 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Jfg > j'y avais pensé au pointeur de type void ais ça ne ressort pas des Warning?
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°9   Marquer comme non lu.
Jfg Ecrit le: Mercredi 4 janvier 2006 à 15:36 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


Perso, je n'utilise jamais les unions donc je ne connais pas toutes les syntax !=, mais je ne pense pas que c'est la bonne syntax.

Sinon tu peux utiliser un pointeur de type void.

(désolé thor d'avoir effacé mon post, mais c'est plus simple que des edits :D)

Dans m4r10 je ne me rapelle plus comment j'avais fais mais à la fin yavait pas de warnings. Mais de toute façon, pourquoi tu ne veux pas typecasté ?
-Edité le Mercredi 4 janvier 2006 à 15:38 par JfG-
Kill Mario
    
./Post n°10   Marquer comme non lu.
geogeo Ecrit le: Mercredi 4 janvier 2006 à 16:16 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


typedef struct
{
  int position_en_x;
  int position_en_y;
  union {
    unsigned short *pU16;
    unsigned char *pU8;
  };
}


Mais ici union ne sert à rien disons. Soit tu te tapes une structure avec les 2 formats de pointeurs! Soit tu te tapes un void *. Et dans ce cas tu cast à chaque fois.
(unsigned short*)mon_pointeur_void...
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°11   Marquer comme non lu.
FpgForce Ecrit le: Mercredi 4 janvier 2006 à 17:28 Déconnecté(e)    Voir le profil de FpgForce Envoyer un email à FpgForce Envoyer un message privé à FpgForce  

c'est plus propre de le faire avec une union ^^
    
./Post n°12   Marquer comme non lu.
Kevin Kofler Ecrit le: Mercredi 4 janvier 2006 à 19:51 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


L'union PTR_VERS_GFX ne sert à rien! Sa taille est celle de l'élément le plus grand, donc 2 octets. Donc un PTR_VERS_GFX* ne sera jamais un char *. La seule solution est d'utiliser void *.

Mais sinon, Mario ne grandit qu'en hauteur normalement, ce n'est pas normal que tu aies à changer la largeur de ton sprite. Les fonctions de sprites de TIGCCLIB et ExtGraph gèrent très bien des mesures comme 8×16 ou même 8×12 ou 8×14. (La hauteur est en paramètre partout.)
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°13   Marquer comme non lu.
Jfg Ecrit le: Mercredi 4 janvier 2006 à 20:27 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


Mario varie peut être légèrement en largeur, de quoi passer de 16 pix à 17...

C'est vrai que dans ces cas là, il vaut peut être mieux enregistrer tous les sprites du perso sur 24 pix:
1/ c'est plus simple à programmer
2/ les sprites font tous 24 pix de large mais avec la compression ppg, on ne voit pas trop la différence en taille
3/ les sprites de mario peuvent tous être centrés correctement, et ce peut importe la taille.
Kill Mario
    
./Post n°14   Marquer comme non lu.
Thor Ecrit le: Mercredi 4 janvier 2006 à 22:20 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Je parlais de mario mais c'est pas du tout ce que je veux faire .... c'est seulement le principe :D.

La solution 3) de Jfg j'y avais égalmeent pensé mais je ne pensais pas à l'optimisation 2) donc j'avais abandonné l'idée. Maintenant je pense que je vais faire la solution qui consiste à enregistrer le sprites avec des pixels inutiles. De toute façon ça va m'éviter d'avoir à tester l'état (grand ou petit) du "mario" pour savoir en quel type caster
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°15   Marquer comme non lu.
Sasume Ecrit le: Jeudi 5 janvier 2006 à 11:50 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Sinon, tu peux faire un truc de ce genre, mais ça devient lourd :( :

struct s_graphics
{
  // Les données qui représentent ton espace graphique (par exemple tes écrans virtuels)
  void *light_screen,*dark_screen;
};

struct s_drawable
{
  void (*draw)(void *this,short x,short y,struct s_graphics *g);
};

struct s_sprite8
{
  struct s_drawable drawable;
  short h;
  unsigned char *data;
};

struct s_sprite16
{
  struct s_drawable drawable;
  short h;
  unsigned short *data;
};

enum e_mario_size {Mario_PETIT,Mario_GRAND};

struct s_mario
{
  struct s_drawable *sprite;
  short x,y;
  enum e_mario_size size;
};

enum e_sprite_id {Sprite_MARIO_PETIT,Sprite_MARIO_GRAND};

extern short sprites_h[];
extern void *sprites_data[];


void Graphics_init(struct s_graphcis *this,void *light_screen,void *dark_screen)
{
  this->light_screen = light_screen;
  this->dark_screen = dark_screen;
}

Sprite8_draw(struct s_sprite8 *this,short x,short y,struct s_graphics *g)
{
  // Appel d'une fonction d'extgraph
  GraySprite8_OR(this->data,x,y,this->h,g->light_screen,g->dark_screen);
}

Sprite8_init(struct s_sprite16 *this,short h,unsigned char *data)
{
  this->h = h;
  this->data = data;

  this->drawable.draw = Sprite8_draw;
}

Sprite16_draw(struct s_sprite16 *this,short x,short y,struct s_graphics *g)
{
  // Appel d'une fonction d'extgraph
  GraySprite16_OR(this->data,x,y,this->h,g->light_screen,g->dark_screen);
}

Sprite16_init(struct s_sprite16 *this,short h,unsigned short *data)
{
  this->h = h;
  this->data = data;

  this->drawable.draw = Sprite16_draw;
}

void Mario_init(struct s_mario *this,short x,short y)
{
  this->x = x;
  this->y = y;
  this->size = Mario_PETIT;

  this->sprite = loadSprite(Sprite_MARIO_PETIT);
}

void Mario_quit(struct s_mario *this)
{
  free(this->sprite);
}

void Mario_draw(struct s_mario *this,struct s_graphics *graphics)
{
  this->sprite->draw(this->sprite,this->x,this->y,graphics);
}

void Mario_move(struct s_mario *this,short x,short y)
{
  this->x = x;
  this->y = y;
}

void Mario_grandit(struct s_mario *this)
{
  this->size = Mario_GRAND;
  free(this->sprite);
  this->sprite = loadSprite(Sprite_MARIO_GRAND);
}

struct s_drawable *loadSprite(enum e_sprite_id id)
{
  switch(id)
  {
  case Sprite_MARIO_PETIT:
    {
      struct s_sprite8 *sprite = malloc(sizeof(struct s_sprite);
      Sprite8_init(sprite,sprites_h[id],sprites_data[id]);
      return &(sprite->drawable);
    }
    break;

  case Sprite_MARIO_GRAND:
    {
      struct s_sprite16 *sprite = malloc(sizeof(struct s_sprite16));
      Sprite16_init(sprite,sprites_h[id],sprites_data[id]);
      return &(sprite->drawable);
    }
    break;
  }
}

void _main(void)
{
  if(!GrayOn())
    return;

  struct s_graphics graphics;
  Graphics_init(&graphics,GrayGetPlane(LIGHT_PLANE),GrayGetPlane(LIGHT_PLANE));

  struct s_mario mario;
  Mario_init(&mario,0,0);

  Mario_draw(&mario,&graphics);
  Mario_move(&mario,50,50);
  Mario_grandit(&mario);
  Mario_draw(&mario,&graphics);

  Mario_quit();
  GrayOff();
}

Je n'ai pas testé, je viens d'écrire tout ce code, donc il y a peut-être des erreurs, mais l'idée est là.
-Edité le Jeudi 5 janvier 2006 à 11:51 par Sasume-
    
./Post n°16   Marquer comme non lu.
Thor Ecrit le: Jeudi 5 janvier 2006 à 12:36 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Euh oui ça m'a l'air un peu lourd! J'ai lu rapide mais en fait tu utilise un pointeur de fonction c'est ça?
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°17   Marquer comme non lu.
Sasume Ecrit le: Jeudi 5 janvier 2006 à 13:07 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Oui, mais pas seulement. Il y a toute une architecture.
    
./Post n°18   Marquer comme non lu.
Thor Ecrit le: Jeudi 5 janvier 2006 à 13:11 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Comme tu le dis ça complique légérement, je pense qu'ici ma solution sera de faire des sprites plus grands que nécessaire. De toute façon, mon problème ne nécessite pas obligatoirement de manier 2 type différent puisque ce ne sont que des données graphiques.
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°19   Marquer comme non lu.
Kevin Kofler Ecrit le: Jeudi 5 janvier 2006 à 16:42 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Pourquoi ce loadSprite? Moi, je mettrais tout simplement:
typedef void (*spritefunc_t)(short x, short y, short height, const void *sprite, void *vm_addr, short mode);

typedef struct sprite {
 void *data_d;
 void *data_l;
 void *data_m;
 unsigned short h;
 spritefunc_t drawfunc;
} sprite;

unsigned char smallmario_d[8]={1,2,3,4,5,6,7,8};
unsigned char smallmario_l[8]={1,2,3,4,5,6,7,8};
unsigned char smallmario_m[8]={1,2,3,4,5,6,7,8};
unsigned short bigmario_d[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
unsigned short bigmario_l[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
unsigned short bigmario_m[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
sprite sprites[]={{smallmario_d,smallmario_l,smallmario_m,8,(spritefunc_t)Sprite8},
                  {bigmario_d,bigmario_l,bigmario_m,16,(spritefunc_t)Sprite16}};

void DrawSprite(sprite *s, short x, short y)
{
  s->drawfunc(x,y,s->h,s->data_m,GrayGetPlane(DARK_PLANE),SPRT_AND);
  s->drawfunc(x,y,s->h,s->data_m,GrayGetPlane(LIGHT_PLANE),SPRT_AND);
  s->drawfunc(x,y,s->h,s->data_d,GrayGetPlane(DARK_PLANE),SPRT_OR);
  s->drawfunc(x,y,s->h,s->data_l,GrayGetPlane(LIGHT_PLANE),SPRT_OR);
}
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
  :: Index » Forum Ti68K » Programmation C » Trop de typage tue la programmation (20 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 87.99ms avec 18 requetes