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 :

question de débutant sur les pointeurs.


Sujet :

C

  1. #1
    maz
    maz est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 18
    Points : 16
    Points
    16
    Par défaut question de débutant sur les pointeurs.
    Si l'on considère une fonction quelconque faisant une opération sur un string,
    par exemple une lecture de fichier, à un moment on peut utiliser soit :
    char *tampon;
    soit
    char tampon[long=une valeur suffisante];
    pour stocker les données sur lesquelles on va travailler...
    quelle est la différence ? Laquelle on utilise généralement et pourquoi?

    Merci d'avance...

  2. #2
    Membre régulier Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par maz
    Si l'on considère une fonction quelconque faisant une opération sur un string,
    par exemple une lecture de fichier, à un moment on peut utiliser soit :
    char *tampon;
    soit
    char tampon[long=une valeur suffisante];
    pour stocker les données sur lesquelles on va travailler...
    quelle est la différence ? Laquelle on utilise généralement et pourquoi?

    Merci d'avance...
    utilise char* tampon qd la taille de la zone que tu vas allouer est variable.
    utilise char tampon[n] qd la taille de ta string est fixe, neammoins evite dans ce cas là de déclarer à l'interieur de tes fonctions des chaines de caractères trop longues sinon tu risques d'exploser ta mémoire.

  3. #3
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par maz
    pour stocker les données sur lesquelles on va travailler...
    quelle est la différence ? Laquelle on utilise généralement et pourquoi?
    Quelques liens pour t'aider à comprendre:
    http://emmanuel-delahaye.developpez....s.htm#pile_tas
    allocation de mémoire

  4. #4
    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 maz
    Si l'on considère une fonction quelconque faisant une opération sur un string,
    par exemple une lecture de fichier, à un moment on peut utiliser soit :
    char *tampon;
    soit
    char tampon[long=une valeur suffisante];
    pour stocker les données sur lesquelles on va travailler...
    quelle est la différence ? Laquelle on utilise généralement et pourquoi?
    Le premier cas est un pointeur non-initialisé. Je ne vois pas comment une fonction de lecture standard pourrait l'utiliser sans provoquer un comportement indéfini, vu que sa valeur est indéterminée. Par contre, un tableau de char d'une taille raisonnable, oui, c'est fait pour.

    3 ème cas que tu n'as pas évoqué :

    Donner une valeur valide au pointeur, par exemple en y stockant l'adresse d'un bloc alloué avec malloc().

    On utilise une taille fixe quand on connait la taille à la compilation, ou si la taille est raisonnable (pas plus d'une centaine de char).

    On utilise la mémoire allouée dans les autres cas.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Je n'aurais pas dit mieux.

    Cependant, il y a tout de même quelque chose qui me tracasse, et c'est le côté "magique" que la plupart des profs de C (mais pas tous, hein !) donnent au "char *"... comme si c'était un type super-spécial, alors qu'il s'agit d'un vulgaire pointeur sur un caractère.

    Je te donnerais un autre conseil, si tu me le permets. Dès que tu peux utiliser des vecteurs (ou des tableaux), automatiques ou non, fais-le.

    En effet, si, par exemple après avoir initialisé la variable "char *tampon" par un appel à malloc(), tu accèdes aux éléments à la façon d'un vecteur (comme "tampon[i]" pour avoir le i_ème caractère), celà permet en général de rendre les choses plus compréhensibles, car on peut mieux apprécier la juste représentation physique de la chose. Surtout que, en général, il est fortement conseillé, d'après les fabricants de processeurs, de procéder de la sorte pour des questions d'optimisations, plutôt que via des pointeurs.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  6. #6
    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 InOCamlWeTrust
    Je n'aurais pas dit mieux.

    Cependant, il y a tout de même quelque chose qui me tracasse, et c'est le côté "magique" que la plupart des profs de C (mais pas tous, hein !) donnent au "char *"... comme si c'était un type super-spécial, alors qu'il s'agit d'un vulgaire pointeur sur un caractère.
    http://emmanuel-delahaye.developpez.....htm#char_star
    En effet, si, par exemple après avoir initialisé la variable "char *tampon" par un appel à malloc(), tu accèdes aux éléments à la façon d'un vecteur (comme "tampon[i]" pour avoir le i_ème caractère), celà permet en général de rendre les choses plus compréhensibles, car on peut mieux apprécier la juste représentation physique de la chose. Surtout que, en général, il est fortement conseillé, d'après les fabricants de processeurs, de procéder de la sorte pour des questions d'optimisations, plutôt que via des pointeurs.
    [] vs *, ça dépend complètement de l'implémentation. On ne peut affirmer quelque chose que si on a fait des mesures dans des conditions décrites et reproductibles.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    En effet, si, par exemple après avoir initialisé la variable "char *tampon" par un appel à malloc(), tu accèdes aux éléments à la façon d'un vecteur (comme "tampon[i]" pour avoir le i_ème caractère), celà permet en général de rendre les choses plus compréhensibles, car on peut mieux apprécier la juste représentation physique de la chose. ...
    C'est vrai que ca peut être "plus parlant"
    ...Surtout que, en général, il est fortement conseillé, d'après les fabricants de processeurs, de procéder de la sorte pour des questions d'optimisations, plutôt que via des pointeurs.
    ??? sauf erreur de ma part, une expression telle que A[i] est interprétée et transcrite par le compilateur par *(A+i).
    Le compilateur ne s'interresse qu'à l'adresse des variables !
    Citation Envoyé par maz
    Si l'on considère une fonction quelconque faisant une opération sur un string,
    par exemple une lecture de fichier, à un moment on peut utiliser soit :
    char *tampon;
    soit
    char tampon[long=une valeur suffisante];
    pour stocker les données sur lesquelles on va travailler...
    On ne peut absolument pas utiliser char * Tampon pour stocker des caractères.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par diogene
    ??? sauf erreur de ma part, une expression telle que A[i] est interprétée et transcrite par le compilateur par *(A+i).
    Le compilateur ne s'interresse qu'à l'adresse des variables !
    Non. A[i] est SEMANTIQUEMENT parlant équivalent à *(A + i)... mais au niveau compilation, il peut y avoir une grande différence, et ce à cause des modes d'adressage du processeur.

    Lorsque je parlais d'accéder aux valeurs d'un vecteur via la notation "vecteur" en tant qu'optimisation, je me réferrais surtout aux machines x86. On pourra faire des tests (mais avec les optimisations du compilateur activées) et/ou on pourra aussi aller voir ce qu'en pensent des fabricants comme AMD (lire leur manuel des optimisations).
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    Non. A[i] est SEMANTIQUEMENT parlant équivalent à *(A + i)... mais au niveau compilation, il peut y avoir une grande différence, et ce à cause des modes d'adressage du processeur.
    Avec un compilateur recent et performant et avec des options d'optimisation correctement reglees, le code genere a une assez grande probabilite d'etre le meme pour les deux notations.

  10. #10
    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 InOCamlWeTrust
    Non. A[i] est SEMANTIQUEMENT parlant équivalent à *(A + i)... mais au niveau compilation, il peut y avoir une grande différence, et ce à cause des modes d'adressage du processeur.
    On s'en fout... Sauf bouse innommable, le compilateur fait ce qu'il faut...
    Lorsque je parlais d'accéder aux valeurs d'un vecteur via la notation "vecteur" en tant qu'optimisation, je me réferrais surtout aux machines x86. On pourra faire des tests (mais avec les optimisations du compilateur activées) et/ou on pourra aussi aller voir ce qu'en pensent des fabricants comme AMD (lire leur manuel des optimisations).
    Oui, enfin, ici, on fait du C. L'écriture du code assembleur optimisé est confié au compilateur qui n'est pas fait par des bras cassés... Un programmeur C du 21 ème siècle n'a que faire de ces détails, on est plus dans les années 1970...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    On s'en fout... Sauf bouse innommable, le compilateur fait ce qu'il faut...
    Oui, enfin, ici, on fait du C. L'écriture du code assembleur optimisé est confié au compilateur qui n'est pas fait par des bras cassés... Un programmeur C du 21 ème siècle n'a que faire de ces détails, on est plus dans les années 1970...
    Si tu connaissais le document en question, tu saurais ce dont je parle.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  12. #12
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    Non. A[i] est SEMANTIQUEMENT parlant équivalent à *(A + i)... mais au niveau compilation, il peut y avoir une grande différence, et ce à cause des modes d'adressage du processeur.
    C'est, je crois, dans la norme (et d'un point de vue non sémantique) et cela n'a sans doute pas échappé à ceux qui ont écrit le compilateur (que rien ne permet de supposer débiles ou incompétents au point d'ignorer les modes d'adressages du processeur cible)
    Citation Envoyé par Emmanuel
    On s'en fout...le compilateur fait ce qu'il faut
    +1
    Citation Envoyé par Emmanuel
    on est plus dans les années 1970...
    c'est vrai, hélas pour mes artères
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  13. #13
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    Si tu connaissais le document en question, tu saurais ce dont je parle.
    De quel document parles-tu ?

  14. #14
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    De celui-ci :

    http://www.amd.com/us-en/assets/cont...docs/25112.PDF

    ... Chapitre 2.

    Cependant, je suis d'accord : un compilateur qui sait bien optimiser engendrera un code proche pour *(A + i) et A[i], mais rien ne nous l'assure, et du fait que le code présente une addition explicite et que je n'ai aucune garantie quant à la façon de compiler (de manière générale), je préfère éviter ce genre de chose (surtout que je ne trouve pas ça lisible du tout).
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    De celui-ci :

    http://www.amd.com/us-en/assets/cont...docs/25112.PDF

    ... Chapitre 2.

    Cependant, je suis d'accord : un compilateur qui sait bien optimiser engendrera un code proche pour *(A + i) et A[i],
    Ce document (qui me semble apres une lecture rapide assez interessant) decrit en gros les optimisations possibles pour une famille de processeurs, de ce fait :
    - ce qui est dit n'est valable que pour les processeurs en question
    - il n'y a pas de relation bijective entre le code source et l'executable. Un bon compilateur devrait generer, dans les meme conditions, le meme code pour les deux notations. C'est d'ailleurs ce qui est dit dans le document en question :

    Source-code transformations interact with a compiler’s code generator, making it difficult to control the generated machine code from the source level.
    Citation Envoyé par InOCamlWeTrust
    mais rien ne nous l'assure,
    A ce moment la, il faut faire des mesures. Et si effectivement les deux notations ne sont pas equivalentes, il convient d'utiliser la plus adapte (ou de changer de compilateur si c'est possible). C'est d'ailleurs la encore ce qui est dit dans le document :

    Compare the performance of
    your code after implementing a source-code transformation with the performance of the original code
    to be sure that there is an improvement.
    Citation Envoyé par InOCamlWeTrust
    et du fait que le code présente une addition explicite et que je n'ai aucune garantie quant à la façon de compiler (de manière générale), je préfère éviter ce genre de chose (surtout que je ne trouve pas ça lisible du tout).
    Sur le point de la lisibilite, je te rejoins. Je trouve que A[i] est, sauf cas particulier, plus lisible que *(A + i).
    Concernant "l'optimisation", lorsqu'il y a une difference de vitesse significative (donc lorsque les deux notations ne produisent pas le meme code executable), ca depends des compilateurs. D'ailleurs sur ce point, le document ne tranche pas reelement la question:

    Using array notation makes the task of the optimizer easier by reducing possible aliasing.
    mais aussi

    Depending on the compiler and the specific source code, it is possible for pointer-style code to compile into machine code that is faster than that generated from equivalent array-style code.

  16. #16
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    On est d'accord, à ceci près que la plupart des conseils donnés dans le Chapitre 2 (celui consacré au C) s'étendent également à d'autres familles de processeurs. On peut voir cette partie comme un ensemble de règles assez portables exploitant les caractéristiques des compilateurs intelligents actuels, mais aussi des caractéristiques présentes dans tous les processeurs modernes (voir ce qui est dit à propos du "parallèlisme explicite").
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

Discussions similaires

  1. question de débutant sur les threads
    Par Virgile le chat dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 27/06/2007, 17h10
  2. [C#] question de débutant sur les threads?
    Par Jayceblaster dans le forum C#
    Réponses: 6
    Dernier message: 27/11/2006, 10h52
  3. question de débutant sur les jointures
    Par dreamcocktail dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/03/2006, 15h24
  4. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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