Преобразование из float в int выглядит странно - PullRequest
1 голос
/ 09 марта 2012

Мне трудно понять, почему следующий код дает мне цифры ниже.Кто-нибудь может объяснить это преобразование из float в int?(pCococation - это 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

1 Ответ

3 голосов
/ 09 марта 2012

Предположим, что ваш код верен:

Думаю, это поможет вам понять, как работают NSLog и другие функции в стиле printf. Когда вы вызываете NSLog(@"%c %f", a_char, a_float), ваш код помещает строку формата и значения в стек, а затем переходит к началу кода этой функции. Поскольку NSLog принимает переменное количество аргументов, он пока не знает, сколько выскочит из стека. Он знает, по крайней мере, есть строка формата, поэтому он вынимает ее и начинает сканировать. Когда он находит спецификатор формата %c, он знает, что нужно извлечь один байт из стека и вывести это значение. Затем он находит %f, поэтому теперь он знает, что нужно добавить еще 32 бита и вывести их как значение с плавающей запятой. Затем он достигает конца строки формата, так что все готово.

Теперь вот кикер: если вы лжете NSLog и говорите, что вы предоставляете int, но на самом деле предоставляете float, он не сможет узнать, что вы лжете. Он просто предполагает, что вы говорите правду, и печатает все найденные биты в памяти, однако вы просили его напечатать.

Вот почему вы видите странные значения: вы печатаете значение с плавающей запятой, как если бы оно было int. Если вы действительно хотите получить значение типа int, вам следует либо:

  1. Применить актерский состав: NSLog(@"cell.x: %i", (int)cell.x);
  2. Оставьте его плавающим, но используйте строку формата, чтобы скрыть десятичные дроби: 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 и как они связаны друг с другом. Я думаю, у вас есть ошибка в том, как вы комбинируете эти вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...