2D Array auf andere 2D Arrays verteilen



  • Huhu,

    ich habe ein 2D Array voll mit daten:

    unsigned char HeightMap[256][256];
    

    nun jetzt möchte ich dieses Array auf andere gleinere Arrays aufteilen z.B. an solche hier:

    class TerrainPage
    {
    public:
          unsigned char HeightMapPage[16][16]
    }
    
    TerrainPage g_TerranPages[16];
    

    Wie kann ich nun g_TerranPages mit Daten aus HeightMap füllen? 😕



  • Mit einer Schleife. 🤡

    Etwas Eigeninitiative darf man doch wohl erwarten, oder?



  • ja schon aber ich hab den totalen blackout und weiss net wie ich diese schleife aufbauen soll damit ich alle 256x256 einträge an die 16x16 einträge des 16 einträge großen globalen arrays reinstopfe 😞



  • Probiers mal so (ungetestet):

    void FuelleBereich(int x, int y)
    {
    	for(int i = 0; i < 16; i++)
    		memcpy(HeightMapPage[i], HeightMap[i + y * 16] + x * 16, 16);
    }
    void VerteileAlles()
    {
    	for(int y = 0; y < 16; y++)
    		for(int x = 0; x < 16; x++)
    			FuelleBereich(x, y);
    }
    


  • Hi,

    ich hab mal was gecodet, doch das funzt leider nicht (Es kommt kein Text bei der Textausgabenschleife :()

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    char g_Array [4][2];
    
    class Klasse
    {
    public:
    	char eintraege [2][2];
    };
    
    Klasse Heightmap[2];
    
    int main (int argc, char* argv[])
    {
    	g_Array [0][1] = 'a';
    	g_Array [0][2] = 'b';
    	g_Array [1][1] = 'c';
    	g_Array [1][2] = 'd';
    	g_Array [2][1] = 'e';
    	g_Array [2][2] = 'f';
    	g_Array [3][1] = 'g';
    	g_Array [3][2] = 'h';
    
    	for (int HeightmapEintrag=0; HeightmapEintrag>2; HeightmapEintrag++)
    	{
    		for (int KlassenEintragX=0; KlassenEintragX>2; KlassenEintragX++)
    		{
    			for (int KlassenEintragY=0; KlassenEintragY>2; KlassenEintragX++)
    			{
    				Heightmap[HeightmapEintrag].eintraege[KlassenEintragX][KlassenEintragY] 
    				= g_Array [KlassenEintragX+HeightmapEintrag][KlassenEintragY+HeightmapEintrag];
    			}
    		}
    	}
    
    	for (int HeightmapEintrag=0; HeightmapEintrag>2; HeightmapEintrag++)
    	{
    		for (int KlassenEintragX=0; KlassenEintragX>2; KlassenEintragX++)
    		{
    			for (int KlassenEintragY=0; KlassenEintragY>2; KlassenEintragX++)
    			{
    
    			}
    		}
    	}
    
    	system ("pause"); // Ja ich weis kein Standard aber zum Testen
    
    	return 0;
    }
    

    woran kann das liegen? Also es wird kein einziger char ausgegeben



  • shit sorry, falscher code:

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    char g_Array [4][2];
    
    class Klasse
    {
    public:
    	char eintraege [2][2];
    };
    
    Klasse Heightmap[2];
    
    int main (int argc, char* argv[])
    {
    	g_Array [0][1] = 'a';
    	g_Array [0][2] = 'b';
    	g_Array [1][1] = 'c';
    	g_Array [1][2] = 'd';
    	g_Array [2][1] = 'e';
    	g_Array [2][2] = 'f';
    	g_Array [3][1] = 'g';
    	g_Array [3][2] = 'h';
    
    	for (int HeightmapEintrag=0; HeightmapEintrag>2; HeightmapEintrag++)
    	{
    		for (int KlassenEintragX=0; KlassenEintragX>2; KlassenEintragX++)
    		{
    			for (int KlassenEintragY=0; KlassenEintragY>2; KlassenEintragX++)
    			{
    				Heightmap[HeightmapEintrag].eintraege[KlassenEintragX][KlassenEintragY] 
    				= g_Array [KlassenEintragX+HeightmapEintrag][KlassenEintragY+HeightmapEintrag];
    			}
    		}
    	}
    
    	for (int HeightmapEintrag=0; HeightmapEintrag>2; HeightmapEintrag++)
    	{
    		for (int KlassenEintragX=0; KlassenEintragX>2; KlassenEintragX++)
    		{
    			for (int KlassenEintragY=0; KlassenEintragY>2; KlassenEintragX++)
    			{
    				cout << Heightmap[HeightmapEintrag].eintraege[KlassenEintragX][KlassenEintragY] << endl;
    			}
    		}
    	}
    
    	system ("pause");
    
    	return 0;
    }
    


  • Hast du meine VerteileAlles()-Funktion ausprobiert?



  • ja funzt aber net 😞



  • Es ist zwar kein C++ Design, aber bei mir klappt folgender Code:

    unsigned char HeightMap[256][256];
    
    struct
    {
    	unsigned char HeightMapPage[16][16];
    } TerrainPages[16][16];
    
    void FuelleBereich(int x, int y) 
    { 
        for(int i = 0; i < 16; i++) 
            memcpy(TerrainPages[y][x].HeightMapPage[i], HeightMap[i + y * 16] + x * 16, 16); 
    }
    void VerteileAlles() 
    { 
        for(int y = 0; y < 16; y++) 
            for(int x = 0; x < 16; x++) 
                FuelleBereich(x, y); 
    }
    


  • hmmm TerrainPages soll aber ein 1D array sein und kein 2D, wie ändere ich das nun am besten?



  • Rechne besser noch mal nach. 🙂

    HeightMap hat 256256 -> 65536 Bytes.
    TerrainPages hat bei mir 16*16*16
    16 -> 65536 Bytes.

    Wenn du TerrainPages 1-Dimensional haben willst, musst du 256 und nicht 16 Elemente verwenden.
    Dann musst du in meinem Code noch eine einzige Zeile anpassen. Welche und wie, darauf kommst du bestimmt. 🙂



  • Hi,

    bestimmt die hier:

    memcpy(TerrainPages[y][x].HeightMapPage[i], HeightMap[i + y * 16] + x * 16, 16);  
    
    // durch
    
    memcpy(TerrainPages[y].HeightMapPage[i], HeightMap[i + y * 16] + x * 16, 16);
    

    und halt beim Globalen Array die 2. Dimension entfernen, nur das funzt net 😞 der zeigt nix an 😞



  • Hier mal der ganze code:

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    /*
    char g_Array [4][2];
    
    class Klasse
    {
    public:
    	char eintraege [2][2];
    };
    
    Klasse Heightmap[2];
    */
    
    unsigned char HeightMap[256][256]; 
    
    struct 
    { 
        unsigned char HeightMapPage[16][16]; 
    } TerrainPages[16]; 
    
    void FuelleBereich(int x, int y)  
    {  
        for(int i = 0; i < 16; i++)  
            memcpy(TerrainPages[y].HeightMapPage[i], HeightMap[i + y * 16] + x * 16, 16);  
    } 
    
    void VerteileAlles()  
    {  
        for(int y = 0; y < 16; y++)  
            for(int x = 0; x < 16; x++)  
                FuelleBereich(x, y);  
    }
    
    int main (int argc, char* argv[])
    {
    	HeightMap [0][0] = 'a';
    	HeightMap [0][1] = 'b';
    	HeightMap [1][0] = 'c';
    	HeightMap [1][1] = 'd';
    	HeightMap [2][0] = 'e';
    	HeightMap [2][1] = 'f';
    	HeightMap [3][0] = 'g';
    	HeightMap [3][1] = 'h';
    
    /*	g_Array [0][1] = 'a';
    	g_Array [0][2] = 'b';
    	g_Array [1][1] = 'c';
    	g_Array [1][2] = 'd';
    	g_Array [2][1] = 'e';
    	g_Array [2][2] = 'f';
    	g_Array [3][1] = 'g';
    	g_Array [3][2] = 'h';
    
    	for (int HeightmapEintrag=0; HeightmapEintrag>2; HeightmapEintrag++)
    	{
    		for (int KlassenEintragX=0; KlassenEintragX>2; KlassenEintragX++)
    		{
    			for (int KlassenEintragY=0; KlassenEintragY>2; KlassenEintragX++)
    			{
    				Heightmap[HeightmapEintrag].eintraege[KlassenEintragX][KlassenEintragY] 
    				= g_Array [KlassenEintragX+HeightmapEintrag][KlassenEintragY+HeightmapEintrag];
    			}
    		}
    	}
    
    */
    
    	cout << TerrainPages[1].HeightMapPage[1][1]; // zeigt nur ein Leerzeichen an egal bei welchem eintrag :(
    
    	system ("pause");
    
    	return 0;
    }
    


  • *push*

    sorry in dem code hab ich die Funktion verteileAlles nicht aufgerufen aber auch wenn ich sie aufrufe passiert nix 😞 😞 😞 😞



  • 0=0 schrieb:

    Hi,

    bestimmt die hier:

    memcpy(TerrainPages[y][x].HeightMapPage[i], HeightMap[i + y * 16] + x * 16, 16);  
    
    // durch
    
    memcpy(TerrainPages[y].HeightMapPage[i], HeightMap[i + y * 16] + x * 16, 16);
    

    und halt beim Globalen Array die 2. Dimension entfernen, nur das funzt net 😞 der zeigt nix an 😞

    Bitte, versuch meinen Code zu verstehen. Das sollte echt nicht so schwer sein.

    Einfach die 2. Dimension zu entfernen ist Käse.
    Die 2. Dimension musst du manuell in die 1. einrechnen: TerrainPages[y * 16 + x]


Anmelden zum Antworten