Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C++] Inizializzare vector di vector dentro una struct.

    Ciao a tutti,

    sono uno studente di informatica del primo anno alla fine del corso di c++.

    Un progetto d'esame richiede di creare una versione primitiva e semplice di un hard disk. In particolare viene richiesto di creare un vettore di blocchi da 512 char l'uno, ovvero un vector di vector di char. La consegna richiede che i char dentro ogni blocco siano 512 e i blocchi siano un valore a scelta. Tutto questo volevo crearlo dentro una struct.

    Nonostante siano giorni che cerco la soluzione inbattendomi in "costruttori" ed altro no nriesco a fare una cosa che credo sia molto semplice:
    - inizializzare ad un valore di default una variabile dentro una struct.

    In pseudocodice quello che voglio realizzare è:

    codice:
    struct storage {
        vector <vector <char> (512)> block (4096);
        };
    In particolare poi volevo settare dentro un #define i valori 512 e 4096 per essere modificati quando si vuole.

    Solo che mi da sia messaggi di errore relativi alla sintassi del vector sia per il fatto che non posso assegnare ad un valore di default una variabile dentro una struct. Non riesco nemmeno a fare questo:

    codice:
    #define BLOCKSIZE 512
    
    struct storage {
          vector <char> block (BLOCKSIZE);
          };
    Naturalmente ho provato a cercare in internet come funzionano i costruttori mi danno comunque errore probabilmente perchè non uso una sintassi corretta.

    Grazie per ogni vostro aiuto!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Al momento attuale non è possibile fare una cosa del genere. Quando i compilatori supporteranno la initialization list, forse.

    Per adesso ci si deve accontentare di:
    codice:
    struct storage {
        storage() : block(BLOCKSIZE) {}  
        vector <char> block;
    };
    In caso di vector di vector però, puoi solo inizializzare il vector più esterno. Per quello interno devi prevedere un ciclo di ridimensionamento:
    codice:
    struct storage {
        storage() : block(BLOCKSIZE) {
           for (i=0; i < BLOCKSIZE; i++) {
               block[i].resize( dimensione );
           }
        }  
        vector < vector <char> > block;
    };
    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.

  3. #3
    Originariamente inviato da shodan
    In caso di vector di vector però, puoi solo inizializzare il vector più esterno.
    Non basta fare semplicemente:
    codice:
    struct storage {
        storage() : block(BLOCKCOUNT, vector<char>(BLOCKSIZE)) {}  
        vector < vector <char> > block;
    };


    Per inciso, io piuttosto che una #define userei un parametro template di tipo size_t, o addirittura li renderei semplici parametri del costruttore, tanto comunque viene usata l'allocazione dinamica.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da MItaly
    Non basta fare semplicemente:
    Il vector di vector lo avrò usato si e no un paio di volte, quindi non ho mai approfondito la cosa. Ma se funziona tanto meglio: un'altra cosa imparata.
    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.

  5. #5
    Originariamente inviato da shodan
    Il vector di vector lo avrò usato si e no un paio di volte, quindi non ho mai approfondito la cosa.
    In effetti per i vector multidimensionali ci sono alternative migliori (ad esempio in boost).
    Ma se funziona tanto meglio: un'altra cosa imparata.
    Dovrebbe... il costruttore di vector che uso lì accetta come primo argomento il numero di elementi da mettere, e come secondo l'oggetto-modello che verrà copiato su ogni elemento creato.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Grazie mille ora funziona tutto! Non ho capito però bene come funziona il costruttore block() io ho utilizzato:

    struct storage {
    storage() : block(BLOCKCOUNT, vector<char>(BLOCKSIZE)) {} //questa riga non ho molto compreso (però funziona)
    vector < vector <char> > block;
    };

    In pratica al primo valore da il size massimo e al secondo il contenuto di default di ogni cella del vettore?

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da andrew100x100
    In pratica al primo valore da il size massimo e al secondo il contenuto di default di ogni cella del vettore?
    Esatto. E' uno dei costruttori di std::vector. Se poi anche al secondo dai un parametro, il vector inizializzerà ogni elemento a quel valore.

    codice:
    struct storage {
        storage() : block(BLOCKCOUNT, vector<char>(BLOCKSIZE,0)) {} // inizializza il tutto a 0.
        vector < vector <char> > block;
    };
    Se non capisci il perchè di:
    codice:
    storage() : block( etc...)
    guarda qui:
    http://www.cprogramming.com/tutorial...lists-c++.html
    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.

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