Fonction C -> pascal ?

muqaddarmuqaddar Administrateur
00:13 modifié dans Actualités #1
Béjir,

Dites, c'est quoi ce genre de fonctions C qui commencent pas "pascal" ? Jamais vu !

pascal OSErr mySGDataProc(SGChannel c, <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ptr p,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long len,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long *offset,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long chRefCon,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TimeValue time,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; short writeType, <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long refCon);<br />

Réponses

  • BruBru Membre
    00:13 modifié #2
    Le langage C et le langage PASCAL différent dans la façon dont les paramètres sont passés entre 2 fonctions.

    En PASCAL, tous les paramètres sont déposés sur la pile, l'éventuelle valeur de retour devant être placée au début.

    En C, le paramètre de retour est toujours dans un registre du proc. Les paramètres d'envoi sont passés soit dans les autres registres, ou dans dans un bloc mémoire dont l'adresse est passé dans un registre.

    Donc, une fonction C qui appelle une fonction qui a été compilée en PASCAL doit respecter la convention PASCAL de passage des paramètres. C'est la directive pascal qui l'indique.

    .
  • muqaddarmuqaddar Administrateur
    00:13 modifié #3
    Bein ça alors...
    Je crois que je vais relire ton message 3 fois. ;)

    Et c'ets quoi ce OSErr ? Erreur de retour éventuelle ?
  • ChachaChacha Membre
    00:13 modifié #4
    dans 1129819319:

    En C, le paramètre de retour est toujours dans un registre du proc.

    Tu es sûr de ça ? ça me paraà®t improbable dans la mesure ou la valeur de retour peut être une struct.

    +
    Chacha
  • VeillardVeillard Membre
    00:13 modifié #5
    Sous Carbon, on avait quelquechose du style "OSStatus err" qui permettait de renvoyer un message d'erreur si nécessaire :
    <br />OSStatus err<br /><br />&nbsp; &nbsp; err = CreateNibReference(CFSTR(&quot;logbook&quot;), &amp;myNib);<br />&nbsp; &nbsp; &nbsp; &nbsp; if (! err)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CreateWindowFromNib(myNib, CFSTR(&quot;Edit&quot;), &amp;editWindow);<br />
    
  • muqaddarmuqaddar Administrateur
    00:13 modifié #6
    Oui, je crois que c'est du carbon en fait.
    merci le crabe
  • BruBru Membre
    00:13 modifié #7
    dans 1129820479:

    dans 1129819319:

    En C, le paramètre de retour est toujours dans un registre du proc.

    Tu es sûr de ça ? ça me paraà®t improbable dans la mesure ou la valeur de retour peut être une struct.


    2 cas peuvent se présenter :

    1- la valeur de retour est un long-long (64 bits) : dans ce cas, 2 registres sont utilisés pour stocker cette valeur (typiquement R3 -poids fort- et R4 -poids faible- sur plateforme PPC).

    2- la valeur de retour est une struct ou union : ici, c'est bien un pointeur qui est utilisé. Le pointeur est stocké dans R3 et doit être créé avant l'appel de la fonction (la création du bloc mémoire/pointeur est réalisée de manière transparente par GCC).

    .
Connectez-vous ou Inscrivez-vous pour répondre.