Fredrik90 Skrevet 2. september 2005 Del 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. Lenke til kommentar
JBlack Skrevet 2. september 2005 Del 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. Lenke til kommentar
hishadow Skrevet 2. september 2005 Del 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? Lenke til kommentar
Fredrik90 Skrevet 3. september 2005 Forfatter Del 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 Lenke til kommentar
A_N_K Skrevet 3. september 2005 Del 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 ... Lenke til kommentar
hishadow Skrevet 3. september 2005 Del 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 Lenke til kommentar
Fredrik90 Skrevet 3. september 2005 Forfatter Del 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. Lenke til kommentar
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å