Problema in C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
maghico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 297
Iscrizione: martedì 13 febbraio 2007, 12:02

Problema in C

Messaggio 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.
Avatar utente
Rospo Zoppo
Rampante Reduce
Rampante Reduce
Messaggi: 5291
Iscrizione: martedì 16 gennaio 2007, 20:35

Re: Problema in C

Messaggio da Rospo Zoppo »

Di solito e' un problema con le variabili o con l'allocazione di memoria.. Magari hai sbagliato qualche scanf...
Avatar utente
maghico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 297
Iscrizione: martedì 13 febbraio 2007, 12:02

Re: Problema in C

Messaggio 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
Avatar utente
Rospo Zoppo
Rampante Reduce
Rampante Reduce
Messaggi: 5291
Iscrizione: martedì 16 gennaio 2007, 20:35

Re: Problema in C

Messaggio da Rospo Zoppo »

Potresti postare il codice al massimo....
Avatar utente
maghico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 297
Iscrizione: martedì 13 febbraio 2007, 12:02

Re: Problema in C

Messaggio 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
Avatar utente
Rospo Zoppo
Rampante Reduce
Rampante Reduce
Messaggi: 5291
Iscrizione: martedì 16 gennaio 2007, 20:35

Re: Problema in C

Messaggio da Rospo Zoppo »

Usa il tag codice se no non e' leggibile...
Avatar utente
maghico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 297
Iscrizione: martedì 13 febbraio 2007, 12:02

Re: Problema in C

Messaggio 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
7cys7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 390
Iscrizione: mercoledì 31 gennaio 2007, 12:16

Re: Problema in C

Messaggio da 7cys7 »

Ma scusa, mi sembra ci sia un bel ciclo infinito...
Avatar utente
maghico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 297
Iscrizione: martedì 13 febbraio 2007, 12:02

Re: Problema in C

Messaggio da maghico »

dove?visto che su devC mi funziona perfettamente!
Avatar utente
thelo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 269
Iscrizione: lunedì 8 gennaio 2007, 17:16

Re: Problema in C

Messaggio 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)
Navigammo su fragili vascelli
per affrontar del mondo la burrasca
ed avevamo gli occhi troppo belli...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti