Globale Variablen oder Parameter-Weitergabe



  • Hallo,

    wie würdet ihr es lösen nach Version 1 oder 2?

    Version 1

    #include <stdio.h>
    #include <stdlib.h>
    
    void ftk2(int i, int j);
    void ftk1(int i, int j);
    
    int main()
    
    {
    	int i = 2;
    	int j = 5;
    
    	ftk1(i,j);
    
    	getche();
    	return 0;
    }
    
    void ftk1(int i, int j)
    
    {
    
    	printf("Hallo ich bin funktion 1\n");
    
    	ftk2(i,j);
    
    }
    
    void ftk2(int i, int j )
    
    {
    	int e;
    	e = i+j;
    	printf("Wert von e: %d \n" ,e);
    
    }
    

    oder

    Version 2

    #include <stdio.h>
    #include <stdlib.h>
    
    int i = 2;
    int j = 5;
    
    void fkt1();
    void ftk2();
    
    int main()
    
    {
    
    	fkt1();
    	getche();
    	return 0;
    }
    
    void fkt1()
    
    {
    
    	printf("Hallo ich bin funktion 1\n");
    
    	ftk2(i,j);
    
    }
    
    void ftk2()
    
    {
    	int e;
    	e = i+j;
    	printf("Wert von e: %d \n" ,e);
    
    }
    

    Das ist jetzt ein stark vereinfachtes Beispiel es geht im allgemeinen darum wann ihr globale Variablen verwendet oder die Werte als Paramter weitergebt obwohl die Funktion die Werte nicht braucht (fkt1()), aber eine Funktion die von dieser Funktion (fkt1()) aus aufgeruft wird die Werte braucht (ftk2()).

    Version 1 oder Version 2?

    Schon mal danke für eure Antworten

    Viele Grüße

    Slayer



  • Globale Variablen sind in 98% aller Fälle schlecht also definitiv die Version ohne globale Variablen.



  • Slayer schrieb:

    wie würdet ihr es lösen nach Version 1 oder 2?

    kommt drauf an, was du vor hast. globale variablen gehören eher in den bereich der mikrooptimierung. aber wenn du schon mit globalen variablen rumfummelst, dann mach auch gleich die funktionen wech.
    🙂



  • globalplayer-freak schrieb:

    Slayer schrieb:

    wie würdet ihr es lösen nach Version 1 oder 2?

    kommt drauf an, was du vor hast. globale variablen gehören eher in den bereich der mikrooptimierung. aber wenn du schon mit globalen variablen rumfummelst, dann mach auch gleich die funktionen wech.
    🙂

    kannst du mir ein bitte ein Beispiel machen, wie ich die Funktionen weglassen kann?

    Danke



  • In deinem Beispiel mit den globalen Variablen. In einem längeren Programm wo Übersicht eine Rolle spielt würde ich allerdings die erste verwenden.



  • @Slayer: ganz klar die erste Version. Globalre Variablen sollte man nur dann nutzen, wenn man keine andere Wahl hat.

    Probleme mit globalen Variablen:

    • nicht thread safe außer du benutzt mutex/semaphores o.ä. um nebenläufige Zugriffe zu erlauben.
    • Funktionen werden nicht reentrant und kann somit Rekursion und/oder Nebenläufigkeit manchmal unmöglich machen.

    Siehe auch http://de.wikipedia.org/wiki/Globale_Variable#Lokal_versus_global



  • yay! i sense a global vs local bashing 😃



  • global ist pfui... 👎

    nur wenns nicht anders geht. 👍



  • globalplayer-freak schrieb:

    kommt drauf an, was du vor hast. globale variablen gehören eher in den bereich der mikrooptimierung.

    Find' ich ein bißchen gewagt, sauberer wären immer noch lokale statics und den Compiler anzuweisen, die Funktion als inline aufzulösen oder sie gleich als Macro anzulegen.

    In globale Variablen gehören wirklich nur globale Werte, die alle lesen können MÜSSEN (wie z.B. systemweite Einstellungen) und genau festgelegt ist, wer sie beschreiben darf, nämlich meistens nur einer. Damit bindet man aber seine Funktionen an die Existenz dieser Variablen und verdirbt sich den Vorteil, echt unabhängige Module coden zu können.
    Die Funktion mit den lokalen Variablen, so sie einmal fehlerfrei ist, kannst Du per copy&paste überall einsetzen - das ist ja das Schöne 🙂

    Also: Ohne echte Not Finger weg von globalen Variablen! 😃



  • Version ohne funktionen und mit globalen variablen:

    #include <stdio.h> 
    #include <stdlib.h> 
    
    void ftk2(int i, int j); 
    void ftk1(int i, int j); 
    
    int main() 
    
    { 
        int i = 2; 
        int j = 5; 
    
        //Was fkt1 macht
        printf("Hallo ich bin funktion 1\n"); 
        int e; 
       //was fkt2 macht
        e = i+j; 
        printf("Wert von e: %d \n" ,e); 
    
        getche(); 
        return 0; 
    }
    

    (totaler bullshit halt)



  • BorisDieKlinge schrieb:

    Version ohne funktionen und mit globalen variablen:

    #include <stdio.h> 
    #include <stdlib.h> 
    
    void ftk2(int i, int j); 
    void ftk1(int i, int j); 
    
    int main() 
    
    { 
        int i = 2; 
        int j = 5; 
        
    
        //Was fkt1 macht
        printf("Hallo ich bin funktion 1\n"); 
        int e; 
       //was fkt2 macht
        e = i+j; 
        printf("Wert von e: %d \n" ,e); 
    
        getche(); 
        return 0; 
    }
    

    (totaler bullshit halt)

    nö, so:

    int i = 2;
    int j = 5;
    int e;
    
    int main()
    {
        printf("Hallo ich bin ehemalige funktion 1\n");
        e = i+j;
        printf("Wert von e: %d \n" ,e);
        getche();
        return 0;
    }
    

    was ist daran schlechter als vorher?
    🙂



  • unstrukturiert halt...



  • in der praxis hat man es mit relativ vielen funktionen zu tun.
    würde man alle in eine datei packen, so würde man sich ab einer bestimmten anzahl den ganzen tag nen wolf scrollen.
    daher gruppiert man die funktionen thematisch und lagert sie in c-dateien aus.

    // MyMathFuncs.c
    int add ( int i, int j )
    {
        return i+j;
    }
    
    // MyMathFuncs.h
    #ifndef _MY_MATH_FUNCS_H_
    #define _MY_MATH_FUNCS_H_
    
    int add ( int i, int j );
    
    #endif // _MY_MATH_FUNCS_H_
    
    // main.c
    #include "MyMathFuncs.h"
    int main()
    {
    int result = add( 1, 1 );
    return 0;
    }
    

    das ist das allgemeine standardvorgehen.


Anmelden zum Antworten