3 votes

Pourquoi NSMakePoint échoue à un endroit et fonctionne ailleurs dans mon programme ?

Il y a peut-être une réponse évidente que je devrais voir immédiatement, mais je n'en ai même pas trouvé une obscure. Aidez-moi, s'il vous plaît. Cela me donne même envie de soupçonner un bug, mais c'est peu probable.

J'essaie de créer une fonction qui fera une croix à un point zz, et cela fonctionne partiellement.

En survolant les variables dans Debug alors que je suis arrêté à un point d'arrêt à la fin de la fonction, j'obtiens les valeurs. J'ai inséré les résultats z1 et z2 de NSMakePoint comme commentaires sur les lignes appropriées.

Pourquoi NSMakePoint échoue à un endroit et fonctionne ailleurs dans mon programme ?

La première occurrence devrait incrémenter zz.x de 10 ; au lieu de cela, elle incrémente zz.y de 10.
La deuxième occurrence devrait décrémenter zz.x de 10 ; au lieu de cela, elle décrémente zz.y de 10.

Aux deux occurrences suivantes, il fonctionne correctement.

J'ai d'abord essayé d'incrémenter x à l'intérieur de l'argument comme indiqué dans le commentaire du haut ; puis j'ai essayé d'incrémenter x avant l'argument comme indiqué. J'ai essayé float ainsi que CGFloat.

Qu'est-ce qui ne va pas ici ?

#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];
}

Question secondaire : Je n'ai pas été en mesure de trouver un endroit qui affirme ou nie que float et CGFloat sont interchangeables dans la série de fonctions Bezier et NSPoint dans Cocoa. Le sont-ils ?

0voto

uchuugaka Points 6143

Validez toujours les entrées. Vérifiez que les arguments passés dans votre fonction ont une valeur pertinente. Une façon de procéder est de toujours initialiser à une valeur connue au début. Cela semble être une hygiène C de base. Le fait de déclarer une variable globale d'un type C primitif ne garantit pas qu'elle ait une valeur, mais seulement qu'un espace en mémoire soit réservé pour une quantité de la taille de ce type à un moment précis de la mémoire.

CGFloat est un typedef déclaré dans un fichier d'en-tête. Vous devez vous familiariser avec la façon de rechercher ces choses dans les en-têtes, car cela deviendra une compétence inestimable. XCode rend cela super facile, mais vous devez aussi lire l'aide de Xcode ;)

CGFloat est un double ou un flottant selon le matériel. Donc, c'est un ifdef typedef ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X