Programm aufräumen



  • Hallo ich habe für meine Studienarbeit ein Programm geschrieben.Nun möchte ich es etwas aufräumen und sauber gestallten.
    Ich habe z.B. einen Struct welchen ich in mehreren Programmteilen verwende.

    struct GConfig GetConfig[MAX_GET_PARA];

    Nun Meine Frage um mein Programm besser zu gestallten.
    Verwende ich ihn nun in den anderen Programmteilen immer mit:

    extern struct GConfig GetConfig[MAX_GET_PARA];

    Oder schreiben ich das einmal in meine passende Header Datei?
    Wo liegt der unterschied?



  • In die Header-Datei:
    extern int foo;
    Das sagt aus, dass irgendwo eine Integer Variable mit dem Bezeichner foo gibt.

    In eine Source-Datei:
    int foo;
    Dies definiert die Variable, erstellt also quasi den Speicher im Programm für diese Variable.

    In jeder Datei in der du die Variable nutzen willst:
    #include "Header-Datei"

    Globale Variablen sind aber sehr schlechter Stil. Vielleicht solltest du dein Programm lieber sauber strukturieren?



  • Es geht um einen Struct in welchem Messwerte von 15 verschiedenen Sensoren gespeichert werden.Jetzt Brauch ich aber je nach Programmteil nur einige davon.4 Stück muss ich über Rs232 auslesen an einer anderen Stelle im Interrupt vergleichen.Wie soll ich das den sonst als mit einer Globalen Variablen machen?



  • Die Struktur kannst du z.B. in der main Funktion erzeugen und als Parameter an die entsprechenden Funktionen übergeben.

    struct A // Deklariert in einer Headerdatei
    {
    	int i;
    };
    // Irgendeine *.c datei mit eingebundener Deklaration von struct A.
    int read_rs232 ( struct A* pA )
    {
    	// ...
    	return 0;
    }
    // Irgendeine *.c datei mit eingebundener Deklaration von struct A.
    int compare_values ( struct A* pA )
    {
    	// ...
    	return 0;
    }
    // Irgendeine *.c datei mit eingebundener Deklaration von struct A.
    int main()
    { 
    	struct A a, *pA = &a; // Hier 'lebt' die Strkutur bis Programmende.
    	read_rs232( pA );
        compare_values( pA );
    
    	return 0;
    }
    


  • Hallo Big Brother danke für den Tipp hab ich gleich umgesetzt und es geht super.
    Nur wie mach ich das mit Variablen auf die auch mein interrupt zugreifen muss?



  • Prinzipell geht das mit Variablen genauso. Wenn sie verändert werden sollen, bzw. wenn du mehrere Rückgabewerte brauchst, übergibst du einen Zeiger auf sie.



  • Edit:
    Im Falle der Variablen brauchst du nichts in die Headerdatei einzutragen, solange es sich um die standard Datentypen handelt.

    int test_a ( int a )  
    {
    	a = a + 1;
    	return a;
    }
    
    int test_b ( int* a, int* b, int* c )  
    {
    	*a = *a + 1;
    	*b = *b + 1;
    	*c = *c + 1;
    	return *a + *b + *c;
    }
    
    int main()
    { 
    	int w = 1, x = 1, y, z = 1;
    	y  = test_a(z); // z soll nicht verändert werden.
    	printf ( "y: %d z: %d\n", y, z );
    	y = test_b ( &w, &x, &z ); // w, x, z sollen verändert werden.
    	printf ( "y: %d w: %d x: %d z: %d\n", y, w, x, z );
    	return 0;
    }
    


  • Das Problem ist halt, dass man einer ISR keine Parameter übergeben kann und sie auch nichts zurückgeben können. Deswegen globale Variablen zur Kommunikation (oder halt irgendwelche Funktionen die statischen Speicher wrappen).



  • Und dann auch nicht vergessen, diese globalen Variablen als "volatile" zu deklarieren, es kann sonst je nach Compiler schwer zu findende Fehler geben.


Anmelden zum Antworten