Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Not enough actual parameters bei inc und Funktion


der organist - So 08.03.09 22:02
Titel: Not enough actual parameters bei inc und Funktion
Hi Leutz,
Fehlermeldung wie beschrieben.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
function TSpieler.DayNumber(ADate: string):Integer;
var day,month:Integer;
begin
  day:=StrToInt(Copy(ADate,1,2));
  month:=StrToInt(Copy(ADate,4,5));
  DayNumber:=Day;
  if month=2 then
    inc(DayNumber,31)
  else
  if month=3 then
    inc(DayNumber,28)
  else
  if month=4 then
    inc(DayNumber,31)
  else
  if month=5 then
    inc(DayNumber,30)
  else
  if month=6 then
    inc(DayNumber,31)
  else
  if month=7 then
    inc(DayNumber,30)
  else
  if month=8 then
    inc(DayNumber,31)
  else
  if month=9 then
    inc(DayNumber,31)
  else
  if month=10 then
    inc(DayNumber,30)
  else
  if month=11 then
    inc(DayNumber,31)
  else
  if month=12 then
    inc(DayNumber,30);
end;


Keldorn - So 08.03.09 22:21

Hallo

- deine vielen ifs: gugg Dir mal case an ;-), der reine Abfragen-aufbau läßt sich besser lösen.

Zitat:

- month:=StrToInt(Copy(ADate,4,5));

der 3. Paramter bei copy ist count, nicht die "bis"-position, du würdest somit 5 Zeichen rauskopieren, das möchtest du sicher nicht

- du willst nicht inc(Daynumber,31) schreiben, sondern

Delphi-Quelltext
1:
2:
3:
result := 31
bzw 
Daynumber := 31

ersteres ist besser. Daynumber ist ja deine Funktion selber, die du wieder aufrufen würdest.

Anstatt das selber zu machen: gugg mal in der Hilfe zur unit "Dateutils", dort findest du viele Routinen rund ums Datum, z.B. "DaysInAMonth" oder "DayoftheYear",

die logik in deinem Code erschließt sich mir nicht ganz. willst du die Anzahl der Tage im Monat zurückgeben, oder die Anzahl der Tage seit Jahresanfang?
du hast im Aufbau da einen Denkfehler drin

Gruß Frank


Yogu - So 08.03.09 22:24

Was mir noch auffällt: Du solltest nicht den Funktionsname für den Rückgabewert verwenden, sondern Result. Sonst bekommst du beim Umbenennen der Funktion viele seltsam scheinende Fehlermeldungen. Und ich kann mir auch vorstellen, dass genau dort der Fehler liegt: die Parameter fehlen nicht bei inc, sondern bei DayNumber - Delphi denkt, du wölltest die Funktion aufrufen.


der organist - So 08.03.09 22:28

(a) Vielen Dank für die schnelle Hilfe!
(b) Ihr habt mir auch gleich bei nem anderen Problem geholfen :)
(c) Ja, hab nur noch nich an case gedacht...
(d) doch, ich will inc(DayNumber,31); schreiben
(e) ich will die Tage seit Jahresanfang wiedergeben
(f) Logik ist folgende: erst werden die Tage addiert, die im aktuellen Monat sind
danach wird, wenn wir z.B. März haben, noch die Tage für Januar und Februar addiert, hab ich einen Denkfehler?
(g) Die Idee mit den gegebenen Funktionen ist gut ;)
(h) und Yogu, ich glaube, du hast den Nagel auf den Kopf getroffen


jaenicke - So 08.03.09 22:32

Es gibt in der Unit DateUtils auch die Funktion DayOfTheYear. Ich denke einmal das ist genau was du da selbst schreiben möchtest. ;-)


der organist - So 08.03.09 22:38

Jop, danke. Damit hat sich alles wesentlich vereinfacht. Und da hat einer auch die Logik verstanden, ohne dass ich sie beschrieben hab (ich gehe mal davon aus, dass du deinen vor meinem Beitrag geschrieben hast).


Keldorn - So 08.03.09 22:41

dayoftheyear steht doch schon oben ;-)

aber mal zu deinem code:
sag mal, was dein Programm machen würde, wenn Du den 20.03. übergibst :-)