Procedury i Funkcje

0

Witam

Mam proste pytanie odnosnie Procedur i Funkcji.

Wiem że:
Procedury - w nich zapisujemy jakąś część kodu który jest wykorzystywany kilka razy w całym programie. Dzieki temu program staję sie bardziej przejrzysty.
Funkcje - Do ich działania musimy wprowadzić jakieś dane, zadaniem funkcji jest takie ich przemielenie aby wypluły ostateczny rezultat.

Tak zrozumiałem czytając książke Pana Adama.

Lecz mam pewne wątpliwości. Przy deklarowaniu procedury mozna podać jej parametry, czyli zmienne ktore sa wymagane.
Do tej pory myślałem ze to właśnie domena funkcji. W takim razie juz nie wiem na czym polega różnica miedzy Procedurami i Funkcjami.
Kiedy używać Procedure a kiedy funkcje? Skoro do obu możemy dać parametry....
Jeśli można to proszę o jaki prosty przykład.

1

Funkcja coś zwraca, procedura nie.

0

W Delphi, ale też jak podejrzewam w wielu innych językach procedura również może zwracać wartości, ale nie jako wynik tak jak funkcja, a przez jeden ze swoich parametrów poprzedzony słowem kluczowym var. Pierwszy przykład z brzegu to procedura Val - opisana tutaj: Val i oczywiście zarówno procedury jak i funkcje mogą nie posiadać żadnych parametrów.

0

To rozumem ze funkcja wyglada np. tak
function InitInstance(Instance: Pointer): TObject;

procedura WriteComponent(Instance: TComponent);

W 1 przypadku otrzymujemy jakiś obiekt nad ktorym mozemy pożniej pracować, a 2 dokonujemy operacji na jakims obiekcie
Jesli bym chciał do istniejacej procedury dodac zeby cos zwracała muszę zmienic na funkcję? Czy procedura z wynikiem tez jest akceptowalna przez kompilator?

0

Zasadniczo to nie istnieją procedury z wynikiem i nie powinny być akceptowane przez kompilator. Ale Pascal jest dziwny (stałe, które są zmienne; procedury, które zwracają wartość - takie rzeczy istnieją).

Procedurę możesz też zastosować, kiedy oczekujesz więcej niż jednej wartości wyjściowej - o ile przekazujesz parametry przez referencję to jest wykonalne zapisanie wyników do dwóch czy więcej zmiennych.

0

Tam są tylko funkcje :D
Bzdura, to zabawa w semantykę.
w Pascalu/Delphi brak zwracanej wartości oznaczamy przez użycie słowa procedure zamiast function, a w C/C++ przez podanie void jako zwracanego „typu”.
Różnica jest tylko składniowa, filozofia jest ta sama.

1
maxiu1989 napisał(a)

Jesli bym chciał do istniejacej procedury dodac zeby cos zwracała muszę zmienic na funkcję? Czy procedura z wynikiem tez jest akceptowalna przez kompilator?

Jeżeli masz dostęp do jej kodu to nie musisz koniecznie zmieniać ją w funkcję. Ponieważ tak, jak wspomniałem możesz uzyskać zwracanie wyniku przez jeden z parametrów. Warunek jest taki, żeby poprzedzić go słowem kluczowym var, co wymusi podawanie jako parametru zmiennej. Czyli na przykład zmiast stringu 'bleble' będziesz musiał podać zmienną. Najlepiej pokaże to Ci może jakiś przykład. Ponieważ ostatnio piszę tylko w WinAPI pokaże dwie funkcje:

function ReadTextFromFile(AFileName : string; var OutStr : string) : boolean;
var
  BytesRead : DWORD;
  SrcFile : THandle;
  SrcFileSize : Int64;
begin
  OutStr := '';
  SrcFile := CreateFile(PChar(AFileName), GENERIC_READ,
    FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Result := SrcFile <> INVALID_HANDLE_VALUE;
  if Result then
  begin
    SrcFileSize := GetFileSize(SrcFile, nil);
    SetLength(OutStr, SrcFileSize);
    ReadFile(SrcFile, OutStr[1], SrcFileSize, BytesRead, nil);
    CloseHandle(SrcFile);
  end;
end;

function SaveTextToFile(AFileName : string; InStr : string) : boolean;
var
  OutFile : THandle;
  BytesWritten : DWORD;
  OutFileSize : integer;
begin
  OutFile := CreateFile(PChar(AFileName), GENERIC_WRITE,
    FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  Result := OutFile <> INVALID_HANDLE_VALUE;
  if Result then
  begin
    OutFileSize := Length(InStr);
    WriteFile(OutFile, InStr[1], OutFileSize, BytesWritten, nil);
    CloseHandle(OutFile);
  end;
end;

Funkcje zwracają True jeżeli odczyt/zapis z/do pliku się powiodą (czyli jeżeli plik istnieje i przy odczycie lub zapis do pliku jest możłiwy). Dodatkowo jeżeli funkcja ReadTextFromFile się powiedzie to w parametrze OutStr uzyskamy zawartość wczytanego pliku.

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