PROBLEMA [C] Variabili globali

marcococ

Nuovo Utente
29
1
Salve ragazzi ....non riesco a capire bene una cosa..(ling C)... le variabili globali in questione : riga 25/26(mosse_a_disposizioneNinja/Ciccio), richiamate nella funzione alla riga 240 ,void gioca(), e modificate, poi richiamate ancora nelle funzioni alle righe 265 o 300(turno Ciccio(),turnoNinja() )....

quando le richiamo nelle righe 265/300 ritornano entrambe al valore 1 (come dichiarate inizialmente) ...per quale motivo ?
un'altra cosa .....se in una funzione dovessi decidere di ritornare al main (che non è in questo file) come dovrei fare?

qui vi lascio il pezzo di codice....
C:
#include "gamelib.h"

static struct Cella *scacchiera = NULL ;

static struct Giocatore Ciccio;
static struct Giocatore Ninja ;
int lato ;

void alien();
void trap();

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

void muovi();
void usa_oggetto();

void turno_ninja();
void turno_ciccio();
void zaino();

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 int vita_ciccio=100;
static int scudo_ciccio=100;
static int vita_ninja=100;
static int scudo_ninja=100;

///la funzione termina_creazione permette di ritonrare al menu iniziale del gioco
void termina_creazione() {
}

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


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();
return ;


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


}


void crea_scacchiera () {

printf("Immettere la lunghezza n di un lato della scacchiera: " );
scanf("%d", &lato );

mappa=lato*lato ;
righe=lato;
colonne=lato;
scacchiera=malloc(righe*colonne*sizeof(struct Cella));
printf("Grandezza Mappa => %d (%dX%d)\n\n",mappa,lato,lato);


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  prob1= rand()%100;
if (prob1<ness_per) {
scacchiera[i*lato+j].pericolo=nessun_pericolo;
} else if (ness_per<=prob1&&prob1<=ness_per+trapp) {
scacchiera[i*lato+j].pericolo=trappola;
} else if(prob1>=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 prob2 =rand()%100;
if (prob2<no_obj) {
scacchiera[i*lato+j].oggetto=nessun_oggetto;
} else if (no_obj<=prob2&&prob2<no_obj+medik) {
scacchiera[i*lato+j].oggetto=medikit;
} else if (no_obj+medik<=prob2&&prob2<no_obj+medik +pozio)
scacchiera[i*lato+j].oggetto=pozione;
else if (no_obj+medik+pozio<=prob2&&prob2<no_obj +medik+pozio+mater)
scacchiera[i*lato+j].oggetto=materiale;
else if (no_obj+medik+pozio+mater<=prob2)
scacchiera[i*lato+j].oggetto=colpi_lanciarazzi;
}
}


Ciccio.x=rand()%lato;
Ciccio.y=rand()%lato;
Ninja.x=rand()%lato;
Ninja.y=rand()%lato;

printf("Ciccio.x=%d\n", Ciccio.x );
printf("Ciccio.y=%d\n", Ciccio.y );
printf("Ninja.x=%d\n", Ninja.x );
printf("Ninja.y=%d\n", Ninja.y);



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(){
    if(scacchiera == NULL){

    printf("Devi ancora creare la scacchiera!...\n ");
    printf("\n ");}


      printf("\n\n\n\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" );
      }


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



void gioca(){
  if(scacchiera == NULL){
    printf("Devi creare prima la mappa...\n\n\n ");
    return ;
  }
    if (turni_passati==0) {
     if (rand()%2==0) {
       turno_ninja();
      --mosse_a_disposizione_Ciccio;
     } else {
       turno_ciccio();
       --mosse_a_disposizione_Ninja;
     }


   } else if (mosse_a_disposizione_Ninja==1) {
      turno_ninja();

    } else if(mosse_a_disposizione_Ciccio==1) {
      turno_ciccio();

    }
}


void turno_ciccio(){
  printf("%d\n",mosse_a_disposizione_Ninja );
  printf("%d\n",mosse_a_disposizione_Ciccio );
  if (mosse_a_disposizione_Ciccio==0) {
    turni_passati=turni_passati+0.5;
    ++mosse_a_disposizione_Ninja;
    gioca();
  }
  int scl;

printf("\n\n\nCiccio è il tuo turno ! \n Scegli cosa fare!\n\n\n\n");
do{
  printf("\t Premi '1' per MUOVERTI \n" );
  printf("\t \n" );
  printf("\t Premi '2' per USARE UN OGGETTO \n" );
  printf("\t \n" );

scanf("%d" ,&scl);
if(scl < 0 || scl > 2){
printf("Errore hai inserito un valore non valido\n");
}
switch(scl)
{
case 1: muovi();
break;
case 2: usa_oggetto();
break;
}

}while( scl != 0);

}



void turno_ninja(){
  printf("%d\n",mosse_a_disposizione_Ninja );
  printf("%d\n",mosse_a_disposizione_Ciccio );

  if (mosse_a_disposizione_Ninja==0) {
    turni_passati=turni_passati+0.5;
    ++mosse_a_disposizione_Ciccio;
  gioca();
  }
int scl;
  printf("\n\n\nNinja è il tuo turno ! \n Scegli cosa fare!\n\n\n\n");

  do{
    printf("\t Premi '1' per MUOVERTI \n" );
    printf("\t \n" );
    printf("\t Premi '2' per USARE UN OGGETTO \n" );
    printf("\t \n" );

   scanf("%d" ,&scl);
   if(scl < 0 || scl > 2){
   printf("Errore hai inserito un valore non valido\n");
  }
  switch(scl)
  {
  case 1: muovi();
  break;
  case 2: usa_oggetto();
  break;
  }
 
Ultima modifica:

Zeus Giove

Nuovo Utente
21
11
Tornare alla main() é sconsigliato, in quanto tutto il codice é presente nella main(), quindi potresti generare un loop
Codice:
void main()
{
A();
}
void A()
{
B();
}
void B()
{
C();
}
.....
void Z()
{
//richiama la main
}
Esempio di loop
Comunque come faresti a richiamare una funzione di tipo void senza parametri di ingresso di nome "tizio"? E se il nome fosse " main"?
 

marcococ

Nuovo Utente
29
1
nel caso in cui un giocatore morisse , devo ritornare al menù iniziale del gioco che sta nel main....come dovrei fare secondo te quindi ?
i parametri di ingresso li devo aggiustare.....
 

Zeus Giove

Nuovo Utente
21
11
Mi scusi, ma adesso che ho capito a cosa le serve non so rispondere. Si potrebbe chiamare la main, come ogni altra funzione si chiama, oppure saltare alla prima riga del programma, ma le cose non risolverebbero il problema, servirebbe (e non so come ottenere) un modo per cancellare la memoria che ricorda le funzioni non finite (quella che contiene la funzione a cui la return spedisce, non so come si chiami), perché se non si cancellasse quella dopo un numero limitato di morti il controllore non avrebbe più spazio per segnarsi le funzioni chiamate.
Chiedo scusa per il mio linguaggio da neofita, quale sempre più riconosco di essere
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Il main non va chiamato; se ne hai la necessità vale quanto detto nell'altro topic: stai sbagliando qualcosa nel modo in cui strutturi il tuo programma.

Hai provato ad analizzare con un debugger lo stato di quelle variabili? Oltretutto sono dichiarate static, non sono solo globali.

La prima stampa che vedrai (sia in ciccio che in ninja) mostrerà lo stato iniziale in quanto il loro valore non è ancora stato modificato.

Fai attenzione poichè quelle 3 funzioni che si richiamano a vicenda dubito ti diano i risultati attesi... quando la funzione ritorna, il controllo è passato di nuovo alla chiamante.
Inoltre la variabile turni_passati sarà sempre a 0 anche in caso gli venga sommato + 0.5 in quanto è di tipo int, e la parte decimale viene troncata.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Occhio che non ha senso che gioca() chiami turno_ciccio/ninja e questo chiami gioca().
Il main non va chiamato; se ne hai la necessità vale quanto detto nell'altro topic: stai sbagliando qualcosa nel modo in cui strutturi il tuo programma.

Hai provato ad analizzare con un debugger lo stato di quelle variabili? Oltretutto sono dichiarate static, non sono solo globali.

La prima stampa che vedrai (sia in ciccio che in ninja) mostrerà lo stato iniziale in quanto il loro valore non è ancora stato modificato.

Fai attenzione poichè quelle 3 funzioni che si richiamano a vicenda dubito ti diano i risultati attesi... quando la funzione ritorna, il controllo è passato di nuovo alla chiamante.
Inoltre la variabile turni_passati sarà sempre a 0 anche in caso gli venga sommato + 0.5 in quanto è di tipo int, e la parte decimale viene troncata.
Mi hai fregato sul tempo :asd:
 
  • Mi piace
Reazioni: DispatchCode

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

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili