Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2015
    Messaggi
    15

    [C] Assegnazione di un puntatore

    Salve, ho un problema riguardante l'assegnazione di un puntatore in un programma C, in pratica devo leggere questi dati da file :
    codice:
     0 3 2  
     1 1 0 
     2 0 5 
     2 3 4 
     3 0 1 
     3 1 0
    dove le prime due colonne sono rispettivamente : riga e colonna. Il numero dopo è il valore da allocare nella matrice di tipo int. (ho già allocato la dimensione della matrice in memoria con un'allocazione dinamica)

    codice:
    int Leggi_Matrice(FILE *fp, int *m) {
    
    
        int i=0,k=0,j=0,cont=0,l,l2;
        
        while (!feof(fp)) {
            
        
        fscanf(fp, "%d%d%d",&i, &j, &k );
        
        *(*(m+i)+j)=k;
        printf("%d %d %d - %d\n", i, j, k,*(*(m+i)+j));
        
         cont++;
        }
        puts("");
    return cont;
    }
    il problema sono le due parti in grassetto, non riesco ad assegnare nella locazione i,j della matrice "m" il valore "k"...Come potrei accedere alla locazione i,j-esima dell'array puntato da "m"??

  2. #2
    Mostra come calcoli la dimensione della matrice m, e come ne effettui l'allocamento.
    Perché la funzione Leggi_Matrice accetta un puntatore singolo ? Per una matrice servirebbe un puntatore doppio.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2015
    Messaggi
    15
    Questo è il main :

    codice:
    int main()
    {
        int *m_in, *m_out, n, r, c, dominant;
        FILE *fpin, *fpout;
        
        fpin = ApriFile("r");
        fscanf(fpin, "%d %d %d", &r,&c, &dominant);
        
        m_in = AllocateMemory(3, r*c);
        
        n = Leggi_Matrice(fpin, m_in);
        
        fclose(fpin);
        
        m_out = AllocateMemory(r, c);
        
        Trasforma_Matrice(m_in, m_out, n, r, c, dominant);
        
        fpout = ApriFile("w");
        
        Stampa_Matrice(fpout, m_out, r, c);
        
        fclose(fpout);
        
        return EXIT_SUCCESS;
    }
    e questa è la funzione che uso per allocare in memoria la matrice :

    codice:
    int *AllocateMemory(int r, int c) {
        int *m;
        if (m = (int *)malloc(sizeof(int)*r*c) != NULL)
            return m;
        else {
            printf("Bad memory allocation\n");
            exit (EXIT_FAILURE);
        }
    }
    Ho dato per scontato che sia giusto perché sia il main sia la funzione AllocateMemory sono state scritte dal mio professore. Pensandoci bene però quel "AllocateMemory(3, r*c)", in particolare il "3" non so come possa servire in termini di allocazione di memoria :|

    P.S.: i parametri r,c sono nella prima riga del FILE , mentre il terzo elemento della prima riga rappresenta il valore dominante della matrice sparsa che devo completare.
    Il file per intero è così :

    codice:
    6 4 3 
     0 3 2 
     1 1 0 
     2 0 5 
     2 3 4 
     3 0 1 
     3 1 0
    Ultima modifica di brizioss; 03-06-2015 a 15:19

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quote Originariamente inviata da brizioss Visualizza il messaggio
    Ho dato per scontato che sia giusto perché sia il main sia la funzione AllocateMemory sono state scritte dal mio professore.
    Comunque effettua due allocazioni di matrice ma alla fine non le dealloca è questo è un errore a prescindere dal resto.
    Comunque la AllocateMemory è sostanzialmente corretta in quanto sfrutta un array come matrice giocando con l'offset degli indici, invece di ricorrere al classico doppio puntatore con annesso ciclo.
    In casi simili la cella della matrice m[i][j] si ottiene come:
    MAX_COL * i + j
    dove MAX_COL è il numero di colonne massimo di cui è composta la matrice.
    L'inconveniente (credo unico) è che non si può accedere a tale cella come m[i][j], ma devi scrivere m[MAX_COL * i + j] ogni volta.
    Pensandoci bene però quel "AllocateMemory(3, r*c)", in particolare il "3" non so come possa servire in termini di allocazione di memoria :|
    Se i primi dati che leggi con fscanf sono: 6,4,3; quel 3 della AllocateMemory potrebbe essere un refuso di una implementazione precedente. Nota che la riga successiva infatti ha uno 0 come riga e non esistono matrici con 0 righe.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2015
    Messaggi
    15
    Quote Originariamente inviata da shodan Visualizza il messaggio
    L'inconveniente (credo unico) è che non si può accedere a tale cella come m[i][j], ma devi scrivere m[MAX_COL * i + j] ogni volta.
    e se non fosse possibile avere il numero MAX_COL come parametro passato alla funzione ?? (Come in questo caso, non posso cambiare il prototipo della funzione purtroppo )

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2015
    Messaggi
    15
    EDIT: ho provato a modificare il codice per inserire il numero di colonne manualmente (4)

    codice:
    int Leggi_Matrice(FILE *fp, int *m) {
    
    
    
        int i=0,k=0,j=0,cont=0,l,l2;
        
        while (!feof(fp)) {
            
        
        fscanf(fp, "%d%d%d",&i, &j, &k );
        
        m[4 * i + j]=k;
        printf("%d %d %d - %d\n", i, j, k,m[4 * i + j]);
        
         cont++;
        }
        puts("");
    return cont;
    }
    però mi da "segmentation fault"

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Supponendo che tu possa metterci le mani, per quanto riguarda il MAX_COL puoi usare una variabile globale da impostare dopo la prima fscanf del main (dato che non puoi modificare gli argomenti della funzione è l'unico modo):
    codice:
    ...
    fpin = ApriFile("r");
    fscanf(fpin, "%d %d %d", &r,&c, &dominant);
    MAX_COL = c;
    ...
    In AllocateMemory devi mettere un paio di parentesi in più:
    codice:
    if ( ( m = (int *)malloc(sizeof(int)*r*c) ) != NULL)
    o non compila proprio (a me almeno)
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Quoto Shodan, e quella riga non compila neanche a me senza le parentesi.
    Un'alternativa al posto della variabile globale, che a me non piace, sarebbe quella di riavvolgere il file e rileggere la prima riga nel file con la dimensione massima della matrice
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2015
    Messaggi
    15
    D'accordissimo con voi, ma il mio dubbio è : perché nella funzione da me scritta
    codice:
    intLeggi_Matrice(FILE *fp,int*m){
    
        int i=0,k=0,j=0,cont=0,l,l2;
        
        while(!feof(fp)){
            
        
        fscanf(fp,"%d%d%d",&i,&j,&k );
        
    *(*(m+i)+j)=k;
        printf("%d %d %d - %d\n", i, j, k,*(*(m+i)+j));
        
         cont++;
        }
        puts("");
    return cont;
    }
    non mi legge

    codice:
    *(*(m+i)+j)=k

    ? L'istruzione è per caso sbagliata/scritta male ?

  10. #10
    Quella assegnazione dovrebbe essere tipo
    codice:
     *( puntVettore + ( riga * maxColonne ) + colonna) = valore
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

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.