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


  • Mod

    covfefe schrieb:

    In C ist Modularisierung über einzelne Dateien möglich. Mittels 'static' erhältst du dateiglobale Variablen, die in anderen Dateien nicht sichtbar sind. Das kann auch nicht mit 'extern' umgangen werden.

    Das finde ich sehr nützlich.

    In C sind ist vor allem das Konzept von Membervariablen genau wie in C++ möglich und auch die übliche Art und Weise C zu programmieren. Ganz ohne static, extern oder solchen Quatsch, der damit nichts zu tun haben sollte.



  • SeppJ schrieb:

    In C sind ist vor allem das Konzept von Membervariablen genau wie in C++ möglich

    Du meinst Strukturen? Da musst du aber immer einen Zeiger herumreichen. In C++ geht das automatisch.


  • Mod

    covfefe schrieb:

    SeppJ schrieb:

    In C sind ist vor allem das Konzept von Membervariablen genau wie in C++ möglich

    Du meinst Strukturen? Da musst du aber immer einen Zeiger herumreichen. In C++ geht das automatisch.

    Und? Trotzdem besteht technisch kein Unterschied. Deswegen ist das ganze Gelaber hier im Thread, dass Membervariablen in C++ global wären, oder dass man das Äquivalent von Membervariablen in C durch static nachbauen könne, allesamt absoluter Blödsinn. C++ ist in dieser Hinsicht nur Syntaxzucker für die sowieso in C übliche Art und Weise, Objektorientierung umzusetzen. Und umgekehrt gibt es keinen Grund, in C zu komischen Methoden zu greifen, um Objektorientierung zu verwirklichen, wenn es eine gute, bewährte und übliche Art und Weise gibt, das zu machen!



  • ... gelöscht ...


  • Mod

    covfefe schrieb:

    SeppJ schrieb:

    Und umgekehrt gibt es keinen Grund, in C zu komischen Methoden zu greifen, um Objektorientierung zu verwirklichen, wenn es eine gute, bewährte und übliche Art und Weise gibt, das zu machen!

    Was wäre das Äquivalent zu den C++-Zugriffsmodifikatoren 'private' und 'public' in C? Wie macht man das auf die übliche Art?

    Gar nicht, da es die Zugriffsmodifikatoren auch reiner Syntaxzucker sind, der überhaupt gar keine Bedeutung im späteren Programm hat.

    Worauf willst du eigentlich hinaus? Wenn du schon einmal gesehen hast, wie man C programmiert, dann wüsstest du all dies. Und wenn du es noch nie gesehen hast, wieso diskutierst du hier dann herum, anstatt es zu lernen? Ich habe gerade leider sehr den Eindruck, dass es dir irgendwie eher darum geht, Internetpunkte zu sammeln, anstatt dich selber zu verbessern.



  • SeppJ schrieb:

    Worauf willst du eigentlich hinaus? Wenn du schon einmal gesehen hast, wie man C programmiert, dann wüsstest du all dies. Und wenn du es noch nie gesehen hast, wieso diskutierst du hier dann herum, anstatt es zu lernen? Ich habe gerade leider sehr den Eindruck, dass es dir irgendwie eher darum geht, Internetpunkte zu sammeln, anstatt dich selber zu verbessern.

    Tut mir leid. Ich wollte dich nicht ärgern. Ich weiß auch gar nicht was Internetpunkte sind.

    Ich ziehe hiermit die Frage zurück. War dumm von mir. Ich hätte auch selber googeln können.

    Nichts für Ungut.


  • Mod

    Es ist ja ok, Fragen zu stellen, aber ich hatte schwer den Eindruck, als wolltest du die Antwort gar nicht wirklich wissen, sondern - metaphorisch gesprochen - dein Revier markieren.



  • 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.



  • covfefe schrieb:

    Sollte so sein, aber ich mache wohl irgendwas falsch.

    Ja. Schaut nämlich so verdächtig nach Trollerei aus, dass es keinen Sinn hat, zu diskutieren. Und es ist Aufgabe der Mods, sowas aufzuräumen.



  • Finnegan schrieb:

    ralros schrieb:

    in C++ wäre es eine Member-Variable

    Es sei noch kurz angemerkt dass ich es so kenne, [...]

    bezüglich Split: Auch wenn ich hier ein bisschen mehr zitiert habe, als ich eigentlich wollte, möchte ich meinen Beitrag nicht als Teil der Diskussion um "Globale vs. Membervariablen" verstanden wissen.
    Es ging mir hauptsächlich darum hervorzuheben, dass der Compiler der Arduino-Entwicklungsumgebung ein C++-Compiler ist. Das wird scheinbar oft übersehen, was ein wenig Schade ist, da gerade
    das Arduino-Ökosystem ein schönes Beispiel dafür ist, dass die begrenzten Ressourcen von Mikrocontroller-Umgebeungen kein Argument gegen C++ sein müssen.


  • 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? 😕


Anmelden zum Antworten