Problema compilazione programmino in C

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Problema compilazione programmino in C

    Ho capito il concetto, ma se alla printf chiedo di visualizzare m, che è un puntatore, cosa visualizza?
    Il contenuto, l'indirizzo o cosa?
    se fai printf di 'a' cosa ti visualizza? il contenuto di a. stessa cosa per m, solo che mentre a è un valore e lo possiamo usare nei calcoli o altro (del resto lo abbiamo definito noi intero), m è di tipo puntatore, nata per 'contenere' un indirizzo di memoria.
    Però non capisco ancora qual è la differenza, se faccio la seguente assegnazione,
    
    a=1;
    *m=a;
    
    *m=a significa che all'indirizzo che punta m vado a mettere il valore di a.
    fra m e indirizzo di m, ovvero cosa visualizzo quando visualizzo con la printf m e &m.
    m contiene l'indirizzo di a. &m è l'indirizzo della stessa m.

    A pagina 63 della guida c'è il "Allocazione dinamica della memoria" e non vedo niente di strano.
    Inizializza una variabile puntatore a int v, alloca memoria per n interi nell'HEAP
    andando ad assegnare l'indirizzo rilasciato da malloc in v.
    v è una variabile definita nello STACK, il suo contenuto è l' indirizzo del primo elemento allocato in HEAP
    per accedere agli elementi usi il puntatore *(v+i) oppure la forma abbreviata v.

    La logica dei puntatori confonde a volte anche i più esperti perché
    portesti trovarti di fronte a situazioni tipo questa: ***v=n o molto più frequentemente questa **v=n

    Ecco perchè (secondo me) è importante capire a basso livello cosa succede.
    Questa caratteristica di indirizzamenti rende il C un linguaggio molto vicino all'assembly.
  • Re: Problema compilazione programmino in C

    A pag.63 e pag.64 della guida, c'è questo codice:
    #include <stdio.h>
    #include <stdlib.h>
    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]);
    }
    for (i=0; i<m; i++)
    for (j=0; j<n; j++)
    printf ("Elemento [%d][%d]: %d\n",i+1,j+1,v[i]);
    free(m);
    return 0;
    }
    A me da errore, credo per i motivi detti prima.
    Si ha che m è definito come varaiabile semplice e come puntatore. E' possibile?
  • Re: Problema compilazione programmino in C

    E' vero, l'autore ha fatto un bel pastrocchio LOL

    Eccotelo corretto:
    
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int **v;
        int i, j;
        int m, n;
        printf("Numero di righe della matrice: ");
        scanf("%d", &m);
        printf("Numero di colonne della matrice: ");
        scanf("%d", &n);
        v = (int **)malloc(m * n * sizeof(int));
        // Inizializzo anche tutti i sotto-vettori,
        // ovvero le righe della matrice
        for (i = 0; i < m; i++)
            v[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]);
            }
        for (i = 0; i < m; i++)
            for (j = 0; j < n; j++)
                printf("Elemento [%d][%d]: %d\n", i + 1, j + 1, v[i][j]);
        for (i = 0; i <m; i++)
            free (v[i]);
        free(v);
        return 0;
    }
    
    
    e provato:
    
    max@studio:~> gcc prova.c -Wall
    max@studio:~> valgrind ./a.out 
    ==19749== Memcheck, a memory error detector
    ==19749== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
    ==19749== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
    ==19749== Command: ./a.out
    ==19749== 
    Numero di righe della matrice: 3 2
    Numero di colonne della matrice: Elemento [1][1]: 1 2 3 4 5 6
    Elemento [1][2]: Elemento [2][1]: Elemento [2][2]: Elemento [3][1]: Elemento [3][2]: Elemento [1][1]: 1
    Elemento [1][2]: 2
    Elemento [2][1]: 3
    Elemento [2][2]: 4
    Elemento [3][1]: 5
    Elemento [3][2]: 6
    ==19749== 
    ==19749== HEAP SUMMARY:
    ==19749==     in use at exit: 0 bytes in 0 blocks
    ==19749==   total heap usage: 4 allocs, 4 frees, 48 bytes allocated
    ==19749== 
    ==19749== All heap blocks were freed -- no leaks are possible
    ==19749== 
    ==19749== For counts of detected and suppressed errors, rerun with: -v
    ==19749== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
    max@studio:~> 
    
    Ora lo segnalo

    EDIT:
    Segnalato
  • Re: Problema compilazione programmino in C

    Per quanto riguarda i comandi del tipo:
    [blacklight@wintermute ~]$ gcc -I/usr/include/gc -o noleak noleak.c
    -lgc
    oppure
    [blacklight@wintermute ~]$ gcc -I/usr/include/gc -L/usr/lib -o
    noleak noleak.c -lgc
    a pag. 68 della guida
    valgono solo per Unix?

    E per Windows? Dove trovo il terminale?

    Grazie
  • Re: Problema compilazione programmino in C

    Poi ogni volta che apro il file guidac.pdf dice che è impossibile estrarre il font incorporato 'Courier10PitchBT-Roman'.

    Come posso risolvere?

    Grazie
  • Re: Problema compilazione programmino in C

    Per quanto riguarda i comandi del tipo:
    
    blacklight@wintermute ~]$ gcc -I/usr/include/gc -o noleak noleak.c
    -lgc
    
    valgono solo per Unix?
    Si.
    gcc è GNU scritto da R.Stallman e fondatore della Free Software Foundation nonchè artefice della più diffusa licenza di software libero alias GPL (GNU General Public License).
    E' incluso nelle varie distribuzioni Linux (GNU Linux) come compilatore ufficiale, mentre nei sistemi Apple OS X è parte di Xcode.
    Se lavori in Windows lo puoi usare installando Cygwin, che è un porting per GNU Linux e BSD, oppure MinGW, o meglio decidere di non usarlo scegliendo tra i tanti compilatori nativi in commercio forniti anche di IDE, dove il discorso degli oggetti, librerie e header vengono aggiunti nelle sezioni del progetto in modo più intuitivo e forse meno complicato.
    Nei sistemi *nix based TUTTO viene fatto da shell, anzi potrei dirti che molti utilizzatori volontariamente non utilizzano la parte grafica o addirittura non la installano affatto.
    Assurdo? Forse, ma pensa ad un server che deve semplicemente connettere tramite servizi i vari host di rete e comprendi il motivo.
    E per Windows? Dove trovo il terminale?
    Il terminale di Windows esiste nel contesto limitato del DOS (ma forse si è evoluto?!). Mi sembra che si chiami CMD.EXE ma altro non so dirti.
    Poi ogni volta che apro il file guidac.pdf dice che è impossibile estrarre il font incorporato 'Courier10PitchBT-Roman'.
    Non so. Io non ho mai avuto problemi su migliaia di PDF archiviati sia in Linux che in OS X.
  • Re: Problema compilazione programmino in C

    ixamit ha scritto:


    Poi ogni volta che apro il file guidac.pdf dice che è impossibile estrarre il font incorporato 'Courier10PitchBT-Roman'.
    Non so. Io non ho mai avuto problemi su migliaia di PDF archiviati sia in Linux che in OS X.
    Chi altro ha una soluzione? Qualcun'altro ha provato ad aprirlo su Win7?

    Grazie
Devi accedere o registrarti per scrivere nel forum
21 risposte