Чтение значений из файлового потока и сохранение их в массиве переменного размера - OpenGL и C - PullRequest
0 голосов
/ 28 ноября 2009

Я пытаюсь прочитать следующий файл (комментариев нет в оригинале):

Tetra.tri


4 4 // общее количество вершин и общее количество треугольников

0.693361 0.693361 0.693361 // координаты вершины

0,693361 -0,693361 -0,693361

-0,693361 -0,693361 0,693361

-0,693361 0,693361 -0,693361

3 1 2 3 // отображение треугольников (перед 3 указывает, что это треугольник)

3 0 3 2

3 0 1 3

3 0 2 1


Я пытаюсь сделать это с помощью динамических массивов, потому что мне нужно будет открывать другие файлы и потому что я использую массивы вершин для рисования на экране.

Я правильно понял первые значения (vertcount и tricount, которые 4 и 4 в соответствии с файлом выше), но я делаю что-то не так после.

Вот код:


void main () {

struct Vertex           // Vertex Structure
{
    float x,y,z;
};

struct Triangle         // Triangle Structure
{
    struct Vertex vert1, vert2, vert3;
};

int vertcount=0;                    //total number of vertices
int tricount=0;                     // number of triangles to display
int v=0;                                //var to store index value of each vertex
int t=0;                                //var to store index value of each triangle
struct Vertex InstVertex;           // Instantiation of Vertex defined as struct with 3 floats to store coordinates
struct Triangle InstTriangle;       // Instantiation of the Triangle STRUCT
long filesize;
char buffer;

struct Vertex vertArray[v];
struct Triangle triArray[t];

FILE * pmesh;                       // pointer to the mesh file to be opened
pmesh = fopen ("/Users/.../tetra.tri","r");             // Tries to access the file specified. TO BE CHANGED ----> Dialaog window with browse for file function

/ ********** Считать файл и сохранить значения ********** /

fscanf(pmesh, " %i %i ", &vertcount, &tricount);        //read from file and assign the first two values: number of Vertices and Triangles      

vertArray[v] = malloc(vertcount*(sizeof(struct InstVertex)));       // Array of vertexes - space allocated = total number of vertices * the size of each Vertex
triArray[t] = malloc(tricount*(sizeof(struct InstTriangle)));       // Array of triangles

int i=0, j=0;       // Temp variables for for loops

for (i=0; i<=vertcount; i++){
    fscanf(pmesh, "%d %d %d", &InstVertex.x, &InstVertex.y, &InstVertex.z);     //read file and store coordinates in
    vertArray[v]=InstVertex;
    v++;
}   

int check=0;

for (j=0; j<=tricount; j++){
    fscanf(pmesh, "%i %i %i %i", &check, &InstTriangle.vert1, &InstTriangle.vert2, &InstTriangle.vert3);
    triArray[t]=InstTriangle;
    t++;
}

fclose(pmesh);

/ **************************************** /

glutMainLoop();
return 0;

}


Среди ошибок, которые я совершаю, есть способ распределения памяти массива, поскольку я не получаю правильные значения.

Я не могу найти ошибку в циклах чтения и в объявлении массива. И это правильный способ хранения значений в массивах?

Заранее спасибо, Valerio

1 Ответ

0 голосов
/ 29 ноября 2009

Я решил проблему чтения и присвоения значений массивам, изменив значения для чтения в первом цикле for с% d на float (% f), что дало мне правильные значения.

Однако, несмотря на изменение вызова malloc на:

vertArray[v] = (struct Vertex) malloc(vertcount*(sizeof(struct Vertex)));

triArray[t] = (struct Triangle) malloc(tricount*(sizeof(struct Triangle)));

, где v и t уже имеют значения (в данном случае 4 и 4), так как я отредактировал код выше, чтобы также включить два вызова:

v=vertcount;
t=tricount;

Но я все еще получаю следующую ошибку:

Ошибка: требуется преобразование в нескалярный тип!

Есть идеи, почему?

Спасибо!

...