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 :

Opération sur pointeurs


Sujet :

C

  1. #1
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut Opération sur pointeurs
    Salut,

    Je voudrais savoir s'il est acceptable d'effectuer des opérations sur les pointeurs, comme dans la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (int)(ptr_2 - ptr_1);
    Je n'ai rien trouvé de mieux pour trouver l'offset d'une chaine à l'intérieur d'une autre.

    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
    26
    27
    28
    29
    30
    31
    32
    #include <stdio.h>
    #include <string.h>
     
    #define PATTERN_NOT_FOUND -1
     
    int position(char* str_1, char*str_2);
    int position(char* str_1, char*str_2)
    {
        char* ptr_1 = &str_1[0];
        char* ptr_2 = strstr(str_1,str_2);
        if(ptr_2 == NULL)
        {
            return PATTERN_NOT_FOUND;
        }
        else
        {
            return (int)(ptr_2 - ptr_1);
        }
    }
     
    int main()
    {
        char str_1[] = "Hello World!";
        char str_2[] = "World";
        int pos = position(str_1,str_2);
     
        if(pos != PATTERN_NOT_FOUND)
            printf("\"%s\" found at offset %d in \"%s\"\n",str_2,pos,str_1);
        else
            printf("\"%s\" not found in \"%s\"\n",str_2,str_1);
        return 0;
    }
    A+

    Pfeuh

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je crois qu'il n'y a pas mieux non plus

    Juste 2 remarques et 1 pinaillage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* ptr_1 = &str_1[0];
    Cela fait bizarre, je préfère
    et même mieux, ne pas déclarer ptr_1 et utiliser dans cette fonction str_1

    Autre remarque, le prototype pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int position(const char * const str_1, const char * const str_2);
    et pareil pour la déclaration de la fonction car ta fonction ne modifie pas la valeur des pointeurs ni le contenu des objets pointés

    et enfin pour pinailler, 2 petits tests en entrant dans la fonction pour tester si les pointeurs ne sont pas NULL.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    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
    Je voudrais savoir s'il est acceptable d'effectuer des opérations sur les pointeurs,
    Oui, mais il y en a peu du genre "arithmétique":

    1- La différence entre deux pointeurs (sur un même type) qui donne un entier comme résultat (donc inutile de caster). Ceci n'a vraiment de sens que si les deux pointeurs pointent sur une même structure de données (le plus souvent un même tableau). L'addition de deux pointeurs est illégale.

    2 - L'addition d'un entier et d'un pointeur qui donne comme résultat un pointeur.

    3 - Soustraire un entier d'un pointeur ce qui donne comme résultat un pointeur.

    Par exemple, si p1, p2, p3 sont trois pointeurs, il est illégal d'écrire
    p1+p2-p3

    mais il est possible d'écrire :
    p1-p3+p2

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Merci pour vos réponses. Il y a un point qui reste obscur pour moi. Quand on dit "le prototype pourrait être:"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int position(const char * const str_1, const char * const str_2);
    Je comprends (si ça se trouve, je suis totalement à coté de la plaque) que le const définit une variable non modifiable (pourquoi y a t-il deux const pour la même variable?), donc que je ne pourrai pas utiliser la fonction avec une variable saisie par exemple au clavier.

    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
    int position(const char* const str_1, const char* const str_2);
    int position(const char* const str_1, const char* const str_2)
    {
        char* ptr;
        if(str_1 == NULL || str_2 == NULL)
        {
            return PATTERN_NOT_FOUND;
        }
        ptr = strstr(str_1,str_2);
        if(ptr == NULL)
        {
            return PATTERN_NOT_FOUND;
        }
        else
        {
            return ptr - str_1;
        }
    }
    A+

    Pfeuh

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 79
    Par défaut
    Explication du const char *const:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const char * toto; // la chaine de charactère est constante
    char * const titi; // le pointeur est constant
    const char *const toto; // la chaine et le pointeur sont constant
    Par contre, je n'en recontre pas souvent mais c'est mieux de le mettre

    Le const dans le prototype d'une fonction implique que ta variable et/ou le contenu ne sera pas modifié par cette fonction. Tu peux ainsi passer comme argument une chaine statique ("abcdef") mais aussi une variable qui contient par exemple une saisie au clavier. C'est surtout important pour les chaines statiques que tu passes en paramètre, le compilateur ne te mettra pas de warning et tu eviteras des crashs de ton programme.

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Cool, je viens d'essayer. Le compilateur génère carrément une erreur et non un warning si j'essaie de modifier la variable ou le pointeur dans la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int position(const char* const str_1, const char* const str_2)
    {
        char* ptr;
        str_1++;
        /*
        ...
        */
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C:\data\sources\C\dummy_console\main.c  In function `position': 
    C:\data\sources\C\dummy_console\main.c 10 error: increment of read-only location 
      === Build finished: 1 errors, 0 warnings ===
    Merci pour tout.

    A+

    Pfeuh

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Un meilleur prototype serais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptrdiff_t position(const char * const str_1, const char * const str_2)
    toutefois j'aurais préféré écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptrdiff_t position(char const * str_1, char const * str_2)

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 525
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 525
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Cool, je viens d'essayer. Le compilateur génère carrément une erreur et non un warning si j'essaie de modifier la variable ou le pointeur dans la fonction.
    [CODE]C:\data\sources\C\dummy_console\main.c In function `position':
    C:\data\sources\C\dummy_console\main.c 10 error: increment of read-only location
    Est-ce que tu comprends les erreurs affichées ?
    Le compilateur indique qu'il ne peut pas incrémenter un endroit mémoire marqué en lecture seule ( increment of read only location)
    Ce qui est logique puisque tu passes des variables de type const à la fonction

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 79
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Un meilleur prototype serais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptrdiff_t position(const char * const str_1, const char * const str_2)
    toutefois j'aurais préféré écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptrdiff_t position(char const * str_1, char const * str_2)
    Ce n'est pas la même chose, dans le premier cas tu as le pointeur de constant ainsi que la valeur. Dans le second cas tu as uniquement la valeur de constante, c'est à dire que tu ne peux pas changer une portion de ta chaine mais tu peux déférencer le pointeur (par exemple str_1++ est autorisé).

  10. #10
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Je sais bien que ce n'est pas la même chose.

  11. #11
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Est-ce que tu comprends les erreurs affichées ?
    Le compilateur indique qu'il ne peut pas incrémenter un endroit mémoire marqué en lecture seule ( increment of read only location)
    Ce qui est logique puisque tu passes des variables de type const à la fonction
    Oui, jusqu'à hier, je ne voyais pas ce que voulait dire const, mais là, ça y est, j'ai eu le déclic grâce à cette erreur.

    A+

    Pfeuh

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

Discussions similaires

  1. Opération sur les pointeurs
    Par TheSeb dans le forum Delphi
    Réponses: 11
    Dernier message: 24/04/2007, 09h20
  2. Opérations sur les matrices...
    Par aokiseiichiro dans le forum C
    Réponses: 32
    Dernier message: 28/07/2005, 17h10
  3. opération sur fermeture de fenêtre
    Par java_math dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 20/06/2004, 22h52
  4. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

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