Pointeur, Adresse and co

CoreCore Membre
21:47 modifié dans API AppKit #1
Bonsoir,

J'ai à  nouveau besoin de vos lumiéres, sur une question plus orienté C cette fois.

Voici le code en question

<br />UInt32 count ;<br />UInt32 size = sizeof (count) ;<br /><br />	AudioUnitGetProperty (<br />			SynthUnit, kMusicDeviceProperty_InstrumentCount,<br />			kAudioUnitScope_Global, 0,<br />			&amp;count, &amp;size);<br />


je ne comprends pas vraiment l'intérêt du &count et du &size. Si mes souvenirs sont bons il s'agit des adresses mémoires des variables count et size.
Pourquoi ne met-on pas directement count et size
pour info cette fonction vient du core audio et permets de recupérer le nombre d'instruments d'un Audio Unit de type Music Device qu'on place dans la variable count

Réponses

  • BruBru Membre
    21:47 modifié #2
    AudioUnitGetProperty demande une adresse où déposer l'information demandée, et demande une seconde adresse où déposer la taille de l'information retournée.

    Selon la doc Apple :
    ComponentResult AudioUnitGetProperty(
       AudioUnit             ci,
       AudioUnitPropertyID   inID,
       AudioUnitScope        inScope,
       AudioUnitElement      inElement,
       void*                 outData,
       UInt32*               ioDataSize
    )

    les 2 derniers paramètres sont bien des pointeurs (ou adresses).

    Donc ce sont bien des adresses qu'il faut passer en paramètre (en l'occurrence celles des variables count et size de ton exemple).

    Si tu omets le &, ce sont alors les valeurs contenues dans ces variables qui auraient été passées à  la fonction (dans ton exemple, une valeur indéterminée et la valeur 4)

    .
  • CoreCore Membre
    21:47 modifié #3
    Merci pour ton explication.

    Mais dans ma pauvre tête c'est encore un peu flou.

    En fait on passe un message, on ne dit pas quelle varialbe est à  modifier.

    Donc ca revient à  dire : depose moi la valeur retournée dans cette adresse mémoire ?
  • CoreCore Membre
    21:47 modifié #4
    je drias meme plus si :

    UInt32 count ;
    


    et que mets count, je passe la valeur de count

    et si je mets &count, je dis : c'est la que tu dois me mettre le resultat
  • BruBru Membre
    21:47 modifié #5
    dans 1113588779:

    je drias meme plus si :
    UInt32 count ;
    

    et que mets count, je passe la valeur de count
    et si je mets &count, je dis : c'est la que tu dois me mettre le resultat


    c'est un bon résumé, oui !

    .
  • CoreCore Membre
    21:47 modifié #6
    <3
  • WIMPWIMP Membre
    21:47 modifié #7
    La première méthode s'appelle "passage par valeur", la deuxième "passage par référence".L'utilité de la deuxième est double:
    1. En passant une adresse on ne passe que 4 octets. S'il s'agit de l'adresse d'un tableau ou d'une structure de grande taille, passer la valeur est peu performant.
    2. une fonction ne peut retourner qu'une seule valeur. Le passage par référence permet de renvoyer plusieurs valeurs.
    Par exemple, la méthode de NSColor getRed: green: blue: alpha: renvoie les 4  composantes d'une couleur NSColor *aColor:

    float red, green, blue, alpha;
    [aColor getRed:&red green:&green blue:&blue alpha:&alpha];
  • CoreCore Membre
    21:47 modifié #8
    Merci WIMP,

    maintenant je suis au taquet sur ce sujet 
  • CoreCore Membre
    21:47 modifié #9
    J'ai encore une petite question :

    si :

    <br />MusicSequenceGetTrackCount <br /><br />extern OSStatus MusicSequenceGetTrackCount(<br /> MusicSequence inSequence, <br /> UInt32 *outNumberOfTracks );  <br />
    


    Quel est la différence entre :

    <br />MusicSequence sequence ;<br />UInt32 outNumberOfTracks ;<br />MusicSequenceGetTrackCount(sequence, &amp;outNumberOfTracks) ;<br />
    


    et

    <br />MusicSequence sequence ;<br />UInt32 *outNumberOfTracks ;<br />MusicSequenceGetTrackCount(sequence, outNumberOfTracks) ;<br />
    


    j'ai un petit avis sur la question mais j'attends vos réponses ;)
  • ChachaChacha Membre
    21:47 modifié #10
    <br />MusicSequence sequence ;<br />UInt32 outNumberOfTracks ;<br />MusicSequenceGetTrackCount(sequence, &amp;outNumberOfTracks) ;<br />
    


    Ok. outNumberOfTracks n'a pas besoin d'être initialisé puisque c'est MusicSequenceGetTrackCount qui lui donne une valeur

    <br />MusicSequence sequence ;<br />UInt32 *outNumberOfTracks ;<br />MusicSequenceGetTrackCount(sequence, outNumberOfTracks) ;<br />
    


    Erreur.
    C'est syntaxiquement correct : le deuxième argument de MusicSequenceGetTrackCount doit bien être de type "adresse de UInt32", donc "UInt32*". Mais cette adresse doit correspondre à  celle d'une variable existante en mémoire, que l'on puisse remplir !

    Deux solutions ici pour que cela devienne correct :

    <br />MusicSequence sequence ;<br />UInt32   laVariable;<br />UInt32 *outNumberOfTracks = &amp;laVariable; //on fait pointer vers une variable existante<br />MusicSequenceGetTrackCount(sequence, outNumberOfTracks) ; //c&#39;est &quot;laVariable&quot; qui est remplie<br />
    


    ou

    <br />MusicSequence sequence ;<br /><br />//on crée la variable dynamiquement, donc on alloue 1*sizeof(UInt32) octets, que outNumberOfTracks va référencer<br />UInt32 *outNumberOfTracks = (UInt32*) malloc(1*sizeof(UInt32));<br />MusicSequenceGetTrackCount(sequence, outNumberOfTracks) ;<br /><br />//...<br />free(outNumberOfTracks) //il faudra la libérer<br />
    


    Est-ce ce que tu avais subodoré ?

    +
    Chacha
  • mpergandmpergand Membre
    21:47 modifié #11
    Salut,
    <br />UInt32 outNumberOfTracks ;<br />
    

    Ici tu déclares une variable de type UInt32 et avec &outNumberOfTracks tu passes l'adresse de cette variable, c'est à  dire, en fait, un pointeur vers cette variable.

    <br />UInt32 *outNumberOfTracks ;<br />
    

    Ici, tu déclares un pointeur de UInt32, qui pour l'instant ne pointe vers rien puisque ce pointeur n'a pas été initialisé.
    Ca marche aussi, il faudait faire:
    <br />UInt32 *outNumberOfTracks=(Uint32*)malloc(sizeof(UInt32));<br />MusicSequenceGetTrackCount(sequence, outNumberOfTracks);<br />...<br />// on libére la mem alouée au pointeur<br />free(outNumberOfTracks);<br /><br />
    

    Mais c'est se compliquer la vie pour rien...
  • ChachaChacha Membre
    21:47 modifié #12
    Au moins il y a convergence et cohérence des réponses !
  • mpergandmpergand Membre
    21:47 modifié #13
    dans 1113748171:

    Au moins il y a convergence et cohérence des réponses !


    Ca vaut mieux pour la santé mentale de Core  :)


    maintenant je suis au taquet sur ce sujet 


    Core, je te trouve très optimiste, ça devrait t'occuper encore quelques temps, pointeur de tableaux, pointeur de structure, tableau de pointeurs ....

    ;)
  • CoreCore Membre
    21:47 modifié #14
    Core, je te trouve très optimiste, ça devrait t'occuper encore quelques temps, pointeur de tableaux, pointeur de structure, tableau de pointeurs ....


    hou mais bien loin de moi l'idée de faire le malin, il me reste tellement de chemin à  parcourir !
  • CoreCore Membre
    21:47 modifié #15
    dans 1113747863:


    Est-ce ce que tu avais subodoré ?

    +
    Chacha


    Effectivement c'est ce que j'avais pisté !

    merci vraiment à  tous pour ces explications très pertinentes
Connectez-vous ou Inscrivez-vous pour répondre.