C++ problema matrice di tipo char in funzione

di il
8 risposte

C++ problema matrice di tipo char in funzione

Sto facendo il gioco forza4 in c++ ma appena ho iniziato a scrivere mi da questo errore :

In function 'int main()':
15 36 C:\Users\andrea\Desktop\SenzaTitolo1.cpp [Error] invalid conversion from 'char' to 'char (*)[7]' [-fpermissive]
5 6 C:\Users\andrea\Desktop\SenzaTitolo1.cpp [Error] initializing argument 1 of 'void inizializzazione(char (*)[7])' [-fpermissive]

Ecco il codice:

#include<iostream>
#include<cstdlib>
using namespace std;

void inizializzazione(char campodagioco[6][7]){ riga col primo errore
int i,j;
for(i = 0; i < 6; i++) {
for(j = 0; j < 7; j++) {
campodagioco[j] = ' '; } }
}

int main(){
int i,j;
char campodagioco[6][7];
inizializzazione(campodagioco[6][7]); riga col 2 errore
for(i = 0; i < 6; i++)
{
for(j = 0; j < 7; j++)
{
cout<<campodagioco[j]<<" | ";
}

}
system("pause");
}

qualcuno sa per favore dirmi cosa devo cambiare nel codice? Grazie

8 Risposte

  • Re: C++ problema matrice di tipo char in funzione

    La seguente chiamata
    inizializzazione(campodagioco[6][7]);
    passa alla funzione inizializzazione() un carattere char (precisamente il carattere alla posizione [6][7] della matrice campodagioco) e NON una matrice [6][7].
    Per il primo warning, invece, prova a passare la matrice così
    void inizializzazione(char campodagioco[][7])
    e poi richiami la funzione così
    inizializzazione(campodagioco);
  • Re: C++ problema matrice di tipo char in funzione

    Grazie per la risposta tempestiva , ho risolto in modo simile.
  • Re: C++ problema matrice di tipo char in funzione

    Altro problema, sono andato avanti a scrivere nel codice, non ce nessun errore, ma se nella sceltainiziale scrivo 2 il programma non risponde , cosa puo essere? (scusa se faccio tanti errori ma lo sto studiando)

    #include<iostream>
    #include<cstdlib>
    #include<time.h>
    using namespace std;

    void inizializzazione(char campodagioco[6][7],int riga,int colonna){
    for(riga = 0; riga < 6; riga++) {
    for(colonna = 0; colonna < 7; colonna++) {
    campodagioco[riga][colonna] = ' '; } } }

    void mossacpu (char campodagioco[6][7],int riga, int colonna){
    riga=5;
    int controllo;
    controllo=0;
    srand((unsigned)time(NULL));
    colonna= rand() % 7;
    while(controllo==0){

    if(campodagioco[riga][colonna] != ' ')
    {riga++;
    }
    if(campodagioco[riga][colonna] == ' '){
    campodagioco[riga][colonna]='O';
    controllo=1;}}}

    void mossag1(char campodagioco[6][7],int riga, int colonna){
    riga=5;
    int controllo;
    controllo=0;
    while(controllo==0){

    if(campodagioco[riga][colonna] != ' ')
    {riga++;
    }
    if(campodagioco[riga][colonna] == ' '){

    campodagioco[riga][colonna]='X';
    controllo=1;}}}

    int main(){
    int a;a=0;
    int riga,colonna,verifica,sceltainiziale,vincitore,cpu,g1;
    verifica=0;riga=0;colonna=0;vincitore=1;cpu=1;g1=2;
    char campodagioco[6][7];
    cout<<"Benvenuto nel gioco Forza 4 "<<endl<<endl;
    cout<<"Premere 1 per visualizzare le instruzioni"<<endl<<"Premere 2 per giocare in modalita : PC vs G1"<<endl<<"Premere 3 per visualizzare l esito delle ultime partite"<<endl<<endl;
    cin>>sceltainiziale;
    if(sceltainiziale==1){
    cout<<"Istruzioni del gioco:"<<endl<<"Per vincere contro il computer devi mettere in diagonale, in orizzontale o in verticale , 4 segni uguali, ovvere 4 X , il computer provera a batterti. La partita si svolge in un campo 6x7 con effetto di -gravita-"<<endl;}
    if(sceltainiziale==2){
    while(vincitore !=0){
    riga=5;
    mossacpu (campodagioco, riga, colonna);
    riga=0;colonna=0;
    //stampa
    cout<<endl<<"-----------------------------------"<<endl;
    while(riga<6 && colonna<7 && verifica==0){
    for(riga = 0; riga<6; colonna++){
    if(colonna>6 && verifica==0){
    riga++; colonna=0; cout<<endl<<"-----------------------------------"<<endl;}
    if(riga<6 && verifica==0){
    cout<<"| "<<campodagioco[riga][colonna]<<" |";}
    if(riga>5 && colonna > 6){
    verifica=1; }}}
    //finestampa

    cout<<"Turno del G1, in che colonna inserisci il segno? ";
    cin>>colonna;
    mossag1(campodagioco,riga,colonna);
    a++;
    if(a==5){
    vincitore=0;
    }

    system("cls");
    }


    }
    if(sceltainiziale==3){cout<<"prova";
    }
    system("pause");
    }
  • Re: C++ problema matrice di tipo char in funzione

    Allora... per prima cosa vediamo una elementare tecnica di debug: se scegli 2 il programma si pianta. Quindi analizzi cosa succede nel blocco che riguarda sceltainiziale==2 e cerchi di identificare la riga che genera il problema. Se scrivi
    
        if(sceltainiziale==2)
        {
            while(vincitore !=0)
            {
                riga=5;
                cout<<"Controllo 1"<<endl;
                mossacpu (campodagioco, riga, colonna);
                cout<<"Controllo 2"<<endl;
                ...
    
    ti accorgi che viene stampato "Controllo 1" ma non "Controllo 2". Quindi capisci che l'errore è nella funzione mossacpu.
    In particolare ho trovato un errore piuttosto evidente:
    
        while(controllo == 0)
        {
    
            if(campodagioco[riga][colonna] != ' ')
            {
                riga--;  /* avevi messo riga++ */
            }
            ..........
        }
    
    Se quella cella è già occupata allora devi decrementare la riga (passare a quella superiore). Se invece la incrementi vai out of bounds (fuori dai confini dell'array).

    In ogni caso temo proprio che non sia l'unico errore (peraltro ripetuto nella funzione mossag1). Anche la stampa non è corretta: vengono visualizzati caratteri speciali (faccine e simili) perché non richiami mai la funzione inizializzazione.

    Prova a riguardare bene un po' tutto il codice.

    P.S. Un primo consiglio è sicuramente quello di prevedere una funzione che stampi il campo da gioco, in modo da alleggerire il codice del main.
  • Re: C++ problema matrice di tipo char in funzione

    Grazie e' vero sono un pollo, intanto sono andato un po avanti nel codice e mi si ripresenta un altro problema ovvero , ho fatto una funzione(int win) che vede se ce un vincitore, il problema, e' che non mi riconosce mai un vincitore, perche'? vi giuro che ci sto provando da ieri e oggi sono quasi 30 min che cerco ancora di capirlo.Grazie per gli aiuti
    
    #include<iostream>
    #include<cstdlib>
    #include<time.h>
    using namespace std;
    
    void inizializzazione(char campodagioco[6][7],int riga,int colonna){
        for(riga = 0; riga < 6; riga++) { 
        for(colonna = 0; colonna < 7; colonna++) { 
        campodagioco[riga][colonna] = ' '; } } }
    
    void mossacpu (char campodagioco[6][7],int riga, int colonna){
    	riga=5;
    	int controllo;
    	controllo=0;
        srand(time(NULL));
    	colonna = rand() % 7;
    	while(controllo==0){
    	if(campodagioco[riga][colonna] != ' ')
    	{riga--;}
    	if(campodagioco[riga][colonna] == ' '){
    	campodagioco[riga][colonna]='O';
    	controllo=1;}}}
    	
    void mossag1(char campodagioco[6][7],int riga, int colonna){
        cout<<"Turno del G1, in che colonna inserisci il segno? ";
        cin>>colonna;
    	riga=5;
    	int controllo;
    	controllo=0;
    	while(controllo==0){
    	if(campodagioco[riga][colonna] != ' ')
    	{riga--;}
    	if(campodagioco[riga][colonna] == ' '){
        campodagioco[riga][colonna]='X';
        controllo=1;}}}
    
    void stampa(char campodagioco[6][7],int riga, int colonna){
        int verifica;
        verifica=0;riga=0;colonna=0;
        cout<<endl<<"-----------------------------------"<<endl;
        while(riga<6 && colonna<7 && verifica==0){
        for(riga = 0; riga<6; colonna++){
        if(colonna>6 && verifica==0){
        riga++; colonna=0; cout<<endl<<"-----------------------------------"<<endl;}
        if(riga<6 && verifica==0){
        cout<<"| "<<campodagioco[riga][colonna]<<" |";}
        if(riga>5 && colonna > 6){	
        verifica=1; }}}}
    
    int win(char campodagioco[6][7],int riga,int colonna){
    
    int min=0;
    int max=0;
    int m=0;
    
    //controllo colonne
    if (riga>=3){
    if((campodagioco[riga][colonna]==campodagioco[riga-1][colonna])&&
        (campodagioco[riga-1][colonna]==campodagioco[riga-2][colonna])&&(campodagioco[riga-2][colonna]==campodagioco[riga-3][colonna])){
        	cout<<"prova";
        return(1);}
    }
    
    
    //Controllo righe
    //Da sinistra a destra
    //Da destra a sinistra
    
    if (colonna==3){ 
        min=0;
        max=6;}
        else if (colonna<3){ 
        min=0;
        max=colonna+3;
        }
        else if(colonna>3){
        min=colonna-3;
        max=6;
        }
        for (m=min;m<=max-3;m++){
        if ((campodagioco[riga][m]=='X'||campodagioco[riga][m]=='O')&&((campodagioco[riga][m]==campodagioco[riga][m+1])&&(campodagioco[riga][m+1]==campodagioco[riga][m+2]))&&(campodagioco[riga][m+2]==campodagioco[riga][m+3])){cout<<"prova1";
        return(1);}
    		}
    
    	
    //Controllo diagonali
    //Da destra a sinistra alto basso
    
    
    
    if ((campodagioco[riga][colonna]=='X')||(campodagioco[riga][colonna]=='O')&&(campodagioco[riga][colonna]==campodagioco[riga+1][colonna+1])&&(campodagioco[riga+1][colonna+1]==campodagioco[riga+2][colonna+2])&&
        (campodagioco[riga+2][colonna+2]==campodagioco[riga+3][colonna+3]))return(1);
    
    
     if ((campodagioco[riga-1][colonna-1]=='X')||(campodagioco[riga-1][colonna-1]=='O')&&(campodagioco[riga-1][colonna-1]==campodagioco[riga][colonna])&&(campodagioco[riga][colonna]==campodagioco[riga+1][colonna+1])&&
            (campodagioco[riga+1][colonna+1]==campodagioco[riga+2][colonna+2]))return(1);
    
    
    
    
    if ((campodagioco[riga-2][colonna-2]=='X')||(campodagioco[riga-2][colonna-2]=='O')&&(campodagioco[riga-2][colonna-2]==campodagioco[riga-1][colonna-1])&&(campodagioco[riga-1][colonna-1]==campodagioco[riga][colonna])&&
            (campodagioco[riga][colonna]==campodagioco[riga+1][colonna+1]))return(1);
    
    
    
    if ((campodagioco[riga-3][colonna-3]=='X')||(campodagioco[riga-3][colonna-3]=='O')&&(campodagioco[riga-3][colonna-3]==campodagioco[riga-2][colonna-2])&&(campodagioco[riga-2][colonna-2]==campodagioco[riga-1][colonna-1])&&
            (campodagioco[riga-1][colonna-1]==campodagioco[riga][colonna]))return(1);
    
    
    //Da sinistra a destra alto basso
    
    if ((campodagioco[riga][colonna]=='X')||(campodagioco[riga][colonna]=='O')&&(campodagioco[riga][colonna]==campodagioco[riga+1][colonna-1])&&(campodagioco[riga+1][colonna-1]==campodagioco[riga+2][colonna-2])&&
        (campodagioco[riga+2][colonna-2]==campodagioco[riga+3][colonna-3]))return(1);
    
    
    
    
     if ((campodagioco[riga-1][colonna+1]=='X')||(campodagioco[riga-1][colonna+1]=='O')&&(campodagioco[riga-1][colonna+1]==campodagioco[riga][colonna])&&(campodagioco[riga][colonna]==campodagioco[riga+1][colonna-1])&&
            (campodagioco[riga+1][colonna-1]==campodagioco[riga+2][colonna-2]))return(1);
    
    
    if ((campodagioco[riga-2][colonna+2]=='X')||(campodagioco[riga-2][colonna+2]=='O')&&(campodagioco[riga-2][colonna+2]==campodagioco[riga-1][colonna+1])&&(campodagioco[riga-1][colonna+1]==campodagioco[riga][colonna])&&
            (campodagioco[riga][colonna]==campodagioco[riga+1][colonna-1]))return(1);
    
    
    if ((campodagioco[riga-3][colonna+3]=='X')||(campodagioco[riga-3][colonna+3]=='O')&&(campodagioco[riga-3][colonna+3]==campodagioco[riga-2][colonna+2])&&(campodagioco[riga-2][colonna+2]==campodagioco[riga-1][colonna+1])&&
            (campodagioco[riga-1][colonna+1]==campodagioco[riga][colonna]))return(1);
    
    else
    return(0);
    
    
    }
    
    
    int main(){
    
    int a;a=0;//prova//
    int riga,colonna,sceltainiziale,vincitore,cpu,g1;
    
    riga=0;colonna=0;vincitore=1;cpu=1;g1=2;
    
    char  campodagioco[6][7];
    
    cout<<"Benvenuto nel gioco Forza 4 "<<endl<<endl<<"Premere 1 per visualizzare le instruzioni"<<endl<<"Premere 2 per giocare in modalita : PC vs G1"<<endl<<"Premere 3 per visualizzare l esito delle ultime partite"<<endl<<endl;
    cin>>sceltainiziale;
    if(sceltainiziale==1){
    cout<<"Istruzioni del gioco:"<<endl<<"Per vincere contro il computer devi mettere in diagonale, in orizzontale o in verticale , 4 segni uguali, ovvere 4 riga , il computer provera a batterti. La partita si svolge in un campo 6x7 con effetto di -gravita-"<<endl;}
    
    if(sceltainiziale==2){
    
    inizializzazione(campodagioco,riga,colonna);
    
    while(vincitore !=0){
    
    mossacpu (campodagioco, riga,  colonna);
    if(win(campodagioco,riga,colonna)==1){
    cout<<("Ha vinto la cpu\n");
         return(0);}
    stampa(campodagioco,riga,colonna);
    mossag1(campodagioco,riga,colonna);
    if(win(campodagioco,riga,colonna)==1){
    cout<<("Ha vinto il giocatore 1\n");
         return(0);	
    }
    }
    }
    if(sceltainiziale==3){cout<<"prova";
    }
    system("pause");
    }
    
  • Re: C++ problema matrice di tipo char in funzione

    Per il codice devi usare i tag CODE e indentarlo correttamente altrimenti non si capisce proprio nulla ....
  • Re: C++ problema matrice di tipo char in funzione

    oregon ha scritto:


    Per il codice devi usare i tag CODE e indentarlo correttamente altrimenti non si capisce proprio nulla ....
    Spero sia piu chiaro , l'ho modificato.
  • Re: C++ problema matrice di tipo char in funzione

    Dopo tanto sono riuscito a capire il problema, ovvero se io scrivevo cosi :
    if(campodagioco[riga][colonna]==campodagioco[riga-1][colonna]&&
        campodagioco[riga-1][colonna]==campodagioco[riga-2][colonna]&&campodagioco[riga-2][colonna]==campodagioco[riga-3][colonna]){
        	cout<<"prova";
        return(1);}
    diceva subito che aveva vinto, mentre se scrivevo cosi :
    if(campodagioco[riga][colonna]!=' '&&campodagioco[riga][colonna]==campodagioco[riga-1][colonna]&&
        campodagioco[riga-1][colonna]==campodagioco[riga-2][colonna]&&campodagioco[riga-2][colonna]==campodagioco[riga-3][colonna]){
        	cout<<"prova";
        return(1);}
    non vince mai nessuno,ovviamente questo problema lo ho con tutti i controlli , vert. orizz. e diagon. Son riuscito a capire che in realta io ho scritto all inizio del main
    int riga,colonna,sceltainiziale,vincitore,cpu,g1;
    vincitore=1;cpu=1;g1=2;colonna=0;riga=0;
    char  campodagioco[6][7];
    quando richiamo la funzione che verifica un vincitore arrivano colonna=0 e riga=0, se levo le assegnazioni del main dati casuali, il problema e che questa funzione, che vede se ce un vincitore ,io la chiamo dopo la funzione del mossa della cpu e del giocatore , funzioni tutte void, in cui come variabili di ingresso ci sono riga e colonna e campodagioco, il campo da gioco si modifica all interno delle funzioni e esce modificato mentre colonna e riga si modificano ma non escono proprio, per poi passare alla funzione della verifica.Da cosa dipende questo?

    funzioni:
    void mossacpu (char campodagioco[6][7],int riga, int colonna){
    	riga=5;
    	int controllo;
    	controllo=0;
        srand(time(NULL));
    	colonna = rand() % 7;
    	while(controllo==0){
    	if(campodagioco[riga][colonna] != ' ')
    	{riga--;}
    	if(campodagioco[riga][colonna] == ' '){
    	campodagioco[riga][colonna]='O';
    	controllo=1;}}}
    	
    void mossag1(char campodagioco[6][7],int riga, int colonna){
    	riga=5;
            cout<<"Che colonna sclegli?";
    	cin>>colonna;
    	int controllo;
    	controllo=0;
    	while(controllo==0){
    	if(campodagioco[riga][colonna] != ' ')
    	{riga--;}
    	if(campodagioco[riga][colonna] == ' '){
        campodagioco[riga][colonna]='X';
        controllo=1;}}}
    Pezzo del main:
    if(sceltainiziale==2){
    inizializzazione(campodagioco,riga,colonna);
    while(vincitore !=0){
    mossacpu (campodagioco, riga,  colonna);
    cout<<"colonna uscente ="<<colonna;
    win(campodagioco,riga,colonna,cntrl);
    
    if(cntrl==0){
    cout<<("Ha vinto la cpu\n");
         return(0);}
    stampa(campodagioco,riga,colonna);
    mossag1(campodagioco,riga,colonna);
    win(campodagioco,riga,colonna,cntrl);
    if(cntrl==0){
    cout<<("Ha vinto la cpu\n");
        return(0);
Devi accedere o registrarti per scrivere nel forum
8 risposte