首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构在传入方法后具有未定义的值

结构在传入方法后具有未定义的值
EN

Stack Overflow用户
提问于 2014-08-26 03:32:53
回答 2查看 108关注 0票数 0

我对一对GLKVector3结构有一个奇怪的问题。我通过两次调用objc方法axisForIndex:获得它们,然后将它们传递给C函数getContactPoint来执行计算。但是,当两个axisForIndex:调用的参数都为零时,它们的值在我进入方法后“消失”--也就是说,first.x的值在方法外部可能为.55,但在方法内部可能为0。当我在调试器中查看它们时,它们的任何字段都没有填充,并且当我打印描述时,我得到类似于(GLKVector3) varName = <variable not available>的内容。但是,在调用getContactPoint的方法被调用之前和之后检查该方法中的值,就会发现它们的值是应该的。我使用Xcode6-Beta6来编译和运行代码。

代码如下:

代码语言:javascript
复制
    GLKVector3 first = [self axisForIndex: oneAxisIndex]; // the structs I want to use
    GLKVector3 second = [other axisForIndex: twoAxisIndex];

    //in this method they have garbage values
    result.contactLocation = getContactPoint(first, 
                                             second,
                                             ptOnEdgeOne,
                                             ptOnEdgeTwo);

    //test to see if the result was computed correctly
    if (result.contactLocation.x == 0 && result.contactLocation.y == 0 && result.contactLocation.z == 0) {

        NSLog(@"%ld,%ld", (unsigned long)oneAxisIndex, (unsigned long)twoAxisIndex);
    }

    result.interpenetration = bestOverlap;

    return result;

下面是getContactPoint的实现,这个方法的值是未定义的。

代码语言:javascript
复制
GLKVector3 getContactPoint(GLKVector3 axisOne,
                       GLKVector3 axisTwo,
                       GLKVector3 ptOnEdgeOne,
                       GLKVector3 ptOnEdgeTwo) {

GLKVector3 toSt = GLKVector3Subtract(ptOnEdgeOne, ptOnEdgeTwo);

GLfloat dpStaOne = GLKVector3DotProduct(axisOne, toSt);
GLfloat dpStaTwo = GLKVector3DotProduct(axisTwo, toSt);

GLfloat smOne = GLKVector3Length(axisOne);
GLfloat smTwo = GLKVector3Length(axisTwo);

GLfloat dotProductEdges = GLKVector3DotProduct(axisTwo, axisOne);

GLfloat denom = smOne * smTwo - dotProductEdges * dotProductEdges;

GLfloat a = (dotProductEdges * dpStaOne - smTwo * dpStaOne)/denom;
GLfloat b = (smOne * dpStaTwo - dotProductEdges * dpStaOne)/denom;

GLKVector3 nearestPtOnOne = GLKVector3MultiplyScalar(GLKVector3Add(ptOnEdgeOne, axisOne), a);
GLKVector3 nearestPtOnTwo = GLKVector3MultiplyScalar(GLKVector3Add(ptOnEdgeTwo, axisTwo), b);

return GLKVector3Add(GLKVector3MultiplyScalar(nearestPtOnOne, 0.5), GLKVector3MultiplyScalar(nearestPtOnTwo, 0.5));
}

axisForIndex的实现。

代码语言:javascript
复制
    -(GLKVector3) axisForIndex: (NSUInteger) index
   {

        GLKVector4 vec = GLKMatrix4GetColumn(self.transformationMatrix, index);

        return GLKVector3Make(vec.x, vec.y, vec.z);
   }
EN

回答 2

Stack Overflow用户

发布于 2014-08-26 05:02:41

在调试器中收到<variable not available>的原因可能是编译器优化。

您是否会尝试关闭构建的编译器优化(构建设置>优化级别),然后再次运行调试器?

请参阅:https://stackoverflow.com/a/13041747/3367343

票数 0
EN

Stack Overflow用户

发布于 2014-08-26 06:04:23

将getContactPoint的参数改为指针,然后在方法中取消对它们的引用,然后传入指向我想要的结构的指针,这就解决了这个问题。

代码语言:javascript
复制
GLKVector3 getContactPoint(GLKVector3* axisOnePointer,
                           GLKVector3* axisTwoPointer,
                           GLKVector3* ptOnEdgeOnePointer,
                           GLKVector3* ptOnEdgeTwoPointer) {

GLKVector3 axisOne = *axisOnePointer;
GLKVector3 axisTwo = *axisTwoPointer;

GLKVector3 ptOnEdgeOne = *ptOnEdgeOnePointer;
GLKVector3 ptOnEdgeTwo = *ptOnEdgeTwoPointer;

我很有兴趣知道为什么会这样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25493057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档