The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

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 01:43 AM
recursive effect!! sskb UNIX for Dummies Questions & Answers 2 01-30-2003 12:05 PM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Powered by Powered by Google
 
LinkBack Thread Tools Search this Thread Rating: Thread Rating: 1 votes, 2.00 average. Display Modes
  #1 (permalink)  
Old 11-20-2008
cdbug cdbug is offline
Registered User
  
 

Join Date: Oct 2008
Posts: 52
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 05:38 AM..
  #2 (permalink)  
Old 11-20-2008
redoubtable redoubtable is offline
Registered User
  
 

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

Join Date: Oct 2008
Posts: 52
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
  #4 (permalink)  
Old 11-20-2008
jlliagre jlliagre is online now Forum Advisor  
ɹǝsn sıɹɐlosuǝdo
  
 

Join Date: Dec 2007
Location: Paris
Posts: 1,380
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.
  #5 (permalink)  
Old 11-21-2008
redoubtable redoubtable is offline
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.
  #6 (permalink)  
Old 11-23-2008
cdbug cdbug is offline
Registered User
  
 

Join Date: Oct 2008
Posts: 52
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 04:28 AM..
  #7 (permalink)  
Old 11-23-2008
redoubtable redoubtable is offline
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.
Sponsored Links
Closed Thread

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT -4. The time now is 03:03 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
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