Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

1. Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

alexsandro schneider
Aschneider

(usa Outra)

Enviado em 14/05/2014 - 00:01h

Olá! Estou com o seguinte problema. Possuo um algoritmo em C que funciona perfeito no ubuntu 12.04, porém, para versões 12.10 ou superior, o algoritmo não funciona. Simplesmente quando tento compilar no terminal, para versões 12.10 ou 14.04 aparece falha de segmentação de imagem (o mesmo algoritmo), oque não ocorre no ubuntu 12.04.

Instalei o netbeans no ubuntu 14.04, mas o algoritmo também não roda lá. Estou postando este problema aqui pois, procurei muito pela internet e não achei nada parecido. Talvez seja alguma coisa simples que envola alguma incompatibilidade de kernel ou algo do tipo (chuto, pois sou leigo no assunto).

Muito obrigado e desde já agradeço.


  


2. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 14/05/2014 - 06:54h

Sem ver o código fica difícil. Falha de segmentação ocorre quando seu algoritmo tenta acessar espaços já alocados na memória.


3. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

Reginaldo de Matias
saitam

(usa Slackware)

Enviado em 14/05/2014 - 09:24h

debuga o algoritmo C com gdb.

posta o fonte para analisarmos ...


4. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

Carlos Alberto Mazzer
cmazzer

(usa Ubuntu)

Enviado em 14/05/2014 - 17:58h

Mostra o comando que você esta usando para compilar, e a mensagem de erro que está aparecendo no seu terminal.


5. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

alexsandro schneider
Aschneider

(usa Outra)

Enviado em 14/05/2014 - 21:50h

rei astro: O algoritmo será postado no final. O algoritmo é um integrador de equações diferenciais conhecido como runge-kutta de quarta ordem. Tal algoritmo dá como resposta um arquivo .dat com a solução numérica de uma integral para um problema comum em física chamado massa-mola. Foi criado pelo meu orientador e funciona perfeitamente no ubuntu 12.04 ou inferior e também em compiladores no windows.

saitam: Nunca utilizei esse 'gdb'. Pretendo realizar o teste sugerido. Sou matemático, não entendo muita coisa de programação.

cmazzer: O comando é: gcc integrador.c -fm
O arquivo a.out é gerado sem problemas. Porém quando o executo no terminal (via comando ./a.out), aparece aparece a frase ''falha de segmentação (imagem do núcleo gravada).

Utilizando apenas a lógica. Acredito que o problema esteja relacionado com bibliotecas nos arquivos no início do algoritmo, como 'stdio.h', 'math.h' e etc. Pois, se houvesse algum erro no algoritmo, o mesmo não iria rodar em compiladores do windows, ou mesmo no ubuntu 12.04 ou inferior.

Observação: Para que o algoritmo gere o executável é necessário no diretório o arquivo 'nrutil.h'.

Pessoal, muito obrigado por responderem.


Algoritmo

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

# define N 4 /*Numero de eq diferenciais parciais de 1a ordem*/
# define h 0.01 /*Passo da Integracao*/
# define Pi 3.141592654


/* Declaracao das funcoes */
void calcula_d(double t,double pontos[N],double derivadas[N]);
void rk4 (double t0,double y_antes[N],double y_depois[N]);
double mod(double x, double y);
double heaviside(double x);


/* Declaracao das variaveis globais */
double m=80; //massa da particula acoplada `a mola
double g=9.81; //constante da mola
double gama=5.38;
double A=0.00538/80;




int main (int argc, char *argv[])
{
double y[N]={0.0},y_depois[N],t=0;
int i,j;

FILE *ofp;
ofp=fopen("phase_space.dat","w");

//condicoes iniciais:
t=0.0;
y[0]=0;
y[1]=3048;
y[2]=134;
y[3]=0;


while(t<262.)
{
printf("%f \n",t); //impressao na tela

//integracao numerica
rk4(t,y,y_depois);
for(i=0;i<N;i++) y[i]=y_depois[i];
t=t+h;

fprintf(ofp,"%f %f %f %f %f\n",t, y[0],y[1], y[2], y[3]); //impressao para arquivo "phase_space.dat"
}
}




/* Funcoes */


//Funcao derivada

void calcula_d(double t,double pontos[N],double derivadas[N])
{
double x, y, u, v;

x=pontos[0];
y=pontos[1];
u=pontos[2];
v=pontos[3];


derivadas[0]=pontos[2]; //
derivadas[1]=pontos[3];
derivadas[2]=-A*u*sqrt(u*u+v*v);
derivadas[3]=-g-A*v*sqrt(u*u+v*v);

}


// integrador de Runge-Kutta de quarta ordem

void rk4 (double t0,double y_antes[N],double y_depois[N])
{
int i;
double t;
double y_copia[N], k[4][N],derivadas[N];

t=t0;
for(i=0;i<N;i++) y_copia[i] = y_antes[i];
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[1][i]=h*derivadas[i];

t=t0+h/2;
for(i=0;i<N;i++) y_copia[i]= y_antes[i]+k[1][i]/2;
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[2][i]=h*derivadas[i];

t=t0+h/2;
for(i=0;i<N;i++) y_copia[i]=y_antes[i]+k[2][i]/2;
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[3][i]=h*derivadas[i];

t=t0+h;
for(i=0;i<N;i++) y_copia[i]=y_antes[i]+k[3][i];
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[4][i]=h*derivadas[i];

for(i=0;i<N;i++) y_depois[i]=y_antes[i]+k[1][i]/6+k[2][i]/3+k[3][i]/3+k[4][i]/6;
}

















6. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

alexsandro schneider
Aschneider

(usa Outra)

Enviado em 15/05/2014 - 00:18h

cmazzer: Segue o resultado de gdb.

(gdb) file a.out
Lendo símbolos de a.out...concluído.
(gdb) run
Starting program: /home/leko/integrador_2/a.out
0.000000

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400b24 in rk4 (t0=0, y_antes=0x7fffffffdf00,
y_depois=0x7fffffffdf10) at integrador.c:98
98 }

Obrigado.


7. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 15/05/2014 - 07:14h

Tentei compilar aqui e tem muitos erros. Por exemplo na linha 50, o trecho do código:

for(i=0;i<N;i++) y=y_depois;

y_depois é declarado como um vetor, em C você não pode atribuir um vetor diretamente a uma variável, tem que ser índice por índice.


8. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

alexsandro schneider
Aschneider

(usa Outra)

Enviado em 15/05/2014 - 13:10h

Opa. Me desculpem, acabei postando um algoritmo alterado e não o original enviado pelo meu orientador. Não sei por que, mas na hora que colei o algoritmo sumiram alguns índices, como no caso do k[4][i] e y_depois, notem que existe um espaço extra no índice i (k[4][i ], por exmplo), sem isso a matriz é visualizada como vetor k[4], na hora que posto no site. Mesmo com o algoritmo postado abaixo, o erro de falha de segmentação persiste.

Me desculpem pelo erro e obrigado pela ajuda.

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

# define N 2 /*Numero de eq diferenciais parciais de 1a ordem*/
# define h 0.01 /*Passo da Integracao*/
# define Pi 3.141592654


/* Declaracao das funcoes */
void calcula_d(double t,double pontos[N],double derivadas[N]);
void rk4 (double t0,double y_antes[N],double y_depois[N]);

/* Declaracao das variaveis globais */
double m=1; //massa da particula acoplada `a mola
double k=2; //constante da mola


int main (int argc, char *argv[])
{
double y[N]={0.0},y_depois[N],t=0;
int i,j;

FILE *ofp;
ofp=fopen("phase_space.dat","w");

//condicoes iniciais:
t=0.0;
y[0]=0.0;
y[1]=0.59;


while(t<50.)
{
printf("%f \n",t); //impressao na tela

//integracao numerica
rk4(t,y,y_depois);
for(i=0;i<N;i++) y[i ]=y_depois[i ];
t=t+h;

fprintf(ofp,"%f %f %f\n",y[0],y[1],t); //impressao para arquivo "phase_space.dat"
}
}




/* Funcoes */

//a EDO abaixo e' do oscilador harmonico (particula de massa m presa a mola de constante k)
void calcula_d(double t,double pontos[N],double derivadas[N])
{
double x, v;

x=pontos[0];
v=pontos[1];

derivadas[0]=v; //
derivadas[1]=-k*x/m;
}


// integrador de Runge-Kutta de quarta ordem
void rk4 (double t0,double y_antes[N],double y_depois[N])
{
int i;
double t;
double y_copia[N], k[4][N],derivadas[N];

t=t0;
for(i=0;i<N;i++) y_copia[i ] = y_antes[i ];
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[1][i ]=h*derivadas[i ];

t=t0+h/2;
for(i=0;i<N;i++) y_copia[i ]= y_antes[i ]+k[1][i ]/2;
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[2][i ]=h*derivadas[i ];

t=t0+h/2;
for(i=0;i<N;i++) y_copia[i ]=y_antes[i ]+k[2][i ]/2;
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[3][i ]=h*derivadas[i ];

t=t0+h;
for(i=0;i<N;i++) y_copia[i ]=y_antes[i ]+k[3][i ];
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[4][i ]=h*derivadas[i ];

for(i=0;i<N;i++) y_depois[i ]=y_antes[i ]+k[1][i ]/6+k[2][i ]/3+k[3][i ]/3+k[4][i ]/6;
}





9. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 15/05/2014 - 23:06h

Pois é, esse código compila, mas quando executa dá falhas de segmentação.

Modificando esses trechos de for:

...
for(i=0;i<N;i++) k[1][i]=h*derivadas[i ];
...
for(i=0;i<N;i++) k[2][i]=h*derivadas[i ];
...
for(i=0;i<N;i++) k[3][i]=h*derivadas[i ];
...
for(i=0;i<N;i++) k[4][i]=h*derivadas[i ];
...

Para:

...
for(i=0;i<N;i++) k[0][i]=h*derivadas[i ];
...
for(i=0;i<N;i++) k[1][i]=h*derivadas[i ];
...
for(i=0;i<N;i++) k[2][i]=h*derivadas[i ];
...
for(i=0;i<N;i++) k[3][i]=h*derivadas[i ];
...

Executa normalmente.


10. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

Igor Morais
igormorais

(usa Gentoo)

Enviado em 15/05/2014 - 23:20h

Meio estranho isso. Se você não fez nenhuma alteração no código e tem instalado tudo o que tinha na versão anterior isso não deveria acontecer.


11. Re: Algoritmo em C não funciona em ubuntu 12.10 / 14.04 [RESOLVIDO]

alexsandro schneider
Aschneider

(usa Outra)

Enviado em 15/05/2014 - 23:29h

Fiz as alterações sugeridas e o código funcionou perfeitamente, agora no ubuntu 14.04. Muito obrigado mesmo pessoal. Apenas acho no mínimo estranho funcionar (mesmo o algoritmo estando errado) no ubuntu 12.04 e não no 14.04.
Novamente gostaria de agradecer à vocês.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts