The UNIX and Linux Forums  

Go Back   The UNIX and Linux Forums > Top Forums > High Level Programming
.
google unix.com



High Level Programming Post questions about C, C++, Java, SQL, and other programming languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
will this script in crontab effect SUN 9?? thepurple SUN Solaris 2 10-05-2007 04:31 AM
Temporarily disable effect of set -e in ksh ugeek Shell Programming and Scripting 1 03-28-2007 04:21 AM
How do properties effect script? Chiefos UNIX for Dummies Questions & Answers 1 06-21-2006 06:23 AM
Effect of Preemptive Kernel sriram.ec UNIX for Advanced & Expert Users 2 03-15-2006 12:43 AM
recursive effect!! sskb UNIX for Dummies Questions & Answers 2 01-30-2003 11:05 AM

Reply
 
Submit Tools LinkBack Thread Tools Search this Thread Rating: Thread Rating: 1 votes, 2.00 average. Display Modes
  #1 (permalink)  
Old 11-20-2008
Registered User
 

Join Date: Oct 2008
Posts: 39
strange effect: if ... else in C influence a previous statement

I write a short code in c

it may work well, but when I add an if ... else ... structure, a computation before the structure can not give a correct result

compilation and run can do well, but the result is wrong. Very strange

(1)
y2 = expression; //y2 = 0 always 0 error
.................

add : if(a->is_root) c = m2 - y2;
else f = m2 - y2;


(2)

y2 = expression; //y2 = 0 always 0 error
.................

add : if(a->is_root) c = m2 - y2;
if(!a->is_root) f = m2 - y2;


(3)
y2 = expression; // y2 = normal value; normal
.................

add : //if(a->is_root) c = m2 - y2;
if(!a->is_root) f = m2 - y2;


(4)

y2 = expression; // y2 = normal value; normal
.................

add : if(a->is_root) c = m2 - y2;
//if(!a->is_root) f = m2 - y2;

(5)
y2 = expression; // y2 = normal value; normal

add : //if(a->is_root) c = m2 - y2;
//if(!a->is_root) f = m2 - y2;

Trouble: can not use if... else ... normally

Question: (1) if... else ... can influence a previous statement, why?
(2) How to solve the problem?

Last edited by cdbug; 11-20-2008 at 04:38 AM..
Reply With Quote
Sponsored Links
  #2 (permalink)  
Old 11-20-2008
Registered User
 

Join Date: Aug 2008
Location: Portugal
Posts: 242
It would be helpful if you could provide an compilable example of your problem.
Reply With Quote
  #3 (permalink)  
Old 11-20-2008
Registered User
 

Join Date: Oct 2008
Posts: 39
This happens in a large function, which has a relatively complicated algorithm.

Simply speaking, its structure is as such:
___________________________________________________________
some basic calculation
------------------------------

y = expression;

-------------------------------
____________________________________________________________
some operations
--------------------------------

--------------------------------

if {
block 1;
}

else{
if { block 2; }
else { block 3; }
}

The structure of blocks 2 and 3 will change the way in which y is calculated. The result is wrong. I check it through gdb. The five results above are obtained at the same environment except for the changes in the two blocks

In many executions, y is always equal to 0. Otherwise, it will be far larger than a right value.

But when either or each of the two blocks is removed, y will obtain a normal value.

I can not understand
Reply With Quote
  #4 (permalink)  
Old 11-20-2008
Registered User
 

Join Date: Dec 2007
Location: Paris
Posts: 760
I'm afraid your description of the problem give no clue.
Without a compilable example, nobody is going to guess what is wrong with your code.
Reply With Quote
  #5 (permalink)  
Old 11-21-2008
Registered User
 

Join Date: Aug 2008
Location: Portugal
Posts: 242
The only possible situation here is that block2 or block3 are overflowing a variable on your function's stack and your y var is being changed.

A function's stack is composed (growing from high memory to low memory) by variables (in reverse order), eip, esp, function name and esp.

Here is a simple example for your possible situation:
Code:
void of()
{
    char a[10];
    char b[10];
    strcpy (a, "aaaaaaaaaa");
    printf ("%s\n", a);
    strcpy(b, "bbbbbbbbbboverflow");
    printf ("%s\n", a);
}

void
main ()
{
    of();
}
As you will be able to see, variable b overflows into variable a.
Reply With Quote
  #6 (permalink)  
Old 11-23-2008
Registered User
 

Join Date: Oct 2008
Posts: 39
The mistaken value is assigned to y when execute 'y = expression;'

in gdb, 'p y' will give the mistaken value after runing the above statement.

but ' p expression' gives the right value.

block2 and block3 are like this:

if(a->is_root) c = m2 - y2;
else f = m2 - y2;

As said before:
only one statement: if(a->is_root) c = m2 - y2; // y2 normal
only one statement: if(!a->is_root) f = m2 - y2; // y2 normal

but:

if(a->is_root) c = m2 - y2;
else f = m2 - y2;

or

if(a->is_root) c = m2 - y2;
if(!a->is_root) f = m2 - y2;

both make y2 abnormal. 'y2 = expression' is far away from if__ else __ structure

Thanks for your teaching

Last edited by cdbug; 11-23-2008 at 03:28 AM..
Reply With Quote
  #7 (permalink)  
Old 11-23-2008
Registered User
 

Join Date: Aug 2008
Location: Portugal
Posts: 242
Hum! What kind of var is y2? What is the expression assigned to it? There are really several things that can cause that so is a bit hard to help you without the full compilable code.
Reply With Quote
Google The UNIX and Linux Forums
Reply

Bookmarks

Tags
None

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:




All times are GMT -4. The time now is 04:59 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited.
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66