Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1

    [c] funzione che ritorna il valore oppure FALSE?

    penso sia la cosa più naturale del mondo avere delle funzioni che svolgono delle operazioni ma se falliscono per qualunque altro motivo ritornino un valore di un atlro tipo (booleano per esempio)

    come faccio a scrivere una funzione che normalmente ritorna il risultato di un algo in int e nel caso ci fossero qualche problema ritorna NULL per esempio.





    thx oregon (sicuro che sarà il primo a rispondere )

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quasi quasi non ti risponderei ... non per primo almeno ...

    In ogni caso, devi dare qualche spiegazione in piu', perche' non ho capito (che vuoi farci ... sono old ...) ...

    Parli di FALSE poi di NULL e non dici nulla dell' "algo" e dei possibili valori restituibili ... insomma, spiega meglio, magari con un esempio concreto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ti faccio un esempio anche se non è questo quello che dovrò utilizzare..

    ho una funzione:
    codice:
    short check_max( short value1, short value2 ){
     
     if( value1>value2 )
      return value1;
     else if ( value1<value2 )
      return value2;
     else if ( value1==value2 )
      return NULL;
    
    }
    questa funzione non fa altro che ritornare il valore più grande tra 2 numeri dati in input.
    se però questi 2 valori sono uguali dovrebbe tornare un valore differennte da int che io potrei riconscore

    (che vuoi farci ... sono old ...)
    ma lol tu non sei old, un'altra cosa lo è

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Devi restituire

    -1

    0

    1

    nei tre casi, è sempre un intero ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    codice:
    short * check_max( short *value1, short *value2 ){
     
     if( *value1>*value2 )
      return value1;
     else if ( *value1<*value2 )
      return value2;
     else if ( *value1==*value2 )
      return NULL;
    
    }

  6. #6
    Originariamente inviato da xnavigator
    questa funzione non fa altro che ritornare il valore più grande tra 2 numeri dati in input.
    se però questi 2 valori sono uguali dovrebbe tornare un valore differennte da int che io potrei riconscore
    Non puoi, la funzione è dichiarata come short int e solo uno short int puoi restituire. Nell'esempio in questione si potrebbe fare o come ha detto oregon (restituire -1, 0 o 1 a seconda che il primo numero sia minore, uguale o maggiore del secondo, come consuetudine delle funzioni di confronto in C) oppure restituire indifferentemente value1 o value2 nel caso in cui siano uguali (se lo scopo della funzione è essere semplicemente un helper per ottenere il valore maggiore), oppure ancora utilizzare un approccio combinato:
    codice:
    short check_max( short value1, short value2, short * compareResult)
    {
        if( value1>value2 )
        {
            if(compareResult!=NULL)
                *compareResult=1;
            return value1;
        }
        else if ( value1<value2 )
        {
            if(compareResult!=NULL)
                *compareResult=-1;
            return value2;
        }
        else if ( value1==value2 )
        {
            if(compareResult!=NULL)
                *compareResult=0;
            return value1;
        }
    }
    .
    In questa maniera un chiamante che vuole sapere semplicemente il valore del numero più grande potrà richiamare la funzione così:
    codice:
    short greater=check_max(10,26,NULL);
    /* ora in greater c'è il più grande dei due numeri */
    , mentre un chiamante interessato anche a sapere quale dei due è il più grande e se sono uguali, potrà fare
    codice:
    short compRes, greater;
    greater=check_max(10,26,&compRes);
    /* ora in greater c'è il più grande dei due numeri e
     in compRes un valore che indica quale dei due è il maggiore o se sono uguali */
    Ovviamente si possono immaginare molte altre soluzioni per restituire più valori, ma queste tre mi paiono le più pratiche in questa situazione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Originariamente inviato da sebaldar
    codice:
    short * check_max(const short *value1, const short *value2 ) /* sempre mettere const se i valori non vengono effettivamente modificati */
    {
     if( *value1>*value2 )
      return value1;
     else if ( *value1<*value2 )
      return value2;
     else if ( *value1==*value2 )
      return NULL;
    
    }
    Questo però non funziona se la funzione viene richiamata con uno o più parametri rvalue.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Originariamente inviato da sebaldar
    codice:
    short * check_max( short *value1, short *value2 ){
     
     if( *value1>*value2 )
      return value1;
     else if ( *value1<*value2 )
      return value2;
     else if ( *value1==*value2 )
      return NULL;
    
    }

    questa soluzione mi sembra perfetta.
    non avevo pensato che una puntatore può essere NULL..
    dopo la funzione basta controllare se il puntatore ritornato è diverso da NULL per sapere se la funzione ha eseguito le sue funzioni (scusate il gioco di parole) correttametne

    alla fine un pò come il funzionamento di malloc ecc, che ritornano NULL nel caso non ci sia mem disponibile

    thx

  9. #9
    Ribadisco, occhio...
    Originariamente inviato da MItaly
    Questo però non funziona se la funzione viene richiamata con uno o più parametri rvalue.
    In pratica non puoi fare così:
    codice:
    short numero, *max;
    /* ... */
    max=check_max(&numero,&(5));
    if(max==NULL)
    {
        printf("I valori sono uguali.");
    }
    else
    {
        printf("Il valore maggiore e' %hd",*max);
    }
    e neanche così:
    codice:
    short numero1, numero2;
    /* ... */
    max=check_max(&numero1,&(numero2+7));
    if(max==NULL)
    {
        printf("I valori sono uguali.");
    }
    else
    {
        printf("Il valore maggiore e' %hd",*max);
    }
    ; puoi solo passare a check_max due puntatori a due variabili:
    codice:
    short numero1, numero2;
    /* ... */
    max=check_max(&numero1,&numero2);
    if(max==NULL)
    {
        printf("I valori sono uguali.");
    }
    else
    {
        printf("Il valore maggiore e' %hd",*max);
    }
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    hmmm non avevo letto...

    ma non capisco cosa intendi quella funzione verrà richiamata sempre e comunque con 2 parametri ( puntatori di short )

    edit:

    ah nel senso che devi per forza passare dei puntatori a variaibli definite si questo mi sembra giusto

    alla fine mi serviva il concetto generale, la funzioen che serve a me in realtà non accetta nessun parametro in input quindi stiamo coperti


    editx2:

    non continuare a modificare altrimenti non capisco una cipppa

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.