2D Array auf andere 2D Arrays verteilen



  • 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