Fantomaz
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
Hoi Mensen.
Weer eens PICbasic uit het stof...
In mijn code heb ik de volgende regel verwerkt:
If (up = 0 And down = 0) Or esc = 1 Or ent = 1 Then
Dus als up en down beiden null zijn óf esc of ent is ingedrukt (1) moet er een actie uit voortkomen.
Dit slikt PICbasic niet en ik krijg een syntaxis error.
Kan ik dit wat vereenvoudigen?
klein is fijn
Moderator
Welke error krijg je precies? Het ziet er niet echt onlogisch uit.
Behalve dat up & down heel goed een paar keywords van de compiler kunnen zijn. Ik verduidelijk en voorkom zoiets altijd door namen zoals button_up te gebruiken.
Tinus016
www.tinuselectronics.nl Because DIY Electronics Matters!!!!
Mag dit ook?
If up = 0 And down = 0 Then
....
ElseIf esc = 1 Then
....
ElseIf ent = 1 Then
....
EndIfEn volgens mij kun je de haakjes weg hallen, probeer dat eens.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Omdat ik vaak in C werk en er ooit "ruzie" is geweest over wat eerst moet (vandalewachtopantwoord maar dan met de and/or operaties), gebruik ik in and/or expressies ALTIJD het maximum aantal haakjes.... Dus ik zou juist om de ent=1 en esc=1 haakjes zetten.
@sonytech hieronder: mee eens. Doen!
Ook vooraan rond de AND-constructie zou ik nog een paar haakjes extra doen.
If ((up = 0) And (down = 0)) Or (esc = 1) Or (ent = 1) Then Als het eenmaal werkt kan je altijd nog kijken wat je ongestraft weg kan halen.
hadv
Just find out what you like and let it kill you
Waarschijnlijk krijg je errors 18 en 19.
18 betekent dat de expressie te complex is
19 dat er een incorrect endif staat, maar dat is een gevolg van de vorige.
Dit probleem komt vaker voor bij PicBasic.
Het staat niet echt uitgelegd in het manual, en bij 'boolean logic operators' wordt er niet naar verwezen.
ik los dit soort dingen op met een extra bit variabele
dim bDoorgaan as bit
bDoorgaan = 0
if (up = 0 and down = 0) then bDoorgaan = 1
if ent = 1 then bDoorgaan = 1
if esc = 1 then bDoorgaan = 1
if bDoorgaan = 1 then
//
endifHier kunnen nog elseif'jes tussen.
Door een bit te gebruiken krijg je relatief beknopte en snelle code
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Oh... een compiler die met 4 variabelen in een if d'r mee kapt doe ik onmiddelijk in de vuilnisbak. Daar kan ik echt niet mee werken.
hadv
Just find out what you like and let it kill you
Ik ben het er mee eens dat het niet echt sterk is.
Maar ook bij compilers die dit soort zaken wel kunnen hebben gebruik ik die bit-constructie wel vaker, simpelweg omdat het een complexe boolean expressie beter leesbaar en onderhoudbaar maakt.
Je bent dan ook niet meer afhankelijk van de volgorde waarmee de compiler de expressie oplost.
EricP
mét CE
In C zou ik er zoiets van maken:
if (((0==up) && (0==down)) ||
(1==ent) ||
(1==esc)) <hier wat je wilt doen>;Prima leesbaar en geen gedoe met tijdelijke variabelen. Als je het met haakjes niet op kunt lossen, is het echt tijd voor een andere compiler.
Ik hou ook wel van overzichtelijke logica zoals hadv noemt, al die complexe one liners zijn echt niet sneller maar wel lastig te lezen en debuggen.
Ik neem aan dat dit voor menuknopjes is en ik kan me niet voorstellen dat je deze state echt wil toetsen.
Ik ben benieuwd of de Fantomaz in 2007 of zo nog antwoord had gekregen van het picbasic uk forum.
Moest voor iemand op papier ook wat picbasic code schrijven en heb zulke IF vragen opgelost zoals hadv het beschreven heeft. Of van de actie's een subroutine gemaakt en deze na elke IF test aan geroepen.
Andere mogelijkheid die ik gebruikt had is:
IF a=1 AND b=1 then Goto doit
if c=0 then Goto doit
if d=0 then goto doit
Goto After
doit:
.....
......
After:
Niet netjes maar wel bij elkaar.
Fantomaz, is het mogelijk om C te gebruiken i.p.v PicBbasic?
Edit: sample aangepast.
[Bericht gewijzigd door Lord Anubis op (12%)]
hadv
Just find out what you like and let it kill you
Je kunt de gratis C compilers van MicroChip downloaden. Deze zijn goed, maar nogal kaal in de zin van het aantal beschikbare libraries.
Een betaalde C compiler is die van mikroElektronika, het voordeel daarvan is dat deze zeer veel libraries heeft.
Zij hebben overigens ook een Basic en een Pascal compiler.
Fantomaz
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
Crap... al mijn reacties zijn niet gepost...
Ik hoop dat ik ze thuis nog op de PC heb staan. 
Sorry mensen...
Meer info later!
Fantomaz
Fantomaz
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
Even ter afronding.
Het zal wel een oplossing worden ála Hadv.
Ik ben niet zo C-minded.
Overigens had ik al veel oplossingen zoals hier aangedragen geprobeerd, maar zonder succes.
Ook die overkill aan Haakjes, zoals Sonytech aanhaalde, hadden geen effect.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Da's geen overkill aan haakjes, maar om 100% zeker te zijn dat de compiler goed begrijpt wat je wilt. Ik doe het altijd zo.
hadv
Just find out what you like and let it kill you
@Lord Anubis: die constructie lijkt meer op assembler waar je alleen maar goto en call hebt.
Als ik een 3e generatie programmeertaal gebruik heb ik geen goto nodig.
@Arco: nee, geen overkill aan haakjes. Maar Proton kan daar dus niet tegen.
[Bericht gewijzigd door hadv op (19%)]
EricP
mét CE
@Arco: nee, geen overkill aan haakjes. Maar Proton kan daar dus niet tegen.
Wordt het dan toch geen tijd voor een fatsoenlijke compiler???
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
EricP
mét CE
Ja, ook waar. Maar dan nog steeds is het wel heel triest als een compiler z'n eigen syntax niet lust...
Op 30 november 2013 00:04:18 schreef hadv:
@Lord Anubis: die constructie lijkt meer op assembler waar je alleen maar goto en call hebt.
Als ik een 3e generatie programmeertaal gebruik heb ik geen goto nodig.
Het was in picbasic, en zoals geschreven is het niet netjes, maar i.d.g bespaarde ik enkele regels i.v.m de versie van de eind gebruiker en daardoor beperkt aantal regels of pic grootte.
Eerlijk gezegd ik heb zelf nog niets gemaakt in PicBasic. Was altijd op papier eh SubEthaEdit.
Uiteraard is het te gek voor woorden dat de basic compiler geen haakjes kan verwerken.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Als de compiler geen haakjes kan verwerken is dat uiteraard wel treurig... (volgens mij de eerste compiler ooit waarbij ik dat zie...)
Natuurlijk kan de compiler wel haakjes verwerken... dat maken jullie er van!
Als de TS eens begin met het posten van de foutmeldingen... dat scheelt weer een heleboel commentaar van mensen die deze compiler niet eens kennen (en liever bashen).
Die heeft hij hier al in 2007 of zelfs eerder laten zien. Vandaar mijn vraag of hij een reactie gehad heeft van de picbasic UK forum. Tuurlijk het advies is geef de foutmeldingen.
Eerder is al aangegeven dat men hoofdletters moet gebruiken, maar schijnbaar werkt dat ook niet.
Je weet de bedoeling achter de TS zijn regel code, met of zonder haakjes.
Als je denkt de oplossing voor de TS zijn vraag te hebben, gooi maar op tafel.
Buiten het feit of de regel wel of geen haakjes heeft, de regel, afgezien van de hoofdletters, zou moeten compileren.
Laat hij eens kijken of het volgende werkt
IF 1==1 AND 1==1 OR 1==1 OR 1==1 THEN
PRINT "OK"
ELSE
PRINT "Not OK"
ENDIF
Gooi er dan eens haakjes om heen ( 1==1) AND (1==1). werkt dat nog? Zou moeten werken.
Dit idem ( 1==1 AND 1==1 )
Laat anders Fantomaz zijn code minimaliseren tot enkel de nodige regles om de IF functie te testen.
Uit http://www.circuitsonline.net/forum/view/55198 is idd veel te halen.
Fantomaz
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
Ah nu snap ik Anubis ook.
Maar dat is een tijd geleden en aangezien ik meer doe in het leven dan PICbasic dingen, kan het zijn dat dit voor een ander projectje was.
Ik weet de uitkomst niet meer...
(kon het even niet laten).