Funktioner med textsträng av antagen längd som resultat

Jag har inte tidigare diskuterat funktioner med textsträng av antagen längd som resultat, engelska "assumed character length functions". Detta var tydligen lyckat eftersom de nu står på "dödslistan".

En diskussion av begreppet finns därför nu här.

När de så småningom försvinner är det enkelt att koda om dem som subrutiner. Flera alternativ för detta ges nedan.

Exempel på funktion

Ett naturligt exempel på en funktion med textsträng av antagen längd som resultat är en funktion som byter ut stora bokstäver i ett ord mot små. För enkelhets skull behandlar jag endast ord som enbart innehåller de stora engelska bokstäverna, samt eventuella avslutande blanka. Genom att lägga in en del IF-satser i slingan i funktionen kan exemplet generaliseras. Exemplet finns även tillgängligt som en separat fil.
PROGRAM SMAA_B_FUNKTION
IMPLICIT NONE
CHARACTER(LEN=20) STORA_B
CHARACTER(LEN=20) SMAA_B

	STORA_B = 'BOEIN'

	WRITE(*,*) SMAA_B(STORA_B)

END

CHARACTER(LEN=*) FUNCTION SMAA_B(STORA_B)
IMPLICIT NONE
	INTEGER I
	CHARACTER(LEN=*) STORA_B
        INTEGER LAENGD
	LAENGD = LEN(TRIM(STORA_B))
	SMAA_B = ' '
	DO I = 1, LAENGD
           SMAA_B(I:I) = ACHAR(IACHAR(STORA_B(I:I))+32)
	END DO
END FUNCTION SMAA_B
Utmatningen från detta program blev boein.

Två speciella saker bör noteras.

Exemplet som subrutin

Som rekommenderas (eftersom ovanstående metod är på väg ut ur Fortran) konverterar jag nu exemplet till en subrutin. Exemplet finns även tillgängligt som en separat fil.
PROGRAM SMAA_B_SUBRUTIN
IMPLICIT NONE
CHARACTER(LEN=20) STORA_B
CHARACTER(LEN=20) SMAA_B

	STORA_B = 'BOEIN'
	CALL BYT(STORA_B, SMAA_B)
	WRITE(*,*) SMAA_B

END

SUBROUTINE BYT(STORA_B, SMAA_B)
IMPLICIT NONE
CHARACTER(LEN=*) STORA_B, SMAA_B
INTEGER I, LAENGD
	LAENGD = LEN(TRIM(STORA_B))
	SMAA_B = ' '
	DO I = 1, LAENGD
           SMAA_B(I:I) = ACHAR(IACHAR(STORA_B(I:I))+32)
	END DO
END SUBROUTINE BYT

I varje fall på Cray är nollställningen av SMAA_B i början av subrutinen nödvändig för att undvika "skräp" i positionerna svarande mot avslutande blanka. Längden av textsträngen SMAA_B i subrutinen är hela tiden den som specificerats i den anropande rutinen (här huvudprogrammet).

Generaliseringar ges i övningen nedan.

Övning

Skriv om subrutinen ovan så att den byter även de svenska stora Å Ä Ö mot de små å ä ö, samt gör ingenting med tecken som ej är stora bokstäver.

Tyvärr visas inte de svenska bokstäverna längre ordentligt i dessa lösningar.

Lösning med IF-satser.

Lösning med CASE-sats.


Senast modifierad: 3 maj 1999 och 3 juni 2014
boein@nsc.liu.se