ich wollte mir mal Funktionen anschauen, da ich glaube das sie sehr sinnvoll sind.
Im Internet hab ich aber nicht wirkliche Anleitungen gefunden, nur so 5 zeilige Beispiele quasi ohne Variablen.
Zur Übersichtlichkeit halber will ich meine Funktionen in eine extra Unit machen, damit ich sie auch in anderen Programmen benutzen kann.
Wie ich es mir fast schon gedacht habe will Lazarus die Unit aber nicht kompilieren.
Zuerst meint Lazarus, dass ich unbedingt "function xy: typ" machen muss.
Aber wieso brauche ich diese Ausgabe (wenn ich das so richtig sehe)?
Zum zweiten akzeptiert er meinen mehrdimensionalen Array nicht.
Ohne diesen ist das nutzlos.
Als drittes finde ich leider nirgends eine richtige Anleitung wie ich die Länge von mehrdimensionalen Arrays festlege.
Gut, evtl. liegt es daran, dass man nicht im Code "Array von x nach y" machen kann aber sonst wüsste ich auch nicht wie ich für alle Elemente der ersten Dimension die gleiche Menge an Elementen für die zweite Dimension festlege ohne eine for do Schleife zu benutzen.
MfG und danke im Vorraus,
9Strike
PS: Die Funktionen dienen dazu einer "Map" aus einem zweidimensionalen Array (MapSizeInit) zufällig verteilte Werte zu geben (MapRanCreate) und diese dann zu "glätten" (MapSmooth) das es keine große Differenzen zwischen zwei Feldern gibt. Zu Debug zwecken soll man sich die Werteverteilung in einer Textdatei speichern können um die Anzahl der Glättvorgänge besser anzupassen (MapOutput).
Code: Alles auswählen
unit Cube;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
var
nmax, nmin, emax, emin: integer;
implementation
function Cube_MapSizeInit(map: array of array of integer; xmin, xmax, ymin, ymax: integer);
begin
emin:=xmin;
emax:=xmax;
nmin:=ymin;
nmax:=ymax;
setlength(map, xmin..xmax,ymin..ymax);
end;
function Cube_MapRanCreate(map: array of array of integer; p, x: integer; a, b: real);
var
n, e: integer;
begin
for n:=nmax downto nmin do
for e:=emin to emax do
if random(a*100)>p-1
then
map[e,n]:=trunc(b*x)
else
map[e,n]:=0;
end;
function Cube_MapSmooth(map: array of array of integer, x: integer);
var
t, n, e: integer;
smap: array of array of integer;
begin
setlength(smap, emin..emax,nmin..nmax);
smap[emax,nmax]:=map[emax,nmax];
smap[emax,nmin]:=map[emax,nmin];
smap[emin,nmax]:=map[emin,nmax];
smap[emin,nmin]:=map[emin,nmin];
for e:=emin+1 to emax-1 do
begin
smap[e,nmax]:=trunc((map[e-1,nmax]+map[e,nmax]+map[e+1,nmax])/3);
smap[e,nmin]:=trunc((map[e-1,nmin]+map[e,nmin]+map[e+1,nmin])/3);
end;
for n:=nmax[n-1]-1 downto nmin+1 do
begin
smap[emin,n]:=trunc((map[emin,n-1]+map[emin,n]+map[emin,n+1]])/3);
smap[emax,n]:=trunc((map[emax,n-1]+map[emax,n]+map[emax,n+1]])/3);
end;
for t:=1 to x do
for n:=nmax-1 downto nmin+1 do
for e:=emin+1 to emax-1 do
smap[e,n]:=trunc((map[e-1,n+1]+map[e,n+1]+map[e+1,n+1]+map[e-1,n]+map[e,n]*2+map[e+1,n]+map[e-1,n-1]+map[e,n-1]+map[e+1,n-1])/10);
for n:=nmax downto nmin do
for e:=emin to emax do
map[e,n]:=smap[e,n];
end;
function Cube_MapOutput(map: array of array of integer; filename: string);
var
n, e: integer;
tf: textfile;
begin
assignfile(tf, filename);
rewrite(tf);
for n:=nmax downto nmin do
begin
for e:=emin to emax do
write(tf, map[e,n]:4);
writeln(tf);
end;
closefile(tf);
end;
end.