Dúvida em números aleatórios e Numerical Recipes [RESOLVIDO]

1. Dúvida em números aleatórios e Numerical Recipes [RESOLVIDO]

DANIEL DE SOUZA SANTOS
leinadsouza

(usa Linux Mint)

Enviado em 23/11/2016 - 11:02h

Olá pessoal,

Eu estou utilizando o Numerical Recipes em C e gostaria de pedir a ajuda de vcs, pois estou tendo problemas. Eu gostaria de gerar números aleatórios utilizando as funções descritas no livro.

Uma delas é a ran0(), que por sinal é a mais simples. Segue o código:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "nrutil.h"

#define IA 16807
#define IM 2147483647
#define AM (1.0/IM)
#define IQ 127773
#define IR 2836
#define MASK 123459876

float ran0(long *idum)
{
long k;
float ans;
*idum ^= MASK;
k=(*idum)/IQ;
*idum=IA*(*idum-k*IQ)-IR*k;
if (*idum < 0) *idum += IM;
ans=AM*(*idum);
*idum ^= MASK;
return ans;
}

int main(void)
{
long int *d = 3;
float r;

r = ran0(*d);
printf("%f\n", r);
return 0;
}


Quando executo o programa, aparece a mensagem de segmentation fault.

Como devo proceder?


  


2. MELHOR RESPOSTA

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 23/11/2016 - 11:16h

Não observei tudo, mas já percebi isso:

long int *d = 3; 

Você está declarando um ponteiro de long int e atribuindo o valor 3, quando deveria ser:

long int d = 3; 


E o segundo ponto que observei:
 r = ran0(*d); 


Você deve passar o ponteiro da variável d:
 r = ran0(&d); 


--
Uilian Ries
Linux Counter: 521986

3. Re: Dúvida em números aleatórios e Numerical Recipes

Paulo
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.


4. Re: Dúvida em números aleatórios e Numerical Recipes [RESOLVIDO]

DANIEL DE SOUZA SANTOS
leinadsouza

(usa Linux Mint)

Enviado em 23/11/2016 - 14:09h

Muito obrigado senhores Paulo e UilianRies, realmente o programa fucionou.

Eu estudei C durante um tempo e parei. Na época não cheguei a trabalhar com ponteiros e etc, então estou aprendendo agora.

Fico muito grato e vou habilitar as funções de diagnóstico do GCC.


5. Re: Dúvida em números aleatórios e Numerical Recipes [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 23/11/2016 - 14:21h

Paulo, além das flags que você colocou, eu também de utilizar:

-Wextra
Habilita alguns warnings que não estão presentes no -Wall, tais como, parâmetro não utilizado, variável não inicializada, ...

-Wshadow
Avisa quando uma determinada variável declarada, possui mesmo nome de uma já declarada anteriormente.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts