Visualizzazione dei risultati da 1 a 5 su 5

Visualizzazione discussione

  1. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Allora, si dovrebbero passare oggetti per indirizzo (puntatore) quando o il parametro e un puntatore stesso oppure se hai intenzione di modificare l'oggetto passato nella funzione. Passare &r e &c nel tuo main è corretto perchè dopo che avrai eseguito la leggi_file le variabile r e c (del main) avranno il valore voluto. Visto che **mat è definito nel mail ha senso che in quella funzione tu abbia oltre alla matrice anche la dimensione.
    Non ha senso passarli alla mat_dim, perchè r e c non li vai a modificare e quindi puoi passarli tranquillamente per valore (anche se nessuno ti vieta di passarli per indirizzo)

    Inoltre è inutile passare mat come parametro, visto che sarà il valore di ritorno delle funzioni. Quindi puoi fare una cosa del genere:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    // Ti crea la matrice e ti restituisce il puntatore
    // Gli basta sapere la dimensione
    int** mat_dim(int r, int c)
    {  
        int i=0;
        int** mat = (int**)malloc(sizeof(int*) * r); 
        while(i<r){
                mat[i]=(int*)malloc(sizeof(int) * c);
                i++;
         }
         return mat;
    }
    
    // Visto righe  e colonne vengono assegnati qui, li vogliamo "far tornare indietro" (r e c) e quindi li prendiamo per indirizzo 
    int **leggi_file(int *r, int *c)
    {
       int i, j;
       //legge righe e colonne
       printf("Numero di righe:");
       scanf("%d", &(*r)); 
       printf("\nNumero di colonne:");
       scanf("%d", &(*c));
       // *r e *c puntano alle variabili del main!!!
       // Quindi avranno il valore letto
        
       // Chiamo la funzione che crea la matrice, passandogli la dimensione (valore di r e c)
       // e assegnamo il valore di ritorno alla variabile mat
       int** mat=mat_dim(*r,*c); 
    
       //leggi dati di mat da file ... io li metto a 2
       for(i=0; i<*r;i++)
          for(j=0; j<*c;j++)
             mat[i][j] = 2;
       // Restituiamo il puntatore
       return mat; 
    }
    
    // Funzione che ti stampa ma matrice
    // Come vedi prende come parametro il puntatore e la dimensione
    void print_m(int** mat, int r, int c){
      for(int i=0; i<r;i++){
        for(int j=0; j<c;j++)
          printf("%d ", mat[i][j]);
       printf("\n");
      }
    }
    
    int main(void) {
        int **mat;
        int r=1;
        int c=1;
    
        mat=leggi_file(&r, &c);
         // Alla fine della storia mat punterà alla zona allocata per la matrice ed r e c conterranno la dimensione 
        printf("dimensione matrice %d %d\n", r, c);
        printf("Matrice\n");
        print_m(mat, r, c);
        return 0;
    }
    Ultima modifica di boots; 19-01-2017 a 12:22

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.