Ir para conteúdo
Fórum Script Brasil
  • 0

Segmetation Fault


Rony melo

Pergunta

ae pessoa estou tentando trocar um programa que eu tenho em matlab pra c, mas estou encontrado vários problemas, e o que mais está roubando o meu tempo é esse segmetation fault. já li aguns tópicos aqui no forum, mas não consegui resolver o meu problema.

aqui está o programa principal

#include <stdio.h>
#include "lfixo.h"
int n;
const int a=4;
float nad[7];

void main(void)

{
float Tgl[ 100][n],Ts[ 100][n],Tr[ 100][n],Ccos[ 100][n],Ccol[ 100][n],Ccog[ 100][n];
float CH2s[ 100][n],CH2l[ 100][n],CH2g[ 100][n],Ctoll[ 100][n],Ctols[ 100][n];
d 100dos();

 ci(Tgl,Ts,Tr,Ccos,Ccol,Ccog,CH2s,CH2g,CH2l,Ctoll,Ctols);
}
e aqui a minha função
#include <stdio.h>
#include "lfixo.h"

extern int a,n;
extern float nad[7];

 float Tgl0 = 580;
 float Tr0 = 590;

void ci(float Tgl[ 100][n],float Ts[ 100][n],float Tr[ 100][n],float Ccos[ 100][n],float Ccol[ 100][n],float Ccog[ 100][n], float CH2s[ 100][n],float CH2l[ 100][n],float CH2g[ 100][n],float Ctoll[ 100][n],float Ctols[ 100][n])

{
int i,j,k;

for(k=0;k<=a;++k)
{for(j=0;j<=n;++j)
{
// inicialização das temperaturas

Tgl[k][j]=Tgl0; //condições iniciais de temperatura na fase fluida
Ts[k][j]=Tgl0; //condições iniciais de temperatura na fase sólida
Tr[k][j]=Tr0; //condições iniciais de temperatura na fluido refrigerante

// incialização das concentrações
Ccos[k][j]=0;
Ccol[k][j]=0;
Ccog[k][j]=0;

CH2s[k][j]=0;
CH2l[k][j]=0;
CH2g[k][j]=0;

Ctols[k][j]=0;
Ctoll[k][j]=0;

}
} 
Ctoll[0][0]=1;
}

pra valores de a ou n maiores que 4, eu obtenho um segmetation fault... e ai, aguel tem alguma ideia

Editado por Rony melo
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

valeu Flavio, na verdade eu estava puxando n de txt que não mostrei aqui no código, no entanto este estar com valores distorcidos.

Portanto comecei a especificar o valor de n no programa principal mesmo, so pra testar o meu código.....dai esbarrei em outro segmentation fault, só que pra valores de "a" bem mais alto pra ser exato "a=17310", no entanto eu troquei os float por double e ainda continuou dando este erro.....

eu preciso que minhas matrizes sejam as maiores possíveis, pois a simulação que irei fazer vai requerer matrizes enormes mesmo. Pelo que eu andei lendo, um double e long int já seria suficiente, mas o erro persistiu.

e agora?

Editado por Rony melo
Link para o comentário
Compartilhar em outros sites

  • 0

Veleu flavio pela ajuda, demorei a responder pois tava sem net em casa.

O erro era de execução, dai eu me arretei e fui estudar esse negocio de alocação dinâmica(ainda não sei como funciona) nuns livros de C que eu tenho e casa, e lá possuia um script de alocação para matrizes bidimensionais, o qual resolveu o meu problema parcialmente.

suponhamos o seguinte código:

#include <stdio.h>
#include "lfixo.h"

extern long int a,m;
extern float nad[7];

 float Tgl0 = 580;
 float Tr0 = 590;

void ci(float **Tgl,float **Ts,float **Tr)
{
Tgl = Alocar(a,m);Ts = Alocar(a,m);Tr = Alocar(a,m);
long int i,j,k;


for(j=0;j<m;j++)
{
// inicialização das temperaturas

Tgl[0][j]=Tgl0;

 //condições iniciais de temperatura na fase fluida
 Ts[0][j]=Tgl0; //condições iniciais de temperatura na fase sólida
 Tr[0][j]=Tr0; //condições iniciais de temperatura na fluido refrigerante
}

Liberar(a,m,Tgl);Liberar(a,m,Ts);Liberar(a,m,Tr);}
onde as funções Alocar e Liberar funcionam perfeitamente alocando a minha matriz 2D. Agora considerando o seguinte main:
#include <stdio.h>
#include "lfixo.h"
 long int a=2400,m=6;
float nad[7],dt;

void main(void)

{
float **Tgl, **Ts, **Tr;

ci(Tgl,Ts,Tr);
}
esse código funciona perfeitamente. no entanto se eu alterar a função ci(mantendo o mesmo main) para:
#include <stdio.h>
#include "lfixo.h"

extern long int a,m;
extern float nad[7];

 float Tgl0 = 580;
 float Tr0 = 590;

void ci(float **Tgl,float **Ts,float **Tr)
{
Tgl = Alocar(a,m);Ts = Alocar(a,m);Tr = Alocar(a,m);
long int i,j,k;


for(j=0;j<m;j++)
{
// inicialização das temperaturas

Tgl[0][j]=Tgl0;

 //condições iniciais de temperatura na fase fluida
 Ts[0][j]=Tgl0; //condições iniciais de temperatura na fase sólida
 Tr[0][j]=Tr0; //condições iniciais de temperatura na fluido refrigerante
}
for(k=0;k<a;k++){
for (j=1;j<=m-1;j++) {
 //   nós internos
       Tgl[k+1][j]=Tgl[k][j]*(1-2*nad[1]-nad[2]-nad[3])+Tgl[k][j-1]*(nad[0]+nad[1])+Tgl[k][j+1]*(-nad[0]+nad[1])+nad[2]*Ts[k][j]+nad[3]*Tr[k][j];

  }
}
Liberar(a,m,Tgl);Liberar(a,m,Ts);Liberar(a,m,Tr);
}

o programa não roda até o valor final de a, por exemplo, para a=240, o programa só roda até a=226 e é retornado um segmentation fault. Se eu disser que a=226, ele so rodará para um valor de a=200, irá me rotornará um segmentation faul também, ou seja, não importa o valor de o for nunca chega até o final.....e eu prciso fazer esse programa rodar de todo jeito. isso será um trabalho que vai para um congresso de engenharia química.

help me please?!?!?!?!?

Editado por Rony melo
Link para o comentário
Compartilhar em outros sites

  • 0

Mostra o código dessa função Alocar( )

Você provavelmente está usando umas dessas funções: malloc / new

Além de permitirem alocar espaço de memoria, elas prmitem verificar se a memoria foi alocada corretamente. Exemplo:

int *espacoMemInt;
if ( espacoMemInt = (int *) malloc(sizeof(int)) )
   printf("Espaço de memoria alocado com sucesso");
else
   printf("ERRO! Espaço de memoria insuficiente para alocar um dado do tipo inteiro");

Acredito que você tá é ficando sem memoria! Eu axo... mas pode não ser. Faça um teste como esse daí de cima.

Link para o comentário
Compartilhar em outros sites

  • 0

olha aqui flávio os códigos do alocar e liberar

float **Alocar (int m, int n)
{
float **v; /* ponteiro para a matriz */
int i; /* variavel auxiliar */
if (m < 1 || n < 1) { /* verifica parametros recebidos */
printf ("** Erro: Parametro invalido **\n");
return (NULL);
}
/* aloca as linhas da matriz */
v = (float **) calloc (m, sizeof(float *));
if (v == NULL) {
printf ("** Erro: Memoria Insuficiente **");
return (NULL);
}
/* aloca as colunas da matriz */
for ( i = 0; i < m; i++ ) {
v[i] = (float*) calloc (n, sizeof(float));
if (v[i] == NULL) {
printf ("** Erro: Memoria Insuficiente **");
return (NULL);
}
}
return (v); /* retorna o ponteiro para a matriz */
}
e aqui tá o código para liberar
float **Liberar (int m, int n, float **v)
{
int i; /* variavel auxiliar */
if (v == NULL) return (NULL);
if (m < 1 || n < 1) { /* verifica parametros recebidos */
printf ("** Erro: Parametro invalido **\n");
return (v);
}
for (i=0; i<m; i++) free (v[i]); /* libera as linhas da matriz */
free (v); /* libera a matriz */
return (NULL); /* retorna um ponteiro nulo */
}

detalhe, esse código eu pegquei de uma apostilha da UFMG....

esse negocio de migra de linguagem tá dando um trabalho!!!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...