IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Utiliser C sans verification de type


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut Utiliser C sans verification de type
    Bonjour

    J'aimerais me debrouiller avec les types moi-meme pour mon programme (un compilateur), alors je trouve que C me met des batons dans les roues. En gros je veux avoir une zone memoire reservee sur le tas, et dedans je vais mettre des entiers, des caracteres etc. ou bien des pointeurs vers une zone d'allocation pour les types qui sont trop grands.

    Voila ce a quoi je suis arrive:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // Declare la zone d'allocation
    #define INIT static void* buf[MYSTACKSIZE]; static void** stack = buf;
    // Place un "objet" dans la zone d'allocation
    #define STORO(type, ofs, val) (stack[ofs] = *(void**)&((type)val))
    // Place un pointeur dans la zone d'allocation
    #define STOR(ofs, val) (stack[ofs] = (void*)val)
    // Lis une variable
    #define READ(type, ofs) (*(type*)(stack+ofs))
     
    int main(int argc, char* args[])
    {
       INIT
       short k = 36;
       STOR(0, k);
       printf("%d\n", READ(short, 0));
       return 0;
    }
    Alors ca marche bien, mais le code ci-dessus me donne un warning que les donnees ne sont pas la meme taille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HelloWorld.c:49: warning: cast to pointer from integer of different size
    La solution que j'ai c'est d'utiliser le mysterieux "STORO" que j'ai defini plus haut, comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct
    {
       short value;
    } Short;
     
    ...
       STORO(Short, 0, {k});
       printf("%d\n", READ(short, 0));
    ...
    Est-ce que c'est la bonne solution? Y a-t-il quelque chose de plus simple? Ou bien j'accepte simplement les warnings et j'oublie STORO?

  2. #2
    Membre chevronné

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    Bon ben je suis bete, c'etait devant mes yeux et je ne le voyais pas. Voila la definition de STORO qui ne requiert pas des structs bizarres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define STORO(type, ofs, val) (*(type*)(stack + ofs) = val)
    Resolu tout seul, et voila!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Peu-t-on utiliser DIM sans préciser le type
    Par Henri-gp dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/07/2012, 11h11
  2. [SWT] utiliser SWT sans eclipse
    Par miel_pops dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 24/01/2009, 20h48
  3. [3D]Moteur de raytracing sans les bibliothèques type DirectX, que puis-je utiliser?
    Par cladsam dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 21/04/2006, 17h28
  4. utiliser query sans composant builder 5
    Par hook85 dans le forum C++Builder
    Réponses: 8
    Dernier message: 19/01/2005, 21h09
  5. utilisation de "LIKE" avec un type datetime dans r
    Par ericmart dans le forum Langage SQL
    Réponses: 8
    Dernier message: 06/11/2003, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo