Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Die Typen der tatsächlichen und formalen Var-Parameter müsse (https://www.delphipraxis.net/114676-die-typen-der-tatsaechlichen-und-formalen-var-parameter-muesse.html)

Arathok 29. Mai 2008 11:48


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.

Phoenix 29. Mai 2008 11:56

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:
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;
Du hast da übrigens noch ein gaaaanz anderes problem:
Wenn Du i von 1 bis n laufen lassen willst, dann solltest Du dem n vorher auch einen Wert zuweisen...

Arathok 29. Mai 2008 12:03

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]));

Die Muhkuh 29. Mai 2008 12:03

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 hier vorbei. [/edit]

Phoenix 29. Mai 2008 12:06

Re: Die Typen der tatsächlichen und formalen Var-Parameter m
 
Nochmal, und zwar bitte ganz langsam. Einmal vorher TIEEF Luft holen :zwinker:
Zitat:

Zitat von Phoenix
Was erwartet Deine Quicksort-Prozedur als ersten Parameter?
Was übergibst Du im Aufruf als ersten Parameter?

Bitte beantworte die beiden Fragen mal schriftlich hier im Thread. ;-)

Arathok 29. Mai 2008 12:09

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

DeddyH 29. Mai 2008 12:11

Re: Die Typen der tatsächlichen und formalen Var-Parameter m
 
1. Ja
2. Nein, sondern ein Element des Arrays, nicht das Array selbst.

Phoenix 29. Mai 2008 12:16

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.

DeddyH 29. Mai 2008 12:18

Re: Die Typen der tatsächlichen und formalen Var-Parameter m
 
Hatte ich das nicht gesagt? :stupid:

Die Muhkuh 29. Mai 2008 12:19

Re: Die Typen der tatsächlichen und formalen Var-Parameter m
 
Nur indirekt :stupid:

(indirekt = ohne seine Namen der Variablen :stupid: )

Arathok 30. Mai 2008 06:53

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!

exilant 30. Mai 2008 10:01

Re: Die Typen der tatsächlichen und formalen Var-Parameter m
 
In Deiner Prozedur "tausch" steckt ebenfalls ein Fehler:

Delphi-Quellcode:

procedure tausch(var x,y:integer);
var z:integer;
begin
   x:=y;
   Y:=z;
   z:=x;
end;
muss heissen:


Delphi-Quellcode:

procedure tausch(var x,y:integer);
var z:integer;
begin
   z:=x;
   x:=y;
   y:=z;
end;

DeddyH 30. Mai 2008 10:05

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;

Sherlock 30. Mai 2008 10:18

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

DeddyH 30. Mai 2008 10:20

Re: Die Typen der tatsächlichen und formalen Var-Parameter m
 
Keine Ahnung, hab ich nie gemessen.

grizzly 30. Mai 2008 10:59

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

DeddyH 30. Mai 2008 11:04

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 ;)

grizzly 30. Mai 2008 11:57

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:
a := 5;
Tausche(a, a);
IF a = 0 then
  ShowMessage('Das war ja wohl nix');
Das heißt aber, daß man theoretisch diese Tausch-Funktion wie folgt ändern müßte:
Delphi-Quellcode:
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;
Entschuldigung für das OT, aber der Bug hat mich mal ganz schön Nerven gekostet.... :oops:

Gruß
Michael
[/OT]

DeddyH 2. Jun 2008 07:58

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:
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
[edit] Wenn man allerdings 2 mal die selbe Variable (Referenz) übergibt, sieht das anders aus. [/edit]

grizzly 2. Jun 2008 11:20

Re: Die Typen der tatsächlichen und formalen Var-Parameter m
 
Zitat:

Wenn man allerdings 2 mal die selbe Variable (Referenz) übergibt, sieht das anders aus.
Nur darum ging es mir. :-D

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