2013-10-07 2 views
1
#define RAND_MAX 10 
#include<stdio.h> 
int main() 
{ 
    double x; 
    x=randRange(-1.0,1.0); 
    printf("x value is %f::",x); 
    return 0; 
} 

double randRange(double min, double max) 
{ 
    return rand() * (max - min)/RAND_MAX + min; 
} 

Error :: Сниппет ниже ошибка является generated--C ошибка конфликтующих типов

$gcc main.c -o demo -lm -pthread -lgmp -lreadline 2>&1 
main.c:11:8: error: conflicting types for 'randRange' 
double randRange(double min, double max) { 
^ 
main.c:6:5: note: previous implicit declaration of 'randRange' was here 
x=randRange(-1.0,1.0); 
^ 

Ошибка в конфликтующих типов ?? Я проверяемых возвращаемые типы.

ответ

5

Вам нужно объявить функцию выше точки, где она вызывается.

double randRange(double min, double max); 

int main() 
{ 
    double x; 
    x=randRange(-1.0,1.0); 
    ... 

double randRange(double min, double max) 
{ 

Если вы этого не сделаете, ANSI C дает неявное объявление для функции, возвращающей int

1

Это потому, что вы используете randRange прежде, чем это определено. Переместите определение выше, где вы его используете, или создайте прототип (объявление) раньше.

Функции, которые не объявляются, когда вы вызываете их по умолчанию для возврата int. Это объявление по умолчанию - это то, что подразумевается под «неявным объявлением» в сообщении об ошибке.

1

Ваше неявное объявление randRange объявляет его как int (*)(float, float).

Всегда предопределяйте функции, чтобы избежать подобных ошибок. Просто разместите

double randRange(double min, double max); 

над вашим main.

+0

Я не уверен в 'int (*) (float, float)'. Я скорее думаю, что это 'int (*)()', не имеющий заданных типов аргументов. – glglgl

+0

@glglgl Nah, я, как правило, получаю предупреждения компилятора, когда я делаю неявные объявления с неправильно введенными указателями. например передавая 'struct a *' где 'void *' ожидается в неявной декларации. –

0

Вы должны использовать «старый» компилятор C (или запустить современный компилятор в «старом» режиме C89/90). В совместимом современном компиляторе C (C99 и более позднем) ваш код, как правило, не сможет скомпилироваться еще раньше, в момент первого вызова randRange, поскольку вы пытаетесь использовать функцию randRange до ее объявления. Это незаконно в современном C.

В старой C (C89/90) вызов незаявленной функции является законным. Попытка вызвать randRange как randRange(-1.0,1.0) делает компиляцию неявно заключением, что она должна быть функцией, которая имеет два параметра double и возвращает int. Если ваша функция действительно определена по-разному, то поведение вашей программы не определено.

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

Смежные вопросы