Tolka villkor

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Tolka villkor

Inlägg av ToPNoTCH »

Hur skulle ni angripa följande problem.
Jag har brutit lite i det med block och penna för jag tänkte för en gångs skull
att jag skulle ha en bra lösning INNAN jag kodar en rad

Jag hoppas jag beskrivit problemet på ett någorlunda förståbart sätt.
Annars så kompletterar jag, så ställ frågor.

Jag har en MCU där jag avser hantera ett antal regler/villkor.
Problemet är att dessa är ställbara.

Förutsättningar:
En apparat kan vara i fem olika lägen, låt oss kalla dessa för "states"

För varje state kan man konfigurera upp till tio regler/villkor.

Dessa struktureras enligt följande:

om <variabel> är <villkor> <värde> så utför <kommando>

Variabel = Variabel1 - Variabel8
Villkor = Mindre än, Större än
Värde = 0-255
Kommando = Kommando1 - Kommando8

Reglerna är lagrade i Arrayer typ.
variabel[state][regel],villkor[state][regel},värde[state][regel],kommando[state][regel]

Hur kan man på enklaste sätt skapa en rutin som kontrollerar (och vid match utför) respektive regel ?
Rutinen behöver givetvis bara kontrollera de regler som gäller för aktuell state (apparaten kan bara he ett state).

Jag skriver i C men kan tolka förklaringar på de flesta språk (psuedo kod går bra).
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Tolka villkor

Inlägg av sodjan »

Med "variabel" så kanske du inte avser en vanlig variabel i C koden(?)
utan mer som en parameter i applikationen som ändras och kollas. Jag
kallar det parameter för att tydligt skilja det från vanliga variabler.

Någon slags array där du lagrar namnet på parametern och det övriga.

Varje element i arrayen består av en struct som innehåller det du
beskriver: "state, namn, aktuellt värde, villkor, gränsvärde, kommando".

Sen så är frågan vad "kommando" ska vara. Sannolikt något slags referens
till en funktion som sedan anropas.

Några standard funktioner för att ändra värde på en parameter, kolla
värdet mot villkor och gränsvärde, att köra funktionerna o.s.v..
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Tolka villkor

Inlägg av Icecap »

Först o främst måste det finnas någon form av "detta inlägg är ogiltigt", detta för att det kan vara upp till 10 inlägg i varje state.

Resten är väl bara att scanna igenom de 10 inlägg som finns för varje state - för jag förstår att varje state är lagt innan detta ska utföras.

Jag hade samlat alla värden i en array och använd deras index i det array som pekare på vilket värde som används för ett inlägg.
Sedan kommer gränsvärdet, om de "alla" hänger ihop (typ A, B=A/2 eller liknande, C=B*3 osv) hade jag gjort en array med dom också och använd index där med. Annars hade jag skrivit in verkliga tal.
Därnäst ska aktionen (>, <, >=, <=, !=, ==, <ogiltig>) pressas in i en enum och de enum används i rätt inlägg.

Om en aktion ska utföras får man så lägga in vilken aktion vilket kan vara en punktionspekare eller ett numerisk värde som i sin tur används i en switch()-statement.

Så ett inlägg ska alltså komponeras:
int Värde, int Gränsvärde, int villkor, int Rutin_att_exekvera;

Kod: Markera allt

typedef struct
  {
  int Value_Index;
  int Limit_Value;
  int Limit_Use;
  int Execute;
  } T_TABEL_POINT;
Man har sedan 10 st av dessa per state

Kod: Markera allt

struct
  {
  struct
    {
    T_TABEL_POINT Point[10];
    } State[10];
  } States;
Jag hade sedan - för varje gång detta skulle utföras - köra:
01: Läst state.
02: for(Point_Counter = 0; Point_Counter < 10; Point_Counter++)
03: if(States.State[State_Value].Point[Point_Counter].Limit_Use != RULE_INVALID) // Evt. lägga på en Point_Counter = 10 också.
04: Kolla regeln för de givna värden
05: Om regeln är uppfylld kall rutinen för den givna regel.
06: Next Point_Counter
Klart

Det kan såklart putsas ganska mycket men det är stommen i hur jag hade löst det.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Tolka villkor

Inlägg av sodjan »

Ja, det stämmer med hur jag menade, fast med lite praktiskt kod också... :-)
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Tolka villkor

Inlägg av ToPNoTCH »

Tack för tankehjälpen....

@Sodjan:
Jo det är en parameter som givetvis lagras i en variabel, men du har rätt det är nog bra att hålla isär det.
Kommando är mycket riktigt en pekare till en rutin som skall utföras.

Det är just
kolla värdet mot villkor och gränsvärde, att köra funktionerna o.s.v.
som är det kniviga.

@Icecap:
Jag hänger med på hur du tänker. Inte så dumt.

Angående reglernas giltighet/existens så måste dessa givetvis kontrolleras...helt rätt..

Men kan du utveckla lite hur du tänker kring gränsvärdet och kontrollen.
Jag tolkar det som att du tänker dig att man lagrar de logiska utvärderingarna i en array där tappar jag dig lite.
Man kan ju inte ha körbar kod i en variabel. Då måste den väl tolkas först och man är lite tillbaka på ruta ett ?

För att utföra funktionen sedan är jag inne på samma linje som dig.
Eventuellt ha nuffran på rutinen som skall köras som retur på funktionen med nolla om det är falskt eller liknande.

Som nu kanske märker är det just gränsvärdet och utvärderingen som är min akilleshäl.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Tolka villkor

Inlägg av Icecap »

Ska försöka.

enum {Exe_A_Higher_B, Exe_A_Lower_B, Exe_A_Eq_B, Exe_Invalid}; // Villkor

När man ska kolla villkoret och värden:

Kod: Markera allt

int Check_Rule(int Limit_Type, int A, int B)
int result = false;
switch(Limit_Typr)
  {
  case Exe_A_Higher_B:
    if(A > B) Result = true;
    break;
  case Exe_A_Lower_B:
    if(A < B) Result = true;
    break;
osv.
  return Result;
  }
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Tolka villkor

Inlägg av sodjan »

Du får ju ha stöd i din kod för att göra de tester som är tänkbara.
Du får kolla "vilket villkor gäller här?" och sedan köra relevant del
som utvärderar just det villkoret. Ungefär.

> Jo det är en parameter som givetvis lagras i en variabel...

Namnen på parametrarna kan vara en enum så att namnen kan användas direkt
som index i arrayen. D.v.s. att VarA=0, VarB=1, VarC=2 o.s.v.
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Tolka villkor

Inlägg av mankan »

Vad ska hända när variabeln är lika med värdet? :-)

Varför mecka med extra enumar när man kan änvända int och funktionspekare?
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Tolka villkor

Inlägg av Icecap »

enum{} säkrar mot upprepade värden, något som lätt händer vid int.

Funktionspekare fungerar ok men ibland kan det vara lättare att överföra parameter.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Tolka villkor

Inlägg av ToPNoTCH »

@Icecap:
Nu är jag med på hur du menar...
Skall prova lite hur det blir...

Jag glömde en (viktig) detalj i beskrivningen dessutom :wall:

Istället för <variabel1> - <variabel8> skall man dessutom kunna välja om "någon variabel" uppfyller villkoret och om "alla" variabler uppfyller kravet.

Det borde inte ställa till det så mycket.
Det borde räcka med att knata igenom alla variabler och spara det högsta respektive det lägsta och skicka med dessa till funktionen för utvärdering.
Skriv svar