Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55

    [C++] crash programma matrici durante la fase di caricamento

    Ciao a tutti,
    ho notato che stranamente il codice del programma che sto facendo crasha se inserisco come numero di colonne e righe un valore diverso.
    La matrice è allocata dinamicamente quindi questo problema non dovrebbe proprio porsi...
    ecco il codice:

    codice:
    #include <iostream>
    
    
    using namespace std;
    
    
    int main()
    {
        int i=0, j=0, m=0, n=0;
        int **matrice;
    
    
    
    
        cout<<"Inserire il numero di righe della matrice: ";
        cin>>m;
        cout<<"Inserire il numero di colonne della matrice: ";
        cin>>n;
    
    
        matrice = new int*[m];
        for(i=0;i<n; i++)
            matrice[i] = new int[n];
    
    
        cout<<"OK"<<endl;
    
    
        for(i=0;i<m;i++)
        {
            for(j=0; j<n; j++)
            {
                cout<<"Inserire elemento ["<<i<<";"<<j<<"]: ";
                cin<<matrice[i][j];
                //CRASHA QUI DOPO QUALCHE CICLO
            }
        }
    
    
        cout<<"OK"<<endl;
    
    
        for(i=0;i<m;i++)
        {
            cout<<endl;
            for(int j=0;j<n;j++)
            {
                cout<<matrice[i][j]<<" - ";
            }
        }
    
    
        cout<<"OK"<<endl;
    
    
        for(i=0;i<m;i++)
            delete matrice[i];
        delete matrice;
    
    
        cout<<"OK"<<endl;
    
    
        return 0;
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Beh...

    codice:
    matrice = new int*[m];
        for(i=0;i<n; i++)
        ...

    Istanzi un array di M puntatori e lo scorri da 0 a N...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Cosa noti di diverso tra la for della allocazione e la for della deallocazione ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    sono un....una persona diversamente intelligente xD ahahhaha

    grazie per avermi fatto notare l'errore...
    ero convinto che l'errore stesse da un altra parte e non ho controllato bene in quel punto del codice

    Ora funziona, grazie mille!

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    raga avrei un altra domanda:
    avendo questa funzione che si occupa di deallocare una matrice mxn:
    codice:
    void dealloca_matrice(int **matrice, int m, int n)
    {
        for(int i=0;i<m;i++)
            delete[] matrice[i];
        delete[] matrice; //cosa cambia se scrivo delete[] *matrice; ? durante l'esecuzione non noto differenze
    }
    come mai se dealloco una matrice mxn con m>n l'ultima riga della matrice non viene deallocata?
    es:
    passo una matrice 3x2:
    1 2
    3 4
    5 6
    dopo la deallocazione, se stampo la matrice mi esce:
    139320 134688
    134688 139320
    5 6

    come mai?
    da notare inoltre che l'elemento 0,0 ha lo stesso valore dell'elemento 1,1 e l'elemento 0,1 ha lo stesso valore dell'elemento 1,0 e questo succede sempre...non è stranissimo?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Deallocare non significa modificare/azzerare il contenuto della matrice.

    Dopo la deallocazione il contenuto precedente può essere lo stesso o cambiare in maniera non prevedibile.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    però non mi spiego una cosa: dopo la deallocazione di una determinata variabile questa non può essere piu utilizzata giusto? allora perchè se stampo la matrice, questa i viene stampata senza alcun problema (anche se con numeri strani) ?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Non può essere utilizzata nel senso che non puoi "essere sicuro" di poterla leggere/scrivere in quanto la memoria è riutilizzabile per altri scopi in qualsiasi momento. Ma finché questo non avviene, potresti ancora poterla leggere senza problemi.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55
    mmmh....devo studiarmi meglio la deallocazione. Pensavo che una volta che una variabile viene deallocata, questa non può più essere utilizzata ne per assegnazioni, ne per stampe ecc...

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Il C non vieta l'uso di variabili deallocate, ma sia la lettura sia la scrittura sono a rischio e pericolo dell'utilizzatore. Non si può prevedere ma la memoria potrebbe essere non più disponibile (hai un crash), potrebbe essere modificata (non hai più i valori che avevi memorizzato) o può essere ancora disponibile. Quello che devi comprendere è che dopo la deallocazione non hai più garanzie.
    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.