begin real x, y, z; outstring(1, "Berechnung der Hypotenuse eines rechtwinkligen Dreiecks\n"); outstring(1, "Länge der ersten Kathete: "); inreal(0, x); outstring(1, "Länge der zweiten Kathete: "); inreal(0, y); outstring(1, "Länge = "); outreal(1, sqrt(x ** 2 + y*y)); outstring(1, "\n") end
Compilierung mit:
marst main.alg -o main.c gcc main.c -lalgol -lm -o main
Der Compiler ist in der Lage, Prozeduren und Funktionen separat zu übersetzen.
Hier wird eine Funktionsprozedur separat definiert und separat compiliert.
real procedure hyp(x, y); real x, y; begin hyp := sqrt(x*x + y*y); end hyp;
In der Datei, in der die separat compilierte Prozedur verwendet werden soll, wird ihre vollständige Spezifikation niedergeschrieben. Ihr Anwendungsblock wird allerdings durch das Schlüsselwort code ersetzt:
real procedure hyp(x, y); real x; real y; code; begin real x, y, z; outstring(1, "Berechnung der Hypotenuse eines rechtwinkligen Dreiecks\n"); outstring(1, "Länge der ersten Kathete: "); inreal(0, x); outstring(1, "Länge der zweiten Kathete: "); inreal(0, y); outstring(1, "Länge = "); outreal(1, hyp(x, y)); outstring(1, "\n") end
Compilierung:
marst hyp.alg -o hyp.c marst main.alg -o main.c gcc main.c hyp.c -lalgol -lm -o main
...
Eine Projektstruktur und das zugehörige Makefile
Makefile
ALGOL = marst CC = gcc EXTENSION = alg SRCDIR = src CSRCDIR = csrc OBJDIR = obj NAME = main LDFLAGS = -lalgol -lm SOURCES := $(shell find $(SRCDIR) -name '*.$(EXTENSION)') CSRC := $(SOURCES:$(SRCDIR)/%.$(EXTENSION)=$(CSRCDIR)/%.c) OBJ := $(SOURCES:$(SRCDIR)/%.$(EXTENSION)=$(OBJDIR)/%.o) compile: $(NAME) $(NAME): $(OBJ) $(CC) $(OBJ) -o $(NAME) $(LDFLAGS) $(OBJDIR)/%.o: $(CSRCDIR)/%.c mkdir -p $(OBJDIR) $(CC) $(INCPATH) $(CFLAGS) -c $< -o $@ $(CSRCDIR)/%.c: $(SRCDIR)/%.$(EXTENSION) mkdir -p $(CSRCDIR) $(ALGOL) $< -o $@ clean: rm -f $(OBJDIR)/*.o rm -f $(CSRCDIR)/*.c rm -f $(NAME) .SECONDARY: $(CSRC) .PHONY: clean
Verzeichnisse
Dateien im Verzeichnis src
main.alg
real procedure hyp(x, y); real x; real y; code; begin real x, y, z; outstring(1, "Berechnung der Hypotenuse eines rechtwinkligen Dreiecks\n"); outstring(1, "Länge der ersten Kathete: "); inreal(0, x); outstring(1, "Länge der zweiten Kathete: "); inreal(0, y); outstring(1, "Länge = "); outreal(1, hyp(x, y)); outstring(1, "\n") end
hyp.alg
real procedure hyp(x, y); real x, y; begin hyp := sqrt(x*x + y*y); end hyp;