Visualizzazione dei risultati da 1 a 10 su 15

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima del while scrivi

    dati >> riempimento;

    e poi usa la variabile riempimento per allocare dinamicamente l'array.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  2. #2
    Ciao oregon, grazie per la risposta. Quindi devo dichiarare un intero (riempimento), e una volta fatto questo qual'è il procedimento? Scusami, ma sono un neofita della programmazione... grazie per il Tuo tempo
    Ultima modifica di DaemonDestroyer; 10-06-2014 a 12:28

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non di "tipo" riempimento (non esiste un tipo simile) ma un intero che chiami come vuoi (riempimento era solo un esempio di nome).

    E poi devi allocare dinamicamente l'array con la funzione malloc ... l'hai mai usata?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Si ha ragione, mi sono espresso male, ho modificato il messaggio.
    Ecco è questo il problema, l'allocazione dinamica con malloc... pur avendo visto diversi esempi sul libro e su internet non mi è proprio chiaro come essa funzioni, e da dove devo partire innanzitutto!

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da DaemonDestroyer Visualizza il messaggio
    Si ha ragione, mi sono espresso male, ho modificato il messaggio.
    Ecco è questo il problema, l'allocazione dinamica con malloc... pur avendo visto diversi esempi sul libro e su internet non mi è proprio chiaro come essa funzioni, e da dove devo partire innanzitutto!
    In C++ puoi anche usare new e delete (o new[] e delete[]).

    In ogni caso malloc ritorna un puntatore a un blocco di memoria che ha dimensione in bytes pari all'unico argomento della funzione:
    codice:
    void *p_blocco = malloc(n);
    p_blocco è un puntatore a un blocco di memoria di n bytes.
    Per essere utile tuttavia bisogna fare alcune considerazioni:

    sizeof ritorna le dimensioni in bytes dell'argomento:
    ad esempio sizeof(char) ritornerà sempre 1, sizeof(type *) ritorna le dimensioni in bytes di un puntatore (8 su 64bit, 4 su 32bit, 2 su 16bit)

    dunque sizeof(tipo) ti da il numero di byte di un elemento, moltiplichi questo per il numero degli elementi e ottieni il numero di byte del blocco.

    per utilizzare il blocco alla fine ti serve un cast al puntatore di tipo.

    Ad esempio per allocare un array di interi di n elementi servirà
    codice:
    int *array = (int *)malloc( sizeof(int) * n );
    Ti allego la soluzione dell'esercizio che è un esempio di allocazione dinamica:
    codice:
    #include <iostream>
    #include <fstream>
    
    //necessario se usi malloc e free, non necessario altrimenti
    #include <cstdlib>
    
    using namespace std;
    
    int **readMat(int**&m, size_t& size, ifstream& in) {
        in >> size;
        m = new int *[size];
        for(int i = 0; i < size; ++i)
            m[i] = new int[size];
        for(int i = 0; i < size; ++i)
            for(int j = 0; j < size; ++j)
                in >> m[i][j];
        return m;
    }
    
    int **readMat1(int **&m, size_t& size, ifstream &in) {
        in >> size;
        m = (int **)malloc(sizeof(int *) * size);
        for(int i = 0; i < size; ++i)
            m[i] = (int *)malloc(sizeof(int) * size);
        for(int i = 0; i < size; ++i)
            for(int j = 0; j < size; ++j)
                in >> m[i][j];
        return m;
    }
    
    void freeMat(int **&m, size_t size) {
        for(int i = 0; i < size; ++i)
            delete[] m[i];
        delete[] m;
    }
    
    void freeMat1(int **&m, size_t size) {
        for(int i = 0; i < size; ++i)
            free(m[i]);
        free(m);
    }
        
    int main(void) {
        ifstream in("input.txt");
        size_t size;
        int **m;
        readMat1(m, size, in);
        for(int i = 0; i < size; ++i) {
            for(int j = 0; j < size; ++j)
                cout << m[i][j] << '\t';
            cout << endl;
        }
        freeMat1(m, size);
        return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Da notare infine che puoi allocare un unico blocco di memoria e calcolare gli indici. Prova a pensare tu come.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Grazie mille Scara, la tua risposta è stata più che soddisfacente! Finalmente le idee mi sono già più chiare, e finalmente ho capito, grazie al cast di cui mi hai parlato, a cosa erano dovuti quegli errori che spesso mi dava Dev c++. Analizzerò per bene il programma che mi hai fornito e tenterò di rifarlo da solo, proverò altresì ad allocare un unico blocco di memoria. Se dovessi riuscirci posterò il mio risultato qui!

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.