Problema compilazione programmino in C

di il
21 risposte

Problema compilazione programmino in C

Salve a tutti,
come mai non riesco a compilare questo semplice programmino?
#include <stdio.h>

main()
{
  int ch, i = 0;

  while((ch = getchar()) != EOF) i++;

  printf(“%d n”, i);
} 
Grazie

21 Risposte

  • Re: Problema compilazione programmino in C

    * nella printf i doppi apici non sono corretti (" .... ")
    * nella printf la new line non ha backslash (\n)
    * definire int main ()
    * aggiungere return 0;
  • Re: Problema compilazione programmino in C

    Ho risolto grazie.

    Adesso però ho un altro dubbio.
    Non ho capito perché il seguente codice non conta esattamente il numero di caratteri digitati a tastiera.
    #include <stdio.h>
    
    int main()
    {
        int n=2012,ch=5, i = 0;
        printf("\nCiao mondo. Siamo nel %d\n",n);
    
        while(ch != EOF)
            {
             ch=getchar();
             printf("\thai digitato: %c\n",ch);
             i++;
            }
        printf(" %d \n",i);
        return 0;
    }
    Perché ogni volta che digito un carattere esegue 2 volte la printf?

    Grazie
  • Re: Problema compilazione programmino in C

    Perché l'invio è un carattere. Prova a mettere %d nella printf per vedere il valore ascii del carattere
    
             printf("\thai digitato: %d\n",ch);
    
  • Re: Problema compilazione programmino in C

    Si infatti, come secondo valore di ch, restituisce sempre 10.

    Per riolvere cosa mi consigli di fare?
  • Re: Problema compilazione programmino in C

    Dove trovo una guida solo di C fatta bene?

    Grazie
  • Re: Problema compilazione programmino in C

    Io ti consiglio questo di BlackLight rilasciato sotto licenza Creative Commons:
  • Re: Problema compilazione programmino in C

    Grazie per la guida. Questa è rigorosa?
    Ce ne sono di migliori?

    Adesso vi pongo un quesito che non riesco da solo a comprendere. Guardate questo codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a=1;
        int *m;
        int *ind;
        *m=a;
        printf("\nValore della variabile &a: %d",&a);
        printf("\nValore della variabile m: %d",m);
        printf("\nValore di *m: %d",*m);
        printf("\nValore di &m: %d",&m);    
        return 0;
    }
    
    Compilando ricevo dei warnings circa il formato delle variabili nelle printf e questo mi pare ovvio.
    Eseguendo il programma ho che ogni variabile visualizzata dalle printf sono diverse tra loro.
    La mia domanda è: qual è la differenza tra m, &m ed *m visto che assumono tutti valori diversi? E perché m non equivale a &a?

    Ho provato a leggere la guida a riguardo ma non mi sono chiarito questo dubbio.

    Grazie
  • Re: Problema compilazione programmino in C

    Grazie per la guida. Questa è rigorosa?
    Ce ne sono di migliori?
    Questa è un'ottima guida che tratta anche tecniche avanzate.
    Se non hai le basi affiancala a qualche libro C base.
    Compilando ricevo dei warnings circa il formato delle variabili nelle printf e questo mi pare ovvio.
    un indirizzo si visualizza con il flag %p
    Eseguendo il programma ho che ogni variabile visualizzata dalle printf sono diverse tra loro.
    correggi:
    
    m=&a;
    
    mentre l'ultima printf stamperà l'indirizzo della varibile m
    La mia domanda è: qual è la differenza tra m, &m ed *m visto che assumono tutti valori diversi? E perché m non equivale a &a?
    a ed m hanno due indirizzi differenti sullo stack. m è dichiarata puntatore ad int e contiene l'indirizzo di a
    EDIT: deferenziando m (cioè mettendo un * davanti) si carica il 'contenuto' dell'indirizzo
    Ho provato a leggere la guida a riguardo ma non mi sono chiarito questo dubbio
    a pagina 59 inizia il capitolo dedicato ai puntatori
  • Re: Problema compilazione programmino in C

    Ho posto m=&a,
    e adesso per m mi da il valore dell'indirizzo di a, come ovvio. L'indirizzo di m(&m) è diverso da a(&a), però non ho ancora capito cosa indica m quando gli impongo l'espressione *m=a.

    Grazie
  • Re: Problema compilazione programmino in C

    Nel codice che inizia a pag.63 c'è un errore?
    C'è un puntatore *m e una variabile intera m? E' possibile?

    Il mio compilatore da un errore
  • Re: Problema compilazione programmino in C

    Per comprendere bene i puntatori bisogna capire concetti a livello inferiore. Diciamo a grandi linee che la memoria RAM è in forma astratta divisa tra STACK e HEAP.
    Lo STACK viene utilizzato maggiormente in quanto tutte le funzioni e le varibili 'impilano' i dati in sequenza,
    proprio come una pila di piatti che si alza e si abbassa con una logica LIFO (Last In First Out - l'ultimo ad entrare è il primo ad uscire) in modalità automatica, cioè non devi essere tu a preoccupartene (a differenzenza dell'assembly) è il compilatore che pensa alla disposizione. Mentre utilizzando l' HEAP é il programmatore che si deve preoccupa di gestirlo allocando e liberando la memoria con le funzioni malloc e free. STACK e HEAP crescono in direzioni opposte ed al centro abbiamo la memoria libera. Le direzioni dipendono dal sistema e possono essere invertite.

    Raffigurando il programmino che hai fatto potremmo avere una situazione di questo tipo:



    Come puoi notare il compilatore alloca 'automaticamente' solo nello STACK, l'HEAP non viene usato. Vediamo inoltre:
    La variabile di tipo int A contiene 1 (A=1), il suo indirizzo è 0xfff269fc (&A)
    La variabile di tipo puntatore int M contiene 0xfff269fc (m=0xfff269fc), il suo indirizzo è 0xfff269f8 (&m), il 'contenuto dell' indirizzo puntato' è 0x1 (*m=1) ... in questo caso è lo stesso della variabile A, per cui possiamo modificare indirettamente A:
    *M=3 equivale a dire che all'indirizzo 0xfff269fc salviamo l'intero 3.

    Quando lavori con l'HEAP, cioè allochi dinamicamente (forse è questo il punto della guida che stai leggendo), la procedura è simile solo che il contenuto della variabile M fa riferimento ad un indirizzo dell'HEAP che nel caso nostro è un indirizzo alto per esempio potrebbe essere 0x602000.

    Riguardo all'errore che riscontri nella guida non trovo nessun riferimento. Se puoi esser più preciso verifico e in caso affermativo contattiamo l'autore.
  • Re: Problema compilazione programmino in C

    Mi è abbastanza chiaro ciò che hai scritto, a parte qualcosa.

    Però non capisco ancora qual è la differenza, se faccio la seguente assegnazione,
    a=1;
    *m=a;
    fra m e indirizzo di m, ovvero cosa visualizzo quando visualizzo con la printf m e &m.


    Per ciò che hai scritto:
    -non vedo alcuna immagine
    -circa l'errore nel codice a pag.63 della guida mi riferisco al fatto che definisce un puntatore ed una variabile con lo stesso nome; è possibile farlo?

    Grazie
  • Re: Problema compilazione programmino in C

    Guarda ora l'immagine e rileggi
  • Re: Problema compilazione programmino in C

    Adesso la vedo.

    Ho capito il concetto, ma se alla printf chiedo di visualizzare m, che è un puntatore, cosa visualizza?
    Il contenuto, l'indirizzo o cosa?

    E per l'esempio sulla guida?
Devi accedere o registrarti per scrivere nel forum
21 risposte