440,199 Members | 1,458 Online Need help? Post your question and get tips & solutions from a community of 440,199 IT Pros & Developers. It's quick & easy.

# Need HELP

 P: n/a Please can anyone help me on this code? I want to write all odd numbers in range from a to b but it doesn't work at all cases mainly when a is higher than b and when i type in negative numbers. Here is the code and i would appreciate anybody helping me. THANKS. #include #include void odd(float x, float y); void change(float x, float y); void odd(float x, float y) { int i; if (x>y) change(x,y); x=roundf(x); y=roundf(y); for(i=1;i<(y-x)+1;i++) if ( fmodf ((x+i),2)==1 || fmodf ((x+i),2)==-1 ) printf( "%f ",(x+i) ); } void change(float x, float y) { float c; c=x; x=y; y=c; } main() { float a,b; printf("Type two real numbers :"); scanf("%f%f",&a,&b); odd(a,b); getchar(); getchar(); } Nov 14 '05 #1
9 Replies

 P: n/a kupiko wrote: Please can anyone help me on this code? I want to write all odd numbers in range from a to b but it doesn't work at all cases mainly when a is higher than b and when i type in negative numbers. Here is the code and i would appreciate anybody helping me. THANKS. #include #include void odd(float x, float y); void change(float x, float y); void odd(float x, float y) { int i; if (x>y) change(x,y); x=roundf(x); y=roundf(y); for(i=1;i<(y-x)+1;i++) if ( fmodf ((x+i),2)==1 || fmodf ((x+i),2)==-1 ) printf( "%f ",(x+i) ); } void change(float x, float y) { float c; c=x; x=y; y=c; } Just on first glance (i.e. I wouldn't swear that you don't have other bugs...), your problem is in how you call change(). When you call a C function, the function works on local copies of the parameters -- not on the values in the scope of the caller. So here -- you have the following: main gets a and b (main:a, main:b for short), calls odd with them. odd gets copies of main:a, main:b which are named odd:x, odd:y. main:a and main:b are (of course) unchanged). odd calls change with odd:x, odd:y -- and change's copies are called change:x, change:y. change:x, change:y and change:c are modified and change returns.. leaving odd:x and odd:y unchanged. So if you want to do this, I'd recommend one of the following: i) Rewrite change to be a macro, not a function so that you work with the actual variables you intend, such as: #define SWAP_FLOAT(float __x, float __y ) \ do { \ float __temp; \ __temp = __x; \ __x = __y; \ __y = __temp; \ } while (0) This lets you use SWAP_FLOAT as if it were a function, having odd() do SWAP_FLOAT(x, y) will change the variables in odd()'s scope [odd:x, odd:y] as you intend. ii) Rewrite change to work with the addresses of the variables, not the contents. void change (float *x, float *y) { float temp; if ( x == NULL || y == NULL ) { /* Die with error? Your call on handling */ return; } temp = *x; *x = *y; *y = temp; } Don main() { float a,b; printf("Type two real numbers :"); scanf("%f%f",&a,&b); odd(a,b); getchar(); getchar(); } Nov 14 '05 #2

 P: n/a >void change (float *x, float *y){ float temp; if ( x == NULL || y == NULL ) { /* Die with error? Your call on >handling */ return; } temp = *x; *x = *y; *y = temp;} Thank you very much for this advice. It's first time I see how to use pointers and it is useful as I see but still there are errors in my rewritten code. And i don't know anything about pointers so i can't solve what it mean could you please help me? I haven't much time otherwise i would not annoy you. ERROR: cannot convert `float' to `float*' for argument `1' to `void vymen(float*, float*)' CODE: #include #include void odd(float x, float y); void change(float *x, float *y); void odd(float x, float y) { int i; if (x>y) change(x,y); x=roundf(x); y=roundf(y); for(i=1;i<(y-x)+1;i++) if ( fmodf ((x+i),2)==1 || fmodf ((x+i),2)==-1 ) printf( "%f ",(x+i) ); } void change(float *x, float *y) { float c; if ( x==NULL || y==NULL ) return; c=*x; *x=*y; *y=c; } main() { float a,b; printf("Type two real numbers :"); scanf("%f%f",&a,&b); odd(a,b); getchar(); getchar(); } Nov 14 '05 #3

 P: n/a kupiko wrote:void change (float *x, float *y){ float temp; if ( x == NULL || y == NULL ) { /* Die with error? Your call on >handling */ return; } temp = *x; *x = *y; *y = temp;} Thank you very much for this advice. It's first time I see how to use pointers and it is useful as I see but still there are errors in my rewritten code. And i don't know anything about pointers so i can't solve what it mean could you please help me? I haven't much time otherwise i would not annoy you. It isn't annoying me... just a sign my mind isn't focused on work yet this morning. :) Sorry I wasn't more clear. ERROR: cannot convert `float' to `float*' for argument `1' to `void vymen(float*, float*)' Right -- we've changed the function to take pointers, which means you need to call it with pointers (aka the address of x, not x itself). CODE: #include #include void odd(float x, float y); void change(float *x, float *y); void odd(float x, float y) { int i; if (x>y) change(x,y); if ( x > y ) { change(&x, &y); } Don x=roundf(x); y=roundf(y); for(i=1;i<(y-x)+1;i++) if ( fmodf ((x+i),2)==1 || fmodf ((x+i),2)==-1 ) printf( "%f ",(x+i) ); } void change(float *x, float *y) { float c; if ( x==NULL || y==NULL ) return; c=*x; *x=*y; *y=c; } main() { float a,b; printf("Type two real numbers :"); scanf("%f%f",&a,&b); odd(a,b); getchar(); getchar(); } Nov 14 '05 #4

 P: n/a On Fri, 01 Apr 2005 14:07:53 +0000, Don Morris wrote: #define SWAP_FLOAT(float __x, float __y ) \ Is this a C99 thing? I've never seen a function-like macro defined this way (with types) and my compiler won't accept it. Maybe you meant to type: #define SWAP_FLOAT(__x, __y ) \ do { \ float __temp; \ __temp = __x; \ __x = __y; \ __y = __temp; \ } while (0) And why are you using the undercores in the identifier names? They seem to me to be completely unnecessary. Couldn't you just do it like this: #define SWAP_FLOAT(x, y ) \ do { \ float temp; \ temp = x; \ x = y; \ y = temp; \ } while (0) --Mac Nov 14 '05 #5

 P: n/a Mac wrote: On Fri, 01 Apr 2005 14:07:53 +0000, Don Morris wrote:#define SWAP_FLOAT(float __x, float __y ) \ Is this a C99 thing? I've never seen a function-like macro defined this way (with types) and my compiler won't accept it. And your compiler is correct! Maybe you meant to type: #define SWAP_FLOAT(__x, __y ) \do { \ float __temp; \ __temp = __x; \ __x = __y; \ __y = __temp; \} while (0) And why are you using the undercores in the identifier names? They seem to me to be completely unnecessary. Couldn't you just do it like this: Well, it was a misguided attempt at avoiding inadvertent variable capture. Identifiers starting with an underscore are reserved for the implementation. #define SWAP_FLOAT(x, y ) \ do { \ float temp; \ temp = x; \ x = y; \ y = temp; \ } while (0) Consider, however, what happens if you have the following code: void nonsensical() { float temp = 3.0; float other = 4.0; printf("before swap, temp = %f, other = %f", temp, other); SWAP_FLOAT(temp, other); printf("after swap, temp = %f, other = %f", temp, other); } Macros can be useful -- but (particularly if they declare variables) can bite you in the^H^H^H^H^H^H^H^H^H^H^H^H^H^H^Hcause problems. HTH, --ag -- Artie Gold -- Austin, Texas http://it-matters.blogspot.com (new post 12/5) http://www.cafepress.com/goldsays Nov 14 '05 #6

 P: n/a Artie Gold wrote: Mac wrote: #define SWAP_FLOAT(x, y ) \ do { \ float temp; \ temp = x; \ x = y; \ y = temp; \ } while (0) Consider, however, what happens if you have the following code: void nonsensical() { float temp = 3.0; float other = 4.0; printf("before swap, temp = %f, other = %f", temp, other); SWAP_FLOAT(temp, other); printf("after swap, temp = %f, other = %f", temp, other); } The problem is that 'temp' in the macro clashes with 'temp' in the parameter. So how about this: #define SWAP_FLOAT(x, y) \ do { \ float x##y; \ x##y = x; \ x = y; \ y = x##y; \ } while (0) No possibility of clashes now (even if 'x' and 'y' are #defined to something else already, I think) Nov 14 '05 #7

 P: n/a Old Wolf wrote: ... The problem is that 'temp' in the macro clashes with 'temp' in the parameter. So how about this: #define SWAP_FLOAT(x, y) \ do { \ float x##y; \ x##y = x; \ x = y; \ y = x##y; \ } while (0) SWAP_FLOAT(er, rno); SWAP_FLOAT(x, *y); -- Peter Nov 14 '05 #8

 P: n/a Peter Nilsson wrote: Old Wolf wrote: ... The problem is that 'temp' in the macro clashes with 'temp' in the parameter. So how about this: #define SWAP_FLOAT(x, y) \ do { \ float x##y; \ x##y = x; \ x = y; \ y = x##y; \ } while (0) SWAP_FLOAT(er, rno); No problem, local errno takes precedence over global errno. SWAP_FLOAT(x, *y); Ah, serious problem.I guess that takes us back to the pick-something-weird-and-wacky option. Nov 14 '05 #9

 P: n/a Old Wolf wrote: Peter Nilsson wrote: Old Wolf wrote: ... The problem is that 'temp' in the macro clashes with 'temp' in the parameter. So how about this: #define SWAP_FLOAT(x, y) \ do { \ float x##y; \ x##y = x; \ x = y; \ y = x##y; \ } while (0) SWAP_FLOAT(er, rno); No problem, local errno takes precedence over global errno. You don't seem to realise that, if is included, errno is a _macro_ "...which expands to a modifiable lvalue that has type int". [7.5p2] It needn't expand to the name of a 'global'. SWAP_FLOAT(x, *y); Ah, serious problem.I guess that takes us back to the pick-something-weird-and-wacky option. Or to 'inline' under C99, if such an implementation is available. -- Peter Nov 14 '05 #10

### This discussion thread is closed

Replies have been disabled for this discussion. 