Lokale Variable in 'na Funktion -> Call by valueÄh, was? Kannst du das nochmal klarer formulieren?
Globale (mit var eingeleitet) -> Call by reference ?!
Eine andere Möglichkeit gibt es in Pascal nicht.
Nochmal: egal was du machst, du kannst als Rückgabetyp kein Array verwenden.
Ich hab jetz keine Funktion mehr, sondern halt eine Prozedur. Die arbeitet ja nur was ab und muss nichts zurückgeben....(Wobei sie das ja irgendwo doch halb macht. Wenn ich die Prozedur aufrufe und ihr als 1. Parameter eine globale Variable gebe, diese in der Prozedur verwendet wird, und als die globale wieder rauskommt.)
Vll dumme Frage, aber wieso kann man eigentlich überhaupt globale Variablen in Funktionen mit var ... festlegen? Die sind doch schon festgelegt, man könnte sie doch weglassen..
Ich denk ich hab noch immer nicht verstanden, was du mir sagen willst. Ob nun global oder lokal - is doch so oder so ein array.
Letztendlich sollen die Sortierfunktionen ausgelagert werden in eine unit.
Ich hab jetzt 2 Programme die funktionieren, jedoch (imo) ohne Call by Reference-Funktion sondern mit normalen Prozeduren arbeiten.
Das Problem ist nun, das ich bei der Auslagerung mein tarray wieder definieren muss und dort keine variablen für anfang und ende feslgelegt bekomme. Innerhalb der Funktionsparameter geht das ja, aber nicht im Deklarationsteil der Unit.
Im mom siehts wie folgt aus (bubblesort, ripplesort im prinzip das gleiche):
Prog1:
Code:
program sorttest;
uses crt;
const a=1;e=10;
var i:integer;
x:array[a..e] of real;
procedure bubblesort;
var swap:real;
i,j:integer;
begin
for i:=a to e-1 do
begin
for j:=i+1 to e do
begin
if x[i]>x[j] then
begin
swap:=x[i];
x[i]:=x[j];
x[j]:=swap;
end;
end;
end;
end;
begin
clrscr;
randomize;
write('unsortie. ');
for i:=a to e do begin x[i]:=random(100)+1; write(i,'.',x[i]:2:0,'; '); end;
writeln;write('sortiert: ');
bubblesort;
for i:=a to e do write(i,'.',x[i]:2:0,'; ');
readln;
end.
prog2:
Code:
program sorttest;
uses crt;
const a=1;e=10;
type tarray=array[a..e] of real;
var i:integer;
x:tarray;
procedure bubblesort(var x:tarray;a,e:integer);
var swap:real;
i,j:integer;
begin
for i:=a to e-1 do
begin
for j:=i+1 to e do
begin
if x[i]>x[j] then
begin
swap:=x[i];
x[i]:=x[j];
x[j]:=swap;
end;
end;
end;
end;
begin
clrscr;
randomize;
write('unsortie. ');
for i:=a to e do begin x[i]:=random(100)+1; write(i,'.',x[i]:2:0,'; '); end;
writeln;write('sortiert: ');
bubblesort(x,a,e);
for i:=a to e do write(i,'.',x[i]:2:0,'; ');
readln;
end.
Da ich ja auf parameter angewiesen bin, kann ich nur das 2. nehmen, wo ich mein tarray verwenden muss.
Die Unit sieht dann wie folgt aus:
Code:
unit sort;
interface
uses crt;
type tarray=array[a..e] of real; {macht er nicht, nur mit zb 1..10}
var i:integer;
procedure bubblesort(var x:tarray;a,e:integer); {ein array[..] of kann ich wieder nicht nehmen, obwohl es ja kein rückgabewert ist. keine ahnung wie sich das nun nennt, aber ich habs verstanden, geht nicht. :D}
implementation
procedure bubblesort(var x:tarray;a,e:integer);
var swap:real;
i,j:integer;
begin
for i:=a to e-1 do
begin
for j:=i+1 to e do
begin
if x[i]>x[j] then
begin
swap:=x[i];
x[i]:=x[j];
x[j]:=swap;
end;
end;
end;
end;
begin
end.
Dachte erst noch du meinst, ich soll als Rückgabewert eine andere Funktion angeben. Aber da war ich wohl auf dem Holzweg.
Nochmal zu dem CallbyReference. Im Gegensatz zum CbV nimmt er den Speicherplatz (oder wie man es nennen mag) der Hauptprogvariable, und kopiert den Wert nicht auf einen neuen. Wie soll mir das nun dabei helfen, ihm doch noch ein var array zu verkaufen? (unter var in der Zeile nach der Prozedurdeklaration stehen nur lokale, die nicht aus dem oder in das Hauptprog übergeben werden..?!!)
Und dann noch 2 Fragen:
Kann ich irgendwie Programmteile einfach auslagern und per Befehl wieder dort einfügen, quasi wie include() oder require() bei php?
Und kann ich Pixelgrafiken irgendwie im Grafikmodus von TP verwenden, hab schon nach alternativen Grafikunits gesucht, aber bin nicht fündig geworden. Hieß immer man muss in TP Pixeln. Das wären dann einige hundert Zeilen..
lg, Thundy
Zuletzt bearbeitet: