### Passing Set Parameters to a Service

Three types of set parameters are supported: INTEGER, REAL, and STRINGn.

INTEGER

If you want to sum up all the elements in a set of integers with an external function, to declare the function in the SERVICE structure:

```  SetFuncLib := SERVICE
INTEGER SumInt(SET OF INTEGER ss) :
holertl,library='dab',entrypoint='rtlSumInt';
END;
x:= 3+4.5;
SetFuncLib.SumInt([x, 11.79]); //passed two REAL numbers - it works
```

To define the external function, in the header (.h) file:

`__int64 rtlSumInt(unsigned len, __int64 * a);`

In the source code (.cpp) file:

```  __int64 rtlSumInt(unsigned len, __int64 * a) {
__int64 sum = 0;
for(unsigned i = 0; i < len; i++) {
sum += a[i];
}
return sum;
}
```

The first parameter contains the length of the set, and the second parameter is an int array that holds the elements of the set. Note: In declaring the function in ECL, you can also have sets of INTEGER4, INTEGER2 and INTEGER1, but you need to change the type of the C function parameter, too. The relationship is:

```  INTEGER8 -- __int64
INTEGER4 -- int
INTEGER2 -- short
INTEGER1 -- char
```

REAL

If you want to sum up all the elements in a set of real numbers:

To declare the function in the SERVICE structure:

```  SetFuncLib := SERVICE
REAL8 SumReal(SET OF REAL8 ss) :
holertl,library='dab',entrypoint='rtlSumReal';
END;

INTEGER r1 := 10;
r2 := 20.345;
SetFuncLib.SumReal([r1, r2]);
// intentionally passed an integer to the real set, it works too.
```

To define the external function, in the header (.h) file:

double rtlSumReal(unsigned len, double * a);

In the source code (.cpp) file:

```  double rtlSumReal(unsigned len, double * a) {
double sum = 0;
for(unsigned i = 0; i < len; i++) {
sum += a[i];
}
return sum;
}
```

The first parameter contains the length of the set, and the second parameter is an array that holds the elements of the set.

Note: You can also declare the function in ECL as set of REAL4, but you need to change the parameter of the C function to float.

STRINGn

If you want to calculate the sum of the lengths of all the strings in a set, with the trailing blanks trimmed off:

To declare the function in the SERVICE structure:

```  SetFuncLib := SERVICE
INTEGER SumCharLen(SET OF STRING20 ss) :
holertl,library='dab',entrypoint='rtlSumCharLen';
END;
str1 := '1234567890'+'xxxx ';
str2 := 'abc';
SetFuncLib.SumCharLen([str1, str2]);
```

To define the external function, in the header (.h) file:

`__int64 rtlSumCharLen(unsigned len, char a[ ][20]);`

In the source code (.cpp) file:

```__int64 rtlSumCharLen(unsigned len, char a[][20]) {
__int64 sumtrimedlen = 0;
for(unsigned i = 0; i < len; i++) {
for(int j = 20-1; j >= 0; j--) {
if(a[i][j] != ' ') {
break;
}
a[i][j] = 0;
}
sumtrimedlen += j + 1;
}
return sumtrimedlen;
} ```

Note: In declaring the C function, we have two parameters for the set. The first parameter is the length of the set, the second parameter is char[][n] where n is the SAME as that in stringn. Eg., if the service is declared as "integer SumCharLen(set of string20)", then in the C function the parameter type must be char a[][20].