mehrdimensionale arrays als funktionsergebnis



  • Hallo!

    Ich muss jede Menge 2-dimensionale Feld zusammen stellen, die gleichartig strukturiert sind, sich somit gut in eine funktion auslagern lassen.

    In einem Untergramm verwende ich einen vektor:

    double vek[3][3]
    

    dieser soll in abhängigkeit von 2 parametern (int) mittels einem anderen unterprogramm belegt werden

    vek=create_vek(i,k)
    

    wie muss mein unterprogramm aussehen? wie rufe ich es auf? ich kenne die problematik mit zeigern und arrays...

    ich stelle es mir etwa so vor...

    double createvek[3][3](int i, int k)
    

    Aber wie gesagt... als rückgabewert dieser funktion sollte ja wieder eine [3][3]Matrix stehen...

    schon mal Danke im vorraus

    Micha



  • Wo genau hast du denn ein Problem?

    Hier mal was zum rumspielen. Vielleicht wird es so etwas klarer.. 🙄

    #include <iostream>
    
    int* make_vec ( int x, int y)
    {
    	int nr = 0;
    	int* v = new int[x*y];
    
    	for (int i (0); i < x; i++)
    		for (int j (0); j < y; j++)
    			v[i*y+j] = nr++;
    
    	return v;
    }
    
    void all_out (int* a, int x, int y)
    {
    	for (int i (0); i < x; i++)
    		for (int j (0); j < y; j++)
    			std::cout << a[i*y+j] << std::endl;
    }
    
    void out (int* a, int y, int posx, int posy)
    {
    	std::cout << a[posx*y+posy] << std::endl;
    }
    
    int main(void)
    {
    
    	int* k = make_vec (3, 3); 
    
    	all_out (k, 3, 3);
    
    	std::cout << "Nr. 0:1: ";
    	out (k, 3, 0, 1);
    
    	delete[] k;
    return 0;
    }
    

  • Mod

    Michaaaaaaaa schrieb:

    ich stelle es mir etwa so vor...

    double createvek[3][3](int i, int k)
    

    Wenn überhaupt, so müsste es wohl

    double createvek(int i, int k)[3][3]
    

    heißen. Allerdings darf der Rückgabetyp einer Funktion kein Array sein, dass ist also illegal.

    Hier bietet sich tr1::array bzw. boost::array.

    typedef std::tr1::array<std::tr1:array<double,3>,3> vek;
    

    ==>

    vek createvek(int i, int k);
    

    Da die Dimensionen bekannt sind, gibt es keine guten Grund, kreativ mit Zeigern umzugehen: das dürfte auch ineffizient sein.



  • danke!

    ich werde mal ein wenig dran rumbasteln

    Michael



  • Da die Dimensionen bekannt sind, gibt es keine guten Grund, kreativ mit Zeigern umzugehen: das dürfte auch ineffizient sein.

    Ja. Das stimmt schon. Aber ist sicher auch noch empfehlenswert, wenn man die sonstige Arbeitsweise ein bisschen kennenlernt. Mit sehr grosser Wahrscheinlichkeit wird er das auch mal machen müssen, ohne zu wissen, wie gross das Array ist.


Anmelden zum Antworten