Buggfix Plus
Aktuellt datum och tid: 09.06 2019-08-19

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 10 inlägg ] 
Författare Meddelande
 Inläggsrubrik: Tolka villkor
InläggPostat: 12.06 2019-08-14 

Blev medlem: 17.59 2009-12-21
Inlägg: 3369
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).


Upp
 Profil  
 
 Inläggsrubrik: Re: Tolka villkor
InläggPostat: 12.24 2019-08-14 
EF Sponsor
Användarvisningsbild

Blev medlem: 15.29 2005-05-10
Inlägg: 37754
Ort: Söderköping
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..


Upp
 Profil  
 
 Inläggsrubrik: Re: Tolka villkor
InläggPostat: 12.33 2019-08-14 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23961
Ort: Aabenraa, Danmark
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
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.


Upp
 Profil  
 
 Inläggsrubrik: Re: Tolka villkor
InläggPostat: 12.58 2019-08-14 
EF Sponsor
Användarvisningsbild

Blev medlem: 15.29 2005-05-10
Inlägg: 37754
Ort: Söderköping
Ja, det stämmer med hur jag menade, fast med lite praktiskt kod också... :-)


Upp
 Profil  
 
 Inläggsrubrik: Re: Tolka villkor
InläggPostat: 13.18 2019-08-14 

Blev medlem: 17.59 2009-12-21
Inlägg: 3369
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
Citera:
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.


Upp
 Profil  
 
 Inläggsrubrik: Re: Tolka villkor
InläggPostat: 13.47 2019-08-14 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23961
Ort: Aabenraa, Danmark
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
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;
  }


Upp
 Profil  
 
 Inläggsrubrik: Re: Tolka villkor
InläggPostat: 13.54 2019-08-14 
EF Sponsor
Användarvisningsbild

Blev medlem: 15.29 2005-05-10
Inlägg: 37754
Ort: Söderköping
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.


Upp
 Profil  
 
 Inläggsrubrik: Re: Tolka villkor
InläggPostat: 16.43 2019-08-14 

Blev medlem: 10.23 2015-07-18
Inlägg: 417
Ort: Linköping
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?


Upp
 Profil  
 
 Inläggsrubrik: Re: Tolka villkor
InläggPostat: 18.01 2019-08-14 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23961
Ort: Aabenraa, Danmark
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.


Upp
 Profil  
 
 Inläggsrubrik: Re: Tolka villkor
InläggPostat: 19.23 2019-08-14 

Blev medlem: 17.59 2009-12-21
Inlägg: 3369
@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.


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

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 2 gäster


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