Vettori e array con visibilità globale

di il
7 risposte

Vettori e array con visibilità globale

Se devo allocare un vettore con un numero di elementi dipendenti dall'input dell'utente non posso dichiarare il vettore con visibilità globale, in sostanza fuori dal main subito dopo l'include, giusto?
Esempio: devo creare una tabella di hash con liste di concatenazione con numero di elementi 's'.
Un'alternativa potrebbe essere creare un vector con visibilità globale ma in questo modo non posso preallocare il numero di elementi in quanto sconosciuto ma solo determinato all'interno del mail. Corretto? Esiste un approccio diverso di buona programmazione?

#include <iostream>
using namespace std;

const int P = 999149;
const int A = 1000;
const int B = 2000;

struct elem {
	int ID;
	elem* next;
	elem(int i): ID(i), next(NULL) {};
};

int hash(int x, int s) {
	return (((A * x + B) % P) % s);
}

int main()) {
   int n, s;
   cin >> n >> s;
   elem* tabhash[s];
	for(int k=0; k<s; ++s)
		tabhash[k] = NULL;
...

}
Inoltre mi chiedo ha senso inizializzare n e s a 0 ? Ha senso? So che in teoria dovremmo sempre inizializzare le variabili ma in questo caso ho il dubbio visto che vengono "arricchite" dall'input utente con il comando 'cin'

7 Risposte

  • Re: Vettori e array con visibilità globale

    Non ho capito molto ma

    elem* tabhash

    può stare fuori dal main e puoi usare la malloc o la new
  • Re: Vettori e array con visibilità globale

    Visto che non stiamo parlando di array a dimensione variabile durante il programma, ma di array la cui dimensione varia ad ogni chiamata del programma, ma che rimane costante per tutta quella chiamata si può creare come variabile globale, un puntatore al tipo dell'array, e una, sempre globale, che contenga il numero di elementi dell'array. Nella main si aggiorna la seconda, si crea un array locale alla main lungo quanto serve e si assegna il puntatore al primo elemento come vlore del puntatore globale.
  • Re: Vettori e array con visibilità globale

    silente ha scritto:


    Visto che non stiamo parlando di array a dimensione variabile durante il programma, ma di array la cui dimensione varia ad ogni chiamata del programma, ma che rimane costante per tutta quella chiamata si può creare come variabile globale, un puntatore al tipo dell'array, e una, sempre globale, che contenga il numero di elementi dell'array. Nella main si aggiorna la seconda, si crea un array locale alla main lungo quanto serve e si assegna il puntatore al primo elemento come vlore del puntatore globale.
    Innanzitutto grazie infinite per i vostri suggerimenti.
    Intendi in questo modo, giusto?
    
    #include <iostream>
    ...
    
    struct elem {
    	int ID;
    	elem* next;
    	elem(int i): ID(i), next(NULL) {};
    };
    
    int s;   // var. globale n. elementi array	
    elem **tabhash;   //var. globale che punta al mio array
    
    int main() {
       int numero;
       cin >> numero;   //dim array;
       s = numero;        // aggiorno la dim. della var. globale
       tabhash = new elem*[s];
       ... 
       }
    
    La seconda domanda, piuttosto banale, riguarda la variabile numero cioè mi chiedo se è buona programmazione inizializzarla prima dell'input utente.
    A cosa serve porla a zero se poi l'utente ci scrive dentro? Cosa suggerite?
  • Re: Vettori e array con visibilità globale

    Considerazioni di massima:

    1) l'input da tastiera si usa in un numero ESTREMAMENTE piccolo di casi, e fondamentalmente in quei programme i quali, una volta mandati in esecuzione, interagiscono con l'utente E con qualche altro programma. Un classico esempio e' il debugger in modalita' testo, usato per analizzare il comportamento dei programmi scritti in C/C++/fortran, OPPURE le shell come ipython, scala, bash, ecc, che eseguono il comando all'istante e poi si mettono in attesa del prossimo comando
    Nel rimanente 99.99999% dei casi i parametri necessari al programma si passano SULLA LINEA DI COMANDO singolarmente o mediante un file di configurazione. Questo perche' permette di AUTOMATIZZARE l'utilizzo del programma in eventuali script.

    2) l'inizializzazione delle variabili e' una pratica BUONA E GIUSTA che vale la pena seguire per AUTOMATIZZARE una serie di regole di scrittura che porterebbero a PROBLEMI non indifferenti se non seguite.

    Il problema a monte e' il seguente: un programma non si scrive una volta sola, ma si modifica un'infinita' di volte, spostando codice, aggiungendolo, rimuovendolo. Se AL MOMENTO l'inizializzazione sembra inutile perche' nella riga successiva la variabile viene inizializzata mediante un'altro meccanismo, questo NON ASSICURA che nel futuro quella linea di codice non venga modificata o spostata. E magari viene spostata 100 linee piu' in basso ed uno si dimentica di controllare se quella particolare variabile e' stata o meno inizializzata.

    Quello che potrebbe succedere, inoltre, e' che una variabile NON INIZIALIZZATA venga utilizzata e (s)fortuna vuole che abbia un valore PLAUSIBILE. Questo fa si che il programma non vada in errore, MA i risultati potrebbero essere SBALLATI, ma non cosi' sballati da risultare errati. I disastri potrebbero essere difficili da identificare.

    Pensa al casino che e' avvenuto con la sonda Mars Climate Orbiter che si e' schiantata perche' dei programmatori "sciocchi" (userei termini ben piu' coloriti) hanno usato come unita' di misura le unita' inglesi!

    https://spazio-tempo-luce-energia.it/lerrore-da-328-milioni-di-dollari-dde082a1b70b?gi=99e37b4d270d

    Dirai: che centra con l'inizializzazione? Niente, o meglio centra con il fatto di USARE SEMPRE BUONE TECNICHE DI PROGRAMMAZIONE per tutte le cose banali, anche se inutili.

    Qundi, e' ESTREMAMENTE BUONA PRATICA inizializzare SEMPRE TUTTE LE VARIBILI, anche se vengono inizializzate 2 o piu' volte.

    Tieni anche presente che i compilatori sono sufficientemente intelligenti da accorgersi della doppia inizializzazione e quindi fare le ottimizzazioni del caso.
  • Re: Vettori e array con visibilità globale

    Secondo me dipende dal contesto. Se stai facendo programmazione embedded potresti avere le istruzioni contate, e allora sarebbe un errore fare un'inizializzazione inutile. Su PC direi che è buona pratica inizializzare sempre. Comunque tutto ciò non ti mette al riparo se passi il tuo codice a chi programma alla carlona e lo modifica facendo danni: magari inizializzi a 1 e 1 è il codice che formatta l'hard disk secondo il nuovo programma
  • Re: Vettori e array con visibilità globale

    Trattasi di esercizi di esame ingegneria informatica
    Il punto uno, dove ho riscritto parte del codice, L ho compreso bene ?
  • Re: Vettori e array con visibilità globale

    Penso proprio di si. Provo a scriverlo io, per capire se ho capito qualcosa di C
    
    #define TIPO int
    TIPO * matrice;
    int dimensione;
    int main()
    {
    cin >> dimensione; //Se non ho capito male così assegno un valore a "dimensione", leggendolo da cin (che credo sia la tastiera)
    //Io farei così: dimensione=LeggiTastiera(), che è una funzione che mi creerei apposta ma che ora non mi interessa sapere cosa fa
    TIPO locale [dimensione];//E CREDO di aver creato l'array "locale" di tipo "TIPO" contenente "dimensione" elementi. È giusto? 
    matrice=locale; //il "nome" dell'array è il puntatore al suo inizio, così facendo ho assegnato al puntatore a "TIPO" globale il valore del puntatore a primo elemento di "locale"
    
    }
Devi accedere o registrarti per scrivere nel forum
7 risposte