tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
1532
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Thundy Thundy ist offline Mitglied
    Registriert seit
    Aug 2008
    Beiträge
    22
    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.

    Programm ansich sollte selbsterklärend sein. Ansonsten kurz fragen..

    Code pascal:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    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 pascal:
    1
    
      function ripplesort(arr:array of real;a,e:integer):real;

    lg, Thundy
    Geändert von Thundy (07.06.09 um 19:17 Uhr)
     

  2. #2
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    Hi

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


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

  3. #3
    Thundy Thundy ist offline Mitglied
    Registriert seit
    Aug 2008
    Beiträge
    22
    Code pascal:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    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.
    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.. :/




    schade, aber danke, war nen guter versuch!
    Geändert von Thundy (08.06.09 um 20:50 Uhr)
     

  4. #4
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    Hi

    Der TYPE-Block muß vor dem VAR-Block stehen.

    Tausche Zeile 3 und 4
     

  5. #5
    Thundy Thundy ist offline Mitglied
    Registriert seit
    Aug 2008
    Beiträge
    22
    das gleiche

    er will kein array als rückgabetyp
    Geändert von Thundy (09.06.09 um 15:08 Uhr)
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Thundy Thundy ist offline Mitglied
    Registriert seit
    Aug 2008
    Beiträge
    22
    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
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Code pascal:
    1
    2
    3
    4
    5
    6
    7
    
    procedure ripplesort(var arr:tarray;a,e:integer);
      var sortiertok:shortint;
             swap:real;
             i:integer;
      begin
        ...
      end;
    Such mal nach "call by reference".

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Thundy Thundy ist offline Mitglied
    Registriert seit
    Aug 2008
    Beiträge
    22
    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?!

    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 pascal:
    1
    
    procedure ripplesort(var arr:tarray;a,e:integer);
    oder ich leg garkeine lokalen variablen mehr fest:
    Code pascal:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    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)
    Geändert von Thundy (09.06.09 um 18:45 Uhr)
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Thundy Beitrag anzeigen
    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?
    Zitat Zitat von Thundy Beitrag anzeigen
    verwirrend.
    Allerdings.
    Zitat Zitat von Thundy Beitrag anzeigen
    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.
    Zitat Zitat von Thundy Beitrag anzeigen
    oder ich leg garkeine lokalen variablen mehr fest:
    Das hat nichts mit den lokalen Variablen zu tun.
    Zitat Zitat von Thundy Beitrag anzeigen
    Code pascal:
    1
    2
    3
    4
    5
    6
    7
    8
    
    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..
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    Thundy Thundy ist offline Mitglied
    Registriert seit
    Aug 2008
    Beiträge
    22
    Zitat Zitat von deepthroat Beitrag anzeigen
    Ä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 pascal:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    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 pascal:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    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 pascal:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    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
    Geändert von Thundy (12.06.09 um 07:02 Uhr)
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    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:
    Code pascal:
    1
    
    procedure bubblesort(var x: array of real;a,e:integer);

    In Turbo Pascal kann man andere Dateien so einbinden:
    Code pascal:
    1
    
    {$I dateiname.inc}
    Gruß
    Thundy bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  13. #13
    Thundy Thundy ist offline Mitglied
    Registriert seit
    Aug 2008
    Beiträge
    22
    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)
    <<doof

    lg
     

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 26.11.10, 11:08
  2. Antworten: 4
    Letzter Beitrag: 14.11.07, 07:54
  3. Mit function prüfen ob function == true
    Von Sebigf im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 12.05.06, 14:25
  4. Tabelle/Arrays und Arrays ausgeben
    Von Meitli im Forum ASP
    Antworten: 1
    Letzter Beitrag: 09.02.06, 13:01
  5. unterschied zwischen function x() und x = function()
    Von timäää im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 18.09.05, 09:14