|
First, if it's returning a large value, then my suggestion as that 'p' is between 0.000611657 && 22.06495.
On the other hand, how do you know that x was assigned '0'?
Second, for programming clarity, may I suggest one of the following: (my preference is #2)
1. getting rid of the two returns and have only one return after the closing brace ({) of the else,
if (a)
{
...
b = 1
}
else
{
b = 2
}
return b;
2. OR, remove the else
if (a)
{
b = 1;
return b;
}
b = 2;
return b;
"If your actions inspire others to dream more, learn more, do more and become more, you are a leader." - John Quincy Adams
|
|
|
|
|
Thank you for your reply. Actually what the code computes is the steam saturation temperature given pressure. The abnormally large value comes in when the p is not between the 0.000611657 and 22.06495. I had no luck with your modification, I am assumin it is in the syntax but have had no luck thus far.
|
|
|
|
|
you posted
if(p >= 0.000611657 && p <= 22.06495)
which fixed up reads:
if(p >= 0.000611657 && p <= 22.06495)
so that means p would be between 0.000611657 && 22.06495
if you want p to be outside that range, then change it to read
if(p < 0.000611657 || p > 22.06495)
"If your actions inspire others to dream more, learn more, do more and become more, you are a leader." - John Quincy Adams
|
|
|
|
|
I may not be clear on the code. p must be between these ranges for the calculation to execute, if it is outside of these ranges then the calculation does not apply and I want a 0 or a -1 returned.
|
|
|
|
|
ah ok, then my question still is, how do you know that x is being assigned 0? or that p is NOT in the desired range?
"If your actions inspire others to dream more, learn more, do more and become more, you are a leader." - John Quincy Adams
|
|
|
|
|
Only in that from the Excel spreadsheet where I am entering the variable p into the function I can set it so that it is outside of the range of the if statement parameters. The value is returns when this is so is something like 1.7878e+308.
|
|
|
|
|
Try throwing in some MessageBox's so you can so the values in the method and the logic flow...
"If your actions inspire others to dream more, learn more, do more and become more, you are a leader." - John Quincy Adams
|
|
|
|
|
I played with the code, this returns the values I need:
double __stdcall Ts_P(double &arg)//psia input, DegF output
{
double h_reg_1;
double h_reg_2;
double h_reg_3;
double h_reg_4;
double x;
double vl_reg1[10] = {1167.0521452767, -724213.16703206, -17.073846940092, 12020.82470247,-3232555.0322333, 14.91510861353, -4823.2657361591, 405113.40542057, -0.23855557567849, 650.17534844798};
double p = (arg * 0.0068947572); //convert psia to MPa
double beta = pow(p,0.25);
if(p >= 0.000611657 && p <= 22.06495)
{
h_reg_1 = pow(beta,2) + vl_reg1[2] * beta + vl_reg1[5];//IFC 97 E term
h_reg_2 = vl_reg1[0] * pow(beta,2) + vl_reg1[3] * beta + vl_reg1[6];//IFC 97 F term
h_reg_3 = vl_reg1[1] * pow(beta,2) + vl_reg1[4] * beta + vl_reg1[7];//IFC 97 G term
h_reg_4 = (2 * h_reg_3) / ((-1*h_reg_2) - (pow((pow(h_reg_2,2) - 4 * h_reg_1 * h_reg_3), 0.5)));//IFC 97 D term
x = (((vl_reg1[9] + h_reg_4 - pow((pow((vl_reg1[9] + h_reg_4),2) - 4 * (vl_reg1[8] + vl_reg1[9] * h_reg_4)),0.5)) / 2) - 273.15) * (1.8) + 32;
return(x);
}
else
{
x=-1;
}
return(x);
}
|
|
|
|
|
congratulations! good for you!
"If your actions inspire others to dream more, learn more, do more and become more, you are a leader." - John Quincy Adams
|
|
|
|
|
Thank you very much for your help.....in troubleshooting this I realize that I need to figure out how to operate the debugger. I can attach it to Excel and add the breakpoints, however it seems to do nothing. Again, thank you so much...
|
|
|
|
|
also, have you tried attaching the code to a debugger and stepping through to see what actually happens?
if you can't do that, then try using some tracing statements to see what the values are and where the logic actually flows.
"If your actions inspire others to dream more, learn more, do more and become more, you are a leader." - John Quincy Adams
|
|
|
|
|
(please reformat your code).
Have you use the debugger to check the values and the code flow ?
Watched code never compiles.
|
|
|
|
|
When you say please reformat the code I am not sure what you are suggesting.
When I try to run the debugger it says that it cannot open the .dll file that was created. The only way I can run it is to open up the excel file that references the .dll and plug in values for p that are either inside or outside of the range of the if statement and view the results.
|
|
|
|
|
attach the debugger to excel. and make sure the dll is loaded before the offending code is called (or call it at least once).
then set a breakpoint in the offending code file. and cause excel to call the function.
"If your actions inspire others to dream more, learn more, do more and become more, you are a leader." - John Quincy Adams
|
|
|
|
|
jharn wrote: When you say please reformat the code I am not sure what you are suggesting.
Your code snippet is barely readable, since all special characters are escaped and the formatting is not kept. Check the forum guidelines (the message "How to ask a question" on top of this message board). The point nr 7 explains exactly what you have to do when you want to paste a code snippet.
|
|
|
|
|
I think what he means is that you should use the formatting that this forum provides, either by marking your code block and clicking on the beige-underlined formatting button titled code block , or by manually surrounding your code block with the tags <pre> and </pre> . It should then look something like this in your editor window:
<pre>if (a) {
b = 1;
}
else {
b = 0;
}<pre>
(that last <pre> should have been </pre> instead actually, but that would have prematurely ended my example since I used the same tags to format it in the first place )
|
|
|
|
|
jharn wrote:
double p = (arg * 0.0068947572);
I think the above line should read:
double p = (*arg * 0.0068947572);
I must get a clever new signature for 2011.
|
|
|
|
|
I've come across a situation where I don't understand entirely what's happening regarding references (not pointers).
If we did this for example:
int someNumber = 5;
int& get()
{
return someNumber;
}
void main()
{
int a = get();
get() = 52;
int b = get();
}
We can change the value of some number by setting the return value of get() (or the long way around int& ref = get(); ref = 52; )
But, in this case I'm not sure what exactly is going on:
class bclass
{
public:
bclass(){}
virtual void cheese()=0;
bclass(const bclass& other){ _asm{int 3} }
};
class dclass : public bclass
{
public:
dclass(){val=5;}
void cheese() { _asm{int 3} }
dclass(const dclass& other){ _asm{int 3} }
int val;
};
dclass base;
bclass& get()
{
return base;
}
void main()
{
dclass argh;
argh.val = 2;
get() = argh;
get().cheese();
}
What happens when we try to set the return value of get() ? Why doesn't anything happen? I also tried it with just references to bclass so simply trying to set a reference to a bclass to a reference of a different bclass and still nothing.
Also, before anybody says anything I'm not actually trying to set the return value to something else, or set any other variables in some bizarre manner it's just something I've come across quite by accident.
EDIT: Or a much simpler example:
bclass& argh = d2();
bclass& hmm = dclass();
hmm = argh;
hmm.cheese();
Where dclass's implementation of cheese is called
|
|
|
|
|
When you assign argh to get(), you are calling an assignment operator. I do not remember the details of its interaction with the copy constructor, but the code fragment below triggers a breakpoint.
class bclass
{
public:
bclass(){}
virtual void cheese()=0;
bclass(const bclass& other){ _asm{int 3} }
bclass& operator= (bclass const& f) { _asm{int 3} } };
|
|
|
|
|
What you're trying to do is reassign the reference, which you can't do. It's a common mistake to make. What is actually occurring is the operator= is being called, but since you don't supply an implementation, it calls the compiler generated one. The compiler generated one essentially does nothing (EDIT: in this case).
For primitive values, like in your first example, works like you would think because it's just transferring values.
You can "reassign" the reference like this:
&get() = &argh;
"If your actions inspire others to dream more, learn more, do more and become more, you are a leader." - John Quincy Adams
modified on Thursday, January 27, 2011 1:59 PM
|
|
|
|
|
&get() = &argh ...
I understand what you mean but ... is that legal C++ or just a hack around a (sort of) compiler bug?
There is nothing like that in the c++ reference book!
2 bugs found.
> recompile ...
65534 bugs found.
|
|
|
|
|
Just to clear up some of the confusion:
To the compiler, a reference is equivalent to a pointer in everything but the method of dereferencing. It treats the reference as a pointer to a memory location that occupies the contents of some variable.
To the programmer, a reference is equivalent to an alias. Through that reference you can manipulate the contents of another variable without knowing it's orginal name, by using an alternate name. Your method get() effectively returns a temporary alternate alias to your globale variable. You can assign this to a variable of type reference to bclass (bclass&) in order to use that variable as an alias to your global variable, or, like you did, you can just use the temporary alias immediately.
ahmed's suggestion was that you can reassign the alias to another variable, in this case the local variable argh. But it wouldn't work as the address of operator itself is not a reference, and therefore get() is not an l-value. Reassigning a variable of type reference to another variable is not possible.
|
|
|
|
|
no, it's not legal, it was just an attempt to clarify what he was attempting to do.
"If your actions inspire others to dream more, learn more, do more and become more, you are a leader." - John Quincy Adams
|
|
|
|
|
ahmed zahmed wrote: The compiler generated one essentially does nothing.
It does copy all members of the class by using each members assignment operator, default or explicitly declared and implemented.
|
|
|
|
|
Since bclass's oeprators are being called, only members of bclass are being copied, i. e. nothing. See my edit on my previous response.
|
|
|
|