Help C! Vorrei capire bene questo pezzettino di codice...

di il
6 risposte

Help C! Vorrei capire bene questo pezzettino di codice...

Ciao a tutti, ho un minuscolo pezzettino di codice e vorrei comprendere perche' e' scritto cosi'!!
Chi mi da una mano?

Praticamente st e' la variabile passata per riferimento alla system call wait!

  if((char)st == 0)
      {
        printf("term. volontaria: segnale %d\n", st>>8);
      }
      else
        printf("term. involontaria : segnale %d\n", (char)st);
      

Ho capito perche' si vede il valore della variabile ...ma non mi e' chiaro perche' nell if si fa il cast a char e che cosa significa st>>8 in C (invece di scrivere semplicemente st)!!!


Grazie in anticipo per la vostra risposta!

6 Risposte

  • Re: Help C! Vorrei capire bene questo pezzettino di codice...

    La wait memorizza nell'intero st sia il check del processo terminato che l'exit code. Per controllare lo status bisogna andare a leggere i bit separatamente e si puo' fare in modi differenti: con AND logico, con lo shift '>>', (cast)ando a char - vedo nel tuo esempio -, ma molto più comodamente utilizzando le MACRO preposte definite in bits/waitstatus.h te le riporto per tua comodità:
    
    #if !defined _SYS_WAIT_H && !defined _STDLIB_H
    # error "Never include <bits/waitstatus.h> directly; use <sys/wait.h> instead."
    #endif
    
    /* Everything extant so far uses these same bits.  */
    
    /* If WIFEXITED(STATUS), the low-order 8 bits of the status.  */
    #define __WEXITSTATUS(status)   (((status) & 0xff00) >> 8)
    
    /* If WIFSIGNALED(STATUS), the terminating signal.  */
    #define __WTERMSIG(status)  ((status) & 0x7f)
    
    /* If WIFSTOPPED(STATUS), the signal that stopped the child.  */
    #define __WSTOPSIG(status)  __WEXITSTATUS(status)
    
    /* Nonzero if STATUS indicates normal termination.  */
    #define __WIFEXITED(status) (__WTERMSIG(status) == 0)
    
    /* Nonzero if STATUS indicates termination by a signal.  */
    #define __WIFSIGNALED(status) \
      (((signed char) (((status) & 0x7f) + 1) >> 1) > 0)
    
    /* Nonzero if STATUS indicates the child is stopped.  */
    #define __WIFSTOPPED(status)    (((status) & 0xff) == 0x7f)
    
    /* Nonzero if STATUS indicates the child continued after a stop.  We only
       define this if <bits/waitflags.h> provides the WCONTINUED flag bit.  */
    #ifdef WCONTINUED
    # define __WIFCONTINUED(status) ((status) == __W_CONTINUED)
    #endif
    
    /* Nonzero if STATUS indicates the child dumped core.  */
    #define __WCOREDUMP(status) ((status) & __WCOREFLAG)
    
    /* Macros for constructing status values.  */
    #define __W_EXITCODE(ret, sig)  ((ret) << 8 | (sig))
    #define __W_STOPCODE(sig)   ((sig) << 8 | 0x7f)
    #define __W_CONTINUED       0xffff
    #define __WCOREFLAG     0x80
    
  • Re: Help C! Vorrei capire bene questo pezzettino di codice...

    Grazie della Risposta!!!....molto meglio le MACRO
    ....solo un dubbio, non capisco perche' si casta a char!....non posso semplicemente utilizzare st senza cast....o mi cambia qualkosa?
  • Re: Help C! Vorrei capire bene questo pezzettino di codice...

    Certo che cambia
    il char è 8 bit quasi sempre, l' int è dipendente dalla macchina e solitamente multiplo di char
    supponendo per comodità un int da 16 bit potemmo avere due char interni uno piu ed uno meno significativo. esempio
    
    00000011-00000001  => in little endian = 3 - 1
                                   => in big endian    = 1 - 3
    
    quando compariamo due entitá di differente grandezza il compilatore trasforma la più piccola nella maggiore ecco che int==char diventerá int==int ma se noi andiamo a fare un cast la cosa cambia
  • Re: Help C! Vorrei capire bene questo pezzettino di codice...

    
    #include<stdio.h>
    void dump (char my_char[],int n)
    {
      int i;
      for (i=0;i<n;i++)
        printf ("%d ",my_char[i]);
      printf ("\n");
    }
    int main()
    {
      union types
      {
        int my_int;
        char my_char[sizeof(int)];
      };
      union types value;
      
      value.my_int=513;
      /** dump my_int in chars */
      dump (value.my_char,sizeof(int));
      
      /**  */
      printf ("value.my_int=%d\n(char)value.my_int=%d\n",value.my_int,(char)value.my_int);
      
      return 0;
    }
    
  • Re: Help C! Vorrei capire bene questo pezzettino di codice...

    Azz..!! Perfetto ora ho capito:P
    Grazie per l'aiuto!!!
  • Re: Help C! Vorrei capire bene questo pezzettino di codice...

    Di niente!
    se hai altri dubbi chiedi pure
    ciao
Devi accedere o registrarti per scrivere nel forum
6 risposte