-
October 13th, 2012, 02:25 PM
#1
Linear equation/interpolation - basic compile errors
I am trying to create C++ code that allows a linear equation (interpolator?) to take in a value and produce an output based on a table that is specified.
The problem I am having is the GE compiler uses libraries not available in Visual studio and visa versa…
Screen shot of error…” error: expected ‘=’ ‘,’’;’’asm’…ect.
This is the code I am working with. Just set up a flat XY trying to link inputs and outputs to X0 – Xn and Y0 – Yn.
// Lin_Interp.c : Defines the entry point for the console application.
//
#include "PACRXPlc.h" /* Include file applicable for all targets */
#include "string.h"
#include "math.h"
#include "stdlib.h"
#include <time.h>
#include <ctype.h>
#include <stdio.h>
/* Constants / #defines */
T_INT16 *X, T_INT16 *X0, T_INT16 *X1, T_INT16 *X2, T_INT16 *Y0, T_INT16 *Y1, T_INT16 *Y2, T_INT16 *Z1)
int Gefmain =(){
label1:
int i=0,j=0,X0=0,Y0=0,X1=0,Y1=0;
double X,Y,Fxy=0,Fxy0=0,FxyOld=0,Fxy1=0;
// "Lin Interp Y OPERATING LIMIT FUNCTION - CORRECTED Y ARRAY" TY
double TY[11]={0,10,20,30,40,50,60,70,80,90,100,};
// "Lin Interp X OPERATING LIMIT FUNCTION – CORRECTED X ARRAY" TX
double TX[11]={0,10,20,30,40,50,60,70,80,90,100};
// "LIN Interp OPERATING LIMIT FUNCTION - XY LIMIT ARRAY" XYlim
double XYlim[11][11]={0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0};
// Print-Out on console "XY LIMIT ARRAY" XYlim
for (j=0;j<12;j++){
for (i=0;i<10;i++){
cout<< XYlim[i][j] << " "; //Display the curve
}
cout << endl;
}
// Input X, ensure it is in the range.
cout<<endl<< "Please enter X value:";
cin>>X;
while (X >100.0 || X<0.0){
cout<<endl<< "Your X value is either greater than 100.0 or smaller than 0.0, Please re-enter again:";
cin>>X;
}
// Input Y, ensure it is in the range.
cout<<endl<< "Please enter Y value:";
cin>>Y;
while (Y >100.0 || Y<0.0){
cout<<endl<< "Your Y value is either greater than 100 or smaller than 0, Please re-enter again:";
cin>>Y;
}
cout<<endl<< " X="<<X<< ". Y="<<Y<<endl<<endl;
//Select the correct X0&Y0, X1&Y1
for (i=0;i<10;i++){
if (X >= TX[i]) X0=i;
else break;
}
X1=X0+1;
for (j=0;j<12;j++){
if (Y >= SPD[j]) Y0=j;
else break;
}
Y1=Y0+1;
cout<< " X0="<<X0<< ". X1="<<X1<<" i="<<i<<endl;
cout<< " Y0="<<Y0<< ". Y1="<<Y1<<" j="<<j<<endl<<endl;
cout<< " KGV_X0["<<X0<<"]="<<TX[X0]<< " KGV_X1["<<X1<<"]="<<TX[X1]<<endl;
cout<< " SPD_Y0["<<Y0<<"]="<<TY[Y0]<<" SPD_Y1["<<Y1<<"]="<<TY[Y1]<<endl<<endl;
cout<< " XYlim["<<X0<<"]["<<Y0<<"]="<<XYlim[X0][Y0]<<endl;
cout<< " XYlim["<<X1<<"]["<<Y0<<"]="<<XYlim[X1][Y0]<<endl;
cout<< " XYlim["<<X0<<"]["<<Y1<<"]="<<XYlim[X0][Y1]<<endl;
cout<< " XYlim["<<X1<<"]["<<Y1<<"]="<<XYlim[X1][Y1]<<endl<<endl;
//calculate F(X,Y), and print-out on console.
//Using one equation to calculate F(X,Y). The problem with this one equation method is if X0 = X1, then most of the equation's products go to zero.
//To see this problem, enter an known X value like 48. Then enter a Y value that is not known or on the curve. Example would be X=48 and Y=92.5
//The 3-equation result will be the correct value of 9.1815, the single equation result will be the result of X=48 and Y=90 or 8.672
FxyOld=XYlim[X0][Y0]+((X-TX[X0])/(TX[X1]-TX[X0])*(XYlim[X1][Y0]-XYlim[X0][Y0]))+
((Y-TY[Y0])/(TY[Y1]-TY[Y0])*(X-TX[X0])/(TX[X1]-TX[X0])*(XYlim[X1][Y1]-XYlim[X0][Y1]-XYlim[X1][Y0]+XYlim[X0][Y0]));
//Using 3 equations to calculate F(X,Y). Using this method prevents the problem that occurs when X0 = X1 and Y0 does not equal Y1.
Fxy0=XYlim[X0][Y0]+((X-TX[X0])/(TX[X1]-TX[X0])*(XYlim[X1][Y0]-XYlim[X0][Y0]));
Fxy1=XYlim[X0][Y1]+((X-TX[X0])/(TX[X1]-TX[X0])*(XYlim[X1][Y1]-XYlim[X0][Y1]));
Fxy=Fxy0+((Y-TY[Y0])/(TY[Y1]-TY[Y0])*(Fxy1-Fxy0));
cout<< " Fxy["<<X<<"]["<<Y<<"]= "<<Fxy<<" (3-equation result)"<<endl<<endl;//Three equation result to screen
cout<< " FxyOld["<<X<<"]["<<Y<<"]= "<<FxyOld<<" (1-equation result)"<<endl<<endl; //Single equation result to screen
goto label1; //Start program over
return 0;
{
-
October 13th, 2012, 03:56 PM
#2
Re: Linear equation/interpolation - basic compile errors
Frankly, this isn't readable. Fix the post by adding code tags and indentation. See http://forums.codeguru.com/misc.php?do=bbcode
-
October 13th, 2012, 04:04 PM
#3
Re: Linear equation/interpolation - basic compile errors
No Visual C++ question
No code tags
Not even an indication of which line generates the error. You won't get any help like that.
-
October 13th, 2012, 04:34 PM
#4
Re: Linear equation/interpolation - basic compile errors
Originally Posted by controlsguy
I am trying to create C++ code that allows a linear equation (interpolator?) to take in a value and produce an output based on a table that is specified.
The problem I am having is the GE compiler uses libraries not available in Visual studio and visa versa…
Screen shot of error…” error: expected ‘=’ ‘,’’;’’asm’…ect.
1) Use code tags when posting code. Your code is practically unreadable.
2)
Code:
double XYlim[11][11];
//...
for (j=0;j<12;j++) {
for (i=0;i<10;i++) {
cout<< XYlim[i][j] << " "; //Display the curve
}
}
What happens when j == 11? You are then accessing the array with an out-of-bounds index.
3)
Code:
goto label1; //Start program over
Get rid of this, and use proper looping constructs (while, do-while, etc.)
Regards,
Paul McKenzie
Last edited by Paul McKenzie; October 13th, 2012 at 04:36 PM.
-
October 15th, 2012, 10:46 AM
#5
Re: Linear equation/interpolation - basic compile errors
Truly sorry about that guys. See below. Thank you for your help.
Code:
// Lin_Interp.c : Defines the entry point for the console application.
//
#include "PACRXPlc.h" /* Include file applicable for all targets */
#include "string.h"
#include "math.h"
#include "stdlib.h"
#include <time.h>
#include <ctype.h>
#include <stdio.h>
/* Constants / #defines */
T_INT16 *X, T_INT16 *X0, T_INT16 *X1, T_INT16 *X2, T_INT16 *Y0, T_INT16 *Y1, T_INT16 *Y2, T_INT16 *Z1)
int Gefmain =(){
label1:
int i=0,j=0,X0=0,Y0=0,X1=0,Y1=0;
double X,Y,Fxy=0,Fxy0=0,FxyOld=0,Fxy1=0;
// "Lin Interp Y OPERATING LIMIT FUNCTION - CORRECTED Y ARRAY" TY
double TY[11]={0,10,20,30,40,50,60,70,80,90,100,};
// "Lin Interp X OPERATING LIMIT FUNCTION – CORRECTED X ARRAY" TX
double TX[11]={0,10,20,30,40,50,60,70,80,90,100};
// "LIN Interp OPERATING LIMIT FUNCTION - XY LIMIT ARRAY" XYlim
double XYlim[11][11]={0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0
0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0};
// Print-Out on console "XY LIMIT ARRAY" XYlim
for (j=0;j<12;j++){
for (i=0;i<10;i++){
cout<< XYlim[i][j] << " "; //Display the curve
}
cout << endl;
}
// Input X, ensure it is in the range.
cout<<endl<< "Please enter X value:";
cin>>X;
while (X >100.0 || X<0.0){
cout<<endl<< "Your X value is either greater than 100.0 or smaller than 0.0, Please re-enter again:";
cin>>X;
}
// Input Y, ensure it is in the range.
cout<<endl<< "Please enter Y value:";
cin>>Y;
while (Y >100.0 || Y<0.0){
cout<<endl<< "Your Y value is either greater than 100 or smaller than 0, Please re-enter again:";
cin>>Y;
}
cout<<endl<< " X="<<X<< ". Y="<<Y<<endl<<endl;
//Select the correct X0&Y0, X1&Y1
for (i=0;i<10;i++){
if (X >= TX[i]) X0=i;
else break;
}
X1=X0+1;
for (j=0;j<12;j++){
if (Y >= SPD[j]) Y0=j;
else break;
}
Y1=Y0+1;
cout<< " X0="<<X0<< ". X1="<<X1<<" i="<<i<<endl;
cout<< " Y0="<<Y0<< ". Y1="<<Y1<<" j="<<j<<endl<<endl;
cout<< " KGV_X0["<<X0<<"]="<<TX[X0]<< " KGV_X1["<<X1<<"]="<<TX[X1]<<endl;
cout<< " SPD_Y0["<<Y0<<"]="<<TY[Y0]<<" SPD_Y1["<<Y1<<"]="<<TY[Y1]<<endl<<endl;
cout<< " XYlim["<<X0<<"]["<<Y0<<"]="<<XYlim[X0][Y0]<<endl;
cout<< " XYlim["<<X1<<"]["<<Y0<<"]="<<XYlim[X1][Y0]<<endl;
cout<< " XYlim["<<X0<<"]["<<Y1<<"]="<<XYlim[X0][Y1]<<endl;
cout<< " XYlim["<<X1<<"]["<<Y1<<"]="<<XYlim[X1][Y1]<<endl<<endl;
//calculate F(X,Y), and print-out on console.
//Using one equation to calculate F(X,Y). The problem with this one equation method is if X0 = X1, then most of the equation's products go to zero.
//To see this problem, enter an known X value like 48. Then enter a Y value that is not known or on the curve. Example would be X=48 and Y=92.5
//The 3-equation result will be the correct value of 9.1815, the single equation result will be the result of X=48 and Y=90 or 8.672
FxyOld=XYlim[X0][Y0]+((X-TX[X0])/(TX[X1]-TX[X0])*(XYlim[X1][Y0]-XYlim[X0][Y0]))+
((Y-TY[Y0])/(TY[Y1]-TY[Y0])*(X-TX[X0])/(TX[X1]-TX[X0])*(XYlim[X1][Y1]-XYlim[X0][Y1]-XYlim[X1][Y0]+XYlim[X0][Y0]));
//Using 3 equations to calculate F(X,Y). Using this method prevents the problem that occurs when X0 = X1 and Y0 does not equal Y1.
Fxy0=XYlim[X0][Y0]+((X-TX[X0])/(TX[X1]-TX[X0])*(XYlim[X1][Y0]-XYlim[X0][Y0]));
Fxy1=XYlim[X0][Y1]+((X-TX[X0])/(TX[X1]-TX[X0])*(XYlim[X1][Y1]-XYlim[X0][Y1]));
Fxy=Fxy0+((Y-TY[Y0])/(TY[Y1]-TY[Y0])*(Fxy1-Fxy0));
cout<< " Fxy["<<X<<"]["<<Y<<"]= "<<Fxy<<" (3-equation result)"<<endl<<endl;//Three equation result to screen
cout<< " FxyOld["<<X<<"]["<<Y<<"]= "<<FxyOld<<" (1-equation result)"<<endl<<endl; //Single equation result to screen
goto label1; //Start program over
return 0;
{
-
October 15th, 2012, 11:19 AM
#6
Re: Linear equation/interpolation - basic compile errors
Is showing the line that causes the error really too much to ask? Without PACRXPlc.h we can't compile it an reproduce your issue.
-
October 15th, 2012, 11:19 AM
#7
Re: Linear equation/interpolation - basic compile errors
Why are you using an opening brace here?
Code:
#include "PACRXPlc.h" /* Include file applicable for all targets */
What is this header?
Explain what that line above does. I've never seen anything like it in C++.
Code:
T_INT16 *X, T_INT16 *X0, T_INT16 *X1, T_INT16 *X2, T_INT16 *Y0, T_INT16 *Y1, T_INT16 *Y2, T_INT16 *Z1)
This is completely wrong.
Assuming that T_INT16 is a type, then you must use semicolons between the declarations if you're going to declare the variables that way:
Code:
T_INT16 *X;
T_INT16 *X0;
T_INT16 *X1;
T_INT16 *X2;
T_INT16 *Y0;
T_INT16 *Y1;
T_INT16 *Y2;
T_INT16 *Z1;
Also, remember that your code has runtime and logic errors, as I stated previously. So even if you get your program to compile, you have to address those issues.
Regards,
Paul McKenzie
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|