If an object that has static storage duration is not initialized explicitly, it is initialized implicitly as if every member that has arithmetic type were assigned 0 and every member that has pointer type were assigned a null pointer constant.
@lillahuset, zealotry & Mr Andersson:
Tackar för förklaringarna! Läste också igenom länken du gav z och nu är det mycket klarare.
Satt och funderade på varför jag inte visste det här innan men jag tror det är så illa att jag knappt aldrig innan gjort separata funktioner utan skrivit allt i main-loopen och (antagligen) inte behövt det här. I vilket fall så har jag lärt mig något nytt
Nu ska jag grotta ner mig i Icecap's inlägg. Tack för att du tog dig tid!
Hänger med på det mesta du skriver Icecap och klasser är något jag inte gett mig på än.
Är dock väldigt undrande över en sak, och det är vad Jan Almqvist skrev tidigare; att inte använda globala variabler utan skicka parametrar till funktionerna...
Hmm, nä fasen, är rädd för att jag kanske förstår nu. Läste om inläggen samt lite i en bok om C.
Ska fortsätta programmet nu och se om jag får ihop det. Tack så länge
Fördelen med att ha hela "interfacet" mellan den anropande koden (t.ex. main() )
och den anropade funktionen i själva anropet, är att det är enklare att se vad
som är gemensamt, så att säga, mellan anroparen och det anropade.
Allt syns i funktions deklarationen.
Men visst, det är inte helt ovanligt att man har vissa flaggor eller status
eller något liknande som i princip används överallt, då kan det vara enklast
att helt enkelt ha dom globala för alla. Men kanske inte för parametrar som
är unika för en viss funktion.
Sen så är det så klart något snabbare att ha globala variabler som alla
rutiner och kan nå direkt utan att använda stack eller liknande. De globala
variablerna ligger ju där de ligger, så att säga...
Det var skönt att höra, alltså att ibland använder även ruttade människor globala variabler
Om någon har tid så får ni gärna verifera att jag tänker rätt här:
doPrintDisplay() ska inte returnera något så därför valde jag void.
Funktionen ska dock använda en uint16_t parameter som heter sendBuffer.
Denna variabel initieras i while-loopen samt att jag därifrån anropar funktionen genom doPrintDisplay(sendBuffer);.
I nuläget får jag en kompileringsvarning pga att sendBuffer inte initierats riktigt men ger jag den ett värde så kompilerar filen ok. Kommer fortsätta imorrn då den kommer tilldelas det riktiga värdet.
Men det är alltså så här jag skickar parametrar mellan funktioner?
Ja, i princip. Jag skulle dock inte använda samma namn på
parametern i funktionen som den globala variabeln, det finns
igen anledning till det och det kan förvilla. Alltså t.ex.:
Ahaa, det var så dom menade i boken. Förstod inte att man kunde ange ett nytt variabelnamn till parameter direkt när man "importerar" den till en funktion.
När jag såg ditt exempel så tyckte jag först att det kändes ologiskt att ha ett annat namn på den men nu när jag tänker efter så är det ju snarare skitbra. Då gör jag ju en separat funktion för att just "printa buffer" och sen kan jag skicka dit vilken buffer som helst i programmet.
Hade jag i detta läge använt samma parameternamn så skulle det ju bara bli rörigt.
Snyggt! Tackar för detta!
Exakt!
Det enda intressanta är att data typerna stämmer överens.
I detta fall en uint16_t, men det är ofta t.ex. en pakare till char ("sträng").
Kompilatorn översätter ju allt till adresser i alla fall...
Ta t.ex en sådan funktion som fprint(), inte vet du vilka namn som den som
skrev fprint() använde, eller hur? Och inte spelar det någon roll vilka namn
som du själv använder i anropet till fprint()?
Det här kanske blir lite mer IDE+MCU relaterat men gör ett försök.
Avsikten är att skriva över lite data till ett skiftregister men det är något jag missar.
Mest ligger felet i hur man skriver till en bit i PORT-registret, eller i alla fall har med det att göra.
Felet visar sig genom att jag försöker skriva ut 10101010101 på porten men får istället ut typ 110011000000000011001100.
Uppskattar verkligen hjälpen Icecap och menar verkligen inte att vara otacksam, men jag måste försöka förstå vad som händer också.
Om jag jämför våra två snuttar nu så tycker jag att den enda skillnaden är att jag läser en specifik bit i variabeln, medans du alltid läser LSB och skiftar.
Tvekar inte på att din snutt fungerar men jag försöker förstå vad jag gör fel.
Magnus_K skrev:Uppskattar verkligen hjälpen Icecap och menar verkligen inte att vara otacksam, men jag måste försöka förstå vad som händer också.
Om jag jämför våra två snuttar nu så tycker jag att den enda skillnaden är att jag läser en specifik bit i variabeln, medans du alltid läser LSB och skiftar.
Tvekar inte på att din snutt fungerar men jag försöker förstå vad jag gör fel.