Sida 5 av 6
Re: temp-station bygge
Postat: 11 maj 2010, 20:38:13
av Swech
Chicken...
Kul att det går framåt iallafall
Swech
Re: temp-station bygge
Postat: 11 maj 2010, 21:04:07
av diman
har någon råkat ut för detta i MPLAB att för att skriva tal med decimal typ 1.4
ska man INTE använda punkt utan komma, men så fort det blir 0,0.... så funkar det inte längre..
och punkt går inte heller att använda som decimalavgränsare... då får man knepiga resultat
jo: detta
testkör med T1 = 450 och T2 = 602 i vilket fall divisionen ska ge 0,747 (rundad till tre efter komman)
Detta kompileras, men producerar fel resultat...
Kod: Markera allt
if((T1 / T2) > 0.7 && (T1 / T2) < 0.75)
printdigit(3,10,5);
och detta kompileras och ger korrekt exekvering av printdigit.
Kod: Markera allt
if((T1 / T2) > 0,7 && (T1 / T2) < 0,75)
printdigit(3,10,5);
dock komplierar inte detta pga 0,0047 där MPLAB säger "division by zero"
Re: temp-station bygge
Postat: 11 maj 2010, 21:04:58
av diman
haha Chicken

lite grann
för att illustrera vad jag menar med föregående inlägg:
Är det någon inställning, eller något så simpelt att jag inte ser det ?...
Re: temp-station bygge
Postat: 12 maj 2010, 09:29:18
av snigelen
Nej decimaltal skrivs inte med decimalkomma i c. Om T1 och T2 är av heltalstyp så blir detta (tror jag)
samma som
vilket naturligtvis är falskt. Om du provar typ
Kod: Markera allt
if (((float)T1/(float)T2) > 0.7 && ((float)T1/(float)T2) < 0.75)
i stället så blir det nog annorlunda. Använder man komma så blir t.ex.
samma som
så jag tror inte att din kommavariant fungerar helt och hållet som du tänkt dig.
EDIT: flyttat lite (float)
Re: temp-station bygge
Postat: 12 maj 2010, 09:48:03
av mri
snigelen: C kapar inte bort allt efter kommatecken. Kommatecken är sekvensoperator. Dvs, i ett uttryck kan man skriva flera saker, som utförs sekventiellt. Jämför t.ex. for loopen var det är vanligt att använda sekvensoperatorn:
Kod: Markera allt
int i, j;
for (i=0, j=5; i < 10; i++, j+=2)
{
...
}
Så att använda sekvensoperatorn inne i en if() sats är nog en dålig ide. Det går dock, om man vet vad man håller på med.
Re: temp-station bygge
Postat: 12 maj 2010, 09:59:38
av snigelen
Jag menade inte att det kapas utan att det logiskt blir samma resultat. Dvs if(T1/T2 > 0,7) jämför inte T1/T2 med decimaltalet 0.7 utan snarare (till sist) med sista resultatet i kommasekvensen.
Edit: Fel, fel fel. Se nedan. mri vet hur det funkar.
Re: temp-station bygge
Postat: 12 maj 2010, 11:04:39
av mri
Du har inte förstått hur sekvensoperatorn fungerar.
Det som händer är att (T1/T2 > 0) utförs men resultatet används inte av if satsen, därefter utförs (7). Det är sista uttrycket i sekvensen som kommer att ange hur if skall "hoppa". Alltså if satsen kunde iställer skrivas som:
Vilket alltid är sant.
Re: temp-station bygge
Postat: 12 maj 2010, 12:45:13
av diman
you lost me... vad har det att göra med kompileringsproblemet ?
om jag spränger uttrycket i bitar:
(T1 och T2 är heltal, och T1 är alltid mindre än T2)
if((T1 / T2) > 0,7 && (T1 / T2) < 0,75)
gör något;
betyder att (T1/T2) blir till ett float resultat som sedan kollas om den är större än 0,7 AND mindre än 0,75.
I detta fallet initierar jag T1 och T2 till 450, resp. 602 för debuggingändamål. Resultatet är 0,747 vilket skulle rendera uttrycket till Sant
Och det fungerar också, för
if((T1 / T2) > 0,7 && (T1 / T2) < 0,75)
printdigit(5,5,5);
ger exekvering av printdigit och en femma ploppar upp i displayen.
Däremot gör det inte om jag skriver
if((T1 / T2) > 0.7 && (T1 / T2) < 0.75)
med punkt.
Om man säger att komma INTE är decimal avgränsare, då borde det ovannämnda inte fungera, eller ?
Prova själva, det tar trettio sekunder att skriva koden i MPLAB...
Hur som helst, min fråga gäller fortfarande MPLAB och/eller C kompilatorns oförmåga att acceptera 0,0047.
Re: temp-station bygge
Postat: 12 maj 2010, 13:28:13
av mri
you lost me... vad har det att göra med kompileringsproblemet ?
Sorry, men jag orkar inte läsa igenom hela den här tråden, jag bara läste slutet och konstaterade att flera här inte förstår att decimaltal måste skrivas med decimalpunkt (.) samt att decimalkomma (,) är sekvensoperator.
om jag spränger uttrycket i bitar:
(T1 och T2 är heltal, och T1 är alltid mindre än T2)
if((T1 / T2) > 0,7 && (T1 / T2) < 0,75)
gör något;
betyder att (T1/T2) blir till ett float resultat som sedan kollas om den är större än 0,7 AND mindre än 0,75.
I detta fallet initierar jag T1 och T2 till 450, resp. 602 för debuggingändamål. Resultatet är 0,747 vilket skulle rendera uttrycket till Sant
Nej, nej, nej!
Du får inte använda komma (,)!!!
Din if-sats blir till:
Och det fungerar också, för
if((T1 / T2) > 0,7 && (T1 / T2) < 0,75)
printdigit(5,5,5);
ger exekvering av printdigit och en femma ploppar upp i displayen.
Däremot gör det inte om jag skriver
if((T1 / T2) > 0.7 && (T1 / T2) < 0.75)
med punkt.
Om man säger att komma INTE är decimal avgränsare, då borde det ovannämnda inte fungera, eller ?
Prova själva, det tar trettio sekunder att skriva koden i MPLAB...
Hur som helst, min fråga gäller fortfarande MPLAB och/eller C kompilatorns oförmåga att acceptera 0,0047
Igen, komma är sekvensoperator.
0,0047 betyder alltså att uttrycket 0 evalueras, och sedan 0047 vilket är ett oktalt heltal.
Sätt dit decimalpunkt och börje debugga steg för steg vad uträkningarna ger för resultat.
Re: temp-station bygge
Postat: 12 maj 2010, 14:35:53
av mri
diman: OK, enligt ditt screenshot får du divide by zero. Var det ditt problem? I så fall:
temp = ((T1 / T2) - 0,320) / 0,00470;
Felet är alltså att du använt sekvensoperator iställer för decimalpunkt. Följande händer:
(T1 / T2) - 0 räknas ut, resultatet kastas bort.
Sedan beräknas 320 / 0 vilket ger division med noll.
Edit: korrigerade "kommapunkt" till "decimalpunkt"
Re: temp-station bygge
Postat: 12 maj 2010, 15:24:20
av snigelen
> Du har inte förstått hur sekvensoperatorn fungerar.
Det har du rätt i mri

. Men jag vet att man inte kan använda den som decimalkomma. Själv använder jag det ju aldrig i logiska uttryck, utan bara i typ for-satser som du gav exempel på. Jag gjorde lite tester med komma-operator i logiska uttryck, men drog lite förhastade slutsatser. Din beskrivning är ju rätt.
Re: temp-station bygge
Postat: 12 maj 2010, 17:53:51
av diman
okej, jag kör på som du säger, mri
det verkar som att något strular fundamentalt i Hi-Tech C....
Detta simpla debuggingkod producerar inte vad det ska även med punkt som decimalavgränsare.
jag tog bort divisionen från if satsen och bara för säkerhets skull omslöt jämförelseuttryck med parenteser
fungerar fortfarande ej.. jag är programmerare sedan 10 år tillbaka i halvdussin olika språk, men jag fattar inte
varför detta inte fungerar...
Kod: Markera allt
unsigned short long T1 = 0;
unsigned short long T2 = 0;
T1 = 450;
T2 = 602;
float T3 = 0;
T3 = T1 / T2; // detta borde producera 0.747 vilket ÄR större än 0.7 och mindre än 0.75
if( (T3 > 0.7) && (T3 < 0.75) )
printdigit(3,10,5); //DETTA HÄNDER ALDRIG
__delay_us(1);
manualen för Hi-Tech C säger inget om eventuella avvikelser vad gäller logiska operatorer && (AND) och || (OR)

jag ska ta en liten paus och tänka lite ....
Re: temp-station bygge
Postat: 12 maj 2010, 18:21:05
av EBD
Du måste nog typecasta T1 eller T2 eller båda till en float för att du ska få ett flyttal av divisionen.
Ex:
T3 = (float)T1 / (float)T2;
Re: temp-station bygge
Postat: 12 maj 2010, 18:28:01
av sodjan
Kod: Markera allt
T3 = T1 / T2; // detta borde producera 0.747...
Vadå "borde"!? *VET* du inte vad divisionen ger för resultat ?
Om du inte *VET* det, så är ju komplett meningslöst att försöka
felsöka resten av koden, det spelar ju liksom ingen roll längre...
Och om du gör så här istället, vad händer då ?
Kod: Markera allt
float T3 = 0;
T3 = 0.747
if( (T3 > 0.7) && (T3 < 0.75) )
printdigit(3,10,5);
Om ovanstående fungerar, så är det bara att gå vidare och
kolla varför/om divisionen inte ger det du "trodde".
> jag är programmerare sedan 10 år tillbaka ...
Det ser inte ut så. För mig verkar det väldigt märkligt att du inte har
gjort just som ovan redan. Det är ju felsökning enligt standardforulär 1A...
Re: temp-station bygge
Postat: 12 maj 2010, 19:59:44
av mri
jag är programmerare sedan 10 år tillbaka i halvdussin olika språk
Tror jag inte en sekund på, åtminstone skulle jag inte anställa dig. Detta är riktigt grundläggande kunskaper i C.
Kod: Markera allt
unsigned short long T1 = 0;
unsigned short long T2 = 0;
Vilken datatyp skall vill du ha egentligen? unsigned short eller unsigned long? Du kan inte välja båda!
Kod: Markera allt
T1 = 450;
T2 = 602;
float T3 = 0;
T3 = T1 / T2; // detta borde producera 0.747 vilket ÄR större än 0.7 och mindre än 0.75
Inte alls! Som EBD skriver måste en av eller båda av T1 & T2 vara ett flyttal eller "type castas" till ett flyttal för att kompilatorn skall sätta in en flyttalsdivision. I ditt fall utförs en heltalsdivision och T3 får värdet 0.