Zeiger auf Array in Klasse übergeben



  • Wenn du Arrays übergibst, übergibst du bereits Zeiger. Es werden keine Kopien des Arrays gemacht, d.h. die Änderungen SIND auch in main() wirksam. Und wenn du Arrays übergibst, solltest du die maxmale Länge des Arrays mitübergeben:

    #define MAX_LENGHT_X 20
    #define MAX_LENGHT_Y 25
    
    class MyClass
    {
    public:
        MyClass(){};
        void FirstFunc(int *nArray,unsigned dwFirstIndex,unsigned dwSecondIndex)
        {
            /*Macht irgendwas mit dem Array*/;
        }
        void SecondFunt(int *nArray,unsigned dwFirstIndex,unsigned dwSecondIndex)
        {
            /*Macht noch mehr mit dem Array*/;
        }
    }
    
    int main()
    {
        int map[MAX_LENGHT_X][MAX_LENGHT_Y]; // Lerres Array
        MyClass foo(); // Klasseninstanz
        foo.FirstFunc(map,MAX_LENGHT_X-1,MAX_LENGHT_Y-1); // Das Array wird geändert
        // Hier sind die Änderungen wirksam...
        foo.SecondFunc(map,MAX_LENGHT_X-1,MAX_LENGHT_Y-1); // Das Array wird NOCHMAL geändert
        // Hier sind die zweiten Änderungen auch wirksam...
        return 0;
    }
    

    Ich hoffe, ich konnte helfen.



  • Der aus dem Westen ... schrieb:

    #define MAX_LENGHT_X 20
    #define MAX_LENGHT_Y 25
    

    Pfui!
    Die Arraylängen mit zu übergeben ist zwar ein guter Tip, aber die Längen per #define festzulegen ist bestenfalls unschön. Das mag in C zwar so üblich sein, in C++ nimmt man aber Konstanten vom richtigen Typ.



  • Mach ich immer so - spart Speicher 😃
    Manche sagen, ich bin verrückt, dabei bin ich bloss Perfektionist.



  • ...in C++ nimmt man aber Konstanten vom richtigen Typ

    verträgt sich aber nicht damit: 🙂

    ... dabei bin ich bloss Perfektionist.



  • Wenn man Speicher sparen will, schon.
    Es kommt immer auf den Blickwinkel an. Was ist wichtiger, ein funktionierendes, schnelles und speichersparendes Program oder ein schöner, toller Code?



  • Ich stelle sogar die Warnstufe auf 4 und behandele jede Warnung als Fehler. Was willst du mehr?



  • Ich sage mal ein schnelles funktionierendes Programm mit schönen tollem (dem Standard entsprechenden) Code. 😉



  • Der aus dem Westen ... schrieb:

    Mach ich immer so - spart Speicher 😃
    Manche sagen, ich bin verrückt, dabei bin ich bloss Perfektionist.

    Das spart bei nem Int auf normalen Maschinen ganze 4 Byte Speicher. Von diversen Megabyte die dir zur Verfügung stehen. Dafür handelst du dir beim Debuggen fest einkompilierte Magic Numbers an Stelle von benannten Konstanten ein, verlierst die Typsicherheit die bei C++ eingebaut ist und läufst auf seltsame Fehler wenn die Textersetzung sich nicht ganz so verhält wie du es erwartest. Das hat mit Perfektionismus nicht viel zu tun. Vgl. auch Scott Meyers Effective C++, erstes Kapitel.



  • Du hast speicherschonend vergessen. Da siehst du, wie weit dieser Perfektionismus geht. Funktionalität kommt vor Schönheit.



  • Der aus dem Westen ... schrieb:

    Wenn man Speicher sparen will, schon.
    Es kommt immer auf den Blickwinkel an. Was ist wichtiger, ein funktionierendes, schnelles und speichersparendes Program oder ein schöner, toller Code?

    Ein funktionierendes, schnelles und speichersparendes Programm mit lesbarem, wartbarem und leicht debuggbarem Code. Die Konstanten werden im Release-Build eh in den Code reincompiliert, da gibts dann keinen Unterschied mehr.



  • Der aus dem Westen ... schrieb:

    Mach ich immer so - spart Speicher 😃
    Manche sagen, ich bin verrückt, dabei bin ich bloss Perfektionist.

    Das einzige, was Du machst, ist zu verhindern, daß die World.hpp mit

    #define MAX_LENGHT_X 20
    #define MAX_LENGHT_Y 25
    

    Screen.hpp mit

    #define MAX_LENGHT_X 80
    #define MAX_LENGHT_Y 25
    

    inkludieren kann.

    Ein kleines

    class MyClass
    {
    public:
       static int const MAX_LENGHT_X=20;
       static int const MAX_LENGHT_Y=25;
    

    verbraucht natürlich keinen Speicher.



  • Vielen Dank für die schnellen Antworten. 🙂

    Das Problem besteht jedoch weiterhin. 😞

    Ich muss das Array schon im Konstruktor übergeben und als Klassenattribut(Zeiger?) speichern. Das versuche ich, wie angegeben:

    MyEventReceiver(short *smap) {
    
    // Konstruktor
    
    }
    
    // in main():
    
    MyEventReceiver receiver(map);
    

    Dann meckert der Debugger jedoch.

    Konvertierung des Parameters 1 von 'short [12][15]' in 'short *' nicht möglich



  • Im zweiten Post steht doch, wie es richtig geht..



  • Der aus dem Westen ... schrieb:

    Wenn man Speicher sparen will, schon.

    Wechen Speicher?

    const int dings = 23;
    

    dings besitzt in diesem Fall "internal linkage" und solange Du den Adressoperator nicht drauf anwendest, muss ein Compiler für dings auch keinen Speicher reservieren. Die 23 kann der Compiler einfach überall da eingesetzt, wo dings steht -- wenn er es denn möchte.

    @th3AddY: Guck Dir nochmal meine erste Antwort an.

    Gruß,
    SP



  • Ah ok. Sry, ich hab da was übersehen. Jetzt funktioniert es auf jeden Fall. 🙂

    Vielen Dank. 😉


Anmelden zum Antworten