Fredrik90 Skrevet 2. september 2005 Skrevet 2. september 2005 Hei Har et problem som jeg ikke finner en løsning på, programmet kompilerer helt fint men stopper her: float FTerrain::Get_Height(int x, int z) { return (HeightMap.Mapdata[x + HeightMap.Size * z] * scale); } Her er resten av hva jeg gjør med HeightMap.Mapdata HeightMap.Mapdata = new unsigned char[HeightMap.Size * HeightMap.Size]; fread(&HeightMap.Mapdata, 1, sizeof(HeightMap.Size * HeightMap.Size), filepointer) og så tester jeg at det er data der. Håper på svar, Takk.
JBlack Skrevet 2. september 2005 Skrevet 2. september 2005 Det er umulig å svare sikkert på, men tradisjonelt er at x og/eller z blir for høy, for eksempel at funksjonen kalles med z lik HeightMap.Size, mens maks verdi for å ikke gå utenfor tabellen er HeightMap.Size-1.
hishadow Skrevet 2. september 2005 Skrevet 2. september 2005 fread(&HeightMap.Mapdata, 1, sizeof(HeightMap.Size * HeightMap.Size), filepointer) prøv i stedet: fread(&HeightMap.Mapdata, 1, HeightMap.Size * HeightMap.Size, filepointer) sizeof(HeightMap.Size * HeightMap.Size) returnerer størrelsen på datatypen, ikke innholdet. Også.. float FTerrain::Get_Height(int x, int z) er grei ut, men hva skjer før denne kalles?
Fredrik90 Skrevet 3. september 2005 Forfatter Skrevet 3. september 2005 (endret) Takker for svar. Men er kommet en ny feil. har nesten skrivd av en tutorial og der får jeg ikke feil. men det får jeg i mitt progr. se her (Mitt): void FTerrain::Calculate_TerrainMesh() { int i = 0, c = 0, t = 0; if(Vertex) delete[] Vertex; /*her kommer feilen ikke under kompilering men under kjøring*/ if(Normal) delete[] Normal; if(TexCord) delete[] TexCord; int size = ((HeightMap.Size - 1) * (HeightMap.Size - 1) * 6) * 3; int tSize = ((HeightMap.Size - 1) * (HeightMap.Size - 1) * 6) * 2; Vertex = new float[size]; TexCord = new float[tSize]; Normal = new float[tSize]; for(int x = 0; x < HeightMap.Size -1; x++) { for( int z = 0; z < HeightMap.Size -1; z++) { float left = (float)x / HeightMap.Size; float right = ((float)x + 1) / HeightMap.Size; float bottom = (float)z / HeightMap.Size; float top = (float)(z + 1) / HeightMap.Size; //Vertex 1 Vertex[i++] =(float) x; Vertex[i++] = Get_Height(x, z); Vertex[i++] =(float) z; TexCord[t++] = left; TexCord[t++] = bottom; totvert++; //Vertex 2 Vertex[i++] =(float) x; Vertex[i++] = Get_Height(x, z + 1); Vertex[i++] =(float) z + 1; TexCord[t++] = left; TexCord[t++] = top; totvert++; //Vertex 3 Vertex[i++] =(float) x + 1; Vertex[i++] = Get_Height(x + 1, z); Vertex[i++] =(float) z; TexCord[t++] = right; TexCord[t++] = bottom; totvert++; //Vertex 4 Vertex[i++] =(float) x + 1; Vertex[i++] = Get_Height(x + 1, z); Vertex[i++] =(float) z; TexCord[t++] = right; TexCord[t++] = bottom; totvert++; //vertex 5 Vertex[i++] =(float) x + 1; Vertex[i++] = Get_Height(x + 1, z + 1); Vertex[i++] =(float) z + 1; TexCord[t++] = right; TexCord[t++] = top; totvert++; //Vertex 6 Vertex[i++] =(float) x; Vertex[i++] = Get_Height(x, z + 1); Vertex[i++] =(float) z + 1; TexCord[t++] = left; TexCord[t++] = top; totvert++; } } } og her er tutorialen: { // Index counters. int i = 0, c = 0, t = 0; if(m_color) delete[] m_color; if(m_vertex) delete[] m_vertex; if(m_texCoords) delete[] m_texCoords; m_totalVerts = 0; m_totalTriangles = 0; //Sizes we need for the points/color and tex coords. int size = ((m_heightMap.size - 1) * (m_heightMap.size - 1) * 6) * 3; int tSize = ((m_heightMap.size - 1) * (m_heightMap.size - 1) * 6) * 2; // Create enough space for all vertex points and their colors. m_vertex = new float[size]; m_color = new float[size]; m_texCoords = new float[tSize]; // Loop through and generate a grid. Use the height map // when setting the Y to create the terrain mesh. Create 2 triangles // each iteration. for(int z = 0; z < m_heightMap.size - 1; z++) { for(int x = 0; x < m_heightMap.size - 1; x++) { // Calculate texture coords for these tris. float left = (float)x / m_heightMap.size; float right = ((float)x + 1) / m_heightMap.size; float bottom = (float)z / m_heightMap.size; float top = (float)(z + 1) / m_heightMap.size; // V1. m_texCoords[t++] = left; m_texCoords[t++] = bottom; m_color[c++] = GetHeight(x, z); m_color[c++] = GetHeight(x, z); m_color[c++] = GetHeight(x, z); m_vertex[i++] = x; m_vertex[i++] = GetScaledHeight(x, z); m_vertex[i++] = z; m_totalVerts++; // V2. m_texCoords[t++] = left; m_texCoords[t++] = top; m_color[c++] = GetHeight(x, z + 1); m_color[c++] = GetHeight(x, z + 1); m_color[c++] = GetHeight(x, z + 1); m_vertex[i++] = x; m_vertex[i++] = GetScaledHeight(x, z + 1); m_vertex[i++] = z + 1; m_totalVerts++; // V3. m_texCoords[t++] = right; m_texCoords[t++] = bottom; m_color[c++] = GetHeight(x + 1, z); m_color[c++] = GetHeight(x + 1, z); m_color[c++] = GetHeight(x + 1, z); m_vertex[i++] = x + 1; m_vertex[i++] = GetScaledHeight(x + 1, z); m_vertex[i++] = z; m_totalVerts++; // V4. m_texCoords[t++] = right; m_texCoords[t++] = bottom; m_color[c++] = GetHeight(x + 1, z); m_color[c++] = GetHeight(x + 1, z); m_color[c++] = GetHeight(x + 1, z); m_vertex[i++] = x + 1; m_vertex[i++] = GetScaledHeight(x + 1, z); m_vertex[i++] = z; m_totalVerts++; // V5. m_texCoords[t++] = right; m_texCoords[t++] = top; m_color[c++] = GetHeight(x + 1, z + 1); m_color[c++] = GetHeight(x + 1, z + 1); m_color[c++] = GetHeight(x + 1, z + 1); m_vertex[i++] = x + 1; m_vertex[i++] = GetScaledHeight(x + 1, z + 1); m_vertex[i++] = z + 1; m_totalVerts++; // V6. m_texCoords[t++] = left; m_texCoords[t++] = top; m_color[c++] = GetHeight(x, z + 1); m_color[c++] = GetHeight(x, z + 1); m_color[c++] = GetHeight(x, z + 1); m_vertex[i++] = x; m_vertex[i++] = GetScaledHeight(x, z + 1); m_vertex[i++] = z + 1; m_totalVerts++; m_totalTriangles += 2; } } // Convert between 0 and 1. for(int k = 0; k < size; k++) { if(m_color[k] != 0) m_color[k] /= 255; } } Vertex hos meg og m_vertex er blitt gjort helt likt tidligere i programmet. mvh. Fredrik Endret 3. september 2005 av Fredrik90
A_N_K Skrevet 3. september 2005 Skrevet 3. september 2005 Hvis du følger en tutorial hadde det kanskje vært en idé å bit for bit teste programmet ditt i forhold til originalkoden, for å finne ut hvor det klikker? Bare en tanke ...
hishadow Skrevet 3. september 2005 Skrevet 3. september 2005 (endret) if(Vertex) delete[] Vertex; /*her kommer feilen ikke under kompilering men under kjøring*/ .. sjekk i konstruktøren til klassen at disse attributtene (Vertex, Normal, TexCoord) blir satt til NULL. Hvis de ikke blir satt til NULL så vil de inneholde en tilfeldig verdi (fordi c++ ikke tilegner nyopprettede attributter/variabler en standard verdi) og if testen vil føre til at et ugyldig minneområde blir forsøkt slettet. Endret 3. september 2005 av hishadow
Fredrik90 Skrevet 3. september 2005 Forfatter Skrevet 3. september 2005 er blitt satt, og det er float *vertex; er blitt satt til null og tester at det ikke er data der tidligere.
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå