Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: [C] Exit da funzione

  1. #1
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    [C] Exit da funzione

    Ciao a tutti, io sto realizzando un programma in cui faccio uso di memoria dinamica quindi uso delle calloc( o malloc ), queste funzioni tornano NULL se non sono riusicite ad allocare memoria, come potrei fare per metterci appunto dei controlli, la cosa piu brutale e' mettere queste dichiarazioni dentro un IF ma viene una cosa penosa. io avevo pensato ad una funzione cosi':

    char *p = allocaMemoria( SIZE );

    e nel caso in cui lui nn riuscisse ad allocare momoria termina l'esecuzione del programma, pero', dalla funzione allocaMemoria, come faccio a far terminare l'esecuzione della funzione chiamante?

    Non so se sono riuscito a spiegarmi, fatemi sapere se nn ci sono riuscito

    Grazie!!
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    41
    ciao ...

    non ho ben capito cosa intendi con : "la cosa piu brutale e' mettere queste dichiarazioni dentro un IF ma viene una cosa penosa"

    intendi questo?

    char *p
    p= (char *)malloc( non mi ricordo la sintassi );
    if ( p!= NULL)
    printf("successo");
    else
    printf("fallito");

  3. #3
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Il metodo usato dai programmatori di lungo corso è quello di servirsi di funzioni wrapper.
    Non so su quale sistema operativo programmi, però ti propongo un wrapper molto usato per la malloc in Unix:

    codice:
    void *Malloc (size_t nbytes)
    {
      void *aptr;
      if ( (aptr = malloc(nbytes)) == NULL)
        err_sys ("(%s) error - not enough memory: malloc() failed", prog);
      return aptr;
    }
    la err_sys è una funzione inclusa in questo header:

    codice:
    /*
    
    module: errlib.c
    
    purpose: library of error functions
    
    reference: Stevens, Unix network programming (2ed), p.922
    
    */
    
    #include <stdio.h>
    #include <stdlib.h> // exit()
    #include <stdarg.h>
    #include <syslog.h>
    #include <string.h>
    #include <errno.h>
    
    #define MAXLINE 4095
    
    int daemon_proc = 0; /* set to 0 if stdout/stderr available, else set to 1 */
    
    static void err_doit (int errnoflag, int level, const char *fmt, va_list ap)
    {
      int errno_save = errno, n;
      char buf[MAXLINE+1];
    
      vsnprintf (buf, MAXLINE, fmt, ap);
      n = strlen(buf);
      if (errnoflag)
        snprintf (buf+n, MAXLINE-n, ": %s", strerror(errno_save));
      strcat (buf, "\n");
    
      if (daemon_proc)
        syslog (level, buf);
      else
      {
        fflush (stdout);
        fputs (buf, stderr);
        fflush (stderr);
      }
    }
    
    void err_ret (const char *fmt, ...)
    {
      va_list ap;
    
      va_start (ap, fmt);
      err_doit (1, LOG_INFO, fmt, ap);
      va_end (ap);
      return;
    }
    
    void err_sys (const char *fmt, ...)
    {
      va_list ap;
    
      va_start (ap, fmt);
      err_doit (1, LOG_ERR, fmt, ap);
      va_end (ap);
      exit (1);
    }
    
    void err_msg (const char *fmt, ...)
    {
      va_list ap;
    
      va_start (ap, fmt);
      err_doit (0, LOG_INFO, fmt, ap);
      va_end (ap);
      return;
    }
    
    void err_quit (const char *fmt, ...)
    {
      va_list ap;
    
      va_start (ap, fmt);
      err_doit (0, LOG_ERR, fmt, ap);
      va_end (ap);
      exit (1);
    }

  4. #4
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    io uso linux come piattaforma di sviluppo. Quindi invece di usare:

    char *stringa = (char*) malloc( 512, sizeof(char) );

    uso

    char *stringa = (char*) Malloc( 512, sizeof(char) );

    questo mi garantisce che se una malloc fallisce in un qualsiasi pezzo del programma, questo termina inviando un messaggio d'errore?

    Dovro' studiarmi per bene quelle funzioni dato che e' un progetto d'esame e se mi chiede che fanno nn posso fare scena muta

    Oppure devo studiare un modo di modifire la Malloc che definisce li senza inserire questo wrapper..anche se mi piacerebbe.
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  5. #5
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Se hai notato, nell'header delle funzioni di errore c'è scritto che si fa riferimento alla pagina 922 del manuale "Unix Network Programming", la bibbia della programmazione di rete.
    Questo fatto secondo me è sufficiente per poter usare queste funzioni in un esame senza dover dare troppe speigazioni, sono funzioni di segnalazione di errori quasi standard.
    Dimenticavo, la err_sys all'interno della Malloc segnala l'errore e termina il programma con un messagio molto chiaro.

  6. #6
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    Quel pezzo di codice che mi hai dato devo metterlo in un file .c e compilarlo assieme a tutto il resto del programma giusto ?
    Cmq se so alla meglio il funzionamento e' meglio, anche per vedere come e' stato fatto, il tipo di implementazione, sono abbastanza alle prime armi
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  7. #7
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Pe usare le funzioni di errore salvi queste linee come errlib.h

    codice:
    /*
    
    module: errlib.h
    
    purpose: definitions of function sin errlib.c
    
    reference: Stevens, Unix network programming (2ed), p.922
    
    */
    
    #include <stdarg.h>
    
    extern int daemon_proc;
    
    void err_msg (const char *fmt, ...);
    
    void err_quit (const char *fmt, ...);
    
    void err_ret (const char *fmt, ...);
    
    void err_sys (const char *fmt, ...);
    
    void err_dump (const char *fmt, ...);
    e queste linee come errlib.c

    codice:
    /*
    
    module: errlib.c
    
    purpose: library of error functions
    
    reference: Stevens, Unix network programming (2ed), p.922
    
    */
    
    #include <stdio.h>
    #include <stdlib.h> // exit()
    #include <stdarg.h>
    #include <syslog.h>
    #include <string.h>
    #include <errno.h>
    
    #define MAXLINE 4095
    
    int daemon_proc = 0; /* set to 0 if stdout/stderr available, else set to 1 */
    
    static void err_doit (int errnoflag, int level, const char *fmt, va_list ap)
    {
      int errno_save = errno, n;
      char buf[MAXLINE+1];
    
      vsnprintf (buf, MAXLINE, fmt, ap);
      n = strlen(buf);
      if (errnoflag)
        snprintf (buf+n, MAXLINE-n, ": %s", strerror(errno_save));
      strcat (buf, "\n");
    
      if (daemon_proc)
        syslog (level, buf);
      else
      {
        fflush (stdout);
        fputs (buf, stderr);
        fflush (stderr);
      }
    }
    
    void err_ret (const char *fmt, ...)
    {
      va_list ap;
    
      va_start (ap, fmt);
      err_doit (1, LOG_INFO, fmt, ap);
      va_end (ap);
      return;
    }
    
    void err_sys (const char *fmt, ...)
    {
      va_list ap;
    
      va_start (ap, fmt);
      err_doit (1, LOG_ERR, fmt, ap);
      va_end (ap);
      exit (1);
    }
    
    void err_msg (const char *fmt, ...)
    {
      va_list ap;
    
      va_start (ap, fmt);
      err_doit (0, LOG_INFO, fmt, ap);
      va_end (ap);
      return;
    }
    
    void err_quit (const char *fmt, ...)
    {
      va_list ap;
    
      va_start (ap, fmt);
      err_doit (0, LOG_ERR, fmt, ap);
      va_end (ap);
      exit (1);
    }
    ricordati di compilare il programma nella stessa cartella in cui si trovano questi due files.

  8. #8
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    Si si. Includo il .h dove mi serve e compilo il .c .
    Cmq questa "bibbia" che mi hai detto e' un libro?
    Io al secondo semestre faro' un corso che si chiama appunto Programmazione di sistema dove dovremmo usare delle funzioni di "connessione", cmq, anche per imparare meglio a programmare e cmq per apprendere uno stile credi che possa servirmi?
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  9. #9
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Non è un libro, è la Bibbia per la programmazione di rete in ambiente Unix.
    Non è che serve, secondo me uno che scrive programmi per le reti in Unix deve averlo come riferimento.

  10. #10
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    Allora vedo se riesco a trovarla da qualche parte, domani provo ad implementare il programma aggiungendo quel file, ti ringrazio, se ho qualche problema ti faccio sapere :-)
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

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 © 2025 vBulletin Solutions, Inc. All rights reserved.