Ошибка сегментирования
Load3dsObject() , подскажите что я не так делаю, а то уже голова квадратная ::(...
Уже 2 дня пытаюсь найти ошибку и не могу.... :-(
вот код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/freeglut_std.h>
#include <string.h>
typedef struct
{
float x,y,z;
}vertex;
//MapCoord - for storing texture mapping coords
typedef struct
{
float u,v;
}mapcoord;
//The three ints for the polygon
//represent the no.s(or rank) of it's 3 vertices
typedef struct
{
int a,b,c;
}polygon;
typedef struct
{
char name[20];
int numVerts,numPolys;
vertex v[3000];
polygon p[3000];
mapcoord m[3000];
}object;
//vivod izobragenia na ekran
void mydisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
//smena perednego i zadnego buffera ekrana
glutSwapBuffers();
}
void Load3dsObject (object *obj, char *filename)
{
FILE *file; //Our file pointer
char temp; //Temporary char for reading name of object
short chunkID; //Stores ID of current chunk.
int chunkLength;
int fr;
fr=1;
short useless;
//Open our file for reading(r) and in binary mode(b)- "rb"
file=fopen (filename, "rb");
int i;
//While current position is lesser than the total length
while (fr==1)//ftell(file)!=EOF)//< filelength (fileno (file))
{
fread (&chunkID, 2, 1, file);
fread (&chunkLength, 4, 1,file);
switch (chunkID)
{
case 0x4d4d: //Skip these chunks
break;
case 0x3d3d:
break;
case 0x4000: //Chunk containing name
for(i=0;i<20;i++)
{
fread (&temp, 1, 1, file);
obj->name=temp;
if(temp == '\0')break;
}
break;
case 0x3f80: //Skip again
break;
case 0x4100:
break;
case 0x4110: //Chunk with num of vertices
//followed by their coordinates
fread (&obj->numVerts, sizeof (unsigned short), 1, file);
for (i=0; i<obj->numVerts; i++)
{
fread (&obj->v.x, sizeof(float), 1, file);
fread (&obj->v.y, sizeof(float), 1, file);
fread (&obj->v.z, sizeof(float), 1, file);
}
break;
case 0x4120: //Chunk with numPolys and
//the indices
fread (&obj->numPolys, sizeof (unsigned short), 1, file);
for (i=0; i<obj->numPolys; i++)
{
fread (&obj->p.a, sizeof (unsigned short), 1, file);
fread (&obj->p.b, sizeof (unsigned short), 1, file);
fread (&obj->p.c, sizeof (unsigned short), 1, file);
fread (&useless, sizeof (unsigned short), 1, file);
}
break;
case 0x4140: //Chunk with texture coords
fread (&useless, sizeof (unsigned short), 1, file);
for (i=0; i<obj->numVerts; i++)
{
fread (&obj->m.u, sizeof (float), 1, file);
fread (&obj->m.v, sizeof (float), 1, file);
fr=0;
}
break;
default:
fseek(file,chunkLength-6, SEEK_CUR);
}
}
fclose (file);
}
int main(int argc, char* argv[])
{
object * pobject;
char *fname;// ="/home/docent/developing/opengl/my.3ds";
fname="my.3ds";
printf("File name: %s \n", fname);
Load3dsObject(pobject, fname);
glutInit(&argc, argv);
//zadaem parametri okna
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
//zadaem razmeri okna
glutInitWindowSize(640,480);
//zadaem poziciu okna
glutInitWindowPosition(100,100);
//sozdaem okno
glutCreateWindow("My Engine");
glClearColor(0.5,0.5,0.75,1);
//zadaem funciu obratnogo vizova izobragenia na ekran
glutDisplayFunc(mydisplay);
glutMainLoop();
return 0;
}
#include <stdlib.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/freeglut_std.h>
#include <string.h>
typedef struct
{
float x,y,z;
}vertex;
//MapCoord - for storing texture mapping coords
typedef struct
{
float u,v;
}mapcoord;
//The three ints for the polygon
//represent the no.s(or rank) of it's 3 vertices
typedef struct
{
int a,b,c;
}polygon;
typedef struct
{
char name[20];
int numVerts,numPolys;
vertex v[3000];
polygon p[3000];
mapcoord m[3000];
}object;
//vivod izobragenia na ekran
void mydisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
//smena perednego i zadnego buffera ekrana
glutSwapBuffers();
}
void Load3dsObject (object *obj, char *filename)
{
FILE *file; //Our file pointer
char temp; //Temporary char for reading name of object
short chunkID; //Stores ID of current chunk.
int chunkLength;
int fr;
fr=1;
short useless;
//Open our file for reading(r) and in binary mode(b)- "rb"
file=fopen (filename, "rb");
int i;
//While current position is lesser than the total length
while (fr==1)//ftell(file)!=EOF)//< filelength (fileno (file))
{
fread (&chunkID, 2, 1, file);
fread (&chunkLength, 4, 1,file);
switch (chunkID)
{
case 0x4d4d: //Skip these chunks
break;
case 0x3d3d:
break;
case 0x4000: //Chunk containing name
for(i=0;i<20;i++)
{
fread (&temp, 1, 1, file);
obj->name=temp;
if(temp == '\0')break;
}
break;
case 0x3f80: //Skip again
break;
case 0x4100:
break;
case 0x4110: //Chunk with num of vertices
//followed by their coordinates
fread (&obj->numVerts, sizeof (unsigned short), 1, file);
for (i=0; i<obj->numVerts; i++)
{
fread (&obj->v.x, sizeof(float), 1, file);
fread (&obj->v.y, sizeof(float), 1, file);
fread (&obj->v.z, sizeof(float), 1, file);
}
break;
case 0x4120: //Chunk with numPolys and
//the indices
fread (&obj->numPolys, sizeof (unsigned short), 1, file);
for (i=0; i<obj->numPolys; i++)
{
fread (&obj->p.a, sizeof (unsigned short), 1, file);
fread (&obj->p.b, sizeof (unsigned short), 1, file);
fread (&obj->p.c, sizeof (unsigned short), 1, file);
fread (&useless, sizeof (unsigned short), 1, file);
}
break;
case 0x4140: //Chunk with texture coords
fread (&useless, sizeof (unsigned short), 1, file);
for (i=0; i<obj->numVerts; i++)
{
fread (&obj->m.u, sizeof (float), 1, file);
fread (&obj->m.v, sizeof (float), 1, file);
fr=0;
}
break;
default:
fseek(file,chunkLength-6, SEEK_CUR);
}
}
fclose (file);
}
int main(int argc, char* argv[])
{
object * pobject;
char *fname;// ="/home/docent/developing/opengl/my.3ds";
fname="my.3ds";
printf("File name: %s \n", fname);
Load3dsObject(pobject, fname);
glutInit(&argc, argv);
//zadaem parametri okna
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
//zadaem razmeri okna
glutInitWindowSize(640,480);
//zadaem poziciu okna
glutInitWindowPosition(100,100);
//sozdaem okno
glutCreateWindow("My Engine");
glClearColor(0.5,0.5,0.75,1);
//zadaem funciu obratnogo vizova izobragenia na ekran
glutDisplayFunc(mydisplay);
glutMainLoop();
return 0;
}
Как вариант,
Код:
object *pobject=new object;
Плюс к этому нужно либо обнулять memset (pobject, 0, sizeof *pobject), либо в конструкторе поля numVerts и numPolys обнулить. Это правильный подход в общем случае, а в данном конкретном Вы, к тому же, читаете в эти поля по 2 байта, а размером они по 4.
Цитата: loki231
pobject не инициализирован.
Как вариант,
Плюс к этому нужно либо обнулять memset (pobject, 0, sizeof *pobject), либо в конструкторе поля numVerts и numPolys обнулить. Это правильный подход в общем случае, а в данном конкретном Вы, к тому же, читаете в эти поля по 2 байта, а размером они по 4.
Как вариант,
Код:
object *pobject=new object;
Плюс к этому нужно либо обнулять memset (pobject, 0, sizeof *pobject), либо в конструкторе поля numVerts и numPolys обнулить. Это правильный подход в общем случае, а в данном конкретном Вы, к тому же, читаете в эти поля по 2 байта, а размером они по 4.
Это же С, на не С++! Тут нет new. Надо писать:
Код:
object *pobject = malloc(sizeof(object));