Existuje datový typ metoda? – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Existuje datový typ metoda? – Pascal – Fórum – Programujte.comExistuje datový typ metoda? – Pascal – Fórum – Programujte.com

 

Wimby
~ Anonymní uživatel
50 příspěvků
8. 7. 2009   #1
-
0
-

Nevíte, jestli v nějakém rozšíření pascalu se může použít deklarace typu procedura/funkce, a přiřadit do proměnné tohoto typu metodu?

var metoda : procedure;


begin
metoda := @objekt.metoda; {přiřazení metody}
metoda; {volání metody objektu}
end.

Nahlásit jako SPAM
IP: 83.208.196.–
MiMi
~ Anonymní uživatel
45 příspěvků
8. 7. 2009   #2
-
0
-

To Wimby : podla toho co si napisal ti ide skor o datovy typ procedura. Myslim ze hentak tospravit nejde ale to co si tam napisal ide spravit s funkciou.

Nahlásit jako SPAM
IP: 217.145.198.–
Wimby
~ Anonymní uživatel
50 příspěvků
8. 7. 2009   #3
-
0
-

MiMi :

podla toho co si napisal ti ide skor o datovy typ procedura.


Jde mi o datový typ procedura, do kterého je možné přiřadit proceduru z objektu.

Myslim ze hentak tospravit nejde ale to co si tam napisal ide spravit s funkciou.


Jak? Změna klíčových slov z "procedure" na "function" nefunguje.

Tady je příklad:
type

TMetoda : procedure;

TObjekt = object
constructor Vytvor;
procedure VolejMetodu;

var
Metoda : TMetoda;

constructor TObjekt.Vytvor;
begin
Metoda := @VolejMetodu
end;
Tohle selže očekávanou chybou ve stylu "Type mismatch", protože do datového typu obyčejné procedury se snažim přiřadit metodu (což ve skutečnosti je vlastně taky procedura, ale má navíc parametr, do kterého se přiřazuje objekt jenž ji volá - což je vlastně můj problém).

A tak bych se chtěl zeptat, jestli nějaké rozšíření pascalu nemá nějaký datový typ "metoda"? Něco, co by očekávalo přiřazení metody místo obyčejné procedury.

Nahlásit jako SPAM
IP: 83.208.196.–
Mircosoft+1
Věrný člen
10. 7. 2009   #4
-
0
-

Pokud vim, tak specialni typ "metoda" neni v zadnem Pascalu, jenom procedura. Problem tady vidim spis v tom, ze do globalni promenne Metoda, ktera s tim objektem nema nic spolecneho, chces ulozit adresu metody objektu, coz potom nemuze behat (metoda pristupuje k atributum objektu, ktere ta globalni promenna "kolem sebe" nema, tak by sahala do prazdna).
Jit by to mohlo za pouziti mirneho nasili: pointer(Metoda):=@VolejMetodu, ale netroufam si odhadovat, jak to dopadne, az Metodu zavolas :-].

Co konkretne resis? Nebylo by schudnejsi nejak vyuzit dedicnost, pretizeni metod a tak? Nebo to naopak napsat neobjektove?

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Wimby
~ Anonymní uživatel
50 příspěvků
12. 7. 2009   #5
-
0
-

Mam mnoho malých objektů, které se dědí, a tak pro ně dělám rychlejší alokaci. Jenže New a Dispose jsou mi k ničemu, místo toho jsem odkázanej na GetMem a FreeMem, přičemž nefungují virtuální metody. Takže bych řešil virtuální metody tak jak je řeší kompilátor - dát do objektu ukazatel na tabulku virtuálních metod, a v konstruktoru vyřešit přiřazení správných metod do tabulky. Něco na tenhle způsob:

type

TabulkaVirtualnichMetod = record
Ahoj : procedure;
end;

Objekt1 = object
Virtualni : ^TabulkaVirtualnichMetod;
constructor Vytvor;
procedure Ahoj;
end;

Objekt2 = object(Objekt1)
Virtualni : ^TabulkaVirtualnichMetod;
constructor Vytvor;
procedure Ahoj;
end;

PObjekt1 = ^Objekt1;
PObjekt2 = ^Objekt2;

var
TVMObjekt1,TVMObjekt2 : TabulkaVirtualnichMetod;

constructor Objekt1.Vytvor;
begin
Virtualni := @TVMObjekt1;
end;

procedure Objekt1.Ahoj;
begin
WriteLn('Objekt1');
end;

constructor Objekt2.Vytvor;
begin
Virtualni := @TVMObjekt2;
end;

procedure Objekt2.Ahoj;
begin
WriteLn('Objekt2');
end;

var
O1 : PObjekt1;

begin
TVMObjekt1.Ahoj := @Objekt1.Ahoj;
TVMObjekt2.Ahoj := @Objekt2.Ahoj;
O1 := PObjekt2(Alokuj(SizeOf(PObjekt2)));
O1^.Virtualni^.Ahoj; {Napise "Objekt2"}
end;

Nahlásit jako SPAM
IP: 83.208.196.–
Mircosoft+1
Věrný člen
13. 7. 2009   #6
-
0
-

Rychlejsi alokaci? To zni zajimave, co tim myslis?

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
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, 3 hosté

Podobná vlákna

Datový typ — založil Rade.k

Dátový typ — založil zonda

Datový typ v tabulce — založil LiDr

Špatný datový typ? — založil Díkydíky

Datový typ - 256 bitů — založil Hlavinka

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ý