gpt4 book ai didi

C++在函数中传递数组指针地址

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:01 27 4
gpt4 key购买 nike

下面的代码使用八面体作为起始 3D 形状,(我在网上找到的)经过一些调整后我仍然无法让它工作。

#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[8];
int facets = CreateNSphere(facet, 2);
printf(" Result: %d", facets);
}

当我尝试编译它时,它返回:

“段错误”

gdb 调试器说:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004011df in CreateNSphere(FACET3*, int) ()

有什么帮助吗?

在使用“-g”选项编译后“gbd”返回:

(gdb) run
Starting program: /home/alexander/Graphics/Code-Handouts/tut_3/a.out

Program received signal SIGSEGV, Segmentation fault.
0x00000000004011df in CreateNSphere (f=0x7fffffffdeb0, iterations=2) at sphere_model.cpp:86
86 f[nt].p1 = pb; f[nt].p2 = f[i].p3; f[nt].p3 = pc; nt++;
(gdb) where
#0 0x00000000004011df in CreateNSphere (f=0x7fffffffdeb0, iterations=2) at sphere_model.cpp:86
#1 0x0000000000401303 in main () at sphere_model.cpp:100
(gdb)

最佳答案

对于两次迭代,您需要多于 8 个顶点。

初始迭代,有八个顶点。

在第一次迭代中,添加了 24 个。

在第二次迭代中,它再次翻两番。

所以你应该声明

FACET3 facet[128];

关于C++在函数中传递数组指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8102676/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com