2013-01-25 2 views
3

Pourquoi le code suivant imprime-t-il "0 0 0 0 0 0 0 "? Je m'attendais à "1 3 6 10 15 21 28 ".Array/Pointer confusion

#include <iostream> 

using namespace std; 

void PrefixSum(float * input, float * output, int n){ 
    float sum = 0; 
    for (int i=0;i<n;i++){ 
     float value = input[i]; 
     sum += value; 
     output[n] = sum; 
    }  
} 


int main(int argc, const char * argv[]) 
{ 
    float input[] = {1,2,3,4,5,6,7}; 
    float output[] = {0,0,0,0,0,0,0}; 
    PrefixSum(input, output, 7); 
    for (int i=0;i<7;i++){ 
     cout << output[i] << " "; 
    } 
    return 0; 
} 
+3

devrait être 'sortie [i]'. ** Débogueur peut vous aider beaucoup ** dans des cas comme celui-ci. – Maroun

Répondre

9

changement output[n]-output[i] à la place, vous n'êtes pas d'écrire à un indice dans le tableau depuis output[7] est hors limites. i est votre compteur de boucle ne n

4

changement

output[n] = sum; 

à

output[i] = sum; 
3

output[n] = sum;, n est 7 est hors limite de tableau output et vous écrivez des données à chaque fois. Notez que ceci est également un comportement indéfini. Vous accédez directement à la boucle float value = input[i];, donc je suppose que c'est juste une faute de frappe.

mise à jour

output[n] = sum; 

à

output[i] = sum; 
2

Remplacez le « n » avec le « i » dans votre entreprise à itération PrefixSum;)

4

Comme tout le monde a fait remarquer, vous utilisez n comme l'indice au lieu de i , donc vous ne modifiez jamais aucune valeur dans le tableau.

Les boucles d'écriture sont sujettes aux erreurs, beaucoup d'entre nous auront fait des erreurs au cours des années. Il est préférable de réutiliser le code existant. Vous calculez le partial_sum. En utilisant la bibliothèque standard vous pouvez coder comme ceci:

#include <iostream> 
#include <numeric> 

int main(int argc, const char * argv[]) 
{ 
    using std::partial_sum; 
    using std::cout; 

    const int SIZE = 7; 
    float input[SIZE] = {1,2,3,4,5,6,7}; 
    float output[SIZE] = {0,0,0,0,0,0,0}; 

    partial_sum(input, input+SIZE, output); 

    for (int i=0;i<SIZE;i++){ 
     cout << output[i] << " "; 
    } 
    return 0; 
} 

Nous pouvons éliminer la boucle imprimer le résultat aussi:

#include <algorithm> 
#include <iterator> 

//... 

using std::copy; 
using std::ostream_iterator; 

copy(output, output+SIZE, 
    ostream_iterator<float>(cout, " ")); 

Et enfin, si vous n'avez pas besoin du tableau intermédiaire de résultats , nous pouvons simplement mettre les résultats directement à la place ostream:

partial_sum(input, input+SIZE, 
      ostream_iterator<float>(cout, " ")); 
+0

+1 pour 'partial_sum()'. – hmjd