Funciona no Windows mas da Segmentation fault no LINUX [RESOLVIDO]

1. Funciona no Windows mas da Segmentation fault no LINUX [RESOLVIDO]

Lucas Henrique Faleiro
lucasfaleiro

(usa Ubuntu)

Enviado em 12/05/2016 - 01:31h

Boa noite pessoal,
Estou tento um problema com um trabalho da faculdade. O programa foi desenvolvido em C, fiz ele todo no windows porém o professor disse que o arquivo seria testado a partir do linux e da linha de comando (./executavel <arquivo de entrada> <arquivo de saida>).

Consegui fazer ele executar da maneira como eu queria, no windows. Porém, quando eu abri ele no LINUX e fui rodar, o programa executou mas na tela de execução apareceu Segmentation fault. Como eu disse, no windows funcionou perfeitamente. Em ambos os casos eu utilizei o codeblocks para poder compilar e executar, e mesmo utilizando o terminal para executar no linux, deu o mesmo problema.

Para poder rodar no windows, eu utilizei o codeblocks para "emular" os argumentos que seriam passados na execução (arquivo de entrada e saída) utilizando a aba Project->Set Programs' Argument. Como eu disse, rodou perfeitamente, sem erro algum. Já no LINUX, de qualquer forma que eu tentei compilar e executar deu Segmentation Fault.

Pelo que eu entendi no debug, o programa não está reconhecendo os argumentos que estão sendo passados para o argv quando eu rodo ele no Linux, mas não tenho mais ideia do que posso fazer.

O código está bastante extenso, porém acredito que o problema seja algo relacionado ao argc e argv, só não sei qual rs.
Até tentei colocar um printf logo na primeira linha da main, para ver se ele chegaria a rodar algo antes de dar Segmentation Fault, mas nem este printf foi impresso.

Segue o código.

main.c
#include <stdio.h>
#include <stdlib.h>
#include "labirinto.h"

int main(int argc, char *argv[]){
labirinto L;
VariaveisLabirinto Variaveis;
TPilha Pilha_de_coordenadas;

Variaveis.m1 = 0; Variaveis.m2 = 0; Variaveis.p1 = 0; Variaveis.p2 = 0; //Inicia com 0 todas as variáveis que serão contadas.

L = leLabirintoDeArquivo(argv);

Pilha_de_coordenadas = achaSaida (L,&Variaveis);

Variaveis.p2 = Tamanho(Pilha_de_coordenadas)-1;

ImprimePilha(Pilha_de_coordenadas,Variaveis,argv);

return 0;
}

labirinto leLabirintoDeArquivo(char **argv){ //A função lê o arquivo e guarda o número de linhas e colunas, o os caracteres do arquivo em uma matriz.
labirinto L;
FILE *fpin = fopen(argv[1], "r"); //abre o arquivo no modo leitura
if (fpin == NULL){ //Testa se o arquivo foi aberto com sucesso.
printf("Abertura do arquivo de entrada falhou.\n");
exit(1);
}

int i,j,k=0; //A variável k dirá se as linhas já foram lidas, para poder ler então as colunas.
L.linhas=0 ; L.colunas=0;

char string [BUFSIZ]; //Esta string conterá a primeira linha do arquivo, onde está escrito a quantidade de linhas e colunas presentes.
fgets (string, BUFSIZ, fpin);

for(i=0;;i++){ //Este for é responsável por transformar os caracteres da primeira linha do arquivo em números, indicando a quantidade de linhas e colunas que o labirinto possui.
if (string[i]>='0' && string[i]<='9' && k==0) L.linhas = (L.linhas * 10) + (string[i] - 48);
else{
if (string[i] == ' ') k=1;
else{
if (string[i]>='0' && string[i]<='9' && k==1) L.colunas = (L.colunas * 10) + (string[i] - 48);
else{
if (string[i]== '\n' || '\0') break;
}
}
}
}

for (i=0 ; i<=L.linhas ; i++){ //Este for é responsável por escrever os caracteres do labirinto na matriz.
for (j=0 ; j<=L.colunas ; j++){
L.matriz[i][j] = fgetc(fpin);
}
}
fclose(fpin);
return L;
}

TPilha achaSaida (labirinto L,VariaveisLabirinto *Variaveis){ //Esta função irá ler o labirinto para tentar achar a saída.
int i=1,j=1;
int operacao; //A variável operacao mostra: 1=Empilhar 2=Desembilhar;
int direcao=1; // A variável mostra: 1=direita; 2=baixo; 3=esquerda; 4=cima.
TPilha Pilha_de_coordenadas;
TItem Coordenada_atual;
TItem auxiliar;
auxiliar.linha = 0 ; auxiliar.coluna = 0;

FPVazia(&Pilha_de_coordenadas); //Função que cria a pilha vazia.

Coordenada_atual.linha = i; Coordenada_atual.coluna = j;
Empilha(Coordenada_atual,&Pilha_de_coordenadas);

while(L.matriz[i][j]!='s'){
switch (direcao){
case 1: //último passo para a direita; Deverá verificar na seguinte ordem: i++, j++, i--, j--;
if (L.matriz[i+1][j]!='#') {
i++; direcao=2;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2; //Esta condição compara se o novo valor de coordenadas já está presente na pilha.
else operacao=1;} //Verifica à sua direita atual.
else{
if (L.matriz[i][j+1]!='#') {
j++; direcao=1;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;} //Verifica à sua frente
else {
if (L.matriz[i-1][j]!='#') {
i--; direcao=4;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;} //Vereficia à sua esquerda
else{
if (L.matriz[i][j-1]!='#') {j--; direcao=3 ; operacao=2;} //Verifica atrás.
else direcao=0; //Se todas as posições em volta forem #, o labirinto nao tem saída.
}
}
}
break;
case 2://último passo para baixo; Deverá verificar na seguinte ordem: j--,i++,j++,i--;
if (L.matriz[i][j-1]!='#') {
j--; direcao=3;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;}
else{
if (L.matriz[i+1][j]!='#') {
i++; direcao=2;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;}
else{
if (L.matriz[i][j+1]!='#') {
j++; direcao=1;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;}
else{
if (L.matriz[i-1][j]!='#') { i--; direcao=4 ; operacao=2; }
else direcao=0; //Se todas as posições em volta forem #, o labirinto nao tem saída.
}
}
}
break;
case 3://último passo para esquerda; Deverá verificar na seguinte ordem: i--,j--,i++,j++;
if (L.matriz[i-1][j]!='#') {
i--; direcao=4;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;}
else{
if (L.matriz[i][j-1]!='#') {
j--; direcao=3;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;}
else{
if (L.matriz[i+1][j]!='#') {
i++; direcao=2 ;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;}
else{
if (L.matriz[i][j+1]!='#') { j++; direcao=1 ; operacao=2; }
else direcao=0; //Se todas as posições em volta forem #, o labirinto nao tem saída.
}
}
}
break;
case 4: //Último passo para cima; Deverá verificar na ordem: j++; i--; j--; i++
if (L.matriz[i][j+1]!='#') {
j++; direcao=1;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;}
else{
if (L.matriz[i-1][j]!='#') {
i--; direcao=4;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;}
else{
if (L.matriz[i][j-1]!='#') {
j--; direcao=3;
if ((auxiliar.linha==i)&&(auxiliar.coluna==j)) operacao=2;
else operacao=1;}
else{
if (L.matriz[i+1][j]!='#') { i++; direcao=2 ; operacao=2; }
else direcao=0; //Se todas as posições em volta forem #, o labirinto nao tem saída.
}
}
}
break;
}

if (direcao == 0) break;


switch (operacao){ //Caso a operacao seja: 1=Empilha ; 2=Desempilha
case 1:
if (L.matriz[i][j]=='m') {Variaveis->m1++ ; Variaveis->m2++;}
Coordenada_atual.linha = i; //Coloca as coordenadas no ítem que será adicionado à célula da pilha.
Coordenada_atual.coluna = j;
Empilha(Coordenada_atual,&Pilha_de_coordenadas);
auxiliar = Pilha_de_coordenadas.Topo->Prox->Prox->Item; //Coloca o penúltimo valor da pilha no item auxiliar para que seja comparado no primeiro switch.
Variaveis->p1++; //A variável p1 conta todos os passos dados.
break;
case 2:
Desempilha(&Pilha_de_coordenadas,&Coordenada_atual);
if (L.matriz[Coordenada_atual.linha][Coordenada_atual.coluna]=='m') Variaveis->m2--; //Se o item desempilhado for moeda, retira-se 1 de m2.
L.matriz[Coordenada_atual.linha][Coordenada_atual.coluna] = '#'; //A posição desempilhada deve virar # para que não entre mais nela.
Variaveis->p1++; //A variável p1 conta todos os passos dados.
if ((auxiliar.linha==1) && (auxiliar.coluna=1)) break;
auxiliar = Pilha_de_coordenadas.Topo->Prox->Prox->Item;
break;
}
}
if (direcao==0) Variaveis->saidaEncontrada=0; //Se tiver saído do while por conta da direcao==0, não tem saída.
else Variaveis->saidaEncontrada=1; //Se tiver saído do while porque achou o 's', tem saída.

return Pilha_de_coordenadas;
}

void FPVazia(TPilha *Pilha){ //Cria uma pilha vazia
Pilha->Topo = malloc(sizeof(TCelula));
Pilha->Fundo = Pilha->Topo;
Pilha->Topo->Prox = NULL;
Pilha->Tamanho = 0;
}

int Vazia (TPilha Pilha){ //Testa se a pilha está vazia
return (Pilha.Topo == Pilha.Fundo);
}

void Empilha (TItem x,TPilha *Pilha){ //Coloca um item na pilha
Apontador Aux = malloc(sizeof(TCelula));
Pilha->Topo->Item = x;
Aux->Prox = Pilha->Topo;
Pilha->Topo = Aux;
Pilha->Tamanho++;
}

void Desempilha (TPilha *Pilha, TItem *Item){ //Retora um item da pilha
if (Vazia(*Pilha)) {
printf("Erro: Pilha vazia");
return;
}
Apontador q = Pilha->Topo;
Pilha->Topo = q->Prox;
*Item = q->Prox->Item;

free(q);
Pilha->Tamanho--;
}

int Tamanho(TPilha Pilha){ //Retorna o tamanho da pilha
return Pilha.Tamanho;
}

TPilha InvertePilha (TPilha Pilha){ //Inverte os valores da pilha
TPilha PilhaAux;
FPVazia(&PilhaAux);
TItem x;
while(!Vazia(Pilha)){
Desempilha(&Pilha,&x);
Empilha(x,&PilhaAux);
}
return PilhaAux;
}

void ImprimePilha (TPilha Pilha, VariaveisLabirinto Variaveis, char **argv){ //Imprime os valores da pilha.
FILE *fpout = fopen(argv[2],"w");
if (fpout == NULL){ //Testa se o arquivo foi aberto com sucesso.
printf("Abertura do arquivo de saida falhou.\n");
exit(2);
}
if (Variaveis.saidaEncontrada==1) {
fprintf(fpout,"%i passos no total\n%i moedas no total\n%i passos ate a saida\n%i moedas no caminho certo\n",Variaveis.p1,Variaveis.m1,Variaveis.p2,Variaveis.m2);

Pilha = InvertePilha (Pilha); //Deve-se inverter os valores para que sejam impressos na ordem crescente.

TItem x;
while(!Vazia(Pilha)){
Desempilha(&Pilha,&x);
fprintf(fpout,"%i %i\n",x.linha,x.coluna);
}
}
else fprintf(fpout,"%i passos no total\n%i moedas no total\nSaida nao existente",Variaveis.p1,Variaveis.m1);
}




labirinto.h


#ifndef __LAB_HEADER__
#define __LAB_HEADER__

// Mais funcoes e estruturas podem ser definidas caso voce ache que
// va ajudar o seu trabalho

typedef struct {
// numero de linhas
int linhas;
// numero de colunas
int colunas;
char matriz[BUFSIZ][BUFSIZ];
} labirinto;


typedef struct {
// numero total de movimentos durante a busca,
// incluindo movimentos na direcao errada
int p1;
// passos dados na posição certa
int p2;
// numero de moedas encontradas na caminhada total,
int m1;
// numero de moedas encontradas apenas no caminho da posicao
// inicial ate a saida, ignorando as moedas encontradas em
// caminhos errados
int m2;
// 0 caso o labirinto nao tenha saida
// 1 caso ele tenha saida
// Se o labirinto nao tiver saida, moedasEncontradasNoCaminhoCerto
// deve ser zero, assim como o vetor de posicoes deve conter apenas
// a posicao inicial
int saidaEncontrada;
} VariaveisLabirinto ;

// Retorna Uma estrutura representando o labirinto
// especificado no arquivo de entrada. a primeira linha do arquvo
// deve conter dois inteiros especificando o numero L de
// linhas e o numero C de colunas do labirinto. as proximas L linhas devem
// conter C caracteres representando o labirinto.
labirinto leLabirintoDeArquivo(char **argv);


//AS próximas estruturas e funções são utilizadas para criação da pilha;

//A struct TItem contém os ítens que serão guardados em cada célula da pilha.
//Neste caso precisamos gravar qual a posição da matriz (linha e coluna).
typedef struct{
int linha;
int coluna;
} TItem;

typedef struct Celula *Apontador;

typedef struct Celula {
TItem Item;
Apontador Prox;
} TCelula;

typedef struct {
Apontador Fundo;
Apontador Topo;
int Tamanho;
} TPilha;

//A função a seguir cria uma pilha vazia.
void FPVazia (TPilha *Pilha);

//Retorna verdadeiro se a pilha for vazia.
int Vazia (TPilha Pilha);

//A função a seguir adiciona um item à pilha.
void Empilha (TItem x,TPilha *Pilha);

//A função a seguir retira um item da pilha.
void Desempilha (TPilha *Pilha, TItem *Item);

//A função retorna o tamanho da pilha;
int Tamanho(TPilha Pilha);

//Inverte a ordem dos elementos da pilha e retorna a pilha invertida.
TPilha InvertePilha (TPilha Pilha);

//Imprime os elementos da pilha.
void ImprimePilha (TPilha Pilha,VariaveisLabirinto Variaveis,char **argv);

// Retorna uma pilha contendo as coordenadas de saída do labirinto.
// Esta função lê toda a matriz do labirinto e verifica se há saída.
TPilha achaSaida(labirinto L,VariaveisLabirinto *Variaveis);

#endif




Segue um exemplo do arquivo de texto que o programa deve receber:
13 40
########################################
#i..............m.........#.#...#......#
#.#.#.#.#.##.#.#.######.#.#...#.#.####.#
#.#.#####.##.#.#.....######.##.#..#....s
#.#...#.#.####.#.####........#.#.#.#####
#.######.....##.#......####.##.#.#...#.#
#.############.#.##.#######.##.#.###.#.#
#.#............m..........#.#...m......#
#.##.####.#########.#.#.#.#.###.#.#.##.#
#.#...#...#....#....#.....#.#.#.m.#.##.#
#.#.#######################.#.########.#
#.............#m.......................#
########################################




  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/05/2016 - 05:43h

Sua rotina de leitura não está apenas complicada, mas tem erro também. Permita-me explicá-lo.

Quando você lê caráter a caráter com fgetc() (ou getc() ou getchar()), a variável que recebe o caráter não deve ser do tipo char, mas sim do tipo int. Isso porque essas funções podem usam o possível valor de retorno EOF, distinto de qualquer outro caráter, para indicar erros. Se você atribuir o valor de retorno diretamente a uma variável do tipo char, perde as condições de distinguir o sinalizador de erros (inteiro como mais de oito bits, tipicamente com valor -1) de um possível caráter válido de apenas oito bits.

Esse erro afeta tanto sua leitura das dimensões da matriz quanto a leitura de seus elementos.

A maneira correta e segura de obter um caráter com fgetc() seria mais ou menos a seguinte.

/* Tipos dos dados envolvidos */
FILE *arquivo;
int ch;
char c;

/* ... */

ch=fgetc(arquivo);
if(ch==EOF){
/* Ocorreu erro de leitura. Possivelmente você vai querer abortar a execução. */
exit(1);
}
c=ch; /* Conversão do valor !=EOF de int para char */


Voltando ao ponto da complexidade desnecessária, você gastou dezoito linhas para ler um par de números, quando poderia gastar uma só (ou quatro, incluindo tratamento de erro).

if(fscanf(fpin, "%d %d", &L.linhas, &L.colunas)!=2){
fprintf(stderr, "Erro de leitura.\n");
exit(1);
}


Não complique o que você pode simplificar.

Sua leitura do labirinto está dependente do formato do arquivo de origem. Você supõe que cada linha terá exatamente L.colunas caracteres que formam o labirinto mais um byte (de quebra de linha). O problema é que se o arquivo tiver sido gerado no Windows (você não sabe como seu professor vai testar, sabe?), o terminador de cada linha é composto por dois bytes. Desse modo, sua forma de ler matricialmente vai falhar, pois você vai acabar ficando com a matriz com a seguinte cara:

########################################\r
\n#i..............m.........#.#...#......\r
\n##.#.#.#.#.##.#.#.######.#.#...#.#.####\r
\n.##.#.#####.##.#.#.....######.##.#..#..\r
\n..s#.#...#.#.####.#.####........#.#.#.#\r
\n#####.######.....##.#......####.##.#.#.\r
\n..#.# (etc.)


Há várias maneiras de ficar mais resiliente quanto a formato. A mais simples, aproveitando o fato de que nenhum dos caracteres no interior do labirinto inclui espaços, é ler a linha inteira de uma vez com fscanf().

for(n=0 ; n<=L.linhas ; n++)
if(fscanf(fpin, " %s", L.matriz[n])!=1){
fprintf(stderr, "Erro de leitura.\n");
exit(1);
}


EM TEMPO: Várias distribuições de Linux colocam atributos nas funções de leitura (como fgetc(), fgets(), fscanf(), scanf() etc.) de modo a causar alerta do compilador caso você ignore o resultado retornado pela função. É sempre prudente tratar esses códigos de retorno porque, além de poder indicar erros de leitura que vão atrapalhar possíveis leitura futuras, as variáveis que porventura devessem ser modificadas durante a leitura podem ficar com valores indefinidos.

[Eu comecei a escrever a explicação a seguir mais cedo, logo que cheguei do trabalho, mas acabei indo dormir, e vi agora que o SamL já respondeu em parte, sem, contudo, saber explicar a causa. Garanto que não colei dele para chegar ao diagnóstico.]

Descobri a razão de dar erro logo de cara, assim que o programa inicia. Aquela sua matriz de tamanho BUFSIZ×BUFSIZ (aliás, por que usar BUFSIZ?) faz com que o tamanho máximo da pilha seja excedido (variáveis locais de funções que não são explicitamente declaradas como estáticas, ditas de alocação automática, são alocadas na pilha). Então, quando a execução entra em main() e tenta reservar o espaço correspondente, o sistema operacional envia um SIGSEGV porque o tamanho máximo da pilha é excedido.

É possível alterar o limite de tamanho da pilha (cujo default é 8MiB) utilizando a função setrlimit() ou o através do shell (comando ulimit com a opção -s), mas não é isso o que você deve fazer. Você deve trabalhar com dados menores e, se possível, alocados fora da pilha. O ideal seria usar alocação dinâmica. Se isso não for possível, e você ainda precisar de dados muito grandes, deve preferir estática à alocação automática.

Eu recomendo que você corrija seu programa para não ficar dependente do formato do fim de linha usado no arquivo de dados.

3. Re: Funciona no Windows mas da Segmentation fault no LINUX [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/05/2016 - 10:13h

Como você mesmo disse, o código está bem grandinho, o que dificulta a análise num fórum on-line. Então, antes de queimar a cabeça, permita-me fazer algumas perguntas bem básicas.

Em qual sistema você gerou o arquivo com o labirinto? Pergunto isso porque Windows e UNIX têm convenções diferentes de terminação de linha. O Windows usa dois caracteres ("\r\n"), e converte automaticamente '\n' para "\r\n" na hora de gravar em arquivo, e vice-versa na hora de ler, a não ser que você diga explicitamente que o arquivo é binário. O UNIX não faz conversão nenhuma (na prática, não existe distinção entre arquivos binários e de texto).

Assim sendo, se você copiou o arquivo de labirinto diretamente do Windows, pode ser que os dados que você lê encontrem um '\r' antes de chegar ao final da linha. Não olhei a fundo, mas me parece, numa visão superficial, que a sua rotina de leitura das dimensões do labirinto padece de não saber tratar essa situação.

Eu acho que você complicou demais sua leitura. Por que não usa scanf() ou fgets()+sscanf() para ler os valores numéricos?


4. Re: Funciona no Windows mas da Segmentation fault no LINUX [RESOLVIDO]

Lucas Henrique Faleiro
lucasfaleiro

(usa Ubuntu)

Enviado em 12/05/2016 - 11:33h

Então, eu copiei os dados do arquivo texto e testei salvando tanto pelo bloco de notas quanto pelo editor de texto. É, a função de leitura acabou ficando um pouco complicada mesmo rs. Mas é porque a primeira linha do arquivo mostra quantas linhas e colunas o labirinto tem. ai eu leio a primeira linha, transformo os caracteres em números pela tabela ASCII e depois que eu guardo o labirinto na matriz. Sendo assim, na hora de guardar na matriz eu faço i<nº linhas e j<nº de colunas pra poder salvar, então acredito que não está tendo problema com o /r.

E como eu disse, olhando pelo debug ta dando problema logo na linha 5, erro de referencia, ai depois da erro em todas as linhas que dependem do argv. Só que não sei qual problema tem com a declaração das minhas referências, afinal, no Windows reconhece normalmente =[


5. Re: Funciona no Windows mas da Segmentation fault no LINUX [RESOLVIDO]

Lucas Henrique Faleiro
lucasfaleiro

(usa Ubuntu)

Enviado em 13/05/2016 - 00:44h

Muito obrigado pela sua ajuda SamL. O problema era este mesmo .

Eu percebi que poderia ser isso quando tava fazendo alguns testes ontem e troquei o bufsiz por um valor aleatório (200 no caso). Fazendo assim, ele rodou mas começou a dar um outro problema. O programa estava funcionando mas os resultados estavam saindo todo errados.

Fui deixando as funções comentadas e descomentando 1 por 1 para ver aonde estava dando o segmentation. Era exatamente na declaração da struct que continha a matriz. Acabou que retirei a struct do meu programa e fiz as devidas alterações para readaptá-lo. Como disse, criei a matriz[200][200] e fui passando ela para as funções que precisava.

Ai que comecei a ter o problema com os valores errados. Quando fui ver, os valores com o fgetc estavam sendo salvos de maneira equivocada na matriz. A primeira linha salvava normal, mas a segunda linha salvava a partir da coluna 1, inves da 0, por exemplo. Tive de usar o fseek após ler uma linha toda para poder pular o caractere /n do arquivo, ai tudo ficou certo e funcionou como eu queria ;D
Foi uma diferença que reparei do windows pro linux. Aparentemente o windows pula a linha automaticamente quando depara com o /r/n, não sei. Porque lá nao foi necessário utilizar o fseek.

No fim das contas deu pra enviar o trabalho da maneira que eu pretendia. Enviei faltando 5 min pra acabar mas enviei kkkkk

Pra ficar perfeito eu deveria ter alocado dinamicamente esta matriz, mas não tenho ideia de como eu faria isso hahahhaha ai acabei por alocar estaticamente mesmo para pelo menos conseguir enviar um algoritmo funcional. Ok, só aceitará labirinto de até 200x200, mas funciona rs. Não será testado para mais que isso.

Não consegui, também, desalocar toda a memória que usei nas pilhas, o valgrind me mostrou que ainda restava vazamento, mas consegui reduzir ou pouco do que estava antes. Menos mal que vazamento de memória não será considerado na avaliação, apenas ganharia ponto extra caso não houvesse nenhum vazamento.

Preciso melhorar bastante com a linguagem C ainda, mas aos poucos está dando pra evoluir. A partir de agora vou fazer esse tipo de atividade só no linux mesmo, não sei porque não tinha começado a mexer com ele antes. Está rodando muito mais leve do que o windows na minha máquina e é bem mais prático para programar.

Obrigado pela atenção !!!



6. Re: Funciona no Windows mas da Segmentation fault no LINUX [RESOLVIDO]

Lucas Henrique Faleiro
lucasfaleiro

(usa Ubuntu)

Enviado em 13/05/2016 - 17:42h

Obrigado pelas informações Paulo.
Realmente, o fseek acabou sendo uma gambiarra para que eu conseguisse enviar, pois ele passou as linhas de comando que ele utilizaria para compilar pelo Linux mesmo. Mas vou trabalhar em cima dele ainda tentando fazer estas modificações que você falou. Vou ajeitar o modo de leitura e tentar alocar dinamicamente a matriz, que é algo que eu nunca fiz e acabei ficando sem tempo pra aprender e aplicar neste trabalho.

Mas vou acertar ele para tentar melhorar na questão da linguagem.

Valeu a todos.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts