Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    155

    [C] array bidimensionali tramite puntatori

    Salve, ho letto questo codice e secondo me contiene almeno un paio di errori:

    codice:
    int main() {
     int **m;
     int i,j;
     int m,n;
     printf ("Numero di righe della matrice: ");
     scanf ("%d",&m);
     printf ("Numero di colonne della matrice: ");
     scanf ("%d",&n);
     m = (int**) malloc(m*n*sizeof(int));
     // Inizializzo anche tutti i sotto-vettori,
     // ovvero le righe della matrice
     for (i=0; i<m; i++)
     m[i] = (int*) malloc(n*sizeof(int));
     for (i=0; i<m; i++)
     for (j=0; j<n; j++) {
     printf ("Elemento [%d][%d]: ",i+1,j+1);
     scanf ("%d",&v[i][j]);
     }
    Qualcuno esperto può dirmi se vede gli stessi errori che vedo io, oppure se sono io a ignorare qualche particolare che li giustifica?
    Per fare un tavolo ci vuole un fiore.

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Due errori nella prima riga di allocazione, non ne vedo altri, a meno che non mi siano sfuggiti.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Quote Originariamente inviata da filips Visualizza il messaggio
    Qualcuno esperto può dirmi se vede gli stessi errori che vedo io, oppure se sono io a ignorare qualche particolare che li giustifica?
    Comincia a segnalare gli errori che vedi tu.
    every day above ground is a good one

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    In effetti, devi rivedere questa linea

    m =(int**) malloc(m*n*sizeof(int));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    155
    Non li avevo segnalati per lasciare indipendenza.

    Credo errato:

    codice:
    m = (int**) malloc(m*n*sizeof(int));    (1)

    Intanto mi sembrava ci fosse ambiguità tra le due variabili 'm'. Però questo non lo vedevo molto probabile perché ritenevo che forse il compilatore riuscisse a dedurre il tipo per la variabile in conflitto di nome, e tuttavia più sotto l'array viene denotato con 'v'. Giusto o sbagliato?

    Inoltre pensavo (e qui sembrava molto probabile) dovesse essere

    codice:
    v = (int**) malloc(m*sizeof(int*));  (2)

    visto che questa istruzione restituisce un puntatore a puntatore (m puntatori a int), e con le successive malloc sulle m righe viene completata allocando i corrispondenti m puntatori a int:

    codice:
    v[i] = (int*) malloc(n*sizeof(int));  (3)

    Il fatto che in (2) ci fosse int anziché int*, ripensandoci, credo non si possa considerare esattamente errore visto che int e int* dovrebbero coincidere nella dimensione (4 byte su macchina a 32 bit), quindi il risultato della malloc dovrebbe essere equivalente nei due casi, almeno su una macchina a 32 bit..
    Per fare un tavolo ci vuole un fiore.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    La (2) è corretta
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    155
    @Oregon: grazie!
    Per fare un tavolo ci vuole un fiore.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Un'allocazione come la (1), al di là dell'errore nell'uso della variabile m, può andare bene se la matrice viene gestita di fatto con un'array monodimensionale

    codice:
    #include <stdlib.h>
    
    #define NROWS   3
    #define NCOLS   5
    
    int main(void)
    {
        int *v;
        int i, j;
        
        v = (int *) malloc(NROWS*NCOLS*sizeof(int));
        if (!v) {
            return -1;
        }
        
        for (i = 0; i < NROWS; i++) {
            for (j = 0; j < NCOLS; j++) {
                *(v + i*NCOLS + j) = 0;
            }
        }
    
        free(v);
        return 0;
    }
    in quanto a questo

    Il fatto che in (2) ci fosse int anziché int*, ripensandoci, credo non si possa considerare esattamente errore visto che int e int* dovrebbero coincidere nella dimensione (4 byte su macchina a 32 bit), quindi il risultato della malloc dovrebbe essere equivalente nei due casi, almeno su una macchina a 32 bit..
    come avrai intuito, non bisogna fare mai assunzioni sulla dimensione dei tipi di dato relativi all'architettura, quindi quello di fatto è proprio un errore. Che un int sia rappresentato con 4 byte su un sistema a 32 bit può essere un'utile "rule of thumb", ma non hai garanzia generale che sia così.
    every day above ground is a good one

  9. #9
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    155
    @Yuyevon, interessante la precisazione sulla matrice come array mono. In effetti (v + i*NCOLS + j) è proprio la formula per ottenere il dato alla riga i+1 esima e colonna j+1esima. Ti ringrazio anche per la precisazione sul fatto che in generale non è saggio affidarsi a ipotesi architetturali particolari. Ottima risposta
    Per fare un tavolo ci vuole un fiore.

Tag per questa discussione

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.