Я пишу функцию, которая возвращает указатель на массив чисел. Чтобы иметь возможность перебирать числа с помощью указателя, я установил последний элемент в NAN
чтобы отметить конец массива.
Моя петля была что-то вроде
for(int* it=ptr;!isnan(*it);++it)
//print *it
но он продолжал работать, пока не рухнул, поэтому я написал тестовый код:
int* test = new int[1];
*test = NAN;
cout << isnan(NAN) << endl;
cout << isnan(*test) << endl;
И результат был:
1
0
Я видел много примеров использования NAN
как «пробка» в массивах. Так почему это не работает?
У вас неопределенное поведение, потому что вы пытаетесь конвертировать NAN
, который имеет тип с плавающей запятой, к int
и это значение не может быть представлено int
,
§4.9 / 1 [conf.fpint] Значение типа с плавающей точкой может быть преобразовано в значение типа целого числа. Усечение преобразования; то есть дробная часть отбрасывается. Поведение не определено, если усеченное значение не может быть представлено в типе назначения.
поскольку NAN
это просто специальное значение чисел с плавающей запятой, не имеет смысла хранить его в int
, Целочисленные типы не имеют специального не числового значения. Вы мог используйте определенное значение для обозначения конца массива, но это не особенно приятное решение.
Если вы собираетесь динамически распределять свой массив таким образом, вам придется отслеживать его размер самостоятельно, передавая его по кругу. Для других массивов (где у вас есть нечто, обозначающее сам объект массива, а не просто указатель на его элементы), вы можете использовать std::end
чтобы найти конец этому. Однако, как обычно, я предлагаю вместо этого использовать стандартные контейнеры.
isnan()
работает только с плавающей точкой.