Πέμπτη 4 Ιουνίου 2026

SubScript and SuperScript Numbers

This is an example to print subscript/superscript numbers.

Need the latest version or use @SubScript() and @SupScript() for calling simple functions

Module SupSub_Script_Example {
  If Mode<>22 then font "Arial New": Mode 22
  Locale 1033 ' works for 1032 too
  Print Part "A";SupScript(-12345.06789e-100)
  Print
  N=12
  Print Part "C";SubScript(N);"H";SubScript(2*N+2)
  Print
  Print Part "Rational = ";SupScript(123);"/";SubScript(456)
  Print
  Print Part "Just Subscript = A";SubScript(-12345.06789e-100)
  Print
  Function SubScript(x)
    local string r
    local s=""+x, i
    for i=1 to len(s)
      n=val(mid$(s,i,1))
      select case mid$(s,i,1)
      case "E"
        r+=chrcode$(0x1D07 ) '  chrcode$(0x1D49)
      case ","
        r+=","
      case "."
        r+="."  
      case "-"
        r+=chrcode$(0x208B)
      case "+"
        r+=chrcode$(0x208a)
      case else
        r+=chrcode$(0x2080+n)
      end select
    next
    =r
  End Function
  Function SupScript(x)
    local string r
    local s=""+x, i
    for i=1 to len(s)
      n=val(mid$(s,i,1))
      select case mid$(s,i,1)
      case "1"
        r+=chrcode$(0x00B9)
      case "2","3"
        r+=chrcode$(0x00B0+n)
      case "E"
        r+=chrcode$(0x1D31 ) '  chrcode$(0x1D49)
      case ","
        r+=chrcode$(0x02D2)
      case "."
        r+=chrcode$(0x22C5)    
      case "-"
        r+=chrcode$(0x207b)
      case "+"
        r+=chrcode$(0x207a)
      case else
        r+=chrcode$(0x2070+n)
      end select
    next
    =r
  End Function
}
SupSub_Script_Example

Τετάρτη 20 Μαΐου 2026

Revision 34 Version 14

 Now M2000 can use object arrays (4 byte per item, pointer to object - any object) to hold at the end a buffer object which is an array of memory items (in a flat manner). Although if we use string as item we get 4 bytes for a pointer to a BSTR string. So when we use these strings we don't serialize the structure easy (as flat memory) (if we get the string representation of a buffer we get zero for BSTR pointers, unless we do some actions on data, like to write to StrPtr, M2000 keep truck of actuall strings, so the pointer on the buffer for bstr is just a copy, but if the we change the copy M2000 return dummy string "crash" without crashing)


Easy Example:

structure simple {
x as double
y as double
{ StrPtr as long} ' we make a union
name1 as string
}
simple one[5], zero
zero|name1="This is a BSTR string"
Print len(Simple)=20 ' 20 bytes, 2x8 bytes double, 4 bytes pointer to string
one[3]=zero ' copy to one at index 3 (4th item)
Print len(zero)=20, len(one)=20*5 ' 20 bytes and 100bytes
print Len(one[3]|name1)=21 ' characters = 21 words = 21*2 bytes
print one[3]|StrPtr ' this is the address of the string
print one[0]|StrPtr=0 ' this is null string
print Len(one[0]|name1)=0
' now start the real example
Object alfa[3], beta[3][2]
alfa[1]=one
print alfa[1][3]|name1="This is a BSTR string"
print alfa[1] is one, " : True"  ' we have the same object
alfa[2]=buffer(one) ' we get a copy of all items
alfa[3]=one[3] ' using one[3] we get a copy of item 3
print alfa[2] is one, " : False"  ' we have different objects
print alfa[2][3]|name1
print alfa[1][3]|StrPtr=one[3]|StrPtr, " : True"
print alfa[2][3]|StrPtr=one[3]|StrPtr, " : False"
print len(alfa[3])=20 ' one only item
print alfa[3]|name1="This is a BSTR string"
print alfa[3]|StrPtr=one[3]|StrPtr, " : False"
beta[3][0]=one
print beta[3][0] is alfa[1], " : True"
beta[3][0][3]|name1="New string"
print alfa[1][3]|name1="New string", " : True"
print one[3]|name1="New string", " : True"
' we can put an object in an array of objects too
beta[3][2]=alfa
print beta[3][2][1][3]|name1="New string", " : True"
zero=beta[3][2][1][3] 'we get the index 3 of object at beta[3][2][1]
' zero is a copy
print zero|name1="New string", " : True"
print zero|StrPtr<>beta[3][2][1][3]|StrPtr, " : True"
zero=beta[3][2][1]
zero[3]|name1="last string"
' zero now point to beta[3][2][1]
print zero is one, " : True"
print zero is alfa[1], " : True"
print zero is beta[3][2][1], " : True"
print zero is beta[3][0], " : True"
print beta[3][0][3]|name1="last string", " : True"


Hard Example:

structure simple {
x as double
y as double
{StrPtr as long} ' we make a union
name1 as string
}
structure bigone {
{simple}; ' import simple (using ; we bypass the uninon mechanism)
z as double * 100
}
structure bigtwo {
s as simple * 4
z as double * 10
}
bigtwo two[10]
bigone one[5]
simple zero
zero|name1="This is a BSTR string"
print len(Simple)=20 ' 20 bytes, 2x8 bytes double, 4 bytes pointer to string
one[3]=zero
print len(zero)=20, len(one)=(20+100*8)*5 ' 20 bytes and 100bytes
print one[3]|name1=zero|name1, one[3]|StrPtr<>zero|StrPtr
print Len(two)=(4*20+10*8)*10
two[2]|s[1]=zero
print two[2]|s[1]|name1=zero|name1, two[2]|s[1]|StrPtr<>zero|StrPtr
two[2]|s[1]|name1="new string"
print two[2]|s[1]|name1=zero|name1, " : False"
zero=two[2]|s[1] ' get a copy
print two[2]|s[1]|name1=zero|name1, two[2]|s[1]|StrPtr<>zero|StrPtr
' now the real example
Object alfa[4], beta[3][2]
alfa[2]=two
print alfa[2][2]|s[1]|name1=zero|name1
beta[3][1]=one
print beta[3][1][3]|name1="This is a BSTR string"
beta[3][1][3]=zero ' copy because ...[3] is index to buffer at beta[3][1]
print type$(beta[3][1])="Buffer"
print beta[3][1][3]|name1=zero|name1
print_name1(beta[3][1][3])
print_name2(zero) ' zero is object pass pointer
print zero|name1, zero|StrPtr ' we get new values.
print alfa[2][2]|s[1]|name1, alfa[2][2]|s[1]|StrPtr, " values before call"
print_name2(alfa[2][2]|s[1]) ' pass copy
print alfa[2][2]|s[1]|name1, alfa[2][2]|s[1]|StrPtr, " same values as before call"
print_name3(alfa[2],2,1) ' alfa[2] is object - pass pointer
print alfa[2][2]|s[1]|name1, "change name"
sub print_name1(a as bigone)
print a|name1, a|StrPtr, a|z[30], " inside print_name1()"
end sub
sub print_name2(a as simple)
print a|name1, a|StrPtr, " inside print_name2()"
a|name1=a|name1+"...ok...."
end sub
sub print_name3(a as bigtwo, index, n)
print a[index]|s[n]|name1, a[index]|s[n]|StrPtr, " inside print_name3()"
a[index]|s[n]|name1=a[index]|s[n]|name1+"...ok"
end sub




Τρίτη 19 Μαΐου 2026

Test Enumeration - Δοκιμές Απαρίθμησης

 English Version:



locale 1033  ' we get True and False - using 1032 we get the Greek words
Module TestEnumNumericValue {
print "Test Enumeration Type of Numeric Value"
enum alfa {
kappa
delta
}
var m as alfa
print m=1, eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0
m++
print m=2, eval$(m)="delta", m=delta, type$(m)="alfa", m^=1
m=1
print m=1, eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0
try ok {
m=100
}
if error or not ok then print error$ 'we get error message Expected Enumaration Type
print m=1, eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0

clear
' clear all local variables
' make alfa start from 0 (by default is 1), also make the error value active
enum alfa {
kappa=0 ' we can use 0& for long type or 0&& for long long etc..
delta
error:
novalue=-1
}
var m as alfa
print m=0, eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0
m++
print m=1, eval$(m)="delta", m=delta, type$(m)="alfa", m^=1
m=0
print m=0, eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0
' this is bad value (not exist in values list of enumaration)
m=100
' then m turn to error vaue
print m=-1, eval$(m)="novalue", m=novalue, type$(m)="alfa", m^=2
m=kappa
do
print m^, type$(m^)="Long", eval$(m)
if m^=alfa^ then exit
m++
always
' we may have members of an enumaration with same value
clear
enum alfa {
kappa=0 ' we can use 0& for long type or 0&& for long long etc..
delta
epsilon=0
omega
error:
novalue=-1
}
var m as alfa
zeta=each(alfa)
oldtab=tab
// $(6,6) means center propotional print at 6 character's place column
print $(6, 6),"value", "name", "type","index", "same"
while zeta
m=eval(zeta) '  an object at index zeta^
? m, eval$(m), type$(m), m^, m^=zeta^
end while
print $(0, oldtab)
// we don't get the error value. Error value has index 4 now, but is out of the normal range.

}
module TestEnumStringValue {
print "Test Enumeration Type of String Value"
enum alfa {
kappa="North"
delta="East"
}
var m as alfa
print m="North", eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0
m++
print m="East", eval$(m)="delta", m=delta, type$(m)="alfa", m^=1
m="North"
print m="North", eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0
try ok {
m="Beep"
}
if error or not ok then print error$ 'we get error message Expected Enumaration Type
print m="North", eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0
clear
' clear all local variables
' make the error value active
enum alfa {
kappa="True"
delta="False"
error:
novalue="?"
}
var m as alfa
print m="True", eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0
m++
print m="False", eval$(m)="delta", m=delta, type$(m)="alfa", m^=1
m="True"
print m="True", eval$(m)="kappa", m=kappa, type$(m)="alfa", m^=0
' this is bad value (not exist in values list of enumaration)
m="Beep"
' then m turn to error vaue
print m="?", eval$(m)="novalue", m=novalue, type$(m)="alfa", m^=2
m=kappa
do
print m^, type$(m^)="Long", eval$(m)
if m^=alfa^ then exit
m++
always
' we may have members of an enumaration with same value
clear
enum alfa {
kappa="True"
delta="False"
epsilon="True"
omega="False"
error:
novalue="?"
}
var m as alfa
zeta=each(alfa)
oldtab=tab
// $(6,6) means center propotional print at 6 character's place column
print $(6, 6),"value", "name", "type","index", "same"
while zeta ' this is a variation of while using an iterator object
m=eval(zeta) '  an object at index zeta^
print m, eval$(m), type$(m), m^, m^=zeta^
end while
print $(0, oldtab)
// we don't get the error value. Error value has index 4 now, but is out of the normal range.
}
TestEnumNumericValue
TestEnumStringValue


Greek Version:



Τοπικό 1032 'θα έχουμε στα ελληνικά το Αληθές Ψευδές
Τμήμα ΔοκιμήΑπαρίθμησηςΑριθμητικήςΤιμής {
τύπωσε "Δοκιμή Απαρίθμησης με Αριθμητική Τιμή"
απαρ άλφα {
κάππα
δέλτα
}
μεταβλητή μ ως άλφα
τύπωσε μ=1, εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0
μ++
τύπωσε μ=2, εκφρ$(μ)="δέλτα", μ=δέλτα, τύπος$(μ)="άλφα", μ^=1
μ=1
τύπωσε μ=1, εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0
δες οκ {
μ=100
}
αν λάθος ή όχι οκ τότε τύπωσε λάθος$ 'θα πάρουμε το μήνυμα Λάθους Περίμενα τύπο απαρίθμησης
τύπωσε μ=1, εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0

καθαρό
' καθαρίζουμε όλες τις τοπικές του τμήματος
' κάνουμε το άλφα να ξεκινάει από το 0 (εξ ορισμού είναι το 1), επίσης ενεργοποιούμε τη λάθος τιμή.
απαρ άλφα {
κάππα=0 ' με 0& για Μακρύς ή 0&& για Μακρύς Μακρύς κ.ο.κ.
δέλτα
λάθος:
μη_τιμή=-1
}
μεταβλητή μ ως άλφα
τύπωσε μ=0, εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0
μ++
τύπωσε μ=1, εκφρ$(μ)="δέλτα", μ=δέλτα, τύπος$(μ)="άλφα", μ^=1
μ=0
τύπωσε μ=0, εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0
' δίνουμε μια τιμή που δεν υπάρχει στη λίστα τιμών της απαρίθμησης
μ=100
' το μ θα πάρει την τιμή λάθους
τύπωσε μ=-1, εκφρ$(μ)="μη_τιμή", μ=μη_τιμή, τύπος$(μ)="άλφα", μ^=2
μ=κάππα
επανέλαβε
τύπωσε μ^, τύπος$(μ^)="Long", εκφρ$(μ)
αν μ^=άλφα^ τότε έξοδος
μ++
πάντα
' μπορούμε να έχουμε μέλη απαρίθμησης με ίδια τιμή
καθαρό
απαρ άλφα {
κάππα=0 ' με 0& για Μακρύς ή 0&& για Μακρύς Μακρύς κ.ο.κ.
δέλτα
έψιλον=0
ωμέγα
λάθος:
μη_τιμή=-1
}
μεταβλητή μ ως άλφα
ζήτα=κάθε(άλφα) ' το ζήτα είναι ένα αντικείμενο επαναλήπτης με το άλφα εντός
παλιά_στήλη=στήλη
// $(6,6) σημαίνει αναλογική γραφή με κεντράρισμα στη στήλη και στήλη 6 χαρακτήρων (μη αναλογικών)
τύπωσε $(6, 6),"τιμή", "όνομα", "τύπος","δείκτης", "όμοιος"
ενώ ζήτα ' η ενώ εδώ είναι παραλλαγή της ενώ και δουλεύει με επαναλήπτη
μ=εκφρ(ζήτα) '  μας δίνει ένα αντικειμενο του άλφα με δείκτη ζήτα^
τύπωσε μ, εκφρ$(μ), τύπος$(μ), μ^, μ^=ζήτα^
τέλος ενώ
τύπωσε $(0, παλιά_στήλη)
// δεν θα δούμε την τιμή του λάθους εδώ γιατί είναι εκτός λίστας (πάντα είναι στο δείκτη άλφα^+1, ακριβώς μετά το τελευταίο)
}
Τμήμα ΔοκιμηΑπαρίθμησηςΑλφαριθμητικήςΤιμής {
τύπωσε "Δοκιμή Απαρίθμησης με Αλφαριθμητική Τιμή"
απαρ άλφα {
κάππα="North"
δέλτα="East"
}
μεταβλητή μ ως άλφα
τύπωσε μ="North", εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0
μ++
τύπωσε μ="East", εκφρ$(μ)="δέλτα", μ=δέλτα, τύπος$(μ)="άλφα", μ^=1
μ="North"
τύπωσε μ="North", εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0
δες οκ {
μ="Beep"
}
αν λάθος ή όχι οκ τότε τύπωσε λάθος$ 'θα πάρουμε το μήνυμα Λάθους Περίμενα τύπο απαρίθμησης
τύπωσε μ="North", εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0
καθαρό
' καθαρίζουμε όλες τις τοπικές του τμήματος
' ενεργοποιούμε τη λάθος τιμή.
απαρ άλφα {
κάππα="Αληθές"
δέλτα="Ψευδές"
λάθος:
μη_τιμή="?"
}
μεταβλητή μ ως άλφα
τύπωσε μ="Αληθές", εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0
μ++
τύπωσε μ="Ψευδές", εκφρ$(μ)="δέλτα", μ=δέλτα, τύπος$(μ)="άλφα", μ^=1
μ="Αληθές"
τύπωσε μ="Αληθές", εκφρ$(μ)="κάππα", μ=κάππα, τύπος$(μ)="άλφα", μ^=0
' δίνουμε μια τιμή που δεν υπάρχει στη λίστα τιμών της απαρίθμησης
μ="Beep"
' το μ θα πάρει την τιμή λάθους
τύπωσε μ="?", εκφρ$(μ)="μη_τιμή", μ=μη_τιμή, τύπος$(μ)="άλφα", μ^=2
μ=κάππα
' το άλφα εξ ορισμού έχει δείκτη στο τελευταίο κανονικό στοιχείο (όχι στο λάθος)
επανέλαβε
τύπωσε μ^, τύπος$(μ^)="Long", εκφρ$(μ)
αν μ^=άλφα^ τότε έξοδος
μ++ ' αλλάζουμε τιμή με αλλαγή του δείκτη αλλά δεν αλλάζει στο τέρμα.
πάντα
' μπορούμε να έχουμε μέλη απαρίθμησης με ίδια τιμή
καθαρό
απαρ άλφα {
κάππα="Αληθές"
δέλτα="Ψευδές"
έψιλον="Αληθές"
ωμέγα="Ψευδές"
λάθος:
μη_τιμή="?"
}
μεταβλητή μ ως άλφα
ζήτα=κάθε(άλφα) ' το ζήτα είναι ένα αντικείμενο επαναλήπτης με το άλφα εντός
παλιά_στήλη=στήλη
// $(6,6) σημαίνει αναλογική γραφή με κεντράρισμα στη στήλη και στήλη 6 χαρακτήρων (μη αναλογικών)
τύπωσε $(6, 6),"τιμή", "όνομα", "τύπος","δείκτης", "όμοιος"
ενώ ζήτα ' η ενώ εδώ είναι παραλλαγή της ενώ και δουλεύει με επαναλήπτη
μ=εκφρ(ζήτα) '  μας δίνει ένα αντικειμενο του άλφα με δείκτη ζήτα^
τύπωσε μ, εκφρ$(μ), τύπος$(μ), μ^, μ^=ζήτα^
τέλος ενώ
τύπωσε $(0, παλιά_στήλη)
// δεν θα δούμε την τιμή του λάθους εδώ γιατί είναι εκτός λίστας (πάντα είναι στο δείκτη άλφα^+1, ακριβώς μετά το τελευταίο)
}
ΔοκιμήΑπαρίθμησηςΑριθμητικήςΤιμής
ΔοκιμηΑπαρίθμησηςΑλφαριθμητικήςΤιμής