Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка сегментирования

64K
20 ноября 2010 года
smasher
1 / / 20.11.2010
Люди помогите пожалуйста , пробую писать на С в линуксе, компилируется всё ок, а при запуске выдаёт в консоль мол ошибка сегментации в функции
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;

}
43K
20 ноября 2010 года
loki231
76 / / 27.09.2009
pobject не инициализирован.

Как вариант,

 
Код:
object *pobject=new object;


Плюс к этому нужно либо обнулять memset (pobject, 0, sizeof *pobject), либо в конструкторе поля numVerts и numPolys обнулить. Это правильный подход в общем случае, а в данном конкретном Вы, к тому же, читаете в эти поля по 2 байта, а размером они по 4.
399
20 ноября 2010 года
KIV
432 / / 20.01.2009
Цитата: loki231
pobject не инициализирован.

Как вариант,

 
Код:
object *pobject=new object;


Плюс к этому нужно либо обнулять memset (pobject, 0, sizeof *pobject), либо в конструкторе поля numVerts и numPolys обнулить. Это правильный подход в общем случае, а в данном конкретном Вы, к тому же, читаете в эти поля по 2 байта, а размером они по 4.


Это же С, на не С++! Тут нет new. Надо писать:

 
Код:
object *pobject = malloc(sizeof(object));
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог