C++ Fokus på sproget #05

C++ Fokus på sproget #05

Funktioner


Endelig! Nu er vi nået frem til det sjove. Funktionerne.

Funktioner er

  • kernen i vores kode.
  • der, hvor tingene sker.
  • det sted i koden, hvor der bliver beregnet, talt op og givet ordrer.
  • rigtig smarte, hvis man har kode, som skal bruges igen og igen.
  • mestrer man at oprette og kode funktioner og kan skelne mellem de forskellige typer af funktioner, – ja så har man fat i noget meget centralt i sprogets struktur.

Når man opretter en ny Arduino sketch, er den på forhånd forsynet med to funktioner, som er navngivet henholdsvis ‘setup’ og ‘loop’. Kigger vi nøjere på dem, kan vi se, at funktioner har deres egen syntaks. Der er regler for, hvorledes man erklærer dem og hvorledes man anvender parenteser. Det kommer vi tilbage til.

Lad os kigge på, hvorledes man bygger en sketch op med funktioner. Når man skal lave en ny sketch, skal man selvfølgelig gøre sig klart, hvilke opgaver, man ønsker udført. Ofte, og ikke mindst mens man stadig er newbie, kan det være en rigtig god ide at beskrive de ønskede hændelser i almindeligt, men kortfattet sprog. Noget af det nemmeste man kan få sin Arduino til, er at tænde eller slukke for den indbyggede LED. Lad os kigge på, hvorledes vi får den til gentagne gange at sende bogstavet a i morse. HW? som vi siger i cw-verdenen.

Den kortfattede beskrivelse af vores sketch kan derfor sammenfattes i en funktion, der gør følgende:

  • ‘send et a’

Selv uden at have bestået morseprøven kommer man hurtigt frem til, at vi får brug for to hjælpefunktoner:

  • ‘send PRIK’
  • ‘send STREG’

Sketchen kommer skal derfor indeholde disse tre funktioner, hvor den nederste ‘send et a’ har brug for de to øverste:

  • ‘send PRIK’
  • ‘send STREG
  • ‘send et a’

Allerede her kan vi se en af de store fordele ved funktioner: De kan bruges igen og igen. Når først vi har fyldt noget kode i vores funktioner, kan vi ved hjælp af  ‘send PRIK’ og ‘send STREG’ hurtigt skrive kode, der sender et hvilken som helst tegn. For at sende en prik, skal den indbyggede LED lyse i et antal sekunder og derefter skal den være slukket i et antal sekunder.  Hvis vi medtænker de to faste funktioner, kan vores pseudo-kode se således ud:

Fokus 05 01

At skrive sådan kalder programmører at arbejde i ‘pseudo-kode’. Man kan arbejde med blyant og papir, man kan bruge en tekstbehandler eller benytte lige præcis den skrivemetode, man bedst kan lide. Når det er små, ukomplicerede projekter, skriver jeg altid min pseudo-kode direkte i selve Arduinos IDE. Så har jeg min pseudo-kode lige ved hånden, når den skal skrives ud som rigtig kode.

Nu skal koden ud af kommentartegnene. Vi skal til at skrive rigtig kode

  • Kunne man så ikke lige så godt have begyndt at skrive kode med det samme? Jo! er svaret, hvis man er en erfaren programmør, som er godt inde i sproget. Men som begynder kan man næsten ikke overdrive det at skrive pseudo-kode, fordi man derved tvinger sig selv til at tænke konkret over HVAD der skal gøres. Med andre ord er behovet for at skrive pseudo-kode omvendt proportionalt med ens færdigheder udi C++. Men uanset hvor kompetent man er, er det ALTID en god ide at lave skitser til sin sketch og tænke den igennem på et overordnet plan INDEN man koder løs. Alt for mange kaster sig ud i projekter, som ender med at være kodet hjertegribende dårligt og uoverskueligt, fordi man så at sige arbejder sig indefra og ud.

Bemærk to ting angående navngivning af funktioner.

For det første bestræber jeg mig på at indlede navnet med et udsagnsord. Det gør jeg for at fortælle, HVAD min funktion gør. Det fortæller meget mere, end hvis jeg blot havde kaldt dem ‘Dit’ og ‘Dah’. Det er en stor hjælp for andre og for mig selv, hvis jeg efter lang tid skal arbejde videre med den. Min kode bliver simpelthen lettere at læse.

For det andet indleder jeg navnet med små bogstaver, mens resten er CamelCase. Så ser man med det samme, at det drejer sig om en funktion.

Mine tre funktioner kommer derfor (med parenteser) til at hedde:

  • sendDit()
  • sendDah()
  • sendA()

Inden man koder, skal man lige være klar på følgende:

  • Den indbyggede LED sidder på pin 13.
  • En streg er tre gange længden af en prik.
  • Efter et tegn skal der være en pause af samme længde som en prik.
  • Efter et bogstav skal der være en pause af samme længde som en streg.
  • Hvis man fastsætter speed som words per minute WPM, kan man beregne længden af en prik som 1200/WPM.
  • Man aktiverer en funktion, ved at foretage et kald til den. Man skriver dens navn efterfulgt af to parenteser.

Koden kommer derfor til at se således ud:

Fokus 05 02

Læg mærke til syntaksen for en funktion med de to sæt parenteser. De runde og de krøllede. Den linje, hvor navnet på funktionen står, skal IKKE afsluttes med semikolon!!

Læg mærke til de tre konstanter. Det er ofte MEGET hensigtsmæssigt at fastlægge denne slags oplysninger i konstanter. I dette tilfælde medfører det blandt andet, at man let kan ændre pin eller selve den hastighed, hvormed der morses. Man skal blot ændre konstanten, så slår ændringen igennem i resten af koden. OG det hele foregår øverst i koden, – man skal ikke lede efter det rette sted.

KONSTANTER navngives med store bogstaver og underscore mellem ord.

Foran navnet på funktioner står ordet ‘void’. Det betyder, at de ikke returnerer en værdi. Void kan ikke i ét ord oversættes præcist til dansk, men betyder noget i retning af ‘intet’ eller ‘det tomme’. Funktioner som erklæres med ordet ‘void’ hedder i en række andre programmeringssprog for procedurer, fordi de GØR noget. De processerer. Men i C++ har man valgt at kalde alle disse strukturer under et for funktioner.

Hvis man ønsker, at ens funktion skal returnere en værdi, som den har beregnet. I disse tilfælde skal man erstatte void med den datatype, som returneres: int findMax(), float calcDistance() etc. etc. OG inde i funktionen skal der i disse tilfælde være en linje, som hedder

  • return (efterfulgt af en beregning eller den værdi, som skal sendes ud af funktionen igen.

Har man en funktion, som beregner arealet af et rektangel, kunne den kodes således:

Fokus 05 03

I visse tilfælde ønsker man at funktionen returnerer en værdi, selv om den ikke som sådan udfører beregninger. Man kan f. eks. lade den returnere værdien 0 (nul) hvis alt INDE i funktionen er forløbet uden problemer.

Koden til ovenstående eksempel kan hentes her.


In short


Funktioner navngives, så man tydeligt kan se hvad de gør. Begynd med små bogstaver, derefter CamelCase. Konstanter skrives med store bogstaver og underscore mellem ord. Funktioner kan returnere værdier og så skal typen stå foran navnet på funktionen. Hvis de ikke returnerer noget, er de af typen void.


Fokus på Sproget

LinksLinksLinks
C++ #01C++ #02C++ #03
C++ #04C++ #05C++ #06
C++ #07C++ #08C++ #09
C++ #10

Leave a Reply

Your email address will not be published. Required fields are marked *