2011-10-10 3 views
2

Donc, je suis en train d'écrire un programme pour un projet d'école, et une partie de celui-ci nécessite que l'utilisateur mette un nombre aléatoire sur la ligne de commande. Le programme utilise ensuite atof pour convertir le nombre en float afin que je puisse faire des calculs avec lui. Cette partie du programme ressemble à:Atof ne fonctionne pas?

#include <iostream> 
#include <cstdlib> 
#include "bmplib.h" //this is just something the prof. gave us to help read the image 
#include <cmath> //i might use this later in the program 

#define nummethods 2 
using namespace std; 

unsigned char input[256][256][3]; 
unsigned char bg [256][256][3]; 
unsigned char output[256][256][3]; 
unsigned char m[2][256][256]; 

int main(int argc, char *argv[]) 
{ 

    int h,i,j,k; 
    double x,y,z; 

    //code to read img here and make sure user puts correct number of arguments in 
//command line 

    for (i=0;i<256;i++){ 
    for(k=0;k<3;k++){ 
     y = y + input[i][0][k]; 
    } 
    } 

cout >> y >> endl; //this is giving me 36,164,75 which in RGB is green  

x = atof(argv[3]); //the number was the 3rd thing typed in at the command line 
cout << x << endl; 

z = x + y; //this isn't the exact program, but you get the idea 
cout << z << endl; 

//there's some more code after this written by the prof. that manipulates the image, 
//but i don't think its relevant since it does not use the argv[3] value 
} 

Le programme a été compilé mais cela n'a pas fonctionné correctement. Je l'ai testé en ajoutant un cout < < x; et cela montrait qu'atof me donnait le mauvais numéro. Par exemple, lorsque je mets 5,0 en tant que mon numéro dans la ligne de commande, cela montre que mon x est 379.7465. Une idée de ce qui ne va pas?

+2

Par exemple, faire 'atof (argv [1])' et l'essayer avec './program 5.0' et voir ce que vous obtenez –

+0

avez-vous mis le fichier d'en-tête pour atof? Testcase serait utile – eran

+3

Essayez aussi 'cout << argv [3]'. Ce n'est peut-être pas ce que vous attendez. – stardt

Répondre

2

Même si son nom suggère qu'il renvoie un flottant, atof retourne en fait un double. Donc, vous devrez le transformer en double pour qu'il devienne un flotteur.

Voici un exemple:

float value = (float)atof(argv[1]); 
printf("%.2f + 3 = %.2f", value, (value + 3)); 

Et cela fonctionne parfaitement.

+0

Alors que vous avez probablement raison sur la cause première, le fait de lancer un 'double' à' float' n'est pas garanti pour la précision. La réponse est d'utiliser un 'double' –

+0

@BrianRoach: Je ne crois pas que la représentation la plus proche de double 5.0 soit 379.7465 float. – Dani

+0

@Dani - heh, il y a cela. Les doigts qui vont plus vite que le cerveau, je devrais probablement dormir un peu. Cependant, la coulée de la partie double à la partie flottante se tient toujours. (Et le vrai problème est dans le code que l'OP ne poste pas) –

9

Incluez-vous stdlib.h ??

Je trouve que si je n'implique pas explicitement stdlib.h le code se conforme et s'exécute, mais atof renvoie 0, quand j'inclus stdlib.h il renvoie la valeur comme prévu.

Im utilisant le gcc pour le code c. Je suppose que c'est la même chose pour C++. Pouvez-vous réduire à un cas minime?

+2

Cela pourrait être une cause possible d'un problème similaire en C, mais en C++, les prototypes de fonctions sont nécessaires. Un échec d'inclusion de 'stdlib.h' causerait une erreur de compilation en essayant d'utiliser' atof' en C++. –