Svenska ElektronikForumet
http://elektronikforumet.com/forum/

Använda två IF i en rad?
http://elektronikforumet.com/forum/viewtopic.php?f=43&t=91298

Författare:  fosfor [ 15.08 2018-05-16 ]
Inläggsrubrik:  Använda två IF i en rad?

Hej!

Om jag vill att två IF's ska vara sanna för att gå vidare.
Hur ser en sådan rad ut?
Räcker det med ett + tecken

Typ
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  {
  if ( blabla1 + bleble2 )
    {


Jag vill att en integer ska vara true och att en positionering ska vara inom ett visst värde, för att den sen ska gå vidare till handling.

Författare:  Icecap [ 15.10 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

if(Villkor1 && Villkor2)

&& betyder "logisk AND" medan & betyder "bitmässigt AND".

I ovanstående betyder det att om BÅDA Villkor1 OCH Villkor2 är sanna utförs det som står efter in-satsen.

Författare:  fosfor [ 15.13 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

Ah ok perfekt, tack

Författare:  fosfor [ 15.16 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

Icecap:
Vad skulle du säga är mest praktiska sättet att göra en "virtuell switch på"?

Jag vill bara ha något som antingen är "true" eller "false" (men som kan byta emellan true eller false, så den ska inte vara fast).
Det är inte integer va?

Den ska ändras beroende på vad jag gjort och tryckt på för knappar. Så att den kan veta vad att göra och inte göra.

Författare:  adent [ 15.22 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

+ är fel tecken. En if-sats tolkar allt som är skiljt från 0 som sant.

if(0) -> falskt
if(1) -> sant
if(2) -> sant
if(45 +33) -> sant
if(45 - 45) -> falskt.

Men strunt i det ovan. Så här gör man:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
if(a > 3 && b < 4)
-> sant om a är större än 3 OCH b är mindre än 4.

Jag föredrar att skriva raden ovan såhär för att undvika missar p.g.a. operatorprioritet:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
if((a > 3) && (b < 4))
-> sant om a är större än 3 OCH b är mindre än 4.

Du kan också skriva såhär:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
if(a > 3)
{
  if(b <4)
  {
     // Här hamnar vi bara om a är större än 3 OCH b är mindre än 4.
  }
}


Om det räcker att ett av villkoren är sant så kör med || istället för &&.

|| ska i detta fall utläsas som "eller" och && som "och".

Det jag sa om att 0 är falskt och 1 är sant i en ifsats kan man faktiskt se enkelt med t.ex. följande kod:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
int a = 3;

printf("a större än 3: %d\n", (a>3) );
printf("a mindre än 3: %d\n", (a<3) );


Koden ovan kommer skriva ut 0 och 0 på varsin rad för att uttrycket (a>3) returnerar 0 -> falskt.
uttrycket (a<3) kommer också returnera 0 -> falskt. Prova att ändra den första tre:an och se det bli 1 ibland :)

Sedan kan du testa nedanstående kod också :)

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
printf("0 && 0: %d\n", (0 && 0) );
printf("0 && 1: %d\n", (0 && 1) );
printf("1 && 0: %d\n", (1 && 0) );
printf("1 && 1: %d\n", (1 && 1) );


Författare:  fosfor [ 15.30 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

adent:
Ok strålande, det klargjorde ett och annat!

Men om jag vill ha en "virtuell" knapp/switch också till detta?
Jag kan ju skriva t.ex. int intest1Pin = 4;
och den läser då av knappen jag har inkopplad dit som antingen true eller false.

MEN om jag bara vill ha en liten "del" i koden som antingen är true eller false, som kan ändras av koden i loopen,
hur gör jag det smidigast? Typ att om jag gör vissa saker så ställts den om till true, och om jag göra lite andra saker så ställs den om till false.
Och att den håller kvar vid vad den är tills att något ändrar på den. Hur gör jag det smidigast?

Detta är till för att hindra vissa delar av koden göra vissa saker beroende på vad jag gjort innan.

Författare:  sodjan [ 16.16 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

C har inga "bool" variabler (alltså variabler som enbart har två
giltiga värden "true" och "false"). Många andra språk har det.
Man använder helt enkelt den minsta tillgängliga integern, normalt
en 8-bitars byte genom en "char" och sedan låter man den få värdet
0 eller 1. Normalt finns det fördefinierade symboler med namn som
True, TRUE, False, FALSE eller liknande som har rätt värde. Alltså
istället för att hårdkoda 1 eller 0 i koden...

Författare:  mankan [ 16.57 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

I C99 finns bool.

Författare:  sodjan [ 17.46 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

Ah, där ser man... För modernt för mig... :-)

Författare:  hawkan [ 20.11 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

Men fosfor, många av dina frågor har inte med mikroprocessorer att göra speciellt. Utan helt enkelt med språket C att göra.
Det är inte så att du tror du skulle vinna på att ta dej igenom några kapitel i nån kurs om det är på youtube, bok, eller vad som helst?

Misstolka inte för vi tycker det är jättekul att hjälpa dej. Men med lite mer kunskap i C kan det gå fortare fram för dej.
Vi ser ju att du har ett intresse och har intressanta problem.

Författare:  TomasL [ 22.46 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

Hmm, jag skulle nog gjort en enum för tangentkombinationerna, och sedan använt en switch-sats.
Blir faktiskt väldigt mycket tydligare än en härrans massa if-satser
Om man i enumen tilldelar värden, så kan man ändra standard-värdena
till exempel typedef enum { none = 0xFF, upp = 0x01, ned 0x02, left = 0x10, right = 0x20} keyb_enum;


Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
typedef enum { none, upp, ned, left, right} keyb_enum;
/*
none = 0
upp = 1
ned = 2
left = 3
right = 4
*/

keyb_enum keyboard_e = none;


switch (keyboard_e)
{
    case none
          break;

    case upp:
          …………;
         ………….;
          break;

   case ned:
          …………;
         ………….;
          break;

   case right:
          …………;
         ………….;
          break;

   case left:
          …………;
         ………….;
          break;

    default:
          // vi har ett jättefel
}
 

Författare:  lillahuset [ 23.11 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

Ett tips är att skriva program helt på engelska, man vet aldrig om det kommer att underhällas av en skandinav i framtiden.
Jag har underhållit program på blandad tyska och engelska, tröttsamt men någorlunda OK.
Jag har underhållit program på blandad rumänska och engelska, tack Manni DeGeer för att du lärde mig tillräckligt med franska för att hjälpligt kunna tolka rumänskan. Annars hade jag gett upp.
Jag har underhållit program på blandad ungerska och engelska, jävligt jobbigt. Någonstans ligger det ett ungerskt-engelskt-ungerst lexikon. Fy f-n för programmerare som absolut ska använda sitt modersmål i program.

Författare:  TomasL [ 23.15 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

Jag vet, tyvärr blir det svengelska ibland.
Å andra sidan, så eftersom vi är svenskar och bor i Sverige så tycker jag att det svenska språket skall användas.
Vi får väl se till att enbart anställa svensktalande utvecklare i framtiden, dock åäö är lite svåra i ren kod, konstigheter kan hända.
Vi får ta fram en svensk version av GCC

Författare:  lillahuset [ 23.27 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

Kod har en tendens att migrera. Och drabba oskyldiga utvecklare. :(

Författare:  TomasL [ 23.34 2018-05-16 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

Jo jag vet, ytterligare en anledning att lära sig nya språk.

Författare:  SeniorLemuren [ 09.32 2018-05-17 ]
Inläggsrubrik:  Re: Använda två IF i en rad?

fosfor skrev:
Hej!

Om jag vill att två IF's ska vara sanna för att gå vidare.
Hur ser en sådan rad ut?
Räcker det med ett + tecken

Typ
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  {
  if ( blabla1 + bleble2 )
    {


Jag vill att en integer ska vara true och att en positionering ska vara inom ett visst värde, för att den sen ska gå vidare till handling.

Konstigt att du frågar. Du har ju redan tidigare använt flera if här:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
if ( UserStopPulseCount != 0 && PulseCount >= UserStopPulseCount - 15 && PulseCount <= UserStopPulseCount + 15 )

Alla tidsangivelser är UTC + 1 timme
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/