Difference between revisions of "Passing Pascal Types to C Routines/fr"

From Lazarus wiki
Jump to navigationJump to search
(Created page with "{{Passing_Pascal_Types_to_C_Routines}} ==Problème== A number of standard Pascal types do not have equivalents in C. Nevertheless, sometimes one may want to pass a variable...")
 
Line 14: Line 14:
 
|-
 
|-
 
! Shortstring
 
! Shortstring
| By value on x86, by reference elsewhere || By reference || By reference|| Apple's Universal Interfaces have several routines expecting Pascal strings as value parameters. They are declared as arrays of char on the C side, which have to be passed by reference. A downside of passing them by reference is that the call-by-value semantics cannot be guaranteed (i.e., the C-routine can modify the string)
+
| Par valeur sur x86 || Par référence || Par référence || Les interfaces universelles d'Apple ont plusieurs routines qui attendent des chaînes Pascal comme paramètres de valeur. Ils sont déclarés comme des tableaux de caractères du côté C, qui doivent être passés par référence. Un inconvénient de les passer par référence est que la sémantique d'appel par valeur ne peut pas être garantie (c'est-à-dire que la routine C peut modifier la chaîne)
 
|-
 
|-
! Small sets (<= 32 elements)
+
! Petits ensembles (<= 32 éléments)
| By value || By value || By value || Since such sets are 4 bytes large, it does not make sense to pass them by reference
+
| Par valeur || Par valeur || Par valeur || depuis que de tels ensemblesfont 4 octets de large, ça n'a pas de sens de les passer par référence
 
|-
 
|-
! Large sets (32 < x < 256 elements)
+
! Grands ensembles (32 < x < 256 éléments)
| By value on x86, by reference elsewhere || By value on x86, by reference elsewhere || ? || A similar argument as for shortstrings could be made, in that the C equivalent will probably be an array. In either case, it should become the same for x86 and the rest.
+
| Par valeur sur x86, par référence partout ailleurs || Par valeur sur x86, par référence partout ailleurs || ? || Un argument similaire aux shortstrings pourait être fait, en ce que l'équivalent C sera probablement un tableau. Dans les deux cas, cela devrait devenir pareil pour x86 et le reste.
 
|-
 
|-
! Method pointer
+
! Pointeur de méthode
| By value on x86, by reference elsewhere || By value on x86, by reference elsewhere || ? || ? Should become the same on x86 and the rest.
+
| Par valeur sur x86, par référence partout ailleurs || Par valeur sur x86, par référence partout ailleurs || ? || ? Devrait devenir identique sur x86 et le reste.
 
|}
 
|}

Revision as of 13:06, 30 April 2022

English (en) français (fr)

Problème

A number of standard Pascal types do not have equivalents in C. Nevertheless, sometimes one may want to pass a variable of such a type to an external C routine. The question is how to pass such variables to such routines, given that it is impossible to write an equivalent C program to check what C compilers do.

We therefore have to define our own standards, in order to ensure that the same conventions are followed on all supported architectures (which was not the case when this article was started). Note that the table below only applies to functions declared as "cdecl", Pascal functions (may) use other calling conventions.

Généralité

Type Comment il est passé en 2.0.2 Comment il est passé en 2.1.1+ Comment il est pourrait être passé Raisonnement
Shortstring Par valeur sur x86 Par référence Par référence Les interfaces universelles d'Apple ont plusieurs routines qui attendent des chaînes Pascal comme paramètres de valeur. Ils sont déclarés comme des tableaux de caractères du côté C, qui doivent être passés par référence. Un inconvénient de les passer par référence est que la sémantique d'appel par valeur ne peut pas être garantie (c'est-à-dire que la routine C peut modifier la chaîne)
Petits ensembles (<= 32 éléments) Par valeur Par valeur Par valeur depuis que de tels ensemblesfont 4 octets de large, ça n'a pas de sens de les passer par référence
Grands ensembles (32 < x < 256 éléments) Par valeur sur x86, par référence partout ailleurs Par valeur sur x86, par référence partout ailleurs ? Un argument similaire aux shortstrings pourait être fait, en ce que l'équivalent C sera probablement un tableau. Dans les deux cas, cela devrait devenir pareil pour x86 et le reste.
Pointeur de méthode Par valeur sur x86, par référence partout ailleurs Par valeur sur x86, par référence partout ailleurs ? ? Devrait devenir identique sur x86 et le reste.