The following table show what kind of LabTalk object can be passed as argument to the different kinds of Origin C function paramenter.
Y = supported
/ = not supported
| OC argument type \ Tabtalk argument type | int literal | int variable | double literal | double variable | string literal | string variable | string register | dataset | grobject | tree |
|---|---|---|---|---|---|---|---|---|---|---|
| int | Y | Y | Y | Y | / | / | Y | Y | / | / |
| int& | / | Y | / | Y | / | / | / | / | / | / |
| double | Y | Y | Y | Y | / | / | Y | Y | / | / |
| double& | / | Y | / | Y | / | / | / | / | / | / |
| string | Y | / | Y | / | Y | Y | Y | / | / | / |
| string& | / | / | / | / | / | Y | / | / | / | / |
| vector<int> | / | / | / | / | / | / | / | Y | / | / |
| vector<int>& | / | / | / | / | / | / | / | / | / | / |
| vector<double> | / | / | / | / | / | / | / | Y | / | / |
| vector<double>& | / | / | / | / | / | / | / | / | / | / |
| vector<string> | / | / | / | / | / | / | / | Y | / | / |
| vector<string>& | / | / | / | / | / | / | / | / | / | / |
| vector<complex> | / | / | / | / | / | / | / | Y | / | / |
| vector<complex>& | / | / | / | / | / | / | / | / | / | / |
This section provides examples on how to call Origin C functions in LabTalk script or directly run in Script Window. Assume that the OC function is saved in MyFunction.c and be included in current workspace.
In LabTalk script, we support passing the different types of argument to OC function as an Integer. But be careful when pass double type, since it will be trimmed as an variable of Integer type, say 2.55 will be treated as 2; and when pass a string register to it, make sure that the content in the register can be converted to an Integer, if can not, will be treated as 0. The following code show how the OC function is defined and used in LabTalk script.
OC Function
void show_square(int a) { printf("%d * %d = %d\n", a, a, a * a); }
Calling in LabTalk Script or Command Window
[UserScript] %A = 5; // string register show_square(%A); show_square(3); // const integer int r = 2; // integer variable show_square(r); double dd = 3.2; // double variable show_square(dd); show_square(5.5); // const double dataset ds = data(3, 6, 1); show_square(ds); //only the first item will be pass to OC function, that is 3.
OC Function
int increment(int& a) { int nOld = a; a++; return nOld; }
Calling in LabTalk Script or Command Window
[UserScript] int r = 2; int nOld = increment(r); double dd = 3.2; int nOld = increment(dd);
OC Function
double square(double a) { return a * a; }
Calling in LabTalk Script or Command Window
[UserScript] %A = 5; type $(square(%A)); // 25 type square(3): $(square(3)); // square(3):9 int r = 2; double rr = square(r); type rr: $(rr); // rr: 4 double dd = 3.2; double ss = square(dd); type ss: $(ss); // ss: 10.24 type square(5): $(square(5)); // square(5): 25 dataset ds = data(1, 10, 1); col(1)=ds; // put 1,2..10 to Col(1) Col(2) = square(Col(1)); // put 1,4,...100 to Col(2); type put square of Col(1) to Col(2), done!;
OC Function
double increment(double& a, double dStep = 1) { double dOld = a; a += dStep; return dOld; }
Calling in LabTalk Script or Command Window
[UserScript] int a = 3; increment(a); type -a "a = $(a)"; double d = 4; increment(d, 6); type -a "d = $(d)";
OC Function
void display(string str) { printf("Your input string is %s\n", str); }
Calling in LabTalk Script or Command Window
[UserScript] display(1208); display(3.1415); display(good day); //literal without quotes display("good bye"); //literal with quotes string str$ = "Origin C"; display(str$); %A = X-Functions; display(%A);
OC Function
string to_uppercase(string& str) { string strOld = str; str.MakeUpper(); return strOld; //return old value }
Calling in LabTalk Script or Command Window
[UserScript] string str$ = OriginLab; string strOld$ = to_uppercase(str$)$; type "%(strOld$) is changed to %(str$)";
OC Function
int get_min_max(vector<int> vn, int& min, int& max) { if ( vn.GetSize() == 0 ) return 0; vn.Sort(); min = vn[0]; max = vn[vn.GetSize() - 1]; return 1; }
Calling in LabTalk Script or Command Window
[UserScript] //loose dataset dataset ds = data(2, 30, 2); int min, max; get_min_max(ds, min, max); type "min = $(min), max = $(max)"; //normal dataset from column, make sure to fill some data in Col(A) to see the result. get_min_max(Col(A), min, max); type "min = $(min), max = $(max)";
OC Function
int get_min_max_double_arr(vector<double> vd, double& min, double& max) { if ( vd.GetSize() == 0 ) return 0; vd.GetMinMax(min, max); return 1; }
Calling in LabTalk Script or Command Window
[UserScript] //loose dataset dataset ds = data(2, 30, 2); double dMin, dMax; get_min_max_double_arr(ds, dMin, dMax); type "min = $(dMin), max = $(dMax)"; //normal dataset from column, make sure to fill some data in Col(A) to see the result. get_min_max_double_arr(Col(A), dMin, dMax); type "min = $(dMin), max = $(dMax)";
OC Function
string string_array_set_tokens(StringArray sa, char nDelimiter = ',') { string str; str.SetTokens(sa, nDelimiter); return str; }
Calling in LabTalk Script or Command Window
[UserScript] string mystr; mystr$ = string_array_set_tokens(Col(A))$; mystr$ =;
OC Function
vector<double> DotMultiply(const vector<double> &vs1, const vector<double> &vs2, int nRow, int nCol) { matrix mat1, mat2; mat1.SetSize(nRow, nCol); mat2.SetSize(nRow, nCol); mat1.SetByVector(vs1, TRUE); mat2.SetByVector(vs2, TRUE); mat1.DotMultiply(mat2); vector<double> vs; mat1.GetAsVector(vs); return vs; }
Calling in LabTalk Script or Command Window
[UserScript] dataset ds; ds = DotMultiply(Mat(1), Mat(2), wks.nrows, wks.ncols); mean(ds)=;
OC Function
void test_m(string ra, string rb) { MatrixObject ma(ra); MatrixObject mb(rb); int ncols = ma.GetNumCols(); int nrows = ma.GetNumRows(); mb.SetSize(nrows, ncols); matrixbase& m1 = ma.GetDataObject(); matrixbase& m2 = mb.GetDataObject(); m2 = m1; }
Calling in LabTalk Script or Command Window
[UserScript] test_m("[Mbook1]1!1","[Mbook2]1!1");
OC Function
void test_a(string ra, string rb) { Matrix ma(ra); Matrix mb(rb); int ncols = ma.GetNumCols(); int nrows = ma.GetNumRows(); mb.SetSize(nrows, ncols); mb = ma; }
Calling in LabTalk Script or Command Window
[UserScript] test_a("[Mbook1]1!1","[Mbook2]1!1");
OC Function
#include <xfutils.h> void test(string strRangeString) { // for example passing a matrix MatrixObject mo; okxf_resolve_string_get_origin_object(strRangeString, &mo); /* Whatever you want to do next */ }