<

  Introduction à Scilab
5. Appel d'Ada depuis Scilab


Scilab permet d’exécuter un programme écrit en Ada1 qui

Au retour du programme Ada, le programme Scilab peut lire les fichiers créés ou modifiés par Ada.

De plus, nous pouvons afficher dans la console de Scilab toutes les sorties écran du programme Ada.

Notons que les données en Scilab et en Ada doivent être du même format. Comme Scilab a des réels double précision, on travaillera en nombre réelé, c’est-à-dire on codera les entiers en réels, et en Ada on aura le type Float pour les données.

Nous donnons ci-après les listings en Ada et en Scilab des programmes qui permettent la communication entre Scilab et Ada.

Échange des fichiers texte

Les programmes suivants permettent l’échange du fichier Texte.TXT, qui est un fichier texte, entre Scilab et Ada.
Le programme en Ada est le suivant

--------------------------------------------
--
--  Fichier séquentiel texte
--  *  écrit en Scilab;
--  *  lu en Ada;
--  *  modifié en ADA, et
--  *  récupéré par Scilab
--
--------------------------------------------

with Text_Io;
use  Text_Io;
WITH Ada.Float_Text_IO;
WITH Ada.Integer_Text_IO;
WITH Ada.Text_IO;

procedure Texte is

   F : File_Type;
   S : String (1..180);
   L : Integer;
   V : Float;

   package Fio is new Float_Io(Float);

BEGIN

   Ada.Text_IO.Put(''         ****  AFFICHAGE ADA ****'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.New_Line;

   --  Lecture du fichier Texte.TXT créé par Scilab
   Ada.Text_IO.Put(''Affichage fichier Scilab'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.Put(''------------------------'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.New_Line;
   Open (F,In_File,''Texte.TXT'');
   Get_Line (F,S,L);
   Ada.Text_IO.Put(''Première ligne :  '');
   Ada.Text_IO.Put_Line (S(1..L));
   Fio.Get (F,V);
   Ada.Text_IO.Put(''Deuxième ligne :  '');
   Ada.Float_Text_IO.Put (Item =>V, Fore => 10);
   Ada.Text_IO.New_Line;
   Ada.Text_IO.New_Line;
   Close (F);


-- Ecriture du fichier Texte.TXT
    L := 39;   -- Longueur du texte de la première ligne du fichier
   S(1..L):=''Passage fichier texte d'ADA vers Scilab'';
   V := V + 10.0;
   Ada.Text_IO.Put(''Nouveau fichier écrit par Ada'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.Put(''-----------------------------'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.New_Line;
   Ada.Text_IO.Put(''Première ligne :  '');
   Ada.Text_IO.Put_Line (S(1..L));
   Ada.Text_IO.Put(''Deuxième ligne :  '');
   Ada.Float_Text_IO.Put (Item =>V, Fore => 10);
   Ada.Text_IO.New_Line;
   Ada.Text_IO.New_Line;

   Open (F,Out_File,''Texte.TXT'');
   Put_Line (F,S(1..L));
   Fio.Put (f,V);
   Put_Line (f,'''');
   Close (F);

end Texte;

Le programme correspondant en Scilab est le suivant :

//  Echange d'un fichier texte entre Scilab et Ada

// Ecriture du fichier
  ft = mopen  (''Texte.TXT'',''w'');
  disp(''****  Affichage Scilab'');
  s='' -- Passage fichier texte de Scilab vers Ada --'';
  disp(''Première ligne du fichier'');
  disp (s);
  mfprintf (ft,''%s\n'',s);
  val = %pi;
  disp(''Deuxière ligne du fichier'');
  disp (val);
  mfprintf (ft,''%f\n'',val);
  mclose (ft);

// Appel du programme Ada
//  v = host (''texte.exe'')  // Si =0 ==> opération correcte
  unix_w (''texte.exe'');

// Lecture du fichier modifié par Ada
  ft = mopen  (''Texte.TXT'',''r'');
  s1=mgetl (ft,1);
  disp(''****  Affichage Scilab du retour d ADA'');
  disp(''Première ligne du fichier'');
  disp (s1);
  s2=mgetl (ft,1);
  val=sscanf (s2,''%f'');
  disp(''Deuxière ligne du fichier'');
  disp (val);
  mclose (ft);

Notons qu’il faut compiler le programme Ada avant de l’appeler par Scilab. En effet scilab appelle l’exécutable de ce programme.

Si dans Scilab nous utilisons, pour l’appel du programme Ada, la commande host(NomProgrammeEnAda.exe) le programme sera exécuté mais les affichages d’Ada n’apparaîtront pas à la console de Scilab. Si on veut que ces affichages apparaissent, il faut utiliser la commande uix_w(NomProgrammeEnAda.exe) .

Échange des fichiers séquentiels binaires

Comme pour les fichiers texte, on peut aussi échanger des fichiers binaires entre Scilab et Ada. Nous donnons les listings des programmes qui font l’échange du fichier Data.DAT, qui est un fichier séquentiel. La démarche pour un fichier binaire en accès direct est a même. Le programme en Ada est le suivant :

--------------------------------------------
--
--  Fichier séquentiel binaire
--  *  \UNICODE{0xe9}crit en Scilab;
--  *  lu en Ada;
--  *  modifié en ADA, et
--  *  récupéré par Scilab
--
--------------------------------------------

WITH Ada.Float_Text_IO;
WITH Ada.Text_IO;
with Sequential_io;

procedure Data is

   package sio is new Sequential_Io(Float);

   F : sio.File_Type;
   T : array (1..10) of Float;

begin

   Ada.Text_IO.Put(''         ****  AFFICHAGE ADA ****'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.New_Line;

   --  Lecture du fichier Data.DAT créé par Scilab
   Ada.Text_IO.Put(''Affichage fichier Scilab'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.Put(''------------------------'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.New_Line;
   Sio.Open (F,Sio.In_File,''Data.DAT'');
   for I in 1..10 loop
      Sio.Read (F,T(I));
      Ada.Float_Text_IO.Put (Item =>T(I), Fore => 6, Aft => 0, Exp => 0);
   end loop;
   Sio.Close (F);
   Ada.Text_IO.New_Line;

-- Ecriture du fichier Data.DAT
   for I in 1..10 loop
      T(I):=10.0+T(I);
   end loop;

   Ada.Text_IO.Put(''Nouveau fichier écrit par Ada'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.Put(''-----------------------------'');
   Ada.Text_IO.New_Line;
   Ada.Text_IO.New_Line;

   Sio.Open (F,Sio.Out_File,''Data.DAT'');
   for I in 1..10 loop
      Sio.Write (F,T(I));
      Ada.Float_Text_IO.Put (Item =>T(I), Fore => 6, Aft => 0, Exp => 0);
   end loop;
   Sio.Close (F);
   Ada.Text_IO.New_Line;
   Ada.Text_IO.New_Line;

end Data;

Le programme Scilab est le suivant :

//  Aler-retour d'un fichier binaire séquentiel entre Scilab et Ada

  t=[];
  for i=1:10 do
    t(i)=i;
  end;
  t=t';  // Ada renvoie un vecteur ligne
  disp(''****  Affichage Scilab'');
  disp (t);

// Ecriture du fichier
  fd = mopen  (''Data.DAT'',''wb'');
  mput (t,''f'',fd);
  mclose (fd);

// Appel du programme Ada
  unix_w (''data.exe'');

// Lecture du fichier modifié par Ada
  fd = mopen  (''Data.DAT'',''rb'');
  t=mget (10,''f'',fd);
  mclose (fd);

  disp(''****  Affichage Scilab du retour d ADA'');
  disp (t);

1
et aussi en Fortran ou en Java

Ce document a été traduit de LATEX par HEVEA