Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250

    [C/C++]Allocazione dinamica matrice

    Ciao ragazzi mi spiegate perchè se creo dinamicamente una matrice tramite una funzione per poi scriverci dentro tramite un'altra funzione sembra che me la crei con successo ma se poi cerco di stampare la suddetta matrice mi crasha tutto riportandomi segmentation fault?
    Per intenderci . .
    codice:
    #include <iostream>
    #include <malloc.h>
    
    using namespace std;
    void AllocaMatrice(int** matrice,int dimX,int dimY);
    void InserisciDati(int** matrice,int righe,int colonne);
    void StampaMatrice(int **matrice,int dimensioneX,int dimensioneY);
    
    int main()
    {
        int i,j,k,righe,colonne;
        int **matrix;
        cout << "Inserisci il numero delle righe ";
        cin >> righe;
        cout << "Inserisci il numero di colonne ";
        cin >> colonne;
        AllocaMatrice(matrix,righe,colonne);
    
    
       // StampaMatrice(matrix,righe,colonne); Appena il programma arriva qua mi crasha
    
        return 0;
    }
    void AllocaMatrice(int** matrice,int dimX,int dimY)
    {
        int k;
        matrice = (int**) calloc(dimX,sizeof(int*)); //numero di righe
        for(k=0;k<dimY;k++)
            matrice[k] = (int*) calloc (dimY,sizeof(int)); //numero di colonne
            InserisciDati(matrice,dimX,dimY);
    
    }
    void InserisciDati(int** matrice,int righe,int colonne)
    {
        int i,k;
        for (i=0;i<righe;i++)
            for(k=0;k<colonne;k++)
              {
                 cout << "Insersci l'elemento [" << i << "][" << k << "] ";
                 cin >> matrice[i][k];
               }
    }
    void StampaMatrice(int **matrice,int dimensioneX,int dimensioneY)
    {
        int i,k;
        for (i=0;i<dimensioneX;i++)
        {
            for (k=0;k<dimensioneY;k++)
              cout << matrice[i][k] << " ";
           cout << endl;
         }
    }
    Scusate la banalità eh . .

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non ho controllato tutto il codice, comunque il problema sembra essere nella chiamata ad AllocaMatrice: tu infatti passi come parametro il tuo puntatore che viene copiato, a questo punto, quanto allochi la matrice, il nuovo indirizzo viene assegnato ad una copia del puntatore e non al puntatore che tu hai nella main...

    Ah! Inoltre manca una cosa fondamentale: alla fine del programma devi liberare la memoria che hai allocato!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    codice:
    Non ho controllato tutto il codice, comunque il problema sembra essere nella chiamata ad AllocaMatrice: tu infatti passi come parametro il tuo puntatore che viene copiato, a questo punto, quanto allochi la matrice, il nuovo indirizzo viene assegnato ad una copia del puntatore e non al puntatore che tu hai nella main...
    Avevo intuito una cosa del genere..ma quindi come dovrei fare a far sì che la funzione modifichi e allochi lo spazio necessario di una matrice del main?Nel main dovrei passare l'indirizzo della matrice o cosa?
    Ah! Inoltre manca una cosa fondamentale: alla fine del programma devi liberare la memoria che hai allocato!
    Uffa il maledetto free...me lo scordo sempre...ne approfitto per chiederti un'altra cosa:
    Per liberare la memoria mi basta deallocare la matrice con
    codice:
    free(matrice)
    o devo provvedere in qualche modo a deallocare prima le colonne e sucessivamente la matrice?

    Ad ogni modo...grazie della risposta e della tempestività . .Come al solito

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Originariamente inviato da Marco1995
    codice:
    Non ho controllato tutto il codice, comunque il problema sembra essere nella chiamata ad AllocaMatrice: tu infatti passi come parametro il tuo puntatore che viene copiato, a questo punto, quanto allochi la matrice, il nuovo indirizzo viene assegnato ad una copia del puntatore e non al puntatore che tu hai nella main...
    Avevo intuito una cosa del genere..ma quindi come dovrei fare a far sì che la funzione modifichi e allochi lo spazio necessario di una matrice del main?Nel main dovrei passare l'indirizzo della matrice o cosa? o
    Sì, basta passare l'indirizzo...
    Uffa il maledetto free...me lo scordo sempre...ne approfitto per chiederti un'altra cosa:
    Per liberare la memoria mi basta deallocare la matrice con
    codice:
    free(matrice)
    o devo provvedere in qualche modo a deallocare prima le colonne e sucessivamente la matrice?

    Ad ogni modo...grazie della risposta e della tempestività . .Come al solito
    No, devi rilasciare ogni singola riga!
    In generale nel rilasciare la memoria devi seguire il procedimento opposto di quando l'hai allocata...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    No, devi rilasciare ogni singola riga!
    In generale nel rilasciare la memoria devi seguire il procedimento opposto di quando l'hai allocata..
    Ok grazie . .
    Sì, basta passare l'indirizzo...
    Quindi se passo l'indirizzo come parametro dovrò avere un puntatore ad una matrice?
    Cioè...un
    codice:
    int ***matrice
    ?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Originariamente inviato da Marco1995
    Quindi se passo l'indirizzo come parametro dovrò avere un puntatore ad una matrice?
    Cioè...un
    codice:
    int ***matrice
    ?
    Esatto!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Esatto!
    No no..aspetta..ricapitlando sono in questa situazione:
    codice:
    void AllocaMatrice(int*** matrice,int dimX,int dimY)
    {
        int k;
        matrice = (int**) calloc(dimX,sizeof(int*));
        for(k=0;k<dimY;k++)
            matrice[k] = (int*) calloc (dimY,sizeof(int));
            InserisciDati(&matrice,dimX,dimY);
    
    }
    Ovviamente mi da dei problemi nella malloc...c'era da aspettarselo in quanto matrice è diventato un 'triplo' puntatore..Come faccio in questo caso ad allocare la matrice?
    Ovviamente l chiamata alla funzione è:
    codice:
    AllocaMatrice(&matrix,righe,colonne);
    Grazie delle risposte ..

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    codice:
    void AllocaMatrice(int*** matrice,int dimX,int dimY)
    {
        int k;
        *matrice = (int**) calloc(dimX,sizeof(int*));
        for(k=0;k<dimY;k++)
            (*matrice)[k] = (int*) calloc (dimY,sizeof(int));
            InserisciDati(&matrice,dimX,dimY);
    
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    codice:
    void AllocaMatrice(int*** matrice,int dimX,int dimY)
    {
        int k;
        *matrice = (int**) calloc(dimX,sizeof(int*));
        for(k=0;k<dimY;k++)
            (*matrice)[k] = (int*) calloc (dimY,sizeof(int));
            InserisciDati(&matrice,dimX,dimY);
    
    }
    Grazie della risposta..un 'ultima domanda.lo giuro:
    Se all'interno di questa funzione devo richiamare un'altra funzione che necessita anche lei dell'indirizzo della matrice dovrò usare un puntatore di questo tipo:
    codice:
    int ****matrice
    ?O c'è un modo più elegante...ovviamente questo lo chiedo a scopo informativo dato che la seconda funzione potrei richiamarla all'interno del main e il problema non si porrebbe..

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No ... se serve l'indirizzo della matrice è già

    int ***matrice
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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