Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C] Segmentation Fault su stampa contenuti celle di una matrice

    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 ????

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Boh.
    Posta il codice così qualcuno te ne saprà dire di più.
    A naso mi verrebbe da dire che stai utilizzando una matrice locale ad una funzione e non visibile dall'esterno.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    teoricamente sarebbero 3 file ... questo è il gamelib.c , negli altri 2 c'è il main con il menù del gioco e nell'altro ,il gamelib.h dove sono definite le funzioni del gamelib.c e le definizioni del tipo delle strutture data utilizzate in gamelib.c......
    Ultima modifica di qwerty999; 03-04-2019 a 18:31

  4. #4
    teoricamente sarebbero 3 file ... questo � il gamelib.c , negli altri 2 c'� il main con il men� del gioco e nell'altro ,il gamelib.h dove sono definite le funzioni del gamelib.c e le definizioni del tipo delle strutture data utilizzate in gamelib.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;
    short int mosse_a_disposizione=1;
    static void turnoNinja();
    static void turnoCiccio();




    ///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 () {
    time_t t ;
    int mappa,i,j,righe,colonne,ness_per,alie,trapp,no_obj ,medik,pozio,mater,colpilancia;
    srand((unsigned)time(&t));
    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);
    //allocazione della matrice
    struct Cella* scacchiera=malloc(righe*colonne*sizeof(struct Cella));
    /*
    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("\t 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 probabiit� legate al ritrovamento o meno degli oggetti....." );
    do {


    printf("\n\n\tProbabilit� 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++) {
    if (rand()%101<ness_per) {
    scacchiera[i*lato+j].pericolo=nessun_pericolo;
    } else if (ness_per<=rand()%101&&rand()%101<=ness_per+trapp) {
    scacchiera[i*lato+j].pericolo=trappola;
    } else if (rand()%101>ness_per+trapp)
    scacchiera[i*lato+j].pericolo=alieno;
    }


    }




    //inizializzo Tipo_oggetto
    for ( i = 0; i < lato; i++) {
    for ( j= 0; j <lato; j++) {
    if (rand()%101<no_obj) {
    scacchiera[i*lato+j].oggetto=nessun_oggetto;
    } else if (no_obj<=rand()%101&&rand()%101<no_obj+medik) {
    scacchiera[i*lato+j].oggetto=medikit;
    } else if (no_obj+medik<=rand()%101&&rand()%101<no_obj+medik +pozio)
    scacchiera[i*lato+j].oggetto=pozione;
    else if (no_obj+trapp+pozio<=rand()%101&&rand()%101<no_obj +medik+pozio+mater)
    scacchiera[i*lato+j].oggetto=materiale;
    else if (no_obj+trapp+pozio+mater<=rand()%101&&rand()%101< no_obj+medik+pozio+mater+colpilancia)
    scacchiera[i*lato+j].oggetto=colpi_lanciarazzi;
    }
    }
    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("\n\n\nOk......la mappa � stata creata\n\n\n");
    }
    void stampa_scacchiera(){
    int i , j ;
    for ( i = 0; i < lato ; i++) {
    for (j=0; j<lato ; j++) {
    if ((scacchiera+i+j)->pericolo==nessun_pericolo) {
    printf(" [1," );
    } else if ((scacchiera+i*j)->pericolo==alieno) {
    printf(" [2," );
    } else if((scacchiera+i*j)->pericolo==trappola) {
    printf(" [3," );
    }///////////////////////////////////////////////////
    if((scacchiera+i*j)->oggetto==nessun_oggetto) {
    printf(" 4] \t" );
    } else if ((scacchiera+i*j)->oggetto==medikit) {
    printf(" 5] \t" );
    } else if((scacchiera+i*j)->oggetto==pozione) {
    printf(" 6] \t" );
    }
    else if ((scacchiera+i*j)->oggetto==materiale) {
    printf(" 7] \t" );
    } else if((scacchiera+i*j)->oggetto==colpi_lanciarazzi) {
    printf(" 8] \t" );
    }


    }
    printf("\n" );
    }


    }

  5. #5
    Perché a un certo punto inizi ad accedere alle celle così
    codice:
    (scacchiera+i*j)->oggetto
    mentre prima accedevi correttamente aggiungendo i*lato+j?

  6. #6
    Quote Originariamente inviata da scimmiaparlante Visualizza il messaggio
    Perché a un certo punto inizi ad accedere alle celle così
    codice:
    (scacchiera+i*j)->oggetto
    mentre prima accedevi correttamente aggiungendo i*lato+j?

    era per vedere se dipendeva da questo il segm.fault , ma purtroppo no...

  7. #7
    "Questo" cosa?

    Fornisci il codice almeno teoricamente corretto, formattato (usa i tag CODE) e completo in modo che magari si possa compilare.
    Inoltre magari indica dove salta fuori l'errore.

  8. #8
    codice:
    #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
    codice:
    #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;
    short int mosse_a_disposizione=1;
    static void turnoNinja();
    static void turnoCiccio();
    
    
    
    
    
    
    
    
    ///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 () {
    time_t t ;
    int mappa,i,j,righe,colonne,ness_per,alie,trapp,no_obj ,medik,pozio,mater,colpilancia;
    srand((unsigned)time(&t));
    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));
    //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("\t 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 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++) {
    if (rand()%101<ness_per) {
    scacchiera[i*lato+j].pericolo=nessun_pericolo;
    } else if (ness_per<=rand()%101&&rand()%101<=ness_per+trapp) {
    scacchiera[i*lato+j].pericolo=trappola;
    } else if (rand()%101>ness_per+trapp)
    scacchiera[i*lato+j].pericolo=alieno;
    }
    
    
    
    
    }
    
    
    
    
    
    
    
    
    //inizializzo Tipo_oggetto
    for ( i = 0; i < lato; i++) {
    for ( j= 0; j <lato; j++) {
    if (rand()%101<no_obj) {
    scacchiera[i*lato+j].oggetto=nessun_oggetto;
    } else if (no_obj<=rand()%101&&rand()%101<no_obj+medik) {
    scacchiera[i*lato+j].oggetto=medikit;
    } else if (no_obj+medik<=rand()%101&&rand()%101<no_obj+medik +pozio)
    scacchiera[i*lato+j].oggetto=pozione;
    else if (no_obj+trapp+pozio<=rand()%101&&rand()%101<no_obj +medik+pozio+mater)
    scacchiera[i*lato+j].oggetto=materiale;
    else if (no_obj+trapp+pozio+mater<=rand()%101&&rand()%101< no_obj+medik+pozio+mater+colpilancia)
    scacchiera[i*lato+j].oggetto=colpi_lanciarazzi;
    }
    }
    
    
    
    
    
    
    
    
    //prova stampa
    
    
    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" );
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    //  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 i , j ;
            for ( i = 0; i < lato ; i++) {
              for (j=0; j<lato ; j++) {
            if ((scacchiera+i+j)->pericolo==nessun_pericolo) {
              printf(" [1," );
            } else if ((scacchiera+i*j)->pericolo==alieno) {
              printf(" [2," );
            } else if((scacchiera+i*j)->pericolo==trappola) {
              printf(" [3," );
            }///////////////////////////////////////////////////
             if((scacchiera+i*j)->oggetto==nessun_oggetto) {
              printf(" 4] \t" );
            } else if ((scacchiera+i*j)->oggetto==medikit) {
              printf(" 5] \t" );
            } else if((scacchiera+i*j)->oggetto==pozione) {
              printf(" 6] \t" );
            }
              else if ((scacchiera+i*j)->oggetto==materiale) {
                printf(" 7] \t" );
            } else if((scacchiera+i*j)->oggetto==colpi_lanciarazzi) {
                printf(" 8] \t" );
            }
    
    
            }
            printf("\n" );
          }
          */
          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" );
          }
    }
    
    
    
    
    codice:
    #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);
    
    
    
    
    }

  9. #9
    in ordine .....gamelib.h , gamelib.c, main.c

  10. #10
    codice:
    struct Cella* scacchiera=malloc(righe*colonne*sizeof(struct Cella));
    Se ridefinisci la variabile nella funzione la variabile globale viene nascosta a favore di quella locale, quindi ti perdi il puntatore.
    La variabile scacchiera globale rimane quindi uguale a 0

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.