2013-02-04 6 views
2

I créé une structure telle que:scanf() et nombres à virgule flottante en Turbo C

typedef struct { 
    float real, img; 
} cmplx; 

et crée une fonction en tant que:

void input(cmplx *a){ 
    scanf("%f + %f i", &a->real, &a->img); } 

et appelle la fonction de principal en tant que:

cmplx a; 
input(&a); 

L'exécution s'arrête lorsque le scanf est atteint. Si les floats sont remplacés par ints, le problème est résolu. Quel est ce comportement? Est-ce que je peux utiliser float pour mon problème?

Le programme a été compilé sur Turbo C, dans MS-Windows XP

+0

Quelle entrée donnez-vous au programme? – rasmus

+0

(a) Vérifier la valeur renvoyée par 'scanf()'; il vous indique combien de conversions ont fonctionné. (b) Votre bibliothèque d'exécution C prend-elle en charge automatiquement les opérations à virgule flottante ou devez-vous dire au compilateur de lier avec la bibliothèque à virgule flottante? Converti en code exécutable sur Mac OS X, il fonctionne correctement avec une entrée valide. –

+0

y at-il un code que je peux écrire pour dire au compilateur de lier la bibliothèque de points flottants? Ou nous shoud compilers params – cipher

Répondre

2

Il est difficile de répondre sans connaître le message d'erreur que l'exécution de votre programme arrête, mais à partir de votre commentaire "Y at-il du code que je peux écrire pour dire au compilateur de lier la bibliothèque à virgule flottante?" :

"Formats à virgule flottante non liés" est une erreur d'exécution Borland (Borland C ou C++, Turbo C ou C++). Les compilateurs de Borland essayent d'être intelligents et non de dans la bibliothèque à virgule flottante (f-p) sauf si vous en avez besoin. Hélas, ils tous ont la mauvaise décision. Un cas fréquent est celui où vous n'appelez aucune fonction f-p , mais vous avez% f ou d'autres formats f-p dans scanf() ou printf(). Le remède consiste à appeler une fonction f-p, ou au moins forcer à être présent dans le lien.

Pour ce faire, définir cette fonction quelque part dans un fichier source mais ne pas l'appeler :

static void forcefloat(float *p) 
{ 
    float f = *p; 
    forcefloat(&f); 
} 

Il ne doit pas être dans le module avec le programme principal, aussi longtemps que C'est dans un module qui sera inclus dans le lien.

Si vous avez Borland C++ 3.0, le fichier README documente un peu moins de . Insérez ces déclarations dans votre programme:

extern unsigned _floatconvert; 
#pragma extref _floatconvert 

En utilisant cette solution de contournement, ou un compilateur plus moderne, va probablement résoudre votre problème.

1

problème est à l'utilisation ans compilateur C comme TURBOC, comme il fonctionne bien pour moi (je me sers DevC++) vérification this discussion pour problème similaire

+1

Sa compulsion. – cipher

+0

compulsion de quoi? en utilisant le compilateur TurboC existant – exexzian

+0

Je suggère - Mise à niveau vers les compilateurs modernes – exexzian

Questions connexes