3.14 Calling Origin C Functions in Labtalk Script


Argument compatability between LabTalk types and Origin C types

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>& / / / / / / / / / /


Examples of Calling Origin C Functions From LabTalk

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.

Pass int by Value

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.


Pass int by Reference

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);

Pass double by Value

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!;

Pass double by Reference

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)";

Pass string by Value

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);

Pass string by Reference

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$)";

Pass int Array by Value

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)";

Pass double Array by Value

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)";

Pass string Array by Value

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$ =;


Pass Matrix as vector

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)=;

Pass Matrix by range string as MatrixObject

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");

Pass Matrix by range string as Matrix

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");

Pass object by range string in general

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
        */
}