Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents


 

Anchor
Constant
Constant
Defining Constant Expressions

Typically, you use constant expressions for both control flow (i.e. incrementing counters) and computational purposes. The format consists of a left-hand expression (variable) of a certain type, an assignment operator (=) and a constant of the matching type. Examples are:

 

Code Block
languagecpp
iConstant = 1;
rConstant = 2.27052;

 

The system evaluates constants at compile time so that you will know immediately whether they are correct.

Anchor
Math
Math
Defining and Using Math Expressions

A powerful capability in Oasis montaj is to apply some mathematical operation to selected rows in one or more channels of data, such as in the following expression:

 

Code Block
languagecpp
Z = 2.5*sqrt(X*X + Y*Y)

where X, Y and Z are the names of channels.

The GX Programming Language provides this same functionality with the math expression object EXP. To define the above math expression within a GX you could type:

 

Code Block
languagecpp
ZExp=Create_EXP(Data,“Z"œZ=2.5*sqrt(X*X + Y*Y);”,64);

 

Note the semicolon “;” terminating the expression. The number 64 represents the maximum length of the expression string. A call to the Math_DU function is used to apply the expression to a given line:

 

Code Block
languagecpp
Math_DU(Data,Line,ZExp);

 

In many cases, however, channel and variable values may not be known ahead of time to the programmer, but instead are determined at run-time, perhaps by being selected by the user. In this case, the expression may be defined using replaceable parameters, indicated by pre-pending dollar-sign characters “$” to the local variable names:

 

Code Block
languagecpp
GetString_SYS(“MYGX”"œMYGX", “X_CHAN”"œX_CHAN", sXCh);
GetString_SYS(“MYGX”"œMYGX", “Y_CHAN”"œY_CHAN", sYCh);
GetString_SYS(“MYGX”"œMYGX", “Z_CHAN”"œZ_CHAN", sZCh);

rMult = 2.5;

ZExp = Create_EXP(Data,"$sZCh=$rMult*sqrt($sXCh*$sXCh+$sYCh*$sYCh));",350);

 

The 350 value at the end of the expression, giving the maximum expression length in characters, recognises the fact that individual channel names may each contain up to 64 characters (defined by DB_SYMB_NAME_SIZE in db.gxh) characters. (See the EXP.GXH header file for details).

Math expressions may also be applied to grids. The expression syntax is identical, and the procedure is similar, but it uses the IEXP object. (See the IEXP.GXH header file for details).

Anchor
Casting
Casting
Casting Types

Arithmetic operations in GX Developer must remain true to type. Integer and real types can be mixed only if type casting is performed. The (real) and (int)operators are cast operators that convert the operand on the right to the specified type. Other programming languages (including C) will perform casting automatically, but this is a common source of programming errors. GXC requires that the GX programmer make all type casts explicit.

For example, the following operations will produce an error on compilation:

Code Block
languagecpp
iVal = 10.0;       // should be:  iVal  = 10;
rVal = 0;          // should be:  rVal = 0.0;
iVal = rVal + 1;   // should be:  iVal = (int)rVal + 1;
rVal = iVal/rVal;  // should be:  rVal = (real)iVal/rVal;

 

Class handles and symbols can also be stored in an integer variable, which can be useful in some applications. However, to store the handle in an integer variable requires that the class be cast to an integer. When the class handle is used, it must be cast back to the type of the class. The following example illustrates this:

 

Code Block
languagecpp
DB hDB;           // working database
int(10) iDB;      // array of 10 database handles
int i;
string(GS_MAX_PATH) sName;
{
   for (i=0;i<10;i++) {
      // --- code to get databases ---
      ...
      iDB[i] = (int)hDB;
   }
   // --- get the name of the 5’th5"™th database ---
   GetName_DB( (DB)iDB[4],DB_NAME_FILE,sName);
   ...
}