我很难理解为什么以下代码会给我下面的数字。任何人都可以解释从float到int的转换吗? (pCLocation是CGPoint)
counter = 0;
pathCells[counter][0].x = pCLocation.x;
pathCells[counter][0].y = pCLocation.y;
cellCount[counter]++;
NSLog(@"%@",[NSString stringWithFormat:@"pCLocation at:
%f,%f",pCLocation.x,pCLocation.y]);
NSLog(@"%@",[NSString stringWithFormat:@"path cell 0: %i,%i",
pathCells[counter][cellCount[counter-1]].x,pathCells[counter][cellCount[counter]].y]);
2012-03-09 01:17:37.165 50LevelsBeta1[1704:207] pCLocation at: 47.000000,16.000000
2012-03-09 01:17:37.172 50LevelsBeta1[1704:207] path cell 0: 0,1078427648
答案 0 :(得分:3)
假设您的代码正确无误:
我认为这有助于您了解NSLog
和其他printf样式函数的工作原理。当您调用NSLog(@"%c %f", a_char, a_float)
时,您的代码会将格式字符串和值压入堆栈,然后跳转到该函数代码的开头。由于NSLog接受可变数量的参数,因此它不知道从堆栈弹出多少。它知道至少有一个格式字符串,所以它弹出并开始扫描它。当它找到格式说明符%c
时,它知道从堆栈中弹出一个字节并打印该值。然后它找到%f
,所以现在它知道再弹出32位并将其打印为浮点值。然后它到达格式字符串的末尾,所以就完成了。
现在这里是踢球者:如果你骗到NSLog并告诉它你提供了一个int但实际上提供了一个浮点数,它就无法知道你在撒谎。它只是假设你说的是实话并打印它在内存中找到的任何位,但是你要求它被打印出来。
这就是为什么你会看到奇怪的值:你正在打印一个浮点值,好像它是一个int。如果你真的想要一个int值,你应该:
NSLog(@"cell.x: %i", (int)cell.x);
NSLog(@"cell.x: %.0f", cell.x);
(替代理论,仍有潜在用处。)
您可能正在打印未初始化内存的内容。
在您提供的代码中,counter = 0
并且永远不会更改。因此,您可以将值分配给:
pathCells[0][0].x = pCLocation.x;
pathCells[0][0].y = pCLocation.y;
cellCount[0]++;
然后你打印:
pathCells[0][cellCount[-1]].x
pathCells[0][cellCount[0]].y
我很确定cellCount[-1]
不是你想要的。 C允许这样做,因为即使您认为它使用特定大小的数组,foo[bar]
实际上只意味着获取内存地址foo
加偏移bar
的值。所以索引为-1只意味着退后一步。这就是为什么你没有得到警告或错误,只是垃圾数据。
您应该澄清pathCells
,cellCount
和counter
是什么以及它们之间的关系。我认为你在如何组合这些东西时有一个错误。