Enkel liten variabel fråga

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Enkel liten variabel fråga

Inlägg 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.
Millox
Inlägg: 559
Blev medlem: 10 december 2005, 22:10:43
Ort: Östhammar

Inlägg 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;
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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 ?
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg 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..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Tack för hjälpen....
Millox
Inlägg: 559
Blev medlem: 10 december 2005, 22:10:43
Ort: Östhammar

Inlägg 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 ;-)
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Inlägg 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? :wink:

virtual finn inget som heter i standard C.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47017
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Inlägg 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:

Kod: Markera allt

#define MAIN_APP
#include "var.h"
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.
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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"... :-)
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg 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)
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Inlägg 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.)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47017
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Inlägg 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
Skriv svar