Globale Variablen



  • hallo!

    wenn ich in file1.c ein globales array int data[10] habe und in file2.c von einer funktion aus darauf zugreifen möchte kann ich doch einfach extern int data[10] schreiben oder?

    also in code

    file1.c

    int data[10];
    
    int main()
    {
    //Mach was
    }
    

    file2.c

    void irgendeinefunktion(void)
    {
    extern int data[10];
    
    data[0]=1;
    

    funktioniert sowas?


  • Mod

    Ja, es funktioniert. Nein, du solltest es nicht machen.

    Dieser Ratschlag ist nicht so wie "Du solltest nicht zu spät ins Bett gehen" zu verstehen, sondern eher so wie "Du solltest nicht den Föhn in der Badewanne benutzen".



  • also das problem ist, dass es sich bei "irgendeinefunktion" eigentlich um eine interrupt service routine handelt und der parameter void nach meinem wissen vom compiler fest vorgegeben ist, ich aber zwischen diesen ganzen funktionen daten austauschen muss und daher wohl nicht drum herum komme. 🙄

    ich versuche ja schon, die variable zu "entglobalisieren", indem ich sie in die funktion hinein setze und nicht einfach global als extern deklariere. 😃


  • Mod

    Ok, das kann eine der wenigen Entschuldigungen sein, globale Variablen zu benutzen. Bist du bezüglich des Parameters sicher? Die meisten Call-Backs bieten oft einen allgemeinen void* an, den man mit einem Datenstruct befüllen kann.



  • ich habe eben extra einmal im manual nachgesehen:

    14.3.1
    Guidelines for Writing ISRs
    The following guidelines are
    suggested for writing ISRs:
    • declare ISRs with no parameters and a
    void
    return type (mandatory)

    also globale variablen + extern 🙄



  • Globale Variablen sind, wenn man sie überlegt einsetzt, in Ordnung.

    Du kannst sonst einen static Pointer in deiner Interrupt.c nehmen, den du dann mit einer Setter-Funktion auf den richtigen Wert setzt.


  • Mod

    Vermutlich sollte data in diesem Fall auch volatile sein.

    Wade1234 schrieb:

    ich habe eben extra einmal im manual nachgesehen:

    14.3.1
    Guidelines for Writing ISRs
    The following guidelines are
    suggested for writing ISRs:
    • declare ISRs with no parameters and a
    void
    return type (mandatory)

    also globale variablen + extern 🙄

    Vermutlich sollte data in diesem Fall auch volatile sein.



  • also ich finde, dass man, abgesehen von solchen spezialfällen wie hardware-interrupts oder geschwindigkeitskritischen anwendungen, eigentlich keine globalen variablen einsetzen sollte, weil es unübersichtlich ist.

    aber warum volatile?


Log in to reply