1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
1532
1532
EMPFEHLEN
-
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, ThundyGeändert von Thundy (07.06.09 um 19:17 Uhr)
-
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
Das sollte helfenCode :1 2 3 4
// Zeile 4: x:TMeinArray; // Funktionsdeklaration: function ripplesort(arr:TMeinArray;a,e:integer):TMeinArray;
-
Error 34: Invalid function result typeCode 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.
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)
-
Hi
Der TYPE-Block muß vor dem VAR-Block stehen.
Tausche Zeile 3 und 4
-
das gleiche

er will kein array als rückgabetypGeändert von Thundy (09.06.09 um 15:08 Uhr)
-
09.06.09 15:10 #6
- 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.
-
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
-
09.06.09 16:39 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Such mal nach "call by reference".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;
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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.
oder ich leg garkeine lokalen variablen mehr fest:Code pascal:1
procedure ripplesort(var arr:tarray;a,e:integer);
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)
-
09.06.09 23:55 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Äh, was? Kannst du das nochmal klarer formulieren?Allerdings.
Eine andere Möglichkeit gibt es in Pascal nicht.
Das hat nichts mit den lokalen Variablen zu tun.
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.
-
Lokale Variable in 'na Funktion -> Call by value
Globale (mit var eingeleitet) -> Call by reference ?!
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.)Eine andere Möglichkeit gibt es in Pascal nicht.
Nochmal: egal was du machst, du kannst als Rückgabetyp kein Array verwenden.
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, ThundyGeändert von Thundy (12.06.09 um 07:02 Uhr)
-
12.06.09 08:47 #12
- 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:
GrußCode pascal:1
{$I dateiname.inc}If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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
-
array. wie werden arrays zugeweisen einer kopie des arrays oder mit einem pointer?
Von projumper im Forum PHPAntworten: 4Letzter Beitrag: 26.11.10, 11:08 -
PHP: Function führt function aus, wenn Bedingung erfüllt ist
Von Der_baum im Forum PHPAntworten: 4Letzter Beitrag: 14.11.07, 07:54 -
Mit function prüfen ob function == true
Von Sebigf im Forum Javascript & AjaxAntworten: 1Letzter Beitrag: 12.05.06, 14:25 -
Tabelle/Arrays und Arrays ausgeben
Von Meitli im Forum ASPAntworten: 1Letzter Beitrag: 09.02.06, 13:01 -
unterschied zwischen function x() und x = function()
Von timäää im Forum Flash PlattformAntworten: 4Letzter Beitrag: 18.09.05, 09:14





Zitieren

Login





