简体   繁体   English

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

[英]C++ passing array pointer address in function

The code below uses an octahedron as a starting 3D shape, ( I found it on the web) and after some tweaking I can't still make it work. 下面的代码使用八面体作为起始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);
} 

When I try to compile it, it returns: 当我尝试编译它时,它返回:

"Segmentation Error" “细分错误”

gdb debugger says: gdb调试器说:

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

any help? 有什么帮助吗?

after compiling with "-g" option "gbd" returned this: 使用“ -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) 

For two iterations, you need many more than 8 vertices. 对于两次迭代,您需要超过8个顶点。

The initial iteration, there are eight vertices. 初始迭代有八个顶点。

On iteration one, 24 are added. 在迭代1中,添加了24。

On iteration two, it quadruples again. 在第二次迭代中,它再次翻了两番。

So you should declare 所以你应该声明

FACET3 facet[128];

The size of passed array to CreateNSphere() is 8. Inside CreateNSphere() you access to yours f array by nt index variable which is incremented permanently during the loop. 传递给CreateNSphere()数组的大小为8。在CreateNSphere()您可以通过nt索引变量访问f数组,该变量在循环期间会永久增加。 So basically you have memory access violation -- you tries to access f array out of it's size. 因此,基本上,您遇到了内存访问冲突-您尝试访问超出其大小的f数组。 When I debuged your sample gdb shown that nt was 48 when SIGSEGV received. 当我调试您的示例gdb时,收到SIGSEGV时, nt为48。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM