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 sur un cours (besoin d'explications)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Par défaut Question sur un cours (besoin d'explications)
    Bonjour,

    je souhaiterais que quelqu'un puisse m'expliquer pourquoi, dans un cours où il est question de pointeur, il est dit :

    1) Si on a un par exemple un grand nombre de variables de type int, et qu'il s'avère soudain que pour une raison quelconque, je souhaite ajouter 1 à 9697 d'entre elles, pourquoi est-il moins fatiguant d'utiliser un pointeur dont on sait qu'il s'agit d'ailleurs d'une seule variable(donc elle peut prendre des valeurs différentes) à la place de passer variable par variable ? En quoi est-ce moins coûteux ?

    2) Et surtout, pourquoi si le nombre de données à traiter est inconnu au moment de l'écriture du programme, alors pourquoi la première technique utilisant le nom des variables (et pas un pointeur) est inapplicable ?

    3) Pourriez-vous me donner un exemple pour ce 2), car je ne vois pas ce que l'on entend par ce 2) ?

    merci d'avance de vos explications détaillées.

    Cordialement

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Je ne pense pas avoir compris...
    Mais je ne vois pas la difficulté ou le souci de ce code ou l'utilisateur ne manipule pas de pointeur :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<int> v(9697);
    for (int & e : v) { ++e; }
    Peut-être que les questions essayent de faire parler des tableaux; mais un tableau n'est pas un pointeur, et ce n'est pas du C++ et encore moins du C++ de débutant.

    PS: As-tu un lien sur ce cours ou pourrais-tu préciser (plus) le contexte ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Ton cours il était en C ou C++ ? Car ça change tout ^^ (enfin pour cette explication)


    2) Et surtout, pourquoi si le nombre de données à traiter est inconnu au moment de l'écriture du programme, alors pourquoi la première technique utilisant le nom des variables (et pas un pointeur) est inapplicable ?
    Je ne sais pas si j'ai très bien compris la formulation de la question mais je vais essayer de partir d'un exemple.

    Imagine tu as un parc de voitures identifiées par un int (exemple vraiment pourri mais je ne sais pas pourquoi c'est le premier truc qui m'est venu à l'esprit).
    Tu peux déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int voiture1, voiture2, ... voiture1000
    C'est long. Pour simplifier tu peux déjà déclarer un tableau de voiture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int voitures[1000];
    //puis
    voitures[0] = ...;
    ...
    voitures[999] = ...;
    Maintenant imagine tu veux ajouter une voiture à ton parc.
    Dans ce cas, et dans la situation présente, tu ne peux pas ! En effet tu n'as pas le droit d'accéder à la case 1000 ou plus du tableau voitures sinon tu vas avoir droit à un segment fault. Comment faire alors ?
    Eh bien les pointeurs permettent de résoudre la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int *voitures = (int*)malloc(1000*sizeof(int));
    La tu déclares un "parc" de 1000 valeurs de type int.
    Ainsi lorsque tu voudras ajouter une voiture tu pourras réallouer l'espace mémoire pour qu'il puisse accueillir une voiture de plus avec realloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    voitures = (int*)realloc(1001*sizeof(int));
    voitures[1000] = ...;
    Bon évidemment ce que je fais là est nul est sale, donc c'est pas vraiment un bon exemple, surtout qu'il ne faut pas oublier de libérer la mémoire avec free sinon t'auras des pertes de mémoire !

    Je viens d'avoir un exemple un peu meilleur, toujours avec un parc de voitures . Imagine tu veux que l'utilisateur entre le nombre de voitures de ton parc (avec scanf par exemple bien que ce soit mal d'utiliser scanf).
    Tu fais comment maintenant que l'utilisateur a rentré le nombre de voitures pour les créer, ces voitures ?
    Là tu es obligé de passer par l'allocation dynamique, les pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    scanf("%d",nombreDeVoitures);
    voitures = (int*)malloc(nombreDeVoitures*sizeof(int));
    Et là tu as bien un parc constitué du nombre de voitures entré par l'utilisateur, si tu y réfléchis bien tu n'aurais pas pu faire autrement pour avoir pile le bon nombre.

    Enfin il ne faut pas oublier de libérer la mémoire allouée, avec free :
    Voilà j'espère t'avoir un peu éclairé

    EDIT : Zut on est dans le forum C++ autant pour moi j'ai écris des choses absurdes avec malloc et free alors qu'il faut le faire avec new et delete mais je modifierai cela demain.

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par Lintel-oo Voir le message
    EDIT : Zut on est dans le forum C++ autant pour moi j'ai écris des choses absurdes avec malloc et free alors qu'il faut le faire avec new et delete mais je modifierai cela demain.[/SIZE]
    C'est (sûrement) la réponse attendu aux questions...
    Et non, on n'utilise pas new et delete en C++ dans ce cas, mais std::vector<T> :O

  5. #5
    Membre confirmé
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2010
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Décembre 2010
    Messages : 86
    Par défaut
    Bonsoir, pour répondre à une des questions posées, c'est du C++. Par ailleurs, ceci se trouve sur le fichier joint suivant (que j'ai mis en pièce jointe), fin page 5/11 puis début page 6/11 (sur une vingtaine de lignes).

    Par ailleurs, à priori, la question n'essaye pas forcément de faire parler un tableau. C'est plutôt général.

    En souhaitant que cela vous aide à me faire comprendre les choses avec des exemples parlant.

    Merci

    ps:j'ai vu qu'il y avait aussi un doute sur malloc et free (à la place de new et delete)
    Images attachées Images attachées
    • Type de fichier : pdf L02.pdf (289,1 Ko, 179 affichages)

  6. #6
    Membre émérite
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Bonsoir,

    L'allocation dynamique en C passe par malloc/free. En C++, elle passe par new/delete.

    Je te conseillerais bien de lire ce cours sur les pointeurs et les références, il vaudra les grands discours.

  7. #7
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    À priori la leçon 1 parle du concept de la variable.
    Cette leçon (la deuxième) par des types de base et des classes (sans méthodes).

    À part le type bool et la rapide allusion à la possibilité de rajouté des fonctions à une classe, c'est du C.

    Ce cours introduit beaucoup trop rapidement les pointeurs.
    Et donc, le pointeurs arrivent avant:
    - les chaînes de caractères (string)
    - int main() { return 0; }- if else, for, while, do while- les fonctions
    - les références
    puisque tout ça n'apparaît pas dans ce cours (peut-être dans la leçon 1 ?)

    Sinon (extrait de la leçon):

    Maintenant, si vous avez déjà un peu pratiqué la programmation à l'aide d'un autre langage, vous pensez sans doute que le cas des 9 697 données de type double peut être traité très facilement, à l'aide d'un tableau que l'on parcourt en faisant varier un index.
    Oui (ou même sans comme dans mon premier message).

    Deux remarques s'imposent alors. La première est que le tableau n'est qu'un cas particulier : il arrive que l'organisation "naturelle" des données à traiter ne soit, justement, pas un tableau. Il peut s'agir d'une liste chaînée (Leçon 10) ou d'un arbre (Leçon 19), par exemple. L'usage de pointeurs offre une réponse générale à ce problème, alors qu'un index ne permet de traiter qu'une seule structure de données, le tableau.
    En C++ on parle d'itérateur.

    La deuxième remarque est que, lorsqu'une organisation de type tableau convient, l'usage d'un pointeur ne donne pas lieu à une écriture très différente de celle adoptée lorsqu'on utilise un tableau (nous verrons dès la Leçon 9 que, lorsqu'on lit un programme, l'examen des instructions manipulant les données ne permet pas de déterminer s'il y a un véritable tableau ou s'il s'agit d'un simple pointeur)
    Un std::vector peut nous donner plus d'informations qu'un simple pointeur.
    std::sort utilise des RandomAccessIterator et ne peut donc pas s'utiliser avec std::list.
    Ce n'est pas la bonne façon de penser en C++, pour faire ce genre de chose, on utilise la programmation générique.

    --- --- ---

    C++ est un langage de haut niveau qui permet de faire des beaucoup de choses simplement.
    De part son héritage au C et sa devise "on ne paye pas pour ce qu'on utilise pas", il permet aussi de travailler de façon très proche avec la machine. Mais ce n'est surtout pas ce qu'il faut montrer dans un cours de C++ pour débutants.

    Les pointeurs n'offre "aucune" sécurité et sont aussi compliqués que dangereux à manipuler.

    C++ les a "remplacés" ou "masqués" par des concepts plus avancés et aussi performants et surtout, plus fiables.

  8. #8
    Inactif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Par défaut
    Bonjour,
    Peut-être pourrais-je t'aider avec mes réponses.
    Avant tout il ne faut pas voir une variable comme étant tout simplement une valeur. Mais plutôt comme étant une adresse mémoire et une valeur.
    D'habitude le développeur ne s'occupe pas de cette adresse mémoire, mais souvent de la valeur de cette variable.
    Pour le 1)
    L'avantage est d'abord algorithmique à mon avis. Si tu as 9697 variables à modifier il y a de fortes chances que tu retapes du code pour les modifier , tandis qu'en utilisant un pointeur, tu peux par exemple garder la même boucle et juste changer la valeur de ton pointeur (qui contient l'adresse mémoire de la variable à modifier).

    Pour le 2) et le 3)
    Je pense qu'on entends par là que l'adresse de la variable existe toujours à partir du moment que la variable existe. Tu peux ne pas connaître le nom mais si tu connais l'adresse tu peux effectuer tes opérations sur la variable en question. En gros, Il faut garder en mémoire que la valeur d'un pointeur est toujours du même type, tu n'a qu'a faire ton algo en n'utilisant que le pointeur dont tu connais déjà le type et le nom.

    J'espère voir pu t'aider.
    Théo

Discussions similaires

  1. Besoin d'explication sur une question de syntaxe
    Par Cynthia. dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 25/10/2010, 17h22
  2. Réponses: 2
    Dernier message: 25/11/2008, 22h07
  3. Question sur le cours "Introduction au traitement numérique d'image"
    Par yostane dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 13/09/2008, 13h13
  4. Question sur les regex, besoin d'une lumière
    Par Cladjidane dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/03/2007, 12h28
  5. Deux questions sur un cours SGBD
    Par Francois_quad dans le forum Débuter
    Réponses: 3
    Dernier message: 17/01/2007, 17h40

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