## A simple calculator with PANORAMIC and FreeBASIC

#### Introduction

In the previous issue of this magazine we have shown how PANORAMIC can call functions from dynamically loaded libraries (DLL). Here we describe a calculator made with PANORAMIC and using a FreeBASIC DLL.

#### Passing a PANORAMIC string to a DLL

In this example we need to pass to the DLL a string which contains the mathematical expression to be evaluated (ex. "1+1"). For instance, a function in a FreeBASIC DLL could be written as follows:

``` ```

``````  function StrFunc(byref p as zstring ptr) as integer export
dim as string s = *p
....................
end function
``````
``` ```

The parameter p is a pointer to a null-terminated string. This pointer can be dereferenced inside the function and the resulting null-terminated string (*p) can be converted to a standard BASIC string (s) by a simple assignment.

This function can be called by the following PANORAMIC code:

``` ```

``````  dim s\$, i%
s\$ = "1+1"
``````
``` ```

#### The EVAL DLL

The DLL used in this example is a simplified version of the "Simple Expression Evaluator" (SEE), a math parser written by Aleksandar Ruzicic (a.k.a. krcko) and published some years ago in the FreeBASIC forum. This DLL is available at:

http://www.unilim.fr/pages_perso/jean.debord/tpmath/eval.zip

The DLL exports 3 functions:

• InitFunc
• This function initializes the built-in DLL functions and returns their number. It is mandatory to call this function before using any of the built-in DLL functions.

PANORAMIC call:

``` dim i% i% = dll_call0("InitFunc") print i%, " functions initialized in the EVAL DLL" For a list of functions and operators available in the DLL, see the documentation file readme.txt in the archive. ```
• SetVariable
• This function sets a variable to a value. There are 26 variables available, from A to Z. The function returns the order number of the variable (1 for A, 2 for B etc.)

PANORAMIC call:

``` dim variable\$, x, i% variable\$ = "x" x = rnd(1) i% = dll_call2("SetVariable", adr(variable\$), adr(x)) print "Name of variable : ", variable\$ print "Order number : ", i% print "Value : ", x ```
• Eval
• This function evaluates an expression passed as a character string and returns one of the following error codes:

0. no error
1. unexpected token
2. unbalanced braces
3. undefined variable
4. undefined function

PANORAMIC call:

``` dim expression\$, result, i% expression\$ = "4 * atn(1)" i% = dll_call2("Eval", adr(expression\$), adr(result)) print "Expression : ", expression\$ print "Result : ", result print "Error code : ", i% ```

#### The PANORAMIC program

The following program uses the DLL to code a simple calculator with 4 variables:

``` ```

``````  ' ---------------------------------------------
' Declarations
' ---------------------------------------------
dim i%, variable\$, expression\$, value, result
label On_Click_Button_12
' ---------------------------------------------
' Object description
' ---------------------------------------------
left 0,225
top 0,200
width 0,470
height 0,225
caption 0,"Calculator"
alpha 1
left 1,20
top 1,20
caption 1,"Variables :"
alpha 2
left 2,20
top 2,53
width 2,27
height 2,20
caption 2,"A = "
edit 3
left 3,50
top 3,50
text 3, "1"
alpha 4
left 4,20
top 4,83
width 4,28
caption 4,"B = "
edit 5
left 5,50
top 5,80
text 5, "2"
alpha 6
left 6,20
top 6,113
width 6,29
caption 6,"C = "
edit 7
left 7,50
top 7,110
text 7, "3"
alpha 8
left 8,20
top 8,143
width 8,28
caption 8,"D = "
edit 9
left 9,50
top 9,140
text 9, "4"
alpha 10
left 10,220
top 10,20
width 10,170
caption 10,"Enter a formula, then click Evaluate:"
edit 11
left 11,220
top 11,50
width 11,225
text 11, "A + B + C + D"
button 12
left 12,261
top 12,90
width 12,140
caption 12,"Evaluate"
on_click 12, On_Click_Button_12
alpha 13
left 13,220
top 13,143
width 13,62
caption 13,"Result = "
edit 14
left 14,270
top 14,140
width 14,170
text 14,""
' ---------------------------------------------
' Main program
' ---------------------------------------------
dll_on "eval.dll"
i% = dll_call0("InitFunc")
end
' ---------------------------------------------
' Subprogram
' ---------------------------------------------
On_Click_Button_12:
variable\$ = "A" : value = val(text\$(3))
variable\$ = "B" : value = val(text\$(5))
variable\$ = "C" : value = val(text\$(7))
variable\$ = "D" : value = val(text\$(9))
expression\$ = text\$(11)
text 14, str\$(result)
return
``````
``` ```

Upon running, the program displays the calculator window. We can set the values of the four variables and enter a formula which may (or may not) depend on theses variables, then click the "Evaluate" button to get the result.

The compilation by PANORAMIC results in a huge executable which can be compressed by UPX to about 1/3 of its original size.

#### Conclusion

This simple example shows how PANORAMIC and FreeBASIC can be combined to develop GUI programs under Windows.

#### Acknowledgements

Many thanks to:

• "krcko" for writing SEE and releasing it under a very permissive license
• the members of the french PANORAMIC forum for their constant support