Dimensione dei vettori

di il
12 risposte

Dimensione dei vettori

Scusate ragazzi la domanda un po stupida, ma come faccio a dichiarare la dimensione di un array mediante un numero inserito da tastiera?
Perché se ho capito bene la dimensione di un array deve essere definita sempre prima

12 Risposte

  • Re: Dimensione dei vettori

    La scelta corretta è usando le funzioni per l'allocazione dinamica e i puntatori.
  • Re: Dimensione dei vettori

    Come già ti hanno detto la cosa migliore è l'allocazione dinamica, ma puoi provare comunque a fare qualcosa del genere, nel caso di vettore di interi:
    
    int n ; 
    cout << "Inserisci il numero di elementi del vettore: " << endl;
    cin >> n;
    int vettore[n];
    
    Ciao!
  • Re: Dimensione dei vettori

    @Marino .... Non è che gli interi siano trattati in modo particolare ...

    Solo se il compilatore supporta i VLA questo è possibile (C99).

    Ma personalmente, non li utilizzo comunque preferendo l'allocazione dinamica.
  • Re: Dimensione dei vettori

    Marino_c++ ha scritto:


    Come già ti hanno detto la cosa migliore è l'allocazione dinamica, ma puoi provare comunque a fare qualcosa del genere, nel caso di vettore di interi:
    
    int n ; 
    cout << "Inserisci il numero di elementi del vettore: " << endl;
    cin >> n;
    int vettore[n];
    
    Ciao!
    Consiglio doppiamente errato. In primo luogo, l'OP sta con ogni probabilità parlando di C e non di C++.
    Secondariamente, i VLA sono di fatto deprecati in C e gli array C-style sono totalmente da evitare in C++, come ben spiegato in questo famoso thread.
  • Re: Dimensione dei vettori

    oregon ha scritto:


    @Marino .... Non è che gli interi siano trattati in modo particolare ...

    Solo se il compilatore supporta i VLA questo è possibile (C99).

    Ma personalmente, non li utilizzo comunque preferendo l'allocazione dinamica.
    Non intendevo che gli interi fossero diversi, solo che il codice si riferiva ad un vettore di interi...

    Purtroppo non ho molta esperienza quindi non sapevo che ciò fosse possibile solo utilizzando un compilatore che supporta i VLA...
    Comunque il mio era solo un consiglio basato sull'esperienza, visto che usando questo metodo funziona, anche se in effetti utilizzando procedure di scambio dati (nello stesso vettore o matrice) noto degli errori anche io alcune volte...ovviamente il tuo consiglio(allocazione dinamica) è il migliore
  • Re: Dimensione dei vettori

    Marino_c++ ha scritto:


    ...usando questo metodo funziona...
    Approccio totalmente errato alla programmazione: il famigerato "basta che funzioni" è il peggior nemico dell'ingegneria del software e del codice ottimizzato!

    Per programmare ad un livello decente occorre studiare accuratamente le basi e acquisire totale consapevolezza del modo in cui funzionano il linguaggio, il compilatore, il sistema: specialmente in linguaggi come C e C++.
  • Re: Dimensione dei vettori

    M.A.W. 1968 ha scritto:


    Marino_c++ ha scritto:


    Come già ti hanno detto la cosa migliore è l'allocazione dinamica, ma puoi provare comunque a fare qualcosa del genere, nel caso di vettore di interi:
    
    int n ; 
    cout << "Inserisci il numero di elementi del vettore: " << endl;
    cin >> n;
    int vettore[n];
    
    Ciao!
    Consiglio doppiamente errato. In primo luogo, l'OP sta con ogni probabilità parlando di C e non di C++.
    Secondariamente, i VLA sono di fatto deprecati in C e gli array C-style sono totalmente da evitare in C++, come ben spiegato in questo famoso thread.

    Scusa, ma dove hai mai letto che i VLA sono deprecati????
    Sono parte dello standard C11 e sono molto utilizzati e molto utili.
    Meglio una matrice VLA che vedere "matrici" allocate dinamicamente come puntatori di puntatori che non fanno altro che frammentare la memoria.... Senza parlare della moltitudine di memory leak causati da utilizzi impropri delle funzioni malloc & co...

    Inoltre il post da te linkato parla espicitanmente di C++.....
  • Re: Dimensione dei vettori

  • Re: Dimensione dei vettori

    LPs ha scritto:


    Scusa, ma dove hai mai letto che i VLA sono deprecati????
    Dovunque. Il mio post, che evidentemente non hai letto con la dovuta attenzione, non si limita a parlare di C++ ma spiega anche la genesi storica di codesti sgangherati VLA (una pessima invenzione di GCC) e il modo inopinato in cui sono divenuti parte dello standard C99, pur essendo una idiozia. Ritenere che una feature sia automaticamente buona e desiderabile per il solo fatto di essere stata inserita (con molte discussioni e voti contrari) in uno standard è una fallacia sesquipedale!

    I VLA non fanno altro che nascondere al programmatore incauto il solito banale meccanismo della malloc, rendendolo implicito e togliendo controllo, il che per definizione è male. Inoltre l'allocazione "automatica" (una farsa, in realtà) sullo stack li rende un enorme problema dal punto di vista di sicurezza e robustezza, il che è un bel paradosso considerandone la provenienza.

    Quanto alle considerazione su malloc multiple e frammentazione, evidentemente il codice che hai avuto per le mani non è stato scritto da professionisti. Si usano ben altre strategie, tutte pedissequamente elencate in testi come quelli nella seconda parte di questa nota bibliografia e occasionalmente richiamate in innumerevoli post.

    L'asserzione che i VLA siano "molto utilizzati" è ovviamente una considerazione superficiale dovuta alla tua limitata esperienza: al di là dell'ambito scolastico e di qualche fanatico del GCC, la loro incidenza statistica nel codice del real world è omeopatica. Il supporto ai VLA è stato introdotto malvolentieri e molto tardivamente solo in mezza dozzina di compilatori C mainstream, e sono del tutto inesistenti nella schiacciante maggioranza dei cross-compiler (d'altro canto l'allocazione dinamica è deprecata in qualsiasi normativa per il software critico, dalla MISRA/C in là, figuriamoci quindi se si potrebbe accettare codesta robaccia).
  • Re: Dimensione dei vettori

    (una pessima invenzione di GCC) e il modo inopinato in cui sono divenuti parte dello standard C99, pur essendo una idiozia
    Sicuramente degli enti internazionali come la ISO e la IEC, creando un commitee composto da professionisti di tutto il mondo, se hanno ritenuto indispensabile non solo inserirli nello standard C99, ma addirittura di confermali per il lo standard C11 forse qualche buona ragione ce l'hanno avuta....
    I VLA non fanno altro che nascondere al programmatore incauto il solito banale meccanismo della malloc, rendendolo implicito e togliendo controllo, il che per definizione è male.
    I VLA non hanno nulla a che fare con malloc & co......e per fortuna. Hanno automatic storage duration (normalmente stack allocated): non vedono la heap nemmeno da lontano, anzi appena ne sentono la puzza scappano a gambe levate...
    Inoltre l'allocazione "automatica" (una farsa, in realtà) sullo stack li rende un enorme problema dal punto di vista di sicurezza e robustezza, il che è un bel paradosso considerandone la provenienza.
    Quindi secondo questo concetto, qualunque array/matrice allocato localmente è una stupidata? Una qualunque variabile globale o puntatore che sia è una min... possibile backdoor?...
    Quanto alle considerazione su malloc multiple e frammentazione, evidentemente il codice che hai avuto per le mani non è stato scritto da professionisti
    Non so in quale mondo vivi tu, ma basta guardare qualche driver del kernel di linux per vedere deframmentazioni a iosa. Inoltre il mio commento si riferiva al contesto in cui siamo e al (purtroppo) basso livello di insegnamento presente in questo paese.
    la loro incidenza statistica nel codice del real world è omeopatica
    Nel tuo caso, proferendo solo verità assoluta, questa affermazione è da prendersi come vera de facto....
    Il supporto ai VLA è stato introdotto malvolentieri e molto tardivamente solo in mezza dozzina di compilatori C mainstream, e sono del tutto inesistenti nella schiacciante maggioranza dei cross-compiler
    Ci vorrebbe qualche nota/riferimento a supporto di tale affermazione. Così è solo un discorso da bar: sarà la mia limitata esperienza di 20 anni, ma i pochi cross-compilatori che non li supportano o sono vecchiotti o sono specializzati.
    d'altro canto l'allocazione dinamica è deprecata in qualsiasi normativa per il software critico, dalla MISRA/C in là, figuriamoci quindi se si potrebbe accettare codesta robaccia
    MISRA/C fa riferimento all'allocazione dinamica (rule 20.4), ma, che io sappia, non fa riferimento ai VLAs.


    Per concludere, non volgio continuare in una polemica inutile, tanto le parti rimarranno della loro idea in ogni caso.
    Quello che mi sembra corretto è non demonizzare nulla in maniera assoluta, specialmente quando le domande sono fatto da newbies a cui è forse più utile spiegare i differenti approcci con i pro e contro del caso.
  • Re: Dimensione dei vettori

    Corro a prendere i pop corn.
  • Re: Dimensione dei vettori

    loopunrolling ha scritto:


    Corro a prendere i pop corn.
    Per me una birretta fredda gelata che qui si soffoca oggi...
Devi accedere o registrarti per scrivere nel forum
12 risposte