PROBLEMA [C++] matrice caratteri in un sottoprogramma

Pubblicità

Pr0ves

Utente Attivo
Messaggi
172
Reazioni
1
Punteggio
38
Non riesco a risolvere questo errore
Codice:
invalid types 'char[int]' for array subscript
in questo sottoprogramma che serve a leggere una matrice di caratteri minuscoli di dimensioni date
Codice:
void leggi(char * M, int m, int n, char min, char max){
    for(int i=0; i<m; i++)
    {
        int j=0;
        do{
            cout << "Inserire una lettera minuscola: ";
            cin >> M[i][j];
            if((M[i][j]>min) && (M[i][j]<max))
            {j++;}else{
                    cout << "Riprova."<< endl;
            }
        }while(j<n);
    }
}
l'errore sta in
Codice:
[COLOR=#000000]cin >> M[i][j];[/COLOR]
e nei parametri dell'if, cioé nelle matrici di caratteri. Ho capito che il problema sta nella dichiarazione, quindi in [char * M], almeno credo.
Come dovrei risolvere?


questo è tutto il codice, incompleto
Codice:
#include <iostream>using namespace std;
void leggi(char * M, int m, int n, char min, char max);
void cerca(char * M, char V[], int m, int n, int X[], int Y[], int &l);
void stcole(char * M, char S[], int m, int n);


int main()
{
    int m,n,o;
    cout << "***Ricerca consonanti in una matrice di caratteri e qualcos'altro***"<<endl;
    cout << "Numero di righe: ";
    cin >> m;
    cout << "Numero colonne: ";
    cin >> n;
    o=m*n;
    char M[m][n], mn='a', mx='z', V[21]={'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','x','w','y','z'};
    leggi(&M[0][0], m, n, mn, mx);
    int X[o], Y[o], l=0;
    cerca(&M[0][0], V, m, n, X, Y, l);
    cout << "Consonante\tRiga\tColonna"<<endl;
    for(int i=0; i<l; i++)
    {
        cout << M[X[i]][Y[i]] << "\t"<<X[i]<<"\t"<<Y[i]<<endl;
    }
    char P[11];
    cout << "Inserire una parola (max 10 lettere): ";
    cin >> P;
    stcole(&M[0][0], P, m, n);


    return 0;
}


void leggi(char * M, int m, int n, char min, char max)
{
    for(int i=0; i<m; i++)
    {
        int j=0;
        do{
            cout << "Inserire una lettera minuscola: ";
            cin >> M[i][j];
            if((M[i][j]>min) && (M[i][j]<max))
            {j++;}else{
                    cout << "Riprova."<< endl;
            }
        }while(j<n);
    }
}


void cerca(char * M, char V[], int m, int n, int X[], int Y[], int l)
{


}


void stcole(char * M, char S[], int m, int n)
{


}
stcol sta per stampa colonne
 
Ultima modifica:
Il codice è davvero poco leggibile...per favore, commentalo e/o rendilo leggibile.
In aggiunta, ti avviso che:
Codice:
 cout << "Numero di righe: ";
    cin >> m;
    cout << "Numero colonne: ";
    cin >> n;
    o=m*n;
    char M[m][n]
è errato.
 
il programma serve/dovrebbe servire a trovare le consonanti in una matrice di caratteri immessa da tastiera e a stampare le colonne dove si trovano queste consonanti.
Codice:
void leggi(char * M, int m, int n, char min, char max){     //M sarebbe la matrice, m numero righe, n numero colonne, min e max sono i caratteri che la lettera inserita non deve superare, cioé 'a' e 'z'
    for(int i=0; i<m; i++) //i deve essere minore del numero di righe
    {
        int j=0; //dichiarazione intero per il ciclo do-while, minore del numero di colonne
        do{
            cout << "Inserire una lettera minuscola: ";
            cin >> M[i][j];                //viene acquisito il carattere e messo nella matrice
            if((M[i][j]>min) && (M[i][j]<max)) //si verifica che il carattere è una lettera minuscola
            {j++;}else{
                    cout << "Riprova."<< endl;
            }
        }while(j<n);
    }
}
Ho commentato solo questa parte di codice perché mi serve aiuto maggiormente qui. Spero vada bene.
Comunque perché sarebbe sbagliata quella parte?

- - - Updated - - -

credo di aver risolto, usando al posto di
Codice:
M[i][j]
Codice:
*(M+i*n+j)
perché con il secondo si va a modificare direttamente il valore sulla memoria a quella posizione, mi sembra.
Ho completato il codice
Codice:
#include <iostream>
using namespace std;
void leggi(char * M, int m, int n, char min, char max); //M sarebbe la matrice, m numero righe, n numero colonne, min e max sono i caratteri che la lettera inserita non deve superare, cioé 'a' e 'z'
void cerca(char * M, char V[], int m, int n, int X[], int Y[], int &l); //V è la stringa di caratteri usata perverificare se la lettera inserita è una consonante, X[] e Y[] sono gli array in cui vengono messe le posizioni delle consonanti, l è il numero di consonanti trovate
void stcol(char * M, char S[], int m, int n); //S[] è la parola di cui si vuole cercare nella matrice le lettere che la compongono


int main()
{
    int m,n;
    cout << "***Ricerca consonanti in una matrice di caratteri e qualcos'altro***"<<endl; //acquisizione grandezza matrice
    cout << "Numero di righe: ";
    cin >> m;
    cout << "Numero colonne: ";
    cin >> n; 
    char M[m][n], mn='a', mx='z', V[21]={'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','x','w','y','z'}; //dichiarazione della matrice con grandezze m e n, di mn e mx che sarebbero i caratteri che le lettere inserite non devono superare, del vettore V contenente le consonanti
    leggi(&M[0][0], m, n, mn, mx);
    int X[m*n], Y[m*n], k=0; //dichiarazione vettori X e Y di grandezza m*n (cioé il numero massimo di consonanti che si possono trovare), e di k, il contatore delle consonanti
    cerca(&M[0][0], V, m, n, X, Y, k); //qui mi dà errore
    cout << "Consonante\tRiga\tColonna"<<endl;
    for(int i=0; i<k; i++) //stampa consonanti trovate con le coordinate
    {
        cout << M[X[i]][Y[i]] << "\t"<<X[i]<<"\t"<<Y[i]<<endl;
    } 
    char P[11];
    cout << "Inserire una parola (max 10 lettere): "; //acquisizione parola da confrontare
    cin >> P;
    stcol(&M[0][0], P, m, n);


    return 0;
}


void leggi(char * M, int m, int n, char min, char max)
{
    for(int i=0; i<m; i++)
    {
        int j=0;
        do{
            cout << "Inserire una lettera minuscola: ";
            cin >> *(M+i*n+j);
            if((*(M+i*n+j)>min) && (*(M+i*n+j)<max))
            {j++;}else{
                    cout << "Riprova."<< endl;
            }
        }while(j<n);
    }
}


void cerca(char * M, char V[], int m, int n, int X[], int Y[], int l)
{
    l=0;
    for(int i=0; i<m; i++)
    {
        for(int j=0; j<n; j++)
        {
            int g=0;
            while((*(M+i*n+j)!=V[g]) && (g<21))
            {
                g++;
            }
            if(*(M+i*n+j)==V[g])
            {
                X[i]=i;
                Y[j]=j;
                l++;
            }
        }
    }
}


void stcol(char * M, char S[], int m, int n)
{
    for(int j=0; j<n; j++)
    {
        int i=0, int k=0;
        bool stamp=false;
        while(i<m && stamp==false)
        {
            while((S[k]!='\0') && (*(M+i*n+j)!=S[k]))
            {
                k++;
            }
            if(*(M+i*n+j)==S[k])
            {
                for(int l=0; l<m; l++)
                {
                    cout << *(M+i*n+j) << endl;
                }
                stamp=true;
            } else{i++;}
        }
    }
}
Adesso trovo un nuovo errore alla riga indicata
Codice:
18 undefined reference to `cerca(char*, char*, int, int, int*, int*, int&)'|
non riesco a capire perché esce questo errore dato che ho immesso le variabili in modo corretto
 
Probabilmente chiami la funzione passando parametri di diverso tipo.
In ogni caso gli array sono entità statiche, ossia il compilatore deve conoscerne la dimensione a compile-time; nel tuo caso la dimensione è definita a run-time. Devi pertanto utilizzare l'allocazione dinamica, i vector, o std::array (C++11).
 
Il fatto è che in altri programmi mi funzionava il richiamo di array ad una dimensione, infatti cercando su internet, mi è sembrato di capire che nella dichiarazione dei parametri di un sottoprogramma si può lasciare libera la prima dimensione mentre non lo si può fare per le altre. Negli array a più dimensioni, che in questo caso sarebbe il char M, mi sembrava che con il puntatore * si potesse usare la variabile anche senza indicando le dimensioni.
 
Il fatto è che in altri programmi mi funzionava il richiamo di array ad una dimensione, infatti cercando su internet, mi è sembrato di capire che nella dichiarazione dei parametri di un sottoprogramma si può lasciare libera la prima dimensione mentre non lo si può fare per le altre. Negli array a più dimensioni, che in questo caso sarebbe il char M, mi sembrava che con il puntatore * si potesse usare la variabile anche senza indicando le dimensioni.
Si infatti è così, devi specificare le altre dimensioni. Usando il puntatore dovrebbe essere come dici tu, magari prova e dammi una conferma. ;)
Ma quello che dico io non riguarda il problema di compilazione, è solamente un errore logico.
 
Ultima modifica:
Sul fatto che ci siano errori logici non ci sono dubbi, sono solo all'inizio dell'apprendimento.
Comunque credo di aver risolto quel problema modificando i parametri
Codice:
void cerca(char * M, char V[], int m, int n, int X[], int Y[], int l);


cerca(&M[0][0], V, m, n, X, Y, k);
ho tolto il segno & all'ultimo parametro, solo che adesso pur permettendomi di fare la build non mi stampa niente dal secondo sottoprogramma in poi, molto probabilmente c'è un errore nel procedimento logico, come detto prima :D.
 
Sul fatto che ci siano errori logici non ci sono dubbi, sono solo all'inizio dell'apprendimento.
Non offenderti, ma era abbastanza evidente; ma comunque suppongo tu abbia studiato l'allocazione dinamica, vedo che utilizzi matrici e puntatori.
Qual'è la traccia dell'esercizio?
 
Ultima modifica:
Per gli array multidimensionali che, come già detto, sono strutture dati statiche, nel momento in cui li passi come parametri a function o procedure, devi appunto riportare tutte le dimensioni (che non devono essere variabili locali) esclusa la prima. Io uso fare così (supponiamo che sto lavorando su una matrice, array bidimensionale):

...

#define dim1 25
#define dim2 25

...

tipo function/procedura(int [][], int, int, ...);

...

int main(){
int m, n, A[dim1][dim2];
do{
cout<<"Specificare il n. di righe della matrice: ";
cin>>m;
} while(m<1 || m>dim1);
do{
cout<<"Specificare il n. di colonne della matrice: ";
cin>>n;
} while(n<1 || n>dim2);

...

nome function/procedura(A, m, n, ...);

...

}

tipo nome function/procedura(int A[][dim2], int m, int n, ...){

...

}

Se non ti è chiara qualcosa, chiedi pure ;)
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top