Outils pour utilisateurs

Outils du site


issue108:tutoriel1

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
issue108:tutoriel1 [2016/05/11 23:58] erlevoissue108:tutoriel1 [2016/05/12 11:57] (Version actuelle) auntiee
Ligne 1: Ligne 1:
 **In the early days of computers, a company called Digital Equipment Corporation (DEC) created its 32-bit VAX computer using openVMS as its operating system. Because a VAX/VMS computer is so reliable, there are today - after more than 25 years - still a large number of them in use. But, in the end, even these reliable computers will have to be replaced. As described in part 1, you could migrate from VAX/VMS to Linux, as the way Linux works is largely compatible with VAX/VMS. If you use Pascal as your programming language, you will find that Lazarus/Free Pascal is a good replacement. But there are technical functions used in VMS with no apparent replacement in Linux. In this article, I will, among others, describe how to replace mailboxes, and deal with file version numbers and packed arrays of char (strings).** **In the early days of computers, a company called Digital Equipment Corporation (DEC) created its 32-bit VAX computer using openVMS as its operating system. Because a VAX/VMS computer is so reliable, there are today - after more than 25 years - still a large number of them in use. But, in the end, even these reliable computers will have to be replaced. As described in part 1, you could migrate from VAX/VMS to Linux, as the way Linux works is largely compatible with VAX/VMS. If you use Pascal as your programming language, you will find that Lazarus/Free Pascal is a good replacement. But there are technical functions used in VMS with no apparent replacement in Linux. In this article, I will, among others, describe how to replace mailboxes, and deal with file version numbers and packed arrays of char (strings).**
  
-Au début des ordinateurs, une société appelée Digital Equipment Corporation (DEC) créa son ordinateur 32-bit VAX avec open VMS comme système d'exploitation. Comme un ordinateur VAX/VMS est vraiment fiable, aujourd'hui, après plus de 25 ans, ils sont encore très nombreux à être en service. Mais, à la longue, mêmes ces ordinateurs fiables devront être remplacés. Comme décrit dans la partie 1, vous pourriez migrer de VAX/VMS vers Linux, car le fonctionnement de Linux est en grande partie compatible avec VAX/VMS. Si votre langage de programmation est Pascal, vous trouverez que Lazarus/Free Pascal est une bonne alternative. Mais il y a des fonctions techniques dans VMS sans remplacement évident sous Linux. Dans cet article, je décrirai , entre autres, comment je remplace des boîtes aux lettres et comment je traite les numéros de versions des fichiers et les matrices empaquetées de caractères (packed arrays of chars - les chaînes de caractères).+Au début des ordinateurs, une société appelée Digital Equipment Corporation (DEC) créa son ordinateur 32-bit VAX avec OpenVMS comme système d'exploitation. Comme un ordinateur VAX/VMS est vraiment fiable, aujourd'hui, après plus de 25 ans, ils sont encore très nombreux à être en service. Mais, à la longue, mêmes ces ordinateurs fiables devront être remplacés. Comme décrit dans la partie 1, vous pourriez migrer de VAX/VMS vers Linux, car le fonctionnement de Linux est en grande partie compatible avec VAX/VMS. Si votre langage de programmation est Pascal, vous trouverez que Lazarus/Free Pascal est une bonne alternative. Mais il y a des fonctions techniques dans VMS sans remplacement évident sous Linux. Dans cet article, je décrirai, notamment, comment je remplace des boîtes aux lettres et comment je traite les numéros de versions des fichiers et les matrices empaquetées de caractères (packed arrays of chars - les chaînes de caractères).
  
 **Mailboxes **Mailboxes
Ligne 15: Ligne 15:
 Pour l'IPC (interprocess communication - communication entre processus), VMS offre des boîtes aux lettres. Dans Linux, il existe un remplaçant parfait, mais la façon de les créer et utiliser est différente : Pour l'IPC (interprocess communication - communication entre processus), VMS offre des boîtes aux lettres. Dans Linux, il existe un remplaçant parfait, mais la façon de les créer et utiliser est différente :
  
-• Pour créer une boîte aux lettres dans VMS, vous appelez $CREMBX (handle, logical_name, permanent). L'identifiant du lien ouvert vers le (nouveau) dispositif nommé MBAxxxx (xxxx est un nombre entre 0 et 9999), est assigné à « handle ». En utilisant l'argument booléen « permanent », VMS est averti que la boîte aux lettres à créer existera encore quand tous les processus liés à cette boîte seront terminés (sinon, elle est effacée et le contenu est perdu). Le logical_name (nom de logical - voir partie 3) donné est utilisé pour voir si la boîte aux lettres existe encore. VMS le cherchera dans la table LNM$PERMANENT_MAILBOXES ou LNM$TEMPORARY_MAILBOXES, suivant la valeur de « permanent ». S'il le trouve, le logical est « traduit » et la boîte aux lettres vers laquelle il pointe est référencée ; sinon, une nouvelle boîte aux lettres est créée et le logical - pointant vers la boîte nouvellement créée - est créé dans la table mentionnée ci-dessus.+• Pour créer une boîte aux lettres dans VMS, vous appelez $CREMBX (handle, logical_name, permanent). L'identifiant du lien ouvert vers le (nouveau) dispositif nommé MBAxxxx (xxxx est un nombre entre 0 et 9999), est assigné à « handle ». En utilisant l'argument booléen « permanent », VMS est averti que la boîte aux lettres à créer existera encore quand tous les processus liés à cette boîte seront terminés (sinon, elle est effacée et le contenu est perdu). Le logical_name (nom de logical - voir partie 3) donné est utilisé pour voir si la boîte aux lettres existe déjà. VMS le cherchera dans la table LNM$PERMANENT_MAILBOXES ou LNM$TEMPORARY_MAILBOXES, suivant la valeur de « permanent ». S'il le trouve, le logical est « traduit » et la boîte aux lettres vers laquelle il pointe est référencée ; sinon, une nouvelle boîte aux lettres est créée et le logical - pointant vers la boîte nouvellement créée - est créé dans la table mentionnée ci-dessus.
  
 Dans Linux, vous devez d'abord obtenir la clé. Dans les exemples de la documentation, la fonction ftok (file to key - fichier vers clé) est utilisée pour ça. Vous passez la spécification de fichier d'un fichier existant, plus un petit nombre entre 0 et 255, à cette fonction et elle le convertit en un grand nombre, la clé. Si vous passez les mêmes fichier et nombre, vous obtiendrez la même clé. Ceci pourrait suggérer que le contenu de la boîte aux lettres se trouve dans ce fichier, mais ce n'est pas le cas. Le fichier n'est utilisé que pour obtenir une clé unique. La signification de ce fichier peut se comparer au logical utilisé par VMS. Dans Linux, vous devez d'abord obtenir la clé. Dans les exemples de la documentation, la fonction ftok (file to key - fichier vers clé) est utilisée pour ça. Vous passez la spécification de fichier d'un fichier existant, plus un petit nombre entre 0 et 255, à cette fonction et elle le convertit en un grand nombre, la clé. Si vous passez les mêmes fichier et nombre, vous obtiendrez la même clé. Ceci pourrait suggérer que le contenu de la boîte aux lettres se trouve dans ce fichier, mais ce n'est pas le cas. Le fichier n'est utilisé que pour obtenir une clé unique. La signification de ce fichier peut se comparer au logical utilisé par VMS.
Ligne 23: Ligne 23:
 • Now you are ready to send and receive messages. To send data in VMS, you would fill a buffer with data and make a call to $QIO(W) (see part 2) using the handle of the mailbox you want to put the message into, a pointer to the buffer, and the size of the buffer (plus an eventflag, see part 2). To receive data, you would make the same call to $QIO(W), only the function specifier would be “read” instead of “write”. On return, the buffer will be filled with the received message, and the size parameter will be filled with the size of the received message.** • Now you are ready to send and receive messages. To send data in VMS, you would fill a buffer with data and make a call to $QIO(W) (see part 2) using the handle of the mailbox you want to put the message into, a pointer to the buffer, and the size of the buffer (plus an eventflag, see part 2). To receive data, you would make the same call to $QIO(W), only the function specifier would be “read” instead of “write”. On return, the buffer will be filled with the received message, and the size parameter will be filled with the size of the received message.**
  
-Maintenant, vous pouvez créer un lien vers une boîte aux lettres en utilisant cette clé comme identifiant pour obtenir un handle (indicateur). Vous pouvez utiliser deux méthodes : soit créer un fichier factice pour chaque boîte aux lettres que vous voulez utiliser et toujours utiliser 0 comme plus petit nombre, ou utiliser, par exemple le dossier à la base de la version courante de votre projet (voir partie 3), pour disposer d'une boîte aux lettres différente pour chaque projet et assigner une constante (inférieure à 256) à chaque boîte pour avoir une clé unique. Quelle que soit la méthode utilisée, la boîte aux lettres créée sera permanente. Dans Linux, il n'y a pas de boîte aux lettres temporaire. Aussi, soyez bien conscient de cela quand vous démarrez une nouvelle session ; vous pourriez trouvez de vieux messages datant d'un fonctionnement précédent.+Maintenant, vous pouvez créer un lien vers une boîte aux lettres en utilisant cette clé comme identifiant pour obtenir un handle (indicateur). Vous pouvez utiliser deux méthodes : soit créer un fichier factice pour chaque boîte aux lettres que vous voulez utiliser et toujours utiliser 0 comme plus petit nombre, ou utiliser, par exemplele dossier à la base de la version courante de votre projet (voir partie 3), pour disposer d'une boîte aux lettres différente pour chaque version et assigner une constante (inférieure à 256) à chaque boîte pour avoir une clé unique. Quelle que soit la méthode utilisée, la boîte aux lettres créée sera permanente. Dans Linux, il n'y a pas de boîte aux lettres temporaire. Aussi, soyez bien conscient de cela quand vous démarrez une nouvelle session ; vous pourriez trouvez de vieux messages datant d'un fonctionnement précédent.
  
 • Maintenant, vous êtes prêt à envoyer et recevoir des messages. Pour envoyer des données dans VMS, vous rempliriez un tampon (buffer) avec des données et feriez appel à $QIO(W) (voir partie 2) en utilisant le handle de la boîte aux lettres dans laquelle vous voulez placer le message, un pointeur vers le buffer, et la taille du buffer (plus un eventflag, voir partie 2). Pour recevoir des données, vous feriez le même appel à $QIO(W), mais l'indicateur de fonction serait « read » (lire) plutôt que « write » (écrire). En retour, le buffer serait rempli avec le message reçu et le paramètre de taille serait rempli avec la taille du message reçu. • Maintenant, vous êtes prêt à envoyer et recevoir des messages. Pour envoyer des données dans VMS, vous rempliriez un tampon (buffer) avec des données et feriez appel à $QIO(W) (voir partie 2) en utilisant le handle de la boîte aux lettres dans laquelle vous voulez placer le message, un pointeur vers le buffer, et la taille du buffer (plus un eventflag, voir partie 2). Pour recevoir des données, vous feriez le même appel à $QIO(W), mais l'indicateur de fonction serait « read » (lire) plutôt que « write » (écrire). En retour, le buffer serait rempli avec le message reçu et le paramètre de taille serait rempli avec la taille du message reçu.
Ligne 31: Ligne 31:
 Another difference is that, in VMS, you must specify the total size of the mailbox when you create it. In Linux the size is fixed. This might be a problem when using large, or a huge number of, messages.** Another difference is that, in VMS, you must specify the total size of the mailbox when you create it. In Linux the size is fixed. This might be a problem when using large, or a huge number of, messages.**
  
-Pour envoyer des données dans Linux, vous rempliriez un buffer comme dans VMS, mais il y a un entier supplémentaire au début du buffer. La valeur de cet entier sera un nombre différent de zéro ! Ensuite, vous appelleriez sndmsg() avec le handle, un pointeur vers le buffer, et la taille du buffer - sans compter l'entier supplémentaire ! Pour recevoir un message, vous appelleriez rcvmsg() avec les mêmes paramètres plus un identifiant de message. L'identifiant de message est utilisé pour filtrer les messages qui vous sont envoyés, de façon à n'obtenir que les messages dont le nombre correspond à la valeur de l'entier supplémentaire. Si l'identifiant de message est zéro, il n'y aura pas de filtrage. Par exemple : supposez que cinq messages vous ont été envoyés : le message A avec l'entier supplémentaire à 1, B avec 2, C avec 1 à nouveau, D avec 3 et E avec 2 à nouveau. Si vous lancez rcvmsg (...., 2), vous recevrez le message B puis le message E. Ensuite, rcvmsg (..., 3) recevra le message D et, éventuellement, rcvmsg (...., 0) recevra le reste : A et C. Si rcvmsg (...., 4) est envoyé, aucun message ne sera retourné. La taille du message, à nouveau sans compter l'entier supplémentaire, est retourné comme résultat de la fonction.+Pour envoyer des données dans Linux, vous rempliriez un buffer comme dans VMS, mais il y a un entier supplémentaire au début du buffer. La valeur de cet entier sera un nombre différent de zéro ! Ensuite, vous appelleriez sndmsg() avec le handle, un pointeur vers le buffer, et la taille du buffer - sans compter l'entier supplémentaire ! Pour recevoir un message, vous appelleriez rcvmsg() avec les mêmes paramètres plus un identifiant de message. L'identifiant de message est utilisé pour filtrer les messages qui vous sont envoyés, de façon à n'obtenir que les messages dont le nombre correspond à la valeur de l'entier supplémentaire. Si l'identifiant de message est zéro, il n'y aura pas de filtrage. Par exemple : supposez que cinq messages vous ont été envoyés : le message A avec l'entier supplémentaire à 1, B avec 2, C avec 1 à nouveau, D avec 3 et E avec 2 à nouveau. Si vous lancez rcvmsg (...., 2), vous recevrez le message B puis le message E. Ensuite, rcvmsg (..., 3) recevra le message D et, à la longue, rcvmsg (...., 0) recevra le reste : A et C. Si rcvmsg (...., 4) est envoyé, « aucun message » sera retourné. La taille du message, à nouveau sans compter l'entier supplémentaire, est retourné comme résultat de la fonction.
  
 Autre différence : dans VMS, vous devez spécifier la taille totale de la boîte aux lettres quand vous la créez. Dans Linux, la taille est fixée. Ceci peut être un problème si vous utilisez des messages très grands ou très nombreux. Autre différence : dans VMS, vous devez spécifier la taille totale de la boîte aux lettres quand vous la créez. Dans Linux, la taille est fixée. Ceci peut être un problème si vous utilisez des messages très grands ou très nombreux.
Ligne 47: Ligne 47:
 • _CREMBX utilise un logical dédié pour pointer vers un fichier contenant l'information sur les nombres assignés. Ce fichier est aussi utilisé pour créer la clé unique. _CREMBX assigne un nombre quelconque dans la tranche 0-255 si la boîte aux lettres n'existe pas encore. Le logical donné dans la table LNM_PERMANENT_MAILBOXES est utilisé ou créé comme le ferait VMS. Puis, la boîte aux lettres est reliée à la clé ou créée avec elle, et le handle est retourné. • _CREMBX utilise un logical dédié pour pointer vers un fichier contenant l'information sur les nombres assignés. Ce fichier est aussi utilisé pour créer la clé unique. _CREMBX assigne un nombre quelconque dans la tranche 0-255 si la boîte aux lettres n'existe pas encore. Le logical donné dans la table LNM_PERMANENT_MAILBOXES est utilisé ou créé comme le ferait VMS. Puis, la boîte aux lettres est reliée à la clé ou créée avec elle, et le handle est retourné.
 • _QIO(W) recevra ou enverra suivant les paramètres de la fonction. Elle utilise un nouveau fil et l'eventflag spécifié pour créer un comportement asynchrone comme dans VMS (voir partie 2).  • _QIO(W) recevra ou enverra suivant les paramètres de la fonction. Elle utilise un nouveau fil et l'eventflag spécifié pour créer un comportement asynchrone comme dans VMS (voir partie 2). 
-De cette façon, la seule chose à faire pour la migration est de définir le logical dédié mentionné plus haut et d'ajouter un entier supplémentaire au début de la déclaration du buffer. La suppression du logical utilisé pour une boîte aux lettres causerait la création d'une nouvelle boîte au lieu d'une ouverture, tandis que les processus encore connectés utiliseraient l'ancienne, exactement comme VMS.+ 
 +De cette façon, la seule chose à faire pour la migration est de définir le logical dédié mentionné plus haut et d'ajouter un entier supplémentaire au début de la déclaration du buffer. La suppression du logical utilisé pour une boîte aux lettres causerait la création d'une nouvelle boîte à l'ouverture, tandis que les processus encore connectés utiliseraient l'ancienne, exactement comme VMS.
  
 **File version numbers **File version numbers
Ligne 57: Ligne 58:
 Numéros de versions des fichiers Numéros de versions des fichiers
  
-Cette partie concerne les systèmes de fichiers ; au début, il y avait DOS (et CP/M) qui utilisaient FAT comme système de fichiers. Les noms de fichiers étaient sous 8 caractères avec un type de fichier sous 3 caractères. Plus tard, NTFS (New technology File System - Système de Fichiers de Nouvelle Technologie) permit des noms et des types longs, et plus d'attributs pour une meilleure sécurité. Ils utilisaient tous les deux des lettres pour identifier le périphérique (disque). Dans Linux, la plupart du temps, « ext » est utilisé comme système de fichier par défaut, actuellement Ext4. Comme mentionné en partie 3, Linux n'utilise pas de lettre assignée au disque, mais des points de montage. Dans une perspective fonctionnelle, c'est la seule différence avec FAT/NTFS.+Cette partie concerne les systèmes de fichiers ; au début, il y avait DOS (et CP/M) qui utilisaient FAT comme système de fichiers. Les noms de fichiers avaient 8 caractères avec un type de fichier de 3 caractères. Plus tard, NTFS (New Technology File System - Système de Fichiers de Nouvelle Technologie) permit des noms et des types longs, et plus d'attributs pour une meilleure sécurité. Ils utilisaient tous les deux des lettres pour identifier le périphérique (disque). Dans Linux, la plupart du temps, « ext » est utilisé comme système de fichier par défaut, actuellement Ext4. Comme mentionné en partie 3, Linux n'utilise pas de lettre assignée au disque, mais des points de montage. Dans une perspective fonctionnelle, c'est la seule différence avec FAT/NTFS.
  
-Quand DEC a créé ODS-2 (On Disk Structure version 2 - structure sur disque version 2), il a pris une autre approche. Il nomma tous les périphériques (pas seulement les disques) avec deux caractères qui spécifiaient le type, un caractère commençant à A, puis B et ainsi de suite pour identifier l'adaptateur, plus un numéro séquentiel. Le dossier de base (répertoire) sur le disque est nommé [000000] et les noms de fichiers et de types sont longs comme dans NTFS et EXT. Et il décidèrent qu'il y aurait plusieurs versions du même fichier dans le même répertoire (dossier). Un exemple :+Quand DEC a créé ODS-2 (On Disk Structure version 2 - structure sur disque version 2), il a pris une autre approche. Il nomma tous les périphériques (pas seulement les disques) avec deux caractères qui spécifiaient le type, un caractère commençant à A, puis B et ainsi de suite pour identifier l'adaptateur, plus un numéro séquentiel. Le dossier de base (répertoire) sur le disque est nommé [000000] et les noms de fichiers et de types sont longs comme dans NTFS et EXT. Et ils décidèrent qu'il y aurait plusieurs versions du même fichier dans le même répertoire (dossier). Un exemple :
  
 **Suppose I create a text file with an editor and save the file. Besides the name and type that I specify, it will also get a version number, starting with “1”. If I would use the editor to change this file and save it again, the existing file will not be overwritten like in Linux and Windows. The editor creates a new file, with the same name and type, but with a higher version number, “2” in this case. The same happens with log files, executables (programs), and so on. The advantage is that you can see the history of a file and even restore a previous version. For example, if a new version of a program does not work as it should, you can just kill the process and start the previous version, it is still there (unless you deleted it). But of course there is also a down-side: For a thousand versions of a file, you need a thousand times the disk-space and the version is limited to 32767. If you go beyond that, the creating program will crash! **Suppose I create a text file with an editor and save the file. Besides the name and type that I specify, it will also get a version number, starting with “1”. If I would use the editor to change this file and save it again, the existing file will not be overwritten like in Linux and Windows. The editor creates a new file, with the same name and type, but with a higher version number, “2” in this case. The same happens with log files, executables (programs), and so on. The advantage is that you can see the history of a file and even restore a previous version. For example, if a new version of a program does not work as it should, you can just kill the process and start the previous version, it is still there (unless you deleted it). But of course there is also a down-side: For a thousand versions of a file, you need a thousand times the disk-space and the version is limited to 32767. If you go beyond that, the creating program will crash!
Ligne 65: Ligne 66:
 If your project is depending on this behavior (the file version, not the crashing), you will have to change your programs. Either by adding a “version number” to the name or type, or by changing your project in such a way it will no longer depend on the file versions. Whichever solution is best depends on the project and there's no single solution that fits all possibilities.** If your project is depending on this behavior (the file version, not the crashing), you will have to change your programs. Either by adding a “version number” to the name or type, or by changing your project in such a way it will no longer depend on the file versions. Whichever solution is best depends on the project and there's no single solution that fits all possibilities.**
  
-Supposez que je crée un fichier texte dans un éditeur et que je le sauvegarde. À côté du nom et du type que je spécifie, il y aura aussi un numéro de version, commençant à « 1 ». Si j'utilisais l'éditeur pour modifier ce fichier, et le sauver à nouveau, le fichier existant ne serait pas écrasé comme dans Linux ou Windows. L'éditeur crée un nouveau fichier, avec les mêmes nom et type, mais avec un numéro de version plus élevé, « 2 » dans ce cas. La même chose arrive avec les fichiers de log, les exécutables (programmes) etc. L'avantage est que vous pouvez voir l'historique d'un fichier et même restaurer une version précédente. Par exemple, si une nouvelle version de programme ne fonctionne pas comme attendu, vous pouvez juste tuer le processus et démarrer la version précédente, qui est toujours là (sauf si vous l'avez effacée). Mais, bien sûr, ceci a un inconvénient : pour mille versions d'un fichier, vous avez besoin de mille fois l'espace disque et la version est limitée à 32767. Si vous allez au-delà, le programme de création plantera !+Supposez que je crée un fichier texte dans un éditeur et que je le sauvegarde. Outre le nom et le type que je spécifie, il y aura aussi un numéro de version, commençant à « 1 ». Si j'utilisais l'éditeur pour modifier ce fichier, et le sauver à nouveau, le fichier existant ne serait pas écrasé comme dans Linux ou Windows. L'éditeur crée un nouveau fichier, avec les mêmes nom et type, mais avec un numéro de version plus élevé, « 2 » dans ce cas. La même chose arrive avec les fichiers de log, les exécutables (programmes)etc. L'avantage est que vous pouvez voir l'historique d'un fichier et même restaurer une version précédente. Par exemple, si une nouvelle version de programme ne fonctionne pas comme attendu, vous pouvez juste tuer le processus et démarrer la version précédente, qui est toujours là (sauf si vous l'avez effacée). Mais, bien sûr, ceci a un inconvénient : pour mille versions d'un fichier, vous avez besoin de mille fois l'espace disque et la version est limitée à 32767. Si vous allez au-delà, le programme de création plantera !
  
 Si votre projet est sensible à ce comportement (la version de fichier, pas le plantage), vous devrez changer vos programmes. Soit en ajoutant un « numéro de version » aux nom et type, ou en changeant votre projet de telle façon qu'il ne dépende plus des numéros de version. L'une de ces solutions est la meilleure pour votre projet, mais il n'y a pas de solution unique qui réponde à tous les cas. Si votre projet est sensible à ce comportement (la version de fichier, pas le plantage), vous devrez changer vos programmes. Soit en ajoutant un « numéro de version » aux nom et type, ou en changeant votre projet de telle façon qu'il ne dépende plus des numéros de version. L'une de ces solutions est la meilleure pour votre projet, mais il n'y a pas de solution unique qui réponde à tous les cas.
Ligne 89: Ligne 90:
 Next month: In the next article, I will go more in-depth about DCL (Digital Command Language) – the interface used by Digital when interacting with the terminal, and AST's (Asynchronous System Trap), also named ‘call back routines’, and, related to that, catching the signals as a result of pressing ^C, ^Y, ^T or ^Z.** Next month: In the next article, I will go more in-depth about DCL (Digital Command Language) – the interface used by Digital when interacting with the terminal, and AST's (Asynchronous System Trap), also named ‘call back routines’, and, related to that, catching the signals as a result of pressing ^C, ^Y, ^T or ^Z.**
  
-C'est clairement un défaut, mais je n'ai pas le temps de remplir un rapport d'erreur.+C'est clairement un défaut, mais je n'avais pas le temps de remplir un rapport d'erreur.
  
-Comme contournement, vous pouvez ajouter une chaîne d'espaces de même longueur que la taille de la chaîne empaquetée de caractères, car Free Pascal ne se plaindra pas si la chaîne est trop longue. Il va juste la tronquer. Aussi, « STR := 'test' + '          '; » remplira le reste avec des espaces comme dans le Pascal VAX, mais ça doit être fait pour chaque déclaration concernant une chaîne de caractères ! Vous pouvez aussi faire quelque chose d'identique lors d'une comparaison. Il y a beaucoup de travail pour surmonter ce comportement ; aussi, il serait peut-être plus simple - si possible - de passer à un autre type de chaîne. Mais, ensuite, des problèmes surviendront avec le code, suivant la taille de la chaîne empaquetée de caractères, qui sera différente de la taille de son contenu.+Comme contournement, vous pouvez ajouter une chaîne d'espaces de même longueur que la taille de la chaîne empaquetée de caractères, car Free Pascal ne se plaindra pas si la chaîne est trop longue. Il va juste la tronquer. Ainsi, « STR := 'test' + '          '; » remplira le reste avec des espaces comme dans le Pascal VAX, mais ça doit être fait pour chaque déclaration concernant une chaîne empaquetée de caractères ! Vous devez aussi faire quelque chose d'identique lors d'une comparaison. Il y a beaucoup de travail pour surmonter ce comportement ; il serait peut-être plus simple - si possible - de passer à un autre type de chaîne. Mais, ensuite, des problèmes surviendront avec le code, suivant la taille de la chaîne empaquetée de caractères, qui sera différente de la taille de son contenu.
  
-Des problèmes apparaîtront aussi lors de la déclaration d'une chaîne de type C à partir d'une chaîne empaquetée de caractères. Si le reste de la chaîne empaquetée de caractères est zéro (cas classique), le contenu de la chaîne sera affiché « test » dans le débogueur, pour reprendre l'exemple du dessus, mais la longueur de la chaîne sera 10 ; aussi, une comparaison avec « test » échouera. Dans le débogueur, elles ont l'air identiques, mais, à nouveau, c'est la partie « else » de la déclaration « if » qui sera exécutée. Ça m'pris des jours pour découvrir ceci. Cela montre une inconsistance dans la manière avec laquelle Free Pascal manipule les chaînes, car le zéro final est ignoré. Ça mériterait un rapport d'erreur !+Des problèmes apparaîtront aussi lors de la déclaration d'une chaîne de type C à partir d'une chaîne empaquetée de caractères. Si le reste de la chaîne empaquetée de caractères est zéro (cas classique), le contenu de la chaîne sera affiché « test » dans le débogueur, pour reprendre l'exemple du dessus, mais la longueur de la chaîne sera 10 ; aussi, une comparaison avec « test » échouera. Dans le débogueur, elles ont l'air identiques, mais, à nouveau, c'est la partie « else » de la déclaration « if » qui sera exécutée. Il m'fallu des jours pour le comprendre. Cela montre une incohérence dans la manière avec laquelle Free Pascal manipule les chaînes, car le zéro final est ignoré. Ça mériterait un rapport d'erreur !
  
-La mois prochain : Dans le prochain article, j'approfondirai DCL (Digital Command Language - Langage de Commande de Digital) - l'interface utilisée par Digital dans l'interaction avec un terminal et les AST (Asynchronous System Trap - litt., piège système asynchrone), appelées aussi « routines de rappel » (call back routines) et, en rapport avec ça, la capture des signaux résultant de l'appui sur ^C, ^Y, ^T ou ^Z. +La mois prochain : dans le prochain article, j'approfondirai DCL (Digital Command Language - Langage de Commande de Digital) - l'interface utilisée par Digital dans l'interaction avec un terminal et les AST (Asynchronous System Trap - litt., piège système asynchrone), appelées aussi « routines de rappel » (call back routines) et, en rapport avec ça, la capture des signaux résultant de l'appui sur ^C, ^Y, ^T ou ^Z. 
issue108/tutoriel1.1463003918.txt.gz · Dernière modification : 2016/05/11 23:58 de erlevo