3

这可能有一个我应该立即看到的明显答案,但我什至没有找到一个晦涩难懂的答案。请帮忙。它甚至让我想怀疑一个错误,但这不太可能。

我正在尝试制作一个在 zz 点交叉的函数,它可以部分工作。

在函数末尾的断点处停止时,将鼠标悬停在 Debug 中的变量上会显示值。我将来自 NSMakePoint 的结果 z1 和 z2 作为注释插入到相应的行中。

为什么 NSMakePoint 在一个地方失败而在我的程序的其他地方工作?

第一次出现应将 zz.x 增加 10;而是将 zz.y 增加 10。
第二次出现应将 zz.x 减少 10;而是将 zz.y 递减 10。

在接下来的两次事件中,它工作正常。

首先,我尝试在参数中增加 x ,如顶部注释所示;然后我尝试在参数之前增加 x ,如图所示。我试过浮动以及 CGFloat。

这里有什么问题?

#import "untitled.h"

CGFloat xx,yy;
NSPoint z1,z2, zz; 
    NSBezierPath *path;

void markpoint (NSPoint zz){    //zz=   133.333, 100  OK

//  z2= NSMakePoint(zz.x+10,zz.y);  I tried this first and failed;  
    then I broke out the increment as follows:

    xx=zz.x+10;         //xx=   143.333  OK
    yy=zz.y;            //yy=   100      OK
    z1= NSMakePoint(xx,yy);     //z1=   133.333,110 but should be 143.333,100
    [path moveToPoint:z1];
    z2= NSMakePoint(zz.x-10,zz.y);  //z2=   133.333, 90 but should be 123.333,100
    [path lineToPoint:z2];

    z1= NSMakePoint(zz.x,zz.y+10);  //z1=   133.333, 110 OK
    [path moveToPoint:z1];
    z2= NSMakePoint(zz.x,zz.y-10);  //z2=   133.333,  90 OK
    [path lineToPoint:z2];
}

附带问题:我找不到任何地方断言或否认 float 和 CGFloat 在 Bezier 系列函数和 Cocoa 中的 NSPoint 中是可互换的。他们是吗?

4

1 回答 1

0

始终验证输入。验证传递给函数的参数是相关值。一种方法是在开始时始终初始化为已知值。这似乎是基本的 C 卫生。仅声明原始 C 类型的全局变量并不能保证它具有任何值,而只能保证在内存中为特定内存中该类型的大小留出一些空间

CGFloat 是在头文件中声明的 typedef。您需要熟悉如何在标题中查找这些内容,因为这将成为一项非常宝贵的技能。XCode 让它变得超级简单,但您还需要阅读 Xcode 帮助.. ;)

CGFloat 是双精度或浮点数,具体取决于硬件。所以,这是一个 ifdef typedef ...

于 2013-01-04T17:40:06.283 回答