![]() |
Die Typen der tatsächlichen und formalen Var-Parameter müsse
da wir grad in der schule sortierverfahren haben hba ich mal ein programm zum quicksort gemacht aber ich bekomme ständig diese fehlermeldung...
Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen(116)(4.letzte ZEile) hier der text:
Delphi-Quellcode:
unit Sort;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; Memo2: TMemo; Button3: TButton; procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type ta=ARRay[1..100] of integer; var Form1: TForm1; n:integer; a:array[1..100] of integer; procedure bubble(var a:ta; n:integer); PROCEDURE Quicksort(VAR a:ta; p,r:INTEGER); Function Partition(VAR a:ta; p,r:INTEGER):INTEGER; procedure tausch(var x,y:integer); implementation {$R *.dfm} procedure tausch(var x,y:integer); var z:integer; begin x:=y; Y:=z; z:=x; end; Function Partition(VAR a:ta; p,r:INTEGER):INTEGER; VAR t,x,i,j:INTEGER; BEGIN x:=a[p]; i:=p-1; j:=r+1; WHILE i<j DO BEGIN REPEAT j:=j-1; UNTIL a[j]<=x; REPEAT i:=i+1; UNTIL x <= a[i]; IF i<j THEN tausch(a[i],a[i]) (*Tausch der Elemente *) ELSE RESULT:= j; END; END ; PROCEDURE Quicksort(VAR a:ta; p,r:INTEGER); VAR q:INTEGER; BEGIN IF p<r THEN BEGIN q:=Partition(a,p,r); Quicksort(a,p,q); Quicksort(a,q+1,r); END; END; procedure bubble(var a:ta; n:integer); var x,i,j:integer; begin For j:=1 to n do For i:=1 to n-1 do If a[i] > a[i+1] then begin x:=a[i]; a[i]:=a[i+1]; a[i+1]:=x; End; end; procedure TForm1.Button2Click(Sender: TObject); var i,n:integer; begin n:=memo1.lines.count; for i:=1 to n do a[i]:=StrtoInt(memo1.Lines[i-1]); end; procedure TForm1.Button3Click(Sender: TObject); var i:integer; begin memo1.clear; memo2.clear; for i:=1 to 10 do memo1.lines.add(INtTOStr(random (20))) end; procedure TForm1.Button1Click(Sender: TObject); var i,n:integer; begin for i:=1 to n do quicksort(memo1.lines,n,x);//DIE ZEILE HIER ISSES!!! memo2.lines.add(INtToStr(a[i])); end; end. |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Guck Dir Doch mal die Deklaration an.
Beantworte bitte folgende Fragen: Was erwartet Deine Quicksort-Prozedur als ersten Parameter? Was übergibst Du im Aufruf als ersten Parameter? Wenn die Anwtort auf meine erste und die zweite Frage unterschiedlich sind, dann übergibst Du nicht das, was die Prozedur erwartet. Edit nachtrag zum einfachen Spicken:
Delphi-Quellcode:
type ta=ARRay[1..100] of integer;
var Form1: TForm1; n:integer; PROCEDURE Quicksort(VAR a:ta; p,r:INTEGER); // vat a: ta
Delphi-Quellcode:
Du hast da übrigens noch ein gaaaanz anderes problem:
procedure TForm1.Button1Click(Sender: TObject);
var i,n:integer; begin for i:=1 to n do quicksort(memo1.lines,n,x);//DIE ZEILE HIER ISSES!!! memo2.lines.add(INtToStr(a[i])); end; Wenn Du i von 1 bis n laufen lassen willst, dann solltest Du dem n vorher auch einen Wert zuweisen... |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
so hab jetzt alles geändert aber trotzdem is der fehler noch da..
Delphi-Quellcode:
end;
procedure TForm1.Button1Click(Sender: TObject); var i,n:integer; begin n:=memo1.lines.count;//DAS HIER! for i:=1 to n do quicksort(a[i],n,x);//UND HIER! memo2.lines.add(INtToStr(a[i])); |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Es scheint hier auch ganz schönes Durcheinander mit Variablennamen zu herrschen.
Außerdem fehlt bei der For-Schleifen noch ein begin und ein end. [edit] Die Funktion erwartet ein Array vom Typ "ta" und nicht nur einen einzelnen Wert. [/edit] [edit2] Schau mal noch ![]() |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Nochmal, und zwar bitte ganz langsam. Einmal vorher TIEEF Luft holen :zwinker:
Zitat:
|
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Was erwartet Deine Quicksort-Prozedur als ersten Parameter?
Was übergibst Du im Aufruf als ersten Parameter? 1. ein array vom typ ta 2.in der geänderten version das array(a vom typ ta)? edit in der geänderten version hab ich doch a[i] reingeschrieben??? reicht das nich ? naja ich guck nochmal im tutorial nach... |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
1. Ja
2. Nein, sondern ein Element des Arrays, nicht das Array selbst. |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Du musst a reinwerfen, nicht a[i]. Denn a[i] ist das i-te Element AUS dem Array a.
|
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Hatte ich das nicht gesagt? :stupid:
|
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Nur indirekt :stupid:
(indirekt = ohne seine Namen der Variablen :stupid: ) |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
ahh!Danke!
naja wir hatten bisher im unterricht immer nur a[i]verwendet aber eben in schleifen und sowas... :wall: :wall: :wall: Auf jeden Fall Danke! |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
In Deiner Prozedur "tausch" steckt ebenfalls ein Fehler:
Delphi-Quellcode:
muss heissen:procedure tausch(var x,y:integer); var z:integer; begin x:=y; Y:=z; z:=x; end;
Delphi-Quellcode:
procedure tausch(var x,y:integer); var z:integer; begin z:=x; x:=y; y:=z; end; |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Geht übrigens auch anders:
Delphi-Quellcode:
procedure tausch(var x,y:integer);
begin x := x xor y; y := y xor x; x := x xor y; end; |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Was ist denn performanter? Die XOR-Lösung, oder der klassische Tausch über Hilfsvariable?
Sherlock |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Keine Ahnung, hab ich nie gemessen.
|
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Die "xor" Variante mochte ich früher auch lieber, weil sie so nett aussieht und ohne zusätzlichen Hilfsspeicher auskommt.
Bis sie dann mal in einem meiner Codes mit derselben Variable für x und y aufgerufen wurde. Das führt dann im Gegensatz zur anderen Version zur Katastrophe. Tausch(a, a) löscht nämlich a schon in der ersten Zeile, denn dann passiert ja nichts anderes als a := a xor a, und das gibt 0. Also aufpassen, wo und wie man das einsetzt ;) Gruß Michael |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Wobei es ja eigentlich egal ist, welche Katastrophe denn nun eintritt: gar nicht tauschen oder nullen ;)
|
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
[OT]
Nu ja, wenn ich sowas schreibe, sollte das für mein "a" nicht böse ausgehen:
Delphi-Quellcode:
Das heißt aber, daß man theoretisch diese Tausch-Funktion wie folgt ändern müßte:
a := 5;
Tausche(a, a); IF a = 0 then ShowMessage('Das war ja wohl nix');
Delphi-Quellcode:
Entschuldigung für das OT, aber der Bug hat mich mal ganz schön Nerven gekostet.... :oops:
procedure tausch(var x,y:integer);
begin if x <> y then begin x := x xor y; y := y xor x; x := x xor y; end; end; Gruß Michael [/OT] |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Ich habe mir das noch einmal durch den Kopf gehen lassen: das Problem besteht bei gleichen Werten überhaupt nicht (sofern ich keinen Denkfehler mache). Mal ein Schreibtischtest mit der Zahl 5 für beide Werte:
Delphi-Quellcode:
[edit] Wenn man allerdings 2 mal die selbe Variable (Referenz) übergibt, sieht das anders aus. [/edit]
a := a xor b;
00000101 //a=5 00000101 //b=5 ________ 00000000 //a=0 b := b xor a; 00000101 //b=5 00000000 //a=0 ________ 00000101 //b=5 a := a xor b; 00000000 //a=0 00000101 //b=5 ________ 00000101 //a=5 |
Re: Die Typen der tatsächlichen und formalen Var-Parameter m
Zitat:
Gruß Michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz