Sziasztok!
Van egy
while(1)
{
if(feltetel_1){
fv_1();
}else if(feltetel_2){
fv_2();
}else if(feltetel_3){
...
}
else{
fv_n();
}
}
vagy ha tetszik, akkor case elagazas, amelyeben a felteteleket es
a fuggvenyeket dinamikusan cserelgetni kellene.
Mindig mast kellene hogy kiprobaljon minden iteracioban.
Meg a fveket meg tudnam csinalni, ugye fvekre mutato pointereket
tartalmazo tomb.
De a felteteleket hogyan cserelgessem?
Azokat hogy rakjam tombbe?
Tamas
- 1871 megtekintés
Hozzászólások
Minden feltételt rakj külön fv-be.
Ha C++, akkor: bool felt_1();
Ha C, akkor: int felt_1();
Ezeket már tömbbe rakhatod, és cserélgetheted.
Jobb ötletem (ennyi infó alapján) nincs.
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
függvény objektum?
csinálsz egy
class func
{
public:
func();
~func();
virtual void fn();
virtual bool felt();
}; -t és ebből származtatod az egyes függvényeknek megfelelő osztályokat, ahol megvalósítod az fn() és felt()
függvényeket, ezekből tudsz az ősosztály miatt tömböt csinálni, és minden tömb beli elemnek lesz fn() és felt() függvénye, és mindegyik mást csinál
- A hozzászóláshoz be kell jelentkezni
Ezzel annyi a gond, hogy nem tudjuk, hogy C, vagy C++-ban kell.
Illetve, én úgy értelmeztem a leírást, hogy a feltételeket és a fv-eket egymástól függetlenül lehet keverni.
Egyébként a függvény objektum kifejezés már foglalt, ezt tehát nevezzük máshogy. :)
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
topic címében benne volt, hogy C++-ban
- A hozzászóláshoz be kell jelentkezni
:))
"A feladat megoldását nagyban segíti annak megértése..."
Vak vagyok, bocs.
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
class Condition {
virtual bool operator() = 0;
virtual ~Condition() {};
}
class Function {
virtual void operator() = 0;
virtual ~Condition() {};
}
Ezekből származtatsz, pl.
Condition *felt = ...
Function * fv = ...
if (felt()) {
fv()
}
stb.
Ezáltal teljesen független lesz a kettő egymástól :)
- A hozzászóláshoz be kell jelentkezni
Na, ez már függvény objektum...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Hm, hat nem latom hogy tul specifikalt lenne a problema, de c-ben igy csinalnam:
typedef struct
{
int n;
int (*funct)(void *param);
} idfunct;
...
int fv_1(void *param)
{
...
}
idfunct functlist[] =
{ { 1 , fv_1 } ,
{ 2, fv_2 } ,
{ 3, fv_3 } ,
...
{ -1, NULL }
}
...
idfunct *w;
for ( w=functlist ; w->funct != NULL ; w++ )
{ if ( w->id == N )
{ ret=w->funct(param);
break;
}
}
if ( w->funct==NULL )
default_case();
marmint akkor, ha a "feltetel" tenyleg helyettesitheto" egy ege'sz sza'mmal valo' osszehasonlitassal. ha nem, akkor
typedef struct
{
int (*condition)(void *param);
int (*funct)(void *param);
} condfunct;
idfunct functlist[] =
{ { cnd_1 , fv_1 } ,
{ cnd_2, fv_2 } ,
{ cnd_3, fv_3 } ,
...
{ NULL, NULL }
}
...
condfunct *w;
for ( w=functlist ; w->condition != NULL ; w++ )
{ if ( w->condition(param) )
{ ret=w->funct(param);
break;
}
}
if ( w->condition==NULL )
default_case();
Az elso" esetet persze lehet optimalizalni, hogy a functlist[] eleve rendezett (az id-k szerint), e's a megfelelo" id-t egy bina'ris kerese'ssel keresed meg, akkor log(N) ido"ben megtalalja a kivant fv-t (vagy hash-tablaval, vagy btree-vel, vagy barmi egyebbel is lehet persze csinalni, csak az ma'r elegge bonya). Ilymodon a masodik esetet viszont nem lehet optimalizalni.
A.
- A hozzászóláshoz be kell jelentkezni
Sziasztok!
A következőt sikerült összehoznom:
for(int k=0; k < szabalyhalmaz.size(); k++)
{
// feltetel
if(szabalyhalmaz[k].second.first(pp,sp))
{
for(int i=0; i < szabalyhalmaz[k].second.second.size(); i++ )
{
// cselekves
szabalyhalmaz[k].second.second[i](pp,sp);
}
}
}
Egyetlen probléma van: ez
if()
if()
if()
alakú, nekem:
if()
else if()
else if()
else
alakú kellene.
Tamás
- A hozzászóláshoz be kell jelentkezni
Az elágazás eleve úgy néz ki, hogy
if feltétel then valami
if feltétel2 then valami2
stb.
A programozási nyelvek általában ezt nem így oldják meg, hanem biztosítanak egy olyan szerkezetet, amelyik úgy működik, hogy ha az első nem teljesül, akkor megvizsgálja a második feltételt, stb.
Tehát az
if A then S1
else if B then S2
else if C then S3
else S4
valójában:
if A then S1
if not A and B then S2
stb. (bár ezt épp nem determinsztikus, a szokásos elágazás meg igen).
- A hozzászóláshoz be kell jelentkezni
Akkor már inkább inkább:
if not A then goto :b
S1
goto :end
:b if not B then goto :c
S2
goto :end
:c if not C then goto :else
S3
goto :end
:else S4
:end
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
for(int k=0; k < szabalyhalmaz.size(); k++)
{
// feltetel
if(szabalyhalmaz[k].second.first(pp,sp))
{
for(int i=0; i < szabalyhalmaz[k].second.second.size(); i++ )
{
// cselekves
szabalyhalmaz[k].second.second[ i](pp,sp);
}
break;
}
}
Így nem jó?
(Fogalmam nincs mi ez a rakás first/second cuccos, de te tudod. :) Esetleg bevezethetsz pár structot (vagy tuple esetleg).)
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Jól gondolom akkor?
if( not(korábbi_feltételek_összeéselve) && aktuális_feltéltel )
{
}
- A hozzászóláshoz be kell jelentkezni
lehet...
Vagy pedig a külső ciklusból kilépsz, amint teljesül valamelyik feltétel, és akkor az if ... else if ... stb. szerkezetet a feltételek megadásának sorrendje határozza meg.
- A hozzászóláshoz be kell jelentkezni
Ezazazezaz csak a BREAK kellett, és megjavult, thx
- A hozzászóláshoz be kell jelentkezni