TP7 - ripplesortprogramm - function mit arrays und so

Thundy

Mitglied
Hallo,

ich bitte euch mal kurz nen Blick auf mein Prog zu werfen:

Habe Probleme mit lokalen/globalen Variablen und dem arraytyp.

Geht schon in Z6 los, wo er beim ersten Parameter statt 'arr:array[a..e] of real' gleich das 'of' anstelle '[a..e]'..erwartet Oo.. komm nun jedenfalls nicht mehr weiter mit der Syntax. :confused:

Programm ansich sollte selbsterklärend sein. Ansonsten kurz fragen.. :D
Code:
program sorttest;
uses crt;
var a,e,i:integer; {anf,ende,zaehler}
       x:array[1..10] of real;

  function ripplesort(arr:array[a..e] of real;a,e:integer):array[a..e] of real;
  var sortiertok:shortint;
         swap:real;
         i:integer;
  begin
    repeat
      sortiertok:=1;
      for i:=a to e do
      begin
        if arr[i+1]<arr[i] then
        begin
          sortiertok:=0;
          swap:=arr[i];
          arr[i]:=arr[i+1];
          arr[i+1]:=swap;
        end;
      end;
    until sortiertok=1;
    {return arr;}
  end;

begin
    a:=1;
    e:=10;
    randomize;
    for i:=a to e do begin x[i]:=random(100)+1; writeln(x[i]); end;
    ripplesort(x,a,e);
    for i:=a to e do writeln(x[i]);
end.

wenn ich die funktionsdeklaration wie folgt ändere (wegen fehlermeldung) schließt sich TP beim ausführen.
Code:
function ripplesort(arr:array of real;a,e:integer):real;


lg, Thundy
 
Zuletzt bearbeitet:

vop

Erfahrenes Mitglied
Hi

Deklariere dir im Kopf vor Zeile 3
Code:
TYPE
  TMeinArray = array[1..10] of real;


verwende dann in der Funktionsdeklaration sowie in Zeile 4 den Typ TMeinArray etwa so
Code:
// Zeile 4:
  x:TMeinArray;
// Funktionsdeklaration:
function ripplesort(arr:TMeinArray;a,e:integer):TMeinArray;
Das sollte helfen
 

Thundy

Mitglied
Code:
program sorttest;
uses crt;
var a,e,i:integer; {anf,ende,zaehler}
type tarray = array[1..10] of real; {typarray für function result typ}
var x:tarray;
 
  function ripplesort(arr:tarray;a,e:integer):tarray;
  var sortiertok:shortint;
         swap:real;
         i:integer;
  begin
    repeat
      sortiertok:=1;
      for i:=a to e do
      begin
        if arr[i+1]<arr[i] then
        begin
          sortiertok:=0;
          swap:=arr[i];
          arr[i]:=arr[i+1];
          arr[i+1]:=swap;
        end;
      end;
    until sortiertok=1;
    {return arr;}
  end;
 
begin
    a:=1;
    e:=10;
    randomize;
    for i:=a to e do begin x[i]:=random(100)+1; writeln(x[i]); end;
    ripplesort(x,a,e);
    for i:=a to e do writeln(x[i]);
end.
Code:
 Error 34: Invalid function result type

type tarray=real;
var x:array[1..10] of tarray;

//geht auch nicht, da sonst function result wieder nur real wäre.. :/
:rolleyes:

:(

schade, aber danke, war nen guter versuch!
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
Hi.

In Pascal dürfen Rückgabetypen von Funktionen nur einfache Typen sein.

Du solltest das Array aber als Referenz (per var) übergeben können.

Gruß
 

Thundy

Mitglied
Hi,

hab leider keinen Plan, was du meinst oder wie das funktionieren soll.

Die Suche nach Stichwörtern wie 'Pascal Referenz' liefert (wie erwartet) nicht das was ich brauche. In den Inhaltsverzeichnissen verschiedener Referenzen bin ich leider auch nicht fündig geworden (Referenz, Vereinbarungsteil, Variablen, Deklarationsteil, ..).

Hast du ein Beispiel dazu? (oder eine Seite, wo ich mich informieren kann?)

lg
 

deepthroat

Erfahrenes Mitglied
[pascal]procedure ripplesort(var arr:tarray;a,e:integer);
var sortiertok:shortint;
swap:real;
i:integer;
begin
...
end;[/pascal]
Such mal nach "call by reference".

Gruß
 

Thundy

Mitglied
also wenn meine globalen variablen VAR1 und VAR2 heißen, ich sie der funktion übergebe:
aufruf:
Code:
FUNKTION(VAR1,VAR2);

Code:
deklaration: function FUNKTION(VARa,VARb);

und innerhalb der funktion VARa modifiziere ist das 'call by value' und wenn ich VAR1 modifiziere 'call by reference'?
somit modifizier ich den wert den ich außerhalb brauch, ohne ihn extra als rückgabewert zu haben?
Also VARa und -b muss ich dann als lokal definieren?!

verwirrend.

Ich kann auch einfach anstelle der Funktion eine Prozedur setzen, dann t ja alles, aber so mag ich das nicht.. und das oben würd ich schon gern verstehen.
Code:
procedure ripplesort(var arr:tarray;a,e:integer);

oder ich leg garkeine lokalen variablen mehr fest:
Code:
program sorttest;
uses crt;
type tarray=array[1..10] of real;
var a,e,i:integer; {anf,ende,zaehler}
    x:tarray;

  procedure ripplesort(x:tarray;a,e:integer); {komischer weise will er hier immer noch 
kein x:array[a..e] of real.. Oo ..und wenn ich das of daraus einfach weg lasse zeigt er komische ascii-zeichen an oder geht zu.. :D}
  var sortiertok:shortint;
         swap:real;
         i:integer;
  begin
    repeat
      sortiertok:=1;
      for i:=a to e do
      begin
        if (x[i+1]<x[i]) then
        begin
          sortiertok:=0;
          swap:=x[i];
          x[i]:=x[i+1];
          x[i+1]:=swap;
        end;
      end;
    until sortiertok=1;
    {return arr;}
  end;
 
begin
    clrscr;
    a:=1;
    e:=10;
    randomize;
    write('unsortie.');
    for i:=a to e do begin x[i]:=random(100)+1; write(x[i]:4:0,' '); end;
    writeln;write('sortiert:');
    ripplesort(x,a,e);
    for i:=a to e do write(x[i]:4:0,' ');
    readln;
end.


...nur damit bekomme ich vor und nach der sortierung die gleiche richtige reihenfolge ausgegeben. -.-
scheinbar, wenn ich aufs var in der prozedurendeklaration verzichte, ändert er meine werte schon bevor ich die funktion aufrufe...(theoretisch aber nachdem sie generiert werden.) is das logisch begründbar?
(mit var läufts)
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
also wenn meine globalen variablen VAR1 und VAR2 heißen, ich sie der funktion übergebe:
aufruf: FUNKTION(VAR1,VAR2);
deklaration: function FUNKTION(VARa,VARb);
und innerhalb der funktion VARa modifiziere ist das 'call by value' und wenn ich VAR1 modifiziere 'call by reference'?
somit modifizier ich den wert den ich außerhalb brauch, ohne ihn extra als rückgabewert zu haben?
Also VARa und -b muss ich dann als lokal definieren?!
Äh, was? Kannst du das nochmal klarer formulieren?
Allerdings.
Ich kann auch einfach anstelle der Funktion eine Prozedur setzen, dann t ja alles, aber so mag ich das nicht..
Eine andere Möglichkeit gibt es in Pascal nicht.
oder ich leg garkeine lokalen variablen mehr fest:
Das hat nichts mit den lokalen Variablen zu tun.
[pascal]
program sorttest;
uses crt;
type tarray=array[1..10] of real;
var a,e,i:integer; {anf,ende,zaehler}
x:tarray;

procedure ripplesort(x:tarray;a,e:integer); {komischer weise will er hier immer noch
kein x:array[a..e] of real..[/pascal]
Nochmal: egal was du machst, du kannst als Rückgabetyp kein Array verwenden.

Du kannst höchstens einen Zeiger auf das Array zurückgeben. Aber ob das eleganter ist als Call-By-Reference...

Gruß