Malloc auf Array? Globale Variablen?



  • Geo schrieb:

    @Holgie

    madys Beispiel ist nicht genau die Antwort auf deine Frage.

    Wenn du ein char Blubb[SIZE_A][SIZE_B] verwenden willst, musst du einfach

    char *Blubb = malloc( SIZE_A * SIZE_B);

    verwenden.
    wobei SIZE_A und SIZE_B hier Konstanten oder Variablen sein können.

    (und natürlich den Rückgabewert auf NULL testen)

    hmmm ... aber so ohne weiteres ist dann ein Zugriff auf das Array mit Blubb[x][y] aber nicht möglich. Von anderen Problemen mal abgesehen



  • Geo schrieb:

    @Holgie

    madys Beispiel ist nicht genau die Antwort auf deine Frage.

    Wenn du ein char Blubb[SIZE_A][SIZE_B] verwenden willst, musst du einfach

    char *Blubb = malloc( SIZE_A * SIZE_B);

    verwenden.
    wobei SIZE_A und SIZE_B hier Konstanten oder Variablen sein können.

    (und natürlich den Rückgabewert auf NULL testen)

    Das alloziiert aber keinen Speicher fuer 'Blubb[SIZE_A][SIZE_B]'

    mfg
    v R



  • Hab das Beispiel von PAD mal ausführlich nachvollzogen, da ich selbst auch immer den einfachen Weg gehe und jede Menge globale Variablen anlege.

    Hier das Beispiel von PAD zum direkten übernehmen: int iTest != global

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "MyClass.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    // *** Definition des Objekts "a" der Klasse TMyClass ***
    TMyClass a;
    
    // *** Funktions-Deklarationen ***
    void Function1( void );
    //void Function2( void );
    //...
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    // Setze Value direkt
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     a.setValue( StrToInt( Edit1->Text ) );
    }
    //---------------------------------------------------------------------------
    
    // Get Value
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     int b;
    
     b = a.getValue();
     Label1->Caption = IntToStr( b );
    }
    //---------------------------------------------------------------------------
    
    // Setze Value via Function1()
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
     Function1();
    }
    //---------------------------------------------------------------------------
    
    void Function1( void )
    {
     a.setValue( StrToInt( Form1->Edit1->Text ) + 5 );
    }
    //---------------------------------------------------------------------------
    

    Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            TButton *Button2;
            TButton *Button3;
            TLabel *Label1;
            TEdit *Edit1;
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Button2Click(TObject *Sender);
            void __fastcall Button3Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    MyClass.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "MyClass.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    // *** Definition des Konstruktors TMyClass ***
    __fastcall TMyClass::TMyClass( void )
    {
    }
    //---------------------------------------------------------------------------
    
    // *** Methodendefinitionen von TMyClass ***
    void __fastcall TMyClass::setValue( int val )
    {
     iTest = val;
    }
    //---------------------------------------------------------------------------
    
    // *** Methodendefinitionen von TMyClass ***
    __fastcall TMyClass::getValue( void )
    {
     return iTest;
    }
    //---------------------------------------------------------------------------
    

    MyClass.h

    //---------------------------------------------------------------------------
    
    #ifndef MyClassH
    #define MyClassH
    //---------------------------------------------------------------------------
    // *** Deklaration der Klasse TMyClass ***
    class TMyClass
    {
    private:
        // *** Eigenschaften ***
        int iTest;
    
    public:
        // *** Methoden ***
        void __fastcall setValue( int val );
        __fastcall getValue( void );
    
        // *** Konstruktor ***
        __fastcall TMyClass( void );
    };
    //---------------------------------------------------------------------------
    #endif
    

    Gruß WoWe



  • was heisst fuer dich != global?

    du hast fuer mich 2 globale variablen
    a und Form1
    Form1 muss wohl global sein, da es die VCL vorschreibt

    aber a??
    du hast i in eine klasse gesteckt und nennst es nun nicht mehr global.
    genau das ist aber bloedsinn.

    ich kann immer noch i veraendern wie ich will, ich muss zwar getter und setter verwenden, das ist ne spur besser als richtig global, aber immer noch verdammt mies.

    btw:

    __fastcall TMyClass::getValue( void )

    syntax fehler
    return value fehlt.

    und lass das void weg, in C++ schreibt man das nicht!

    btw: Function1() ist ne miese funktion mit seiteneffekten...



  • Hmm, also ich war mir sicher das diese Art richtig ist um "a" als globale Variable zu umgehen.

    Dann hab ich die Bitte an dich und korrigiere das Beispiel von mir so das es richtig ist (nicht nur für mich) !

    Gruß WoWe



  • machen wirs so:

    du gibts mir ein beispiel wo man deiner meinung nach eine globale variable verwenden muss und wir diskutieren es dann aus (wo die nachteile der globalen variablen liegen, wo die vorteile liegen, was man am design aendern koennte, etc).

    dein ganzes beispiel ist naehmlich n bisschen bloed.



  • Naja, dann nehmen wir einfach an, dass außer der Variable iTest mehrere Variablen in mehreren Funktionen über mehrere Formulare/Units gelesen und aktualisiert werden. Das sollte ja kein nutzbares Programm werden sondern nur ein Beispiel wie ich mit Variablen arbeiten kann ohne sie global anzulegen und dann mit extern drauf zugreifen.



  • ich wuerde sagen:
    MVC-Modell
    mit Observer-Pattern

    BTW:
    du solltest wirklich nicht die VCL verwenden, wenn du solchen code schreibst...

    globale variablen, funktionen mit seiteneffekten, code in den forumlaren,... (grausam)



  • hab ich was übersehen oder wieso tuts statt dem *** gehampel kein simples

    char* mspeicher =(char*)malloc(sizeof(char[20][40]));
    

    😕



  • dreaddy schrieb:

    hab ich was übersehen oder wieso tuts statt dem *** gehampel kein simples

    char* mspeicher =(char*)malloc(sizeof(char[20][40]));
    

    😕

    Weil Du dann immer noch nicht ohne weiteres mit mspeicher[x][y] auf die einzelnen Elemente zugreifen kannst.



  • Daniel E. schrieb:

    Dass diese 'globalen Variablen' (so etwas gibt es in C nicht) auch falsch eingesetzt werden können ist jetzt keine allzu atemberaubende Neuigkeit.

    hae? warum gibt es in C keine globalen Variablen? 😕



  • spitzenbleistift schrieb:

    Daniel E. schrieb:

    Dass diese 'globalen Variablen' (so etwas gibt es in C nicht) auch falsch eingesetzt werden können ist jetzt keine allzu atemberaubende Neuigkeit.

    hae? warum gibt es in C keine globalen Variablen? 😕

    Weil es im Standard keine Beschreibung für "globale Variablen" gibt. Aber es dürfte klar sein was damit gemeint ist, wenn von "globalen Variablen" die Rede ist...



  • mady schrieb:

    spitzenbleistift schrieb:

    Daniel E. schrieb:

    Dass diese 'globalen Variablen' (so etwas gibt es in C nicht) auch falsch eingesetzt werden können ist jetzt keine allzu atemberaubende Neuigkeit.

    hae? warum gibt es in C keine globalen Variablen? 😕

    Weil es im Standard keine Beschreibung für "globale Variablen" gibt. Aber es dürfte klar sein was damit gemeint ist, wenn von "globalen Variablen" die Rede ist...

    heisst das, dass laut Standard eine Definition ausserhalb einer Funktion illegal ist?



  • Nein. Aber das ist dann nicht global im Sinne von "überall sichtbar". (ich persönlich halte das allerdings für Haarspalterei)



  • spitzenbleistift schrieb:

    heisst das, dass laut Standard eine Definition ausserhalb einer Funktion illegal ist?

    int a; void f() {} int b;
    

    Sowohl a als auch b liegen außerhalb des Sichtbarkeitsbereiches von f. Ergo sind sie beide 'global'. Allerdings ist b in f unsichtbar. Man kann sich jetzt dazu hinreißen lassen, zu behaupten, a sei 'globaler' als b. Das ist optimalstes Dummdeutsch.


Anmelden zum Antworten