3

これは私がすぐに見るべきである明白な答えを持っているかもしれません、しかし私はあいまいなものさえ見つけませんでした。助けてください。バグを疑うことさえしたくなりますが、それはありそうにありません。

zz点でクロスする関数を作ろうとしていますが、部分的に動作します。

関数の最後にあるブレークポイントで停止しているときにデバッグで変数にカーソルを合わせると、値が表示されます。NSMakePointの結果z1とz2をコメントとして適切な行に挿入しました。

NSMakePointが1つの場所で失敗し、プログラムの他の場所で機能するのはなぜですか?

最初に出現する場合は、zz.xを10ずつインクリメントする必要があります。代わりに、zz.yを10ずつインクリメントします。2
番目のオカレンスでは、zz.xを10デクリメントする必要があります。代わりに、zz.yを10ずつ減らします。

次の2回の発生では、正常に機能します。

最初に、一番上のコメントに示されているように、引数内でxをインクリメントしてみました。次に、示されているように、引数の前にxをインクリメントしてみました。CGFloatだけでなくfloatも試してみました。

ここで何が問題になっていますか?

#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

常に入力を検証します。関数に渡された引数が適切な値であることを確認してください。1 つの方法は、常に最初に既知の値に初期化することです。これは基本的な C の衛生状態のようです。プリミティブ C 型のグローバル変数を宣言するだけでは、値があることは保証されませんが、特定のメモリでその型のサイズの量のためにメモリ内のスペースが確保されるだけです。

CGFloat は、ヘッダー ファイルで宣言された typedef です。ヘッダーでこれらのことを調べる方法に慣れる必要があります。これは非常に貴重なスキルになるからです。XCode を使用すると非常に簡単ですが、Xcode のヘルプも読む必要があります。;)

CGFloat は、ハードウェアに応じて double または float です。それで、それはifdef typedefです...

于 2013-01-04T17:40:06.283 に答える