2010-05-27 6 views
2

У меня есть код, который я переношу из системы SGI с использованием компилятора MIPS. Он имеет функции, объявленные как имеющие двойной тип возврата. Если функция не может найти правый двойной, эти функции возвращают «NULL»как вернуть NULL для двойной функции с помощью компилятора Intel C?

Компилятор Intel C не нравится, но я пытался выяснить, есть ли опция компилятора для включения этой «функции», чтобы Я могу скомпилировать без изменения кода. Я проверил справочную страницу и не могу ее найти.

Благодаря

Пример кода, который в настоящее время существует, и прекрасно работает с MIPS

double some_function(int param){ 
    double test = 26.25; 
if(param == 10){ 
    return test; 
} 
return (NULL); 
} 

Процессор Intel компилятор жалуется: ошибка: тип возвращаемого значения не совпадает с типом функции

+3

«null» не является возможным значением для двойного типа. –

+1

Отправьте код. – 2010-05-27 16:51:03

+0

Опубликовано код – Derek

ответ

2

Основываясь на ваш комментарий:

I just checked, and the calling functions just use it as if it is a valid double (in an if statement)

Я бы просто изменить функцию return 0; вместо return NULL;

+0

Понятно, что я мог это сделать, я просто искал какой-то флаг компилятора или что-то вроде , как кто-то упоминал, флаги типа NaN, которые позволяли бы возвращать тип NULL, чтобы код был согласован между платформами. – Derek

+0

@Derek: изменение «NULL» до «0» в этом контексте (возврат «double») быть не-op на исходной платформе, поэтому вы можете использовать один и тот же код в обоих местах (он работает только сейчас, потому что эта платформа определяет «NULL» как «0», тогда как новый определяет ее как «(void *) 0 '). – caf

3

Может существовать возможность «NaN» (не число), используя параметры компилятора. Но это все равно не будет нулевым.

1

Это не компилятор, но вы могли бы #define NULL 0 (теоретически) получить желаемый эффект.

+0

Я буду иметь это в виду, если я не могу найти что-либо еще – Derek

+0

Хотя это правильно и, вероятно, прагматичное решение *, если * OP уже собирается изменить исходный код, он может точно также внести соответствующие изменения. Это означало бы модификацию конкретной функции, о которой идет речь, чтобы она возвращала только нормальные значения. 'NULL' - который предназначен для типов указателей - определенно не является одним из них. – stakx

+0

также верно, и я стараюсь избегать этого, поэтому код будет согласован в обеих системах. – Derek

1

Вы уверены, что не вернули указатель в двойное? Двойной NULL не имеет смысла, так как нуль является допустимым значением для double.

+0

Положительный это не указатель return – Derek

0

NULL не обязательно имеют особое значение, когда он возвращается из функции. Если вы хотите указать, что функция не завершилась успешно, общим методом является возврат некоторого значения, которое никогда не будет возвращено при нормальных обстоятельствах. Обычно это означает возврат недопустимого значения. Когда функция возвращает указатель, она часто использует NULL как возвращаемое значение, сигнализирующее об ошибке, поскольку указатель NULL редко является значением, которое пользователь ожидает от функции.

Константа NULL имеет смысл только в контексте указателей, а так как вы возвращаете скалярное значение, компилятор нажимает на вас об использовании NULL. Вместо того, чтобы возвращать NULL, найдите некоторое значение, которое никогда не может быть действительным возвращаемым значением и использовать его в качестве индикатора ошибки. Чтобы было более ясно, что вы делаете, используйте этот параметр с константой, используя #define AN_ERROR_OCCURED <<someval>>, чтобы избежать использования «магических чисел».

Другой распространенный способ сделать это - использовать глобальный errno (see errno.h). Если ваша функция встречает ошибку, установите errno на некоторое ненулевое значение перед возвратом. Затем код, вызывающий вашу функцию, может проверять и обрабатывать ошибки, используя что-то вроде if (errno) {...}.

Еще один способ заключается в том, чтобы функция возвращала ноль в случае успеха и ненулевой код ошибки в противном случае. Если пользователю необходимо вернуть данные из функции, дополнительный указатель «возвращаемого буфера» должен быть передан функции.

0

Я думаю, что я просто использую #ifdef INTEL для флага компилятора и определяю его как ноль для этой опции времени компиляции. Вид боли, но, кажется, лучший способ.

+0

Это не самое лучшее - возвращающий нуль явно есть. – 2010-05-27 17:27:58

+0

Не когда мне нужно поддерживать совместимость с другой системой, которая на самом деле является базовой, и она работает на этой системе – Derek