TP7 - ripplesortprogramm - function mit arrays und so

Thundy

Mitglied
Äh, was? Kannst du das nochmal klarer formulieren?
Lokale Variable in 'na Funktion -> Call by value
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. :rolleyes:

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.. :D


lg, Thundy
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
Hi.

Die ganze Problematik hat absolut nichts mit lokalen und globalen Variablen zu tun. Das du der Funktion dort eine globale Variable als Parameter übergibst ist mehr oder weniger nur Zufall.

Der Punkt ist lediglich, dass bei Call-By-Reference eine Referenz zu der Variablen an die Funktion/Prozedur übergeben wird und so deren Wert in der Funktion/Prozedur geändert werden kann.

Als Beispiel: jeder Mitarbeiter einer Firma muss seinen Urlaub in einer Datei eintragen.

Call-By-Value: man schickt die Datei per Email an jeden Mitarbeiter. Jeder trägt sich ein und schickt die Kopie zurück. Bei n Mitarbeitern erhält man n Kopien die man dann miteinander in eine einzelne Datei kombinieren muss.

Call-By-Reference: man schickt eine Email an alle Mitarbeiter mit der Information wo die Datei abgelegt ist (die Referenz) und der Bitte das jeder sich einträgt. Auf diese Weise wird die Datei direkt geändert und man verbraucht weniger Resourcen (kein Dateianhang, keine Kopien).

In einer Unit kannst du im Allgemeinen keine Angaben über die Größe des Arrays machen. Du darfst die Dimension des Arrays in Turbo Pascal bei Funktions/Prozedurparametern weglassen:
[pascal]procedure bubblesort(var x: array of real;a,e:integer);[/pascal]

In Turbo Pascal kann man andere Dateien so einbinden:
[pascal]{$I dateiname.inc}[/pascal]
Gruß
 

Thundy

Mitglied
Sorry, dass ich mich so lange nicht gemeldet hab.

Danke dir deepthroat, mit der Erklärung (denk ich) hab ichs kapiert! :p

Die andern Problemlösungen funktionieren auch.


Was noch bleibt ist das auslesen aller dateien in einem verzeichnis (oder die anzahl der dateien), da ich nur funktionen finden konnte, die den erstbesten bzw nächsten datei zurückliefern. (zb auch *.sav)
:google:<<doof

lg