Pagina 1 di 1

Problema in C

Inviato: venerdì 8 giugno 2007, 10:30
da maghico
ciao a tutti, questa mattina ho avuto un problema con la compilazione ovvero quando compilo un esercizio la compilazione avviene in modo corretto viene eseguito anche l'esercizio nel momento in cui il compilatore deve stamparmi i dati mi  da questo errore: Segmentation fault (core dumped)!
non so da cosa sia dovuto spero in un vostro aiuto grazie mille come sempre.

Re: Problema in C

Inviato: venerdì 8 giugno 2007, 10:49
da Rospo Zoppo
Di solito e' un problema con le variabili o con l'allocazione di memoria.. Magari hai sbagliato qualche scanf...

Re: Problema in C

Inviato: venerdì 8 giugno 2007, 10:52
da maghico
non penso perchè su dev in windows mi funziona...praticamente io gli immetto i dati e quando deve stamparli mi da l'errore...non so pro proprio cosa sia

Re: Problema in C

Inviato: venerdì 8 giugno 2007, 10:56
da Rospo Zoppo
Potresti postare il codice al massimo....

Re: Problema in C

Inviato: venerdì 8 giugno 2007, 11:01
da maghico
ok sono tre file diversi questo è il main.c :

#include
#include
#include "defns.h"

lista leggi(lista *lastpunt){
     
      lista punt_lista;
      int n, flag = 1;
     
      do{
          scanf("%d", &n);
          if(n >= 0){
              if(flag){
                punt_lista = (lista)malloc(sizeof(struct nodo));
                if(!punt_lista){
                          printf("Allocazione memoria non riuscita\n");
                          return NULL;
                          }
      punt_lista->x=n;
      punt_lista->next=NULL;
      flag =0;
      }
      else
      *lastpunt=inserisci(&punt_lista, n);
      }
      }while(n>=0);
      return punt_lista;  // restituisco la testa della coda
}
               
     
     
void stampa(lista L)
{
  lista p;
  printf( "[");
  for(p=L; p!=NULL; p=p->next)
    printf( "%d ", p->x );
  printf( "]\n");
}



int main(void)
{
  int i;
  lista L[5], lastpunt,temppunt;

  printf( "Inserisci la prima lista: ");
  L[0]=leggi(&lastpunt);


  printf( "Inserisci la seconda lista: ");
  L[1]=leggi(&lastpunt);

  L[2]=unione(L[0],L[1]);
  L[3]=intersezione(L[0],L[1]);
  L[4]=diffsim(L[0],L[1]);

  printf( "L1=" );
  stampa(L[0]);
  printf("\nL2=");
  stampa(L[1]);

  printf("\nL1 unione L2=");
  stampa(L[2]);

  printf("\nL1 inters L2=");
  stampa(L[3]);

  printf("\nL1 diffsim L2=");
  stampa(L[4]);

  for(i=0; i
#include
#include "defns.h"

lista inserisci(lista *p_L, int x)
{
  if( !*p_L || (*p_L)->x>x ) {
    lista res=(lista)malloc(sizeof(struct nodo));
    if( res ) {
      res->x=x;
      res->next=*p_L;
      *p_L=res;
    }
    return res;
  }
  else return inserisci(&((*p_L)->next), x);
}
     



lista unione(lista L1, lista L2){
      lista temp;
     
     
      if((L1 == NULL) && (L2 == NULL)) return NULL;
      else if((L1 == NULL) && (L2 != NULL))return L2;
      else if((L1 != NULL) && (L2 == NULL))return L1;
     
      while(L1 != NULL){
          temp->x = L1->x;
          temp = temp->next;
          L1 = L1->next;
          }
          while(L2 != NULL){
                    temp->x = L2->x;
                    temp = temp->next;
                    L2 = L2->next;
                    }
                    return temp;
          }
     
       
                     
             
lista intersezione(lista L1, lista L2){
      lista temp;
     
      if((L1 == NULL) || (L2 == NULL)) return NULL;
      else if(L1->x x)
      return (intersezione(L1->next, L2));
      else if(L1->x > L2->x)
      return (intersezione(L1, L2->next));
     
      else{
          temp = malloc(sizeof(struct nodo));
          temp->x = L1->x;
          temp->next = intersezione(L1->next, L2->next);
          return temp;
          }
          }
         
lista diffsim(lista L1, lista L2){
      lista L;
     
      if(L1 == NULL) return NULL;
      else if((L2 == NULL) || (L1->x x)){
          L = malloc(sizeof(struct nodo));
          if(!L){
                  printf("Allocazione di memoria fallita");
                  return NULL;
                  }
                 
                  L->x = L1->x;
                  L->next = diffsim(L1->next, L2);
                  return L;
                  }
                  else if(L1->x > L2->x)
                  return diffsim(L1, L2->next);
                  else
                  return diffsim(L1->next, L2->next);
                  }
                 
void elimina(lista *p_L)
{
  if( *p_L != 0 ) {           
    elimina( &((*p_L)->next) );
    free(*p_L);               
    *p_L = 0;                 
  }                         
}

questo è il file defns.h:

/*File defns.h*/
typedef struct nodo *lista;

struct nodo{
      int x;        /*Informazione*/
      lista next;  /*Puntatore al nodo successivo*/
      };
     
     
      /*Prototipi*/
     
      lista inserisci(lista *p_L, int x);
      void elimina(lista *p_L);
      lista unione(lista L1, lista L2);
      lista intersezione(lista L1, lista L2);
      lista diffsim(lista L1, lista L2);
     

grazie mille ancora

Re: Problema in C

Inviato: venerdì 8 giugno 2007, 11:25
da Rospo Zoppo
Usa il tag codice se no non e' leggibile...

Re: Problema in C

Inviato: venerdì 8 giugno 2007, 11:35
da maghico
File defns.h:

Codice: Seleziona tutto

/*File defns.h*/
typedef struct nodo *lista;

struct nodo{
       int x;        /*Informazione*/
       lista next;   /*Puntatore al nodo successivo*/
       };
       
       
       /*Prototipi*/
       
       lista inserisci(lista *p_L, int x);
       void elimina(lista *p_L);
       lista unione(lista L1, lista L2);
       lista intersezione(lista L1, lista L2);
       lista diffsim(lista L1, lista L2);
file liste.c:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include "defns.h"

lista inserisci(lista *p_L, int x)
{
  if( !*p_L || (*p_L)->x>x ) {
    lista res=(lista)malloc(sizeof(struct nodo));
    if( res ) {
      res->x=x;
      res->next=*p_L;
      *p_L=res;
    }
    return res;
  }
  else return inserisci(&((*p_L)->next), x);
}
       



lista unione(lista L1, lista L2){
      lista temp;
     
     
      if((L1 == NULL) && (L2 == NULL)) return NULL;
      else if((L1 == NULL) && (L2 != NULL))return L2;
      else if((L1 != NULL) && (L2 == NULL))return L1;
     
      while(L1 != NULL){
           temp->x = L1->x;
           temp = temp->next;
           L1 = L1->next;
           }
           while(L2 != NULL){
                     temp->x = L2->x;
                     temp = temp->next;
                     L2 = L2->next;
                     }
                     return temp;
           }
     
       
                     
               
lista intersezione(lista L1, lista L2){
      lista temp;
     
      if((L1 == NULL) || (L2 == NULL)) return NULL;
      else if(L1->x < L2->x)
      return (intersezione(L1->next, L2));
      else if(L1->x > L2->x)
      return (intersezione(L1, L2->next));
     
      else{
           temp = malloc(sizeof(struct nodo));
           temp->x = L1->x;
           temp->next = intersezione(L1->next, L2->next);
           return temp;
           }
           }
           
lista diffsim(lista L1, lista L2){
      lista L;
     
      if(L1 == NULL) return NULL;
      else if((L2 == NULL) || (L1->x < L2->x)){
           L = malloc(sizeof(struct nodo));
           if(!L){
                  printf("Allocazione di memoria fallita");
                  return NULL;
                  }
                 
                  L->x = L1->x;
                  L->next = diffsim(L1->next, L2);
                  return L;
                  }
                  else if(L1->x > L2->x)
                  return diffsim(L1, L2->next);
                  else
                  return diffsim(L1->next, L2->next);
                  }
                 
void elimina(lista *p_L)
{
  if( *p_L != 0 ) {           
    elimina( &((*p_L)->next) );
    free(*p_L);                 
    *p_L = 0;                 
  }                           
}
file main.c:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include "defns.h"

lista leggi(lista *lastpunt){
     
      lista punt_lista;
      int n, flag = 1;
     
      do{
          scanf("%d", &n);
          if(n >= 0){
               if(flag){
                 punt_lista = (lista)malloc(sizeof(struct nodo));
                 if(!punt_lista){
                           printf("Allocazione memoria non riuscita\n");
                           return NULL;
                           }
      punt_lista->x=n;
      punt_lista->next=NULL;
      flag =0;
      }
      else
      *lastpunt=inserisci(&punt_lista, n);
      }
      }while(n>=0);
      return punt_lista;   // restituisco la testa della coda
}
                 
     
     
void stampa(lista L)
{
  lista p;
  printf( "[");
  for(p=L; p!=NULL; p=p->next)
    printf( "%d ", p->x );
  printf( "]\n");
}



int main(void)
{
  int i;
  lista L[5], lastpunt,temppunt;

  printf( "Inserisci la prima lista: ");
  L[0]=leggi(&lastpunt);


  printf( "Inserisci la seconda lista: ");
  L[1]=leggi(&lastpunt);

  L[2]=unione(L[0],L[1]);
  L[3]=intersezione(L[0],L[1]);
  L[4]=diffsim(L[0],L[1]);

  printf( "L1=" );
  stampa(L[0]);
  printf("\nL2=");
  stampa(L[1]);

  printf("\nL1 unione L2=");
  stampa(L[2]);

  printf("\nL1 inters L2=");
  stampa(L[3]);

  printf("\nL1 diffsim L2=");
  stampa(L[4]);

  for(i=0; i<5; i++)
    elimina(L+i);
}


grazie mille

Re: Problema in C

Inviato: venerdì 8 giugno 2007, 13:04
da 7cys7
Ma scusa, mi sembra ci sia un bel ciclo infinito...

Re: Problema in C

Inviato: venerdì 8 giugno 2007, 13:12
da maghico
dove?visto che su devC mi funziona perfettamente!

Re: Problema in C

Inviato: venerdì 8 giugno 2007, 15:02
da thelo
cosa vuol dire che funziona? non gai detto che dà segmentation fault?
se usi devc, non ti saprei dire molto...
con gcc puoi avviare il debugger a vedere quale istruzione di preciso và in fault
altrimenti digiti:

Codice: Seleziona tutto

gdb nomeprogramma core
in questo modo si analizza il file core che è stato generato e ti può dare qualche informazione sulla causa del problema

saluti
(b2b)