BSDForen.de  

Zurück   BSDForen.de > Geekstuff > Programmieren

Antwort
 
Themen-Optionen Thema bewerten Ansicht
Alt 05.10.2012, 09:32   #1
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 984
Herakles eine Nachricht über ICQ schicken
Question [C]Globale Variablen markieren

Moin!

Ich verwende in meinen Projekten hin und wieder - eben da wo es nicht anders geht - globale Variablen. Die fasse ich dann meist in einem struct zusammen, etwa so:

Code:
struct globals { int furz; int noch_ein_furz; } global;
So sehe ich überall im Code, wenn ich drauf zugreife, dass die Varibale, mit der ich da gerade arbeite, eine globale ist:

Code:
if( global.furz > 1 ) stinken++;
Wenn ich nun aber eine Variable habe, die nicht global für alle im Projekt involvieren Dateien habe, sondern nur für die eine spezielle Datei, dann hätte ich da auch gern eine Unterscheidung, anhand der ich direkt erkennen kann, dass das eben keine lokale Variable der Funktion ist, sondern eben eine globale. In mein "struct globals" gehört das aber auch nicht rein, weil die Variable eben nicht für das gesamte Projekt "global" ist, sondern nur für die eine Quellcode-Datei.

So, gibt es dazu eine allgemeingültige Konvention, an die man sich halten könnte? Wie markiert Ihr Eure "Besonderen" Variablen?

Bin gespannt auf Vorschläge...

Viele Grüße
Herakles
Herakles ist offline   Mit Zitat antworten
Alt 05.10.2012, 09:39   #2
dettus
Bicycle User
 
Benutzerbild von dettus
 
Registrierungsdatum: Aug 2004
Ort: nuernberg
Beiträge: 2.533
baeh!
globale variablen. igittigit

ich mach das ganze immer ueber handles. ein struct, in dem alle variablen stehen die man so braucht, und die wird dann an alle funktionen uebergeben.
ist praktisch das gleiche, mit dem unterschied dass die alle sauber auf dem heap oder im stack landen.

Code:
typedef struct _tHandle { int a; int b; int c; } tHandle; void func1(tHandle* handle) { handle->c=handle->a+handle->b; } void main(void) { tHandle handle; handle.a=3; handle.b=7; func1(&handle); }
man muss noch dazu sagen dass ich bei meinen projekten einfach die kontrolle darueber brauche wo genau die sachen im speicher stehen.
aber auch sonst hat es definitiv den vorteil dass du weisst wie deine globalen variablen heissen; weil sie an einer einzigen stelle im code definiert sind.
und nicht holographisch ueber 50 .c-files verteilt.
__________________
Computer science is not about using a computer. It is about unleashing its powers.
dettus ist offline   Mit Zitat antworten
Alt 05.10.2012, 12:04   #3
Kamikaze
Parasprite
 
Benutzerbild von Kamikaze
 
Registrierungsdatum: May 2005
Ort: /Earth/Europe/Germany/Karlsruhe
Beiträge: 9.636
Kamikaze eine Nachricht über ICQ schicken Kamikaze eine Nachricht über MSN schicken
Ich verwende Kontext-Präfixes:
http://hsk.sourceforge.net/dev/conve...ntions_members
__________________
[ bsdlogo 2.0 - Wiki - Ports - LibreOffice Pakete - PM schreiben - kamikaze@bsdforen.de ]
Disclaimer: My posts represent my perception. Errors and incompleteness are to be expected, I deny any responsibility to know everything.
Kamikaze ist offline   Mit Zitat antworten
Alt 05.10.2012, 20:40   #4
Crest
rm -rf /*
 
Registrierungsdatum: Jun 2008
Ort: Bremen
Beiträge: 1.080
Bei kleinen Programmen in C ist eine globale Variable oftmals das leserlichste. Pointer auf Structs mit dem Kontext rum zu reichen macht den Code komplizierter. Natürlich kann es notwendig sein. Nur ist das ganze kein Selbstzweck. Der Code soll leserlich und wartbar sein nicht beweisen welche Idiome der Autor kennt.
Crest ist offline   Mit Zitat antworten
Alt 05.10.2012, 21:34   #5
Kamikaze
Parasprite
 
Benutzerbild von Kamikaze
 
Registrierungsdatum: May 2005
Ort: /Earth/Europe/Germany/Karlsruhe
Beiträge: 9.636
Kamikaze eine Nachricht über ICQ schicken Kamikaze eine Nachricht über MSN schicken
Pointer auf Structs ist schlicht der objektorientierte Ansatz. Wenn das Paradigma angemessen ist, ist das vollkommen in Ordnung und auch alles andere als kompliziert.

Ich verwende globale Variablen immer nur im systemnahen Zusammenhang.

Beispiel (ist unheimlich praktisch einfach zu seinem Code linken zu können ):
https://sourceforge.net/p/hsk/libs/c.../hsk_isr.h#l84

Interrupt 5 kann von verschiedenen Quellen getriggert werden. Dabei handelt es sich immer um Hardware direkt auf dem µC. Dafür gibt es dann schlicht ein globales struct in dem Module Funktionspointer eintragen können um den Interrupt zu benutzen.

Gegenbeispiel hsk_can_msg_create erzeugt CAN Bus Botschaftsobjekte und gibt den Typ hsk_can_msg zurück. Technisch ist einfach ein unsigned char, aber funktional ist das wie bei Dettus ein Pointer auf ein struct. Nur dass das struct ein Satz Register in einem separaten Hardware-Modul ist, auf das ich über einen Adressbus zugreifen kann. (Mit 3328 Byte Speicher verschwendet man keinen Arbeitsspeicher für Informationen, die sowieso in Hardware Registern liegt - selbst wenn man damit etwas Rechenzeit sparen kann, weil man den Umweg über den Adressbus spart).

Alle hsk_can_msg_* Funktionen bekommen das als ersten Parameter. In einer Programmiersprache mit Klassen wären das die Methoden einer hsk::can::Message Klasse und die create Funktion wäre der Konstruktor.
__________________
[ bsdlogo 2.0 - Wiki - Ports - LibreOffice Pakete - PM schreiben - kamikaze@bsdforen.de ]
Disclaimer: My posts represent my perception. Errors and incompleteness are to be expected, I deny any responsibility to know everything.
Kamikaze ist offline   Mit Zitat antworten
Antwort


Dieses Thema betrachten zurzeit 1 Personen. (0 registrierte Benutzer und 1 Gäste)
 
Themen-Optionen
Ansicht Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An
[IMG] Code ist An
HTML-Code ist Aus
Gehe zu

Ähnliche Themen
Thema Erstellt von Forum Antworten Letzter Beitrag
[C] Variablen initialisieren Herakles Programmieren 10 10.11.2010 16:48
X Terminal dass mit Tasten markieren kann? Maxx FreeBSD - Anwendungen und Ports 5 14.08.2006 22:03
lokale Variablen in awk Kamikaze Programmieren 4 17.07.2006 17:12
Variablen Wert vergleichen cat1510 Programmieren 8 01.12.2005 12:47
Variablen in make "unsetten" cirad FreeBSD - Anwendungen und Ports 2 14.12.2003 07:55


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.


Powered by vBulletin (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.