Aiuto riguardo l'allocazione dinamica [C++]

di il
9 risposte

Aiuto riguardo l'allocazione dinamica [C++]

Salve ragazzi! sono qui a scrivere questo post perchè martedì rifarò l'esame di fondamenti di informatica, me la cavo abbastanza con la programmazione però ci sono alcune cose riguardo l'allocazione dinamica che non ho capito. Sintatticamente è tutto chiaro (operatore new, delete ecc.), fondamentalmente non ho ben capito in che modo usarla nel momento in cui devo scrivere un programma che legga da file una matrice(o anche un vettore) di cui non sono note le dimensioni. Concettualmente ho capito che è giusto usare l'allocazione in questi casi, ma non riesco a capire come applicarla. Mi piacerebbe avere delle delucidazioni in merito, magari con qualche esempio. Direste voi "Questa è roba che c'è sui libri, al massimo chiedi al tuo prof", ordunque il libro è poco chiaro e il mio prof non è altrettanto disponibile.. Grazie in anticipo

9 Risposte

  • Re: Aiuto riguardo l'allocazione dinamica [C++]

    Fondamentalmente l'allocazione dinamica la utilizzi quando non è nota a priori (in fase di compilazione) la dimensione della struttura dati oppure quando devi utilizzare grandi quantità di dati.
    Per es. se devi lavorare su un vettore di interi, se conosci già la dimensione (per es. 10) allora puoi scrivere
    int vett[10];
    ma se la dimensione viene inserita ad esempio dall'utente (e quindi non è nota in fase di compilazione) devi scrivere
    int *vett;
    vett = new ...
    In quest'ultimo caso la sequenza solita è
    a) determinare dimensione da allocare (es. con input da utente)
    b) allocare vettore
    c) verificare corretta allocazione
    d) usare il vettore
    e) delete del vettore
    Talvolta, o molto spesso se consideriamo le stringhe C (array di char), anche se la dimensione non è nota a priori viene considerato un "tetto massimo": es.
    char str[80];
    fgets( str, 80, fp );
    ovvero in questo caso considero che non ha senso avere una stringa più lunga di 80.
    Spero che questa semplice descrizione ti sia di aiuto
  • Re: Aiuto riguardo l'allocazione dinamica [C++]

    Anzitutto ti ringrazio per la risposta quasi fulminea (dato che il post l'ho aperto da poco)! Diciamo che avevo capito più o meno bene il tutto.. ricapitolando, la cosa che mi è meno chiara della spiegazione, anche se non è nota la dimensione di un array monodimensionale (o anche multidimensionale), si considera sempre un tetto massimo? Ad esempio, scrivere un "#define MAX 100" e poi allocare dinamicamente un vettore avente dimensioni "MAX", è un errore? Non so se mi sono spiegato XD
  • Re: Aiuto riguardo l'allocazione dinamica [C++]

    Di solito il "tetto massimo" lo utilizzi se NON allochi dinamicamente.
    Per es. vuoi lavorare con un vettore di interi e la dimensione verrà inserita dall'utente ma sai che l'utente potrà scegliere di inserire al massimo 10 interi, puoi fare
    #define MAX 10
    ...
    int vett[MAX];
    Non ha senso scomodare l'allocazione dinamica per pochi elementi. Naturalmente in questo caso devi verificare l'input dell'utente, quando gli chiedi il numero di elementi, che sia un valore n<=10.
    Se decidi di utilizzare l'allocazione dinamica perchè è richiesto dall'esercizio o perchè non puoi definire un "tetto massimo" allora fai
    int *vett = new...;
    Per ritornare alla tua domanda: se allochi dinamicamente non c'è bisogno di inserire un tetto massimo.
  • Re: Aiuto riguardo l'allocazione dinamica [C++]

    Perfetto... ora potresti darmi una mano con un programmino semplice che ho inventato (sicuramente sbagliato perchè non gira) ? In pratica consiste nel leggere un file di testo in cui vi è una sequenza di numeri e inserirli un array di interi. Ho sicuramente sbagliato qualcosa con l'allocazione. Questo è un abbozzo di codice:
    
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    
    void controllo (fstream& file);
    void lettura(fstream& file,  int vet);
    
    int main ()
    {
    	fstream file;
    	int dim, *vet=new int;
    	
    	controllo(file);
    	lettura(file,  vet);
    	delete vet;
    }
    
    Sintatticamente il main è giusto? Ora come posso procedere per la funzione di lettura?
  • Re: Aiuto riguardo l'allocazione dinamica [C++]

    Non è corretto, la sequenza che dovresti seguire è quella solita:
    a) determino dimensione dim (quindi la funzione controllo() dovrebbe ritornare il numero di elementi presenti nel file, magari chiamale GetNItems() per esempio)
    b) alloco il vettore di dimensione dim con new
    c) uso il buffer (quindi rileggo da file con lettura() a cui magari ci aggiungerei come parametro dim, in modo da poter fare dei controlli per evitare buffer overflow se, per assurdo, il file fosse cambiato rispetto al punto a))
    d) delete
  • Re: Aiuto riguardo l'allocazione dinamica [C++]

    Capisco, però non so come fare per determinare dim (la funzione controllo mi deve restituire dim come valore, come hai ben detto tu). Penso che bisogna contare proprio gli elementi presenti nel file giusto? Come potrei fare?
  • Re: Aiuto riguardo l'allocazione dinamica [C++]

    Ho risolto parzialmente. Dico parzialmente perchè sono riuscito a fare l'esercizio senza allocazione dinamica:
    #include <iostream>
    #include <fstream>
    using namespace std;
    #define MAX 6
    
    void controllo (fstream& file);
    void lettura(fstream& file,  int vet[MAX],int& dim);
    
    int main ()
    {
    	fstream file;
    	int dim=0, vet[MAX];
    	
    	controllo(file);
    	lettura(file,  vet, dim);
    	
    	for (int i=0; i<dim; i++){
    		cout<<vet[i]<<" ";
    	}
    }
    
    void controllo(fstream& file)
    {
    	file.open("vettore.txt", ios::in);
    	if(!file){
    		cout<<"Impossibile apire il file!";
    		exit(1);
    	}
    }
    
    void lettura(fstream& file, int vet[MAX], int& dim){
    	while (!file.eof()){
    	
    	file>>vet[dim++];
    	}
     file.close();
     
     }
    
    Ora per farlo con l'allocazione dinamica come potrei modificarlo?
  • Re: Aiuto riguardo l'allocazione dinamica [C++]

    La funzione lettura() contiene un ciclo che carica il vettore con i dati che legge da file, è corretto? Se è così, la funzione controlla() deve fare la stessa cosa con la differenza che invece di caricare un vettore semplicemente conta quanti elementi sono necessari, e ritorna tale dato come valore di ritorno.
  • Re: Aiuto riguardo l'allocazione dinamica [C++]

    Si su questo ci sono, per farlo però uso una variabile contatore? oppure si può fare semplicemente con un "return valore;"?

    EDIT: ho provato con una variabile contatore ma il programma non gira e non capisco il motivo.
    #include <iostream>
    #include <fstream>
    #define MAX 100
    using namespace std;
    
    void controlla (fstream& file, int& dim);
    void lettura (fstream& file, int& dim, int vet);
    
    int main() {
    	int *vet= new int[dim], dim=0;
    	fstream file;
    	
    	controlla(file, dim);
    	lettura (file, dim, vet);
    	
    	for (int i=0; i<dim; i++){
    		cout<<vet[i]<<" ";
    	}
    	
    	delete vet;
    	
    }
    
    void controlla (fstream& file, int& dim)
    {
    	file.open("vettore.txt",ios::in);                            //Se non trovi il file...
    	if (!file)
    	{
    		cout<<"Impossibile aprire il file specificato!";
    		exit(1);
    	}
    	
    	else {
    	
    	while (!file.eof()){                                        //lettura fino alla fine del file...
    		file>>dimm++;
    	}
      }
    }
    
    void lettura(fstream& file, int vet[MAX], int& dim)
    {
    	while(!file.eof()){                         //lettura degli elementi del file ed inserimento in un vettore
    		file>>vet[dim];
    	}
    	
    	file.close();
    }
    
    
Devi accedere o registrarti per scrivere nel forum
9 risposte