【问题标题】:Why does NSMakePoint fail in one place and work elsewhere in my program?为什么 NSMakePoint 在一个地方失败而在我的程序的其他地方工作?
【发布时间】:2012-10-22 16:23:29
【问题描述】:

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

我正在尝试创建一个函数,该函数将在 zz 点创建一个十字,并且它可以部分工作。

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

为什么 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 中是可互换的。是吗?

【问题讨论】:

  • 我想知道问题可能出在您声明 NSPoint z1、z2 和 zz 而不初始化它们的方式上。通常这对于非指针变量是安全的,但是如果我没有在开始时将它们明确设置为 0 和 NO,我会遇到 NSUInteger 甚至 BOOL 变量的奇怪问题。 Objective-C 的一些标量类型看起来有点像指针。
  • 我怀疑您看到的是调试器工件,而不是“现实”。有时,由于代码被重新排列,调试器将返回与您停止的位置不对应的值。使用 NSLog 语句转储值。
  • 我输入了 NSLog,它产生的值与 Tooltip 相同。
  • 抱歉耽搁了。这是我的其余回复:我初始化为 0,0 并且出现了正确的值!然后我通过删除这些行恢复到初始状态,它仍然出现了正确的值!嗯?它是如何自我修复的?
  • 当有人给你正确答案时,点击帖子分数下方的绿色复选框。这样做表明答案是解决您的问题的答案。

标签: objective-c function bezier


【解决方案1】:

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

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

CGFloat 是 double 还是 float,具体取决于硬件。 所以,它是一个 ifdef typedef ...

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 2016-10-31
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    相关资源
    最近更新 更多