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 :

Fonction de pointeurs


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut Fonction de pointeurs
    Bonsoir à tous,

    Je pense que beaucoup de questions sur les pointeurs ont du vous être posé, cependant celle-ci est relative à une fonction particulière d'un programme.

    J'ai une ligne de code comme celle là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *((UINT32 *) ((UINT32)(&CAN0TXIDR0)))= u32ID;
    Et je ne comprend pas bien comment les pointeurs interagisse là dedans.

    Je tiens à préciser que "CAN0TXIDR0" est simplement un registre de 8 bits.

    Donc ma question est de savoir quel sont le rôle des pointeurs et de la ligne de code en question.

    En vous remerciant d'avance,

    Cordialement,

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    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
     
    CAN0TXIDR0 //ton registre
     
    (&CAN0TXIDR0) //adresse de ton registre
     
    (UINT32)valeur//change le type de la valeur en UINT32, c'est un cast.
     
    (UINT32)(&CAN0TXIDR0)) // UINT32
     
    (UINT32 *) // change le type de la valeur en une adresse pointant vers un objet UINT32
     
    (UINT32 *) ((UINT32)(&CAN0TXIDR0))); //UINT32 *
    par contre le (IUNT32) semble inutile, puisque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (UINT32 *)&CAN0TXIDR0;
    Donne le même résultat.

    Donc pour l'instant, tu as une adresse qui pointe vers un objet de type IUNT32 situé à l'adresse de CAN0TXIDR0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *((UINT32 *) ((UINT32)(&CAN0TXIDR0)))= u32ID;
    *a permet d'agir sur l'objet à l'adresse a
    Ici l'adresse est une adresse d'objet UINT32 (grâce au cast avec (IUNT32 *))
    Et cet objet prend la valeur de u32ID

    Donc au final, tu met u32ID dans un UINT32 qui se trouve à l'adresse de ton registre.

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je me demande quand même pourquoi on fait tout ça pour affecter une valeur 32 bits dans un registre 8 bits. Caster u32ID, si nécessaire, aurait été plus simple.

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut
    Tout d'abord, merci beaucoup pour votre réponse. Cela ma éclaircie sur le sujet.
    Effectivement je ne savais pas à quoi servait le UINT32, donc maintenant je comprend mieux.

    Merci encore et bonne soirée.

    Cordialement,

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Si il cast u32ID, il n'écrira que sur 8 bits (comme le registre fait 8 bits)
    Là, il écrit sur 32 bits en partant de l'adresse de son registre.

    Donc théoriquement, ici il écrit sur 4 registre (8*4).

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut
    Melem :

    Effectivement je ne sais pas non plus pourquoi. Cet ligne vient d'un exemple de code de chez Freescale et j'essaye de décoder certaines partie du programme qui me pose des difficultés.
    D'où la question.

    Voila, merci encore.

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Si il cast u32ID, il n'écrira que sur 8 bits (comme le registre fait 8 bits)
    C'est ce que je croyais qu'on voulait faire, vu qu'on n'avait pas le code au complet, mais ça serait évidemment trop de code pour rien. Comme tu l'as dit, on veut sûrement écrire sur 4 registres en une seule instruction.

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut
    Bonjour,

    J'ai analysé le code aujourd'hui. Et effectivement le cast permet de prendre 8 registre de 8 bits qui se suivent et de pouvoir y stocker la valeur souhaiter en une seule fois.

    Cependant, j'aurais une question encore. Je ne suis pas encore très à l'aise avec les pointeurs et je souhaiterais faire une nouvelle manipulation.

    En faite, je voudrais à présent faire la manipulation inverse :

    Prendre la valeur de mes 4 registres (le registre en question casté en 32 bits) et stocké le resultat du registre dans une variable de 32 bits.

    Auriez-vous une idée?

    En vous remerciant d'avance,

    Bien Cordialement,

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Est-ce qu'une simple inversion de la ligne ne ferait pas l'affaire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UINT32 u32ID = *((UINT32 *) ((UINT32)(&CAN0TXIDR0)));
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut
    Bonjour,

    Effectivement, j'ai essayer de le faire mais cela ne fonctionne pas. Cependant, je ne sais pas si cela ne viendrait pas peut-être du registre utilisé dans ma fonction.

    C'est pour cela que je voulais un avis concernant une possibilité pour pointer le registre en question et si cela pourrait fonctionner.
    Dans ce cas, je saurais que ce n'est pas la fonction du pointeur qui possède une erreur mais bien autre chose de présent dans ma fonction.

    Merci en tout cas pour votre réponse.

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Ce qui m'ennuie, moi, c'est qu'apparemment, le programme convertit d'abord une adresse en entier 32 bits, puis re-convertit cet entier en pointeur vers un entier 32 bits. Ces deux entiers n'ont bien sûr rien à voir entre eux.

    Si c'est sur une carte embarquée, ça peut avoir une justification mais si on porte ça sur PC, il suffit de passer sur une architecture 64 bits pour que le programme ne fonctionne plus.

  12. #12
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Kartoon67
    J'ai analysé le code aujourd'hui. Et effectivement le cast permet de prendre 8 registre de 8 bits qui se suivent et de pouvoir y stocker la valeur souhaiter en une seule fois.
    Tu voulais sûrement dire 4 registres de 8 bits.

    Effectivement, j'ai essayer de le faire mais cela ne fonctionne pas. Cependant, je ne sais pas si cela ne viendrait pas peut-être du registre utilisé dans ma fonction.
    Impossible. Si le code que tu as posté marche, celui de Bousk ne peut que marcher. Voyons cela de plus près ...

    Dans tout ce qui suit, on va désigner par CAN0TXIDR0, CAN0TXIDR1, CAN0TXIDR2 et CAN0TXIDR3 nos 4 registres de 8 bits, qui sont censés se suivre en mémoire.

    Si le code que tu as posté marche comme tu le dis, le suivant devrait successivement afficher 0, 1, 2 et 3, dans cet ordre ou dans l'orde inverse selon l'endianness. La plupart des microordinateurs à la maison sont en little-endian donc on devrait plutôt s'attendre à voir les résultats dans cet ordre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    *((UINT32 *) ((UINT32)(&CAN0TXIDR0)))= u32ID;
    printf("CAN0TXIDR0 = %u\n", CAN0TXIDR0);
    printf("CAN0TXIDR1 = %u\n", CAN0TXIDR1);
    printf("CAN0TXIDR2 = %u\n", CAN0TXIDR2);
    printf("CAN0TXIDR3 = %u\n", CAN0TXIDR3);
    Ensuite, si le code de Bousk marche, le suivant devrait nous afficher 0x03020100 ou 0x00010203, toujours selon l'endianness :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CAN0TXIDR0 = 0;
    CAN0TXIDR1 = 1;
    CAN0TXIDR2 = 2;
    CAN0TXIDR3 = 3;
    u32ID = *((UINT32 *) ((UINT32)(&CAN0TXIDR0)));
    printf("%#x\n", u32ID);
    Alors, qu'est-ce qui marche et qu'est-ce qui ne marche pas ?

  13. #13
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut
    Bonsoir,

    Oui, désolé, erreur de frappe de ma part. C'est bien 4 registres de 8 bit qui sont casté ensemble.

    Concernant le fonction de pointeur inversé, je l'est testé mais cela n'as pas fonctionné. Cependant, comme vous me l'avais justifier, elle devrait être fonctionnel.

    Je vais retester cela au boulot lundi et je vous tiendrais au courant du résultat.

    PS: Pour Obsidian, oui c'est bien une carte embarqué. C'est un microcontroleur 32bits.

    Merci à tous pour votre aide en tout cas. Cela m'as étais vraiment utilise.

    Bonne nuit à tous et bon dimanche.

  14. #14
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 140
    Par défaut
    Pour vous tenir au courant de ma problématique. Finalement, la fonction de Bousk à bien fonctionné, donc tout va bien.

    Merci à tous pour votre aide et bonne journée.

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

Discussions similaires

  1. Passage de tableau à une fonction par pointeur
    Par progfou dans le forum C++
    Réponses: 15
    Dernier message: 23/02/2007, 11h45
  2. Fonction et pointeur
    Par Flophx dans le forum C
    Réponses: 14
    Dernier message: 22/02/2007, 17h29
  3. Réponses: 8
    Dernier message: 10/03/2006, 17h28
  4. C++ Problème de fonctions et pointeurs
    Par zmatz dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2005, 16h20
  5. Réponses: 10
    Dernier message: 03/02/2005, 13h09

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