www.mikrocontroller.net

Forum: Compiler & IDEs C-Anfängerfrage


Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich hab schon etwas erfahrung in Assembler und möchte jetzt aber auf C 
umsteigen.

Kann mir jemand mal fragen paar fragen beantworten:

ich habe 2 C-Dateien und 2 dazu gehörende H-Datein. (FileA  FileB)

allgemeine Frage: ist es nun besser mit get/set-Methoden die Variablen 
dem jeweiligen anderen File zugängig zu machen, oder mit extern 
deklaration in der Header Datei? Mein extern gibt es ja nicht in C, aber 
der GCC Compiler unterstützt ja teils C++.

falls ich nun in FileB eine while-schleife programmiert habe in der ich 
nun von FileA eine Variable als Bedingung nutze. Beispiel:

FileB:
#include"FileA.h"
void FileB ()
{
while(Variable_FileA)
{....}
}

Falls ich nun mit "get/set" arbeiten würde, müsste ich m eine 
get-Methode in die while-Schleife mit reinpacken um so den aktuellen 
Wert der Variable zu erhalten? oder gibt es da noch einen besseren 
Programmierstil, z.B mit Zeigerübergabe?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"extern" gibt es auch in C.

Getter und Setter brauchst du, wenn:
=> Module von verschiedenen Entwicklern entwickelt werden
=> Module eine gewisse Komplexität überschreiten
=> nicht für Bastelprojekte mit 500 Zeilen Code über 3 Dateien

Auf kleinen Controllern ist es auch eine Performance-/Speicherfrage, ob 
man sich den Overhead gönnt.

Zur Schleife:

while (VariableA) {...}

Ein getter wäre sinnfrei, besser wäre dann etwas wie:

while (FileA_getSomeState() == SOME_SPECIAL_STATE) {...}

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Setter/Getter arbeitet man eher im oo-Umfeld wie in Java. Die 
Kapselung bedingt einen gewissen Overhead, den man in C nicht immer 
haben will.

In C wird extern natürlich unterstützt, am einfachsten ist also
extern int var_a;
// Ende des Headers von Modul A

void foo_b(void)
{
   a = 1;
}

alernativ kann man das Zeug in Strukturen sammeln:

typedef struct
{
   int var1;
   ...
} modula_t;

extern modula_t a;
// Ende des Headers von Modul A

// Indirekter Zugriff
void foo_b2 (modula_t * pa)
{
   pa->var1 = 1;
}

// Direkter Zugriff
void foo_b3 ()
{
   a.var1 = 1;
}

Wenn Getter und Setter immer nur triviale Sachen machen, dann 
verschleiert das mehr, als es klar macht. Wenn man Kapselung also nicht 
braucht und erer auf kleinen, flotten Code scharf ist, würd ich drauf 
verzichten. Wenn ein Setter aber komplexere Sachen machen muss wie zB 
ein Dateizugruff oder ein Getter ne Kommunikation um an das Datum zu 
kommen, geht das schlecht mit einem Zugriff auf ne Variable.


Johann

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ging ja schnell, danke für die antwort.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. wrote:
> extern int var_a;
> // Ende des Headers von Modul A
> 
> void foo_b(void)
> {
>    a = 1;
> }

Muss natürlich heißen
   var_a = 1;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.