[c++] valore costante che deve essere costante

di il
15 risposte

[c++] valore costante che deve essere costante

Ciao a tutti:

di seguito un listato di esempio


#include <iostream>
#include <iomanip>
#include <ctime>

using namespace std;


const int MAXcaratteri = 20;

void istogramma(const int vettore[], const int dimVett);//traccia un isogramma dei dati contenuti nel vettore "vettore"


int main()
{
	srand(time(0));

	int vettore[MAXcaratteri] = { 0 };
	for (int i = 0; i < MAXcaratteri; i++) {
		vettore[i] = rand() % 100; // pseudo casuali tra 0 e 99
	}

	istogramma(vettore, MAXcaratteri);

}

void istogramma(const int vettore[], const int dimensione) {// normalizzo per costruire un istogramma
	int maxLunghezza = 69; // numero massimo di caratteri nell'istogramma
	char simbolo = '*';// carattere unitario dell'istogramma

	int max = 0;
	int vettoreNormalizzato[dimensione] = { 0 };

	for (int i = 0; i < dimensione; i++) {
		if (max < vettore[i]) {
			max = vettore[i];
		}
	}

	for (int i = 0; i < dimensione; i++) {
		vettoreNormalizzato[i] = (vettore[i] * maxLunghezza) / max;
	}
	cout << endl;

	// in lunghezzaStatCopia[i] ho i dati normalizzati il massimo a 'dimensione' unità

	cout << "Istogramma della lunghezza delle parole" << endl << endl;
	cout << "           |---------|---------|---------|---------|---------|---------|--------+" << endl;
	for (int i = 0; i < dimensione; i++) {
		if (vettoreNormalizzato[i] > 0) {//solo se ci sono dati significativi
			cout << setw(2) << right << i << " lettere |";
			for (int j = 0; j < vettoreNormalizzato[i]; j++) {
				cout << simbolo;
			}
			cout << endl;
		}
	}
	cout << "           |---------|---------|---------|---------|---------|---------|--------+";
}

come potete vedere la funzione istogramma prevede come argomenti un vettore e la sua dimensione, dichiarata come const int.

all'intero della funzione dichiaro un vettore, la cui dimensione è proprio "dimensione" intero e costante.

Compilando con visual studio, mi abortisce con il messaggio "L'espressione deve avere un valore costante non è possibile usare il valore di parametro "dimensione" (dichiarato alla riga 29) come costante

la riga 29 è l'inizio della funzione istogramma.

se nella dichiarazione del vettore invece di "dimensione" uso per esempio MAXcaratteri o un intero qualsiasi per esempio 1000 tutto funziona.

dove stò sbagliando?

15 Risposte

  • Re: [c++] valore costante che deve essere costante

    Cosa sarebbe dimensione? Comunque è corretto che ci stia una costante.
  • Re: [c++] valore costante che deve essere costante

    Non ho capito qual è il problema, a me compila perfettamente
  • Re: [c++] valore costante che deve essere costante

    Se intendi usare una variabile al posto di una costante (per un VLA) sappi che il compilatore Microsoft non lo consente.
  • Re: [c++] valore costante che deve essere costante

    X Oregon
    Dimensione è la dimensione del vettore che passo come parametro alla funzione è dichiarata costante,e (nelle mie intenzioni) lo è
    non voglio usare una variabile, voglio "costruire" nella funzione un vettore della dimensione corretta. (se lo dichiaro:

    int vettoreNormalizzato[1000] = { 0 };

    me lo compila, ma perché devo crearmi un vettore più grande di quello necessario?


    x Orion99
    a me (visual studio ) il codice così come postato, non mi compila, l'errore è quello che ho scritto
  • Re: [c++] valore costante che deve essere costante

    calderino ha scritto:


    X Oregon
    Dimensione è la dimensione del vettore che passo come parametro alla funzione è dichiarata costante,e (nelle mie intenzioni) lo è
    non voglio usare una variabile, voglio "costruire" nella funzione un vettore della dimensione corretta. (se lo dichiaro:

    int vettoreNormalizzato[1000] = { 0 };

    me lo compila, ma perché devo crearmi un vettore più grande di quello necessario?


    x Orion99
    a me (visual studio ) il codice così come postato, non mi compila, l'errore è quello che ho scritto
    Probabilmente il problema è legato al compilatore, come ha detto Oregon
  • Re: [c++] valore costante che deve essere costante

    Xorion99
    che compilatore usi?

    non credo il problema sia quello (a meno di malfunzionamenti del mio).

    Io voglio dichiarare un vettore di dimensione costante in una funzione, passandogli un valore costante come parametro, devo poterlo fare, perché non me lo fa fare?, dove sbaglio? (oppure dove sbaglia il mio compilatore)
  • Re: [c++] valore costante che deve essere costante

    calderino ha scritto:


    Xorion99
    che compilatore usi?

    non credo il problema sia quello (a meno di malfunzionamenti del mio).

    Io voglio dichiarare un vettore di dimensione costante in una funzione, passandogli un valore costante come parametro, devo poterlo fare, perché non me lo fa fare?, dove sbaglio? (oppure dove sbaglia il mio compilatore)
    Io uso gcc come compilatore, prova comunque ad utilizzare un altro compilatore. Non penso sia uno "sbaglio" del compilatore ma semplicemente è dovuto al fatto che i compilatori si comportano tutti in modo diverso.
  • Re: [c++] valore costante che deve essere costante

    Più semplicemente il const della funzione viene ignorato. E lo si può vedere tramite RTTI.
    Ossia:
    
    void istogramma(const int vettore[], const int dimVett)
    
    diventa
    
    void istogramma(const int vettore[], int dimVett)
    
  • Re: [c++] valore costante che deve essere costante

    E quindi il tuo vettore diventa un VLA che il compilatore di MS non ammette. Utilizza l'allocazione dinamica con una malloc al suo posto.
  • Re: [c++] valore costante che deve essere costante

    Al che ne so io, non si possono usare identificatori per determinare la lunghezza di un vettore statico, anche se dichiarati const. Nemmeno quel MAXcaratteri sarebbe tenuto ad accettare (dovresti dichararla con #define o il più moderno constexpr) come dimensione. In più l'hai inizializzato con un solo valore, quindi neanche si può essere sicuri se sia davvero di lunghezza 20 o 1. Per quanto riguarda la funzione, penso che l'unico modo sia il vettore allocato dinamicamente.
  • Re: [c++] valore costante che deve essere costante

    Alexv ha scritto:


    Al che ne so io, non si possono usare identificatori per determinare la lunghezza di un vettore statico, anche se dichiarati const.
    Funziona
    In più l'hai inizializzato con un solo valore, quindi neanche si può essere sicuri se sia davvero di lunghezza 20 o 1.
    Ma che vuoi dire?
  • Re: [c++] valore costante che deve essere costante

    La controprova sono i template.
    
    template <int T>
    void test() {
    
    	int arr[T] = { 0 };
    	cout << sizeof(arr) << endl;
    
    }
    
    int main()
    {
    	const int num = 10;
    	test<num>();
    }
    
    Compila benissimo.
    Per quanto riguarda la funzione, penso che l'unico modo sia il vettore allocato dinamicamente.
    In realtà no, ma il modo è pericoloso quanto l'uso "allegro" del goto (e non so nemmeno quanto sia portabile).
  • Re: [c++] valore costante che deve essere costante

    Grazie per le risposte,
    se ho ben capito, devo utilizzare la malloc (o la new immagino) per assegnare memoria al mio vettore.

    mi sono ostici i concetti:
    "il const della funzione viene ignorato. E lo si può vedere tramite RTTI"
    e
    "il tuo vettore diventa un VLA "
    ma cercherò di approfondirli

    per quanto riguarda l'assegnazione del valore 0 a tutti gli elementi del vettore, funziona benissimo (prova a stampare il vettore subito dopo la definizione e tutti gli elementi saranno uguali a 0) anche se effettivamente non ce ne sarebbe bisogno in quanto subito dopo assegno ad ogni elemento il suo valore pseudo casuale, ma è una tecnica che uso frequentemente senza ormai neanche più pensarci.
  • Re: [c++] valore costante che deve essere costante

    Ho risolto nel seguente modo
    
    void istogramma(const int vettore[], const int dimensione, char simbolo, int maxLunghezza){// normalizzo per costruire un istogramma
    	//maxLunghezza - numero massimo di caratteri nell'istogramma
    	//simbolo - carattere usato per disegnare l'istogramma
    
    	int max = 0;
    	int* vettoreNormalizzato = new int[dimensione]; // vettore <----------------------------
    
    	for (int i = 0; i < dimensione; i++) {
    		if (max < vettore[i]) {
    			max = vettore[i];
    		}
    	}
    
    	for (int i = 0; i < dimensione; i++) {
    		vettoreNormalizzato[i] = (vettore[i] * maxLunghezza) / max;
    	}
    	cout << endl;
    
    	// in lunghezzaStatCopia[i] ho i dati normalizzati il massimo a 'dimensione' unità
    
    	cout << "Istogramma della lunghezza delle parole" << endl << endl;
    	cout << "           |---------|---------|---------|---------|---------|---------|--------+" << endl;
    	for (int i = 0; i < dimensione; i++) {
    		if (vettoreNormalizzato[i] > 0) {//solo se ci sono dati significativi
    			cout << setw(2) << right << i << " lettere |";
    			for (int j = 0; j < vettoreNormalizzato[i]; j++) {
    				cout << simbolo;
    			}
    			cout << endl;
    		}
    	}
    	cout << "           |---------|---------|---------|---------|---------|---------|--------+";
    	delete[] vettoreNormalizzato;
    	return;
    }
    
    
    Ho anche letto dei VLA, ma perché il mio è considerato variabile? quando ho dichiarato sempre la dimensione come costante?
    e poi perchè "il const della funzione viene ignorato". Credo dovrò ancora leggere parecchio.

    comunque grazie
Devi accedere o registrarti per scrivere nel forum
15 risposte