Mot clé "out"

devulderdevulder Membre
janvier 2011 modifié dans Objective-C, Swift, C, C++ #1
Bonjour,

J'ai trouvé sur le net une extension de classe pour NSDate
<br />@implementation NSDate (AIDateAdditions)<br /><br />+ (void) convertTimeInterval:(NSTimeInterval)interval<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; toWeeks:(out int *)outWeeks<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  days:(out int *)outDays<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hours:(out int *)outHours<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; minutes:(out int *)outMinutes<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seconds:(out NSTimeInterval *)outSeconds<br />{<br />	NSTimeInterval	workIntervalSeconds = interval;<br /><br />	if (outSeconds) *outSeconds = fmod(workIntervalSeconds, 60.0); //Get the fraction of a minute in seconds.<br />	int workInterval = workIntervalSeconds / 60.0; //Now it&#39;s minutes.<br /><br />	if (outMinutes) *outMinutes = workInterval % 60; //Get the fraction of an hour in minutes.<br />	workInterval = workInterval / 60; //Now it&#39;s hours.<br /><br />	if (outHours) *outHours = workInterval % 24; //Get the fraction of a day in hours.<br />	workInterval = workInterval / 24; //Now it&#39;s days.<br /><br />	if (outDays) *outDays = workInterval % 7; //Get the fraction of a week in days.<br />	workInterval = workInterval / 7; //Now it&#39;s weeks.<br /><br />	if (outWeeks) *outWeeks = workInterval;<br />}<br />


C'est la première fois que je vois le mot clé "out" dans la passage de paramètres (out int *)

A quoi sert ce fameux "out" ?

Merci

Réponses

  • AliGatorAliGator Membre, Modérateur
    04:44 modifié #2
    1) En clair, le "out" il me semble que ça ne sert à  rien pour le compilateur (du moins pour la plupart des compilateurs).
    Pour le développeur qui lit le code, il permet juste de lui indiquer que le paramètre est un paramètre de sortie et pas d'entrée.
    - En gros, en général on passe les paramètres à  une fonction en "entrée", c'est à  dire que de l'extérieur on lui file des paramètres que la fonction va utiliser ensuite. On peut utiliser le mot clé "in" pour indiquer cela, mais on le fait jamais car c'est le mode de passage implicite par défaut donc on s'embête pas.
    - Mais parfois au lieu de ça on passe plutôt à  la fonction un pointeur, et c'est la fonction qui va remplir la valeur derrière ce pointeur pour que le code appelant puisse ensuite récupérer cette valeur (car une fonction n'a qu'une seule valeur de retour quand on fait un "return x;" donc quand on veut retourner d'autres trucs on le fait par référence ou pointeur comme ça). C'est ce que signifie "out", ça indique que le paramètre va être utilisé comme "paramètre de sortie"
    - Il est même parfois possible de rencontrer des cas où un paramètre est à  la fois utilisé comme paramètre d'entrée et de sortie. Par exemple pour une fonction qui lit des octets dans un fichier pour les mettre dans un buffer, on pourrait imaginer une fonction avec un paramètre contenant comme valeur le nombre maximum d'octets à  lire (la taille du buffer en somme, pour pas qu'il essaye d'en lire plus qu'il n'a le droit d'en stocker), et quand la fonction retourne ce paramètre a été modifié par la fonction et contient le nombre réel d'octets lus (qui peut être moins que la taille du buffer si le fichier était plus petit). Bref tu voit l'idée. Pour ce genre de paramètre, il existe le mot clé "inout", indiquant que c'est un paramètre à  la fois "in" et "out" bien sûr.

    Après, en pratique je n'ai pas connaissance qu'un tel mot clé serve à  quelquechose pour le compilateur, je ne crois pas qu'il en fasse usage (enfin peut-être qu'il vérifie 2-3 trucs quand même, genre ça l'aide à  supprimer les warnings sur les pointeurs pointant vers une valeur non initialisée peut-être ?), par contre pour toi quand tu lis le code tu comprends mieux que ce pour ce paramètre c'est pas toi qui doit passer une valeur remplie (tu passes un pointeur vers un int, mais la valeur de cet int on s'en fout), mais la fonction qui va remplir cette valeur, que tu pourras donc lire à  son retour.


    2) Bon maintenant,  l'usage de la méthode que tu cites pour découper ton intervalle en semaines, heures, minutes, secondes, ce n'est pas forcément l'idéal vu que (1) ton code ne prend pas en compte le NSCalendar courant (bon pour nous on est habitués à  utiliser le calendrier grégorien, mais quand même, pensons à  tout le monde) et (2) il existe une classe NSDateComponents pour ça en Cocoa (qui en plus manipule des NSDate, prenant en compte la Timezone / fuseau horaire & co, et utilise le NSCalendar courant ou celui que tu spécifies)
  • muqaddarmuqaddar Administrateur
    janvier 2011 modifié #3
    Ou là , y'a du niveau là ...  :o
    C'est pas une discussion pour 22h43...

    J'avais lu des choses en anglais dessus tout à  l'heure mais les développeurs n'étaient pas d'accord. La version d'Ali semble pas mal du tout.  :-*
  • FKDEVFKDEV Membre
    04:44 modifié #4
    Le fait de devoir nommer les parametres en objective C rend ces mots clés moins utiles que d'en d'autres langages.
    Je suis plutot contre. Je prefere insister sur un bon nommage des parametres.


    Je pense que le compilateur les ignore mais c'est peut-etre utilisé par les analyses statiques de code.

  • CéroceCéroce Membre, Modérateur
    04:44 modifié #5
    Je viens de chercher dans la doc d'ObjC:

    oneway
    The method is for asynchronous messages and has no valid return type.

    in
    The argument passes information to the remote receiver.

    out
    The argument gets information returned by reference.

    inout
    The argument both passes information and gets information.

    bycopy
    A copy of the object, not a proxy, should be passed or returned.

    byref
    A reference to the object, not a copy, should be passed or returned.


    Selon la doc, cela s'utilise seulement dans les déclarations de protocoles ???
  • zoczoc Membre
    janvier 2011 modifié #6
    L'utilité (car il y en a bien une, ces mots clés ne sont pas ignorés) c'est d'optimiser les transferts réseau lorsqu'on utilise les "Distributed Objects" du runtime objective-c (à  l'aide des classes NSConnection, NSDistantObject et plein d'autres): Un paramètre en "out" ne sera pas transmis à  l'objet distant lors de l'appel d'une méthode.

    Voir: Remote Messaging dans la documentation Objective-C
  • CéroceCéroce Membre, Modérateur
    04:44 modifié #7
    Merci zoc, ça explique beaucoup de choses.
  • AliGatorAliGator Membre, Modérateur
    04:44 modifié #8
    Ah oui bien vu, ça explique pourquoi ça n'est à  utiliser que pour les protocoles (au sens "réseau" du terme, pas au sens du mot clé @protocol du langage ObjC) et les NSProxy, tout ça lié au NSDistributedObjects.

    En effet ça explique beaucoup de choses :)
Connectez-vous ou Inscrivez-vous pour répondre.