macro

macro - C - Programmation

Marsh Posté le 02-08-2007 à 11:42:44    

salut,
 
j'ai 3 fichiers donc voici un extrait
 
fichier ECR_SIM.h

const char ecr_sim[]={
0,128,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
erc...


 
fichier afficher_bmp.h

//Entête de afficher_bmp.c
#ifndef _afficher_bmph
#define _afficher_bmph
 
unsigned char afficher_bmp(unsigned char * id_bmp,unsigned int attente_touche);
#define ecran(id_bmp) id_bmp
 
#endif //_afficher_bmph


 
 
afficher_bmp.c
 

#include "oem.h"
#include "libgr.h"
#include "afficher_bmp.h"
 
//ecrans
#include "ECR_SIM.h"
//
 
unsigned char afficher_bmp(unsigned char * id_bmp,unsigned int attente_touche)
{
 unsigned char touche=0;
 DisplayBitmap(0, 0, ecran(id_bmp), 8, _OFF_);
 if (attente_touche==1)
  touche = getchar();
 return touche;
}


 
mon problème se situe au niveau du DisplayBitmap qui prend en paramètre le buffer definis dans le .H  
je ne veux pas inclure mon ECR_SIM.h  dans chacun de mes autres fichiers C mais juste afficher_bmp.h et ensuite appeler afficher_bmp avec un afficher_bmp ("ecr_sim",0) par exemple.
j'ai fait une macro #define ecran(id_bmp) id_bmp pour gérer ca mais en fait non ca risque pas de marcher vu qu'une macro est interprétée au moment de la compilation
avez-vous une idée poru mon pb ?

Reply

Marsh Posté le 02-08-2007 à 11:42:44   

Reply

Marsh Posté le 02-08-2007 à 11:52:42    

.


Message édité par djobidjoba le 02-08-2007 à 11:57:43
Reply

Marsh Posté le 02-08-2007 à 11:56:57    

bon meme avec un switch ca va etre lourd étant donnée qu'on travail sur des chaines, ma question se résume donc à :
 
comment simplifier ce code :
 

if (memcmp(id_bmp,"ecr_sim" )==0)
  DisplayBitmap(0, 0, ecr_sim, 8, _OFF_);
else if (memcmp(id_bmp,"ecr_sim2" )==0)
  DisplayBitmap(0, 0, ecr_sim2, 8, _OFF_);
else if (memcmp(id_bmp,"ecr_sim3" )==0)
  DisplayBitmap(0, 0, ecr_sim3, 8, _OFF_);
else if (memcmp(id_bmp,"ecr_sim4" )==0)
  DisplayBitmap(0, 0, ecr_sim4, 8, _OFF_);
else if (memcmp(id_bmp,"ecr_sim5" )==0)
  DisplayBitmap(0, 0, ecr_sim5, 8, _OFF_);

Message cité 1 fois
Message édité par djobidjoba le 02-08-2007 à 11:57:27
Reply

Marsh Posté le 02-08-2007 à 15:22:11    

Heu, est-ce qu'il y a une impossibilité technique à mettre quelque part :
 

extern const char ecr_sim[];


 
Pour que tu puisses utiliser "ecr_sim" partout où tu veux ?

Reply

Marsh Posté le 02-08-2007 à 17:49:26    

merci c'est ok avec un "static"

Reply

Marsh Posté le 02-08-2007 à 18:11:02    

djobidjoba a écrit :

bon meme avec un switch ca va etre lourd étant donnée qu'on travail sur des chaines, ma question se résume donc à :
 
comment simplifier ce code :
 

if (memcmp(id_bmp,"ecr_sim" )==0)
  DisplayBitmap(0, 0, ecr_sim, 8, _OFF_);
else if (memcmp(id_bmp,"ecr_sim2" )==0)
  DisplayBitmap(0, 0, ecr_sim2, 8, _OFF_);
else if (memcmp(id_bmp,"ecr_sim3" )==0)
  DisplayBitmap(0, 0, ecr_sim3, 8, _OFF_);
else if (memcmp(id_bmp,"ecr_sim4" )==0)
  DisplayBitmap(0, 0, ecr_sim4, 8, _OFF_);
else if (memcmp(id_bmp,"ecr_sim5" )==0)
  DisplayBitmap(0, 0, ecr_sim5, 8, _OFF_);



 
[edit après réflexion de bjone]Déjà, il te manque un paramètre à memcmp(). Tu ne confonds pas avec strcmp() ???
 

typedef struct {
    char *string;
    int val;
} t_analyse;
 
t_analyse tabAnalyse[]={
    {"ecr_sim", ecr_sim1},
    {"ecr_sim2", ecr_sim2},
    {"ecr_sim3", ecr_sim3},
    {"ecr_sim4", ecr_sim4},
    {"ecr_sim5", ecr_sim5},
    {NULL, 0}
};
t_analyse *ptAnalyse;
 
for (ptAnalyse=tabAnalyse; ptAnalyse->string != NULL; ptAnalyse++)
{
    if (strcmp(id_bmp, ptAnalyse->string) == 0)
    {
        DisplayBitmap(0, 0, ptAnalyse->val, 8, _OFF_);
        break;      // Facultatif
    }
}


Message édité par Sve@r le 02-08-2007 à 19:27:09

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-08-2007 à 19:20:31    

pareil, le break est pas si faculatif sinon c'est le dernier qui gagne :)

Reply

Marsh Posté le 02-08-2007 à 19:23:23    

bin il doit y avoir moyen de gagner un peu avec d'abord un test de "ecr_sim" limité à la bonne taille, puis la gestion de la suite :D

Reply

Marsh Posté le 02-08-2007 à 19:24:06    

bjone a écrit :

pareil, le break est pas si faculatif sinon c'est le dernier qui gagne :)


Ben non !!! Je ne pense pas que "id_bmp" puisse être égal à la fois à "ecr_sim", "ecr_sim1", "ecr_sim2" etc... => le dernier qui gagne est forcément le seul à gagner
Sauf que c'est pas memcmp() qu'il faut utiliser (d'ailleurs il lui manque un paramètre) mais strcmp()...


Message édité par Sve@r le 02-08-2007 à 19:25:52

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-08-2007 à 19:26:26    

heu oui pardon :lol: :D

Reply

Marsh Posté le 02-08-2007 à 19:26:26   

Reply

Marsh Posté le 03-08-2007 à 14:28:53    

merci vous deux, effectivement il manquait un param à memcmp (j'avais tapé ca de tête, c'est "valider votre message" qui a compilé)
sinon j'ai utilisé un static pour éviter les redéfinition de constantes.
sinon je me pose toujours la question de savoir s'il est possible de faire ca en C :

 

id_bmp="toto"
toto=4
afficher(id_bmp) ====> 4

 

sans passer par un tableau de correspondance (avec une notation spéciale peut etre?)

Message cité 1 fois
Message édité par djobidjoba le 03-08-2007 à 14:31:05
Reply

Marsh Posté le 03-08-2007 à 16:14:34    

Non, ce n'est pas possible.

Reply

Marsh Posté le 03-08-2007 à 18:01:12    

djobidjoba a écrit :


sinon je me pose toujours la question de savoir s'il est possible de faire ca en C :
 
id_bmp="toto"
toto=4
afficher(id_bmp) ====> 4
 
sans passer par un tableau de correspondance (avec une notation spéciale peut etre?)


 

int toto=4
int *id_bmp=&toto
afficher(*id_bmp)   ====> 4


Message édité par Sve@r le 03-08-2007 à 18:01:39

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-08-2007 à 12:07:58    

toujours pas clair, mais en c++, tu as la std::map pour ça, mais en c++ :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed