Vad betyder [] tecknet i programmet, arduino.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Vad betyder [] tecknet i programmet, arduino.

Inlägg av orvar-e »

Försöker förstå mig på en arduino-kod som följde med en radiomottagare. Jag kan inte få den där sändaren/mottagaren att fungera som jag önskar. Den fungerar säkert som den ska, men inte som jag vill. Koden först, vad betyder abc[3]

Kod: Markera allt

unsigned long Temporary[3]
Det finns senare i koden Temporary [0] - [3] och [k], vilket blir 5 olika Temporary[*].

Hela koden .....

Kod: Markera allt

//Author: cantone-electonics
//More information welcome to : http://www.canton-electronics.com 
//Arduino 1.0
//Arduino uno R3
//Making a wireless remote control with arduino

//const int data_out = 2;//encoder DOUT

 //LED pin,When receiving the key from the serial port, LED flash
const int ledPin =  13;    //LED pin


const int data_out =  7;    //encoder DOUT



// OSC Resistance is 3.3M
const int Osc_4xCycle = 359; //4 oscillating time periods 
const int Osc_12xCycle = 1078;//12 oscillating time periods

unsigned long Temporary[3];//Temporary storage unit


//output bit "0"
void bit_0() {
  
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods Low level
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods Low level
  
}

//output bit "1"
void bit_1() {
  
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods Low level
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods Low level
  
}

//output bit "f"
void bit_f() {
  
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods Low level
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_12xCycle);//12 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods Low level
  
}

//output synchronous bit
void bit_syn() {
  
  digitalWrite(data_out, HIGH);
  delayMicroseconds(Osc_4xCycle);//4 oscillating time periods High level
  digitalWrite(data_out, LOW);
  delayMicroseconds(Osc_4xCycle*31);//124 oscillating time periods Low level

}

//send:8 Address Bits, 4 Data Bits, Sync bit
void send_data(){
  unsigned char temp,tab,i;
  unsigned char j,k;
  for(j=0;j<4;j++)
  {
    for(k=0;k<3;k++)//send 8 Address Bits, 4 Data Bits
    {
      tab = Temporary[k];
    
      for(i=0;i<4;i++)
      {
        temp = tab;
        temp &= 0xC0;
      
        if(temp == 0xC0)//11 is bit "1"
        {
          bit_1();
        }
        else if(temp == 0x00)//00 is bit "0"
        {
          bit_0();
        }
        else //01 is bit "f"
        {
          bit_f();
         }
      
        tab =  tab << 2;
    }
  }
  
   bit_syn();//send Sync bit
  
  }
}
  

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);  
   // initialize the encoder DOUT pin as an output
  pinMode(data_out, OUTPUT); 
  

  

  
  
  Serial.begin(9600);

}

void loop()
{
  int keydata = 0;
  int receive_flag = 0;
  
  Temporary[0] = 0xC5;//address A7-A4
  Temporary[1] = 0x55;//address A3-A0
  digitalWrite(ledPin, LOW);//Turn off led

  
  while(1)
  {
    //get key from pc serial port
    while (Serial.available() > 0)  
    {
        keydata = Serial.read();
        receive_flag = 1;
        delay(2);
    }
    
    if(receive_flag == 1)//if get key,send key
    {
      
    receive_flag = 0;
    
    if((keydata == 'a') || (keydata == 'A'))//trigger A channel relay.
    {
      Temporary[2] = 0xC0;// 0xC0 is A button key
      digitalWrite(ledPin, HIGH);//Turn on led
      send_data();//send code word
       Serial.println(".....trigger A channel relay.....");
    }
    else if((keydata == 'b') || (keydata == 'B'))//trigger B channel relay.
    {
      Temporary[2] = 0x30;// 0x30 is B button key
      digitalWrite(ledPin, HIGH);//Turn on led
      send_data();//send code word
      Serial.println(".....trigger B channel relay.....");
    }
     else if((keydata == 'c') || (keydata == 'C'))//trigger C channel relay.
     {
      Temporary[2] = 0x0C;// 0x0C is C button key
      digitalWrite(ledPin, HIGH);//Turn on led
      send_data();//send code word
      Serial.println(".....trigger C channel relay.....");
      
     }
     else if((keydata == 'd') || (keydata == 'D'))//trigger D channel relay.
     {
      Temporary[2] = 0x03;// 0x03 is D button key
      digitalWrite(ledPin, HIGH);//Turn on led
      send_data();//send code word
      Serial.println(".....trigger D channel relay.....");
     }
     
    keydata = 0;
    
    //When receiving the key from the serial port, LED flash
    digitalWrite(ledPin, LOW);//Turn off led
    delay(50);//delay 100ms
    digitalWrite(ledPin, HIGH);//Turn on led
    delay(50);//delay 100ms
    digitalWrite(ledPin, LOW);//Turn off led
    delay(50);//delay 100ms
    digitalWrite(ledPin, HIGH);//Turn on led
    delay(50);//delay 100ms
    digitalWrite(ledPin, LOW);//Turn off led
    
    }
   
  }
}
Användarvisningsbild
AndLi
Inlägg: 18274
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av AndLi »

>Det finns senare i koden Temporary [0] - [3] och [k], vilket blir 5 olika Temporary[*].

Det blir en array, värdet inom[] anger indexet.

Så du kan se det som tre variabler som heter Temporary_0,Temporary_1,Temporary_2.

I fallet med Temporary[k] anger k vilken av de tre variablerna man ska använda just nu.
k ska aldrig i detta exempel ha ett annat värde än 0,1 eller 2 när det används tillsammans med Temporary.

Så om k = 2, ändrar man med "Temporary[k] = 42" sätter man Temporary_2 till 42.
sätter man sen k= 1 och kör samma kodrad kommer Temporary_1 att sättas till 42.....

Något förvirrat kan det ju vara att man skriver unsigned long Temporary[3] men får index 0,1 och 2...
3 anger i det fallet antalet man vill ha!

Hoppas det blev lite klarare
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av Icecap »

Om Temporary[3] används i koden är den underdimensionerat! Detta ger mycket ofta problem vid att det i grunden bara är en pekare på Temporary och där är det reserverat 3 platser, #0, #1 och #2.

Se det som att du beställer 3 säten i biografen. Då får du t.ex. start på säte 3 och därmed 4 och 5 också. Men du har bara dessa säten, tar du ytterligare ett säte är det någon annans och det blir konflikt.

I C kollas indexen inte om man inte specifikt för en funktion för detta, alltså kan man reservera plats för 1 byte men läsa och skriva till "alla" ändå.

Jag använder det rimligt ofta, om jag t.ex. till spara inställningar i EEPROM. Jag definierar en typedef T_CONFIG med alla de inställningar som behövs. Sedan kan jag deklarera en union med T_CONFIG i samt en unsigned char[1] "bredvid".

Då kan jag komma åt T_CONFIG värde för värde men jag kan även komma åt varje byte utan att fibbla med att cast'a.

Därmed kan min "skriva/läsa ett block bytes till/från EEPROM" fungera enkelt och smidigt.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av orvar-e »

Liknelsen med biostolar var bra, det fattar jag. Men det är fortfarande inte helt klart för mig än så jag kommer med några fler funderingar.
Om men skriver som i koden unsigned long Temporary[3];, innebär det automatiskt att man menar från 0-2?

Det är den här kodbiten som styr i vilken ordning det ska sändas (om jag förstår det rätt).
Men hur fungerar den?

for(j=0;j<4;j++) .... hur långt sträcker sig den? Allt inom "curly brackets" nedanför? Den gör det 4 gånger?
Nä, kan nån som begriper förklara för nån som inte begriper.

Kod: Markera allt

void send_data(){
  unsigned char temp,tab,i;
  unsigned char j,k;
  for(j=0;j<4;j++)
  {
    for(k=0;k<3;k++)//send 8 Address Bits, 4 Data Bits
    {
      tab = Temporary[k];
    
      for(i=0;i<4;i++)
      {
        temp = tab;
        temp &= 0xC0;
      
        if(temp == 0xC0)//11 is bit "1"
        {
          bit_1();
        }
        else if(temp == 0x00)//00 is bit "0"
        {
          bit_0();
        }
        else //01 is bit "f"
        {
          bit_f();
         }
      
        tab =  tab << 2;
    }
  }
  
   bit_syn();//send Sync bit
  
  }
}
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7466
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av Marta »

Det verkar som Du inte alls är van vid C. Här är en länk som skingrar dimmorna: https://en.wikibooks.org/wiki/A_Little_C_Primer
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av orvar-e »

Ja, det är väl det enda rätta.......
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av Icecap »

if(), for(;;) osv kör 1 kommando!

Men det är så smart att tar du ett antal kommandon och klämmer in dom mellan { och } räknas de som 1 kommando.

if(<nånting som blir sant> utförs_denna_instruktion;
else Utförs_denna_instruktion; // Man kan ha med 'else' men man måste inte.

if(<nånting som blir sant> {
Utförs_denna_instruktion;
Och_denna_instruktion;
Och_Många_Fler_instruktioner;
} // Fram till hit
Nerre
Inlägg: 27223
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av Nerre »

orvar-e skrev:Liknelsen med biostolar var bra, det fattar jag. Men det är fortfarande inte helt klart för mig än så jag kommer med några fler funderingar.
Om men skriver som i koden unsigned long Temporary[3];, innebär det automatiskt att man menar från 0-2?
Ja. I C börjar index alltid på noll. Det har att göra med att det används som addering.

Om variabeln börjar på adress 0x123 så ligger element 0 på adress 0x123 + 0 gånger <elementstorleken>, element 1 ligger på adress 0x123 + 1 gånger <elementstorleken> och element 2 ligger då alltså på adress 0x123 + 2 gånger <elementstorleken>
Allt inom "curly brackets" nedanför?
De används för att gruppera flera instruktioner så de ser som ett "underblock". Det vanligaste är för loopar, if-satser och liknande, men det kan även användas för att ge ett "tillfälligt scope" för en variabel (en variabel som deklareras innanför måsvingarna existerar inte utanför dem, ett smidigt sätt att göra temporära variabler).
Den gör det 4 gånger?
Ja, det ser så ut. Men formellt sett är det så här:
Den gör det så länge k är mindre än 3. För varje varv räknar den upp k med 1. Och k nollställs före första varvet.

Det blir 4 gånger så länge k inte manipuleras inuti loopen. Men det är fullt möjligt att kod inuti loopen kan ändra på k så det blir fler eller färre än 4 gånger. (I det här fallet verkar det inte ske, men det är fullt möjligt.)

I pseudokod blir det nåt i stil med:

Nollställ k
:start
Om k är mindre än tre, utför instruktionen (inom måsvingarna), räkna upp k och börja om från :start
Användarvisningsbild
Glenn
Inlägg: 36713
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av Glenn »

Det kan tilläggas att arrays funkar ungefär likadant i BASIC också, typ PBP, så jag vet inte om det är direkt C-specifikt.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46963
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av TomasL »

Det är väl så inom i stort sett alla språk där man kan använda Arrays.
En kanske bättre analogi är:

Kod: Markera allt

int LådaA[10];
Det betyder att i din skrivbordslåda, vilken du satt etiketten LådaA på, så har du 10 st fack i lådan, numrerade från 0-9.
Så vad du helt enkelt gör med kodstycket

Kod: Markera allt

 LådaA[5]
att är att tala om för programmet att de data som skall användas ligger i LådaA fack 5
Senast redigerad av TomasL 30 oktober 2015, 10:07:41, redigerad totalt 1 gång.
Nerre
Inlägg: 27223
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av Nerre »

Om jag inte minns helt fel så börjar Pascal med index 1, sen finns det väl vissa språk där man t.o.m. kan välja vilket intervall index ska ligga inom (typ array[7..16]).
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av sodjan »

I de flesta andra språk som inte har C's låga nivå så har första platsen i en array index 1.
Det är väl bara det som är lite förvirrande i början... :-)

> Om men skriver som i koden unsigned long Temporary[3];, innebär det automatiskt att man menar från 0-2?

När man skriver "unsigned long Temporary[3]" så anger man bara hur *stor* arrayen
ska vara (3 positioner i detta fall), inte vilket som är max index. En array med 3 "platser"
anges sedan med index ("adress") 0, 1 och 2.

Och som sagt, andra språk använder index 1, 2, och 3 (eller valfritt index), vilket ju kanske
kan uppfattas som lite mer logiskt. :-)
nifelheim
Den första
Inlägg: 2489
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av nifelheim »

När det gäller "fiskmåsparenteserna" och vad som hör till samma "block",
så kolla på indendteringen.

I verktygs menyn finns "Autoformat" som fixar det automagiskt.
(men det är snyggare att göra själv :-) )



edit : stavning
Senast redigerad av nifelheim 30 oktober 2015, 12:53:06, redigerad totalt 2 gånger.
Nerre
Inlägg: 27223
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av Nerre »

Indenteringen är ju bara för att det ska bli enklare att läsa, kompilatorn skiter ju högaktningsfullt i indentering.

Det finns ju dessutom flera olika skolor när det gäller hur man hanterar måsvingar och indentering.
https://en.wikipedia.org/wiki/Indent_style
nifelheim
Den första
Inlägg: 2489
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: Vad betyder [] tecknet i programmet, arduino.

Inlägg av nifelheim »

exakt ,
TS frågade hur långt loopen går,
ett enkelt och tydligt sätt för en människa att se det
är att göra "autoformat" och titta på indendteringen.

Alltså bara en sak för att TS inte ska behöva fundera på vad som ligger i vilket block,
kompilatorn tvekar inte, det gjorde TS :-)


Om det jag skrev kunde uppfattas som om det påverkade kompileringen,
var jag otydlig . :-)
Skriv svar