Avatar billede sph1nx Nybegynder
20. januar 2007 - 17:04 Der er 11 kommentarer og
1 løsning

hjælp til tilstandsmaskine

hey.. er igang med at lave en simpel tilstandsmaskine, har da også fået den til at skifte tilstande efter hvilket tal der kommer ind i den, tallene bliver hentet fra en ArrayList, men selvom der er 5 tal i, så printer den kun tilstandene for f.eks de første 2 tal ud, nogle gange er det de første 4 tal den får ind.. men jeg har stirret mig blindt på koden og kan simpelthen ikke se hvad der er galt, så ville håbe der var nogle af jer der kunne det.

class tilstand
    {
        private const int START_STATE = 1;
        private const int LESSTHENSTATE = 2;
        private const int ZEROSTATE = 3;
        private const int MORETHENSTATE = 4;

        private int state = START_STATE;
      ArrayList source;

        private int startindex = 0;

        public void tilstandsmaskine()
        {
            source = makesource();
            states();
        }

        private ArrayList makesource()
        {
            ArrayList list = new ArrayList();

            for (int i = 0; i <=2; i++)
            {
                list.Add(i);
            }
            return list;
        }

        public void states()
        {
            while (startindex < source.Count)
            {
                int c = (int)source[startindex++];

                switch (state)
                { 
                    case START_STATE:
                        if (c == 0)
                        {
                            state = ZEROSTATE;
                         
                        }
                        else if (c<0)
                        {
                            state = LESSTHENSTATE;
                        }
                        else if (c > 0)
                        {
                            state = MORETHENSTATE; 
                        }
                        break;

                    case LESSTHENSTATE:
                        Console.WriteLine("mindre end 0");
                        state = START_STATE;
                        break;

                    case ZEROSTATE:
                        Console.WriteLine("lig med 0");
                        state = START_STATE;
                        break;

                    case MORETHENSTATE:
                        Console.WriteLine("større end 0");
                        state = START_STATE;
                        break;

                    default:
                        Console.WriteLine("fejl i input");
                        break;
                }
            }


        }
    }
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 17:08 #1
får du nogen sinde zerostate ud ?
Avatar billede sph1nx Nybegynder
20. januar 2007 - 17:10 #2
Ja, MEN kun hvis Arraylisten starter med 0
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 17:14 #3
ok du tilføjer umiddelbart kun 3 elementer til arraylisten i:
for (int i = 0; i <=2; i++)
og Giver startindex++ ikke 1 i første run ?
Avatar billede sph1nx Nybegynder
20. januar 2007 - 17:21 #4
ja, jeg tilføjer kun 3 elementer, men hvis du f.eks tilføjer fra -2 til 2,

så bliver resultatet :

mindre end 0
lig med 0

det er på sin vis også rigtigt nok, da den jo så starter på -1, og så kommer til 0.
men den viser aldrig de sidste 3, hvor der gerne skulle stå større end 0
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 17:43 #5
altså nu har jeg testet lidt og det ser ud som om din maskine gør hvad den skal.
problemet er jo at den kun hver anden gang test på selve elementerne i arraylisten.

flow for 4 elementer:
første element ryger altid ind i start_state.
næste gennemløb ryger ind i en af de andre
derefter start_state igen.
en af de andre.
osv.
Det er vel ikke det gennemløb du vil have i tilstandsmaskinen ?
Avatar billede sph1nx Nybegynder
20. januar 2007 - 17:52 #6
hmm nej!

det var meningen at den skulle modtage første element, teste på det, og gå ned i den state der passer på værdien, så tilbage til og teste på det næste element, og så ryger den ned i den state der passer på værdien igen.

lyder det helt mærkeligt ?
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 17:56 #7
prøv med:
int c = (int)source[startindex];
  case START_STATE:
{
                        if (c == 0)
                        {
                            state = ZEROSTATE;
                       
                        }
                        else if (c<0)
                        {
                            state = LESSTHENSTATE;
                        }
                        else if (c > 0)
                        {
                            state = MORETHENSTATE;
                        }
                        break;

startindex++;
}
Avatar billede sph1nx Nybegynder
20. januar 2007 - 18:10 #8
hmm det så ud til at hjælpe lidt på det, men hvis jeg så har -2,-1,0,1,2 i min list, så kommer den kun til 1 hvor den skriver størrer end 0, men den kommer aldrig med det sidste størrer end 0!
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 20:13 #9
prøv lige med:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class tilstand
    {
    private const int START_STATE = 1;
        private const int LESSTHENSTATE = 2;
        private const int ZEROSTATE = 3;
        private const int MORETHENSTATE = 4;

        private int state = START_STATE;
      ArrayList source;

        private int startindex = 0;

        public void tilstandsmaskine()
        {
            source = makesource();
            states();
            Console.Read();
        }

        private ArrayList makesource()
        {
            ArrayList list = new ArrayList();

            for (int i = -2; i <=2; i++)
            {
                list.Add(i);
            }
            return list;
        }

        public void states()
        {
            while (startindex < source.Count)
            {
                int c = (int)source[startindex];

                switch (state)
                {
                    case START_STATE:
                        if (c == 0)
                        {
                            state = ZEROSTATE;
                       
                        }
                        else if (c<0)
                        {
                            state = LESSTHENSTATE;
                        }
                        else if (c > 0)
                        {
                            state = MORETHENSTATE;
                        }
                        break;

                    case LESSTHENSTATE:
                        Console.WriteLine("mindre end 0");
                        state = START_STATE;
                        break;

                    case ZEROSTATE:
                        Console.WriteLine("lig med 0");
                        state = START_STATE;
                        break;

                    case MORETHENSTATE:
                        Console.WriteLine("større end 0");
                        state = START_STATE;
                        break;

                    default:
                        Console.WriteLine("fejl i input");
                        break;
                }
                if(state == START_STATE)
                    startindex++;
            }


        }
    }
   
}
Avatar billede sph1nx Nybegynder
20. januar 2007 - 20:18 #10
wuu that did the trick
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 20:19 #11
perfekt tillader mig lige at smide et svar :)
Avatar billede sph1nx Nybegynder
20. januar 2007 - 20:22 #12
oki
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester