Buggfix Plus
Aktuellt datum och tid: 00.26 2018-09-26

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 15 inlägg ] 
Författare Meddelande
InläggPostat: 11.31 2018-02-06 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 13112
Ort: Norrköping
Om man vill skriva en statemaskin i C kan man tex göra såhär:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
void statemachine(void)
{
  static int state;

  switch (state) {
  case 0:
    state++;
    break;

  case 1:
    state++;
    break;

  case 2:
    state = 0;
    break;
  }

} /* statemachine */

Men hur gör man i Python 3?

De statemaskiner jag skrivit så långt har statevariabeln som en global variabel i modulen och det känns fel.


Upp
 Profil  
 
InläggPostat: 11.55 2018-02-06 
Användarvisningsbild

Blev medlem: 10.07 2008-01-22
Inlägg: 1721
Ort: Sollentuna
Allt i Python är objekt, så även funktioner. Så tilldela helt enkelt en variabel som en "medlem" till funktionen:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)

def statemachine():
   
   if statemachine.state == 0:
      statemachine.state += 1

   elif statemachine.state == 1:
      statemachine.state += 1

   elif statemachine.state == 2:
      statemachine.state = 0

statemachine.state = 0



/j


Upp
 Profil  
 
InläggPostat: 12.20 2018-02-06 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 13112
Ort: Norrköping
Stort tack! :D


Upp
 Profil  
 
InläggPostat: 12.27 2018-02-06 
Användarvisningsbild

Blev medlem: 10.07 2008-01-22
Inlägg: 1721
Ort: Sollentuna
Hittade en liten decorator på nätet, då kan du snygga till deklarationen med ett attribut istället:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
def static_var(varname, value):
    def decorate(func):
        setattr(func, varname, value)
        return func
    return decorate


Då kan du istället skriva såhär vilket ser lite snyggare ut i mina ögon:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
@static_var(state=0)
def statemachine():
  statemachine.state += 1
  ...



Python är kul!

/j


Upp
 Profil  
 
InläggPostat: 12.49 2018-02-06 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 13112
Ort: Norrköping
Citera:
Python är kul!

Nja, eftersom jag är en grinig gammal C-gubbe vill jag inte ha en massa lull-lull. :)
Assembler någon? Eller FORTH? 8)


Upp
 Profil  
 
InläggPostat: 12.52 2018-02-06 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23087
Ort: Kristinehamn
Jag har gjort saker för PC i Python - och föredrar fortfarande definitivt C.
Är nog en gammal grinig gubbe jag med.

Gör en hel del i den gamla Borland C Builder och trivs med det.


Upp
 Profil  
 
InläggPostat: 14.14 2018-02-06 
Användarvisningsbild

Blev medlem: 10.07 2008-01-22
Inlägg: 1721
Ort: Sollentuna
Jag är också en grinig gammal gubbe och har ibland svårt att imponeras över nya språk/ramverk, men just Python hade jag väldigt lätt att ta till mig - kanske just för att jag _hade_ C/C++ i bagaget :-)
Och, jag hackar fortfarande C/C++, det ena utesluter ju inte det andra, vart språk är bra på sitt (utom Php som suger på allt)

/j


Upp
 Profil  
 
InläggPostat: 18.14 2018-06-14 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 13112
Ort: Norrköping
Jag tackar johano för en väl fungerande lösning på mitt problem.

Men, det gör lite ont att variablerna är åtkomliga från kod utanför funktionen. Jag trodde jag skulle vänja mig men jag är troligen alltför präglad av mitt liv med C.
Finns det något som beter sig mer som en static i C? Dvs, behåller värdet mellan anrop av funktionen, osynlig utanför funktionen och gärna garanterat ha ett visst värde vid start.


Upp
 Profil  
 
InläggPostat: 18.42 2018-06-14 
EF Sponsor
Användarvisningsbild

Blev medlem: 22.58 2005-10-01
Inlägg: 1126
Ort: Torestorp
Borland Builder är riktigt bra !


Upp
 Profil  
 
InläggPostat: 19.08 2018-06-14 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 13112
Ort: Norrköping
Que?


Upp
 Profil  
 
InläggPostat: 19.38 2018-06-14 

Blev medlem: 08.04 2012-06-19
Inlägg: 241
Ort: Lund
Jag är också en grinig gubbe som gärna kodar 8-bitars assembler, eller skriver VHDL för den delen, eller ritar kisel för hand, men faktum är att Python ger en sådan särdeles hävstång att det är synd att inte ta del av det.

För mig känns det naturligt att ha en statemachine som ett objekt innehållande state och metoder för att manupulera statet mm. Kanske en grund:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
class StateMachine:
    def __init__(self, start_value):
        self.val = start_value
    def increase(self, val):
        self.val += val
    def show_val(self):
        print(self.val)

x = StateMachine(100)
y = StateMachine(200)
x.increase(5)
x.show_val()
y.show_val()
Två unika maskiner instansieras och programmet kommer att printa värdena 105 och 200.

Och ja, php suger på allt.


Upp
 Profil  
 
InläggPostat: 19.58 2018-06-14 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 13112
Ort: Norrköping
Ja VHDL var kul men det var länge sedan. Vi gjorde en bunt VME-kort med FPGA på för signalbehandling i slutet av åttiotalet och början av nittiotalet. Ett kort var speciellt minnesvärt, footprinten i CAD-systemet stämde väldigt dåligt med kretsen. Jag minns inte om det var kretsen eller footprinten som hade pinne 1 i hörnet men den andra mitt på ena sidan. Stackarn som caddade skämdes som en hund.
Tyvärr har jag inte lyckats passera tröskeln i Python, jag minns hur det var när jag passerade tröskeln i C, det var en underbar känsla. Samma med tröskeln i FORTH men där har jag halkat tillbaks till nybörjarstadiet eftersom "ingen" är intresserad av FORTH och det därmed är en ganska kass födkrok. C och assembler däremot verkar ha kommersiell potential. Och Python. Och en massa annan xxxxxx.

Din klass för en statemaskin är elegant men den saknar egenskapen att ha privata variabler. Visst, jag kanske är både nojig och fånig men jag gillar konceptet med privata variabler. :)


Upp
 Profil  
 
InläggPostat: 20.09 2018-06-14 

Blev medlem: 08.04 2012-06-19
Inlägg: 241
Ort: Lund
Citera:
Din klass för en statemaskin är elegant men den saknar egenskapen att ha privata variabler. Visst, jag kanske är både nojig och fånig men jag gillar konceptet med privata variabler. :)
Ingenting är privat i Python. Det är bra och dåligt.


Upp
 Profil  
 
InläggPostat: 20.48 2018-06-14 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 13112
Ort: Norrköping
Luktar klassisk BASIC lång väg. :(


Upp
 Profil  
 
InläggPostat: 21.02 2018-06-14 

Blev medlem: 08.04 2012-06-19
Inlägg: 241
Ort: Lund
Nä nu tar du väl ändå i :D Men min reaktion var liknande när jag insåg detta. Jag kan inte prata mig ur det, för det är en härlig känsla att isolera saker från varandra, men erfarenhetsmässigt har det visat sig att det är direkt ovanligt att det går snett på grund av bristande isolation. För mig och de projekt jag jobbat med.

En sak du kan göra är att låta alla privata saker ha ett namn som börjar med två underscore, tex "__val". Python låter dig inte accessa "x.__val", till exempel. (Men det finns andra sätt att få ut värdet om man vill, så riktigt privat är det inte.)


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 15 inlägg ] 

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 1 gäst


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010