Fråga:
Vad är det bästa sättet att definiera en I / O-stift?
Joris Groosman
2015-04-27 11:11:54 UTC
view on stackexchange narkive permalink

Jag läser definitioner som

  const int ledPin = 9;  

och även

  #define ledPin 9 

Jag vet att en definition som

  int ledPin = 9;  

är en dålig metod om du ' kommer inte att ändra det (vilket du vanligtvis inte kommer att göra), men jag har sett det flera gånger i Arduino-program. Vilken av de andra två är att föredra?

Fyra svar:
user8688
2015-04-27 12:06:32 UTC
view on stackexchange narkive permalink

#define ledPin 9 är att föredra. Genom att göra int ledPin = 9; tilldelar du ett int -minne vars värde används varje gång du använder ledPin . #define är annorlunda i den meningen att det inte tilldelar minne. det finns inget minne som heter ledPin . Innan du sammanställer alla "ledPin" i koden (andra än strängar) ersätts med 9 . Så i princip

digitalWrite(ledPin);

blir

  digitalWrite (9);  

Fördelar med #define : Sparar minne och eftersom alla ledPin ersätts med 9 före körning , det sparar processorns tid.

Spelar ingen roll i små koder ...

Är inbyggda kompilatorer verkligen så dåliga att de inte gör konstant vikning när du använder "const int"?
@chuu så vitt jag vet använder Arduino gcc för avr. Så det borde nästan definitivt optimeras. Svaren här visar inte mycket förståelse för god praxis i C ++
i C ++ föredras `const int ledPin = 9;` framför två andra alternativ. Detta tilldelar INTE minne för ett 'int' förutom om du definierar en pekare till den någonstans, vilket ingen skulle göra.
Const int tilldelar minne @jfpoilpret. #define tar inte upp något minne, det är bara ett symboliskt namn på ett uttryck och inte namnet på ett minne ...
Kolla in den här länken http://www.cplusplus.com/forum/beginner/28089/ och se själv. Annars är det bara att utföra kontrollen med Arduino IDE: kontrollera datastorleken med const och med #define.
#define är inte ens en datatyp för att ta plats. Länken säger inget om minnet. Hur som helst påpekar det fördelen med const när det gäller omfattning ...
Peter Bloomfield
2015-04-27 14:19:19 UTC
view on stackexchange narkive permalink

Strikt taget kommer metoden #define att använda lite mindre minne. Skillnaden är dock vanligtvis liten. Om du behöver minska minnesanvändningen skulle andra optimeringar förmodligen vara mycket mer effektiva.

Ett argument för att använda const int är typsäkerhet . Var du än hänvisar till det PIN-numret efter variabel, vet du exakt vilken datatyp du får. Det kan marknadsföras / konverteras implicit eller uttryckligen av koden som använder den, men den ska bete sig på mycket tydliga sätt.

Däremot är värdet i en #define öppet till tolkning. De allra flesta gånger kommer det förmodligen inte att ge dig några problem alls. Du behöver bara vara lite försiktig om du har kod som gör antaganden om värdets typ eller storlek.

Personligen föredrar jag nästan alltid typsäkerhet om jag inte har ett mycket stort behov av att spara minne.

Jag var i #define camp tills jag läste Peters svar. Antar att jag vet vem som kommer att omarbeta koden i helgen. ;)
rykien
2015-04-27 22:28:15 UTC
view on stackexchange narkive permalink

Det bästa sättet skulle förmodligen vara
const uint8_t LED_PIN = 9; // kan kräva att #include <stdint.h>
eller
const byte LED_PIN = 9; // utan att inkludera nödvändigt
const unsigned char LED_PIN = 9; // liknande
Namnet är i versaler enligt allmän praxis i C ++ (och andra) för att namnge konstanter. Detta bör inte använda något RAM i sig och använda ungefär 1 byte programminne per användning.
Det kan dock finnas problem när siffran är högre än 127 och är teckenförlängd medan du får främjas till större signerade heltal (inte helt säker på detta), även om det osannolikt kommer att hända med pin-nummer.

JRobert
2015-04-27 19:30:32 UTC
view on stackexchange narkive permalink

Inte bara kommer

  const int ledPin = 9;  

tar upp RAM, men kommer i detta fall att använda mer RAM än nödvändigt eftersom digitalWrite (uint8_t, uint8_t) behöver bara en-byte-argument, och ett int är vanligtvis två byte (kompilatorberoende men typiskt). Observera att du kan ge bokstavligen en uttrycklig typ i #define:

  #define ledPin ((int) 9) 

men i ett sammanhang som sådant som ett funktionsargument där en specifik typ krävs (eftersom funktionen var ordentligt prototypad!) skulle den antingen implicit kastas eller få ett felmeddelande om typerna inte matchar.

@DrivebyDownvoter, vill du kommentera dina skäl?


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...