Definera givartyp i C och sätta mätområde m.a.p. dessa

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av jesse »

Hoppsan, mitt förra inlägg var nog skrivet fel tid på dygnet :wacko:
Det var givetvis fel (har ändrat i inlägget nu)

Det ska alltså vara...

Kod: Markera allt

// 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
StRob
Inlägg: 167
Blev medlem: 15 maj 2007, 09:30:47
Ort: Karlstad

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av StRob »

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?
StRob
Inlägg: 167
Blev medlem: 15 maj 2007, 09:30:47
Ort: Karlstad

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av StRob »

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..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av sodjan »

> 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() ) ?
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av Icecap »

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
StRob
Inlägg: 167
Blev medlem: 15 maj 2007, 09:30:47
Ort: Karlstad

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av StRob »

Ja, som jag trodde..

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
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av Icecap »

På det sätt du skriver det blir det alldeles fel!

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
Inlägg: 167
Blev medlem: 15 maj 2007, 09:30:47
Ort: Karlstad

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av StRob »

AAAH! Just det! Inget "=" i #define.. Helt riktigt. Tack! :)
Det är av misstagen man lär sig, alltså kommer jag bli grym! :lol:
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av stekern »

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
Såhär kan du göra

Kod: Markera allt

#if  (FLOW_LIMIT > 3.5 || FLOW_LIMIT < 50)
#error Flow limit out of limits
#endif
EDIT: Förutom att jämförelsen med 3.5 nog inte fungerar, det måste vara en integer har jag för mig
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av sodjan »

> Såhär kan du göra...

Ja, om kontrollen ska göras vid *compile* -time...
Det var inte så jag tolkade frågan, men det kanske
var så det var menat... :-)
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av stekern »

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 ;)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av sodjan »

Ja, och *om* man vill ha kontrollen vid preprocesseringen, så
är det ju ganska naturligt att man inte kan använda kod som
måste kompileras först... :-)
StRob
Inlägg: 167
Blev medlem: 15 maj 2007, 09:30:47
Ort: Karlstad

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av StRob »

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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av sodjan »

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...
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Definera givartyp i C och sätta mätområde m.a.p. dessa

Inlägg av jesse »

PREPROCESSORN bearbetar alla #-instruktioner

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.
Skriv svar