paulo1205
(usa Ubuntu)
Enviado em 23/11/2016 - 11:41h
As dicas do UilianRies devem ser suficientes para seu programa funcionar.
Contudo, os erros indicados por ele seriam facilmente identificados por você mesmo se você ligasse as opções de diagnóstico do compilador. Com tais opções, erros de tipos incompatíveis seriam exibidos durante a compilação, com mensagens que tornam a identificação e correção dos problemas muito mais fácil.
Se você estiver usando o GCC, eu sempre recomendo as seguintes opções:
-O2 -Wall -Werror -pedantic-errors
Sendo:
-
-O2 liga um nível de otimização que provoca controle do ciclo de vida de variáveis locais automáticas. Com esse controle, você consegue identificar variáveis que podem ser usadas sem a devida inicialização, bem como variáveis que podem acabar ficando sem uso ao longo de todo seu ciclo de vida.
-
-Wall habilita todas as possíveis mensagens de diagnóstico. Isso inclui verificações de uso inconsistente de tipos de dados, especialmente o uso misturado de inteiros e ponteiros. Sem essa opção, o
default do compilador é ser tolerante com a maioria dos usos misturados de ponteiros e inteiros (porque esse era o comportamento
default -- e era inclusive estimulado! -- em versões antigas da linguagem).
-
-Werror transforma todas as mensagens de aviso em mensagens de erro. A diferença entre aviso e erros é que avisos não interrompem a compilação, mas erros, sim. Forçar a interrupção da compilação é uma forma de obrigar o programador a prestar atenção no código, não deixando nada passar batido por preguiça de corrigir algo, com a potencial desculpa de que “não chega a ser bem um erro”.
-
-pedantic-errors força o compilador a diagnosticar ainda mais situações de código potencialmente perigoso do que
-Wall , e a tratar tais casos como erros, em lugar de apenas exibir avisos. O programador então é obrigado a manter seu código bastante seguro quanto a tipos e eventuais conversões entre eles.
Para você ter uma ideia, veja o que acontece quando eu tento compilar seu programa sem as correções sugeridas pelo UilianRies.
x.c: In function ‘main’:
x.c:28:19: error: initialization makes pointer from integer without a cast
long int *d = 3;
^
x.c:31:5: error: passing argument 1 of ‘ran0’ makes pointer from integer without a cast
r = ran0(*d);
^
x.c:13:7: note: expected ‘long int *’ but argument is of type ‘long int’
float ran0(long *idum)
^
Com as correções sugeridas, a compilação funciona limpamente.