|
This code does not call time_hr(), to change the values stored in t.
INTP
"The more help VB provides VB programmers, the more miserable your life as a C++ programmer becomes."
Andrew W. Troelsen
|
|
|
|
|
thank you very much. now i'm in a new fix. the ffg code returns just the 1st values of the array, t[0] and pwf[0]..viz:
<br />
#include <math><br />
#include "stdafx.h"<br />
#include <fstream><br />
#include <iomanip><br />
#include <iostream><br />
using namespace std;<br />
<br />
const double PI = 3.141592653589793238462643383279502884197;<br />
double q = 1000;
double pi = 5000;
double rw = 0.25;
double h = 100;
double por = 0.2;<br />
double k = 200;
double ct = 0.00003;
double Bo = 1.2;
double visc = 1.3;
double C = 0.5;
double S = 10;<br />
double tp = 200;
double delta_t = 200;
double a0,a1,a2,a3,a4,a5,b1,b2,b3,b4,c1,c2,c3,c4;<br />
double a[50],b[50],c[50],expint;<br />
<br />
double t[50],qsf[50],alpha,x[50],EI[50],beta[50],pd[50],pwf[50];<br />
<br />
double time_hr()<br />
{<br />
double N=49.0;<br />
for (int i=0;i<50;i++)<br />
{<br />
t[i] = 0.01*exp((i/N)*log(200/0.01));<br />
}<br />
return t[i];<br />
}<br />
<br />
double wbs()<br />
{<br />
a0 = -0.57721566;<br />
a1 = 0.99999193;<br />
a2 = -0.24991055;<br />
a3 = 0.05519968;<br />
a4 = -0.00976004;<br />
a5 = 0.00107857;<br />
<br />
b1 = 8.5733287401;<br />
b2 = 18.059016973;<br />
b3 = 8.6347608925;<br />
b4 = 0.2677737343;<br />
<br />
c1 = 9.5733223454;<br />
c2 = 25.6329561486;<br />
c3 = 21.0996530827;<br />
c4 = 3.9584969228;<br />
<br />
int N = 49;<br />
alpha = (4/(3*PI*C))*(k*h/visc);<br />
<br />
for (int i=0;i<50;i++)<br />
{<br />
t[i] = 0.01*exp((i/N)*log(200/0.01));<br />
qsf[i] = q*(1-exp(-1*alpha*t[i]));<br />
x[i] = (948*por*visc*ct*pow(rw,2))/(k*t[i]);<br />
<br />
if (x[i]<=0.01)<br />
{<br />
EI[i] = log(x[i])+0.5772;<br />
}<br />
else<br />
{<br />
a[i] = pow(x[i],4)+(b1*pow(x[i],3))+(b2*pow(x[i],2))+(b3*x[i])+b4;<br />
b[i] = pow(x[i],4)+(c1*pow(x[i],3))+(c2*pow(x[i],2))+(c3*x[i])+c4;<br />
EI[i]= (1/(x[i]*exp(x[i])))*a[i]/b[i];<br />
}<br />
<br />
beta[i] = (-0.5*EI[i])+S;<br />
pd[i] = (1-(1/exp(alpha*t[i])))*beta[i];<br />
pwf[i] = pi-((141.2*q*visc*Bo*pd[i])/(k*h));<br />
}<br />
return pwf[i];<br />
}<br />
<br />
<br />
int main(int argc, char* argv[])<br />
{<br />
ofstream outputdeck;<br />
outputdeck.open("output.txt", ios::out);<br />
<br />
outputdeck<<"Type A: With Wellbore Storage.\n";<br />
outputdeck<<"Time"<<setw(5)<<"Pwf"<<setw(5)<<endl;<br />
wbs();<br />
time_hr();<br />
for(int i=0;i<50;i++)<br />
{<br />
outputdeck<<t[i]<<setw(10)<<pwf[i]<<endl;<br />
}<br />
<br />
<br />
<br />
return 0;<br />
}<br /> also, when i called the fxns in reverse order, viz:
<br />
time_hr();<br />
wbs(); t[i] displayed correctly, but pwf[i] still returns pwf[0]. Please help!
|
|
|
|
|
Same causes, same consequences
Please, modify the other line int N=49 !
Bye
|
|
|
|
|
chage:
wbs();
time_hr();
with:
time_hr();
wbs();
you did not fill t[i].
|
|
|
|
|
Yes, the suggestions worked, including $88's. What is your take on this code?
<br />
#include <br />
#include "stdafx.h"<br />
#include <br />
#include <br />
#include <br />
using namespace std;<br />
<br />
double a[10000],b[10000],x[10000],expint[10000],beta[10000],dimP2[10000];<br />
double t[50],alpha[50],dimP[50];<br />
int i,j;<br />
<br />
double ei(double x[10000])<br />
{<br />
double a0,a1,a2,a3,a4,a5,b1,b2,b3,b4,c1,c2,c3,c4;<br />
<br />
a0 = -0.57721566;<br />
a1 = 0.99999193;<br />
a2 = -0.24991055;<br />
a3 = 0.05519968;<br />
a4 = -0.00976004;<br />
a5 = 0.00107857;<br />
<br />
b1 = 8.5733287401;<br />
b2 = 18.059016973;<br />
b3 = 8.6347608925;<br />
b4 = 0.2677737343;<br />
<br />
c1 = 9.5733223454;<br />
c2 = 25.6329561486;<br />
c3 = 21.0996530827;<br />
c4 = 3.9584969228;<br />
<br />
if (x[i]<=0)<br />
{<br />
expint[i] = -999;<br />
}<br />
<br />
if (x[i]>=1)<br />
{<br />
a[i] = pow(x[i],4)+(b1*pow(x[i],3))+(b2*pow(x[i],2))+(b3*x[i])+b4;<br />
b[i] = pow(x[i],4)+(c1*pow(x[i],3))+(c2*pow(x[i],2))+(c3*x[i])+c4;<br />
expint[i] = (1/(x[i]*exp(x[i])))*a[i]/b[i];<br />
}<br />
<br />
if((0 {<br />
expint[i] = a0+(a1*x[i])+(a2*pow(x[i],2))+(a3*pow(x[i],3))+(a4*pow(x[i],4))+(a5*pow(x[i],5))-log(x[i]);<br />
}<br />
return expint[i];<br />
}<br />
<br />
double time_hr()<br />
{<br />
double N=49.0;<br />
for (int i=0;i<50;i++)<br />
{<br />
t[i] = 0.01*exp((i/N)*log(10/0.01));<br />
}<br />
return t[i];<br />
}<br />
<br />
double pD()<br />
{<br />
double rw = 0.25;<br />
double ac = 43560;<br />
double A = 80*ac;<br />
<br />
double len_b = sqrt(0.5*A);<br />
double len_a = 2*len_b;<br />
double len_ri =0.5*sqrt(pow(len_a,2)+pow(len_b,2));<br />
<br />
alpha[i] = (-(pow(rw,2)/(4*A*t[i])));<br />
<br />
for(int i=0;i<50;i++)<br />
{<br />
for(int j=0;j<10000;j++)<br />
{<br />
dimP2[j] +=-(0.5*ei(-(1/(4*A*t[i]))*(j+1)*pow(len_ri,2)));
}<br />
dimP[i]=(-0.5*ei(alpha[i]))+dimP2[j];
}<br />
return dimP[i];<br />
}<br />
At lines * and **, i got the error c2664:
'ei':cannot convert parameter 1 from double to double[]
|
|
|
|
|
*** for(int i=0;i<50;i++)
{
for(int j=0;j<10000;j++)
{
double d[10000];
d[i] = -(1/(4*A*t[i]))*(j+1)*pow(len_ri,2);
dimP2[j] +=-(0.5*ei(d));//*
}
dimP[i]=(-0.5*ei(alpha))+dimP2[j];//**
}
*** if((0 { -> if(x[i]==0) {
*** what for range from 0 to 1
|
|
|
|
|
Hello,
The pb is due to the fact that i and N are both integers.
So the value of i/N is always 0 except for i = 49.
Replace int N=49 by
double N=49;
By
|
|
|
|
|
Yes, the suggestions worked, including Branislav's. What is your take on this code?
<br />
#include <math><br />
#include "stdafx.h"<br />
#include <fstream><br />
#include <iomanip><br />
#include <iostream><br />
using namespace std;<br />
<br />
double a[10000],b[10000],x[10000],expint[10000],beta[10000],dimP2[10000];<br />
double t[50],alpha[50],dimP[50];<br />
int i,j;<br />
<br />
double ei(double x[10000])<br />
{<br />
double a0,a1,a2,a3,a4,a5,b1,b2,b3,b4,c1,c2,c3,c4;<br />
<br />
a0 = -0.57721566;<br />
a1 = 0.99999193;<br />
a2 = -0.24991055;<br />
a3 = 0.05519968;<br />
a4 = -0.00976004;<br />
a5 = 0.00107857;<br />
<br />
b1 = 8.5733287401;<br />
b2 = 18.059016973;<br />
b3 = 8.6347608925;<br />
b4 = 0.2677737343;<br />
<br />
c1 = 9.5733223454;<br />
c2 = 25.6329561486;<br />
c3 = 21.0996530827;<br />
c4 = 3.9584969228;<br />
<br />
if (x[i]<=0)<br />
{<br />
expint[i] = -999;<br />
}<br />
<br />
if (x[i]>=1)<br />
{<br />
a[i] = pow(x[i],4)+(b1*pow(x[i],3))+(b2*pow(x[i],2))+(b3*x[i])+b4;<br />
b[i] = pow(x[i],4)+(c1*pow(x[i],3))+(c2*pow(x[i],2))+(c3*x[i])+c4;<br />
expint[i] = (1/(x[i]*exp(x[i])))*a[i]/b[i];<br />
}<br />
<br />
if((0<x[i])&&(x[i]<1))<br />
{<br />
expint[i] = a0+(a1*x[i])+(a2*pow(x[i],2))+(a3*pow(x[i],3))+(a4*pow(x[i],4))+(a5*pow(x[i],5))-log(x[i]);<br />
}<br />
return expint[i];<br />
}<br />
<br />
double time_hr()<br />
{<br />
double N=49.0;<br />
for (int i=0;i<50;i++)<br />
{<br />
t[i] = 0.01*exp((i/N)*log(10/0.01));<br />
}<br />
return t[i];<br />
}<br />
<br />
double pD()<br />
{<br />
double rw = 0.25;<br />
double ac = 43560;<br />
double A = 80*ac;<br />
<br />
double len_b = sqrt(0.5*A);<br />
double len_a = 2*len_b;<br />
double len_ri =0.5*sqrt(pow(len_a,2)+pow(len_b,2));<br />
<br />
alpha[i] = (-(pow(rw,2)/(4*A*t[i])));<br />
<br />
for(int i=0;i<50;i++)<br />
{<br />
for(int j=0;j<10000;j++)<br />
{<br />
dimP2[j] +=-(0.5*ei(-(1/(4*A*t[i]))*(j+1)*pow(len_ri,2)));
}<br />
dimP[i]=(-0.5*ei(alpha[i]))+dimP2[j];
}<br />
return dimP[i];<br />
}
At lines * and **, i got the error c2664:
'ei':cannot convert parameter 1 from double to double[]
|
|
|
|
|
The error is clear: You declared ei taking one parameter which is a array of double and you call it with a double value.
I don't know the rest of the code but the arrays x, a, b, expint are not usefull since you always use the value for the current index i.
Try that if you want to change them into single value
#include
#include "stdafx.h"
#include
#include
#include
using namespace std;
double a,b,expint,beta[10000],dimP2[10000];
double t[50],alpha[50],dimP[50];
int i,j;
double ei(double x)
{
double a0,a1,a2,a3,a4,a5,b1,b2,b3,b4,c1,c2,c3,c4;
a0 = -0.57721566;
a1 = 0.99999193;
a2 = -0.24991055;
a3 = 0.05519968;
a4 = -0.00976004;
a5 = 0.00107857;
b1 = 8.5733287401;
b2 = 18.059016973;
b3 = 8.6347608925;
b4 = 0.2677737343;
c1 = 9.5733223454;
c2 = 25.6329561486;
c3 = 21.0996530827;
c4 = 3.9584969228;
if (x<=0)
{
expint = -999;
}
if (x>=1)
{
a = pow(x,4)+(b1*pow(x,3))+(b2*pow(x,2))+(b3*x)+b4;
b = pow(x,4)+(c1*pow(x,3))+(c2*pow(x,2))+(c3*x)+c4;
expint = (1/(x*exp(x)))*a/b;
}
if((0 { //THIS SHALL NOT COMPILE PROPERLY
expint = a0+(a1*x)+(a2*pow(x,2))+(a3*pow(x,3))+(a4*pow(x,4))+(a5*pow(x,5))-log(x);
}
return expint;
}
double time_hr()
{
double N=49.0;
for (int i=0;i<50;i++)
{
t[i] = 0.01*exp((i/N)*log(10/0.01));
}
return t[i];
}
double pD()
{
double rw = 0.25;
double ac = 43560;
double A = 80*ac;
double len_b = sqrt(0.5*A);
double len_a = 2*len_b;
double len_ri =0.5*sqrt(pow(len_a,2)+pow(len_b,2));
alpha[i] = (-(pow(rw,2)/(4*A*t[i])));
for(int i=0;i<50;i++)
{
for(int j=0;j<10000;j++)
{
dimP2[j] +=-(0.5*ei(-(1/(4*A*t[i]))*(j+1)*pow(len_ri,2)));//*
}
dimP[i]=(-0.5*ei(alpha[i]))+dimP2[j];//**
}
return dimP[i];
}
Or try that if you need to keep the intermediate arrays:
#include
#include "stdafx.h"
#include
#include
#include
using namespace std;
double a[10000],b[10000],x[10000],expint[10000],beta[10000],dimP2[10000];
double t[50],alpha[50],dimP[50];
int i,j;
double ei(double v)
{
double a0,a1,a2,a3,a4,a5,b1,b2,b3,b4,c1,c2,c3,c4;
x[i]=v;
a0 = -0.57721566;
a1 = 0.99999193;
a2 = -0.24991055;
a3 = 0.05519968;
a4 = -0.00976004;
a5 = 0.00107857;
b1 = 8.5733287401;
b2 = 18.059016973;
b3 = 8.6347608925;
b4 = 0.2677737343;
c1 = 9.5733223454;
c2 = 25.6329561486;
c3 = 21.0996530827;
c4 = 3.9584969228;
if (x[i]<=0)
{
expint[i] = -999;
}
if (x[i]>=1)
{
a[i] = pow(x[i],4)+(b1*pow(x[i],3))+(b2*pow(x[i],2))+(b3*x[i])+b4;
b[i] = pow(x[i],4)+(c1*pow(x[i],3))+(c2*pow(x[i],2))+(c3*x[i])+c4;
expint[i] = (1/(x[i]*exp(x[i])))*a[i]/b[i];
}
if((0 {
expint[i] = a0+(a1*x[i])+(a2*pow(x[i],2))+(a3*pow(x[i],3))+(a4*pow(x[i],4))+(a5*pow(x[i],5))-log(x[i]);
}
return expint[i];
}
double time_hr()
{
double N=49.0;
for (int i=0;i<50;i++)
{
t[i] = 0.01*exp((i/N)*log(10/0.01));
}
return t[i];
}
double pD()
{
double rw = 0.25;
double ac = 43560;
double A = 80*ac;
double len_b = sqrt(0.5*A);
double len_a = 2*len_b;
double len_ri =0.5*sqrt(pow(len_a,2)+pow(len_b,2));
alpha[i] = (-(pow(rw,2)/(4*A*t[i])));
for(i=0;i<50;i++) // USE THE GLOBAL i because it is used in ei function
{ // but it is certainly the j that you want ...
// sorry I can't imagine whatyou want to do !
for(int j=0;j<10000;j++)
{
dimP2[j] +=-(0.5*ei(-(1/(4*A*t[i]))*(j+1)*pow(len_ri,2)));//*
}
dimP[i]=(-0.5*ei(alpha[i]))+dimP2[j];//**
}
return dimP[i];
}
Last thing: In function pD, you should initialize the dimP2 otherwise you use it without any initialization.
for(int j=0;j<10000;j++) {
dimP2[j]=0;
}
]
|
|
|
|
|
Anyone know of a good article on CP on Precompiled Headers? I tried to do a search, but the term is a common one so the number of matches was unhelpful.
|
|
|
|
|
|
Very helpful links!
Thanks!
|
|
|
|
|
Is there a single function to get a window's client rectangle in screen coordinates. I know other ways to do this but I was hoping there was a function to do it.
Ive had a look around but could not find anything. If you know please tell me. Thanks!
|
|
|
|
|
|
|
Thanks. I thought Id used the function before but I must have been mistaken. Thanks anyway!
|
|
|
|
|
Hi everyone,
I have some compilation problems related in using waveInOpen and waveInProc callback function.
Following is snippets of my code:
// function that calls in the waveInOpen
bool WaveIn::Start()
{
// open the wave in device
if(waveInOpen(&hwi, WAVE_MAPPER, &wformat, (DWORD)waveInProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) return false;
....
}
// callback function waveInProc
void CALLBACK WaveIn::waveInProc(HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance,
DWORD dwParam1, DWORD dwParam2)
{
switch(uMsg)
{
case WIM_DATA:
// ... uses member variables
}
}
The compilation error that I encounter is that waveInOpen parameter 4 (which is the callback function) cannot be casted. I have tried to cast the waveInProc parameter, but to no avail. It compiles alright if I make waveInProc static. However, if I make waveInProc static, it prevents me from modifying the member variables.
Thank you and your solutions are totally appreciated.
Thank you so much and all your comments are appreciated.
|
|
|
|
|
hi..how are you...
i am not sure about waveInOpen and waveInProc...but may i ask for what reason do you want to use this...
i ask this because if it is just to play a wave file there are other ways to do it...
vinnzy
|
|
|
|
|
Vinnzy,
I am actually trying to capture PCM audio using these methods.
Thanks for asking.
|
|
|
|
|
Try this:
//declare global function in the top of .cpp files
LRESULT CALLBACK waveInProc(HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance,
DWORD dwParam1, DWORD dwParam2);
WaveIn *wi;
bool WaveIn::Intiate()
{
wi=this;
}
// function that calls in the waveInOpen
bool WaveIn::Start()
{
// open the wave in device
if(waveInOpen(&hwi, WAVE_MAPPER, &wformat, waveInProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR)
return false;
....
}
//write the funtion of waveInProc
LRESULT CALLBACK waveInProc(HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance,
DWORD dwParam1, DWORD dwParam2)
{
//if you need WaveIn class in this function
wi->.....
switch(uMsg)
{
case WIM_DATA:
// ... uses member variables
}
return true
}
All vareables in waveInProc function are global or local in this function.
|
|
|
|
|
Sapto,
Thanks for giving me this solution.
Actually, I have discovered another solution that is using the dwParam1 of the waveInProc which returns a pointer to the WAVEHDR of the finished data block.
Firstly, I assign the dwUser of this data block to 'this'
whPtr->dWUser=this;
Thus, in waveInProc implementation,
...
WAVEHDR* tmpWH = (WAVEHDR*)dwParam1;
WaveIn* tmpWaveIn = (WaveIn*)(tmpWH->dwUser);
...
tmpWaveIn is now, a pointer to the instance of my WaveIn class.
Once again, thanks for your solution!
|
|
|
|
|
In C++, we can declare and initialize the variable i inside the for condition. However, in C, we can't do that, we must declare it first. But almost all the time when I declare a variable, I will initialize it at the same time, this makes re-initializing variable i in for loop unnecessary.
I was wondering would that be considered poor programming style? I've seen this style a lot.
// C code
<br />
int i = 0;<br />
<br />
for( ; i < 5; i++)<br />
{<br />
}<br />
or should I?
<br />
int i = 0;<br />
<br />
for(i = 0; i < 5; i++)<br />
{<br />
}<br />
Thanks
|
|
|
|
|
Alex Ngai wrote:
for( ; i < 5; i++)
{
// code
}
this IS ugly ...
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
Thanks for your reply. for( ; i < 5; i++) may seem ulgy to you,
but in fact, I've seen a lot of people use this style. In some
cases, you have no choice, for example:
int foo(int n)
{
for( ; n < 5; n++ )
{
}
}
So, I was wondering when you use for loop in C code, do you
re-initialize the variable i?
-----------------------------
C++ without virtual functions is not OO. Programming with classes but without dynamic binding is called "object based", but not "object oriented".
|
|
|
|
|
Alex Ngai wrote:
In some
cases, you have no choice
No choice?, you could use a while loop rather than a for loop!
Ant.
I'm hard, yet soft. I'm coloured, yet clear. I'm fruity and sweet. I'm jelly, what am I? Muse on it further, I shall return! - David Walliams (Little Britain)
|
|
|
|
|