|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() Apprenti Inscription : décembre 2010 Messages : 81 ![]() |
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 |
|
|
00
|
|
|
#2 | ||
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
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 :
PS: As-tu un lien sur ce cours ou pourrais-tu préciser (plus) le contexte ? |
||
|
|
10
|
|
|
#3 | |||||||||
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Ton cours il était en C ou C++ ? Car ça change tout ^^ (enfin pour cette explication)
Citation:
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 :
int voiture1, voiture2, ... voiture1000 Code :
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 :
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 :
Je viens d'avoir un exemple un peu meilleur, toujours avec un parc de voitures 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 :
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. |
|||||||||
|
|
10
|
|
|
#4 | |
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
Citation:
Et non, on n'utilise pas new et delete en C++ dans ce cas, mais std::vector<T> :O |
|
|
|
12
|
|
|
#5 |
![]() Apprenti Inscription : décembre 2010 Messages : 81 ![]() |
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) |
|
|
00
|
|
|
#6 |
|
Membre expérimenté
![]() Ingénieur développement logiciels Inscription : mars 2009 Messages : 331 ![]() |
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. |
|
|
10
|
|
|
#7 | |||
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
À 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): Citation:
Citation:
Citation:
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. |
|||
|
|
10
|
|
|
#8 |
|
Inactif
![]() Théo Analyste d'exploitation Inscription : janvier 2013 Messages : 3 ![]() |
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 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 |
|
|
00
|
|
|
#9 |
![]() Apprenti Inscription : décembre 2010 Messages : 81 ![]() |
Fort des renseignements supplémentaires que j'ai ajoutés ainsi que du fichier joint, quelqu'un pourrait-il tenter de répondre avec des exemples sûrs à mes 3 questions afin que je puisse bien comprendre?
D'avance merci. |
|
|
03
|
|
|
#10 |
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Je ne saurais que trop te conseiller un apprentissage du C ne serait-ce que pour avoir des "bases" en allocation dynamique après tu peux toujours commencer par du C++ mais si tu n'est pas à l'aise avec la base ça risque d'être compliqué pour aborder les nombreux concepts de ce langage
|
|
|
12
|
|
|
#11 |
![]() Apprenti Inscription : décembre 2010 Messages : 81 ![]() |
théo0303, s'il vous plaît, pouvez-vous préciser ce que vous disiez pour 1) ,2), 3) par des exemples ?
merci |
|
|
00
|
|
|
#12 | |||||||||||||||||
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
Citation:
De plus, pour le point spécifique de l'allocation dynamique, l'usage et la syntaxe diffère du C. Quel en est donc l'intérêt (?) --- --- --- Les codes n'ont pas été testés. --- --- --- En C. J'ai ce tableau Code :
int * tab_int = malloc(9697 * sizeof(int)); Code :
double * tab_double = malloc(9697 * sizeof(double)); Pour les tableaux de int (il faut tout re-écrire pour les double...): Code :
Code :
for (size_t i = 0; i < N; ++i) { ++tab_int[i]; } Avec une autre structure: une liste (la fin est marquée par le pointeur NULL) Code :
Code :
Code :
for (list_int * p = une_list_int; p ! NULL; ++p) { ++(p->val); } Et c'est surtout la très mauvaise façon de fair en C++. --- --- --- En C++ On écrit une fonction générique qui attend des paramètres avec certaines propriétés. - l'opérateur ++ permet de passer à l'élément suivant - l'opérateur * permet d'obtenir la valeur (ces propriétés sont dans (tous) les itérateurs des conteneurs standard de C++) Code :
Mais ce n'est pas grâce aux pointeurs. C'est possible par les propriétés commune des itérateurs et la programmation générique. Appels possibles : Code :
Code :
Code :
Code :
|
|||||||||||||||||
|
|
20
|
|
|
#13 | |
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Citation:
Cependant quel est l’intérêt de commencer la programmation (puisque c'est visiblement le cas) avec un langage aussi difficile pour qui n'a jamais entendu un mot de programmation orientée objet ? C'est pour ça qu'il serait plus enrichissant de commencer avec un langage plus "facile" bien qu'il soit évidemment possible de commencer par le C++ mais sans bases c'est d'autant plus difficile que tout doit (enfin devrait) être pensé dans la "philosophie" du C++, et même ce que tu lui proposes, je pense, est déjà trop compliqué, puisque cela fait appel à des notions d'itérateur, c'est pour ça dans un premier temps qu'utiliser new et delete est nécessaire et même ça l'est encore lorsqu'on utilise les vector et autres objets de la stl. @matlab_ : Sinon pour les 3 questions pour la première je dirais précise le contexte : c'est fatiguant pour le programmeur, pour le compilateur (en gros ça prend plus de temps à traiter) ? Pour ce qui est du programmeur, comme le dit ehonn tu peux utiliser des vectors mais admettons que tu ne connaisses pas ces objets, alors dans ce cas on peut dire qu'effectivement si le programmeur déclares 10000 variables au début de son programme, déjà c'est très moyen et d'autre part s'amuser à incrémenter chaque variable une par une est d'une bêtise saisissante Pour la deuxième et troisième question, j'ai répondu dans mon premier post, même si c'est du C, tu peux facilement l'appliquer en C++ si tu remplaces les malloc par des new et les free par les delete (bien que ça ne s'écrive pas exactement de la même manière c'est quand même très similaire). |
|
|
|
12
|
|
|
#14 | |
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 314 ![]() |
Citation:
Le C++ permet de se focaliser sur le problème à résoudre au lieu de perdre du temps sur les détails de gestion de mémoire. De plus, il offre des concepts haut niveau (ie proche de l'intuition normal) qui sont facilement compréhensible (n'importe quel débutant peut comprendre des notions comme "créer un tableau de N éléments", "accéder à l'élément i du tableau", "augmenter la taille du tableau à M éléments", etc). C'est justement l'approche historique de l’apprentissage du C++ (ie mélange de C et de C++) qui fait croire que le C++ est compliqué
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
|
|
30
|
|
|
#15 | ||||||
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
Citation:
Ceci est plus simple Que ceci: Code :
Citation:
En tout cas il n'est pas nécessaire de connaître les pointeurs pour utiliser les algos de la bibliothèque standard. (Je n'ai jamais dit que c'était simple, mais que c'était la bonne façon de faire. De plus, c'est plus simple que les pointeurs.) Citation:
Citation:
|
||||||
|
|
20
|
|
|
#16 | |||
|
Membre habitué
![]() Étudiant Inscription : avril 2011 Messages : 239 ![]() |
Citation:
Citation:
Et je persiste à dire que quand même savoir utiliser la mémoire correctement avec new et delete c'est super utile surtout au début ne serait-ce que pour comprendre le principe même de pointeur. Lorsqu'on te présente un vector quand tu débutes cela m'étonnerait que tu comprennes le principe même d'allocation dynamique. |
|||
|
|
10
|
|
|
#17 | |
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 314 ![]() |
Citation:
Nos remarques s'appliquent dans le cas général de l'apprentissage du C++ Et l'expérience montre que les débutants se perdent généralement dans les détails bas niveau, qu'ils ne réalisent pas que dans 99% des cas la gestion manuelle est une mauvaise approche, qu'ils n'apprennent pas du coup les fonctionnalités plus "haut niveau" du C++ qui permet d'écrire du code plus sur, plus maintenable, plus évolutif, etc. Au final, il font du C with class
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
|
|
10
|
|
|
#18 | |||
|
Membre éprouvé
![]() Étudiant Inscription : février 2012 Messages : 206 ![]() |
Citation:
Les parcours de vecteurs sont plus rapides que les ceux des listes car l'empreinte mémoire est moindre et l'organisation des données est forcément linéaire donc il y a moins de défaut de cache. Seules les opérations d'ajout et de suppression sont plus rapides pour les listes. Et ce n'est pas vrai s'il n'y a pas beaucoup d'éléments. Tu trouveras une facilement vidéo avec les mots clefs «Bjarne Stroustrup - C++11 Style - Going Native (2012.02.02)»; vers le milieu de la vidéo le sujet est «Vector vs. List» Citation:
Non ce n'est pas très utile au même titre que les pointeurs, ça répond aux rares cas où l'allocation dynamique est nécessaire. (La syntaxe est plus simple et il n'y a pas besoin de s'occuper de l'appel à delete). Citation:
En quoi new et delete permettent de comprendre ce qu'est une adresse mémoire ? Pourquoi as-tu besoin de comprendre l'allocation dynamique (lorsque tu débutes, et même après) ? De façon plus générale, dans quels cas utilises-tu new et delete ? dans quels cas utilises-tu des pointeurs nus ? |
|||
|
|
30
|
Copyright © 2000-2013 - www.developpez.com