Erro no meu código C usando o debian, porém o mesmo código funciona em outro sistema operacional.

1. Erro no meu código C usando o debian, porém o mesmo código funciona em outro sistema operacional.

Osnir Mesquita
omesquita

(usa Fedora)

Enviado em 27/05/2015 - 02:38h

E ai galera! Beleza?
Alguém poderia me dar uma força com meu código?
O professor da universidade solicitou para que fizéssemos um código em que implementemos uma lista circular e duplamente encadeada.
Conseguir fazer a lógica e desenvolver o código. Fui dormir com ele funcionando corretamente. No outro dia quando voltei a minhas atividades, meu código estava dando run time erro.

Já revirei meu código todo e não encontro o problema. A maior questão é que, o mesmo código no windows, funciona normalmente. Pedi para meus colegas testarem. E todos funcionaram.
Alguém poderia me dar uma ajuda. Já não sei mais o que fazer?

Detalhe importante:
O código insere o primeiro elemento normalmente, porém quando vai inserir o seguindo elemento, o ponteiro para o proximo elemento aponta para um endereço de memoria que não foi o recebido inicialmente. E outra, sempre que eu executo meu código, os endereços que são atribuídos são os mesmo. Não mudam.

Segue abaixo meu código.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CHAR_NOME 50

#ifdef WIN32
void limparTela(){
system("cls");
}
void pause(){
system("pause");
limparTela();
}
#else
void limparTela(){
system("clear");
}
void pause(){
printf("Pressione qualquer tecla para continuar!\n");
system("read b");
limparTela();
}
#endif

typedef struct no{
char nomeArquivo[CHAR_NOME];
struct no * prox;
struct no * ante;
}No;

typedef struct lista{
No * ini;
No * fim;
int tamanho;
}Lista;

Lista * criarLista(){
//Aloca uma lista na memoria
Lista * l = (Lista*)malloc(sizeof(Lista));
l->ini = l->fim = NULL;
l->tamanho = 0; //indica que a lista começa sem nenhum item
return l;
}

No * criarNo(){
//Aloca um novo no na memoria e retorna o endereco
return (No*)malloc(sizeof(No*));
}

int listaExiste(Lista * l){
return (l != NULL);
}

int listaVazia(Lista * l){ //se 1 vazia se 0 cheia
return (l->tamanho == 0);
}

void getString(char *texto, int valor){
__fpurge(stdin);
fgets(texto, valor, stdin);
texto[strlen(texto)-1] = '\0';
__fpurge(stdin);
}

void insertVazia(No * novoNo, Lista * l){
l->ini = l->fim = novoNo;
novoNo->prox = l->ini;
novoNo->ante = l->fim;
l->tamanho++;
}

void insertInicio(No * novoNo, Lista * l){
novoNo->prox = l->ini;
novoNo->ante = l->fim;
l->ini->ante = novoNo;
l->fim->prox = novoNo;
l->ini = novoNo;
l->tamanho++;
}

void insertFim(No * novoNo, Lista * l){
novoNo->prox = l->ini;
novoNo->ante = l->fim;
l->fim->prox = novoNo;
l->fim = novoNo;
l->ini->ante = novoNo;
l->tamanho++;
}

void insertMeio(No * novoNo, No * noTemp, Lista * l){
novoNo->prox = noTemp;
novoNo->ante = noTemp->ante;
noTemp->ante->prox = novoNo;
noTemp->ante = novoNo;
l->tamanho++;
}

void inserirNo(Lista * l, char * texto){
if(listaExiste(l)){ //se a lista existir cria o novo nó e armazena o nome do arquivo no novo nó;

No * novoNo = criarNo();
strcpy(novoNo->nomeArquivo,texto);
if(listaVazia(l)){ //Se a lista estiver vazia, todos apontam para o novo no;
insertVazia(novoNo, l);
printf("Novo No Inserido %s - no %p - prox %p - ant %p\n", novoNo->nomeArquivo, novoNo, novoNo->prox, novoNo->ante);
}else{
printf("\Primeira posicao antes de criar temporario\n");
printf("%s - no %p - prox %p - ant %p - |ini %p - fim %p\n\n", l->ini->nomeArquivo, l->ini, l->ini->prox, l->ini->ante, l->ini, l->fim);
No* noTemp = NULL;
printf("Estamos antes do erro");
pause();
//printf("\n\nTemp depois null %s - no %p - prox %p - ant %p - |ini %p - fim %p\n\n", noTemp->nomeArquivo, noTemp, noTemp->prox, noTemp->ante, l->ini, l->fim);
noTemp = l->ini;//Nó temporario para percorrer a lista
//printf("\n\nTemp Antes While %s - no %p - prox %p - ant %p - |ini %p - fim %p\n\n", noTemp->nomeArquivo, noTemp, noTemp->prox, noTemp->ante, l->ini, l->fim);
int i=0; //contador do while
do{
printf("Temp While %s - no %p - prox %p - ant %p - cnt %d\n\n", noTemp->nomeArquivo, noTemp, noTemp->prox, noTemp->ante, i);
if(strcmp(novoNo->nomeArquivo, noTemp->nomeArquivo) > 0){ //se o nome do novo no for maior que o nome do arquivo temporario
if(noTemp == l->fim){ //verifica se ele está inserindo no final
printf("Final Antes de Inserir %s - no %p - prox %p - ant %p - Tam %d\n", novoNo->nomeArquivo, novoNo, novoNo->prox, novoNo->ante, l->tamanho);
insertFim(novoNo, l);
printf("Final Depoi de Inserir %s - no %p - prox %p - ant %p - Tam %d\n", novoNo->nomeArquivo, novoNo, novoNo->prox, novoNo->ante, l->tamanho);
break;
}else{ //se nao for o final passa para o proximo item da lista;
noTemp = noTemp->prox;
}
}else if(strcmp(novoNo->nomeArquivo, noTemp->nomeArquivo) == 0){ //se o nome do novo nó for igual ao nome do no temporario
if(noTemp == l->ini){ //se estiver inseindo no inicio usa a funcao insertInicio;
insertInicio(novoNo, l);
break;
}else{
insertMeio(novoNo, noTemp, l); //se nao inserir no inicio, será no meio
break;
}
}else{ //se o nome do novo for menor que o arquivo temporario
if(noTemp == l->ini){ //pode ser inserido no inicio
insertInicio(novoNo, l);
break;
}else{ //ou entao inserido no final
insertMeio(novoNo, noTemp, l);
break;
}
}
i++;// contador que controla o laco de busca
}while(i < l->tamanho);
//free(noTemp);
}
printf("Fiinal do Inserir %s - no %p - prox %p - ant %p - Tam %d | ini %p - fim %p\n", novoNo->nomeArquivo, novoNo, novoNo->prox, novoNo->ante, l->tamanho, l->ini, l->fim);

}else{
printf("A lista não Existe!\n");
}
}

void removeInicio(No * noTemp, Lista * l){
l->ini = l->ini->prox;
l->fim->prox = l->ini;
l->ini->ante = l->fim;
free(noTemp);
l->tamanho--;
}

void removeFim(No * noTemp, Lista * l){
l->fim = l->fim->ante;
l->ini->ante = l->fim;
l->fim->prox = l->ini;
free(noTemp);
l->tamanho--;
}

void removeMeio(No * noTemp, Lista * l){
noTemp->ante->prox = noTemp->prox;
noTemp->prox->ante = noTemp->ante;
l->tamanho--;
free(noTemp);
}

void removerNo(Lista * l, char * texto){
if(listaExiste(l)){
if(!listaVazia(l)){
No * noTemp = l->ini;
int achou = 0;
int i = 0;
do{
printf("%s\n", noTemp->nomeArquivo);
if(strcmp(noTemp->nomeArquivo, texto) == 0){
printf("encontrou\n");
if(noTemp == l->ini){
removeInicio(noTemp, l);
}else if(noTemp == l->fim){
removeFim(noTemp, l);
}else{
removeMeio(noTemp, l);
}
achou = 1;
}else if(i < l->tamanho){
printf("proximo\n");
noTemp = noTemp->prox;
pause();
}
i++;
}while((achou == 0) && (i < l->tamanho));
//se o valor de achou == 0 indica que não foi encontrado nenhum valor para ser removido
if(achou == 0){
limparTela();
printf("Erro ao remover! O Valor informado não existe.\n");
pause();
}
}else{
limparTela();
printf("Erro ao remover!\nA estrutura está vazia.\n");
pause();
}
}else{
limparTela();
printf("Erro ao remover!\nA estrutura está não existe.\n");
pause();
}
}

void imprimirLista(Lista * l){

if(listaExiste(l)){
if(!listaVazia(l)){
No * noAux = l->ini;
int i = 0;
do{
printf("Nome = %-28s | Posição = %-5p | = %-5p | P.Ante %p | Inicio %p | Fim %p |\n", noAux->nomeArquivo, noAux, noAux->prox, noAux->ante, l->ini, l->fim);
if(l->tamanho > 1){ //garante que quando so houver 1 item ele não vai apontar para o próximo;
noAux = noAux->prox;
}
i++;
}while(i< l->tamanho);
}else{
printf("A lista está Vazia!\n");
}
}else{
printf("A lista não Existe!\n");
}
}

int main(void){

Lista * li = criarLista();

printf("\nA lista esta vazia vai inserir B\n");
pause();
inserirNo(li, "b");
printf("\nA lista contem B Vai inserir A\n");
pause();
inserirNo(li, "a");
//inserirNo(li, "c");
imprimirLista(li);
printf("\nA lista contem B e A Vai inserir C\n");
pause();

inserirNo(li, "c");
imprimirLista(li);

free(li);

return 0;
}




  


2. Re: Erro no meu código C usando o debian, porém o mesmo código funciona em outro sistema operacional.

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/05/2015 - 04:16h

Na linha 108 dentro de um printf tem uma barra \ desnecessária antes de um P maiúsculo e isso dá erro.

Fora isso, prá ajudar, o que você percebeu de erro?

--
Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


3. Re: Erro no meu código C usando o debian, porém o mesmo código funciona em outro sistema operacional.

Osnir Mesquita
omesquita

(usa Fedora)

Enviado em 27/05/2015 - 11:21h

Amigo. O problema não é este.
Isso foi só uma forma de eu debugar o codigo.
você tentou executar ele para ver?


4. Re: Erro no meu código C usando o debian, porém o mesmo código funciona em outro sistema operacional.

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/05/2015 - 12:21h

Apareceu um monte de endereços de memória tipo 0x000000000E.
Por isso essa réplica. Ainda não vi especificamente um erro.
--
Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


5. Re: Erro no meu código C usando o debian, porém o mesmo código funciona em outro sistema operacional.

Leandro
rahremix

(usa Arch Linux)

Enviado em 27/05/2015 - 16:03h

Compilei aqui no Debian 8 64bits, deu esse retorno:
A lista esta vazia vai inserir B
Pressione qualquer tecla para continuar!


Novo No Inserido b - no 0x1c04030 - prox 0x1c04030 - ant 0x1c04030
Fiinal do Inserir b - no 0x1c04030 - prox 0x1c04030 - ant 0x1c04030 - Tam 1 | ini 0x1c04030 - fim 0x1c04030

A lista contem B Vai inserir A
Pressione qualquer tecla para continuar!





































Primeira posicao antes de criar temporario
b - no 0x1c04030 - prox 0x20fa1 - ant 0x1c04030 - |ini 0x1c04030 - fim 0x1c04030

Estamos antes do erroPressione qualquer tecla para continuar!






































Temp While b - no 0x1c04030 - prox 0x20fa1 - ant 0x1c04030 - cnt 0

Fiinal do Inserir a - no 0x1c04050 - prox 0x1c04030 - ant 0x1c04030 - Tam 2 | ini 0x1c04050 - fim 0x1c04030
Nome = a | Posição = 0x1c04050 | = 0x1c04030 | P.Ante 0x1c04030 | Inicio 0x1c04050 | Fim 0x1c04030 |
Nome = b | Posição = 0x1c04030 | = 0x1c04050 | P.Ante 0x1c04050 | Inicio 0x1c04050 | Fim 0x1c04030 |

A lista contem B e A Vai inserir C
Pressione qualquer tecla para continuar!
































Primeira posicao antes de criar temporario
a - no 0x1c04050 - prox 0x1c04031 - ant 0x1c04030 - |ini 0x1c04050 - fim 0x1c04030

Estamos antes do erroPressione qualquer tecla para continuar!






































Temp While a - no 0x1c04050 - prox 0x1c04031 - ant 0x1c04030 - cnt 0

Temp While - no 0x1c04031 - prox 0x6300000000000000 - ant 0x1c000 - cnt 1

Fiinal do Inserir c - no 0x1c04070 - prox (nil) - ant (nil) - Tam 2 | ini 0x1c04050 - fim 0x1c04030
Nome = a | Posição = 0x1c04050 | = 0x1c04031 | P.Ante 0x1c04030 | Inicio 0x1c04050 | Fim 0x1c04030 |
Nome = | Posição = 0x1c04031 | = 0x6300000000000000 | P.Ante 0x1c000 | Inicio 0x1c04050 | Fim 0x1c04030 |


Não sei se há algum erro, ou se era pra retornar isso mesmo, mas aparentemente compilou e rodou até o fim aqui.


6. Re: Erro no meu código C usando o debian, porém o mesmo código funciona em outro sistema operacional.

Leandro
rahremix

(usa Arch Linux)

Enviado em 27/05/2015 - 16:06h

listeiro_037 escreveu:

Na linha 108 dentro de um printf tem uma barra \ desnecessária antes de um P maiúsculo e isso dá erro.

Fora isso, prá ajudar, o que você percebeu de erro?


Na verdade é só um warning, ele compila normalmente.


7. Really

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/05/2015 - 16:09h

rahremix escreveu:

listeiro_037 escreveu:

Na linha 108 dentro de um printf tem uma barra \ desnecessária antes de um P maiúsculo e isso dá erro.

Fora isso, prá ajudar, o que você percebeu de erro?


Na verdade é só um warning, ele compila normalmente.



Realmente. Sinto muito.
--
Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts