Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec la fonction pop_back()

La fonction ne me semble faire aucun effet dans le code.

19 juin 2014 à 19:50:09

Bonsoir,

Je suis la partie du cours sur les tableaux et je ne parviens pas à appliquer la fonction pop_back() pour les tableaux dynamiques. Voici ce que je fais et ce que ça donne:

Le résultat que j'obtiens est 31415, comme si la case n'avait pas été annulée.

J'ai cherché un bon moment sans comprendre. C'est surement un truc tout bête mais là j'abandonne. Est-ce que quelqu'un il pourrait-il m'éclairer svp :)?

Merci beaucoup d'avance!

(Et je précise, au cas où ça change quelque chose, que j'utilise Xcode.)

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2014 à 20:31:34

Salut

Évite de faire une copie d'écran, copie-colle ton code en utilisant les balise code </>, ça sera mieux

Si tu affiche la taille de ton vector avant et après le pop_back, tu verras que ton vector a bien perdu un élément. Donc pop_back fonctionne bien

Lorsque tu fais le pop_back, tu dis simplement au vector qu'il y a un élément en moins, mais cela ne touche pas à la mémoire de ton ordinateur. Donc quand tu écris meilleursScores[4], tu accèdes en dehors de ton vector et tu regardes à l'ancien emplacement mémoire, qui n'a pas été effacé. Ce qui donne l'impression que meilleursScores[4]. Mais le comportement peut être indéterminé, voir catastrophique

Voir http://ideone.com/mn6NnY

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2014 à 22:14:43

Pour comlpéter la réponse de gbdivers, tu as la fonction back() qui retourne une référence sur le dernier élément (à condition que le conteneur ne soit pas vide...)

if(!bestScores.empty()){
   std::cout << "remove the lowest best score" << bestScore.back();
   bestScores.pop_back();
   if(!bestScores.empty()){
      sd::cout <<  "the new lowest best score is " << bestScore.back();
   }
}



  • Partager sur Facebook
  • Partager sur Twitter
Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
21 juin 2014 à 23:46:16

Bonsoir,

Merci de vos réponses. Je crois avoir compris que, une fois le pop_back() effectué, la valeur affectée à la dernière variable du tableau reste une valeur par défaut tant qu'elle n'est pas remplacée par la valeur affectée à un push_back().

Par contre je n'ai pas compris ce que tu entends, gbdivers, par "comportement indéterminé voire catastrophique".

Merci, int21h, pour le tuyau, mais je ne vais pas encore cumuler trop de "raccourcis" ou autres quand j'ai déjà du mal à saisir la base de chez base ^^P.

Bonne soirée.

  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2014 à 23:52:56

mozzon a écrit:

Je crois avoir compris que, une fois le pop_back() effectué, la valeur affectée à la dernière variable du tableau reste une valeur par défaut tant qu'elle n'est pas remplacée par la valeur affectée à un push_back().

Non pas du tout, la variable est supprimée. Elle n'a pas de valeur par défaut et ça lecture retourne tout aussi bien une valeur "valide" que n'importe quoi. D'où le "comportement indéterminé voire catastrophique".

  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2014 à 23:54:52

mozzon a écrit:

Merci de vos réponses. Je crois avoir compris que, une fois le pop_back() effectué, la valeur affectée à la dernière variable du tableau reste une valeur par défaut tant qu'elle n'est pas remplacée par la valeur affectée à un push_back()

Ca marche pas comme ça, c'est plus compliqué ! :-°

En gros, le principe c'est que, que tu accède a une variable ou pas, la mémoire de ton ordinateur elle est toujours là ! Le 4 il est toujours stocké dans une barette de ram ! Mais cet espace mémoire n'appartient plus à ton programme ! Si tu le modifie, tu pourrais par exemple, modifier sans faire exprès le compteur d'un autre programme qui a une boucle, le faire passer à -1 et faire planter cet autre programme ! Et ça peut avoir de grosses conséquences ! ^^

  • Partager sur Facebook
  • Partager sur Twitter
Tous les crétois sont menteurs. Je suis génial. | Nouveau Sdz ? | Entrainement à l'algorithmique | Mon Devblog | Cpp Reference | Livres Recommandés : C++ Primer 5, SFML Game Development
22 juin 2014 à 0:05:18

0o

Faire planter quels autres programmes??! Ce que je fais sur Xcode ne se limite pas à influencer les programmes que j'ai à l'intérieur?? Je veux dire ceux qui sont codés dans des fichiers dans mon explorateur de fichier interne à Xcode?

Bonne soirée.

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 0:19:44

Bah ? Je sais pas ce que c'est Xcode ... :-°

Mais en tout cas, si tu compile et lance ton programme sous windows, ça pourrait tout faire planter !

Heureusement, de nos jours, Windows et la plupart des OS sont des OS dit préemptif, il vont stopper ton programme pour l'empêcher de faire des bêtises !

Mais il existe certains OS dit coopératif (comme Windows 95 et 98), qui laisse les programmes se gérer tout seul, et un programme peut faire tout planter ! :lol:

  • Partager sur Facebook
  • Partager sur Twitter
Tous les crétois sont menteurs. Je suis génial. | Nouveau Sdz ? | Entrainement à l'algorithmique | Mon Devblog | Cpp Reference | Livres Recommandés : C++ Primer 5, SFML Game Development
22 juin 2014 à 0:52:24

Salut

Xcode c'est un peu le Code::Blocks de Mac. J'ai voulu télécharger Code::Blocks pour être sûr de faire comme dans le cours et bien pas faire de bêtises mais j'ai pas réussi :(.

Bon... Mais y a des choses précises qu'on doit éviter de faire quand on code, que je pourrais y faire gaffe dès maintenant?

Parce que là je débute et du coup je fais un peu des expériences: j'arrête pas de créer des variables et des fonctions bidon pour comprendre le fonctionnement du langage. Dans quelle mesure je dois me modérer?

Bonne soirée.

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 1:10:04

Jusqu'à avoir comprit.

Le problème étant de croire que ça fonctionne alors que c'est le résultat d'un comportement indéfini. Je suis tenté de dire: lance ton exécutable à travers des outils d'analyse mémoire (ex: valgrind). Si ça râle se n'est pas bon. Compiler en debug (-g) et avec des options de compilation plus stricts (-Wall -Wextra). Remplacer les opérateurs [] par at(): scores[n] -> scores.at(n) pour avoir des erreurs à l’exécution en cas d'accès invalide.

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 2:32:24

Bon eh bien j'essaierai ces divers outils dans ce cas.

Il me faudra encore un bout de temps pour comprendre tout ça, mais du coup est-ce que ça c'est plus ou moins correct:

1) Si je crée une valeur (en l'occurrence meilleursScores[4]) et que je la fais disparaître, son ancienne valeur reste dans ma ram, et ce même si j'efface mon programme? si je le fais plusieurs fois avant d'éteindre mon ordi, je charge et recharge ma ram? (Parce que c'est bien ça la ram hein? la mémoire volatile qui s'effacera quand j'éteindrai l'ordi?)

2) La variable meilleursScores[4] a beau être entre les accolades de mon programme main(), elle peut aller bidouiller comme ça des exécutables complètement ailleurs? Il ne faut pas au moins qu'il y ait un #include "nomDeFichier.h" pour qu'on lien soit établi?

Bonne soirée.

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2014 à 3:13:20

1) Même si la valeur reste en ram, le segment est libre et sera rapidement utilisé et remplacé. De plus les politiques de sécurité des OS empêchent de démarrer sur le même segment mémoire. Peut-être même que la mémoire est purgé (remplacer par des 0).

2) Il suffit de connaître l’adresse mémoire pour faire joujou. Mais il y belle lurette que l'OS t’envoie boulet si tu accèdes à la mémoire d'un autre programme.

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2014 à 18:16:00

valent20000 et jo_link_noir, ne faites pas ces énormes imprécisions quand vous vous adressez à un débutant, svp.

MacOS depuis un bon bout de temps, comme Windows depuis Windows95/NT3.51, ou Linux sont des OS qui utilisent ce qu'on appel de la mémoire virtuelle.

Chaque processus est encapsulé dans un environnement où il pense disposer de toute la RAM disponible, voir plus (utilisation du swap).

Sauf utilisation de fonctionnalités système avancées, chaque programme vie sa vie dans son espace mémoire qui lui est dédié.

La taille de cette mémoire virtuelle n'est pas fonction de la RAM physiquement présente sur la machine.

Le processus n'a pas à se battre avec d'autres programmes pour disposer de l'adresse "0x15632134" par exemple. Chaque programme dispose de cette adresse qui sera "mappé" à un endroit différent de la RAM physique que cette même adresse dans un autre programme.

L'allocation mémoire n'est pas là pour affecter une zone mémoire virtuelle à un programme ou à un autre mais pour permettre à l'OS de faire l'association entre une adresse virtuelle qui sera accessible depuis le programme avec de la RAM physique.

Comme la création de cette association à un coût, les primitives de désallocations en tendance à une pas casser cette association pour pouvoir ce resservir rapidement de cette mémoire.

Le pop_back est dans cette logique pour permettre de rapidement faire un push_back à peu de frais.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
23 juin 2014 à 18:46:45

Désolé, je suis trop vieux, j'ai encore un amiga 1000 et j'en suis content ! :lol: 

(Non en fait je suis jeune mais j'en ai un quand même)

Plus sérieusement, tu m'a appris un truc, je suis resté à mon savoir vieux et dépassé ! :-°

  • Partager sur Facebook
  • Partager sur Twitter
Tous les crétois sont menteurs. Je suis génial. | Nouveau Sdz ? | Entrainement à l'algorithmique | Mon Devblog | Cpp Reference | Livres Recommandés : C++ Primer 5, SFML Game Development
17 juillet 2019 à 14:30:38

ah ok, je pensais que ça "supprimerai" directement la case du tableau et que ça la remplacerait par 0, merci beaucoup bacelar!
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2019 à 16:52:48

mozzon a écrit:

J'ai voulu télécharger Code::Blocks pour être sûr de faire comme dans le cours


Tu suis quel cours? Si tu suis celui de OCR, je te conseil d'arrêter vivement. Il n'est plus à jour et apprends un paquet d'âneries. (Une petite recherche sur le forum t'en diras plus).
Il y a ce cours qui est sympa (bien qu'encore en construction, mais suffisamment évolué pour un débutant) si jamais.

Bonne fin de journée :)
(désolé, ça n'a aucun rapport avec la question posée, mais c'est un meta-conseil)

-
Edité par KirbXCoucou 17 juillet 2019 à 16:57:52

  • Partager sur Facebook
  • Partager sur Twitter

« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev

17 juillet 2019 à 18:48:16

KirbXCoucou a écrit:

Tu suis quel cours? Si tu suis celui de OCR, je te conseil d'arrêter vivement. Il n'est plus à jour et apprends un paquet d'âneries. (Une petite recherche sur le forum t'en diras plus).

Il a changé de métier, il est boucher charcutier, il y a 5 ans qu'il n'est pas venu sur le forum !

  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2019 à 18:52:35

@Philibert gentil Bonjour, merci de ne pas déterrer d'ancien sujet. 

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter