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 :

Pointeur long et adresse non multiple de 4


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Par défaut Pointeur long et adresse non multiple de 4
    Bonjour,
    Peut-on manipuler des pointeurs long sur des adresses non multiples de 4 ?
    Je veux par exemple obtenir la valeur de quatres octets à l'adresse 1, 2, 3 et 4. Je fait comment vu que le compilateur multiplie automatiquement par 4 l'index quand on y accède par un pointeur long ?:
    ((unsigned long *)ptr)[1] va me donner les valeurs des octets 4, 5, 6 et 7.

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Par défaut
    oui tu peux en utilisant char* ou unsigned char*

    pour rappel, l'arithmetique des pointeurs, ca conciste a deplacer ton pointeur de n fois la taille de ton type octets, example :

    pour un char* c,
    c+1 est equivalent a (unsigned char *)c + 1 * sizeof(char)

    pour un int* i,
    i+1 est equivalent a (unsigned char *)i + 1 * sizeof(int)

    etc...

  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 Re:
    Citation Envoyé par _Michel Voir le message
    Bonjour,
    Peut-on manipuler des pointeurs long sur des adresses non multiples de 4 ?
    Je veux par exemple obtenir la valeur de quatres octets à l'adresse 1, 2, 3 et 4. Je fait comment vu que le compilateur multiplie automatiquement par 4 l'index quand on y accède par un pointeur long ?:
    ((unsigned long *)ptr)[1] va me donner les valeurs des octets 4, 5, 6 et 7.
    Tout ca c'est pas clair. Que veux-tu faire exactement? Déjà que tu supposes que la taille d'un long est 4.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    En supposant que ton architecture hôte le supporte (c'est le cas pour les x86) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void *pv = ... ;
    long val = *((long*)( ((char*)pv)+1 ));

    Code C en couleurs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void *pv = ... ;
    long val = *((long*)( ((char*)pv)+1 ));
    Il est possible que les parenthses vertes soient inutiles, mais j'ai toujours des doutes sur la priorité des casts...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Médinoc :
    Il est possible que les parenthses vertes soient inutiles,
    oui et les noires également.

    Il faut que _Michel se rende compte de ce qu'il va ainsi obtenir dans val et qu'il faudra utiliser des masques pour extraire les bytes (ce qui n'a pas simplifié le problème). Si il veut les bytes individuellement, il n'a qu'a utiliser un unsigned char *, pas un long* comme le dit seiron

  6. #6
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par _Michel Voir le message
    Bonjour,
    Peut-on manipuler des pointeurs long sur des adresses non multiples de 4 ?
    Je veux par exemple obtenir la valeur de quatres octets à l'adresse 1, 2, 3 et 4. Je fait comment vu que le compilateur multiplie automatiquement par 4 l'index quand on y accède par un pointeur long ?:
    ((unsigned long *)ptr)[1] va me donner les valeurs des octets 4, 5, 6 et 7.
    En général, le plus simple est de déclarer autant de pointeurs qu'on a d'arithmétiques de pointeurs à manipuler. On caste au départ, et après c'est naturel.
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
     
    #define TAILLE 2
     
    int main(void) {
    	int i, j;
    	unsigned long tablong[TAILLE] = { 0x01020304, 0x11121314 };
    	uint8_t*  curseur8  = NULL;
    	uint16_t* curseur16 = NULL;
    	for (i = 0; i < TAILLE; i++) {
    		curseur8 = (uint8_t*)(tablong + i); /* ou &tablong[i] */
    		for (j = 0; j < sizeof(unsigned long) / sizeof(uint8_t); j++) {
    			printf("0x%02x ", curseur8[j]);
    		}
    		puts("\nfini...");
    		curseur16 = (uint16_t*)(tablong + i); /* ou &tablong[i], ou curseur8 */
    		for (j = 0; j < sizeof(unsigned long) / sizeof(uint16_t); j++) {
    			printf("0x%04x ", curseur16[j]);
    		}
    		puts("\nfini...");		
    	}
    	return EXIT_SUCCESS;
    }
    Le résultat vous donnera une idée de ce qu'on appelle le boutisme...

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

Discussions similaires

  1. carnet d'adresses non partagés
    Par Gunner4902 dans le forum Thunderbird
    Réponses: 4
    Dernier message: 07/01/2008, 15h11
  2. Réponses: 7
    Dernier message: 04/06/2007, 12h23
  3. Pointeur de SOCKET ou non?
    Par psyphi dans le forum Réseau
    Réponses: 6
    Dernier message: 14/02/2007, 22h22
  4. Accès au net mais impossible de pinger des adresses non IP ?
    Par muad'dib dans le forum Dépannage et Assistance
    Réponses: 5
    Dernier message: 18/09/2006, 11h44

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