-1

J'ai lu plusieurs réponses liées à "Comment trouver la plus petite valeur dans un tableau". Cela semble simple, mais en l'appliquant, je vois des erreurs à peu près 10% du temps, où l'indice identifié comme ayant la valeur la plus faible n'a pas le plus bas. La variable m_siaValue [6] [4] est un tableau à deux dimensions de nombres courts, avec toutes les positions peuplées avec des valeurs aléatoires entre 1 et 6. La première dimension contient 6 lignes (index 0-5), et la La deuxième dimension identifie 4 colonnes (index 0-3). La variable m_siaIndexOfLowest [6] est un tableau de nombres courts correspondant par index aux lignes du tableau m_siaValue [6] [4]. Les valeurs de ce tableau sont destinées à contenir l'index de la cellule (colonne) de plus faible valeur dans chaque ligne de m_siaValue.Qu'est-ce qui peut provoquer une erreur intermittente dans la recherche de la valeur la plus faible dans un tableau int C++?

Il semble si court et si simple que je suis perplexe, il échoue. Mais plus que cela échoue seulement 10% du temps. Quelqu'un peut-il voir ce qui pourrait être faux?

for (short siX= 0;siX < 6; siX++) { 

    // Assign cell/column 0 as lowest. Then loop through the other 3, 
    // comparing and reassigning if other cells are lower. 
    m_siaIndexOfLowest[siX] = 0; 
    for (short siY = 1;siY < 4; siY++) { 
     if (m_siaValue[siX][siY] < m_siaValue[siX][siY-1]) { 
      m_siaIndexOfLowest[siX] = siY; 
     } 
    } 
} 

Sortie montrant une erreur. Total est calculé immédiatement après ce code, avant tout affichage ou mouvement de données en soustrayant la valeur la plus faible identifiée de la somme de la ligne. Ainsi, le total confirme que l'erreur est dans l'identification du plus bas, plutôt que dans le placement ou la coloration des cellules. enter image description here

+0

L'outil pour résoudre de tels problèmes est votre débogueur. Vous devez parcourir votre code ligne par ligne * avant * de demander Stack Overflow. Pour plus d'aide, veuillez lire [Comment déboguer de petits programmes (par Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Au minimum, vous devriez [modifier] votre question pour inclure un exemple [Minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) qui reproduit votre problème, ainsi que les observations que vous avez faites dans le débogueur. –

+0

Un outil encore meilleur qu'un débogueur: écrivez '3 2 4 3' et exécutez votre algorithme à la main:" Est-ce que 2 est inférieur à 3? Il est, alors jetez l'ancien index et gardez 1. Est-ce que 4 est inférieur à 2? , donc gardez le 1. Est-ce que 3 est inférieur à 4? Il est, alors jetez l'ancien index et gardez 3. Nous avons atteint la fin, donc 3 est l'indice du plus petit élément. "WTF ?!" – molbdnilo

Répondre

2

La logique utilisée dans le bloc suivant est incorrecte. Vous comparez toujours deux éléments adjacents. Cela ne vous donne pas la plus faible valeur.

for (short siY = 1;siY < 4; siY++) { 
    if (m_siaValue[siX][siY] < m_siaValue[siX][siY-1]) { 
     m_siaIndexOfLowest[siX] = siY; 
    } 
} 

Je propose quelque chose le long des lignes de:

short indexOfLowest = 0; 
auto lowest = m_siaValue[siX][0]; 
for (short siY = 1;siY < 4; siY++) { 
    if (m_siaValue[siX][siY] < lowest) { 
     lowest = m_siaValue[siX][siY]; 
     indexOfLowest = siY; 
    } 
} 
m_siaIndexOfLowest[siX] = indexOfLowest;