Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    3

    C: Problema assegnazione matrice

    Ciao a tutti,
    ho un problema con l'assegazione dei valori ad una matrice creata dinamicamente. Appena provo ad essegnare i valori, mi dà errore di segmentazione.

    codice:
    void matrix_allocation(int **matrix, int N){
        int i, j;
        /* dynamic allocation for the matrix */
        /*allocation of the rows*/
        matrix = (int**)malloc(N * sizeof(int*));  
        if(matrix == NULL){
        printf("\n Error in memory allocation for the matrix \n");
        }
        /*allocation of the coloumns*/
        for(i=0; i<N; i++){   
        matrix[i]=(int*) malloc(N * sizeof(int));
        if (matrix[i] == NULL){
            printf("Cannot allocate enough memory\n");
            }
        }
    }
    
    void generate_matrix(int **matrix, int N){
        int i, j;
        for (i=0; i<N; i++){
            for (j=0; j<N; j++){
                        if(i==j){                   //the diagonal must be 0
                            matrix[i][j] = 0;
                        }
                        else{
                matrix[i][j] = rand()%10;
                            printf("%i\t", matrix[i][j]);
               
                        }
            }
                    printf("\n");
        }
        printf("\nMatrix generated successfully!\n");
    }
    Appena arriva a matrix[i][j] = 0 (alla prima esecuzione), dà errore. Cosa sbaglio? Avete qualche idea? Grazie a tutti.
    Ultima modifica di Aletta; 13-12-2013 a 16:07

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    matrix è sempre una variabile locale, perciò su allocation
    codice:
    void matrix_allocation(int ***matrix, int N){    int i;
        /* dynamic allocation for the matrix */
        /*allocation of the rows*/
        *matrix = (int**)malloc(N * sizeof(int*));  
        if((*matrix) == NULL){
        	printf("\n Error in memory allocation for the matrix \n");
        }
        /*allocation of the coloumns*/
        for(i=0; i<N; i++){   
        	(*matrix)[i]=(int*) malloc(N * sizeof(int));
        	if ((*matrix)[i] == NULL){
            	printf("Cannot allocate enough memory\n");
            }
        }
    }
    chiamata con
    codice:
    matrix_allocation(&nome_variabile, N);
    Esempio self-contained riprendendo il tuo codice: http://ideone.com/0O3zZw

    P.s. vorrei farti notare che non hai gestito correttamente gli errori: infatti nel caso non riuscissi ad allocare la memoria necessaria dovresti comunque liberare quella già allocata e restituire un codice di errore al main (che può essere impostare a NULL il puntatore, oppure cambiare il tipo della funzione e ritornare true/false per successo/fallimento).
    Ultima modifica di Scara95; 13-12-2013 a 16:25
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    3
    Non so come ringraziarti, era da un po' che ci sbattevo la testa!

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da Aletta Visualizza il messaggio
    Non so come ringraziarti, era da un po' che ci sbattevo la testa!
    Prego, considera però anche i problemi che ti ho esposto alla fine. Inoltre sarebbe meglio se usassi sempre la stessa convenzione per i nome:
    codice:
    allocate_matrix
    generate_matrix
    free_matrix
    oppure
    codice:
    matrix_allocation
    matrix_generation
    matrix_freeing
    A mio parere molto preferibile la prima...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    3
    Si, lo terrò a mente per quanto riguarda la gestione degli errori, ho modificato il codice e ho messo come tipo di ritorno un int. Grazie di nuovo

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.