0

次のようにフォーマットされた四面体を含むファイルを読み取るプログラムを作成しようとしています。

    T 109 20 10 19
   [T X1 X2 X3 X4 ]
    T 123 34 24 33
    T 182 83 82 92

各行の各数値 X は、データ ファイルの行 X の (x、y、z 座標の) トリプレットを示します。

line 1 x y z
line 2 x y z
  [.......]
line n x y z

ここに同様の(しかしより単純な)質問を投稿しましたParsing data from ASCIIformatted file in C . 今回は、四面体ファイルを読み取り、これらの四面体の頂点の座標を表す 4 つの行番号を配列vertid[](0 から 3) に格納し、ポインターの配列を使用して四面体を頂点にリンクすることを考えています。Vertex構造。要約すると、ライン ID 番号を四面体構造に格納し、ポインターを正しい頂点に「ポイント」するように設定します。

私はプログラマーではないことに注意してください (ボロノイ図を生成するにはこれが必要です)。また、四面体を構成する頂点を保存する代わりに、エッジを保存した方が簡単でしょうか (ボロノイ D の生成には、頂点データではなくエッジ データが実際に必要になると思います)。私は日曜日にこれに取り組んでいますが、機能していません。その理由はわかりません。ありがとうございました。

(動作しない) 例:

#define FILEPATHtri "/pathto/grid1DT.txt"
#define FILEPATHorg "/pathto/grid1.txt"
#define MAX  10000

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "math.h"



typedef struct
{

    float x;
    float y;
    float z;
    char ID;
}Vertex;

/* NOT USED ATM
        typedef struct {
            edge_ref next[4]; // pointers to other edges (AQE data structure)
            void *data[4]; // pointers to endpoints of edge
            unsigned ID; // ID of edge
          }Edge;
 */
typedef struct
{
    Vertex *vert[4];
    int vertid[4];
    char t;
}Tetra;

void file_link (void)
{

    Vertex *vert_dt = malloc( MAX * sizeof (Vertex) ) ;

    Vertex *vert_std = malloc( MAX * sizeof (Vertex) ) ;

    Tetra *tetrahedron = malloc(MAX * sizeof (Tetra) );

    FILE *fp1,*fp2 ;
    fp1 = fopen( FILEPATHtri,"r");
    int i = 0;
    while(fscanf(fp1, "%c %i %i %i %i ", &tetrahedron[i].t, &tetrahedron[i].vertid[0], &tetrahedron[i].vertid[1], 
            &tetrahedron[i].vertid[2], &tetrahedron[i].vertid[3] ) == 5 ) // Saving the line numbers into vertid[0..3]
    {
        i++;
    }
    fclose(fp1);


    fp2 = fopen( FILEPATHorg,"r");
    int j = 0;
    while(fscanf(fp2, "%f %f %f ", &vert_std[j].x, &vert_std[j].y, &vert_std[j].z ) == 3 ) 
    {
        j++;
    }
    fclose(fp2);

    int n;

    for (n=0; n<i; n++) {

        tetrahedron[n]->vert[0]=vert_std[ tetrahedron[n].vertid[0] ]; // retriving coords from the standard file and storing
        tetrahedron[n]->vert[1]=vert_std[ tetrahedron[n].vertid[1] ]; // them in the vertex pointer array of tretrahedron
        tetrahedron[n]->vert[2]=vert_std[ tetrahedron[n].vertid[2] ];
        tetrahedron[n]->vert[3]=vert_std[ tetrahedron[n].vertid[3] ];
    }
        int m = 100; //used to retrieve m'th tetra, so that I can print the tetra that I want,just for checking purposes..   

        // printing 13 variables in total... 
        printf("These are the 4 coordinates of the vertices of the  %i th tetrahedron from the DT file %f %f %f\n%f %f %f\n%f %f %f\n%f %f %f\n", n, 
                tetrahedron[n]->vert[0]->x,tetrahedron[n]->vert[0]->y,tetrahedron[n]->vert[0]->z,
                tetrahedron[n]->vert[1]->x,tetrahedron[n]->vert[1]->y,tetrahedron[n]->vert[1]->z, 
                tetrahedron[n]->vert[2]->x,tetrahedron[n]->vert[2]->y,tetrahedron[n]->vert[2]->z, 
                tetrahedron[n]->vert[3]->x,tetrahedron[n]->vert[3]->y,tetrahedron[n]->vert[3]->z);

    free(vert_dt);
    free(vert_std);
    free(tetrahedron);
}

int main(void) {
    file_link();

    return 0;
}
4

1 に答える 1

0

形式は .obj 形式に似ており、解析が難しくありません。あなたはそれをかなりうまくやった。あなたのエラーは、この時点ではほとんどタイプミスです。

ポインターの代わりにデータをインプレースで使用するだけです。

Vertex *vert[4];

になります:

Vertex vert[4];

また、すべての「->」表記をドット (.) 表記に変更する必要があります。次に例を示します。

    tetrahedron[n].vert[0]=vert_std[ tetrahedron[n].vertid[0] ]; // retriving coords from the standard file and storing
    tetrahedron[n].vert[1]=vert_std[ tetrahedron[n].vertid[1] ]; // them in the vertex pointer array of tretrahedron
    tetrahedron[n].vert[2]=vert_std[ tetrahedron[n].vertid[2] ];
    tetrahedron[n].vert[3]=vert_std[ tetrahedron[n].vertid[3] ];

テストコードは n を 1 に戻す必要があります (現在は lastLine+1 です)。

    // printing 13 variables in total... 
n--; // n must be last entry

最後に、割り当てでコンパイル エラーが発生したため、それらを型キャストする必要がありました。

Vertex *vert_dt = (Vertex*) malloc( MAX * sizeof (Vertex) ) ;

Vertex *vert_std = (Vertex*) malloc( MAX * sizeof (Vertex) ) ;

Tetra *tetrahedron = (Tetra*) malloc(MAX * sizeof (Tetra) );

fscanf() は非常に厳密であるため、入力ファイルの先頭に余分なスペースがあると、プログラムが混乱する可能性があることに注意してください。作成したファイルでこれらの変更をテストしたため、保証はありません。

お役に立てれば!これが私の完全なファイルです:

#define FILEPATHtri "grid1DT.txt"
#define FILEPATHorg "grid1.txt"
#define MAX  10000

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "math.h"



typedef struct
{

    float x;
    float y;
    float z;
    char ID;
}Vertex;

/* NOT USED ATM
        typedef struct {
            edge_ref next[4]; // pointers to other edges (AQE data structure)
            void *data[4]; // pointers to endpoints of edge
            unsigned ID; // ID of edge
          }Edge;
 */
typedef struct
{
    Vertex vert[4];
    int vertid[4];
    char t;
}Tetra;

void file_link (void)
{

    Vertex *vert_dt = (Vertex*) malloc( MAX * sizeof (Vertex) ) ;

    Vertex *vert_std = (Vertex*) malloc( MAX * sizeof (Vertex) ) ;

    Tetra *tetrahedron = (Tetra*) malloc(MAX * sizeof (Tetra) );

    FILE *fp1,*fp2 ;
    fp1 = fopen( FILEPATHtri,"r");
    int i = 0;
    while(fscanf(fp1, "%c %i %i %i %i ", &tetrahedron[i].t, &tetrahedron[i].vertid[0], &tetrahedron[i].vertid[1], 
            &tetrahedron[i].vertid[2], &tetrahedron[i].vertid[3] ) == 5 ) // Saving the line numbers into vertid[0..3]
    {
        i++;
    }
    fclose(fp1);


    fp2 = fopen( FILEPATHorg,"r");
    int j = 0;
    while(fscanf(fp2, "%f %f %f ", &vert_std[j].x, &vert_std[j].y, &vert_std[j].z ) == 3 ) 
    {
        j++;
    }
    fclose(fp2);

    int n;

    for (n=0; n<i; n++) {

        tetrahedron[n].vert[0]=vert_std[ tetrahedron[n].vertid[0] ]; // retriving coords from the standard file and storing
        tetrahedron[n].vert[1]=vert_std[ tetrahedron[n].vertid[1] ]; // them in the vertex pointer array of tretrahedron
        tetrahedron[n].vert[2]=vert_std[ tetrahedron[n].vertid[2] ];
        tetrahedron[n].vert[3]=vert_std[ tetrahedron[n].vertid[3] ];
    }
        int m = 100; //used to retrieve m'th tetra, so that I can print the tetra that I want,just for checking purposes..   

        // printing 13 variables in total... 
        n--; // rewind to last tetrahedron
        printf("These are the 4 coordinates of the vertices of the  %i th tetrahedron from the DT file %f %f %f\n%f %f %f\n%f %f %f\n%f %f %f\n", n, 
                tetrahedron[n].vert[0].x,tetrahedron[n].vert[0].y,tetrahedron[n].vert[0].z,
                tetrahedron[n].vert[1].x,tetrahedron[n].vert[1].y,tetrahedron[n].vert[1].z, 
                tetrahedron[n].vert[2].x,tetrahedron[n].vert[2].y,tetrahedron[n].vert[2].z, 
                tetrahedron[n].vert[3].x,tetrahedron[n].vert[3].y,tetrahedron[n].vert[3].z);

    free(vert_dt);
    free(vert_std);
    free(tetrahedron);
}

int main(void) {
    file_link();

    return 0;
}
于 2013-02-10T21:47:33.597 に答える