*Markus: (C) Gültigkeitsbereich von Variablen wie verwenden?

Hallo,

da ich eigentlich von der Java-Seite komme, habe ich in C noch ein Organisationsproblem mit dem Umgang des Gültigkeitsbereichs von Variablen.

Wenn ich vordefinierte Funktionen verwende, zB wie bei GTK...

g_signal_connect

...dann kann ich diese Funktionen nicht um weitere Variablen, die ich eventuell benötige, erweitern. Dadurch quetsche ich alles in eine Struktur, die ich dann als Pointer übergebe, weil ich die Werte der Struktur in den anderen Events benötige:

  
struct clickdata   {  
     gint rating;  
     gboolean deleterating;  
};  
  
int main(int argc, char *argv[]) {  
  
  struct clickdata clickdata;  
  clickdata.rating = 0;  
  clickdata.deleterating = FALSE;  
  gpointer p_clickdata = &clickdata;  
  
  g_signal_connect(window, "button-press-event", G_CALLBACK(clicked), p_clickdata);  
.  
.  
.  
  

In den Funktionen muss ich wieder alles entwurschteln und dereferenzieren. Macht man das so, oder sollte ich besser (auf diese C-Datei beschränkte) globale Variablen verwenden, die ich dann in jeder Funktion problemlos ansprechen kann, da ich ja ohnehin die Variablen funktionsübergreifend behandeln muss?
Welchem Paradigma folgt man hier am besten?

Viele Grüße,
Markus

  1. Grüße,

    Welchem Paradigma folgt man hier am besten?

    Paradigma ist ein sehr, sehr präsentables Wort und globale Variablen gelten im allgemeinen als problematisch, bzw als etwas was man meiden sollte.

    Es führt verständlicherweise zu komplkationen bei versuchen den code wiederzuverwenden oder auszubauen, speziell wenn du "plausible" variablennamen verwendest.
    MFG
    bleicher

    --
    __________________________-

    FirefoxMyth
    1. Hallo,

      Paradigma ist ein sehr, sehr präsentables Wort [...] speziell wenn du "plausible" variablennamen verwendest.

      ich muss an dieser Stelle mal ein Lob anbringen.
      Meistens beschränkst du dich ja auf recht kurze Beiträge, in denen du oft mit wenigen Worten auf den Punkt bringst, was du sagen willst. Längere Beiträge wie dieser hier sind bei dir eher die Ausnahme.

      Kein Wunder, denn auch die Mailadresse, die du verwendest, lässt mich vermuten, dass du aus dem russischen oder zumindest russischsprachigen Raum stammst.

      Aber mir fällt auf, dass sich deine Rechtschreibung bzw. deine Beherrschung der deutschen Sprache überhaupt seit 2006, als du die ersten Beiträge hier im Forum geschrieben hast, beachtlich verbessert hast. Zwischendurch wusste ich eine Weile nicht so recht, was dir schwerer fällt: Fehlerfreies Tippen oder korrektes Deutsch. In beiden Punkten hast du offenbar sehr große Fortschritte gemacht. Respekt! Und mach weiter so! :-)

      Schönen Abend noch,
       Martin

      --
      Wenn man keine Ahnung hat - einfach mal Fresse halten.
        (Dieter Nuhr, deutscher Kabarettist)
      1. Grüße,
        danke sehr^^
        ich muss aber zugeben, dass dies zu einem nicht geringen Teil, der in Opera10 eingebauter Rechtschreibkorrektur zuzuschreiben ist :P fand die Besserung vllt vor ca 8 Monaten statt^^?

        was längere Beiträge angeht - dazu fehlt mir die Motivation, und wenn ich noch mal ehrlich sein darf - das Wissen. Ich schreibe so wenig, weil ich so wenig weiß.
        MFG
        bleicher

        --
        __________________________-

        FirefoxMyth
  2. Ich finde es schöner, wenn man alles in ein struct (bei oo: Klasse, bzw. Instanz einer solchen) packt, statt zig einzelne Parameter zu haben. Das macht auch die Erweiterung des structs einfacher, sofern das Vorgabewerte hat die man an manche Stellen einfach nicht berücksichtigen will.

    Globale Variablen sind halt sehr unübersichtlich. Die stehen "irgendwo", nur nicht da wo man sie verwendet und sind überall gültig, also auch überall überschreibbar.
    Ich würde den Weg gehen dass du kapselst wo es geht und die Variablen nur minimal gültig machst. Das ist viellleicht ein bisschen mehr Schreibarbeit, erspart dir aber einiges an Sucherei wenns ans Debuggen geht.

  3. Hallo Markus,

    In den Funktionen muss ich wieder alles entwurschteln und dereferenzieren. Macht man das so, oder sollte ich besser (auf diese C-Datei beschränkte) globale Variablen verwenden, die ich dann in jeder Funktion problemlos ansprechen kann, da ich ja ohnehin die Variablen funktionsübergreifend behandeln muss?

    Kommt darauf an, was Du erreichen willst. Immer dann, wenn Du Code wiederverwenden willst sind globale Variablen eine sehr schlechte Idee. Mal ein Beispiel:

    Du schreibst irgend ein kleinen C-Codeschnipsel, der ein bestimmtes GUI-Fenster bereitstellt (z.B. ein Statusanzeigefenster mit Fortschrittsbalken). Wenn Du dort globale Variablen verwendest, z.B. um den Fortschritt-Prozentsatz zu speichern, dann bekommst Du Probleme, sobald Du mehr als eines von diesen Fenstern öffnen willst, denn dann kommen sich die beiden Dinge in die Quere.

    Es gibt natürlich auch Fälle, wo man Code nicht wiederverwenden können will und man sich eine Menge Arbeit spart, in dem man globale Variablen verwendet. Und in sehr seltenen Fällen sind sie auch nötig.

    Von daher wäre mein Rat: Vermeide globale Variablen wenn es möglich ist - aber verbeiße Dich dabei nicht.

    Viele Grüße,
    Christian

    --
    Mein "Weblog" [RSS]
    Using XSLT to create JSON output (Saxon-B 9.0 for Java)
    »I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
                -- Kommentar bei TDWTF
  4. Hallo,

    danke für eure Tipps. Ich werde sie mir zu Herzen nehmen.

    Viele Grüße,
    Markus