Переменные выглядят странно в NSLog? - PullRequest
1 голос
/ 21 июня 2011

Я довольно новичок в разработке приложений для iphone, и поэтому я начинаю использовать инфраструктуру Cocos2d вместо цели c с нуля, потому что она несколько снизила кривую обучения, и я нахожу ее намного проще. Я пытаюсь сделать некоторые учебники с сайта Cocos2d, но, будучи человеком, а не овцой, решил попробовать кое-что, чего не было в учебнике.

Итак, вот соответствующий код из учебника:

- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint location = [self convertTouchToNodeSpace: touch];
    [cocosGuy stopAllActions];
    [cocosGuy runAction: [CCMoveTo actionWithDuration:1 position:ccp( location.x + 32, location.y + 32)]];

Это работает, как и ожидалось, парень-кокос переходит туда, где я касаюсь своего iPod с задержкой в ​​одну секунду и смещением 32 пикселя. Итак, теперь я хотел бы получить некоторую текстовую обратную связь о том, где я касался экрана. Я пытался использовать NSLog для отображения некоторой информации о location касания:

 NSLog([NSString stringWithFormat:@"x=%d y=%d", location.x, location.y]);

Xcode любезно сообщает мне: Format not a string literal and no format arguments. Если я не полностью ошибаюсь, @"text" является строковым литералом в цели C, а две переменные местоположения являются аргументами формата.

При запуске консоль отображает что-то вроде:

2011-06-20 19:54:22.765 Lesson1[315:707] x=0 y=1078640640
2011-06-20 19:54:23.887 Lesson1[315:707] x=0 y=1080631296
2011-06-20 19:54:24.576 Lesson1[315:707] x=0 y=1080242176

когда я касаюсь экрана iPod в трех случайных местах. Кажется, что x никогда не меняется, а y всегда массивное целое число.

Что не так с моим кодом, и, будучи новичком в мире разработки для iphone, задачи c и cocos2d, как я могу попытаться отладить это сам в будущем?

Обратите внимание, что это буквально мой второй день экспериментирования со всем этим, так что извините, если это невероятно очевидный или глупый вопрос.

Ответы [ 3 ]

8 голосов
/ 21 июня 2011

x, y члены CGPoint являются float с, а не int с, следовательно, вы должны использовать %f вместо %d.

Кроме того, NSLog() может самостоятельно выполнять форматирование. Попробуйте:

NSLog(@"x=%f y=%f", location.x, location.y);

вместо этого. Обратите внимание, что в коде над первым параметром NSLog():

@"x=%f y=%f"

является строковым литералом, тогда как в вашем коде первый параметр не является литералом:

[NSString stringWithFormat:@"x=%d y=%d", location.x, location.y]
3 голосов
/ 21 июня 2011

Похоже, вы используете неверные спецификаторы формата строки.

%d для int, но атрибуты x и y структуры CGPoint на самом делеCGFloat (который определяется как float или double, в зависимости от 32 или 64-битного)

Список спецификаторов формата Apple можно посмотреть здесь: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html%23//apple_ref/doc/uid/TP40004265

Он говорит, что CGFloats должен использовать %f или %g.

Чтобы +stringWithFormat: правильно интерпретировал значения, ваша строка формата должна выглядеть как @"x=%f y=%f"

Другой совет - NSLog () фактически имеет встроенное форматирование, поэтому вы можете просто использовать

NSLog(@"x=%f y=%f", location.x, location.y);

вместо [NSString stringWithFormat:…

1 голос
/ 21 июня 2011

Причина предупреждения состоит в том, что NSLog ожидает, что его первый аргумент будет строковым литералом, и вы передаете ему объект, который вы только что создали. Кроме того, я почти уверен, что location.x и location.y будут числами с плавающей запятой, а не целыми числами. Попробуйте использовать %f вместо %d. В любом случае, вы должны использовать NSLog для форматирования строки, например, так:

NSLog(@"x=%f y=%f", location.x, location.y);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...