2011-11-12 36 views
1

下面的代码使用八面体作为起始3D形状(我在网上发现它),经过一些调整后,我仍然无法使它工作。C++在函数中传递指针地址

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <stddef.h> /* must include for the offsetof macro */ 
#include <GL/glew.h> 
#include <GL/glfw.h> 
#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp> 
#include <glm/gtc/type_ptr.hpp> 
#include <stdlib.h> 
#include <vector> 
#include <iostream> 

using namespace std; 

struct XYZ { 
    GLdouble x; 
    GLdouble y; 
    GLdouble z; 
}; 

struct FACET3 { 
    XYZ p1; 
    XYZ p2; 
    XYZ p3; 
}; 


void Normalise(XYZ *p_input) 
{ 
    double magnitude = 0; 
    magnitude = sqrt((p_input.x * p_input.x)+ (p_input.y * p_input.y) + (p_input.z * p_input.z)); 
    p_input.x = p_input.x/magnitude; 
    p_input.y = p_input.y/magnitude; 
    p_input.z = p_input.z/magnitude; 

} 

int CreateNSphere(FACET3 *f,int iterations) 
{ 

    int i,it; 
    double a; 
    XYZ p[6] = {0,0,1, 0,0,-1, -1,-1,0, 1,-1,0, 1,1,0, -1,1,0}; 
    XYZ pa,pb,pc; 
    int nt = 0,ntold; 

    /* Create the level 0 object */ 
    a = 1/sqrt(2.0); 
    for (i=0;i<6;i++) { 
     p[i].x *= a; 
     p[i].y *= a; 
    } 
    f[0].p1 = p[0]; f[0].p2 = p[3]; f[0].p3 = p[4]; 
    f[1].p1 = p[0]; f[1].p2 = p[4]; f[1].p3 = p[5]; 
    f[2].p1 = p[0]; f[2].p2 = p[5]; f[2].p3 = p[2]; 
    f[3].p1 = p[0]; f[3].p2 = p[2]; f[3].p3 = p[3]; 
    f[4].p1 = p[1]; f[4].p2 = p[4]; f[4].p3 = p[3]; 
    f[5].p1 = p[1]; f[5].p2 = p[5]; f[5].p3 = p[4]; 
    f[6].p1 = p[1]; f[6].p2 = p[2]; f[6].p3 = p[5]; 
    f[7].p1 = p[1]; f[7].p2 = p[3]; f[7].p3 = p[2]; 
    nt = 8; 

    if (iterations < 1) 
     return(nt); 

    /* Bisect each edge and move to the surface of a unit sphere */ 
    for (it=0;it<iterations;it++) { 
     ntold = nt; 
     for (i=0;i<ntold;i++) { 
     pa.x = (f[i].p1.x + f[i].p2.x)/2; 
     pa.y = (f[i].p1.y + f[i].p2.y)/2; 
     pa.z = (f[i].p1.z + f[i].p2.z)/2; 
     pb.x = (f[i].p2.x + f[i].p3.x)/2; 
     pb.y = (f[i].p2.y + f[i].p3.y)/2; 
     pb.z = (f[i].p2.z + f[i].p3.z)/2; 
     pc.x = (f[i].p3.x + f[i].p1.x)/2; 
     pc.y = (f[i].p3.y + f[i].p1.y)/2; 
     pc.z = (f[i].p3.z + f[i].p1.z)/2; 
     Normalise(&pa); 
     Normalise(&pb); 
     Normalise(&pc); 
     f[nt].p1 = f[i].p1; f[nt].p2 = pa; f[nt].p3 = pc; nt++; 
     f[nt].p1 = pa; f[nt].p2 = f[i].p2; f[nt].p3 = pb; nt++; 
     f[nt].p1 = pb; f[nt].p2 = f[i].p3; f[nt].p3 = pc; nt++; 
     f[i].p1 = pa; 
     f[i].p2 = pb; 
     f[i].p3 = pc; 
     } 
    } 

    return(nt); 
} 


int main() 
{ 
    FACET3 *facet; 
    int facets = CreateNSphere(facet, 2); 
    printf(" Result: %d", facets); 
} 

我想让这段代码运行。我基本上是试图以产生由当我用G ++编译它octahedron.but一个球我得到这个坐标:

sphere_model.cpp:32:28: error: request for member ‘x’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:32:40: error: request for member ‘x’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:32:54: error: request for member ‘y’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:32:66: error: request for member ‘y’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:32:80: error: request for member ‘z’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:32:92: error: request for member ‘z’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:33:10: error: request for member ‘x’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:33:22: error: request for member ‘x’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:34:10: error: request for member ‘y’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:34:22: error: request for member ‘y’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:35:10: error: request for member ‘z’ in ‘p_input’, which is of non-class type ‘XYZ*’ 
sphere_model.cpp:35:22: error: request for member ‘z’ in ‘p_input’, which is of non-class type ‘XYZ*’ 

为什么呢?

回答

5

p_input是一个指针,你应该使用的.

+0

我现在运行的代码昂得到一个“分段故障” –

+1

@Trt TRT:这是完全无关的。你有另一个问题,再发一篇文章。 –

+0

gdb在CreateNSphere(FACET3 *,int)()中指出“0x00000000004011df” –

2

->操盘手这是一个回答你的第二个问题,你已经张贴注释。

函数CreateNSphere假定它传递了一个包含8个FACET3对象的数组。在main()中,您需要初始化facet,或者将其创建为数组实例而不是指针。无论是这些将工作:

FACET3 facet[8]; 
int facets = CreateNSphere(facet, 2); 

FACET3 *facet = new FACET3[8]; 
int facets = CreateNSphere(facet, 2);