Mit Suche nichts gefunden: Konstante Referenz auf ein Array zurückliefern



  • Hallo,

    es muss

    const unsigned int* array = GetArray();
    

    heissen.

    mfg
    v R



  • Ok danke soweit. Wie funktioniert das bei zweidimensionalen arrays? Wie man diese an eine Funktion übergibt weiß ich, aber nicht wie man eine Referenz auf sie bekommt.

    unsigned int Array[20][20];
    
    const unsigned int* GetAddress()
    {
    
    	return((&Array)[20][20]);
    }
    
    int main()
    {
    	const unsigned int *bla = GetAddress();
    
    	cout<<bla[0]<<endl;
    
    	system("pause");
    	return(0);
    }
    

    So gehts, aber ich will ja bla[0][5] sagen können, was aber verweigert wird:

    "error C2109: Index benoetigt ein Feld oder einen Zeigertyp".

    Sicher ist GetAdresse murks, aber ich weiß nicht wie das geht 😞



  • So, es klappt gar nichts mehr. Ich bitte um eine kleine Musterlösung.

    es gibt zwei Array:

    unsigned int Array[20];
    unsigned int ArrayZwei[20][20];
    

    Diese Arrays sind in einer Klasse und weil sie nicht verändert werden dürfen will ich nur das eine konstante Referenz zurückgeliefert wird, also 2 Methoden und die erste liefert für Array eine konstante Referenz zurück, die zweite für ArrayZwei.

    Dann soll es 2 Funktionen geben, die erste akzeptiert eine konstante Referenz auf ein unsigned int Array[20], die zweite auf ein unsigned int Array[20][20], so das ich in den Funktionen wieder mit den Arrays arbeiten kann (aber halt nur darauf zugreifen).

    Ich packs nicht 🙄 😞



  • Hallo,

    wie wärs wenn du die Array's kapselst in eine Struktur oder Klasse.
    Das würde eine Menge vereinfachen.

    struct Address {
    	unsigned int arr[20][20];
    } Array;
    
    const Address& GetAddress()
    {
    	return Array;
    }
    
    int main(int argc, char* argv[])
    {
    	const Address& addr = GetAddress();
    
    	printf("%d\r\n", addr.arr[10][10]);
    
    	return 0;
    }
    


  • Bei der Suche hab ich das auch schon gesehen, mir wäre aber lieber wenn es anders ginge.



  • fyi: arrays werden in c++ per reference übergeben. sprich du kannst einfach mit normalen zeigern arbeiten, womit du dir dann einiges an komplizierter syntax sparst. (falls dir das was hilft)



  • Wie gesagt ich bekomms nicht hin (und hab gerade schon die gesamte andere Arbeit erledigt die noch anstand), ich kann nicht weitermachen 😃

    Es wäre sehr nett wenn mir da eben jemand hilft.



  • Bei dem eindimensionalen Array hab ich folgendes versucht (vielleicht seht ihr ja was falsch ist?):

    In der Klasse

    inline const unsigned int* GetArray(){ return((&Array)[20]); };
    

    Die Zuweisung

    const unsigned int *array = Klasse->GetArray();
    

    Die Verwendung:

    for(int i=0; i<20; i++)
    			 cout<<array[i]<<endl;
    

    Und hier stürzt das Programm schon bei i=0 ab.



  • class myClass
    {
    private:
        int array[10];
    public:
        const int *getArray()
        {
            return static_cast<const int*>(array);
        }
    };
    
    myClass inst;
    const int *array = inst.getArray();
    

    beantwortet das deine frage?



  • Ja, vielen Dank. Aber es wirft eine neue Frage auf:

    Ich weiß was static_cast macht, aber nicht wie ich dein Beispiel jetzt auf zweidimensionale Arrays übertrage:

    Korbinian schrieb:

    class myClass
    {
    private:
        int array[10][10];
    public:
        const int *getArray()
        {
         // ???
        }
    };
    
    myClass inst;
    const int *array = inst.getArray();
    

    Wenn du mir da noch hilfst geb ich für heute Ruh' 🤡 😋



  • const int **getArray()
    {
        return static_cast<const int **>(array);
    }
    
    const int **array = inst.getArray();
    

    doppelte sternchen, weils ein 2dimensionales array ist(alternativ: [][]) der cast wandelt den typ um. static cast sollte hier genügen (aber das wissen hier andere besser als ich :). für andere casts siehe faq.



  • Klappt noch nicht ganz, müssen die Indexe gleich groß sein?

    inline const unsigned int** GetArray(){ return static_cast<const unsigned int**>(array); };
    

    wobei array ein

    unsigned int array[4][10];
    

    ist.

    **
    'static_cast' : 'unsigned int [4][10]' kann nicht in 'const unsigned int ** ' konvertiert werden
    **



  • hm 🙂 zugegeben, ich hab mein zeuch nicht kompiliert...
    versuchs mal einfach mit einem sternchen statt zwei. sollte eigentlich auch gehen



  • Leider nicht 😞

    'static_cast' : 'unsigned int [4][10]' kann nicht in 'const unsigned int *' konvertiert werden
    


  • Korbinian schrieb:

    doppelte sternchen, weils ein 2dimensionales array ist

    Es gibt keine zweidimensionalen Arrays in C++, es gibt nur untereinander inkompatible Varianten, sie zu simulieren.



  • hm, dann fällt mir nur noch ein, ein 1dimensionales zu nehmen, und entsprechend die indexoperation selber vorzunehmen, á la [X*x + y]


Anmelden zum Antworten