Pole v deklaraci procedury – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pole v deklaraci procedury – Pascal – Fórum – Programujte.comPole v deklaraci procedury – Pascal – Fórum – Programujte.com

 

Gooo0
Newbie
1. 5. 2015   #1
-
0
-

Dobrý den

Již mi zde dali uživatelé fóra rady, které mi pomohly, tak zkusím znovu. Pracuji na úkolu z OOP v pascalu, ale prakticky jde o proceduru. Procedura se deklaruje:

procedure nazev (vstupni_promenne: datovy_typ; var vystupni_promenne, datovy_typ);

Mě napadlo ukládat hodnoty v proceduře do pole, tady jestli to chápu správně, potřeboval bych napsat něco v tomto smyslu:

procedure nazev (nazev_pole:array of integer: var nazev_vystupniho_pole: array of integer);

což mi samozřejmě nejde. Je nějaká možnost, jak v proceduře pracovat s polem a jak ji nadeklarovat? A nebo to chápu úplně blbě?

Nahlásit jako SPAM
IP: 178.72.244.–
Gooo0
Newbie
1. 5. 2015   #2
-
0
-

#1 Gooo
Jen pro vysvětlenou. Řeším úkol, kde mám provádě matematické operace s n-rozměrnými vektory a to vše pomocí objektů. Neznám počet rozměrů, tak mě napadlo, že bude uživatel nejdříve vyzván, aby zadal počet rozměrů. Protože jsem uvažoval, že ty hodnoty dám do jednotlivých indexů pole, tak jsem vytvořil pole o maximálně deseti pozicích a ošetřil, že když zadá uživatel více než 10, napíše se mu že je 10 max.

Nyní potřebuji udělat, aby se ty hodnoty nějak vložily do ptocedury a k tomu "asi nějak" potřebuji nadeklarovat to pole.

Asi to nepíšu 2x srozumitelně, no...

Nahlásit jako SPAM
IP: 178.72.244.–
Sniper
~ Anonymní uživatel
215 příspěvků
1. 5. 2015   #3
-
0
-

Vytvoř si nový typ který pak použiješ u těch parametrů, např. (uvedu dynamické pole, u statického je to stejné): 

type
  TArrayOfInteger = Array of Integer;

procedure Test(const Input: TArrayOfInteger; out Output: TArrayOfInteger);
begin
...
end;


Nebo také také existuje otevřené pole (open array), pokud ho použiješ tak pak se musíš řídit určitými pravidly, ale na druhou stranu při jeho užití můžeš předat funkci jak dynamické tak statické pole. Otevřené pole se deklaruje přesně tak jak to máš v druhém kusu kódu.

Nahlásit jako SPAM
IP: 90.179.201.–
Gooo0
Newbie
3. 5. 2015   #4
-
0
-

Děkuji za odpověď, ale až postupem mi došlo, že vlastně pole deklarovat nemusím (respektive, mám již vyřešeno vlastně obdobným postupem, který píšeš).

Jedná se o program do OOP, tedy jsem si vytvořil objekt, jehož součástí je i deklarace pole. Až nyní jsem ale zjistil, že nebudu do deklarace procedury vkládat datový typ pole, ale že tam vložím ony objekty.

Největší problém v OOP zatím mám s proměnnými a právě v deklaracích podprogramů. mohu ještě poprosit o kouknutí na tento program?

program vektory;
uses crt;
type
TVektor = object
   rozmeru: integer;
   hodnoty: array [1..10] of integer;
   procedure zadej_hodnoty (x: integer);
   procedure vypis_hodnoty;
   procedure vektor1;
   procedure secti;// (vektor1x, vektor2x: TVektor; var vektor_vysledekx: TVektor);
   end;

TMenu = object
   f: boolean;                                                  // Proměnná jež používáme v menu
   procedure Zobraz;                                            // Procedura, která vypíše volby menu na obrazovku
   function volba: char;                                        // Funkce, která načte uživatelskou volbu
   procedure A1;
   procedure A2;
   procedure A3;
   end;

var vektor1, vektor2, vektor_vysledek: TVektor;
    Menu0: TMenu;
    x, y, i, rozmeru: integer;

procedure TVektor.zadej_hodnoty (x: integer);
    begin
    for i := 1 to x do
       begin
          writeln ('Hodnota ',i,' :');
          readln (x);
          hodnoty [i] := x;
       end;
    end;

procedure TVektor.vypis_hodnoty;
    begin
       i := 1;
       while hodnoty [i] > 0 do
          begin
             write (hodnoty [i],', ');
             i := i+1;
          end;
          writeln ();
          writeln ();
       end;

procedure TVektor.secti;// (vektor1x, vektor2x: TVektor; var vektor_vysledekx: TVektor);
   var i:integer;
   begin
      for i:= 1 to x do
      begin
         vektor_vysledekx.hodnoty [i] := vektor1x.hodnoty [i] + vektor2x.hodnoty [i];
      end;
   end;

procedure TMenu.Zobraz;
begin
clrscr;
writeln ('Zadali jste hodnoty vektoru:');
writeln ('Hodnoty vektoru 1:');
vektor1.vypis_hodnoty;
writeln ('Hodnoty vektoru 2:');
vektor2.vypis_hodnoty;
writeln ('Stisknete cislo, jez odpovida operaci se kterou chcete pracovat:');
gotoxy(20,11);writeln ('1 Nasobeni vektoru cislem k');
gotoxy(20,13);writeln ('2 Soucet dvou vektoru');
gotoxy(20,15);writeln ('3 Skalarni soucet dvou vektoru');
end;

function TMenu.volba: char;
   begin
      volba := readkey;
   end;
procedure TMenu.A1;
   begin

   end;
procedure TMenu.A2;
   begin
      secti;// (vektor1.hodnoty, vektor2.hodnoty: TVektor; var vektor_vysledek.hodnoty: TVektor);
   end;
procedure TMenu.A3;
   begin

   end;

begin
   writeln ('Tento program bude provadet matematicke operace s vicerozmernymi vektory.');
   writeln ('Je mozno pocitat s maximalne 10 rozmery. S kolika rozmery chcete pracovat?: ');
   readln (x);
   if x > 10 then
      repeat
         writeln ('Bohuzel, pocet rozmeru vektoru je omezeno na 10.');
         writeln ('Zadejte prosim znovu, s kolikati vektory chcete pracovat? (Maximum je 10): ');
         readln (x)
      until x < 10;
   rozmeru := x;
   writeln ();
   writeln ('Hodoty vektoru 1:');
      vektor1.zadej_hodnoty (rozmeru);
   writeln ();
   writeln ('Hodoty vektoru 2:');
      vektor2.zadej_hodnoty (rozmeru);
  Menu0.f:= false;
   repeat
      Menu0.Zobraz;
      case Menu0.volba of
        '1': Menu0.A1;
        '2': Menu0.A2;
        '3': Menu0.A3;
      end;
   until Menu0.f;
readln ();
end.

Zadání je použít menu a počítat vektory (operace dle menu). Kdyby jsem věděl, že uživatel chce pracovat s 3mi rozměry, vytvořím jen proměnnou A, B a C a ty si už nějak mezi procedurami předám. Já ale nevím, kolik rozměrů bude chtít uživatel dělat, takže jsem se rozhodl pro to pole a hodnoty se ukládají. V programu mi tedy funguje zadání hodnot, ošetření ať jich není více než 10 (to se ale pak dá změnit třeba na 1000, podle toho jak velké pole si vytvořím) a funguje mi vypsání těch zadaných hodnot. Předpokládal jsem, že nyní už jen stačí vytvořit procedury na ty výpočty. Udělal jsem ted první na součet, ale stále mi to vyhazuje chyby a právě v deklaracích proměnných.

Vidí v tom přímo nějakou chybu? Já na tom dělám už týden po večerech a jsem v této fázi :o/

Nahlásit jako SPAM
IP: 178.72.244.–
JoDiK
~ Anonymní uživatel
987 příspěvků
3. 5. 2015   #5
-
0
-

#4 Gooo
Máš v tom pěkný chaos.

Tvektor je objekt obsahující ty zadané hodnoty. Vytvořil jsi tři proměnné tohoto typu a teď bys chtěl udělat součet těch prvních dvou a uložit ho do třetího. Proč se tu metodu ale pokoušíš nacpat do objektu Tvektor? Jako aby sám sebe sečetl s nějakým jiným a výsledky nacpal do třetího?

Zkus ty matematické operace cpát někam jinam ( třeba do Tmenu?) nebo jako samostatnou proceduru.

procedure sectiVektory(vektor1x, vektor2x: TVektor; var vektor_vysledekx: TVektor);
   var i:integer;
   begin
      for i:= 1 to x do
      begin
         vektor_vysledekx.hodnoty [i] := vektor1x.hodnoty [i] + vektor2x.hodnoty [i];
      end;
   end;


a hlavně pak při volání té procedury nepiš hovadiny:

procedure TMenu.A2;
   begin
      sectiVektory(vektor1, vektor2, vektor_vysledek);
   end;
Nahlásit jako SPAM
IP: 88.103.228.–
Gooo0
Newbie
4. 5. 2015   #6
-
0
-

#5 JoDiK
Zdravím a dekuji. Kdyz jsem to vytáhl z TVektor, tak mi to skutečně funguje. Chyby a hovadiny tam mám, ale já se v tom už motám dva dny, takže jsem zkoušel různé věci.

Problém je, že ta procedura na výpočet musí být součástí objektu TVektor a ještě k tomu musím dodělat předávání hodnot proměnných pomocí GET a SET, takže ty procedury musí být skutečně v TVektor.

Když to dám do ní, tak nefunguje. Když to dám jako samostatnou proceduru, tak to funguje. Dělám asi chybu pořád v těch proměnných. Každopádně, to co jsi poslal mi pomohlo, protože vidím že něco jede a vím na co zhruba kouknout.

Nahlásit jako SPAM
IP: 195.113.111.–
JoDiK
~ Anonymní uživatel
987 příspěvků
4. 5. 2015   #7
-
0
-

#6 Gooo
Musí to fungovat kdekoliv, ukaž kód kde ti to nefunguje jako součást Tvektor...

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
4. 5. 2015   #8
-
0
-

#7 JoDiK
A vůbec nejlepší by bylo taky dodat přesné a úplné zadání...

Nahlásit jako SPAM
IP: 88.103.236.–
Gooo0
Newbie
4. 5. 2015   #9
-
0
-

#8 JoDiK
Ahoj. Ještě jednou díky. V tuto chvíli mi to již skutečně funguje. Smazal jsem to, co mi dělalo chyby a jsem ve stádiu, kdy to funguje.

Když už jste mi s tímto problémem pomáhali, rád bych se na tomto příkladu zeptal na věci, které mi stále nejsou jasné (níže uvádím kompletní zdrojový kód):

  1. Jak jsem psal výše. JoDiK napsal, že píšu hovadiny, ale jednoduše mi to stále nedocvakává. Deklaraci procedury jsem pochopil dle vzoru: 
    procedure nazev_procedury (vstupni_promenne: datovy_typ; var vystupni_promenne: datovy_typ);

    Proměnné jsou lokální a tedy se nemusí shodovat s názvem proměnných, které jsou jako globální v programu (proto jsem se na různých místech pokoušel přejmenovávat a dodávat k nim _x a podobně). Ve finále jsem je všude smazal a nechal jen názvy procedur. Pravděpodobně to ale není správně, co?

  2. Nemám programátorské myšlení, takže když jsem měl dělat matematické operace, kde jsem měl sčítat a násobit dvě hodnoty, udělal jsem to tak, že jsem si vytvořil třídu TVector a pak jsem vytvořil vektor1, vektor2 a vysledek_vektor (které mi charakterizují právě dvě hodnoty a jednu proměnnou, do které se zapíše výsledek). Dále jsem v třídě vytvořil metody (procedury a funkce), které vyvolávám v programu. Abych ale nějakou metodu úspěšně vyvolal, musím použít název proměnné s tečkovou notací právě z těch tří vytvořených (takže chci vyvolat proceduru "zjisti_pocet_rozmeru", ale musím ji zapsat ve formátu "vektor1.zjisti_pocet_rozmeru". Bez toho "vektor1." to nejde, ale zase to nedává smysl. Pravděpodobně pomůže nemít tuto proceduru uvnitř třídy TVektor, ale cílem úkolu je mít ty metody uvnitř třídy.

  3. Mám správně použít ještě zapouzdření, tedy bych tam měl použít ještě metody GET a SET. V případě, že bych v programu použil proměnnou A, použiji proceduru, která bude obsahovat jen kód GetA := A a v procedurách uvnit třídy bych již používat proměnnou GetA. Já ale v programu použil pole s názvem "hodnoty" a uvnitř programu pracuji třeba s názvem "vektor1.hodnoty". Nepovedlo se mi přijít na to, jak v tomto případě použít zapouzdření, tedy použít GET.

Omlouvám se, že to takhle rozepisuji a většina to ani nechce číst, ale nevím jak jinak to popsat.

Zadání úkolu je:

Pomocí objektů devinujte n-rozměrné vektory a základní operace s nimi - násobení číslem k, součet, skalární součin. Použijte v jednoduchém programu s uživatelským výběrem metody pomocí menu.

Můj fungující kód s připomínkami výše je:

program vektory;
uses crt;
type
TVektor = object
   rozmeru: integer;
   hodnoty: array [1..10] of integer;
   procedure zjisti_pocet_rozmeru;
   procedure zadej_hodnoty;
   procedure vypis_hodnoty;
   procedure secti;
   procedure vynasob_cislem_k;
   procedure skalar;
   end;

TMenu = object
   f: boolean;                                                  // Proměnná jež používáme v menu
   procedure Zobraz;                                            // Procedura, která vypíše volby menu na obrazovku
   function volba: char;                                        // Funkce, která načte uživatelskou volbu
   procedure A1;
   procedure A2;
   procedure A3;
   end;

var vektor1, vektor2, vektor_vysledek: TVektor;
    Menu0: TMenu;
    x, y, i, rozmeru: integer;

procedure TVektor.zjisti_pocet_rozmeru;
   begin
      writeln ('Tento program bude provadet matematicke operace s vicerozmernymi vektory.');
      writeln ('Je mozno pocitat s maximalne 10 rozmery. S kolika rozmery chcete pracovat?: ');
      readln (x);
         if x > 10 then
         repeat
            writeln ('Bohuzel, pocet rozmeru vektoru je omezeno na 10.');
         writeln ('Zadejte prosim znovu, s kolikati vektory chcete pracovat? (Maximum je 10): ');
         readln (x)
      until x < 10;
   rozmeru := x;
   end;

procedure TVektor.zadej_hodnoty;
   begin
   writeln ();
   writeln ('Hodoty vektoru: ');
      for i := 1 to x do
      begin
         write ('Hodnota ',i,': ');
         readln (x);
         hodnoty [i] := x;
      end;
   writeln ();
   end;

procedure TVektor.vypis_hodnoty;
    begin
       i := 1;
       while hodnoty [i] > 0 do
          begin
             write (hodnoty [i],', ');
             i := i+1;
          end;
       end;

procedure TVektor.vynasob_cislem_k;
   var i, k: integer;
   begin
      write ('Zadejte hodnotu k, kterou chcete vektor nasobit: ');
      readln (k);
      for i := 1 to x do
         begin
            hodnoty [i] := hodnoty [i] * k;
         end;
      write ('Vami zadane hodnoty vektoru po vynasobeni cislem k: [');
      for i:= 1 to x do
         begin
            write (hodnoty [i]);
            write (',');
         end;
      writeln (']');
      readln ();
   end;

procedure TVektor.skalar;
   begin
   for i:= 1 to x do
      begin
         vektor_vysledek.hodnoty [i] := vektor1.hodnoty [i] * vektor2.hodnoty [i];
      end;
      write ('Sdvou Vami zadanych vektoru je: [');
      for i:= 1 to x do
      begin
         write (vektor_vysledek.hodnoty [i]);
         write (',');
      end;
   writeln (']');
   readln ();
   end;

procedure TVektor.secti;
   var i:integer;
   begin
      for i:= 1 to x do
      begin
         vektor_vysledek.hodnoty [i] := vektor1.hodnoty [i] + vektor2.hodnoty [i];
      end;
      write ('Soucet dvou Vami zadanych vektoru je: [');
      for i:= 1 to x do
      begin
         write (vektor_vysledek.hodnoty [i]);
         write (',');
      end;
      writeln (']');
      readln ();
   end;

procedure TMenu.Zobraz;
begin
   clrscr;
   gotoxy(5,3);
   writeln ('Stisknete cislo, jez odpovida operaci se kterou chcete pracovat:');
   gotoxy(10,6);
   writeln ('1 Nasobeni vektoru cislem k');
   gotoxy(10,7);
   writeln ('2 Soucet dvou vektoru');
   gotoxy(10,8);
   writeln ('3 Skalarni soucet dvou vektoru');
   gotoxy(10,10);
   writeln ('0 Ukonceni programu');
end;

function TMenu.volba: char;
   begin
      volba := readkey;
   end;
procedure TMenu.A1;
   begin
      clrscr;
      vektor1.zjisti_pocet_rozmeru;
      vektor1.zadej_hodnoty;
      vektor1.vynasob_cislem_k;
    end;

procedure TMenu.A2;
   begin
      clrscr;
      vektor1.zjisti_pocet_rozmeru;
      vektor1.zadej_hodnoty;
      vektor2.zadej_hodnoty;
      vektor1.secti;
   end;

procedure TMenu.A3;
   begin
      clrscr;
      vektor1.zjisti_pocet_rozmeru;
      vektor1.zadej_hodnoty;
      vektor2.zadej_hodnoty;
      vektor1.skalar;
   end;

begin
clrscr;
Menu0.f := false;
   repeat
      Menu0.Zobraz;
      case Menu0.volba of
        '1': Menu0.A1;
        '2': Menu0.A2;
        '3': Menu0.A3;
        '0': begin
               Menu0.f := true;
             end;
      end;
   until Menu0.f;
end.
Nahlásit jako SPAM
IP: 178.72.244.–
Sniper
~ Anonymní uživatel
215 příspěvků
4. 5. 2015   #10
-
0
-

Jsi si 100% jistý že to máš dělat pomocí typu object, a ne pomocí tříd (instanci třídy se také říká objekt)? Co já vím, tak minimálně v delphi je object drahnou dobu deprecated.

Nahlásit jako SPAM
IP: 90.179.201.–
JoDiK
~ Anonymní uživatel
987 příspěvků
4. 5. 2015   #11
-
0
-

Promiň, máš v tom čím dál větší chaos.

Já mám zase bohužel nejasnosti v tom zadání, kde tam vidíš požadavek na zapouzdření a metody GET a SET? To je nějaké dodatečné upřesnění zadání? Tak ať to zadavatel laskavě napíše rovnou do zadání, co tam být má a jak si to představuje. Takhle je to na dlouhý lokte... Navíc to zadání je tak abstraktní, že se u něho OOP řešení hůř navrhuje.

Ale když už se nad tím zamýšlím, poradil bych asi toto:

Objekt Tvektor může mít i metody pro matematické operace, ale spíš bych je viděl tak, že například metoda sčítání vektorů bude fungovat jako přičítání k danému vektoru a ten výsledek se buď uloží do aktuálního vektoru, nebo vrátí součtová data.

Třeba takto:

program vektory;
uses crt;
var
  rozmer: integer;
 
type
  Thodnoty = array [1..3] of integer;
 
TVektor = object
   hodnoty: Thodnoty;
   procedure SetH(vstup: Thodnoty);
   function GetH : Thodnoty;
   procedure Vypis;
   procedure Pricti(co: Thodnoty);
end;
 
procedure TVektor.SetH(vstup: Thodnoty);
begin
  hodnoty:=vstup;
end;
 
function TVektor.GetH : Thodnoty;
begin
  GetH:=hodnoty;
end;
 
procedure TVektor.Pricti(co: Thodnoty);
var i: integer;
begin
  for i:=1 to rozmer do hodnoty[i]:=hodnoty[i]+co[i];
end;
 
procedure TVektor.Vypis;
var i: integer;
begin
  for i:=1 to rozmer do write (hodnoty [i],', ');
  writeln;
end;
 
const
  v1:Thodnoty=(1,2,0);
  v2:Thodnoty=(3,4,0);
var 
  vektor1,vektor2,vysledek: TVektor;
  meziv : Thodnoty;
begin
  rozmer:=2;
  vektor1.SetH(v1);
  vektor2.SetH(v2);
  vektor1.Vypis;
  vektor2.Vypis;
  vysledek.SetH(vektor1.GetH);
  vysledek.Pricti(vektor2.GetH);
  vysledek.Vypis;
end.

 

Nahlásit jako SPAM
IP: 88.103.228.–
Gooo0
Newbie
5. 5. 2015   #12
-
0
-

#11 JoDiK
Zapouzdření pomocí GET a SET máme dáno v podpoře tohoto předmětu. Je výslovně napsáno, že lze řešit tečkovou notací, ale tu používat nesmíme.

S kvalitou zadání mám také problém. Mám zde ještě třetí příklad k řešení a jeho zadání jsem nepochopil vůbec. Zadání je: Pomocí objektů a dědičnosti rozliště typy klientů (id_konta, jmeno, suma) v bance na spořící a splácející úvěr. K nim definujte metody PocVklad (uložení id, jmeno, počáteční suma), Splatka (zaplacení jedné splátky), Sporeni (připsání jedné částky na spoření), getsuma, Vypis (jednoho klienta). Použijte v jednoduchém programu.

Pochopil jsem jen to, že mám udělat třídu Konto, k tomu udělám další dvě s dědičností na Spořící úvěr a Splácející úvěr a zbytek jsem nevěděl. Tak jsem psal dotaz jaká je představa a že naopak bude objektový typ Klient a k němu potomci Spořící a Úvěrový.  Takže chápu že to programátorské myšlení prostě nemám a nechápu jak detaily zjevné, tak třeba ty zadání.

No, živit se tím nebudu, tak potřebuji nějak dodělat ty programy a pak nějak písemku...

To řešení s přičítáním vektoru je dobrý nápad. Děkuji


Nahlásit jako SPAM
IP: 212.47.18.–
JoDiK
~ Anonymní uživatel
987 příspěvků
5. 5. 2015   #13
-
0
-

#12 Gooo

Je výslovně napsáno, že lze řešit tečkovou notací, ale tu používat nesmíme.

Co to je za "blbost?" Samozřejmě bez teček se to dá zapsat pomocí with - když je toho víc, ale že by to někdo zakazoval s tečkovou notací, to slyším prvně? Nebylo to myšleno nějak jinak?

with vysledek do
  begin 
    SetH(vektor1.GetH);
    Pricti(vektor2.GetH);
    Vypis;
  end;
Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
5. 5. 2015   #14
-
0
-

#12 Gooo
Teď mě tak napadlo, nebylo to spíš řečeno takto?

K datům objektů přistupujte výhradně prostřednitvím metod Get/Set, máte zakázáno pracovat s nimi mimo objekt tečkovou notací!

Tak tomu bych rozumněl... a tak je to správně... má pravdu předsedo... to je zapouzdření

Ale metody se volají přes tečkovou notaci, jinak to nejde!

Nahlásit jako SPAM
IP: 88.103.236.–
Gooo0
Newbie
5. 5. 2015   #15
-
0
-

#13 JoDiK
Máme to napsáno v podpoře takto: 

K jednotlivým atributům objektu se můžeme v programu i mimo objekt dostat použitím tečkové notace, ale nebudeme tuto možnost používat. 

Nahlásit jako SPAM
IP: 212.47.18.–
JoDiK
~ Anonymní uživatel
987 příspěvků
5. 5. 2015   #16
-
0
-

#15 Gooo
No sláva, tak jsme doma! Tys to jenom špatně pochopil, metody můžeš vesele volat...

Nahlásit jako SPAM
IP: 88.103.236.–
Gooo0
Newbie
5. 5. 2015   #17
-
0
-

#16 JoDiK
Hmmm, jdu se trochu zastydět do rohu :o).

Ale takhle nějak jsem to chápal, že metody volám tečkovou notací a jen musím metodou GET a SET ošetřit proměnné, jež se předávají do metod ve třídě.

Tedy od uživatele jsem získal množství rozměrů a uložil jsem ji do proměnné X. nyní bych měl podle toho co jsem pochopil, udělat proceduru GETX:

procedure GetX;
   begin
      GetX := X;
   end;

nebo snad ještě by se ty názvy neměly shodovat?

Nahlásit jako SPAM
IP: 212.47.18.–
JoDiK
~ Anonymní uživatel
987 příspěvků
5. 5. 2015   #18
-
0
-

#17 Gooo
promiň,

Ale takhle nějak jsem to chápal, že metody volám tečkovou notací

tady píšeš něco jiného:

Problém je, že ta procedura na výpočet musí být součástí objektu TVektor a ještě k tomu musím dodělat předávání hodnot proměnných pomocí GET a SET, takže ty procedury musí být skutečně v TVektor.

Když to dám do ní, tak nefunguje. Když to dám jako samostatnou proceduru, tak to funguje.

Rozlišuj prosím obecnou proceduru mimo objekty, která nesmí přistupovat k datům objektu a proti tomu procedura v objektu alias metoda objektu, která naopak jediná může přistupovat k datům navíc bez nějakých teček!

Tedy od uživatele jsem získal množství rozměrů a uložil jsem ji do proměnné X

Formuluj přesně, v programování je to nezbytné! získal jsi množství rozměrů nebo množství souřadnic? do proměnné x jsi uložil jednu hodnotu, nebo celé to množství?

Ale chceš-li to obecně: zkus prosím taky nejdřív nastudovat nějakou teorii, než se pustíš do složitějšího programu.

Objekt má nějaká data (atributy), do kterých smí přistupovat jen metody objektu. Hodnoty do nich budou tedy ukládat metodou (procedurou) set a vybírat se budou metodou (funkcí) get. Má-li objekt vlastnost x, můžeš navrhnout takovéto metody (ne obecné procedury!):

procedure Tobjekt.SetX(vstup : integer);
   begin
      x := vstup;
   end;

function Tobjekt.GetX;
   begin
      GetX := X;
   end;
Nahlásit jako SPAM
IP: 88.103.236.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

Podobná vlákna

Const v deklaraci funkce — založil Do Tuan

Procedury — založil Akk

Funkce a procedury — založil kozomelec

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý