Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    28

    [C++] errore allocazione memoria

    progetto442.cpp|33|error: 'y' cannot appear in a constant-expression|
    codice:
    #include <iostream>
    #include <string>
    using namespace std;
    struct matrix
    {
        char nome;
        int r;
        int c;
        int** data;
    };
    //N MATRICI,UNA LETTERA CHE INDICA UNA MATRICE,INTERO R,INTERO C
    void specificaN(int& n)
    {
        cin>>n;
    }
    int main()
    {
        int n;
        specificaN(n);
        matrix m[n];
        int index=0;
        char l;
        int x,y;
        while(n!=0)
        {
            cout<<"inserisci nome A,B,C,..:"<<endl;
            cin>>l;
            m[index].nome=l;
            cin>>x;
            m[index].r=x;
            cin>>y;
            m[index].c=y;
            m[index].data=new int[x][y];
            n--;
            index++;
        }
    
    }
    devo per forza inserirle da tastiera! come faccio??

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Queste righe

    int n;
    specificaN(n);
    matrix m[n];

    che senso hanno?

    Se n non ha alcun valore, come pensi che possa essere usata nei vettori?

    E comunque, che compilatore usi? Se non usi un compilatore C99 dovrai usare l'allocazione dinamica, come ti ho già detto in un'altra discussione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Cieco...non vedi che lo usa nella funzione specifica n come parametro d'uscita?

    Il tuo problema è che non puoi assegnare a un vettore/matrice una dimensione decisa in fase di esecuzione, cioè

    codice:
    int n;
    cin >> n;
    int m[n]; //errore!
    questo è sbagliato! Con l'allocazione statica, cioè quella che hai appena fatto, n dovrebbe essere noto in fase di compilazione, cosa che non è!

    Se vuoi farlo decidere all'utente tramite il cin devi obbligatoriamente usare l'allocazione dinamica, cioè fare una cosa tipo:

    codice:
    int n;
    cin >> n;
    int* m = new int[n];
    //..il tuo codice..
    
    delete []m; //non dimenticare mai di deallocare!!

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590

    Re: [C++] errore allocazione memoria

    Originariamente inviato da effe_89
    progetto442.cpp|33|error: 'y' cannot appear in a constant-expression|
    ...
    m[index].data=new int[x][y];
    ...[/CODE]
    Vi faccio notare l'errore...
    ...e due possibili soluzioni:
    codice:
    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int main() {
    	int *array, x, y;
    	cin>>x;
    	cin>>y;
    	array = new int [x*y];
    	for(int i = 0; i < x; i++)
    		for(int j = 0; j < y; j++)
    			array[i*x+j] = (i*10) + j;
    	for(int i = 0; i < x; i++) {
    		for(int j = 0; j < y; j++)
    			printf("%0.2d ", array[i*x+j]);
    		cout<<endl;
    	}		
    	delete[] array;
    	int **array2 = new int*[x];
    	for(int i = 0; i < x; i++)
    		array2[i] = new int[y];
    	for(int i = 0; i < x; i++)
    		for(int j = 0; j < y; j++)
    			array2[i][j] = (i*10) + j;
    	for(int i = 0; i < x; i++) {
    		for(int j = 0; j < y; j++)
    			printf("%0.2d ", array2[i][j]);
    		cout<<endl;
    	}
    	for(int i = 0; i < x; i++)
    		delete[] array2[i];
    	delete[] array2;
    	return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    A parte che, permettendo il compilatore quell'istruzione (matrix m[n] su cui tanto discutete, va benissimo anche:
    codice:
    int x, y;
    cin>>x;
    cin>>y;
    int array[x][y];
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da Scara95
    A parte che, permettendo il compilatore quell'istruzione (matrix m[n] su cui tanto discutete, va benissimo anche:
    No. Non va bene per niente. Il C++ vieta l'uso degli variable length array che il C99 invece permette. In C++ standard la variabile dimensionale di un array dev'essere nota a compile time. Viceversa è obbligatorio ricorrere all'allocazione dinamica. Se un compilatore permette i variable length array in C++ la cosa dev'essere considerata un bug.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Dark867
    Cieco...non vedi che lo usa nella funzione specifica n come parametro d'uscita?
    Ops ... veramente addormentato ...

    Ma in effetti in C++ niente VLA ... alloacazione dinamica forever ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Originariamente inviato da shodan
    No. Non va bene per niente. Il C++ vieta l'uso degli variable length array che il C99 invece permette. In C++ standard la variabile dimensionale di un array dev'essere nota a compile time. Viceversa è obbligatorio ricorrere all'allocazione dinamica. Se un compilatore permette i variable length array in C++ la cosa dev'essere considerata un bug.
    Non ho detto che sia giusto farlo, ho solo detto che se il compilatore lo permette si può fare...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ci sono molte cose che il compilatore permette, ma non per questo si debbono fare.
    Ad esempio:
    codice:
    int qualcosa = 0;
    delete &qualcosa;
    E comunque solo il Gcc / G++ (per quel che ne so) supporta il C99 (e lo abilità per default in barba allo standard C++).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  10. #10
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Se vuoi fare codice immondizia fa pure, ma secondo me ti conviene seguire lo standard...e poi c'è da dire che così il codice sarà compilabile solo usando quel compilatore, ma darà errori con altri...meglio scrivere una volta sola e bene no?

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.