Gå til innhold

C++ pointer error


Anbefalte innlegg

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
Videoannonse
Annonse
	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

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 av Fredrik90
Lenke til kommentar

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 av hishadow
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...