Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

DeddyH 4. Mär 2014 15:17

AW: Funktion deklarieren oder nicht?
 
Und wo soll das sein?

Ergosquare 4. Mär 2014 15:20

AW: Funktion deklarieren oder nicht?
 
Sorry, mein Fehler, das mit dem Semikolon hätte ich sehen können.

Das zweite Problem besteht weiterhin.

Eine Warnung bekomme ich nicht.

MfG Ergosquare

DeddyH 4. Mär 2014 15:26

AW: Funktion deklarieren oder nicht?
 
2 Möglichkeiten:
Delphi-Quellcode:
function SomeFunction: integer;
begin
  Result := 42; (* Result *)
end;
oder auch
Delphi-Quellcode:
function SomeFunction: integer;
begin
  SomeFunction := 42; (* Funktionsname *)
end;
Auch nach 20-maligem Drübergucken habe ich in Deinem Code keine der beiden Möglichkeiten entdecken können. Du musst also vor dem rekursiven Aufruf der Funktion einen Wert zuweisen, sonst steht da irgendetwas drin, aber nichts Definiertes. Steppe doch einmal durch und schau Dir den Wert von za nach dem Aufruf an. Nach meinem Dafürhalten müsste da ziemlicher Nonsens drinstehen.

p80286 4. Mär 2014 15:27

AW: Funktion deklarieren oder nicht?
 
Zitat:

Zitat von DeddyH (Beitrag 1250583)
Und wo soll das sein?

Na nirgens! (ich hätte geschworen das da was war)

Gruß
K-H

DeddyH 4. Mär 2014 15:29

AW: Funktion deklarieren oder nicht?
 
Achso, Missverständnis meinerseits, ich dachte, Du hättest meine Tomaten gemeint :lol:

Ergosquare 4. Mär 2014 16:53

AW: Funktion deklarieren oder nicht?
 
So, die Funktion hat jetzt eine Rückgabewert.

za scheint trotzdem durch die Funktion nicht verändert zu werden.

MfG Ergosquare

Blup 4. Mär 2014 16:56

AW: Funktion deklarieren oder nicht?
 
Um mal zusammenzufassen:
- Rekursion ist in der Regel langsamer als Iteration
- Parameter, lokale Variablen und Rückgabewerte nicht durcheinander werfen

So stelle ich mir das vor:
Delphi-Quellcode:
function zaehler(x, y, a, b: Real): Integer;
var
  x2: Real;
begin
  Result := 0;
  while (Result <= 100) and (sqrt((x * x) + (y * y)) < 2) do
  begin
    x2 := (x * x) - (y * y) + a;                              
    y := (2 * x * y)      + b;
    x := x2;
    Inc(Result);
  end;
end;

var
  c: TColor;

  za := zaehler(x, y, a, b);
  case za of
     0..9: c := clRed;                
   10..19: c := clGreen;
{...}
  else    c := clBlack;
  end;
  paintbox1.canvas.Pixels[s + 50, z + 50] := c;
Pixels ist so ziemlich die langsamste Möglichkeit eine Grafik auszugeben.
Besser du verwendest eine Bitmap und greifst mit Scanline darauf zu.
Die Bitmap dann komplett oder nach jeder Zeile zeichnen.
Alternativ gleich mit einer TImage-Komponente arbeiten (Image1.Picture.Bitmap).

Ergosquare 4. Mär 2014 17:12

AW: Funktion deklarieren oder nicht?
 
Ich hatte noch einen entscheidenden Fehler:

Code:
    If (za<100) and (sqrt(x*x+y*y)<2)              
    then za:=zaehler(za+1,x,y,x2,a,b)+1 //+1 hat gefehlt            
    else za:=1;
Sonst wird za nach der Funktion nicht verändert.
Dennoch bleibt es leider bei der Einfarbigkeit.

PS: Ich würde trotzdem gerne bei Rekursion bleiben.

MfG Ergosquare

Furtbichler 4. Mär 2014 21:10

AW: Funktion deklarieren oder nicht?
 
Zitat:

Zitat von Blup (Beitrag 1250601)
Um mal zusammenzufassen:
- Rekursion ist in der Regel langsamer als Iteration

Um mal aufzuklären:
- Nein. Hm. Also eigentlich irgendwie doch aber nicht so einfach. ;-)
Eine sehr schöne Erklärung ist hier zu finden. Unabhängig davon kommt es auf die Implementierung an. So gibt es eben rekursive Lösungen, deren iteratives Äquivalent sehr umständlich umzusetzen und daher auch langsamer sind. Die hochoptimierten Compiler (ja, auch Delphi gehört dazu) widerum können (rekursive) Aufrufe durchaus über Register abbilden und so zu u.U. wirklich schnellerem Code führen.

sx2008 4. Mär 2014 21:14

AW: Funktion deklarieren oder nicht?
 
Den Ausdruck
Delphi-Quellcode:
(sqrt((x * x) + (y * y)) < 2)
kann man übrigens zu
Delphi-Quellcode:
((x * x) + (y * y) < 4)
vereinfachen.
Man kommt darauf wenn man den Ausdruck auf beiden Seiten des Kleinerzeichens quadriert.
Die Quadratwurzel
Delphi-Quellcode:
sqrt()
wird dann aufgehoben und das spart recht viel Zeit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr.
Seite 2 von 3     12 3      

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