Форум программистов, компьютерный форум CyberForum.ru

не пойму из-за чего Access violation - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Формулы http://www.cyberforum.ru/cpp-beginners/thread910485.html
2x/корень(1-x^4) 2*(x^4+1)/(1*x^4)^3/2 как записать их в с++ ?
C++ Нужно подправить рекурсивную функцию Всем доброго времени суток! Сама задача звучит так: Разработать рекурсивную функцию возвращающую значение, для вычисления максимального значения в одномерном массиве. Вот мой код. Помогите плз подправить функцию Max. Я никак сам не додумаюсь как тут и что сделать чтобы рекурсия явилась :) Только если можно, попроще, я в ВУЗе только начал рекурсию проходить...1 курс...будь он не ладен((( ... http://www.cyberforum.ru/cpp-beginners/thread910482.html
Создать файл с именем указанным пользователем и записать в него его же имя C++
Необходимо создать файл с именем указанным пользователем и записать в него его же имя string name; cout<<"Введите имя: "; cin.sync(); getline(cin,name); ofstream file(name); file.open(name); file << name; file.close();
Совет C++
Я понимаю что раздел не тот но дайте ответ на вопрос:что сначала учить Delphi или С++ (ООП) Я знаю Pascal,C++ (1 курс - finish)
C++ перевести на язык С++ с Паскаля http://www.cyberforum.ru/cpp-beginners/thread910474.html
переведите пожалуйста сумму бесконечного ряда uses crt; var a,s,x:real; i:integer; eps:real; function fct(n:integer): real; var f: real; i: integer; begin f:=1;
C++ Строки (ввести строку разделенную пробелами, и в словах которые оканчиваются на АВС заменить СС) ввести строку разделенную пробелами, и в словах которые оканчиваются на АВС заменить СС... помогите просто определить 3 последнии буквы,и как менять их)) просто завтра экзамен) подробнее

Показать сообщение отдельно
dwa83
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 13
24.06.2013, 16:45  [ТС]     не пойму из-за чего Access violation
Вроде нормальный. Ставил точку останова - count = 576 (полигонов). Пробовал вручную указывать значения, если указывать маленькие типа 20-50, то выделяется, иначе access violation. Да и если проходит, то уже в другом модуле в строчке
TextureElement *newtex = new TextureElement; //
опять такая же ерунда

Добавлено через 14 минут
Вот на всякий случай весь модуль, может кто разберётся и подскажет в чём ошибка. Странно, что раньше всё работало нормально..
Кликните здесь для просмотра всего текста
h
Код
#include "Shaders.h"
#include "Textures/TextureLibrary.h"

// полигон
struct Polygon3d
{
  unsigned short nom_vertex[3];     // номера вершин
  unsigned short nom_texcoord[3];   // номера текстурных координат
  Vector3f normal[3];               // нормали
  Vector3f tangent;
};

// элемент модели
struct Mesh
{
  unsigned int texID;           // идентификатор текстуры меша
  unsigned int normmapID;       // id карты нормалей
  bool SmoothNormal;            // сглаженные ли нормали
  unsigned short v_count;       // количество вершин
  unsigned short p_count;       // количество полигонов
  unsigned short t_count;       // количество текстурных координат
  unsigned short n_count;       // количество нормалей
  Vector3f *vertex;  // динамический массив вершин
  Vector3f *normal;  // динамический массив нормалей
  Texcoord *texcoord;// массив текстурных координат
  Polygon3d *polygon;// динамический массив полигонов

  void CalculateNormals();
  void CalculateSmoothNormals();

  void CreateVertices(int count);  // выделение памяти для вершин
  void CreateTexcoords(int count); // выделение памяти для текстурных координат
  void CreateNormals(int count);   // выделение памяти для нормалей
  void CreatePolygons(int count);  // выделение памяти для полигонов

  void DelVertices();
  void DelTexcoords();
  void DelNormals();
  void DelPolygons();
};

struct StaticModel
{
  float rotx;
  float roty;
  float rotz;

  unsigned short m_count;       // количество сеток
  Mesh *mesh;                   // массив сеток
  TextureLibrary *texlib;       // указатель на библиотеку текстур
  Shader *shader;
  Vector3f work;

  void CreateMeshes(int count); // выделение памяти для отдельных обьектов модели
  unsigned int FindChunk(ifstream& ifs, unsigned short id, bool isParent=true);
  bool Load3DS(char *p_filename);
  void Render();
};

Кликните здесь для просмотра всего текста
cpp
Код
#include <windows.h>
#include <GL\gl.h>
#include <GL\glu.h>
#include <fstream.h>

#include "Math3d.h"
#include "Model3d.h"
#include "ErrorLog.h"

// удаление вершин
void Mesh::DelVertices()
{
  if (this->vertex!=NULL) delete []this->vertex; // удалим если уже выделено
  this->vertex=NULL;
}

// удаление текстурных координат
void Mesh::DelTexcoords()
{
  if (this->texcoord!=NULL) delete []this->texcoord; // удалим если уже выделено
  this->texcoord=NULL;
}

// удаление нормалей
void Mesh::DelNormals()
{
  if (this->normal!=NULL) delete []this->normal; // удалим если уже выделено
  this->normal=NULL;
}

// удаление полигонов
void Mesh::DelPolygons()
{
  if (this->polygon!=NULL) delete []this->polygon; // удалим если уже выделено
  this->polygon=NULL;
}

// выделение памяти под массив вершин
void Mesh::CreateVertices(int count)
{
  this->v_count=count;
  this->DelVertices();
  this->vertex= new Vector3f[count];
}

// выделение памяти под массив текстурных координат
void Mesh::CreateTexcoords(int count)
{
  this->t_count=count;
  this->DelTexcoords();
  this->texcoord= new Texcoord[count];
}

// выделение памяти под массив текстурных координат
void Mesh::CreateNormals(int count)
{
  this->n_count=count;
  this->DelNormals();
  this->normal= new Vector3f[count];
}

// выделение памяти под массив полигонов
void Mesh::CreatePolygons(int count)
{
  this->p_count=count;
  this->DelPolygons();
  this->polygon= new Polygon3d[count];
}


// расчёт нормалей
void Mesh::CalculateNormals()
{
  for (int i=0; i<p_count; i++)
  {
    Vector3f a=vertex[polygon[i].nom_vertex[0]]-vertex[polygon[i].nom_vertex[1]];
    Vector3f b=vertex[polygon[i].nom_vertex[0]]-vertex[polygon[i].nom_vertex[2]];
    Vector3f norm=cross(a,b);
    norm.normalise();
    polygon[i].normal[0]=norm;
    polygon[i].normal[1]=norm;
    polygon[i].normal[2]=norm;
  }
}

// расчёт сглаженных нормалей
void Mesh::CalculateSmoothNormals()
{
  int p;

  CalculateNormals();

  Vector3f *nrm=new Vector3f[p_count]; // временный массив нормалей полигона
  for (p=0; p<p_count; p++)
  nrm[p]=polygon[p].normal[0];

  for (int i=0; i<v_count; i++)
  {
    Vector3f vnorm;
    for (p=0; p<p_count; p++)
    {
      // если вершина входит в полигон..
      if ((polygon[p].nom_vertex[0]==i)||
          (polygon[p].nom_vertex[1]==i)||
          (polygon[p].nom_vertex[2]==i))
      vnorm+=nrm[p]; // прибавляем нормаль полигона
    }
    vnorm.normalise(); // нормализуем

    // проставим нормаль во всех полигонах, использующих эту вершину
    for (p=0; p<p_count; p++)
    {
      if (polygon[p].nom_vertex[0]==i) polygon[p].normal[0]=vnorm;
      if (polygon[p].nom_vertex[1]==i) polygon[p].normal[1]=vnorm;
      if (polygon[p].nom_vertex[2]==i) polygon[p].normal[2]=vnorm;
    }
  }

  delete []nrm;
}


// выделение памяти под массив сеток
void StaticModel::CreateMeshes(int count)
{
  this->m_count=count;
  if (this->mesh!=NULL) // если массив сеток создан
  {
    for (int i=0; i<m_count; i++)
    {
      this->mesh[i].DelNormals(); //удалим нормали
      this->mesh[i].DelVertices(); //удалим вершины
      this->mesh[i].DelTexcoords(); //удалим текстурные коорды
      this->mesh[i].DelPolygons(); //удалим полигоны
    }
    delete []this->mesh;
  }
  this->mesh= new Mesh[count];

  for (int i=0; i<m_count; i++)
  {
    this->mesh[i].vertex=NULL;
    this->mesh[i].normal=NULL;
    this->mesh[i].texcoord=NULL;
    this->mesh[i].polygon=NULL;
  }
}





bool StaticModel::Load3DS(char *p_filename)
{
    int p;

	FILE *file = fopen(p_filename, "rb");         
	if (file==NULL) 
	{
	  MsgLog(p_filename);	
      MsgLog("Файл модели не найден");
	  return false;	
	}	
	
    unsigned short mcount;

	fread(&mcount,1,2,file);  // считали количество сеток
    CreateMeshes(mcount);       // создаём массив сеток
    for (int i=0; i<mcount; i++)
    {
      bool smooth;
      unsigned short vc,tc,pc;

      fread(&smooth,1,1,file);  // считаем сглаживание
      fread(&vc,1,2,file);  // считаем количество вершин
      mesh[i].CreateVertices(vc); // создаём массив вершин
      fread(&tc,1,2,file);  // считаем количество текстурных координат
      mesh[i].CreateTexcoords(tc);// создаём массив текстурных координат
      fread(&pc,1,2,file);  // считаем количество полигонов
      mesh[i].CreatePolygons(pc); // создаём массив полигонов

      // считаем все вершины
      for (int v=0; v<vc; v++)
      {
        fread(&mesh[i].vertex[v].x,1,4,file);
	    fread(&mesh[i].vertex[v].z,1,4,file);
	    fread(&mesh[i].vertex[v].y,1,4,file);
        mesh[i].vertex[v].z=-mesh[i].vertex[v].z;
	  }

      // считаем все текстурные координаты
      for (int t=0; t<tc; t++)
      {
        fread(&mesh[i].texcoord[t].x,1,4,file);
	    fread(&mesh[i].texcoord[t].y,1,4,file);
	  }

      // считаем все номера вершин в полигонах
      for (p=0; p<pc; p++)
      {
        fread(&mesh[i].polygon[p].nom_vertex[0],1,2,file);
	    fread(&mesh[i].polygon[p].nom_vertex[1],1,2,file);
	    fread(&mesh[i].polygon[p].nom_vertex[2],1,2,file);
      }

      // считаем все номера текстурных координат для полигонов
      for (p=0; p<pc; p++)
      {
        fread(&mesh[i].polygon[p].nom_texcoord[0],1,2,file);
	    fread(&mesh[i].polygon[p].nom_texcoord[1],1,2,file);
	    fread(&mesh[i].polygon[p].nom_texcoord[2],1,2,file);
      }

      for (p=0; p<pc; p++)
      {
        // расчёт тангент-оси
        Vector3f p1 = mesh[i].vertex[mesh[i].polygon[p].nom_vertex[0]];
        Vector3f p2 = mesh[i].vertex[mesh[i].polygon[p].nom_vertex[1]];
        Vector3f p3 = mesh[i].vertex[mesh[i].polygon[p].nom_vertex[2]];

        Texcoord t1 = mesh[i].texcoord[mesh[i].polygon[p].nom_texcoord[0]];
        Texcoord t2 = mesh[i].texcoord[mesh[i].polygon[p].nom_texcoord[1]];
        Texcoord t3 = mesh[i].texcoord[mesh[i].polygon[p].nom_texcoord[2]];

        mesh[i].polygon[p].tangent=((t3.y-t1.y)*(p2-p1)-(t2.y-t1.y)*(p3-p1))/((t2.x-t1.x)*(t3.y-t1.y)-(t3.x-t1.x)*(t2.y-t1.y));

        mesh[i].polygon[p].tangent.normalise();
      }

      // имя файла текстуры
      char tname[255]={0};
      int cnt=0;
      do
      {
        fread(&tname[cnt],1,1,file);
        cnt++;
      }
      while (tname[cnt-1]!=0);

      // загрузка текстуры и карты нормалей
      mesh[i].texID=texlib->Load(tname);
	  char nm_name[255] = {0};
      strcat(nm_name, "nm_");
      strcat(nm_name, tname);
      mesh[i].normmapID=texlib->Load(nm_name);
      
      // расчёт нормалей
      if (smooth)
      mesh[i].CalculateSmoothNormals();
      else
      mesh[i].CalculateNormals();
      
	}

	fclose(file);
    return true;
}

void StaticModel::Render()
{

  for (int m=0; m<m_count; m++)
  {
    shader->SetTexture(0,mesh[m].texID,"TextureSampler");
    shader->SetTexture(1,mesh[m].normmapID,"NormalSampler");

    glBegin(GL_TRIANGLES);
    for (int p=0; p<mesh[m].p_count; p++)
    {
      // передадим в шейдер значения осей
      GLuint uni = shader->GetUniformLocation("Tangent");
      shader->setUniformf(uni, mesh[m].polygon[p].tangent.x, mesh[m].polygon[p].tangent.y, mesh[m].polygon[p].tangent.z);


      for (int v=0; v<3; v++)
      {

        glNormal3f(mesh[m].polygon[p].normal[v].x,
                   mesh[m].polygon[p].normal[v].y,
                   mesh[m].polygon[p].normal[v].z);
        glTexCoord2f(mesh[m].texcoord[mesh[m].polygon[p].nom_texcoord[v]].x,
                     mesh[m].texcoord[mesh[m].polygon[p].nom_texcoord[v]].y);
        glVertex3f(mesh[m].vertex[mesh[m].polygon[p].nom_vertex[v]].x,
                   mesh[m].vertex[mesh[m].polygon[p].nom_vertex[v]].y,
                   mesh[m].vertex[mesh[m].polygon[p].nom_vertex[v]].z);

      }
    }
    glEnd();
  }



}
 
Текущее время: 09:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru