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 :

incrementer l'adresse d'un pointeur


Sujet :

C

  1. #21
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    merci des reponses je vais étudier cela.
    je trouve sympa qu'il y ait des passionés qui prenne le temps de repondre à des personnes en difficulter et d'expliquer les choses qui est plus important que de balancer du code.
    encore merci.
    au besoin je vous recontact

  2. #22
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par hegros
    Ok.A mon avis p_address_sdram++ ne suffit pas.


    Il faudrait plutot faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p_address_sdram+= sizeof data;
    Non surtout pas, c'est complétement inutile.

    Si tu as déclaré ton pointeur typé, tu n'as pas besoin de faire ceci. Le compilateur connait l'incrément à ajouter vu qu'il connait la taille (espace mémoire utilisé) par ton type.


    Tu utilises ton code seulement avec un pointeur de type void. Et encore, il est préférable de "caster" ton pointeur void vers un pointeur de type unsigned char.
    Bien le bonjour chez vous
    Jowo

  3. #23
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par jowo
    Non surtout pas, c'est complétement inutile.

    Si tu as déclaré ton pointeur typé, tu n'as pas besoin de faire ceci.
    Tu utilises ton code seulement avec un pointeur de type void. Et encore, il est préférable de "caster" ton pointeur void vers un pointeur de type unsigned char.
    Avec un pointeur de type unsigned char où est-ce que tu pointes en faisant une incrémentation dessus ? Sur la data suivante ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  4. #24
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par calagan
    salut,
    en fait je veux mettre des valeurs a des adresses successives dans un pointeur tout simplement.
    exemple: je met le valeur 0xffff à l'adresse 0,puis 1 puis 2,.........
    jespere que je suis un peu plus clair dans ce que je veux faire
    merci
    Je pense que tu confonds l’adresse physique de la SDRAM avec l’adressage de la SDRAM par le processeur.
    Si tu as une SDRAM 16 bits, les mots sont organisés ainsi :
    @0 => mot 0 de 16bits
    @1 => mot 1 de 16bits
    @2 => mot 2 de 16 bits
    et ainsi de suite.

    Maintenant si tu veux adresser ta SDRAM par le processeur, avec pour unité d’adressage l’octet (ça doit être le cas pour NIOS II), en faisant des accès 16 bits, les adresses doivent évoluer comme cela :
    @0 => mot 0 de 16bits
    @2 => mot 1 de 16bits
    @4 => mot 2 de 16 bits
    etc….

    Le code suivant devrait faire l’affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        unsigned short *adress_sdram = SDRAM_0_BASE;
        unsigned int cpt;
     
        for (cpt = 0; cpt < (SDRAM_0_SPAN+1)/sizeof(*adress_sdram) ; cpt++)
        {
            *adress_sdram = data;
             adress_sdram++;
        }
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  5. #25
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    cependant en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *address_adram = NULL
    mon pointeur sera rempli avec des caracteres??? mais moi je veux afficher des chiffres.
    ma variable data peut rester declarer en tant que alt_u16 (data sur 16 bits)

  6. #26
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par hegros
    Ok.A mon avis p_address_sdram++ ne suffit pas.


    Il faudrait plutot faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p_address_sdram+= sizeof data;
    C'est le PO qui voulais accéder à sa mémoire byte par byte. Ici, tu a meilleur temps de déclarer p_address_sdram comme un pointeur sur le type de data...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #27
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par calagan
    cependant en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *address_adram = NULL
    mon pointeur sera rempli avec des caracteres??? mais moi je veux afficher des chiffres.
    ma variable data peut rester declarer en tant que alt_u16 (data sur 16 bits)
    Rien à voir avec des caractères...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #28
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par crocodilex
    Le code suivant devrait faire l’affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        unsigned short *adress_sdram = SDRAM_0_BASE;
        unsigned int cpt;
     
        for (cpt = 0; cpt < (SDRAM_0_SPAN+1)/sizeof(*adress_sdram) ; cpt++)
        {
            *adress_sdram = data;
             adress_sdram++;
        }
    Je commence à comprendre. Dans ce cas, SDRAM_0_SPAN n'est pas une adresse absolue, mais un offset par rapport à SDRAM_0_BASE (en bytes)?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #29
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    DEMANDE

    Veuillez excuser mon ignorance que signifie PO (langage SMS?) ?

    Pauvre Outilisateur?
    Bien le bonjour chez vous
    Jowo

  10. #30
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par mujigka
    Je commence à comprendre. Dans ce cas, SDRAM_0_SPAN n'est pas une adresse absolue, mais un offset par rapport à SDRAM_0_BASE (en bytes)?

    Thierry
    En fait c'est ce que j'en aie déduit à partir du post suivant :
    http://www.developpez.net/forums/sho...19&postcount=7

    Mais je peux me tromper
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  11. #31
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par jowo
    DEMANDE

    Veuillez excuser mon ignorance que signifie PO (langage SMS?) ?

    Pauvre Outilisateur?
    Excuse-moi, il s'agit de l'acronyme consacré pour parler de l'auteur original de la discussion (Posteur Original). Rien de péjoratif, je te rassure!

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #32
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    en effet SDRAM_0_SPAN et un offset qui est aussi l'adresse de fin de la memoire utilisée:
    16bits*2^13 bits d'adresses*4 banks.

    a quoi correspond la ligne avec le sizeof
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (cpt = 0; cpt < (SDRAM_0_SPAN)/sizeof(*adress_sdram) ; cpt++)
        {
            *adress_sdram = data;
             adress_sdram++;
             printf("data:%d\n",cpt);
        }

  13. #33
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par calagan
    en effet SDRAM_0_SPAN et un offset qui est aussi l'adresse de fin de la memoire utilisée:
    16bits*2^13 bits d'adresses*4 banks.

    a quoi correspond la ligne avec le sizeof
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (cpt = 0; cpt < (SDRAM_0_SPAN)/sizeof(*adress_sdram) ; cpt++)
        {
            *adress_sdram = data;
             adress_sdram++;
             printf("data:%d\n",cpt);
        }
    Si SDRAM_0_SPAN représente l'offset de la fin de mémoire utilisée en bytes, que la taille du type de *address_sdram correspond à celle d'une case ou unité adressable de ta mémoire physique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SDRAM_0_SPAN)/sizeof(*adress_sdram)
    correspond à l'offset de la fin de ta mémoire en nombre de cases (et non en bytes)

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  14. #34
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Heu, j'avais écris ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (cpt = 0; cpt < (SDRAM_0_SPAN+1)/sizeof(*adress_sdram) ; cpt++)
    et non pas :
    Citation Envoyé par calagan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (cpt = 0; cpt < (SDRAM_0_SPAN)/sizeof(*adress_sdram) ; cpt++)
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  15. #35
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 39
    Points : 12
    Points
    12
    Par défaut
    un petit truc me tracasse en declarant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *adress_sdram = SDRAM_0_BASE;
    est-ce que je pourrait accéder à toute ma plage mémoire ?????
    je rappel 0x0000000->0x3FFFFFF
    merci

  16. #36
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par calagan
    un petit truc me tracasse en declarant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *adress_sdram = SDRAM_0_BASE;
    est-ce que je pourrait accéder à toute ma plage mémoire ?????
    je rappel 0x0000000->0x3FFFFFF
    merci
    Il s'agit d'une initialisation.
    Ce qui veut dire que tu commences à travailler à l'adresse SDRAM_O_BASE (normalement qui vaut 0x0000000 si je comprends bien) donc tu pointes sur 0x0000000 au début.

    Pour parcourir ta mémoire il faut regarder la boucle for donnée juste au dessus.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  17. #37
    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 hegros
    Ok.A mon avis p_address_sdram++ ne suffit pas.


    Il faudrait plutot faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p_address_sdram+= sizeof data;
    Si p_address_sdram est de type unsigned char, oui. Si il est de type data, p_address_sdram++ est correct. C'est le B.A. BA de l'arithmétique des pointeurs...

    Pour faire des accès au matériel comme ça, il faut des pointeurs sur des données de taille précise. Essayer uint16_t (C99) ou unsigned short (vérifier que sur cette implémentation, il fait bien 16-bit).

    S'assurer aussi que l'endianess de la machine est bien compatible avec celle de la mémoire. Si elle est lue par ne machine d'endianness différente, tout va foirer...
    Pas de Wi-Fi à la maison : CPL

  18. #38
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Si p_address_sdram est de type unsigned char, oui. Si il est de type data, p_address_sdram++ est correct. C'est le B.A. BA de l'arithmétique des pointeurs...
    Je disais justement cela parce que le type était unsigned char *en tout cas c'est ce qu'il me semble avoir lu.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  19. #39
    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 calagan
    bonjour à tous,
    voici mon probleme, je fais un petit soft permettant de venir ecrire puis lire dans une sdram.
    l'utilise un pointeur d'adresse u32*adress_data.
    le probleme étant que je veux écrire à toutes les adresses mais quand je fais
    adress_data++; bien sure l'adresse est incrementer de 4;
    la sdram utiliser va de l'adresse 0x00000000->0x03ffffff;

    si quelqu'un aurait une solution .
    merci
    Il est évident que si tu utilises un type u32, et que bytes font 8 bits, l'incrémet est de 32 / 8 = 4 bytes, en toute logique.

    Ce que tu veux faire n'est pas portable pour de nombreuses raisons.

    As-tu bien accès à la mémoire physique, et non à la mémoire logique (MMU) ?

    Quelle est la taille des bytes sur ta machine ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <limits.h>
     
       printf ("CHAR_BIT = %d\n", CHAR_BIT);
    Si c'est bien 8, tu peux accéder à toutes les adresses de cette zone mémoire avec un pointeur de type unsigned char :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define SDRAM_MIN 0x00000000
    #define SDRAM_MAX 0x03fffffful
     
    ...
     
       unsigned char *p = (unsigned char *) SDRAM_MIN;
    chaque incrémentation de p pointera sur le byte suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       while (p <= SDRAM_MAX)
       {
          /* faire ce qu'on a a faire avec p... */
          p++;
       }
    Pas de Wi-Fi à la maison : CPL

  20. #40
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par hegros
    Je disais justement cela parce que le type était unsigned char *en tout cas c'est ce qu'il me semble avoir lu.
    Le type était précisément unsigned char * parce que l'auteur du post désirait accéder à toutes les adresses de la zone mémoire à sa disposition.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/05/2010, 11h49
  2. Réponses: 1
    Dernier message: 28/08/2009, 17h31
  3. Réponses: 15
    Dernier message: 30/09/2008, 23h36
  4. Adresse d'un pointeur
    Par Stnaire dans le forum Réseau
    Réponses: 18
    Dernier message: 17/11/2007, 06h56
  5. [TP] Afficher l'adresse d'un pointeur
    Par So_nya dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 14/09/2007, 01h25

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