2

I created a structure as:

typedef struct {
  float real, img;
} cmplx;

And I created a function as

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

and called the function from main as:

cmplx a;
input(&a);

The execution stops when the scanf is reached. If floats are replaced by ints, the problem is solved. What is this behaviour? Is there a way I can use floats for my problem?

The program was compiled in Turbo C, in Windows XP.

phuclv
  • 37,963
  • 15
  • 156
  • 475
cipher
  • 2,414
  • 4
  • 30
  • 54
  • What input are you giving to the program? – rasmus Feb 04 '13 at 02:33
  • (a) Check the value returned by `scanf()`; it tells you how many of the conversions worked. (b) Does your C runtime library support floating point operations automatically, or do you have to tell the compiler to link with the floating-point enabled library? Converted into runnable code on Mac OS X, it works fine given valid input. – Jonathan Leffler Feb 04 '13 at 02:35
  • is there any code i can write to tell compiler to link floating point library? Or we shoud compilers params – cipher Feb 04 '13 at 02:49
  • 1
    Turbo C is a very old compiler, I believe. You'll need to read the manual. Your code is good for a modern system, so explaining why it doesn't work will delve into what is different about your compiler compared to modern ones. – Jonathan Leffler Feb 04 '13 at 02:55
  • *"The execution stops"* -- and then what happens? Do you mean that the program terminates? Is there an error message, and if so, what is it? – Keith Thompson Feb 04 '13 at 04:51
  • @KeithThompson I mean the program terminates. And it was a compiler problem actually, the linking was the error :) – cipher Feb 05 '13 at 07:07

2 Answers2

2

It is hard to answer without knowing the error message that your program's execution stops with, but from your comment "is there any code i can write to tell compiler to link floating point library", I suspect it may be this issue:

"Floating point formats not linked" is a Borland run-time error (Borland C or C++, Turbo C or C++). Borland's compilers try to be smart and not link in the floating- point (f-p) library unless you need it. Alas, they all get the decision wrong. One common case is where you don't call any f-p functions, but you have %f or other f-p formats in scanf() or printf() calls. The cure is to call an f-p function, or at least force one to be present in the link.

To do that, define this function somewhere in a source file but don't call it:

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

It doesn't have to be in the module with the main program, as long as it's in a module that will be included in the link.

If you have Borland C++ 3.0, the README file documents a slightly less ugly work-around. Insert these statements in your program:

extern unsigned _floatconvert;
#pragma extref _floatconvert

Using this workaround, or a more modern compiler, will probably fix your issue.

Timothy Jones
  • 21,495
  • 6
  • 60
  • 90
1

Problem is with using years old C compiler like TurboC, as it works fine for me (I am Using DevC++) check this discussion for similar issue

exexzian
  • 7,782
  • 6
  • 41
  • 52