Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Funktion deklarieren oder nicht? (https://www.delphipraxis.net/179394-funktion-deklarieren-oder-nicht.html)

Ergosquare 4. Mär 2014 14:33

Funktion deklarieren oder nicht?
 
Hallo.

Es geht um eine Variable, die für eine Grafik wichtig ist und durch eine Funktion deklariert wird.
Es scheint, als ob die Funktion nicht ausgeführt werden würde.
In der Grafik erscheint dann nur eine vollfarbige Fläche, obwohl man mindestens eine Struktur erkennen müsste

Code:
function zaehler(za:integer; x,y,x2,a,b:real):integer;
begin
    x2:=x*x-y*y+a;                                
    y:=2*x*y+b;
    x:=x2;
    If (za<100) and (sqrt(x*x+y*y)<2)              
    then za:=zaehler(za+1,x,y,x2,a,b)              
    else za:=1;
end;

   .
   .
   .

    za:=0;                         //Initialisierung
    zaehler(za,x,y,x2,a,b);        //Aufruf
    if za>=100 then paintbox1.canvas.Pixels[s+50,z+50]:=clBlack;
    case za of
        0..9:paintbox1.canvas.Pixels[s+50,z+50]:=clRed;                  
        10..19:paintbox1.canvas.Pixels[s+50,z+50]:=clGreen;

   .
   .
   .

Furtbichler 4. Mär 2014 14:35

AW: Funktion deklarieren oder nicht?
 
Wenn Du einen Parameter innerhalb der Funktion/Prozedur/Methode veränderst, musst Du ihn mit 'var' deklarieren, also
Delphi-Quellcode:
function zaehler(var za:integer; var x,y,x2,a,b:real):integer;
begin
    x2:=x*x-y*y+a;                                
    y:=2*x*y+b;
    x:=x2;
    If (za<100) and (sqrt(x*x+y*y)<2)            
    then za:=zaehler(za+1,x,y,x2,a,b)            
    else za:=1;
end;

DeddyH 4. Mär 2014 14:36

AW: Funktion deklarieren oder nicht?
 
Delphi-Quellcode:
function zaehler(var za:integer; var x,y,x2,a,b:real):integer;
So besser?

[edit] Einen Tick zu langsam. Möglichweise kann man die Fließkommaparameter aber auch by Value übergeben (also ohne das "var"), so genau hab ich das jetzt nicht durchdrungen. [/edit]

Zoot 4. Mär 2014 14:41

AW: Funktion deklarieren oder nicht?
 
Man könnte za auch im Result der Function übergeben.
Ansonsten wäre eine Procedure sinnvoller.

Nachtrag:
Ohne Result := za geht der rekursive Aufruf sowieso nicht.

DeddyH 4. Mär 2014 14:45

AW: Funktion deklarieren oder nicht?
 
Stimmt, ist mir gar nicht aufgefallen :oops:

himitsu 4. Mär 2014 14:54

AW: Funktion deklarieren oder nicht?
 
Eine Rekursion mit
Delphi-Quellcode:
procedure zaehler(var za:integer; x,y,x2,a,b:real);
ginge schon, aber dann müsste man die Logik anpassen, damit Diese dann "eigentlich" als Iteration arbeitet, womit man den rekursiven Aufruf dann aber auch gleich entsorgen könnte.

Ergosquare 4. Mär 2014 14:59

AW: Funktion deklarieren oder nicht?
 
Hallo nochmal.

Mit der Variante bekomme ich die Fehlermeldungen:

[Fehler] Unit1.pas(36): ';', ')' oder '=' erwartet, aber 'VAR' gefunden
[Fehler] Unit1.pas(42): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

Code:
function zaehler(var za:integer var x,y,x2,a,b:real):integer; //36
begin
    x2:=x*x-y*y+a;                                
    y:=2*x*y+b;
    x:=x2;
    If (za<100) and (sqrt(x*x+y*y)<2)              
    then za:=zaehler(za+1,x,y,x2,a,b)              //42
    else za:=1;
end;
Was ist mit
result:=za;
gemeint?
Die Variablen ändern sich doch durch die Funktion, oder nicht?

Der rek. Aufruf ist schon Absicht.

MfG Ergosquare

p80286 4. Mär 2014 15:07

AW: Funktion deklarieren oder nicht?
 
Delphi-Quellcode:
function zaehler(var za:integer; var x,y,x2,a,b:real):integer; //36
Gruß
K-H

DeddyH 4. Mär 2014 15:08

AW: Funktion deklarieren oder nicht?
 
Da fehlt ein Semikolon im Funktionskopf vor dem zweien "var". Und eine Funktion hat einen Rückgabewert, der wird in Deinem Code aber nirgends gesetzt, der Compiler müsste auch eine diesbezügliche Warnung ausgeben.

p80286 4. Mär 2014 15:15

AW: Funktion deklarieren oder nicht?
 
Zitat:

Zitat von DeddyH (Beitrag 1250580)
Und eine Funktion hat einen Rückgabewert, der wird in Deinem Code aber nirgends gesetzt

Wenn man die Tomaten zur Seite schiebt, sieht man auch das.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz