2016-03-09 7 views
-3

J'essaie de convertir un tableau de 8 bits en un nombre de 0-255 en ajoutant des valeurs en fonction de la position dans le champ.La fonction pow() dans c me donne des résultats erronés

si j'utilise

int array[8]={ 
      0,1,1,0,0,0,0,1 
    }; 
    int *p = array; 
    int i; 
    for (i = 0; i<8; i++){ 
     if(p[i]!=0){ 
      a = pow(2,i); 
      printf("%i\n",a); 
     } 
    }; 

je reçois:

2 
4 
128 

que les résultats, ce qui serait bon jusqu'à présent. mais si j'utilise

int array[8]={ 
      0,1,1,0,0,0,0,1 
    }; 
    int *p = array; 
    int i; 
    for (i = 0; i<8; i++){ 
     if(p[i]!=0){ 
      a = a + pow(2,i); 
      printf("%i\n",a); 
     } 
    }; 

Je me place:

2686758 
2686762 
2686890 

quand j'attendre:

134 

Qu'est-ce que je fais mal?

+1

Ça sent comme l'utilisation de la variable non initialisée 'a'. Vous ne pouvez pas être certain sans [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). –

+0

Ouais ... bas et le vote proche pour afficher le code, mais ne montrant pas les données. Nous ne savons même pas quel est le type 'a' ( –

+0

si 'array [0]' le MSB - c'est-à-dire 128 ou 1? –

Répondre

3

Vous n'avez pas initialisées a à 0.

Les éléments suivants doivent travailler

int array[8]={ 
     0,1,1,0,0,0,0,1 
}; 
int *p = array; 
int i; 
a = 0      // << Initialise a 
for (i = 0; i<8; i++){ 
    if(p[i]!=0){ 
     a = a + pow(2,i); 
     printf("%i\n",a); 
    } 
}; 

Vous devez toujours fournir une valeur initiale pour vos variables. Sinon, vous pouvez vous attendre à ce qu'ils commencent avec n'importe quelle valeur.

Dans la deuxième partie du code, vous accumulez a=a+pow(2,i) et c'est là où la première fois a est utilisée, elle contiendra une valeur indéterminée.

+0

Pourquoi utilisez-vous 'pow' - une fonction coûteuse dans ce contexte –

1

Le problème est dans l'instruction: a = a + pow(2,1); a a une valeur indéterminée car il n'a pas été initialisé et vous l'utilisez en opération arithmétique.

1

pow est destiné à calculer la fonction exponentielle de deux valeurs réelles (non entières). Donc, vous pouvez l'utiliser pour calculer π 3/2. Il n'est vraiment pas idéal pour calculer des puissances entières de 2. Beaucoup plus simple et plus rapide (bien que possiblement moins lisible jusqu'à ce que vous vous y habituiez) est d'écrire 2 i comme (1UL << i). Cependant, dans ce cas particulier, vous n'avez besoin de rien. Vous pouvez tout simplement faire ce qui suit:

int a = 0; 
for (int index = 0, value = 1; index < 8; ++index, value *= 2) 
    if (p[i]) a += value; 

ou encore plus directement

int a = 0; 
for (int value = 1, *p = array; value < 256; value *= 2, ++p) 
    if (*p) a += value; 

(Comme il a été mentionné, le problème original était pas vraiment l'utilisation de pow mais plutôt l'absence de l'initialisation int a = 0.)

-1

bien! Je l'ai corrigé en ajoutant =0; à l'initialisation int a; Réservoirs!

+0

Si vous trouvez les réponses utiles, cela vous dérangerait-il d'en accepter une? – purpletentacle