Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C, esperti] deferenziazione di void *.... non li ho capiti...

    ragazzi ho scritto un paio di righe di codice per gestire dei threads. Il problema è che non riesco a capire sti benedetti puntatori a void.

    Vi posto la porzione di codice che uso.

    Ho una funzione che uso per generare un nuovo thread.

    codice:
    void *myThreadFunc(void *args) {
      int value;
      // calcolo della variabile 'value', poi la passo con pthread_exit
      pthread_exit((void *)value);
    }
    Già la non capisco cosa succede. Cioè io ho un valore intero (int value) conservato in un dato spazio di memoria X, e con quel cast a void praticamente gli passo alla funzione pthread_exit l'indirizzo di memoria X però come se all'interno il dato fosse di tipo void?
    Se ho detto bene allora non si dovrebbe fare cosi: ?

    codice:
    pthread_exit((void)&value);
    Poi nel main ad un certo punto avrò:
    codice:
    void *thread_value_return;
    pthread_join(my_thread_id,&thread_value_return);
    printf("Il valore ritornato e': %d.",(int)thread_value_return);
    Il secondo argomento della join è specificato come doppio puntatore a void, quindi devo anteporre & per ottenere 2 indirizzi.

    Ora quello che non capisco è perchè devo fare (int)thread_value_return per accedere al valore intero, thread_value_return non rappresenta un puntatore?

    Non dovrei fare
    (int)*thread_value_return?

    chissà se qualcuno mi aiuterà

  2. #2
    void * è un tipo che non vuol dire nulla; indica un generico puntatore, e in questo genere di funzioni si suppone che il programmatore sappia quello che faccia quando lo casta ad altri tipi di puntatore; in questo caso specifico in realtà poi è usato come un intero (dato che in fondo i puntatori sono degli interi), per cui il codice di errore è convertito "a pedate" in un void * e viceversa.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    void * è un tipo che non vuol dire nulla; indica un generico puntatore, e in questo genere di funzioni si suppone che il programmatore sappia quello che faccia quando lo casta ad altri tipi di puntatore; in questo caso specifico in realtà poi è usato come un intero (dato che in fondo i puntatori sono degli interi), per cui il codice di errore è convertito "a pedate" in un void * e viceversa.
    non ho capito cosa vuoi dire.

    codice:
    void *thread_value_return;
    pthread_join(my_thread_id,&thread_value_return);
    printf("Il valore ritornato e': %d.",(int)thread_value_return);
    per come è definito ti trovi che thread_value_return è una variabile che contiene un indirizzo di memoria?

    perchè (int)thread_value_return mi ritorna il valore intero a cui punta l'indirizzo contenuto nella variabile non lo capisco

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    A parte il fatto specifico (di quello che stai facendo), probabilmente tu non hai chiaro il concetto di void.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Originariamente inviato da oregon
    A parte il fatto specifico (di quello che stai facendo), probabilmente tu non hai chiaro il concetto di void.
    grazie per la spiegazione

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da xnavigator
    grazie per la spiegazione
    Prego.

    Sai cos'e', quando ti danno una articolata spiegazione sull'argomento e rispondi con un semplice

    "non ho capito cosa vuoi dire."

    è molto probabilmente che tu abbia delle "lacune" di base. Ecco quindi che ti chiedevo (anche se la domanda non era esplicita) se tu avessi tali nozioni ...

    Sai cosa è un void?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Originariamente inviato da oregon
    Prego.

    Sai cos'e', quando ti danno una articolata spiegazione sull'argomento e rispondi con un semplice

    "non ho capito cosa vuoi dire."

    è molto probabilmente che tu abbia delle "lacune" di base. Ecco quindi che ti chiedevo (anche se la domanda non era esplicita) se tu avessi tali nozioni ...

    Sai cosa è un void?

    un puntatore a void non è una cosa cosi complicata da capire.. E' un puntatore che può puntare ad un qualsiasi tipo.

    Il problema è che non mi entra quel passaggio:
    (int)thread_value_return

    thread_value_return è un puntatore a void, quindi per prendere l'intero che è puntato dal puntatore io avrei fatto cosi:
    (int)*thread_value_return

    Sai cos'e', quando ti danno una articolata spiegazione sull'argomento e rispondi con un semplice
    hm, in effetti rileggendo mitaly con più attenzione con quel codice praticamente al posto dell'indirizzo vero e proprio thread_value_return contiene proprio il valore int e non un indirizzo

    che brutto codice

    a questo punto non mi è ben chiaro perchè la funzioen pthread_join ha definito come secondo argomento un doppio puntatore a void

    int pthread_join (pthread_t TH, void **thread_RETURN)

    thx comunque

  8. #8
    Originariamente inviato da xnavigator
    un puntatore a void non è una cosa cosi complicata da capire.. E' un puntatore che può puntare ad un qualsiasi tipo.

    Il problema è che non mi entra quel passaggio:
    (int)thread_value_return

    thread_value_return è un puntatore a void, quindi per prendere l'intero che è puntato dal puntatore io avrei fatto cosi:
    (int)*thread_value_return
    void* è quasi quello che vuoi tu, non per forza un puntatore.
    Dai un'occhiata qui:

    http://forum.html.it/forum/showthrea...readid=1395258


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.