Dynamisches array und Templates



  • hi leute

    ich bin hier grad einfach mal so snake am nachprogrammieren und hab folgendes problem

    ich habe eine funktion(ein template) zum erzeugen des 2d arrays geschrieben

    template<class _T>		// erzeugt ein 2 dimensionales dynamsiches Array
    inline void Create2DField(_T** field, UINT x, UINT y)
    {
    	field = new _T*[x];
    	for(UINT i = 0; i < x; ++i)
    		field[i] = new _T[y];
    }
    

    das ist auch ganz gut und klappt

    aber wenn ich das array jez füllen möchte (auch eine template funktion)
    meint der geht nicht 8der fehler wenn man auf den falschen speicher zugreift)

    template<class _T>		// füllt eine 2 dimensionales Array mit 0
    inline void Fill2DField(_T** field, UINT x, UINT y, _T const& zahl = _T(0) )
    {
    	UINT i, j;
    	for(i = 0; i < x; ++i)
    	{
    		for(j = 0; j < y; ++j)
    		{
    			field[i][j] = zahl;
    		}
    	}
    }
    

    die funktionsaufrufe:

    void Snake::GameInit(int const& x, int const& y)
    {
    	this->zeile = x;               //zeile und spalte sind private member (beides unsigned int) der klasse Snake
    	this->spalte = y;
    
    	Create2DField(spielfeld, zeile, spalte);               // spielfeld => int **spielfeld;
    	Fill2DField(spielfeld, zeile, spalte, int(EMPTY));    // #define EMPTY 0
    

    eigendlich schriebe ich nicht ausserhalb der grenzend es arrays oder?



  • Wäre nett, wenn du uns ersteinmal die genaue Fehlermeldung zeigst 🙂



  • denk dir mal, das array wäre kein array sondern einfach nur ein zeiger auf int.
    deine funktion würde so aussehen:

    void create (int* i)
    {
       i = new int;
    }
    

    lösung (faustregel): verwende rückgabewerte, wenn du werte zurückgibst.



  • Visual C++ 2008 schrieb:

    Unbehandelte Ausnahme bei 0x00413ee8 in Snake.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcccccccc.

    ob array oder zeiger auf irgendwas
    ist in dem moment völlig egal
    ich brauch nur ein 2dimensionales array, dynamisch erzeugt, ohne STL, und das relativ schnell

    liegt das an den templates oder sosntwo?
    also eig sollte das da nicht dran liegen...

    aber da fällt mir grad noch was ein (bin ja shcon mehrmals mit dem debugmodus drüber gegangen)
    der hat den zeiger an die funktion "Create2DField" übergeben und das array wurde erzeugt, von da an war innerhalb der funktion der zeiger ganz ok und man konnte die werte auslesen(mit dem debugmodus von VC++ 2008)
    aber als der aus der funktion gesprungen ist war konnte der zeiger nicht merh ausgewertet werden...

    ach so meinst du das:

    template<class _T>
    _T& Create2DField(_T** liste, UINT x, UINT y)
    {
        // bla bla mit new und so erzeugen
        return &liste;
    }
    

    meinst du das so ungefähr?



  • Wie wär's mit T** Create2DField(UINT x, UINT y)?!



  • jop hab ich grad gemacht und es funktioniert -.-'

    naja hatte noch nicht viel mit mehrdimensionalen arrays zu tun die dynamisch waren, und es wird auch meistens nicht viel dazu geschrieben in büchern oder sonstwo

    (hab von ulrich breyman C++ einführung....: da wird das mal kurz auf enr halben seite erwähnt aber auch nicht so super dokumentiert, und wie man die an funktionen übergibt is auch wenig zu geschrieben)

    naja so klappts


Log in to reply