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 :

Comment utiliser un pointeur dont le nom est dans un chaine de caractère ?


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Comment utiliser un pointeur dont le nom est dans un chaine de caractère ?
    Bonjour a tous !

    Voici mon problème :
    J'ai dans un fichier le nom d'un pointeur (vers bitmap en l'occurence). Je suis donc contraint de récupérer le nom de ce pointeur dans un chaine de caractère (un tableau), mais je n'arive pas ensuite à me servir du nom du pointeur pour acceder a la zone pointée, puisque le nom du dit pointeur est dans un tableau de caractère.

    Pour plus de clareté voici mon petit code (qui bug bien sur!) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          /* Lecture du nom du pointeur vers bitmap */
          fscanf(fp, "%s",fic);
          strcpy(nom_du_pointeur,fic);
     
          /* Utilisation du nom du pointeur pour acceder a la zone pointé par le pointeur qui porte le nom rentré dans la chaine de caractère */
          masked_blit(nom_du_pointeur,screen,0,0,10,10,50,50);
    La fonction masked_blit est une fonction ALLEGRO, de type :

    void masked_blit (BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height)
    Le problème étant que ma le nom du pointeur BITMAP *source est dans une chaine de caractère, et j'aimerai bien que ce soi le pointeur lui meme qui soit à la place du BITMAP *source.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BITMAP * image;
    strcpy(nom_du_pointeur,"image");
    J'aimerai me servir de la chaine "image" contenue dans le tableau de caractère nom_du pointeur pour acceder au pointeur image.

    J'éspere que c'est clair, merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par yanthorpes
    J'ai dans un fichier le nom d'un pointeur
    : Données de fichier et pointeur sont des noms qui ne vont pas ensemble... Quand à un "nom de pointeur", qu'est-ce que ça peut bien être ?
    (vers bitmap en l'occurence). Je suis donc contraint de récupérer le nom de ce pointeur dans un chaine de caractère (un tableau), mais je n'arive pas ensuite à me servir du nom du pointeur pour acceder a la zone pointée, puisque le nom du dit pointeur est dans un tableau de caractère.
    J'ai absolument rien compris. Avant d'aller plus loin, quelles sont les données du fichier et comment ont-elles été enregistrées ?

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Pourquoi stocker les pointeurs dans un fichier et pas un tableau par exemple?

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ton pointeur lors de l'exécution du programme n'a pas de nom, l'identifiant que tu lui donne pendant la phase de développement n'est autre qu'un identifiant car il est plus simple de travailler avec un nom qu'avec une adresse ... adresse, c'est ce que cache l'identifiant de ton pointeur, ni plus, ni moins, je ne pense pas que ce que tu veuilles faire soit possible !

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    En effet, à vue de pif, tu as l'air de sous entendre qu'on pourrait retrouver et utiliser à l'éxecution des chaînes de caractères comme des variables... ceci existe pour CERTAINS langages, c'est la Reflection, mais C ne le supporte pas...

    tu serais en C++ je t'aurais conseillé une map<string, pointeur> mais là, à part une série de if() { } else if() { } en comparant à chaque fois ton char* au nom de ton pointeur... je ne crois pas qu'il soit possible de faire ce que tu veux faire...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour toutes vos réponsses !!

    En fait, j'utilise le fichier comme une fiche d'information permetant a mon programme de savoir quels bitmaps afficher.

    Par exemple, lorsque je veux qu'il affiche une pomme, puis un bateau, dans mon fichier je vait écrire :

    pomme 10 10
    bateau 50 10

    ("10 10" et "50 10" sont les coohordoné auquels je veut que ma pomme et mon bateau aparaissent)

    Je récupère - en lisant mon fichier - "pomme" dans un tableau de caractère. Comme j'ai déja chargé en mémoire un pointeur vers bitmap (de ma pomme) qui s'appelle pomme, je voudrai que lorque je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    masked_blit(chaine_de_caractère, screen,x,y, 50, 50)
    le compilateur remplace chaine_de_caractère par l'iddentifiant de mon pointeur !

    J'ai ré-expliqué un peu mon problème, mais CSoldier et Swoög avez bien cerné mon problème. Merci donc pour vos information !

    Je vais esseyer de faire comme tu m'a di Swoög, avec de if... else... (ça me semble pas très propre, mais si on peu pas faire autrement...!).
    Au passage, c'est possible de faire des switch avec des chaine de caractère ? (ça serait moin lourd que des if... else)

    Merci en tout cas !

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Hum à ce compte là le mieux aurait été une liste chainée ou un tableau de structure, structure contenant une chaine (ID, par exemple qui contient "pomme"), puis une pointeur vers le bitmap en question !

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ah oui en effet c'est une super idée !
    Mais j'arrive pas à le coder

    Voici mon code :

    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
    typedef struct id_bmp
    {
            char nom[20];
            BITMAP* pt;
    } t_id_bmp;
     
    BITMAP *pt, *pomme;
    t_id_bmp a = {"pomme",pomme};
     
     
    // ... tout un petit bazard
     
    fscanf(fp, "%s",fic);
    strcpy(img.nom,fic);
    if (strcmp(img.nom,a.nom)==0) pt = a.pt;
     
    masked_blit(pt, page, 0, 0,img.x, img.y, 10, 10);
    Le pointeur vers bitmap pt devrait en principe pointer sur la meme bitmap que le pointeur pomme ? non ?

  9. #9
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    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
    18
    19
    20
    21
    22
    23
     
    typedef struct
    {
       char nom[50];
       void *ptr;
     
    } images;
     
    images img[] = 
    {
        { "pomme", NULL },
        { "bateau", NULL },
    };
     
    int i = 0;
    for( i; i < 2; i++)
    {
        if ( strcmp(img[i].nom, machaine) == 0 ) // remplacer machaine
        {
            masked_blit( img[i].ptr, screen,x,y, 50, 50);
            break;
        }
    }
    N'oublies pas d'insérer les pointeur dans img.

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Je ne vois pas grand chose à rajouter, un pointeur void* est bien dans le cas où si un jour tu changes de lib ou le type du pointeur qui en l'occurence dans ton cas est BITMAP pour le moment.
    Si tout se passe en gestion dynamique pour l'ajout de nombre d'enregistrement, je pense qu'une liste chaînée reste bien plus pratique mais est un peu plus long à mettre en oeuvre !

  11. #11
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Swoög
    En effet, à vue de pif, tu as l'air de sous entendre qu'on pourrait retrouver et utiliser à l'éxecution des chaînes de caractères comme des variables... ceci existe pour CERTAINS langages, c'est la Reflection, mais C ne le supporte pas...

    tu serais en C++ je t'aurais conseillé une map<string, pointeur> mais là, à part une série de if() { } else if() { } en comparant à chaque fois ton char* au nom de ton pointeur... je ne crois pas qu'il soit possible de faire ce que tu veux faire...
    En fait il existe une solution pour ca, mais c'est extremement affreux.

    Ca consiste a reecrire du code a partir des chaines de caracteres, puis a le compiler et ensuite a l'utiliser, par exemple comme une librairie dynamique.

    Mais c'est moche...

  12. #12
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Jack_serious
    En fait il existe une solution pour ca, mais c'est extremement affreux.

    Ca consiste a reecrire du code a partir des chaines de caracteres, puis a le compiler et ensuite a l'utiliser, par exemple comme une librairie dynamique.

    Mais c'est moche...
    et surtout ça ressemble fort à une usine à gaz, je préfère encore me tapper une série de if () {} else if () {} ... à la main

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oulaaa, librairie dynamique jconnait pas tout ça moi !
    Bref, pour le moment je préfère utiliser un tableau de structure, je débute seulement en liste chainés...

    Mayti4, le code que tu m'a fillé ne marche pas... Enfin, c'est peut etre de ma faute aussi !

    Voici 2 codes (le premier fonctionne, l'autre non):

    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
    18
    19
    20
    21
    22
    23
    24
    25
     typedef struct
    {
       char nom[50];
       void *ptr;
    
    } images;
    BITMAP *pomme, *bateau;
    
    images img[] = 
    {
        { "pomme", NULL },
        { "bateau", NULL },
    };
    img[1].ptr = pomme;
    img[2].ptr = bateau;
    
    int i = 0;
    for( i; i < 2; i++)
    {
        if ( strcmp(img[i].nom, machaine) == 0 ) // remplacer machaine
        {
            masked_blit( img[i].ptr, screen,x,y, 50, 50);
            break;
        }
    }
    2em code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    typedef struct
    {
       char nom[50];
       void *ptr;
    
    } images;
    BITMAP *pomme, *bateau;
    
    images img[] = 
    {
        { "pomme", pomme },
        { "bateau", bateau },
    };
    
    
    int i = 0;
    for( i; i < 2; i++)
    {
        if ( strcmp(img[i].nom, machaine) == 0 ) // remplacer machaine
        {
            masked_blit( img[i].ptr, screen,x,y, 50, 50);
            break;
        }
    }
    Pourquoi suis-je contraint de devoir remplir le champ "ptr" à part ?

    J'oubliai ! Merci pour vos réponsses ! C'est génial

  14. #14
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Cool si ça marche

    au fait, Dans outils de la discussion, en haut, il y a un petit truc pour dire que ton problème est résolu

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oups je me suis trompé ! Les 2 codes marchent !
    C'est parce que entre la déclaration de la structure et la boucle for, je fesait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pomme=load_bitmap("pomme.bmp",NULL);
    Ce qui a pour effet de modifier le pointeur pomme ! Je vait donc metre cette ligne avant la déclaration de la structure. (et tant pis si je met des instructions avant les declarations !

    Meric a tous en tout cas ! Et désolé Mayti4 pour avoir douté de la pertinence de ton code !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/05/2008, 10h54
  2. Comment appeler une méthode dont le nom est dans un string?
    Par Ireon dans le forum API standards et tierces
    Réponses: 22
    Dernier message: 13/04/2007, 17h22
  3. Réponses: 3
    Dernier message: 05/10/2006, 18h52
  4. Réponses: 4
    Dernier message: 18/08/2006, 07h57
  5. Appel de methode dont le nom est dans une variable
    Par osopardo dans le forum Langage
    Réponses: 1
    Dernier message: 24/11/2005, 20h56

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