ul$() : Nu Ook Negatieve Getallen

Geef hier je beste Liberty BASIC tips door. (Hier geen hulp vragen)

Moderators: anthonio, Abcott

ul$() : Nu Ook Negatieve Getallen

Berichtdoor glpape » vr mei 27, 2011 12:51 pm

Weken geleden al weer zag ik dat using() ook goed met negatieve getallen omgaat terwijl mijn ul$() functie dat niet kan.

Ik heb er even tegen aan gehikt, het was inmiddels al aardig complexe code, maar vorige week is mijn computer door een virus ge-attaqueerd en de behulpzame expert die wel eens opnieuw Windows zou installeren en mijn back-ups door de virusscanner zou halen heeft alle, letterlijk alle Liberty Basic materiaal gewist ("allemaal virussen op die zwarte memory stick") : eerst wat 't even slikken maar toen heeft het, ha-ha! tenslotte heel bevrijdend gewerkt.
Allerlei probeersels die nog niet af waren maar waar ik ook eigenlijk niet veel zin meer in had vroegen niet langer om mijn aandacht. Ik heb toen Liberty Basic opnieuw gedownload en de oude ul$() van het forum gehaald en ik ben er eens goed voor gaan zitten.

De nieuwe code werkt ook met negatieve getallen goed. De code is ul$(apn, b, getal) .
<apn> (apositiefnegatief) is het aantal posities voor de decimale punt; met <-apn> krijg je komma's in grote getallen.
<b> is het aantal decimale posities.
<getal> kan negatief zijn. Het minteken telt mee in de berekening van <a>: om 12 goed weer te geven moet <a> minstens 2 zijn, voor -12 minstens 3.

Deze listing is veel meer gestroomlijnd dan de eerdere, denk ik. Het decimale deel (bblock$, met b en b$) wordt gewoon door de using() functie gevormd in de variabele ul2$. De string links van de decimale punt bestaat uit variabelen voor % en - tekens en voor leading spaces en ablock$. ablock$ zijn de getallen in de string links van de komma. <apn> is het aantal posities links van de punt en kan ook negatief zijn; a is de absolute waarde van apn.

Hier de functie. Met mijn favoriete demo; die is zelf ook nogal ingewikkeld, let daar niet op, daar gaat het nu niet om.

Code: Selecteer alles
mainwin 80 30

for n = 1 to 3                                            ' 3 random getallen [price(n)] van max 8 cijfers
cmax = int(rnd(0)*8)+1                                    ' cmax = lengte nieuw getal
   for m = 1 to cmax
   if m = 1 then price$(n) = price$(n) + str$(int(rnd(0)*9+1))       ' 1e (en elk ander) getal niet 0
   price$(n) = price$(n) + str$(int(rnd(0)*10))
   next m
kk = rnd(1)
k = 1  :  if kk < 0.5 then k = -1
price(n) = val(price$(n))  :  price(n) = price(n) * k                ' sommige getallen negatief
if len(str$(price(n))) > Euromax then Euromax = len(str$(price(n)))  ' Euromax = lengte langste getal
next n

print : print : print
print , "Random amounts in Euro's :"
print : print : print
for n = 1 to 3
print , "Totaal ("; n; ") : Euro "; ul$(Euromax, 2, price(n))
next n

print : print : print
for n = 1 to 3
print , "Totaal ("; n; ") : Euro "; ul$(0-Euromax, 2, price(n))
next n

End


Function ul$(apn, b, num) 'v4.1           ' positions before the dot; behind it; number to display
                                          ' inserts comma's in integer part if apn is Negative
a = abs(apn)                              ' apn: aposneg
ntc$ = chr$(10); "At least One Integer Position Required"; space$(5); _
       chr$(10); chr$(10); "You can print < 0.25 >, not < .25 >"; chr$(10)
if a = 0 then notice ntc$ : exit function
if b<>0 then
for n = 1 to b
b$ = b$; "#"
next n
dot$ = "."
end if
ul2$ = using("#"; dot$; b$, num)
ablock$ = str$(abs(int(num)))
bblock$ = right$(ul2$, b)
if  (a<len(str$(int(num))))  then perc$ = "%"
ldspace = a - len(str$(int(num)))                     ' no leading spaces from using() function
if ldspace < 0 then ldspace = 0
if num<0 then sign$ = "-"
if (apn>0) then [ul]                                  ' Next starting COMMA FUNCTIONALITY
seprtot = int((a-1)/3)                                ' total no separators
seprcma = int((len(str$(int(abs(num))))-1)/3)         ' no separators that is commas
seprldspace = seprtot - seprcma                       ' no of separators that is leading spaces
i = len(ablock$) mod 3  :  if i = 0 then i = 3        ' i = number of positions left of next comma
   if a > 3 then
   for n = 1 to seprcma
       ablock$ = left$(ablock$, i); ","; mid$(ablock$, i+1)
       i = i + 4
   next n
   end if
[ul] ul$ = perc$; space$(ldspace+seprldspace); sign$; ablock$; dot$; bblock$
End Function



Het is nu heel makkelijk om idioot grote getallen in te voeren, omdat je niet al die hekjes hoeft te typen, maar er zijn grenzen aan de getal grootte die Liberty aan kan.

Code: Selecteer alles
mainwin 90 30

print : print
print "Demonstreert de Komma Functie, en problemen met grote getallen :"
print : print

print "Geen problemen met integers :"
print
print ul$(-22, 0, 123123123456456678444.345876); "  Resultaat van ul$(-22, 0, 123123123456456678444.345876)"
print ul$(-22, 0, 123123123456456678444); "  Resultaat van ul$(-22, 0, 123123123456456678444)"
print

print "Moeilijk om een patroon te ontdekken in max aantal integer"
print "      en fractional positions dat correct wordt weergegeven : "
print
print ul$(-15,  6, 2^32); tab(40); " 6 decimal positions : FOUT !"
print ul$(-15, 16, 2^32); tab(40); tab(40); "16 decimal positions : OK !"
print

print
print "Probleem is de floating point getallen voor Liberty, niet de ul$() functie :"
print "Liberty's <using()> geeft dezelfde resultaten als mijn <ul$()> functie."
print
print using("###############.######",  2^32); tab(40); "<using()> :  6 decimal positions"
print using("###############.################",  2^32) ;tab(40); "<using()> : 16 decimal positions"



Tenslotte, over mijn favoriete demo, nog dit. De getallen verschijnen steeds 1 spatie achter het woord "Euro", behalve soms, als het langste getal 3, 6, 9, etc cijfers lang is en negatief, dan 2 spaties. Het lijkt een fout, maar is dat niet - ga er maar eens goed voor zitten.

En : < If BUGS then "Let Me Know !" > .

Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Re: ul$() : Nu Ook Negatieve Getallen

Berichtdoor ForNext » di mei 31, 2011 9:01 pm

Hallo George,

De eerste listing draait vlekkeloos en ga ik zeer zeker nader bestuderen. Maar als ik die tweede listing draai dan krijg ik de mededeling : "Basic Compile Halted: array ul$() is 'one' dimensional". Op zich niet zo erg; ik moet toch eerst de eerste listing doorlopen.
Anyway, groeten uit Amsterdam.
Roberto
Cursist LB Amstelveen
ForNext
 
Berichten: 60
Geregistreerd: za okt 27, 2007 9:40 am
Woonplaats: Amstelveen

Re: ul$() : Nu Ook Negatieve Getallen

Berichtdoor glpape » do jun 02, 2011 12:27 pm

Roberto hallo,

Gedonder. Ik heb dat vroeger ook wel eens gehad in een ander programma, dat Lbty een user-defined function als een array ziet.
Weet niet meer in welk verband, en of ik het probleem het kunnen oplossen.

Jammer dat je die Error krijgt want de tweede listing is meer gestructureerd, ik denk ook meer inzichtelijk, dan de eerste, en kan dus negatieve getallen aan.

Zelf kan ik niet zo veel met je probleem omdat ik het niet heb. Ik gebruik v4.04 op een computer met Windows XP Professional.

Ik ben wel benieuwd hoe het voor anderen werkt. Laten we Gordon eens oproepen : GORDON BEN JE ON-LINE, en heb je de functie geprobeerd ? En heb jij ook ervaring met user-functies die abussievelijk als array() worden gezien ?

Probeer vooral van alles. Wat gebeurt er als je de naam van de functie veranderd - waarschijnlijk niks.
En wat als je Liberty vertelt dat hier niks te array-en valt, met de simpele binnenkomer < dim ul$(0) > ?
Bij mij lost het dus niks op omdat er geen probleem is, maar het geeft ook geen error.

Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Re: ul$() : Nu Ook Negatieve Getallen

Berichtdoor glpape » vr jun 03, 2011 10:57 am

Roberto hallo,

Kun je me je code sturen die de fout geeft, tesamen met de ul$() functie die je hebt gedownload. Kijken of het zonder veranderingen in de code is overgekomen.

Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Re: ul$() : Nu Ook Negatieve Getallen

Berichtdoor ForNext » ma jun 06, 2011 9:01 pm

Hallo George,

Ik krijg zowel zonder als met < dim ul$(0) > dezelfde foutmelding. Zie bijgaande afbeelding (scr_4.jpg).

Ciao,
Roberto
Bijlagen
scr_4.jpg
scr_4.jpg (288.15 KiB) 4369 keer bekeken
Cursist LB Amstelveen
ForNext
 
Berichten: 60
Geregistreerd: za okt 27, 2007 9:40 am
Woonplaats: Amstelveen

Re: ul$() : Nu Ook Negatieve Getallen

Berichtdoor ForNext » ma jun 06, 2011 9:16 pm

Nog even een toevoeging:

Als ik < dim ul$(0,0) > toevoeg, wordt de foutmelding : array ul$() is "two" dimensional.
Meer dimensions zijn er niet. Toch?

Ciao,
Roberto
Cursist LB Amstelveen
ForNext
 
Berichten: 60
Geregistreerd: za okt 27, 2007 9:40 am
Woonplaats: Amstelveen

Re: ul$() : Nu Ook Negatieve Getallen

Berichtdoor glpape » ma jun 13, 2011 5:42 pm

Roberto hallo,

Ik heb op het Liberty Basic community forum gevraagd of anderen ervaring hebben met een functie$() die wordt gelezen als array$().

Ondertussen zit er een belangrijke bug in de functie. Ga ik wat aan doen, maar wat heeft ul$() me al veel tijd gekost ! Ik wou maar dat ze het de oefening maakten voor de volgende Liberty meeting in Amstelveen, dan kreeg ik de oplossing een maand later in de schoot geworpen.

Ziehier het probleem :
Code: Selecteer alles
calldll #user32, "GetActiveWindow", hmain as ulong

print sqrt(25)
print
print ul$(3,0,sqrt(25))
print
print ul$(3,3,sqrt(25))
print
print using("###.###", sqrt(25))
print
print int(sqrt(25))

print : input "press  <Enter>  to close : "; aa

if hmain then calldll #user32, "PostMessageA", hmain as ulong, _WM_CLOSE as long, _
                               0 as long, 0 as long, rtn as void  :  end


Function ul$(apn, b, num) 'v4.1           ' positions before the dot; behind it; number to display
                                          ' inserts comma's in integer part if apn is Negative
a = abs(apn)                              ' apn: aposneg
ntc$ = chr$(10); "At least One Integer Position Required"; space$(5); _
       chr$(10); chr$(10); "You can print < 0.25 >, not < .25 >"; chr$(10)
if a = 0 then notice ntc$ : exit function
if b<>0 then
for n = 1 to b
b$ = b$; "#"
next n
dot$ = "."
end if
ul2$ = using("#"; dot$; b$, num)
ablock$ = str$(abs(int(num)))
bblock$ = right$(ul2$, b)
if  (a<len(str$(int(num))))  then perc$ = "%"
ldspace = a - len(str$(int(num)))                     ' no leading spaces from using() function
if ldspace < 0 then ldspace = 0
if num<0 then sign$ = "-"
if (apn>0) then [ul]                                  ' Next starting COMMA FUNCTIONALITY
seprtot = int((a-1)/3)                                ' total no separators
seprcma = int((len(str$(int(abs(num))))-1)/3)         ' no separators that is commas
seprldspace = seprtot - seprcma                       ' no of separators that is leading spaces
i = len(ablock$) mod 3  :  if i = 0 then i = 3        ' i = number of positions left of next comma
   if a > 3 then
   for n = 1 to seprcma
       ablock$ = left$(ablock$, i); ","; mid$(ablock$, i+1)
       i = i + 4
   next n
   end if
[ul] ul$ = perc$; space$(ldspace+seprldspace); sign$; ablock$; dot$; bblock$
End Function

Function sqrt(k)
sqrt = k^0.5
End Function



Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Re: ul$() : Nu Ook Negatieve Getallen

Berichtdoor Gordon » ma jun 13, 2011 9:01 pm

Oeps, sorry George....
Ik was druk bezig met de voorbereiding voor de volgende
cursus avond in Amstelveen.
We starten met het maken van een lichtkrant ....
waarbij de lichtkrant-teksten uit XML bestanden gehaald moet worden.

De lichtkrant is er al.
Nu nog URLmon.DLL bespreken en inzetten.
Daarna de parsing.....

De nieuwe cursisten (5 stuks!!!!) zijn echter nog lang niet zo ver.

Ik zal jouw probleem toch aankaarten.

Gordon.
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Re: ul$() : Nu Ook Negatieve Getallen

Berichtdoor glpape » di jun 14, 2011 4:44 pm

Gordon hallo,

Ik zag dat van die lichtkrant, leek me een aantrekkelijke opdracht.
Zelf toch niks aan gedaan, ik ben met andere programma's bezig, steeds "utilities", dat is geloof ik ook waar hobby programmeurs zich het meest mee bezig houden.

Ik zal jouw probleem toch aankaarten.


Dat van die cursisten, dat ik wil dat zij mijn werk doen, was meer lolbroekerij. Ik heb juist vandaag tijdens de koffiepauzes hier een verbeterde versie gemaakt die ook int(25^0.5) [vierkantwortel van 25] goed weergeeft. Ik wist ook waar het probleem zat, in de listing die bij mijn vorig bericht zat gaf ik dat ook aan.
Je kunt kijken of de cursisten het ook zien, want het gaat om een belangrijk probleem voor programmeurs; zelf wist ik het eigenlijk wel zo'n beetje maar toch ben ik er weer in gevlogen.
Ik probeer de nieuwe versie nog even grondig uit voor ik hem op het forum zet.

Wat ik wel leuk zou vinden is als iedereen de functie op zijn computer probeert en kijk dan eens of zij ook hebben dat de user-functie als een array wordt gezien. Gebruik nog de oude versie van ul$() want dat is de versie waar Roberto het probleem mee rapporteerde.
Versie 4.1 dus; versie 5 komt eraan en is, geloof ik nu, perfect.

Vr groet, ook in Amstelveen,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm


Keer terug naar Tips en informatie

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron