// lista på givare och parametrar
#define DN10 1400
#define DN15 3090
...
#define GIVARE DN10 // här väljer jag vilken givare jag vill ha
Nu fungerar det riktigt... GIVARE ersätts med DN10. Men DN10 i sin tur ersätts med 1400. Så resulatet blir att GIVARE kommer att bytas ut mot 1400:
A #define TIMER1_FLOW_LIMIT = ((7500*GIVARE)/FLOW_LIMIT)+0.5
blir i det aktuella fallet #define TIMER1_FLOW_LIMIT = ((7500*1400)/3.3)+0.5
Sen om man vill dela upp deti olika filer eller inte är ju personligt. Själv hade jag inte brytt mig om en separat fil för bara de siffrorna
Kan jag på något sätt skriva vanlig kod i includefilen (inte till preprocessorn alltså), för att testa att det angivna värdet för t.ex FLOW_LIMIT ligger inom godkänt intervall?
typ:
#ifdef DN15
#define GIVARE 3090
if(!(3.5<FLOW_LIMIT<50)) while(1); //Stuck if out of limits
#endif
Den köper inte det, får felmeddelandet: "../SENSOR_TYPES.H:17: error: expected identifier or '(' before 'if'"
Måste jag skriva en funktion i H-filen och anropa funktionen från koden i c-filen för att det ska fungera?
Tanken var alltså att jag ville kolla gränserna i kompileringen, men det går väl inte. JAg kan ju göra det i initieringen, då tar det ju inte upp processorn när den arbetar med "det den ska". Men det hade varit snyggare tycker ja. Vill få bort så mycket kod som möjligt som inte tillhör själva "arbetsuppgiften", dvs mäta pulser, beräkna och larma. Vill ha ett så lättläst och rent program som möjligt (och framför allt få in tänket, även om det är lite overkill just här). Jag gillade tanken med egen fil för anpassningen mot target. En grej till att slippa sålla när man hoppar tillbaka i koden om 3 år..
> Kan jag på något sätt skriva vanlig kod i includefilen
Jo visst, om du gör #include på filen någonstans där den aktuella
koden är giltig och rellevant. Det är ju ingen som helst skillnad
mot att skriva koden direkt i samma fil. Prova det så får du se...
Man kan väl bara ha exekverbar kod i en funktion (inkl funktionen main() ) ?
Och sedan ett direkt kodfel:
if(!(3.5<FLOW_LIMIT<50)) while(1); //Stuck if out of limits
Det går helt enkelt inte att ha 2 konditions i samma rad på detta sätt!
Skriv:
if((FLOW_LIMIT < 3.5) || (FLOW_LIMIT > 50)) while(1); //Stuck if out of limit
Men nåt jag inte förstår är varför inte detta fungerar (skrivs i slutet på min kod så berörda #defines och include är redan med):
unsigned int temp = TIMER1_FLOW_LIMIT;
Felkod:../Flödesgivare.c:148: error: expected expression before '=' token
Får samma fel om jag skriver:
if(temp > TIMER1_FLOW_LIMIT){}
Så fort jag försöker använda TIMER1_FLOW_LIMIT så kommer felet.
För att friska upp minnet så ster det följande i H-filen:
#define TIMER1_FLOW_LIMIT = (((7500*GIVARE)/FLOW_LIMIT)+0.5) //GIVARE och FLOW_LIMIT är definerade som heltal
När du använder
#define TIMER1_FLOW_LIMIT = (((7500*GIVARE)/FLOW_LIMIT)+0.5) //GIVARE och FLOW_LIMIT är definerade som heltal
kommer TIMER1_FLOW_LIMIT att ersättas med texten "= (((7500*GIVARE)/FLOW_LIMIT)+0.5) //GIVARE och FLOW_LIMIT är definerade som heltal" eller kanske "="
Ska det fungera rätt i alla lägen ska det se ut som följer:
#define TIMER1_FLOW_LIMIT (((7500*GIVARE)/FLOW_LIMIT)+0.5) /* GIVARE och FLOW_LIMIT är definerade som heltal */
StRob skrev:Kan jag på något sätt skriva vanlig kod i includefilen (inte till preprocessorn alltså), för att testa att det angivna värdet för t.ex FLOW_LIMIT ligger inom godkänt intervall?
typ:
#ifdef DN15
#define GIVARE 3090
if(!(3.5<FLOW_LIMIT<50)) while(1); //Stuck if out of limits
#endif
Du har rätt, det framgår inte riktigt av frågan.
Men jag skulle nog iofs hellre ha det så att kompilering fallerar än att
processorn stannar om man skulle ange ett felaktigt värde vid kompileringen.
Så jag läste lite mellan raderna där
Jo, det var menat att göras i kompileringen, alltså inte ta exekveringstid i processorn.
"Förutom att jämförelsen med 3.5 nog inte fungerar, det måste vara en integer har jag för mig" Det verkar märkligt om det nu sköts av kompilatorn, eller?
Nej, det gör det *INTE*.
Du måste skilja på preprocessorn, kompilatorn och vad som eventuella
inlänkade matte-bibliotek eventuellt kan göra vid runtime.
Men jag vet inte exakt vad preprocessorn ställer för krav på numeriska
konstanter och variabler. Dags att läsa dokumentationen kanske...
När den är klar börjar KOMPILATORN översätta.
Kompilatorn beräknar konstanter och sätter in i uttrycken.
Om någon sådan konstant hamnar utanför sitt område eller är av fel typ får man en varning eller error.
Men koden if (A < B) while (1); kommer givetvis inte kompilatorn att klaga på (såvida den finns på rätt plats i koden) - kompilatorn översätter det till maskinkod - sedan utför processorn instruktionen när programmet startat och kommit till den raden - och fastnar i while-loopen om A < B.