Projet mkd/fortran.c

De Wiki EELL.

(Différences entre les versions)
m
m (Fichiers fortran : !!)
 
(9 versions intermédiaires masquées)
Ligne 1 : Ligne 1 :
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement &rarr;]]</small>
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement &rarr;]]</small>
-
:fortran.inc.c à revoir, il n'est pas indépendant !
+
== Fichiers fortran 77 ==
-
<pre>
+
; See tri.c for fortran_90_&+
-
/*E �C�*/
+
* Testé:
-
/** #########################################
+
: fortran.c pour Konsole
-
    #                FORTRAN                #
+
* Non testé:
-
    ######################################### */
+
: fortran.cc pour versions c++ indépendante
-
/* maj: 23/3/89 */
+
: fortran.inc.cc pour inclusion dans le source c++ avec gtkmm
-
/*P maj R3.11 3/1/91 */
+
 
 +
{{Boîte déroulante/début|titre=Fortran ; Updated 2013-05-11}}
 +
* fortran.c f77
 +
<pre style="color:red">
 +
/*P
 +
FILE NAMES: fortran.c for konsole, or fortran.cc or fortran.inc.cc to include
 +
            the file in windowed version of mkd with gtkmm
 +
FUNCTION : fortran_()
 +
 +
PROJECT: mkd
 +
mkd is a UNIX command to extract pre-encoded comments lines to generate the
 +
software documentation according to ISO standards.
 +
mkd is the abbreviation of make documentation. This command was originally
 +
known under the name mkdoc (make documentation).
 +
This command is not integrated into the standard distributions of Unix / Linux
 +
 +
INITIAL PROJECT:
 +
mkdoc 1989 for MS-DOS and UNIX now obsolete. CEM - University of Montpellier II
 +
 +
ADMINISTRATIVE RECORD:
 +
extractdoc 04/12/2009
 +
 +
FILE UPDATE:
 +
Date: ../../1986 by JPL Initial programming for MSDOS and UNIX on SUN
 +
Date: ../../1991 by JPL mkdoc 3.12 for PC and UNIX
 +
Date: 17/04/2013 by Clara; Mise à jour vers UTF-8 et correction de fin de
 +
                    fichier pour version 2013 + introduction de la nouvelle
 +
                    entête mkd* + numérotation des lignes.
 +
Date: 21/04/2013 by JPL Nettoyage du code après les testsb unitaires.
 +
 
 +
*/
 +
// Date: ../../.... by ... purpose of the modification ....
 +
 
 +
/*T
 +
FILE NAMES: fortran.c for konsole, or fortran.cc or fortran.inc.cc to include
 +
            the file in windowed version of mkd with gtkmm
 +
FUNCTION : fortran_()
 +
 +
RECOMMANDED TESTS:
 +
  Cette fonction doit décoder les commentaires style Fortran 77.
 +
  Pour le fortran 90 et ultérieurs Voir NOTES et option -l dans version.h
 +
 
 +
  Dès la version 2013 le caractère de décodage se place en 3 ème colonne
 +
  Comme il est d'usage, ceci contrairement aux versions précédentes où
 +
  le caractère de décodage se plaçait uniquement en 2 ème colonnes.
 +
  Colonne |1|2|3|4|5|6|7|8|9|A|B|C|....To 72
 +
          |C| |O| |C|o|m|m|e|n|t| |....| | | depuis version 2013
 +
          |C|O| |C|o|m|m|e|n|t| | |....| | | toutes versions
 +
          |C| |C|o|m|m|e|n|t| | | |....| | | toutes versions avec Codes '**'
 +
  Notez que le 'Code' peut être placé en 2ème ou 3ème colonne.
 +
 
 +
TETS UNITAIRES:
 +
  Veiller à ce que les commentaires restent à la bonne place quelle que soient
 +
  les colonnes utilisées pour le décodage (2ème ou 3éme colonne) augmenté du
 +
  numéro de ligne.
 +
  Vérifier dans cette nouvelle version, que le numéro de ligne s'écrit
 +
  correctement, sur 5 colonnes.
 +
  Veiller à ce que le fichier cible ne contienne jamais le caractère de fin de
 +
  fichier EOF.
 +
 
 +
  3 cas peuvent se présenter:
 +
  Cas 1 : Codes est '**' tous les caractères doivent être copiés
 +
  Cas 2 : colonne 2 identifie le commentaire de la ligne à copier
 +
  cas 3 : Colonne 2 est un espace et colonne 3 identifie la ligne de commentaire
 +
          à copier
 +
  Vérifiez tous les cas avec les options n,s,t
 +
 
 +
  Testez de la même façon le fortran 90 avec l'option de compilation CD3 = '!'
 +
 
 +
*/
 +
 
 +
// Description de la fonction: (Utile pour le manuel man 3)
 +
/*D
 +
NAME:
 +
  Function: fortran_().
 +
  Files: fortran.c for Kosole or fortran.cc or fortran.inc.cc for included
 +
  file in windowed version with gtkmm
 +
 
 +
SYNOPSIS:
 +
  In UNIX / LINUX environment:
 +
  #include "/usr/include/mkd/version.h" // IMPORTANT: Compilation directives
 +
  #include "/usr/include/mkd/fortran.h" // or mkd.h
 +
  In local environment:
 +
  #include "version.h"
 +
  void fortran_(FILE * pfdoc, FILE * pnfile);
 +
 
 +
DESCRIPTION:
 +
  Fortran 77: (ASCII)
 +
  -------------------
 +
  Originally Fortran programs were written in a fixed column format for the
 +
  cards.
 +
  A letter "C" in column 1 caused the entire card to be treated as a comment
 +
  and ignored by the compiler.
 +
  Usage:
 +
  The comment character begin with the C or c or * in first colomn frequently
 +
  followed by a space and shall not exceed the 72nd colomn for fortran 77.
 +
  The mkd 'Code' character de must by placed in the 2nd or in 3rd colomn.
 +
 
 +
  The golbal variables are 'Codes' and 'Options'.
 +
  The 'Codes': table of 5 characters:
 +
      extern char codes[];
 +
      They must be defined in the calling function:
 +
      char codes[5] = {0,0,0,0,0};
 +
  The 'Options': l,n,s,t.
 +
      see NOTES for inline ! comment
 +
      extern unsigned char n,s,t;
 +
      They must be defined in the calling function:
 +
      unsigned char n=0,s=0,t=0;
 +
  With the options:
 +
  n: The transcript is preceded by line number on 5 colomns. This allows to
 +
      easily reach the commented line. (Warning with the tabs ...)
 +
  s: Add the comment to the screen to use shell redirections > , >> , or ||.
 +
  t: With the t option only the commented text is copied.
 +
      Without the t option the entire line or block is copied.
 +
      The t option permit to generate directly exploitable and publishable
 +
      documents.
 +
 
 +
RETURN VALUE:
 +
  Nothing
 +
 
 +
CONFORMING TO: or STANDARDS:
 +
  POSIX, ANSI C, BSD, ISO/IEC 9899:2011; gcc, MS-Vc10; UTF-8.
 +
 
 +
PORTABILITY:
 +
  LINUX-Debian-systems, LINUX-Red-Hat, Windows NT, etc.
 +
 
 +
COPYRIGHT:
 +
  © Contact: http://edeulo.free.fr/contacts/formmail.php
 +
  © EELL, Éditeurs Européens de Logiciels Libres, 2007
 +
  Association à but non lucratif selon l'Article 11 de la convention européenne
 +
  des droits de l'homme.
 +
 
 +
  AUTHORS:
 +
  Designer: intial JP Louyot (JPL)
 +
  Updates : JPL and Clara Jimenez
 +
  Traducteurs: Clara
 +
 
 +
RESSOURCES:
 +
  gtkmm with mkdw future widowed version.
 +
 
 +
NOTES:
 +
  Update April 2013 the Coded comment begin also in 3rd colomn
 +
 
 +
BUGS:
 +
  See bugs reports http://edeulo.free.fr/phpBB3
 +
 
 +
SEE ALSO:
 +
  Fortran 90:
 +
  -----------
 +
  Character ! is the inline comment starting with this character to NewLine.
 +
  See -l compilation option #define CD3 '!' in version.h
 +
 
 +
  Fortran 2003:
 +
  -------------
 +
  The interface with the C languages are insured with the external module
 +
  ISO_C_BINDING to facilitate access at the C libraries.
 +
 
 +
  mkd for fortran 90 with the -l option: Decode The inline comment '!' if the
 +
  option CD3 are defined with the char '!' in version.h.
 +
  Unix / Linux Man(3) attached in English. Command line : man 3 fortran_
 +
 +
*/
 +
 
 +
/*
 +
// File: fortran.c (Comments for UTF-8 text editor)
 +
void fortran_ (FILE * pfdoc, FILE * pnfile);
 +
*/
 +
</pre>
 +
<pre style="color:blue">
 +
#ifndef GTKMM
 +
  // If GTKMM is not defined then it is a Konsole version
 +
  // when GTKMM is defined the file is included to the compilation
 +
  // *pfdoc and *pnfile are open by the calling function
 +
#include "version.h"
 +
#include "fortran.h"
void fortran_(FILE * pfdoc, FILE * pnfile)
void fortran_(FILE * pfdoc, FILE * pnfile)
-
// FILE *pfdoc, *pnfile;
+
    { /*S fortran */
-
    { /*S fortran */
+
        extern unsigned char n,s,t;
-
    extern unsigned char l,p;
+
        extern char codes[];
-
    extern char codes[];
+
#else
-
     unsigned int num;
+
     { //S Function begin for gtkmm (with fortran.cc included file)
-
    register int c1;
+
#endif
-
    int c2,c3;
+
// #define TESTS
 +
#ifdef TESTS
 +
        int cas1 = 0; //T pour les tests
 +
        int cas2 = 0; //T pour les tests
 +
        int cas3 = 0; //T pour les tests
 +
#endif
 +
        int inbc = 0;      // nombre de caractères sur la pile
 +
        unsigned num = 0; // Numéro de ligne
 +
        unsigned i ;      // Compteur
 +
        int copyflag = 0;  // drapeau commentaire à copier
 +
        register int c0; // entier dans le registre du processeur
 +
        int c1,c2,c3;      // entiers en mémoire vive sur la pile
 +
/*O    initialisation des valeurs sur la pile à NULL */
 +
        c0 = c1 = c2 = c3 = 0;  
-
    num = 0;
+
/*O    tant que l'on n'est pas en fin de fichier source */
-
    c1 = c2 = c3 = STX; /* Start Text */
+
        while ( c0 != EOF && c1 != EOF && c2 != EOF && c3 != EOF )
 +
        { /*S tq !EOF */       
 +
/*O        si début de texte faire c0 = retour chariot */
 +
            if (!c0) c0='\n'; // ceci impose la première colonne
 +
/*O        sinon copier dans le registre c0 le caractère suivant */
 +
            else c0=getc(pnfile);
 +
            if (c0 == EOF) break;
-
/*O   tant que pas fin de fichier source */
+
/*O------- si le char est NL le caractère suivant est en 1ère colonne ------*/
-
        while ( c1 != EOF && c2 != EOF && c3 != EOF )
+
            if (c0=='\n') // précède la première colonne
-
        { /*S tq !EOF */
+
            { /*S colonne 1 */
-
/*O       si debut de texte faire c1=LF */
+
/*O           si suivi par c1 = 'C' ou 'c' ou '*' */
-
          if (c1==STX) c1='\n';
+
              /* et si codes[0]=0 ou si suivi par un espace et un des 5 char
-
/*O       sinon prendre pour c1 le char suivant */
+
              code d'utilisateur */
-
          else c1=getc(pnfile);
+
                num++;
 +
                copyflag = 0;
 +
                c1 = getc(pnfile);
 +
                if (c1 == EOF) break; // quitter si le caractère en 1 ère colonne est EOF
 +
                inbc = 1; // 1 caractère copié sur la pile (c1)
 +
                if (c1 == 'C' || c1 == 'c' || c1 == '*')
 +
                { /*O carte de commentaire */
 +
/*O                si il n'y a pas de 'Code' à décrypter copier tous les commentaires */
 +
                    if ( !codes[0] )
 +
                    { /* Cas 1 copier tous les commentaires ('Code' NULL) */
 +
#ifdef TESTS
 +
    cas1++;
 +
#endif
 +
                        copyflag = 1;
 +
                        if (n) fprintf( pfdoc,"%5d ", num );
 +
/*O                   copier le début de ligne 1 ère colonne si t est invalide */
 +
                        if (!t) putc (c1,pfdoc); // colonne 1
 +
                        else putc (' ',pfdoc); // colonne 2
 +
/*O                    si option s copier de même à la sortie standard */
 +
                        if (s && n) printf("%5d ", num );
 +
                        if (s && !t)putch(c1);
 +
                        if (s && t)putch(' '); // colonne 2
 +
                    } /* Cas 1 copier tous les commentaires ('Code' NULL) */
-
/*O--------- si le char est NL ---------------------------------------------*/
+
/*O               sinon, identifier les codes en 2ème ou 3ème colonne: */
-
              if (c1=='\n')
+
                    else
-
              { /*S colonne 1 */
+
                    { /*S commentaire ok cas 2 ou 3 (avec 'Code')*/
-
              num++;
+
                        c2 = getc(pnfile);
-
/*O          si suivi par c2 = 'C' ou 'c' ou '*'
+
                        if (c2 == EOF) break;
-
                et si codes[0]=0 ou si suivi par un des 5 char code d'utilisateur */
+
                        inbc=2; // 2 caractères copiés sur la pile (c1 + c2)
-
              c2 = getc(pnfile);
+
/*O                   si colonne 2 n'est pas un espace et qu'il y a des 'Codes', identifier */
-
              c3 = getc(pnfile);
+
                        if (c2 != ' ')  
-
              if( (c2 == 'C'||
+
                        { /*S cas 2 si colonne 2 n'est pas un espace */
-
                   c2 == 'c'||
+
#ifdef TESTS
-
                  c2 == '*'
+
    cas2++;
-
                  )
+
#endif
-
                  &&
+
-
                  (!codes[0]||
+
-
                  c3 == codes[0] ||
+
-
                  c3 == codes[1] ||
+
-
                  c3 == codes[2] ||
+
-
                  c3 == codes[3] ||
+
-
                  c3 == codes[4]
+
-
                  )
+
-
                )
+
-
/*O          alors copier les caracteres dans le fichier doc, et si opt s a l'ecran: */
+
                            if (
-
                { /*S*/
+
                                c2 == codes[0] ||
-
/*O            si option n ins‚rer le num‚ro de ligne */
+
                                c2 == codes[1] ||
-
                if(n)
+
                                c2 == codes[2] ||
-
                    { /*S*/
+
                                c2 == codes[3] ||
-
                    fprintf( pfdoc, "%5d ", num);
+
                                c2 == codes[4]
-
                    if(s) printf( "%5d ", num);
+
                              )
-
                    } /*S*/
+
                            copyflag = 1; // copyflag vrai si le code est identifié
-
/*O            si pas option t */
+
-
                if(!t)
+
-
                    { /*S*/
+
-
/*O                copier le debut de ligne */
+
-
                    putc (c2,pfdoc); putc(c3,pfdoc);
+
-
                    if(s)
+
-
                      { /*S si opt s */
+
-
                      putch(c2);putch(c3);
+
-
                      } /*S si opt s */
+
-
                    } /*S*/
+
-
                  else if(!codes[0])ungetc(c3,pnfile);
+
-
/*O            tant que pas fin de ligne */
+
                        } /*S cas 2 si colonne 2 n'est pas un espace */
-
                while ( (c1 = getc(pnfile)) != '\n')
+
/*O                   sinon si la 2ème colonne est un espace identifier la 3 ème colonne */
-
                    { /*S w copy line */
+
                        else if (c2 == ' ')
-
/*O               copier les chars de la ligne */
+
                        { /*S cas 3 colonne 2 est un espace */
-
                    putc (c1,pfdoc);if(s)putch(c1);
+
#ifdef TESTS
-
                    } /*S w copy line */
+
    cas3++;
-
/*O            copier le dernier caractere */
+
#endif
-
                putc (c1,pfdoc);
+
-
                if(s) putch('\n');
+
-
/*O            revenir sur LF du fichier source */
+
-
                ungetc(c1,pnfile);
+
-
                } /*S*/
+
-
/*O          sinon restituer les deux derniers caracteres */
+
-
              else
+
-
                { /*S sinon */
+
-
                ungetc(c3,pnfile);
+
-
                ungetc(c2,pnfile);
+
-
                } /*S sinon */
+
-
              } /*S colonne 1 */
+
 +
                            c3 = getc(pnfile);
 +
                            if (c3 == EOF) break;
 +
                            inbc = 3; // 3 caractères copiés sur la pile (c0 + c1 + c2)
 +
                            if (
 +
                                c3 == codes[0] ||
 +
                                c3 == codes[1] ||
 +
                                c3 == codes[2] ||
 +
                                c3 == codes[3] ||
 +
                                c3 == codes[4]
 +
                              )
 +
                            copyflag = 1; // copyflag vrai si colonne 3 identifiée 'Code'
 +
                        } /*S cas 3 colonne 2 est un espace */
 +
                    } /*S commentaire ok cas 2 ou 3 (avec 'Code')*/
 +
 +
/*O                si le texte est à copier dans le fichier cible: */
 +
                    if (copyflag) // donc pas de EOF dans c0 c1 c2 c3 et 'Code' existe
 +
/*O                alors copier les caractères dans le fichier doc, et si opt s copier à
 +
                  la sortie standard: */
 +
                    { /*S copier */
 +
/*O                    si pas option t et 'Code' présent */
 +
                        if(!t && inbc > 1)
 +
                        { /*S copier le début de la ligne */
 +
/*O                        si n vrai copier le numéro de ligne sur 5 chiffres
 +
                          décimaux */
 +
                            if (n) fprintf( pfdoc,"%5d ", num );
 +
/*O                        copier le début de ligne */
 +
                            putc (c1,pfdoc); // colonne 1
 +
                            if (inbc > 1 ) putc(c2,pfdoc);  // Colonne 2
 +
                            if (inbc == 3) putc(c3,pfdoc);  // 3ème colonne
 +
/*O                        si opt s copier aussi à la sortie standard */
 +
                            if(s)
 +
                            { /*S si opt s copier aussi à la sortie standard */
 +
                                if (n) printf("%5d ", num );
 +
                                putch(c1);
 +
                                if (inbc > 1 ) putch(c2);
 +
                                if (inbc == 3) putch(c3);
 +
                            } /*S si opt s */
 +
                        } /*S copier le début de la ligne */
 +
 +
/*O                    sinon, (option t) et 'Code présent */
 +
                        else if (t && inbc > 1) //w (!codes[0]) // sinon si pas de 'Code'
 +
                        { /*S espaces en début de ligne */
 +
/*w                      si n est vrai, copier le numéro de ligne dans le fichier
 +
                          cible et à la sortie standard */
 +
                          if (n) fprintf( pfdoc,"%5d ", num ); // target file
 +
                          if(s) printf("%5d ", num );          // stdout
 +
/*O                      remplacer les premières colonne  par des espaces */
 +
                          for (i=inbc ; i>0 ; i--)
 +
                          { /*S espaces */
 +
                              putc(' ',pfdoc);
 +
                              if(s)putch(' ');
 +
                          } /*S espaces */
 +
                        } /*S espaces en début de ligne */
 +
 +
/*O                    Dans tous les cas de commentaires la suite du commentaire est à copier */
 +
/*O                    tant que pas fin de ligne et pas EOF (On ne soucie pas du
 +
                      nombre de 72 colonnes) */
 +
                        while ( ( c0=getc(pnfile) ) != '\n' && c0 != EOF )
 +
                        { /*S while copy line */
 +
/*O                        copier les chars de la ligne */
 +
                            putc (c0,pfdoc);
 +
                            if(s)putch(c0);
 +
                        } /*S while copy line */
 +
 +
/*O                    si on est arrivé en fin de fichier avant NL */
 +
                        if ( c0 == EOF )
 +
                        { /* cas EOF */
 +
/*O                        //w copier NL dans le fichier cible et à la sortie standard */
 +
                          //w pas obligatoire car ajoute une ligne vide
 +
                            //w putc ('\n',pfdoc); //w pas obligatoire
 +
                            //w if(s) putch('\n'); //w pas obligatoire
 +
/*O                        interrompre la boucle */
 +
                            break;
 +
                        } /* cas EOF */                 
 +
/*O                    copier le dernier caractère (non EOF, donc NL) */
 +
                        putc (c0,pfdoc);
 +
                        if(s) putch('\n');
 +
/*O                    revenir sur NL du fichier source  pour continuer la boucle en colonne 1 */
 +
                        ungetc(c0,pnfile);
 +
                    } /*S copier */
 +
                } /*O carte de commentaire */
 +
 +
/*O            sinon ne pas copier dans le fichier doc et revenir sur les derniers
 +
              caractères */
 +
                else
 +
                { /*S sinon, pas copier */
 +
                    if (inbc-- == 3) ungetc(c3,pnfile); // 3 caractères copiés
 +
                    if (inbc-- == 2) ungetc(c2,pnfile); // 2 caractères copiés
 +
                    if (inbc-- == 1) ungetc(c1,pnfile); // C en 1ère colonne
 +
                    ungetc(c1,pnfile); // cas NL en 1ère colonne
 +
                } /*S sinon, pas copier */
 +
            } /*S colonne 1 */
 +
            inbc = 0 ; //w pas nécessaire si remis à 0 à la fin des blocs
         } /*S tq !EOF */
         } /*S tq !EOF */
-
    } /*S fortran */
+
#ifdef TESTS
 +
        fprintf( pfdoc, "\nCas 1 tous les commentaires: %5d ", cas1 );
 +
        fprintf( pfdoc, "\nCas 2 colonne 2 sans espace: %5d ", cas2 );
 +
        fprintf( pfdoc, "\nCas 3 colonne 2 avec espace: %5d \n", cas3 );
 +
#endif
 +
        return;
 +
    } /*S fortran */
</pre>
</pre>
 +
{{boîte déroulante/fin}}
 +
 +
== Fichier de commande de tests Konsole ==
 +
 +
* Fichier: Make_Tests_U_f77
 +
* Fichier: Make_Tests_U_f90
 +
 +
{{Boîte déroulante/début|titre=Fichiers de commandes, Avril 2013}}
 +
 +
'''Fichier: Make_Tests_U_f77'''
 +
<pre>
 +
#!/bin/bash
 +
#O Fichier: Make_Tests_U_f77
 +
#O ../../mkd tests under Linux.
 +
#O Epreuve de vérification de la fonction fortran_() avec ../../mkd
 +
 +
#O Tests copier tous les caractères
 +
echo "---- sans numérotation ----" > tst1for.txt
 +
../../mkd -Fa '**' Stats.f tst1for.txt
 +
echo "" >> tst1for.txt
 +
echo "---- avec numérotation ----" >> tst1for.txt
 +
../../mkd -Fan '**' Stats.f tst1for.txt
 +
echo "" >> tst1for.txt
 +
echo "---- avec numérotation et copie stdout ----" >> tst1for.txt
 +
../../mkd -Fans '**' Stats.f tst1for.txt > tst1.stdout.txt
 +
echo "" >> tst1for.txt
 +
echo "---- avec numérotation texte seul et copie stdout ----" >> tst1for.txt
 +
../../mkd -Fants '**' Stats.f tst1for.txt > tst1.stdout.txt
 +
 +
 +
#O Tests avec code '0'
 +
      echo "---- sans numérotation ----" > tst2for.txt
 +
../../mkd -Fa O Stats.f tst2for.txt
 +
echo "" >> tst2for.txt
 +
echo "---- avec numérotation ----" >> tst2for.txt
 +
../../mkd -Fan O Stats.f tst2for.txt
 +
echo "" >> tst2for.txt
 +
echo "---- avec numérotation et copie terminal ----" >> tst2for.txt
 +
../../mkd -Fans O Stats.f tst2for.txt > tst2.stdout.txt
 +
echo "---- avec texte seul ----" >> tst2for.txt
 +
echo "" >> tst2for.txt
 +
../../mkd -Fat O Stats.f tst2for.txt
 +
echo "---- avec texte seul et copie stdout ----" >> tst2for.txt
 +
echo "" >> tst2for.txt
 +
../../mkd -Fats O Stats.f tst2for.txt > tst2.stdout.txt
 +
echo "---- texte seul avec numérotation ----" >> tst2for.txt
 +
echo "" >> tst2for.txt
 +
../../mkd -Fant O Stats.f tst2for.txt
 +
echo "" >> tst2for.txt
 +
echo "---- texte seul avec numérotation et copie stdout ----" >> tst2for.txt
 +
../../mkd -Fants O Stats.f tst2for.txt >> tst2.stdout.txt
 +
 +
#O Tests de fin de fichier
 +
#../../mkd -Fws Stats.f tst_end
 +
 +
#O Afficher dans gedit
 +
gedit tst1for.txt tst1.stdout.txt tst2for.txt tst2.stdout.txt
 +
 +
#O Erase Tests fortran 77
 +
rm *.doc
 +
rm *.o
 +
rm tst1for.txt tst1.stdout.txt
 +
rm tst2for.txt tst2.stdout.txt
 +
 +
</pre>
 +
 +
'''Fichier: Make_Tests_U_f90'''
 +
<pre>
 +
#!/bin/bash
 +
#O ../../mkd tests under Linux.
 +
#O Epreuve de vérification de la compilation CD3 = '!'
 +
 +
echo "tous les commentaires avec '**' " > Degrad.doc
 +
../../mkd -la '**' Degrad.f
 +
../../mkd -lan '**' Degrad.f
 +
../../mkd -lvans '**' Degrad.f Degrad.doc > Degrad.scr.txt
 +
 +
echo "" >> Degrad.doc
 +
echo "tous les commentaires avec 'S' " >> Degrad.doc
 +
../../mkd -la S Degrad.f
 +
../../mkd -lan S Degrad.f
 +
../../mkd -lvans S Degrad.f Degrad.doc >> Degrad.scr.txt
 +
 +
echo "" >> Degrad.doc
 +
echo "tous les textes seuls avec 'S' " >> Degrad.doc
 +
../../mkd -lat S Degrad.f
 +
../../mkd -lant S Degrad.f
 +
../../mkd -lvants S Degrad.f Degrad.doc >> Degrad.scr.txt
 +
 +
gedit Degrad.doc Degrad.scr.txt
 +
 +
rm Degrad.doc Degrad.scr.txt
 +
 +
</pre>
 +
{{boîte déroulante/fin}}
 +
 +
== Analyse du test konsole ==
 +
 +
Fichier: Analyse.txt
 +
 +
{{Boîte déroulante/début|titre=Résultat des tests; analyse Avril 2013}}
 +
<pre>
 +
Fichier: Analyse.text
 +
 +
Analyse du 20/04/2013 par JPL mkd 2013 alpha 1 par Clara
 +
Analyse avec Stats.f
 +
--------------------
 +
Cette analyse concerne la fonction fortran_() du fichier fotran.c
 +
 +
Analyse du cas 1 avec 'Codes' = '**' Copier tous les commentaires
 +
-----------------------------------------------------------------
 +
  mkd -Fa '**' Stats.f tst1for.txt
 +
    Les commentaires sont à la bonne place et tous les commentaires sont copiés
 +
  mkd -Fan '**' Stats.f tst1for.txt
 +
    Les numéros de lignes sur 5 colonnes sont suivis des commentaires
 +
  mkd -Fans '**' Stats.f tst1for.txt > tst1.stdout.txt
 +
    Les commentaires apparaissent correctement au terminal
 +
  mkd -Fants '**' Stats.f tst1for.txt > tst1.stdout.txt
 +
    Résultat conforme. Evidemment dans ce cas le caractère 'Code' apparaît,
 +
    seul le caractère de commentaire en première colonne disparaît
 +
 +
Analyse avec des cas 1 et 2 avec 'Code' = 'O'
 +
---------------------------------------------
 +
  mkd -Fa O Stats.f tst2for.txt
 +
 +
  mkd -Fan O Stats.f tst2for.txt
 +
 +
  mkd -Fans O Stats.f tst2for.txt > tst2.stdout.txt
 +
 +
  mkd -Fat O Stats.f tst2for.txt
 +
 +
  mkd -Fats O Stats.f tst2for.txt > tst2.stdout.txt
 +
 +
  mkd -Fant O Stats.f tst2for.txt
 +
 +
  mkd -Fants O Stats.f tst2for.txt >> tst2.stdout.txt
 +
 +
  Tous les caractères sont à la bonne place et la numérotation des lignes se
 +
  fait correctement sur 5 colonnes.
 +
  La sortie sur stdout redirigé vers les fichier  *. stdout.txt est conforme
 +
 +
Contrôle de fin de fichier
 +
--------------------------
 +
Ce contrôle a été effectué dès l'analyse du cas 1
 +
 +
Résultat conforme pour le fortran 77
 +
 +
 +
FORTRAN 90 avec Degrad.f
 +
 +
L'analyse pour le fortran 90 avec l'option de compilation CD3 = '!' donne des
 +
résultats comparables pour toutes les options n,s,t.
 +
Les numéros des lignes sont à leurs places sur 5 colonnes.
 +
CEPENDANT: Les commentaires sont cependant décalés à gauche de 2 caractères en
 +
cas de texte seul.
 +
</pre>
 +
 +
{{boîte déroulante/fin}}
 +
 +
== Fichiers sources des tests ==
 +
 +
{{Boîte déroulante/début|titre=Stats.f (F77) et Degrad.f F(90) Avril 2013}}
 +
 +
'''Stats.f (Fortran 77)'''
 +
<pre>
 +
cO**********************************************************************
 +
C
 +
C O  STATS.FOR
 +
C
 +
C O        Calculates simple statistics (minimum, maximum, mean, median,
 +
C O        variance, and standard deviation) of up to 50 values.
 +
C
 +
C O        Reads one value at a time from unit 5.  Echoes values and
 +
C O        writes results to unit 6.
 +
C
 +
C O        All calculations are done in single precision.
 +
C
 +
C
 +
cO*********************************************************************
 +
* Bloc de tête 14 lignes commentées suivent 17 lignes commentées avec O
 +
* et 1 avec T en fin de fichier
 +
 +
 +
      DIMENSION DAT(50)
 +
      OPEN(5,FILE=' ')
 +
 +
      N=0
 +
      DO 10 I=1,50
 +
      READ(5,99999,END=20) DAT(I)
 +
      N=I
 +
10  CONTINUE
 +
 +
C O Too many values.  Write error message and die.
 +
 +
      WRITE(6,99998) N
 +
      STOP
 +
 
 +
C O Test to see if there's more than one value.  We don't want to divide
 +
C O by zero.
 +
 +
20    IF(N.LE.1) THEN
 +
 +
C O Too few values. Print message and die.
 +
 +
        WRITE(6,99997)
 +
 +
      ELSE
 +
 +
C O Echo input values to output.
 +
 +
        WRITE(6,99996)
 +
        WRITE(6,99995) (DAT(I),I=1,N)
 +
 +
C O Calculate mean, standard deviation, and median.
 +
 +
        CALL MEAN (DAT,N,DMEAN)
 +
        CALL STDEV (DAT,N,DMEAN,DSTDEV,DSTVAR)
 +
        CALL MEDIAN (DAT,N,DMEDN,DMIN,DMAX)
 +
 +
        WRITE(6,99994) N,DMEAN,DMIN,DMAX,DMEDN,DSTVAR,DSTDEV
 +
 +
      ENDIF
 +
 +
      STOP
 +
 +
99999 FORMAT(E14.6)
 +
99998 FORMAT('0 ********STAT: TOO MANY VALUES-- ',I5)
 +
99997 FORMAT('0 ********STAT: TOO FEW VALUES (1 OR LESS) ')
 +
99996 FORMAT(//,10X,
 +
    +' ******************SAMPLE DATA VALUES*****************'//)
 +
99995 FORMAT(5(1X,1PE14.6))
 +
99994 FORMAT(///,10X,
 +
    +' ******************SAMPLE STATISTICS******************',//,
 +
    +15X,'          Sample size = ',I5,/,
 +
    +15X,'          Mean        = ',1PE14.6,/,
 +
    +15X,'          Minimum    = ',E14.6,/,
 +
    +15X,'          Maximum    = ',E14.6,/
 +
    +15X,'          Median      = ',E14.6,/
 +
    +15X,'          Variance    = ',E14.6,/
 +
    +15X,'          St deviation= ',E14.6////)
 +
 +
      END
 +
 +
C O Calculate the mean (XMEAN) of the N values in array X.
 +
 +
      SUBROUTINE  MEAN (X,N,XMEAN)
 +
      DIMENSION X(N)
 +
 +
      SUM=0.0
 +
      DO 10 I=1,N
 +
        SUM=SUM+X(I)
 +
  10 CONTINUE
 +
 +
      XMEAN=SUM/FLOAT(N)
 +
 +
      RETURN
 +
      END
 +
 +
C O Calculate the standard deviation (XSTDEV) and variance (XVAR)
 +
C O of the N values in X using the mean (XMEAN).
 +
C O This divides by zero when N = 1.
 +
 +
      SUBROUTINE STDEV (X,N,XMEAN,XSTDEV,XVAR)
 +
      DIMENSION X(N)
 +
 +
      SUMSQ=0.0
 +
      DO 10 I=1,N
 +
        XDIFF=X(I)-XMEAN
 +
        SUMSQ=SUMSQ+XDIFF*XDIFF
 +
  10 CONTINUE
 +
 +
      XVAR=SUMSQ/FLOAT(N-1)
 +
      XSTDEV=SQRT(XVAR)
 +
 +
      RETURN
 +
      END
 +
 +
 +
C O Calculate the median (XMEDN), minimum (XMIN), and maximum (XMAX) of
 +
C O the N values in X.
 +
C O MEDIAN sorts the array and then calculates the median value.
 +
 +
      SUBROUTINE MEDIAN (X,N,XMEDN,XMIN,XMAX)
 +
      DIMENSION X(N)
 +
 +
      CALL SORT (X,N)
 +
 +
      IF(MOD(N,2).EQ.0) THEN
 +
        K=N/2
 +
        XMEDN=(X(K)+X(K+1))/2.0
 +
      ELSE
 +
        K=(N+1)/2
 +
        XMEDN=X(K)
 +
      ENDIF
 +
 +
      XMIN=X(1)
 +
      XMAX=X(N)
 +
 +
      END
 +
 +
C O Sort the N values in array X.  SORT uses a bubble sort
 +
C O that quits when no values were exchanged on the last pass.
 +
C O Each pass goes from the first element to where the last
 +
C O exchange occurred on the previous pass.
 +
 +
      SUBROUTINE SORT (X,N)
 +
      DIMENSION X(N)
 +
 +
      IBND=N
 +
  20  IXCH=0
 +
   
 +
      DO 100 J=1,IBND-1
 +
          IF(X(J).GT.X(J+1))THEN
 +
              TEMP=X(J)
 +
              X(J)=X(J+1)
 +
              X(J+1)=TEMP
 +
              IXCH=J
 +
          ENDIF
 +
100  CONTINUE
 +
 +
      IF (IXCH.EQ.0) RETURN
 +
      IBND=IXCH
 +
      GO TO 20
 +
 
 +
      END
 +
CT Fin
 +
</pre>
 +
 +
'''Degrad.f (Fortran 90)'''
 +
<pre>
 +
      PROGRAM DEGRAD  !S Début de programme
 +
!                                                                     
 +
!S Imprime une table de conversion degrés -> radians                   
 +
!S =================================================                   
 +
!                                                                     
 +
!S Déclaration des variables                                           
 +
      INTEGER DEG
 +
      REAL RAD, COEFF
 +
!                                                                     
 +
!S En-tête de programme                                               
 +
      WRITE ( *, 10)
 +
  10 FORMAT      (' ',20('*') /                                        &
 +
    &            ' * Degres * Radians *' /                            &
 +
    &            ' ', 20('*') )                                     
 +
!                                                                     
 +
!S Corps de programme                                                 
 +
      COEFF = (2.0 * 3.1416) / 360.0
 +
      DO DEG = 0, 90
 +
        RAD = DEG * COEFF
 +
        WRITE ( *, 20) DEG, RAD
 +
  20 FORMAT        (' *  ',I4,'  * ',F7.5,' *')
 +
      END DO
 +
!                                                                     
 +
!S Fin du tableau                                                     
 +
      WRITE ( *, 30)
 +
  30 FORMAT      (' ',20('*') )
 +
!                                                                     
 +
!S Fin de programme                                                   
 +
      STOP
 +
      END PROGRAM DEGRAD
 +
CS Fin
 +
!S Fin
 +
</pre>
 +
{{boîte déroulante/fin}}
 +
[[Catégorie:Générateurs de documentation]]
[[Catégorie:Générateurs de documentation]]

Version actuelle en date du 11 mai 2013 à 14:04

Retour aux fichiers en développement →

Sommaire

Fichiers fortran 77

See tri.c for fortran_90_&+
  • Testé:
fortran.c pour Konsole
  • Non testé:
fortran.cc pour versions c++ indépendante
fortran.inc.cc pour inclusion dans le source c++ avec gtkmm

Fichier de commande de tests Konsole

  • Fichier: Make_Tests_U_f77
  • Fichier: Make_Tests_U_f90

Analyse du test konsole

Fichier: Analyse.txt

Fichiers sources des tests

Outils personnels