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

    [C] Matrice.

    Salve a tutti...

    Sto cercando di scrivere un programma in C che mi crei una matrice con allocazione dinamica, assegnando poi a ciascun elemento un valore casuale minore di 20...
    Ho definito il tipo matrice come una struttura contenente un doppio puntatore a interi, e poi due interi, corrispondenti rispettivamente al numero di righe e colonne della matrice...
    Ovviamente, se posto qui, è perchè c'è qualcosa che non torna.

    A livello di compilazione, non mi da problemi...Però quando lo mando in esecuzione si blocca..

    Ho controllato dove potesse essere l'errore, e credo che il problema riguardi proprio l'allocazione della memoria...Non riesco però a individuare l'errore...

    Vi allego il codice:

    codice:
    #include <stdio.h>
    #include <time.h>
    #include <math.h>
    
    typedef struct {
            int **m;
            int r;
            int c;
            } mat;
            
            
    void Alloca(mat);
    
    
    main () {
         int i,j;
         mat M;
         M.r=5;
         M.c=6;
         Alloca(M);
         srand(time(NULL));
         for (i=0,j=0;i<M.r;j++) {
             if (j==M.c) {
                           j=0;
                           i++;
                           }
             M.m[i][j]= rand()%20;
             
             
                           }
                           
         for (i=0,j=0;i<M.r;j++) {
             if (j==M.c) {
                           j=0;
                           i++;
                           printf("\n");
                           }
             
             printf("%d\t", M.m[i][j]);
             
                           
                           }
         
         
         
         }
         
         
         
    void Alloca (mat M) {
         int i;
         M.m=(int**)calloc(M.r,sizeof(int*));
         
         for (i=0;i<M.r;i++) 
             M.m[i]=(int*)calloc(M.c,sizeof(int));
             
             return;
             }

    Grazie per l'aiuto.

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Eccolo qua il problema:
    codice:
    void Alloca (mat M) {
         int i;
         M.m=(int**)calloc(M.r,sizeof(int*));
         
         for (i=0;i<M.r;i++) 
             M.m[i]=(int*)calloc(M.c,sizeof(int));
             
             return;
             }
    Stai passando per valore la matrice M.
    Viene fatta una copia della struttura mat, gli viene allocata quella memoria.Ma poi siccome la procedura ritorna void, quella copia viene deallocata, i suoi campi allocati con calloc rimangono nell' heap.
    Ma la tua matrice originaria, che hai passato come argomento della procedura, rimane inalterata.

    Se vuoi evitare che venga fatta una copia (uguale identica, ma è un oggetto diverso !!) della matrice, l' argomento della procedura deve essere passato per indirizzo:

    codice:
    void Alloca (mat *M) {
         int i;
         (*M).m=(int**)calloc((*M).r,sizeof(int*));
         
         for (i=0;i<(*M).r;i++) 
             (*M).m[i]=(int*)calloc((*M).c,sizeof(int));
             
             return;
             }
    In alternativa puoi cambiarla in una funzione senza parametri di ingresso, che ritorna la matrice allocata.

  3. #3


    Grazie mille...Se non altro, ho arricchito la mia collezione di figuracce.

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.