Предположим, что ваш код верен:
Думаю, это поможет вам понять, как работают NSLog
и другие функции в стиле printf. Когда вы вызываете NSLog(@"%c %f", a_char, a_float)
, ваш код помещает строку формата и значения в стек, а затем переходит к началу кода этой функции. Поскольку NSLog принимает переменное количество аргументов, он пока не знает, сколько выскочит из стека. Он знает, по крайней мере, есть строка формата, поэтому он вынимает ее и начинает сканировать. Когда он находит спецификатор формата %c
, он знает, что нужно извлечь один байт из стека и вывести это значение. Затем он находит %f
, поэтому теперь он знает, что нужно добавить еще 32 бита и вывести их как значение с плавающей запятой. Затем он достигает конца строки формата, так что все готово.
Теперь вот кикер: если вы лжете NSLog и говорите, что вы предоставляете int, но на самом деле предоставляете float, он не сможет узнать, что вы лжете. Он просто предполагает, что вы говорите правду, и печатает все найденные биты в памяти, однако вы просили его напечатать.
Вот почему вы видите странные значения: вы печатаете значение с плавающей запятой, как если бы оно было 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
и как они связаны друг с другом. Я думаю, у вас есть ошибка в том, как вы комбинируете эти вещи.