Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    6

    [C] Puntatori void e valore ritornato da shmat()

    Ciao a tutti!

    Non riesco a capire bene un aspetto dei puntatori void.
    Per spiegarmi meglio faccio un esempio:
    avete presente la funzione
    void* shmat(int shmid, const void *shmaddr, int shmflg),
    che "attacca" un segmento di memoria condivisa allo spazio di indirizzi del processo chiamante? Ebbene, in caso di fallimento, tale funzione riporta il valore -1 anche se in teoria il tipo restituito dovrebbe essere un void*. Pero' se nel programma si fa un test del tipo
    codice:
    if (shmat(<parametri>)<0)
    { ... }
    la cosa non da problemi; se invece definisco una mia funzione
    codice:
    void* Funzione()
    { return -1; }
    e poi faccio un test tipo
    codice:
    if (Funzione()<0)
    { ... }
    il codice tra parentesi graffe non viene mai eseguito, perche' la funzione in realta' riporta il valore del puntatore e non -1.
    Ho cercato i sorgenti della funzione shmat per vedere come funziona, ma non li ho trovati... Sapreste spiegarmi questa differenza di comportamento oppure il modo per far si che la funzione void* Funzione() riporti effettivamente -1?
    Ah, sto facendo riferimento a programmazione in ambiente Unix...

    Grazie,
    Gica

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    prova a fare un cast ad int:

    if (((int)Funzione()) < 0)
    { ... }

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non conosco quella funzione, ma conosco un'altra funzione che ritorna un puntatore a void: malloc().
    Cosa significa puntatore a void: significa che ciò che viene restituito è un indirizzo di memoria. Un indirizzo di memoria è un numero e, solitamente, esso va castato al valore corrispondente: se sto allocando memoria per un array di caratteri, allora casto tale valore come puntatore a carattere, ecc.
    Il valore -1 è un valore buono come un altro, solo che un indirizzo di memoria non può avere questo valore: esso, quindi, viene utilizzato come errore. Tutto ciò che la funzione restituisce, quindi, è un numero (almeno a mio avviso, non sono andato a vedermi i sorgenti di malloc() ).
    Il valore -1 (corrispondente a 0xFFFFFFFF) è una cella di memoria che il sistema operativo automaticamente flagga come non utilizzabile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    6
    Originariamente inviato da LeleFT
    Non conosco quella funzione, ma conosco un'altra funzione che ritorna un puntatore a void: malloc().
    Cosa significa puntatore a void: significa che ciò che viene restituito è un indirizzo di memoria. Un indirizzo di memoria è un numero e, solitamente, esso va castato al valore corrispondente: se sto allocando memoria per un array di caratteri, allora casto tale valore come puntatore a carattere, ecc.
    Il valore -1 è un valore buono come un altro, solo che un indirizzo di memoria non può avere questo valore: esso, quindi, viene utilizzato come errore. Tutto ciò che la funzione restituisce, quindi, è un numero (almeno a mio avviso, non sono andato a vedermi i sorgenti di malloc() ).
    Il valore -1 (corrispondente a 0xFFFFFFFF) è una cella di memoria che il sistema operativo automaticamente flagga come non utilizzabile.


    Ciao.
    Quindi posso assegnare il valore -1 ad un puntatore void? Guarda questo codice (che e' analogo a quello gia' citato):
    codice:
    void* Funzione(int i)
    {
       return -1;
    }
    
    int main()
    {
       void* p;
       if ((p=Funzione(5))<0)
         printf("Funzione ha riportato un valore negativo...\n");
       else
         {
            printf("Funzione ha riportato un valore non negativo...\n");
         }
    
       return 0;
    }
    Eseguendo questo programma, si entra sempre nel ramo else Dov'e' che sbaglio? Devo forse fare return 0xFFFFFFFF?

    Gica

    Aggiornamento: non va neanche con return 0xFFFFFFFF :master:

  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    perche non usi il mio consiglio di fare il cast:

    if ((p=(int)Funzione(5))<0)
    printf("Funzione ha riportato un valore negativo...\n");

    cosi funziona

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    6
    Originariamente inviato da anx721
    perche non usi il mio consiglio di fare il cast:

    if ((p=(int)Funzione(5))<0)
    printf("Funzione ha riportato un valore negativo...\n");

    cosi funziona
    In effetti cosi' funziona , pero' continuo a non spiegarmi come mai quando faccio il confronto col valore restituito da shmat() (che e' sempre un void*), il cast non e' necessario...

    Comunque grazie!

    Gica

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    perche -1 visto come puntatore non è negativo, puntatori e interi dsono tipi di dati diversi

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

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.