Globale vs. Membervariablen (aufgeteilt aus: [Anfänger]: zweidimisionales Array an Funktion Übergeben.)


  • Mod

    @Finnegan: Entschuldigung, du hast recht; ich hatte mir den Text nicht nochmal ganz durchgelesen, sondern jeweils nur überflogen, um zu entscheiden, ob der jeweilige Text stehen bleiben soll oder nicht. Das nächste mal splitte ich gleich, gibt ja keinen Grund mir selber die Arbeit schwerer zu machen als sie sein müsste. Falls du deinen Beitrag in dem anderen Tread sehen möchtest, bitte ich dich, ihn nochmal zu posten. Mir ist nicht bekannt, dass einzelne Beiträge zwischen Threads verschoben werden könnten.



  • @camper: Kein Problem, der Thread begann schon eh sich zu weit vom eigntlichen Problem des Fragestellers wegzubewegen 😉



  • also der grund so auf globalen variablen herumzuhacken ist der, dass man sich irgendwann aus faulheit angewöhnt, nur noch damit zu arbeiten und der nächste, der dann im professionellen umfeld fehlerbereinigung machen darf, einen richtig dicken hals bekommt, weil das alles nicht so nachvollziehbar ist, wie es bei funktionsparametern wäre und das wird hier zu vermitteln versucht.
    manchmal lassen sich globale variablen unter c natürlich nicht vermeiden, aber das sind sonderfälle, bei denen sogar sepp zugibt, dass es nicht anders geht.

    zum "spielen" sind globale variablen, "var1" als variablenname, goto und was weiß ich noch alles natürlich super und auch sehr empfehlenswert, weil man mit sicherheit etwas dabei lernt (u.a. dass man den code nicht mehr versteht, wenn man ihn 3 wochen lang nicht angesehen hat), aber ansonsten gibts als quasi standard z.b. misra c mit verbot für globale variablen, goto und noch jeder menge anderen vorschriften bzw. empfehlungen und nach meinem wissen wird in jeder halbwegs professionellen firma verlangt, dass man danach arbeitet.

    auf membervariablen kann man übrigens im gegensatz zu globalen variablen nicht so einfach zugreifen - außer natürlich das objekt ist global angelegt. 😉


  • Mod

    Kommt doch mal von dem Membervariablen = globale Variablen weg. Dass ralros da Unsinn erzählt hat, sollte doch inzwischen klar sein. Und auch covfefes Idee mit dem static kann nur von jemandem stammen, der weder Membervariablen, noch das C-Speicherklassenmodell verstanden hat. Membervariable = Attribut eines structs. Alles andere was C++ bezüglich Klassen anbietet sind "nur" Hilfen für den Programmierer, die absolut nichts mit solch technischen Fragestellungen wie der Speicherklasse oder Lebensdauer zu tun haben.



  • covfefe schrieb:

    SeppJ schrieb:

    Es ist ja ok, Fragen zu stellen

    Sollte so sein, aber ich mache wohl irgendwas falsch. Wenn mir der globale Moderator schon sagt, dass er nicht diskutieren will, dann ist das hier nicht das richtige Forum für mich.

    Daher bitte ich darum, meinen Account zu löschen. Nicht böse gemeint, aber wir passen einfach nicht zusammen.

    alter, lass dich nicht von den typen mit 4-und mehrstelligen beitragszählern einschüchtern. die können ein bisschen was, aber zu 50% sind sie blender.

    ich kenne dieses forum schon sehr lange. ist schade was daraus geworden ist, aber das wird bestimmt schon wieder.

    btw, sepp ist hier gewissermaßen sowas wie ein autokrat. der erdogan dieses forums. der schmeißt einfach leute raus, die er nicht mag. falls du doch hier bleiben möchtest: leg dich nicht mit ihm an. ignoriere ihn einfach. geh auch nicht auf ihn ein, wenn er dich direkt anspricht. und vor allem: fordere nicht seine kompetenz heraus.

    deine frage war gut. sepp hatte nur eine ausweichende antwort aber er weiß genau, dass die korrekte antwort mit dem zusammenhängt, was er vorher verteufelt hat (static).



  • [quote="guest-666]
    btw, sepp ist hier gewissermaßen sowas wie ein autokrat. der erdogan dieses forums. der schmeißt einfach leute raus, die er nicht mag.[/Quote]

    Das ist ja auch seine Aufgabe. 🙄

    deine frage war gut. sepp hatte nur eine ausweichende antwort aber er weiß genau, dass die korrekte antwort mit dem zusammenhängt, was er vorher verteufelt hat (static).

    Static nimmt man für lokale Variablen, die über den Funktionsaufruf hinaus erhalten bleiben sollen, also z.b. Zählvariablen oder Variablen in Callback-Funktionen, aber doch nicht für Arrays, die irgendwo in main angelegt und dann in einer Funktion verwendet werden.



  • Wade1234 schrieb:

    Static nimmt man für lokale Variablen, die über den Funktionsaufruf hinaus erhalten bleiben sollen

    und ebenso für nicht-funktionsgebundene variablen, die nur innerhalb einer übersetzungseinheit sichtbar sein sollen. im weitesten sinn ein ersatz für das c++-schlüsselwort "private".


  • Mod

    guest-666 schrieb:

    Wade1234 schrieb:

    Static nimmt man für lokale Variablen, die über den Funktionsaufruf hinaus erhalten bleiben sollen

    und ebenso für nicht-funktionsgebundene variablen, die nur innerhalb einer übersetzungseinheit sichtbar sein sollen. im weitesten sinn ein ersatz für das c++-schlüsselwort "private".

    Der Sinn ist so weit weg, da muss erst interstellare Raumfahrt erfunden werden, um ihn zu finden. Selbst dann stehen die Chancen schlecht.

    Find dich damit ab, das ist Schwachfug, egal wie oft du ihn wiederholst oder wie oft du die Leute mit Durchblick beleidigst. Es ist einfach faktisch falsch, das ist unmittelbar ersichtlich.



  • guest-666 schrieb:

    Wade1234 schrieb:

    Static nimmt man für lokale Variablen, die über den Funktionsaufruf hinaus erhalten bleiben sollen

    und ebenso für nicht-funktionsgebundene variablen, die nur innerhalb einer übersetzungseinheit sichtbar sein sollen.

    Ja das stimmt. Wenn man globale Variablen als static deklariert, sind diese nur innerhalb der Datei sichtbar. Wann verwendet man globale Variablen? Wenn man z.B. eine Interrupt Service Routine programmiert, die keine Parameter übergeben bekommt, bei einem Mikrocontroller der in einer Weltraumsonde arbeiten soll und bei dem es dann auf jeden einzelnen Taktzyklus ankommt (Strom sparen) oder weil man in seinem Zimmerchen sitzt und zum Spaß programmiert.
    Wann verwendet man keine globalen Variablen? Immer dann, wenn es auch ohne geht und ganz besonders dann, wenn man Programmieren lernen will.

    im weitesten sinn ein ersatz für das c++-schlüsselwort "private".

    Im weitesten Sinne sind Äpfel auch ein Ersatz für Birnen.



  • Ich bin jetzt wahrlich kein C Profi - programmiere aber so aus Hobby damit.
    Aufgrund der Diskussion hier, habe ich mal ein wenig experimentiert:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    //
    typedef struct _MyStruct
    {
    	int str_var;
    	int *str_pnt;
    } MyStruct;
    //
    void ausg(int wert)
    {
    	printf("wert - Funktion = %p\n", &wert);
        printf("wert - Funktion = %i\n", wert);
        return;
    }
    //
    void test (int zahl,MyStruct *tst)
    {
    	printf("zahl - test = %p\n", &zahl);
    	if (tst == NULL)
    	{
    		zahl++;
    	}
    	else
    	{
    		tst->str_var = tst->str_var + 10;
    		zahl = tst->str_var;
    	}
        ausg (zahl);
        return;
    }
    //
    int main(void) 
    {
    	MyStruct *StructTest;
    //
    	StructTest = malloc(sizeof(StructTest));
    	StructTest->str_var = 50;
    	StructTest->str_pnt = &StructTest->str_var;
    //
        int variable = 5;
        int *pntvar = &variable;
        printf("pntvar - main = %p\n", pntvar);
    //
        test (*pntvar,NULL); // keine Chance auf was Globales
        printf("wert in pntvar - main = %i\n", *pntvar);
        test (variable,NULL);
        printf("variable - main = %i\n", variable);
    //
        test (*StructTest->str_pnt,NULL); // ebenfalls keine Chance mit struct Member
        test (StructTest->str_var,NULL);
        test (*StructTest->str_pnt,StructTest); // ab hier wirds "global" (gesamte struct)
        test (StructTest->str_var,StructTest); // Wenn das auch verboten ist, nenne ich mich ab heute Leo
        printf("str_var - main %d\n", (*StructTest).str_var); // :-)
        free(StructTest);
        return 0;
    }
    

    Was ab Zeile 53 gemacht wird, entspricht doch den "C-Regeln"? Und wenn ich diese Adresse an alle Funktionen weiterreiche, könnte man diese Variablen in dieser "struct" als "global" bezeichnen - oder ist das auch verboten? 😕



  • Den Unterschied zwischen "global" und global bemerkst du, wenn du das Ganze nochmal mit einer weitern Variable *MyStruct2 StructTest; machst.



  • global bedeutet, dass du MyStruct *StructTest außerhalb der Main anlegst und diese dann auch nicht als Parameter test übergibst, sondern dort direkt aufrufen kannst und das in jeder Funktion.



  • Wade1234 schrieb:

    guest-666 schrieb:

    btw, sepp ist hier gewissermaßen sowas wie ein autokrat. der erdogan dieses forums. der schmeißt einfach leute raus, die er nicht mag.

    Das ist ja auch seine Aufgabe. 🙄

    Ähh ... es ist seine Aufgabe, Leute rauszuschmeißen, die er nicht mag? Würde mich wundern ...


  • Mod

    Bitte beim Thema bleiben, anstatt Moderationsentscheidungen zu diskutieren. Einfache Mitleser in diesem Thread sehen nur, was ich stehen lies. Ihnen fehlen damit wesentliche Informationen zur Beurteilung von Moderationsentscheidungen. Da ich obigen Erdoganvergleich stehen lies, kann sich jeder mal selber ausmalen, was guest-666 wohl so verzapft haben mag, bevor ich ihn rausgeschmissen habe.

    Das ist das letzte, was dazu gesagt wurde, zurück zum Thema.


Anmelden zum Antworten