IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Encore une histoire de pointeur


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Encore une histoire de pointeur
    Bonjour amis développeurs C !

    Je viens vous demander de l'aide ! Moi pauvre développeur Java qui n'a plus touché au C depuis 10 ans.. je suis perdu.
    Alors pourquoi j'en ai besoin me demanderez vous... et bien pour faire du profiling Java. La JVM nous offre un interface via une librairie système pour observer certains événements.

    Bref... j'ai besoin d'utiliser deux méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jvmtiError SetThreadLocalStorage(jvmtiEnv* env, jthread thread, const void* data)
    jvmtiError GetThreadLocalStorage(jvmtiEnv* env, jthread thread, void** data_ptr)
    Doc sur : http://java.sun.com/j2se/1.5.0/docs/...adLocalStorage

    Et la c'est le drame.. avec les void ** je suis perdu.

    Je pense avoir bien utilisé la première
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jint start = 10;
    err = (*jvmti)->SetThreadLocalStorage(jvmti, thread, &start);
    Par contre impossible de récupérer la valeur de start avec la seconde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jint *startVal;
    err = (*jvmti)->GetThreadLocalStorage(jvmti, thread, &startVal);
    J'ai essayé toutes les combinaisons de & ou * possible sans succes...
    Avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\n===== %d \n",startVal);
    c'affiche l'adresse de la variable start du premier appel.

    Merci pour vos conseils

    Samuel

  2. #2
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    Salut !

    Pour rappel : un pointeur est l'adresse où trouver les données.
    Tu as deux façon d'utiliser les fonctions qui attendent un pointeur :
    - Declarer une variable et envoyer son adresse (&) a la fonction (c'est a peu pres ce que java fait implicitement) comme tu l' as fait a ton premier appel.

    - Declarer un pointeur, lui allouer de la mémoire (malloc). L'envoyer a ta fonction.


    Le void** peut etre concideré comme un tableau à deux dimensions.

    Premiere dim
    []--> [][][] Seconde Dim
    []--> [][][]
    []--> []
    []--> [][]
    []--> []
    ...

    (voir http://c.developpez.com/faq/?page=ta...bleau_2D_alloc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #define taille 10
    #define taille2 10 
     
    jint **startVal=NULL;
     
    startVal= malloc ( sizeof(*startVal)  *  taille);
    for (int i=0; i<taille; i++)
    {
       startVal[i] = malloc ( sizeof(**startVal) * taille2);
    }
     
    err = (*jvmti)->GetThreadLocalStorage(jvmti, thread, startVal);
    Remarque : il n'est peut etre pas necassaire d'allouer de la memoire, la fonction peut s'en charger suivant son implementation (attend elle une variable en entree, sortie, entree/sortie ?)

    je suppose que jint est un typedef sur un int ou un long...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Merci pour ton aide !
    Grace à toi j'ai avancé d'un pas.

    J'ai fait deux erreurs :
    -> mauvais passage des paramètres (mélange des *, &)
    -> oublie d'allouer de la mémoire pour le get.

    J'ai donc maintenant pour le Set :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    jint **start=NULL;
     
    // pas de boucle pour le moment :) 
    start= malloc ( sizeof(jint )  *  2);
    start[0] = malloc ( sizeof(jint ) * 2);
    start[1] = malloc ( sizeof(jint ) * 2);
    start[0][0] = 10;       
     
    err = (*jvmti)->SetThreadLocalStorage(jvmti, thread, *start);
    Et pour le get :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    jint **startVal;
     
    startVal= malloc ( sizeof(jint )  *  2);
    startVal[0] = malloc ( sizeof(jint ) * 2);
    startVal[1] = malloc ( sizeof(jint ) * 2);
     
    err = (*jvmti)->GetThreadLocalStorage(jvmti, thread, startVal);
    Et la ca marche !

    Par contre j'ai du mal à comprendre cette double allocation...
    Je pensais réserver de la mémoire avant le set, passer un pointeur vers cette zone et récupérer ce pointeur avec le get...

    Bref.. vous savez bien que les malloc c'est pas notre tasse de thé pour nous les développeurs Java

    Samuel

  4. #4
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    Le premier malloc alloue la memoire à la premiere dimension : une liste contenant de pointeurs.
    Ensuite le for alloue la memoire pour chaque pointeur de cette liste.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Le double malloc pour le tableau j'ai bien compris.

    Par contre le GetThreadLocalStorage devrais retourner un pointeur vers la zone mémoire fourni au moment du SetThreadLocalStorage...
    C'est donc le malloc avant le GetThreadLocalStorage que je ne comprends pas.



    Mais le vrai pb c'est que ce n'ai pas un jint[] que je veux passer.. mais une structure... A suivre donc

  6. #6
    Scorpi0
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jint *startVal;
    err = (*jvmti)->GetThreadLocalStorage(jvmti, thread, &startVal);
     
    printf("\n===== %d \n",startVal);
    startVal est un pointeur vers un jint. Afficher ce pointeur t'affichera donc l'adresse de la valeur, et non la valeur. Pour obtenir la valeur, il faut déréférencer le pointeur, startVal est le pointeur, *startVal la valeur pointée.

    Si tu fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\n===== %d \n",*startVal);
    Tu afficheras la zone pointée par startVal, donc ça devrait afficher ta valeur de départ, 10.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. encore une histoire de placement des Jlabel
    Par canary dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 28/04/2008, 18h04
  2. Encore une histoire pour remplacer les points
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/08/2007, 11h41
  3. Encore une histoire de code source
    Par olivier03 dans le forum Juridique
    Réponses: 15
    Dernier message: 07/06/2007, 10h48
  4. encore une histoire de transparence
    Par mathou810 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 28/09/2006, 13h45
  5. [JAR][debutant] encore une histoire de classpath
    Par blaz dans le forum Général Java
    Réponses: 6
    Dernier message: 27/07/2005, 12h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo