Sida 1 av 2
Enkel liten variabel fråga
Postat: 16 maj 2007, 13:59:41
av ankan
Om min kod består av flera .C filer och jag vill komma åt en variabel från två olika funktioner som finns i två olika .C-filer. Hur gör jag då?
Jag måste ju deklarera variabeln i någon fil, och gör jag det i den ena så kommer inte den andra åt och tvärt om.
Postat: 16 maj 2007, 14:01:32
av Millox
deklarera den som extern i den andra filen. alltså:
fil1.c
virtual unsigned uint8_t variabel;
fil2.c
extern virtual unsigned uint8_t variabel;
Postat: 16 maj 2007, 14:13:05
av sodjan
Gäller "virtual" oberoende av *vilken* C-kompilator man använder ?
"Global/Extern" är annars en annan variant som t.ex används i assembler...
Hur som helst, kolla upp vad dokumentationen säger om att deklarera
variabler så att de syns "globalt" samt att de är definierade "externt".
Vilken C variant är det ?
Postat: 16 maj 2007, 14:21:00
av ankan
MikroC.
Det gick bra att bara definiera variablerna i "huvudfilen" och sedan skriva extern framför definitionen i den andra filen.
Dvs i fil1.c
unsigned char variablename;
fil2.c
extern unsigned char variablename;
Får dock en anmärkning vid kompileringen:
initialization of extern object variablename
EDIT: Fixade stavfel som vanligt..
Postat: 16 maj 2007, 14:37:19
av sodjan
OK, verkar som variabler blir global per default.
Då finns det antagligen något som heter "local"
eller likande för att upphäva det, om man vill det...
Postat: 16 maj 2007, 14:38:27
av ankan
Tack för hjälpen....
Postat: 16 maj 2007, 14:41:41
av Millox
sodjan: Jag vet faktiskt inte. virtual var bara med av gammal vana. Inte speciellt realistiskt exempel jag drog upp egentligen, både unsigned och uint8_t behövs sällan samtidigt

Postat: 16 maj 2007, 15:06:18
av JJ
sodjan skrev:
Då finns det antagligen något som heter "local"
static heter det. Något annat hade väl varit för självklart?
virtual finn inget som heter i standard C.
Postat: 16 maj 2007, 15:35:57
av sodjan
Hm, "static" har väl med hur variablen "hanteras", inte på vilket dsätt
de den "syns" från andra delar av koden ? Det är ju två olika saker.
D.v.s att värdet sparas mellan anropen och att adressen inte används
av andra variabler i andra delar av koden.
Eller så har jag missförstått "static", vilket inte är osannolikt...

Postat: 16 maj 2007, 16:44:41
av TomasL
Brukar göra så här:
Skapar en .h fil för alla globala variabler, sedan ser det ut så här:
var.h
Kod: Markera allt
/*var.h*/
#ifdef MAIN_APP
#define EXTERNAL
#else
#define EXTERNAL extern
#endif
#ifndef _VARS_H
#define _VARS_H
EXTERNAL unsigned char variable;
#endif
Sedan i .c-filen där main() finns lägger jag in:
Sedan inkluderar jag var.h i samtliga .c-filer som ingår i projektet.
På detta sätt får jag samtliga globala variabler deklarerade i "huvudfilen" och definerade i efterföljande filer. (hmm eller är det tvärt om deklarerade/definerade).
I vilket fall som helst så talar "extern" om för kompilatorn att plats skall reserveras för att använda dessa globala variabler i samtliga filer.
Postat: 16 maj 2007, 17:14:15
av BoF
sodjan skrev:Eller så har jag missförstått "static", vilket inte är osannolikt...

Du har inte helt fel, deklarerar du en static så behåller den värdet mellan anropen.
Deklarerar du en static variabel globalt så har den bara räckvidd inom filen, d.v.s. du kommer inte åt den i andra filer så som du gör med en global variabel genom att använda nyckelordet extern i C brukar man inte (i Ansi) ange global utan den blir det automatiskt om den ligger utanför en funktion om den inte är static, denna variable komma man åt i andra filer genom att ange nyckelordet extern i den aktuella fil som skall använda den globala variabeln.
Virtual är ett nyckelord i C++, används för att göra en metod dynamisk länkande.
Postat: 16 maj 2007, 17:21:18
av sodjan
> om den ligger utanför en funktion...
Ah, så var det ja...
Global eller inte beror på *var* deklarationer står.
En av C's små "finesser"...

Postat: 16 maj 2007, 18:41:20
av oJsan
TomasL skrev:I vilket fall som helst så talar "extern" om för kompilatorn att plats skall reserveras för att använda dessa globala variabler i samtliga filer.
Nja, inte riktigt. På de ställen där du deklarerat en variabel som extern så kommer det
inte att reserveras minne. Extern talar om att det inför länkningen finns minne reserverat av någon annan c-fil (den som inte är deklarerad som extern).
Att, som du föreslår, skapa en .h-fil med globala variabler är inte smart när projekten växer. Om du t.ex. döper om en variabel i som bara används i ett par .c-filer så kommer ALLA .c-filer kompileras om eftersom .h-filen finns med i alla c-filer. (Visst, går att lösa med make-filen men bäst är att låta bli onödig globalisering)
Postat: 16 maj 2007, 19:43:31
av JJ
TomasL skrev:
Sedan inkluderar jag var.h i samtliga .c-filer som ingår i projektet.
På detta sätt får jag samtliga globala variabler deklarerade i "huvudfilen" och definerade i efterföljande filer. (hmm eller är det tvärt om deklarerade/definerade).
Det är tvärtom.
Om man inte vet det kan det vara bra att känna till följande om C: Det är skillnad på deklaration och definition. En deklaration talar om tex att en int finns, en definition reserverar minne. Inte helt intuitivt särskilt med tanke på att preprocessorn har direktivet #define som är ngt annat
TomasL skrev:
I vilket fall som helst så talar "extern" om för kompilatorn att plats skall reserveras för att använda dessa globala variabler i samtliga filer.
Nej. extern är en deklaration som talar om för kompilatorn att variabeln finns och är definierad någon annanstans. Men det var väl så du menade?
Dessutom har extern en annan betydelse när den står framför en funktionsdeklaration. (Ingen alls.)
Postat: 16 maj 2007, 20:04:55
av TomasL
JJ: "Men det var väl så du menade?" Jupp.
oJsan: "Att, som du föreslår, skapa en .h-fil med globala variabler är inte smart när projekten växer.": Just för Globala variabler som spänner över hela projektet ser jag inga problem med detta.
Fördelen är ju att alla variabler finns på samma ställe och man får då en rätt bra överblick över det hela.
Dock, av naturliga skäl gör jag inte så med "bibliotekskod", de har egna .h filer