[Delphi] Was ist denn hier Falsch???
lima-city → Forum → Programmiersprachen → Delphi & Pascal
array
beleg
beschrieb
deklaration
dialog
ebenfall
ellenlange litanei
ergebnis
funktion
globalen arrays
grundlage
gruss
ketchup
lngen
primzahl
prozedur
result
schleifen
sender
vorschlag
-
Hallo,
Ich hab mal wieder ein Problem und zwar folgendes:
Das sind ausschnitte meines @uelltextes:
var
primzahlen,ausgabearray: array of integer;
arrayhigh,i: integer;
function showprim: array;
begin
setlength(ausgabearray,high(primzahlen))
for i := 0 to high(primzahlen) do begin
ausgabearray:=primzahlen;
end
result:=ausgabearray;
end
So jetzt bekomme ich aber immer diese Fehlermeldung:
[Error] dbase.dpr(47): Identifier expected but 'ARRAY' found
Kann es sein das ich als Rückgabewert der Funktion kein Array angebn kann?
mfg Ketchup -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
1. Solltest du dir die Grundlagen von Delphi genauer aneignen. Du hast bisher ziemlich viele Fragen in diesem Forum gestellt, die sich (fast) alle selbst beantworten lassen, wenn man die Grundlagen von Delphi beherrscht. Das ist nichts gegen dich persönlich, sondern in deiner eigenen Interesse (ist doch auch besser, wenn du nicht bei jedem Miniproblem ein Forum fragen musst).
2. Besser ist es, globale Variablen möglichst zu vermeiden und Variablen und Konstanten, die nur für eine Funktion oder Prozedur brauchst, solltest du auch in dieser deklarieren. Anstatt dass du deine Funktion auf einen globalen Array zugreift, solltest du den Array über Parameter an diese übermitteln. Ausnahme: der Array muss für was auch immer global deklariert sein, aber wenn möglich dann solltest du das vermeiden. Das gleiche gilt für arrayhigh und i.
3. Du brauchst in der Funktion keinen Rückgabewert, wenn du sowieso mit globalen Arrays arbeitest.
Ich weiß ja nicht was du mit dem Programm vor hast, vlt. folgendes?:
var ... primzahlen, ausgabearray: array of integer; ... procedure showprim; var i: Integer; begin for i := 0 to length(primzahlen) do begin ausgabearray[i] := high(primzahlen[i]); end; end;
-
Kann man Arrays überhaupt über Funktionen übergeben?
Ich dachte immer das man das nicht kann.
Zudem wie trueweb schon beschrieben hat:
Variablen lokal deklarieren. Der Hintergrund dazu ist, dass du bei komplexeren Programmen eine Ellenlange Litanei an globalen Variablen hast, die 1. unnötig Speicher belegen und 2. wenn man mal die Initialisierung vergisst solche Variablen ziemlichen Unsinn produzieren können. -
Kann man Arrays überhaupt über Funktionen übergeben?
Ich dachte immer das man das nicht kann.
Meinst du, ob man Arrays als Ergebnis einer Funktion zurückgeben kann? Ja das geht, wieso auch nicht? Du brauchst nur die Funktion entsprechen deklarieren, den dem "Ergebnis-Array" nur die richtige Länge und die reichtigen Werte zuweisen!
z.B.:
function GebeArrayZurueck : Array of Integer
var
i: Integer;
begin
SetLength(Result, 5);
for i := 0 to 4 do
Result := i;
end; -
Wichtig wäre auch das die Schleife nicht von 0 bis length(array) läuft sondern von 0 bis length(array)-1.
Gruß Tobi
dafür gibts dann doch wohl High(array) ;) -
Hallo Ketchup,
Du kannst eine Funktion mit einem Arraytyp deklarieren.
Das Wort ARRAY ist aber kein Bezeichner für einen Arraytyp, das beleidigt den Compiler.
Also deklarierst du zuerst einen Array Typ und verwendest ihn dann bei der Definition der Funktion.
Burgis Vorschlag funktioniert nicht, er enthält 3 Fehler:
Er versucht die Funktionsdeklaration ebenfalls mit ARRAY,
er weist result 5 mal einen Wert zu, und nur der letzte würde zurückgegeben werden, wenn ..,
er weist dem Result einer Arrayfunktion einen Integerwert zu.
Der Vorschlag von trueweb ist ungünstig, da er mit globalen Variablen arbeitet, wo es sich sehr einfach vermeiden olässt.
Der folgende Vorschlag funktioniert. Es wird gezeigt, wie eine Arrayfunktion deklariert wird. Und es ist zu sehen, wie du Arrays in eine Prozedur (bei Funktion ist es gleich) hinein kommen und wie sie aus einer Funktion heraus kommen.
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type tIntArr = array of integer; // Hier wird ein Arraytyp deklariert TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } function GebeArrayZurueck(): tintarr; procedure showarray(inarray:tintarr); end; var Form1: TForm1; implementation {$R *.DFM} function Tform1.GebeArrayZurueck(): tIntArr; var i: Integer; begin SetLength(Result, 5); for i := 0 to 4 do Result[i]:=i+1000; end; procedure Tform1.showarray(inarray:tIntArr); var i:integer; begin; for i := 0 to high(inarray) do memo1.lines.add(inttostr(i)+': '+inttostr(inarray[i])); end; procedure TForm1.Button1Click(Sender: TObject); var ix:tIntArr; begin ix:=gebearrayzurueck; showarray(ix); end; end.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage