4D v16.3Précisions de syntaxe |
||
|
4D v16.3
Précisions de syntaxe
Précisions de syntaxe
Le compilateur suit la syntaxe habituelle des commandes 4D et, en ce sens, ne vous demande aucun comportement particulier dans l’optique de la compilation. Cette section propose cependant certains rappels et quelques précisions :
Pour les routines opérant sur les chaînes, seule la fonction Character code réclame une attention plus particulière. Lorsque vous travaillez en mode interprété, vous pouvez indifféremment passer une chaîne non vide ou vide à cette fonction. SEND VARIABLE(LaVariable) Souvenez-vous simplement qu’il faudra toujours relire une variable d’un type dans une variable de même type. Supposons que vous souhaitiez envoyer une liste de variables dans un fichier. Afin de ne pas prendre de risque de changement de type par inattention, nous vous recommandons d’adopter une méthode de travail simple qui consiste à indiquer en début de liste le type des variables envoyées. Ainsi, lorsque vous relirez ces variables, vous commencerez toujours par récupérer cet indicateur dont vous connaissez le type. Ensuite, vous appellerez RECEIVE VARIABLE en toute connaissance de cause par l’intermédiaire d’un Au cas ou. Exemple : SET CHANNEL(12;"LeFichier") Field(Ptr_Champ) ou (NoDeTable;NoDeChamp)
Nous rappellerons simplement que la référence d’un document renvoyée par les fonctions Open document, Append document et Create document est de type Heure. Mod(LaValeur;Diviseur) L’expression “25 modulo 3” peut s’écrire de deux façons différentes dans 4D : LaVariable:=Mod(25;3) ou LaVariable:=25%3 Il existe pour le compilateur une différence entre ces deux écritures : Mod s’applique à tous les types de numériques tandis que l’opérateur % s’applique exclusivement aux Entiers et Entiers longs (si les opérandes de l’opérateur % dépassent les limites des Entiers longs, le résultat renvoyé sera probablement faux). IDLE Pour la gestion des interruptions, le langage de 4D dispose de la commande IDLE. Cette commande devra être utilisée lorsque vous vous servirez de la commande ON EVENT CALL. On pourrait définir cette commande comme une directive de gestion des événements. En revanche, dans le cas où vous attendez un événement sans rien faire, comme dans une boucle d’attente, il est bien évident qu’aucun appel n’est effectué. `Méthode projet ClicSouris Dans ce cas, vous ajouterez la directive IDLE de la façon suivante : `Méthode projet Attente Cette commande ne doit être utilisée que dans des méthodes projet d’interception d’erreurs. Cette commande fonctionne comme en mode interprété, sauf dans une méthode ayant été appelée par l’une des commandes suivantes : EXECUTE FORMULA, APPLY TO SELECTION et _o_APPLY TO SUBSELECTION. Il convient d’éviter cette situation. Sept routines de 4D sont utilisées par le compilateur pour déterminer le type d’un tableau. Il s’agit de : COPY ARRAY(TableauSource;TableauDestination) COPY ARRAY admet deux paramètres de type Tableau. Lorsque le compilateur rencontre cette commande pendant le typage et que l’un des paramètres tableau n’est pas déclaré ailleurs, le compilateur déduit le type du tableau non déclaré suivant le type de celui qui l’est.
Le compilateur étant rigoureux sur les types, un COPY ARRAY ne peut se faire que d’un tableau d’un type vers un tableau de même type. $Taille:=Size of array(TabEntier)
De même que pour 4D en mode interprété, ces quatre commandes n’exigent pas de déclaration de tableau. Le tableau non déclaré recevra le même type que le champ spécifié dans la commande. SELECTION TO ARRAY([LaTable]ChampEntier;LeTableau) le type de LeTableau sera donc Tableau d’Entiers à une dimension. Dans le cas où le tableau a déjà été déclaré, veillez à ce que les champs soient du même type. Bien qu’Entier, Entier long et Réel soient des types voisins, vous ne pouvez pas supposer qu’il soient équivalents. Il en est de même dans le cas des champs de type Texte : vos directives sont prioritaires. La commande SELECTION TO ARRAY admet aussi une seconde syntaxe : Les commandes LIST TO ARRAY et ARRAY TO LIST ne concernent que deux types de tableaux :
Le compilateur ne peut pas, durant le typage ou la compilation, détecter un conflit de type dans le cas où vous utiliseriez des pointeurs dépointés comme paramètre de commande de déclaration d’un tableau. Si vous écrivez : SELECTION TO ARRAY([LaTable]LeChamp;LePointeur->) où LePointeur-> représente un tableau, le compilateur ne peut vérifier que le type du champ et du tableau sont identiques. Il vous appartient d’éviter alors ce type de conflit. Pour cela, le compilateur vous fournit une aide précieuse : les Warnings. Chaque fois qu’il rencontre une routine de déclaration de tableau dans laquelle l’un des paramètres est un pointeur, il vous délivre un message vous invitant à la vigilance. Si vous souhaitez compiler une base de données qui utilise des tableaux locaux (tableaux visibles uniquement par les méthodes qui les ont créés), il est nécessaire de les déclarer explicitement dans 4D avant de les utiliser. La déclaration explicite d’un tableau signifie l’utilisation d’une commande de type ARRAY REAL, ARRAY INTEGER, etc. Par exemple, si une méthode génère un tableau local d’entiers contenant 10 valeurs, vous devez écrire au préalable la ligne suivante :
Get pointer(NomVariable) Get pointer est une fonction qui retourne un pointeur sur le paramètre que vous lui avez passé. Supposons que vous vouliez initialiser un tableau de pointeurs. Chacun des éléments de ce tableau pointe vers une variable donnée. Ces variables sont au nombre de douze et nous les appelons V1, V2, …V12. Vous pourriez écrire : ARRAY POINTER(Tab;12) Vous pouvez aussi écrire : ARRAY POINTER(Tab;12) A la fin de l’exécution de cette séquence, vous récupérez un tableau de pointeurs dont chaque élément pointe sur une variable Vi. Ces deux séquences sont bien entendu compilables. Toutefois, si les variables V1 à V12 ne sont pas utilisées explicitement ailleurs dans la base, le compilateur ne pourra pas les typer. Il vous faut donc les nommer ailleurs explicitement.
C_LONGINT(V1;V2;V3;V4;V5;V6;V7;V8;V9;V10;V11;V12)
V1:=0 Chaque variable de la base compilée n’ayant qu’un seul type, la fonction Type peut sembler d’un intérêt limité. Elle est cependant très précieuse lorsqu’on travaille avec des pointeurs. En effet, il peut être nécessaire de connaître le type de la variable pointée par un pointeur, la souplesse des pointeurs faisant que l’on ne sait pas toujours sur quoi ils pointent. La commande EXECUTE FORMULA, historique dans 4D, présente des avantages en mode interprété qui n’ont pas grand sens en mode compilé. Soit la séquence suivante : i:=FctFormulaire Elle peut être remplacée par : i:=FctFormulaire Examinons maintenant un deuxième cas : $Num:=ChoixImprimante Ici, l’EXECUTE FORMULA peut être facilement remplacé par un Au cas ou : Case of La commande EXECUTE FORMULApeut toujours être avantageusement remplacée. En effet, la méthode à exécuter est prise dans la liste des méthodes projet de la base ou des commandes 4D, qui sont en nombre limité. En conséquence, il est toujours possible de remplacer la commande EXECUTE FORMULAsoit par un Au cas ou, soit par une autre commande. Ces deux commandes, précieuses en mode interprété, n’ont pas de fonction en mode compilé. Vous pouvez cependant les laisser dans vos méthodes : TRACE et NO TRACE seront simplement ignorées par le compilateur. Undefined(LaVariable) Compte tenu du processus de typage par le compilateur, une variable ne peut à aucun moment être indéfinie en mode compilé. En effet, toutes les variables ont une existence dès la fin de la compilation. La fonction Undefined retourne donc toujours Faux, quel que soit le paramètre que vous lui passez. Note : Pour savoir si une application tourne en mode compilé, utilisez la fonction Is compiled mode. En mode interprété, après l’exécution d’un LOAD VARIABLES, vous pouvez savoir si le document existe en testant si l’une des variables, théoriquement lue, est indéfinie ou non. Ceci n’est bien évidemment plus possible avec le compilateur, puisque la fonction Undefined renvoie toujours Faux. La méthode la plus simple pour réaliser cette opération en mode interprété comme en mode compilé est la suivante : Var1:="xxxxxx" Cette routine admet deux syntaxes différentes en mode interprété : Pour un tableau LeTableau dont les éléments sont de type Entier, CLEAR VARIABLE(LeTableau) équivaut à l’une des expressions suivantes : ARRAY INTEGER(LeTableau;0) La seconde syntaxe, CLEAR VARIABLE("a"), n’est pas compatible avec le compilateur puisque celui-ci accède aux variables non par leur nom, mais par leur adresse mémoire. Les commandes suivantes ont un point commun : elles admettent toutes un premier paramètre [LaTable] facultatif alors que le second paramètre peut être un pointeur. Il est parfaitement possible en mode compilé de garder ce caractère optionnel au paramètre [LaTable]. Le compilateur fait toutefois une supposition dans le cas où le premier paramètre passé à l’une de ces commandes est un pointeur. Ne pouvant pas savoir sur quoi pointe ce pointeur, il suppose qu’il s’agit d’un pointeur de Table. Prenons par exemple le cas de la commande QUERY dont la syntaxe est la suivante : QUERY(LePtrChamp->=True) le compilateur va chercher en deuxième élément de formule un symbole représentant un champ. Or, il trouvera le signe "=". Il délivrera un message d’erreur, ne pouvant identifier la commande avec une expression qu’il sait traiter. En revanche, si vous écrivez : QUERY(LePtrTable->;LePtrChamp->=True) ou QUERY([LaTable];LePtrChamp->=True) vous levez toute ambiguïté. Les commandes dont le premier paramètre [laTable] est facultatif et dont le second paramètre est également facultatif présentent une particularité lors de l'utilisation de pointeurs. Dans ce contexte, pour des raisons internes l'utilisation en tant que paramètre d'une commande retournant un pointeur (par exemple Current form table) n'est pas autorisée par le compilateur (une erreur est générée). C'est le cas, par exemple, de la commande FORM SCREENSHOT. Le code suivant fonctionnera en mode interprété mais sera rejeté en cas de compilation : //provoque une erreur à la compilation Dans ce cas, il suffit d'utiliser une variable intermédiaire afin que le même code soit validé par le compilateur : //code équivalent compilable Si vous créez vos propres ressources 4DK# (constantes), assurez-vous que les numériques soient de type Entier long (L) ou Réel (R) et les alphas de type Chaîne (S). Tout autre type génèrera un Warning.
Voir aussi
Conseils d’optimisation
|
PROPRIÉTÉS
Produit : 4D
HISTORIQUE
UTILISATION DE L'ARTICLE
4D - Langage ( 4D v16) |