Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    63

    [C++] Array, dimensioni e passaggio a funzioni

    Ciao a tutti,
    mi ritrovo a programmare in C++ dopo anni di stop e mi ritrovo faticosamente a rispolverare le poche conoscenze accumulate in passato.
    In particolare ho parecchi problemi con la gestione degli array.

    Per il calcolo della dimensione dell'array ho trovato sizeof(A)/sizeof(A[0]), ma da diversi problemi. A questo punto non so se sbaglio il passaggio dell'array nella chiamata a funzione o cos'altro!

    Vi posto un pò di codice:

    codice:
    int main (int argc, char * const argv[]) {
            int A[5];
            cout << "Array inserito:\n";
       	for (int i=0; i<5;i++){
    		A[i]=rand();
    		cout << "\n" << A[i];
    	}
    	cout << "\nlunghezza dell'array: " << sizeof(A)/sizeof(A[0]) << "\n";
    
            //A questo punto il programma stampa correttamente 5 
    
    	HeapSort h;
    	h.heapsort (A);
    	for (int j=0; j<sizeof(A)/sizeof(A[0]); j++)
    		cout << A[j] << "\n";
    	cout << "Tempo impiegato: " << delta;
    	
    	system("PAUSE");
            return 0;
    }
    
    void HeapSort::heapsort(int A[]){
         cout << "Array ricevuto lungo " << sizeof(A)/sizeof(A[0]) << ":\n";
       	 for (int i=0; i<5;i++){
             cout << "\n" << A[i];
         }
         
        //A questo punto viene stampata come dimensione dell'Array 1 (risultato di sizeof(A)=4 / sizeof(A[0])=4)
         //Ad ogni modo i valori contenuti nell'array sono corretti 
    
    }
    Qualcuno sa dirmi cosa sbaglio?
    Vi ringrazio!

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Credo dipenda dal fatto che tu alla funzione passi a[] che è il puntatore al primo elemento dell'array. Come qualsiasi puntatore, essendo un indirizzo di tipo long int (32 bit ossia 4 byte) il valore restituito da sizeof(a) è appunto 4, così come quello di sizeof(a[0]) giacché a[0] è un intero e quindi anch'esso rappresentato su 4 byte.

    Credo che l'unico modo sia calcolare la dimensione dell'array nel main e poi passarla come argomento alla funzione, ma in ogni caso se fai un'allocazione statica dell'array (ma sarebbe lo stesso anche con un'allocazione dinamica) non vedo a cosa ti serve calcolarne la dimensione... cioè non la sai già? Era solo un esempio che facevi?

    Comunque il motivo del problema del risultato 5 != 1 è quello che ti dicevo, almeno per quelle che sono le mie conoscenze

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    63
    Ciao,
    grazie mille per la tua esauriente risposta.
    La dimensione non è nota a priori, il '5' che ho utilizzato è un semplice valore di test.

    Mi sarebbe piaciuto calcolarmi la lunghezza dell'array solamente quando necessario, evitando di dovermi trascinare un parametro in più nelle chiamate a funzione, ma evidentemente non ho altra soluzione!

    Ad ogni modo mi confermi che non c'è un metodo "migliore" per calcolarmi la lunghezza dell'array?

    Ti ringrazio tanto!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Guarda non posso dirti "certamente" non esiste un modo più elegante. Quello che è certo è che studio il linguaggio C (in questo caso non c'è differenza col C++) da quasi un anno con molta costanza e dedizione eppure non ho mai letto/sentito/visto niente a riguardo... io ho sempre passato puntatore alla base dell'array e la sua dimensione come parametro a parte, ma magari aspetta che qualcuno più esperto di me legga e prenda in esame il problema.

    Buono studio

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non c'e' altro modo ... in ogni caso, il parametro in piu' non mi sembra un gran problema ... e anche se la dimensione non e' nota a priori, è comunque disponibile in una variabile, altrimenti non potresti neanche allocare l'array.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    63
    Ciao a tutti e grazie tante per il prezioso aiuto.
    Ho fatto come mi avete suggerito, passando la lunghezza come parametro.
    Adesso però ho un problema leggermente più complesso:

    codice:
    //classe Heap, contiene un vettore di interi di lunghezza non nota a priori 
    class Heap {
    	
    public:	
    	int A[dimensione];
            //costruttore che ha tra i parametri la dimensione dell'array 
            Heap(int dimensione);
    
    };
    Insomma, devo creare una classe che contiene un array di grandezza "dimensione" nota al suo costruttore.
    Si può fare?

    Grazie ancora a tutti!

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Inserisci nella classe un puntatore e alloca dinamicamente l'array nel costruttore.

    Naturalmente libererai la memoria nel distruttore.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    63
    Semplicemente infinitamente grazie!

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prego ... per cosi' poco ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Visto che stai programmando in C++, hai preso in considerazione la possibilità di utilizzare lo standard template vector?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.