Typ funkcyjny, zła liczba parametrów.

0

Witam. Napisałem prostą bazę danych artykułów spożywczych. Ogólnie sama w sobie działa tylko muszę do niej dodać typ funkcyjny. Mam wszystko zadeklarowane, funkcję o dwóch argumentach integer, procedure o argumencie integer i typie funkcyjnym i przy kompilacji wywala mi błąd w głównym programie w linii: screena(porownaj, liczba);

Oto cały kod:

 {$ mode delphi}

program Projekt;
USES CRT;

type Baza = record
typ,nazwa:string;
ilosc:integer;
end;

type funkcja = function(liczba,ilosc:integer):boolean; // ------------------ moj typ funkcyjny

type wsk=^integer;

var f,t,g:file of Baza;
o: array [1..50] of Baza;
s:Baza;
a,x,liczba:integer;
Wwsk:wsk;

procedure dodaj;
var i,a:integer;
begin
clrscr;
assign(f,'baza.txt');
rewrite(f);
write('Podaj liczbe produktow:  ');
readln(a);
for i:=1 to a do
begin
clrscr;
writeln;
write('Typ: ');
readln(o[i].typ);
write('Nazwa: ');
readln(o[i].nazwa);
write('Ilosc: ');
readln(o[i].ilosc);
write(f,o[i]);
clrscr;
end;
close (f);
end;

procedure usun;
var i,a:integer;
    b:string[30];

begin
i:=1;
clrscr;
assign (f,'baza.txt');
assign (g,'bazatest.txt');
rewrite(g);
Reset (f);
writeln('ktory produkt chcesz usunac?');
readln(b);
while not eof (f) do
begin
read (f,o[i]);
if not (o[i].nazwa=b) then
write(g,o[i]);
i:=i+1;
end;
writeln('usuwanie ukonczone');
close(f);
close(g);
erase(f);
rename(g,'baza.txt');
end;

procedure usunall;
var i,a:integer;
    b:string[30];

begin
i:=1;
clrscr;
assign (f,'baza.txt');
assign (g,'bazatest.txt');
rewrite(g);
Reset (f);
writeln('ktory typ produktow chcesz usunac?');
readln(b);
while not eof (f) do
begin
read (f,o[i]);
if not (o[i].typ=b) then
write(g,o[i]);
i:=i+1;
end;
writeln('usuwanie ukonczone');
close(f);
close(g);
erase(f);
rename(g,'baza.txt');
end;

procedure screen;
var i,a:integer;
begin
i:=1;
assign(f,'baza.txt');
reset(f);
while not Eof(f)  do
begin
read(f,o[i]);
writeln;
write('Typ: ');
writeln(o[i].typ);
write('Nazwa: ');
writeln(o[i].nazwa);
write('Ilosc: ');
writeln(o[i].ilosc);
write(f,o[i]);
writeln;
inc(i);
end;
close (f);
end;

function porownaj(liczba,ilosc:integer):boolean;   // ------------------ funkcja o zadeklarowanym wyżej typie
begin
if (liczba<=ilosc) then porownaj:=true
else porownaj:=false;
end;

procedure screena(Afunkcja:funkcja ; liczba:integer);  // ------------------ przekazanie do procedury powyższej funkcji
var i,a:integer;
begin
i:=1;
assign(f,'baza.txt');
reset(f);
while not Eof(f)  do
begin
read(f,o[i]);
if (Afunkcja(liczba, o[i].ilosc)) then     // ------------------ uzycie funkcji
begin
writeln;
write('Typ: ');
writeln(o[i].typ);
write('Nazwa: ');
writeln(o[i].nazwa);
write('Ilosc: ');
writeln(o[i].ilosc);
write(f,o[i]);
writeln;
end;
inc(i);
end;
close (f);
end;

procedure dodajponownie;
var i,a:integer;
begin
clrscr;
assign(f,'baza.txt');
reset(f);
write('Podaj liczbe produktow do dopisania:  ');
readln(a);
for i:=1 to a do
begin
clrscr;
Seek(f, FileSize(f));
writeln;
write('Typ: ');
readln(o[i].typ);
write('Nazwa: ');
readln(o[i].nazwa);
write('Ilosc: ');
readln(o[i].ilosc);
write(f,o[i]);
clrscr;
end;
close(f);
end;



procedure kopia;
var FromF, ToF: file;
 NumRead, NumWritten: Word;
 Buf: array[1..2048] of Char;

begin
 Assign(FromF, ParamStr(1));
 Reset(FromF, 1);
 Assign(ToF, ParamStr(2));
 Rewrite(ToF, 1);
 Writeln('Skopiowano ', FileSize(FromF), ' bajtow');
 repeat
   BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
   BlockWrite(ToF, Buf, NumRead, NumWritten);
 until (NumRead = 0) or (NumWritten <> NumRead);
 Close(FromF);
 Close(ToF);
end;

Begin
clrscr;
    repeat
       writeln ('1 - Dodaj produkty');
           writeln ('2 - Usun produkty');
           writeln ('3 - Usun wszystkie produkty danego typu');
           writeln ('4 - Dodaj ponownie produkty');
       writeln ('5 - Wyswietl produkty');
       writeln ('6 - Dodaj ilosc produktow');
       writeln ('7 - Odejmij ilosc produktow');
       writeln ('8 - Kopia bazy danych (baza.dat)');
       writeln ('0 - Zakoncz program');

           readln (x);
           case x of
              1:
                  begin
                    dodaj;
                  end;
              2:
                  begin
                    usun;
                  end;
                  3:
                  begin
                    usunall;
                  end;
              4:
                  begin
                    dodajponownie;
                  end;
              5:
                  begin
                    screen;
                  end;
          8:
              begin
                    kopia;
                  end;
          9:
              begin
                   writeln ('aaa');
                   readln (liczba);
                   screena(porownaj, liczba);   // ----------- wywolanie procedury z przekazaniem funkcji porownaj, w tej linii jest blad
                  end;
           end;
        until x=0;
 end.
0

funkcja porownaj ma 2 parametry gdzie ty tu widzisz te 2 parametry?

screena(porownaj, liczba);

to raz a dwa

procedure dodaj;
var i,a:integer;
begin
clrscr;
assign(f,'baza.txt');
rewrite(f);
write('Podaj liczbe produktow:  ');
readln(a);
for i:=1 to a do
begin
clrscr;
writeln;
write('Typ: ');
readln(o[i].typ);
write('Nazwa: ');
readln(o[i].nazwa);
write('Ilosc: ');
readln(o[i].ilosc);
write(f,o[i]);
clrscr;
end;
close (f);
end; 

Co się stanie jak podam tu liczbę większą od 50 np. 100 albo zamiast wpisać liczbę wpisze "dupa" i nacisnę enter?

I na sam koniec:
Formatowanie z d**y i pewnie @olesio jeszcze będzie krzyczał, że brak tagów :)

0

Głównie mam problem z tymi typami funkcyjnymi, nie patrzcie na resztę kodu. Co do tego porownaj, to z tego co wiem właśnie po to jest ten typ funkcyjny, żeby przekazywać funkcję bez parametrów, a używać jej dopiero z parametrami w środku procedury. Znajomy ma to zrobione w praktycznie ten sam sposób tylko zamiast integerów ma swoje typy wyliczeniowe i u niego to działa.

1
screena(@porownaj, liczba);
0

Dzięki kAzek. Dziwne, że w tamtym kodzie działa bez @ a tu już nie.

0
maniek099 napisał(a)

Głównie mam problem z tymi typami funkcyjnymi, nie patrzcie na resztę kodu.

No to był sens wklejania całego kodu, jeśli chodzi o jedną procedurę/funkcję?


Nie wiem jak u Was, ale sprawdziłem u siebie na Lazarusie (IDE v1.0) i działa bez podawania prefiksu @:

program Project1;

{$mode delphi}  

type
  TCompareFunc = function(A1, A2: Word): Boolean;

  function CompareWord(A1, A2: Word): Boolean;
  begin
    Result := A1 = A2;    
  end;
  
  procedure Foo(ACompareFunc: TCompareFunc; const ACount: Word);
  const
    wFoo: Word = 10;
  begin                                                        
    if ACompareFunc(wFoo, ACount) then
      Write('Equal!')
    else
      Write('Not equal...');
  end;

const
  wCount: Word = 10;
begin
  Foo(CompareWord, wCount); //Foo(@CompareWord, wCount) także działa prawidłowo
  ReadLn;
end.

Na wyjściu dostaję elegancko Equal! (jeśli zmienię wartość stałej wCount - dostanę napis Not equal...) czyli wszystko działa jak należy; Przykład bez jakiegokolwiek sensu, ale funkcja zostaje przekazana i wykonana poprawnie;

1 użytkowników online, w tym zalogowanych: 0, gości: 1