PROBLEMA segmentation fault core dumped

marcococ

Nuovo Utente
29
1
Buongiorno.... ho inizializzato i contenuti delle celle di una matrice in una funzione , ho fatto un'altra funzione che se richiamata mi stampa i contenuti di tali celle ma se la richiamo mi dà segm.fault core dumped ,mentre se quel pezzo di codice lo metto dove ho inizializzato le celle mi va e mi stampa ....da cosa può dipendere secondo voi ????

vi metto il codice composto da 3 file..........in ordine gamelib.h, main.c, gamelib.c...........

C:
#ifndef GAMELIB_H
#define GAMELIB_H

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <math.h>


void gioca();
void crea_mappa();
void termina_gioco();




enum Tipo_pericolo{
  nessun_pericolo,
  trappola,
  alieno
};

enum Stato_giocatore{
  vulnerabile,
  scudo_vita,
  solo_vita,
  solo_scudo
};

enum Tipo_oggetto{
  nessun_oggetto,
  medikit,
  pozione,
  materiale,
  colpi_lanciarazzi
};

struct Giocatore {
    enum Stato_giocatore stato;
  int posizionex;
  int posizioney;
    unsigned short int zaino[4];
    unsigned int short uccisioni_alieni;
};

struct Cella{
  enum Tipo_pericolo pericolo;
  enum Tipo_oggetto oggetto ;
};


#endif
C:
#include <stdlib.h>
#include <stdio.h>
#include "gamelib.h"


int main(){

  int scegli;

do{

  printf("Inserisci l'operazione da effettuare \n");
  printf(" 1. Crea mappa.\n 2. Gioca. \n 3. termina gioco.\n");
  printf("Attenzione, prima di giocare devi creare la mappa! \n " );

  scanf("%d",&scegli);
  if (scegli<1||scegli>3) {
  printf("Hai inserito un valore non valido\n" );
  }
  switch(scegli){
      case 1:
      crea_mappa();

      break;


      case 2:
      gioca();

      break;

      case 3:
      termina_gioco();

      break;


    }
}while(scegli!=3);


}
C:
#include "gamelib.h"




static struct Cella *scacchiera = NULL ;
static struct Giocatore Ciccio;
static struct Giocatore Ninja ;
int lato ;


void crea_scacchiera();
void stampa_scacchiera();
void termina_creazione();


void muovi();
void usa_oggetto();




static short int vittoriaNinja=0,vittoriaCiccio=0;
static unsigned int turni_passati=0;
static short int mosse_a_disposizione_Ninja=1;
static short int mosse_a_disposizione_Ciccio=1;
static void turnoNinja();
static void turnoCiccio();
short int turno_c,turno_n;



///la funzione termina_creazione permette di ritonrare al menu iniziale del gioco
void termina_creazione() {
printf("da fare\n" );
}


void termina_gioco(){
printf("Ecco le statistiche delle partite:" );
printf("Vittorie di Ninja : %d\n Vittorie di Ciccio: %d \n ",vittoriaNinja,vittoriaCiccio );


}


void crea_mappa(){


int opzione;


do {
printf("\t Premi '1' per CREARE LA SCACCHIERA \n" );
printf("\t \n" );
printf("\t Premi '2' per STAMPARE LA SCACCHIERA \n" );
printf("\t \n" );
printf("\t Premi '3' per TORNARE INDIETRO \n" );
scanf("%d", &opzione );


switch (opzione) {
case 1:
crea_scacchiera();
break;


case 2:
stampa_scacchiera();
break;


case 3:
termina_creazione();
break;


default:
printf("Opzione non valida..\n" );
break;
}
} while(opzione!=3);


}










void crea_scacchiera () {

int mappa,i,j,righe,colonne,ness_per,alie,trapp,no_obj ,medik,pozio,mater,colpilancia,w;
printf("Immettere la lunghezza n di un lato della scacchiera: " );
scanf("%d", &lato );
mappa=lato*lato ;
righe=lato;
colonne=lato;
printf("Grandezza Mappa => %d (%dX%d)\n\n",mappa,lato,lato);
struct Cella* scacchiera=malloc(righe*colonne*sizeof(struct Cella));
w=struct Cella scacchiera;
//allocazione della matrice
/*
for ( i = 0; i < lato; ++i) {
for ( j= 0; j <lato; ++j) {
scacchiera[i*colonne+j].oggetto=rand()%3
scacchiera[i*righe+j].pericolo=3+rand()%5;
}
}
*/




printf("Ai fini della difficoltà del gioco dovrai inserire 3 probabilità la cui somma dovrà fare 100..... \n\n" );
do {
printf("\t Probabilità di trovare in una data cella una'TRAPPOLA':" );
scanf("%d", &trapp);
printf("\t Probabilità di trovare in una data cella un 'ALIENO' :" );
scanf("%d", &alie );
printf("\t Probabilità di trovare in una data cella 'NESSUN PERICOLO':");
scanf("%d", &ness_per );


if (ness_per +trapp+alie !=100) {
printf(" \n Ricorda la somma delle probabilità deve essere 100 \n " );
}




}
while( ness_per +trapp+alie !=100);


printf("\t \n Ora dovrai inserire 5 probabilità legate al ritrovamento o meno degli oggetti....." );
do {


printf("\n\n\t Probabilità di trovare in una data cella 'POZIONE':" );
scanf("%d", &pozio);
printf("\t Probabilità di trovare in una data cella un 'MEDIKIT' :" );
scanf("%d", &medik );
printf("\t Probabilità di trovare in una data cella 'MATERIALE':" );
scanf("%d", &mater);
printf("\t Probabilità di trovare in una data cella un 'COLPI LANCIARAZZI' :" );
scanf("%d", &colpilancia );
printf("\t Probabilità di trovare in una data cella 'NESSUN OGGETTO':" );
scanf("%d", &no_obj );




if (no_obj+pozio+medik+colpilancia+mater !=100) {
printf("Ricorda la somma delle probabilità deve essere 100" );
}


} while(no_obj+pozio+medik+colpilancia+mater !=100);


//inizializzo Tipo_pericolo

for ( i = 0; i < lato; i++) {
for ( j= 0; j <lato; j++) {
int t[lato];
t[i]= rand()%101;
if (t[lato]<ness_per) {
scacchiera[i*lato+j].pericolo=nessun_pericolo;
} else if (ness_per<=t[lato]&&t[lato]<=ness_per+trapp) {
scacchiera[i*lato+j].pericolo=trappola;
} else if (t[lato]>ness_per+trapp)
scacchiera[i*lato+j].pericolo=alieno;
}
}




//inizializzo Tipo_oggetto

for ( i = 0; i < lato; i++) {
for ( j= 0; j <lato; j++) {
int y[lato];
y[i]=rand()%101;
if (y[i]<no_obj) {
scacchiera[i*lato+j].oggetto=nessun_oggetto;
} else if (no_obj<=y[i]&&y[i]<no_obj+medik) {
scacchiera[i*lato+j].oggetto=medikit;
} else if (no_obj+medik<=y[i]&&y[i]<no_obj+medik +pozio)
scacchiera[i*lato+j].oggetto=pozione;
else if (no_obj+trapp+pozio<=y[i]&&y[i]<no_obj +medik+pozio+mater)
scacchiera[i*lato+j].oggetto=materiale;
else if (no_obj+trapp+pozio+mater<=y[i]&&y[i]< no_obj+medik+pozio+mater+colpilancia)
scacchiera[i*lato+j].oggetto=colpi_lanciarazzi;
}
}


//prova stampa


















//  struct cella * Ciccio = (scacchiera+ rand()%lato * rand()%lato) ;



//
/*
//static void gieson(struct Giocatore *player){
    time_t t;
    srand((unsigned) time(&t));
    int apparizione = 1 + (rand() % 100);
  } */

/*
Ninja.zaino[nessun_oggetto]=0;
Ciccio.zaino[nessun_oggetto]=0;
Ninja.zaino[medikit]=0;
Ciccio.zaino[medikit]=0;
Ninja.zaino[pozione]=0;
Ciccio.zaino[pozione]=0;
Ninja.zaino[materiale]=0;
Ciccio.zaino[materiale]=0;
Ninja.zaino[colpi_lanciarazzi]=0;
Ciccio.zaino[colpi_lanciarazzi]=0;
Ninja.stato=solo_vita;
Ciccio.stato=solo_vita;

*/
printf("\n\n\nOk......la mappa è stata creata\n\n\n");
}










  void stampa_scacchiera(){

      int l, p ;
      for ( l = 0; l < lato ; l++) {
      for (p=0; p<lato ; p++) {
      if ((scacchiera+l+p)->pericolo==nessun_pericolo) {
      printf(" 1" );
      } else if ((scacchiera+l*p)->pericolo==alieno) {
      printf(" 2" );
      } else if((scacchiera+l*p)->pericolo==trappola) {
      printf(" 3" );
      }///////////////////////////////////////////////////
      if((scacchiera+l*p)->oggetto==nessun_oggetto) {
      printf(" 4" );
      } else if ((scacchiera+l*p)->oggetto==medikit) {
      printf(" 5" );
      } else if((scacchiera+l*p)->oggetto==pozione) {
      printf(" 6" );
      }
      else if ((scacchiera+l*p)->oggetto==materiale) {
      printf(" 7" );
      } else if((scacchiera+l*p)->oggetto==colpi_lanciarazzi) {
      printf(" 8" );
      }


      }
      printf("\n" );
      }


printf("\t\t\t Legenda :\n\n");
printf("\nNessun pericolo=1\nAlieno=2\nTrappola=3\nNessun Oggetto=4\nMedikit=5\nPozione=6\nMateriale=7\nColpi lanciarazzi=8\n "  );
}






  /*time_t t;*/
  /*srand((unsigned) time(&t));*/
  void gioca(){
    int inizio=0;
  inizio=1+rand() % 101;
  if (inizio<=50) {
    turnoNinja();
   } else {
  turnoCiccio();
  }
}




void turnoCiccio(){
/*
    printf("Ciccio è il tuo turno ! \n Scegli cosa fare!\n");

  int sm;
  do{
    printf("Premi:\n 1. Per muoverti \n 2. Per usare un oggetto" );
    scanf("%d\n" , &sm );

    switch(sm){

        case 1:
        muovi();

        break;


        case 2:
        usa_oggetto();

        break;


      if (sm!=1||sm!=2) {
        printf("Opzione non valida" );
      }


      }
  }while(sm !=1 || sm !=2);



--mosse_a_disposizione_Ciccio;
if (Ciccio.stato==0) {
  printf("Ciccio è morto........ha vinto Ninja ! " );
  ++vittoriaNinja;

int scelta1;
do{
  printf("Cosa vuoi fare?\n " );
printf(" 1. Torna al menù principale.\n 2. Termina gioco ed accedi alle statistiche giocatori. \n ");

  scanf("%d\n" , &scelta1 );

  switch(scelta1){
      case 1:
      crea_mappa();

      break;


      case 2:
      termina_gioco();

      break;


      if (scelta1!=1||scelta1!=2) {
        printf("Opzione non valida" );
    }
}while(scelta1 !=1 || scelta1 != 2);

}
  if (mosse_a_disposizione==0) {
turnoNinja();
}

  turni_passati=turni_passati + 0.5 ;
  */
}






void turnoNinja(){
/*

  printf("Ninja è il tuo turno !\n Scegli cosa fare! \n");


  int ms;
do{
  printf("Premi:\n 1. Per muoverti \n 2. Per usare un oggetto" );
  scanf("%d\n" , &ms );

  switch(ms){

      case 1:
      muovi();

      break;


      case 2:
      usa_oggetto();

      break;


      if (ms!=1||ms!=2) {
        printf("Opzione non valida" );
    }
}while(ms !=1 || ms !=2);


--mosse_a_disposizione_Ninja;
if (Ninja.stato==0) {
  printf("Ninja è morto........ha vinto Ciccio ! " );
  ++vittoriaCiccio;

  int scelta2;
  do{
    printf("Cosa vuoi fare?\n " );
      printf(" 1. Torna al menù principale.\n 2. Termina gioco ed accedi alle statistiche giocatori. \n ");
    scanf("%d\n" , &scelta2 );

    switch(scelta2){

        case 1:
        crea_mappa();

        break;


        case 2:
        termina_gioco();

        break;

        if (scelta2!=1||scelta2!=2) {
          printf("Opzione non valida" );
      }
  }while(scelta2 !=1 || scelta2 !=2); }
if (mosse_a_disposizione==0) {
  turnoCiccio();
}

turni_passati=turni_passati + 0.5 ;
*/
}



void usa_oggetto(){
/*
  if (mosse_a_disposizione_Ninja==1) {

    printf("Ninja, questo è cosa contiene il tuo zaino\n" );

    printf("\n Il tuo stato è : %c " Ninja.stato );

        printf("\t   | MEDIKIT         | x %d         |\n",Ninja.zaino[medikit]);

        printf("\t   | POZIONE         | x %d         |\n",Ninja.zaino[pozione]);

        printf("\t   | MATERIALE       | x %d         |\n",Ninja.zaino[materiale]);

        printf("\t   | COLPI LANCIARAZZI       | x %d         |\n",Ninja.zaino[colpi_lanciarazzi]);

do {
  printf("Scegli quale oggetto utilzzare ......\n" );
  printf("\t Premi '1' per USARE IL MEDIKIT \n\t Premi '2' per EQUIPAGGIARE LO SCUDO \n\t Premi '3' per USARE IL MATERIALE\t Premi '4' per USARE COLPI RAZZO \n\t  \n" );
  scanf("%d", &scelta3 );
  switch (scelta3) {
    case 1: if (Ninja.zaino[medikit]>=1) {


      if (Ninja.stato==vulnerabile) {
        Ninja.stato==solo_vita
      } else if (Ninja.stato==solo_scudo) {
        Ninja.stato==scudo_vita
      } else {
        printf("I tuoi punti vita sono già al massimo!\n" );
        return(usa_oggetto)
      }
    } else { printf("Non puoi usare questo oggetto....\n" );
    return(usa_oggetto)
  }





    case 2: if (Ninja.zaino[medikit]>=1) {

    if (Ninja.stato==vulnerabile) {
     Ninja.stato==solo_scudo
   } else if (Ninja.stato==solo_vita) {
      Ninja.stato==solo_scudo
  } else {
    printf("Hai già lo scudo equipaggiato!\n", );
    return(usa_oggetto)
  }
  }else  printf("Non puoi usare questo oggetto....\n" );
    return(usa_oggetto)
  }
    case 3:

    case 4:

    case 5:

// } while(/* condition */


/*

/////////////////


  } else {
    printf("Ciccio questo è cosa contiene il tuo zaino\n" );
    printf("\t   | MEDIKIT         | x %d         |\n",Ciccio.zaino[medikit]);

    printf("\t   | POZIONE         | x %d         |\n",Ciccio.zaino[pozione]);

    printf("\t   | MATERIALE       | x %d         |\n",Ciccio.zaino[materiale]);

    printf("\t   | COLPI LANCIARAZZI       | x %d         |\n",Ciccio.zaino[colpi_lanciarazzi]);
*/
  }


void muovi(){
/*  int direzione;

do {
  printf("\nIn che direzione vuoi muoverti?\n 1.Per muoverti a nord \n 2.Per muoverti a sud \n 3.Per muoverti ad est \n 4.Per muoverti ad ovest \n " );
  scanf("%d",&direzione );
  switch (direzione) {
    case 1:


    case 2:


    case 3:


    case 4:

if (direzione!=1||direzione!=2||direzione!=3||direzione!=4) {
  printf("Comando errato , riprova......\n" );
}
  }
} while(direzione!=1||direzione!=2||direzione!=3||direzione!=4);


*/

}
 

Andretti60

Utente Èlite
6,440
5,091
Use the debugger, Luke :)
segmentation fault significa che cerchi di leggere o scrivere una locazione di memoria che è al di fuori della regione del tuo programma, tipicamente a causa di un indice sbagliato di un vettore o di un puntatore sbagliato o utilizzato male.
Se usi il debugger, si fermerà esattamente alla istruzione che causa l'errore, a quel punto puoi vedere il contenuto delle variabili e vedere cosa sbagli.
Poiché hai un file "core" significa che sei in ambiente Unix, quindi puoi usare quel file per esaminare le variabili in quel momento.
 

marcococ

Nuovo Utente
29
1
Use the debugger, Luke :)
segmentation fault significa che cerchi di leggere o scrivere una locazione di memoria che è al di fuori della regione del tuo programma, tipicamente a causa di un indice sbagliato di un vettore o di un puntatore sbagliato o utilizzato male.
Se usi il debugger, si fermerà esattamente alla istruzione che causa l'errore, a quel punto puoi vedere il contenuto delle variabili e vedere cosa sbagli.
Poiché hai un file "core" significa che sei in ambiente Unix, quindi puoi usare quel file per esaminare le variabili in quel momento.


Ho capito l'errore , se ridefinisci la variabile nella funzione, la variabile globale viene nascosta a favore di quella locale, quindi mi perdo il puntatore. La variabile scacchiera globale rimane quindi uguale a 0 ...Il problema è che mi si chiede esplicitamente che scacchiera una volta allocata in memoria deve essere assegnata al puntatore globale scacchiera......come posso fare secondo te ?
 

Andretti60

Utente Èlite
6,440
5,091
Non usare variabili globali, sono sempre causa di disastro. Non esistono nemmeno nei linguaggi moderni di programmazione.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili