Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di wino_7
    Registrato dal
    Dec 2006
    Messaggi
    537

    [C] Errore di valutazione

    Salve ragazzi ho scritto un piccolo programmino per testare le mie capacità di debugger :

    Codice PHP:
    #include <stdio.h>
    int f(int *);

    int main()
    {
      
    int v 5wz1z2;
      
    z1 f(&v) && f(&v);
      
    printf("%d \n"z1 v);
      
    z2 = (v++) + (<= w);
      
    printf("%d \n"z2);
      
      
    system("PAUSE");    
      return 
    0;
    }

    int f(int *x)
    {
      
    printf("%d \n", (*x)--);
      return *
    >= 3;    

    Il mio risultato calcolato a mente è:
    5
    3
    1
    1

    Invece secondo il maestro compilatore è:
    5
    4
    3
    3

    Non riesco a capire il perchè.

    Secondo me l'errore sta in questo comando
    Codice PHP:
    return *>= 3
    che a mia intepretazione vuol dire (alla prima chiamata di questa funzione) "4 - 1 (cioè 3) è maggiore o uguale a 3? SI" allora torna 1 a z1, in questo momento 'v' vale 3 o 4 ?

    Se vale 3 alla seconda chiamata viene passato 3 a 'f' altrimenti 4 è giusto?

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Vale 4, il valore del puntatore non viene modificato.
    Per sicurezza aggiungi const all'argomento della funzione f
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Vale 4 e solo dopo la seconda chiamata vale 3
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4

    Re: [C] Errore di valutazione

    Intravedo un undefined behaviour
    Codice PHP:
      z2 = (v++) + (<= w); 
    Essenzialmente, salvo strambe direttive di compilazione che non conosco, in C/C++ non è definito se debba essere effettuata prima la "v++" o la "v <= w". Insomma decide il compilatore come più gli fa comodo. Soluzione: evitare sempre d'usare espressioni simili.

    http://www.gnu.org/software/gcc/bugs.html#nonbugs_c

  5. #5
    Utente di HTML.it L'avatar di wino_7
    Registrato dal
    Dec 2006
    Messaggi
    537
    Continuo a non capire perchè in questa funzione, nell'espressione *x - 1 non viene decrementata la 'v' che è la variabile puntata da x.

    Codice PHP:
    int f(int *x)
    {
      
    printf("%d \n", (*x)--);
      return *
    >= 3;    


  6. #6
    Originariamente inviato da wino_7
    Continuo a non capire perchè in questa funzione, nell'espressione *x - 1 non viene decrementata la 'v' che è la variabile puntata da x.
    L'espressione "*x -1" non decrementa alcuna variabile: restituisce il valore decrementato della variabile puntata, ma non decrementa la variabile puntata. Son due cose differenti.

  7. #7
    Utente di HTML.it L'avatar di wino_7
    Registrato dal
    Dec 2006
    Messaggi
    537
    Scusatemi ma non riesco a capire, ho provato a scrivere questo programma di esempio :

    Codice PHP:
    #include <stdio.h>
    void incremento(int *);

    int main(int argcchar *argv[])
    {
        
    int x 3;
        
    incremento(&x);
        
        
    printf("%d \n"x);
      
      
    system("PAUSE");    
      return 
    0;
    }

    void incremento(int *a)
    {
      *
    += 2;     // qua c'e' la differenza
      
    return;

    e questo :

    Codice PHP:
    #include <stdio.h>
    void incremento(int *);

    int main(int argcchar *argv[])
    {
        
    int x 3;
        
    incremento(&x);
        
        
    printf("%d \n"x);
      
      
    system("PAUSE");    
      return 
    0;
    }

    void incremento(int *a)
    {
      
    += 2;  // qua c'e' la differenza
      
    return;

    Il primo programma stampa 3 e il secondo stampa 5.

    Quindi io se faccio somme o sottrazioni su puntatori allora cambia il valore delle variabili puntate (infatti i puntatori servono a questo), e allora perchè nell'esempio del mio primo posto il comando *x - 1 non decrementa la variabile 'v' ????

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Guarda che scrivere

    *a += 2;

    e

    *x - 1

    e' molto differente ...

    La prima riga equivale a

    *a = *a + 2;

    e significa che il risultato della parte a destra dell'uguale sara' assegnato alla variabile puntata e scritta a sinistra. Quindi il valore della variabile puntata, effettivamente, cambia.

    Nella riga

    *x - 1

    invece, non c'e' il simbolo = e quindi il risultato dell'operazione NON sarà conservato nella variabile ma semplicemente restituito al chiamante.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di wino_7
    Registrato dal
    Dec 2006
    Messaggi
    537
    Oddio che sciocco che sono, hai ragione *x - 1 non è un assegnamento.

    Quindi diciamo che *x - 1 viene memorizato localmente nella funzione f per fare il confronto e poi viene cancellato all'uscita della funzione?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da wino_7
    Oddio che sciocco che sono, hai ragione *x - 1 non è un assegnamento.
    Esatto ...

    Quindi diciamo che *x - 1 viene memorizato localmente nella funzione f per fare il confronto e poi viene cancellato all'uscita della funzione?
    Diciamo che viene utilizzato un registro della CPU per il calcolo e poi il registro viene riutilizzato senza problemi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.