Fonction push_back(val) ne fonctionne pas correctement

Fonction push_back(val) ne fonctionne pas correctement

by Daphne Gwendolyne van-Hollebeke -
Number of replies: 2

Bonjour, 

Dans le cadre du projet, j'utilise un tableau vector dans lequel je rentre des valeurs en utilisant la fonction "push_back(val)". J'effectue cette manipulation plusieurs fois dans mon code et tout se passe normalement. 

Cependant, j'utilise une nouvelle fois cette fonction à un autre endroit du code. Le programme effectue les instructions suivantes après avoir donné une valeur x : 

  • Si x est compris entre 0.3 et 0.7, on push_back (0.7) dans le tableau
  • Si x est inférieur à 0.3, on push_back (0.3) dans le tableau
  • Si x est supérieur à 0.7, on push_back (1) dans le tableau

J'ai placé de nombreux messages de contrôle dans mon code afin de vérifier les choses suivantes :

  1. Le tableau prend bien une valeur supplémentaire
  2. Le code effectue bien toutes les instructions successives

Cependant, un problème persiste : le fonction push_back(val) ne va ajouter dans le tableau que la valeur 0.7 peu importe la valeur de val entrée. Que celle-ci soit entrée "directement" par push_back(val) ou par l'intermédiaire d'un autre tableau par push_back(tab[i]). Dans chacun de ces cas, push_back() remplie le tableau d'une valeur 0.7 uniquement.


J'ai testé de remplacer 0.3 et 1 par d'autre valeurs... : la valeur 14 à la place de "0.3" inscrira dans le tableau 25 // la valeur 17 à la place de "0.3" inscrira dans le tableau la valeur "2.42092e-322" et ainsi de suite pour des valeurs aléatoires...

Je ne comprends décidément pas d'où peut venir le problème ni comment le résoudre. Le code semble correct, il compile sans problème, tout les messages de contrôles appuient cela aussi pourtant, toujours ce bug... 

Merci de votre aide. 

In reply to Daphne Gwendolyne van-Hollebeke

Re: Fonction push_back(val) ne fonctionne pas correctement

by Ronan Boulic -

c'est difficile de vous aider à partir des détails fournis.

La seule chose que je peux dire c'est que push_back "fonctionne correctement" mais le contexte de fonctionnement de cette fonction doit avoir des problèmes de gestion de vector ; le débordement de l'espace du vector causé par une valeur incorrecte d'indice est la première idée qui me vient à l'esprit. par exemple: le maximum de la valeur d'indice est souvent une unité trop grande.

autre idée: vérifiez de ne pas avoir inversé le nombre de ligne et le nombre de colonnes, ou l'indice de ligne et l'indice de colonne.

Une telle erreur sur vos tableaux d'image peut avoir un impact sur un autre vector (celui qui à l'air d'avoir un problème avec push_back). IL FAUT DONC ELARGIR LA RECHERCHE DU BUG à l'ensemble de votre code et à d'autres sources de problèmes que l'utilisation de cette fonction push_back.


In reply to Ronan Boulic

Re: Fonction push_back(val) ne fonctionne pas correctement

by Daphne Gwendolyne van-Hollebeke -

Bonjour et merci de votre réponse, 

Malheureusement, ma question ne devait pas être assez claire. 
Mon bout de code qui pose problème est très simple et n'effectue que la tâche suivante : 

  1. Création d'un vector appelé tab
  2. Calculer une valeur x 
  3. Afficher cette valeur x 
  4. Si x est inférieur à 0.3, faire tab.push_back(0.3)
  5. Si x est compris entre 0.3 et 0.7, faire tab.push_back(0.7)
  6. Si x est supérieur à 0.7, faire tab.push_back(1)
  7. Afficher le tableau

Les messages de contrôles sont les suivants : ils m'indiquent que x a été calculé et qu'il a la bonne valeur. Aussi, un message indique dans quel "if" on se trouve (p.e : "x est inférieur à 0.3, on effectue le cas n*1"). Après avoir fait un push_back, je demande d'afficher le tableau ; celui-ci est bien remplie d'une valeur. Cependant, lorsque x>0.7 ou que x<0.3 elle est toujours équivalente à 0.7 lorsque le code est tel que ci-dessus et elle est égale à des nombres qui semblent "aléatoires" lorsque je change la donnée "0.3" et "1" par d'autres valeurs.

Le code est relativement simple et ne fait pas appel à un tableau qui pourrait lui-même avoir un soucis, ni au nbC, nbL... Je sais aussi pour sûr que mes blocs de if et ma boucle (car je répète cette opération autant de fois que je calcule de x) sont bien rédigées puisque les messages de contrôlent m'assurent le bon déroulement du code tout au long de l'opération. 
Le soucis survient exactement à la consigne push_back(val) où ma variable val ne semble pas être prise en compte par la fonction push_back. Aussi, il est certain que le code ne rentre pas dans une boucle if sans que cela ne soit voulu (messages de contrôles pour source). 


Lorsque je garde les seuils suivants : 0.3, 0.7 et 1, le tableau ne se remplit que de 0.7. Jusque là, je supposais que mon "if" avec un soucis puisqu'il s’exécute de la façon suivante :

  1. Si x>0.7 ou que x<0.3 alors on entre dans ce "if" dans lequel se trouve une forme : if x>0.7 alors [...] else alors [...]
  2. Sinon (c'est-à-dire si x n'est pas supérieur à 0.7 et n'est pas inférieur à 0.3), on fait [...] 

Cependant, lorsque je change 0.3 et 1 par de nouvelles valeurs, le problème change totalement ! Le tableau ne se remplit plus uniquement de 0.7 mais toujours pas correctement pour autant. Selon les nouvelles valeurs m et n rentrées à la place de 0.3 et de 1, j'obtient soit : 

  1. un tableau contenant des variables aléatoires aux indices où on aurait dû obtenir un m ou n 
  2. soit des m et n pas à la bonne place. 
Il semble aussi que cela s'effectue sans régularité, j'entends par là que 1. ou 2. se produisent pour des variables m et n parfois différentes ou parfois très proches. Par exemple, un m = 14 ou un m = 15 me produira soit l'erreur 1. (pour m=14) soit l'erreur 2. (m=15).

Ayant le code sous les yeux, il est bien plus simple de suggérer des erreurs potentiels, mais je peine à la trouver. Le code est simpliste, les boucles sont bien respectées à la lecture du programme, le calcul du x est bon, la valeur à mettre dans le tableau est annoncée dans le terminale avec d'être push_back(val) et celle-ci est toujours correcte... 

Je ne sais absolument pas d'où peut venir le soucis à ce stade.

Merci.