Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa argumentima funkcije

[es] :: Pascal / Delphi / Kylix :: Problem sa argumentima funkcije

Strane: 1 2

[ Pregleda: 6776 | Odgovora: 33 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.68.EUnet.yu.



Profil

icon Problem sa argumentima funkcije08.02.2005. u 00:43 - pre 233 meseci
function TKlasa.Funkcija(a, b: integer; const c, d, e: byte): integer;

Posle pozivanja navedene funkcije
Code:
Klasa.Funkcija(-10, 10, 3, 2, 1);

u samoj funkciji argumenti c, d i e nemaju vrednosti 3, 2, 1!

Sta se ovde desava???

Unapred hvala!
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Problem sa argumentima funkcije08.02.2005. u 01:29 - pre 233 meseci
Postuj celu fju i deo koda gde je pozivas ako nije problem, tako ce nam biti lakse da uocimo problem...
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.76.EUnet.yu.



Profil

icon Re: Problem sa argumentima funkcije08.02.2005. u 11:20 - pre 233 meseci
Code:
procedure TAI.RootSearchAB(alpha, beta: integer; const depth: byte; var n, x, y: byte);
label 1;
var f, i, p, la, nowp: integer;
    a: TDynamicArray;
begin
  np:=0;
  form1.Memo1.Lines.Clear;
  form1.Memo2.Lines.Clear;
  nowp:=NumOfWinPawns;
  GenerateAllMoves(self.color, depth, a);
  la:=(length(a) div 5)-1;
  for i:=0 to la do
  begin
    MakeMove(a[i*5], a[i*5+1], a[i*5+2], a[i*5+3], a[i*5+4], 9);
    myGame.gameState:=(1-myGame.gameState);

    f:=-NegaMaxAB(alpha, beta, depth-1, (1-self.color), nowp);
    if f>alpha then
    begin
      alpha:=f;
      p:=i;
    end;
    form1.Memo1.Lines.Append(inttostr(i)+': '+inttostr(a[i*5])+inttostr(a[i*5+1])+ inttostr(a[i*5+2])+ inttostr(a[i*5+3])+ inttostr(a[i*5+4]));
    form1.Memo2.Lines.Append(inttostr(f));
    myGame.gameState:=(1-myGame.gameState);
    MakeMove(a[i*5], a[i*5+3], a[i*5+4], a[i*5+1], a[i*5+2], 9);
    if alpha>=beta then goto 1;
  end;
1:
  n:=jumped;
  n:=steped;
  n:=a[p*5];
  x:=a[p*5+3];
  y:=a[p*5+4];
  form1.Label1.Caption:='Broj procenjenih pozicija je '+IntToStr(np);
end;

function TAI.NegaMaxAB(alpha, beta: integer; const depth, clr, nowp: byte): integer;
label 1, 2;
var f, i, la, sign, a1, b1, c1, d1, f1, g1: integer;
    a: TDynamicArray;
begin
  sign:=ord(self.color=clr)+ord(self.color<>clr)*(-1);
  if (depth<=0) or myGame.players[1-clr].IAmWinner
  then
  begin
    sign:=sign*(depth+1);
    result:=sign*PositionValue(self.a, self.b, self.c, self.d, self.e, self.f, self.g, self.h, self.q, nowp);
    inc(np);
  end
  else
  begin
    GenerateAllMoves(clr, depth, a);
    la:=(length(a) div 5) -1;
    if clr<>self.color then //minimizing
    begin
      for i:=0 to la do
      begin
        myGame.players[clr].MakeMove(a[i*5], a[i*5+1], a[i*5+2], a[i*5+3], a[i*5+4], 9);
        myGame.gameState:=(1-myGame.gameState);

        f:=-NegaMaxAB(alpha, beta, depth-1, 1-clr, nowp);
        if f<beta then beta:=f;

        myGame.gameState:=(1-myGame.gameState);
        myGame.players[clr].MakeMove(a[i*5], a[i*5+3], a[i*5+4], a[i*5+1], a[i*5+2], 9);
        if alpha>=beta then goto 1;
      end;
1:    result:=beta;
    end
    else
    begin
      for i:=0 to la do
      begin
        myGame.players[clr].MakeMove(a[i*5], a[i*5+1], a[i*5+2], a[i*5+3], a[i*5+4], 9);
        myGame.gameState:=(1-myGame.gameState);

        f:=-NegaMaxAB(alpha, beta, depth-1, 1-clr, nowp);
        if f>alpha then alpha:=f;

        myGame.gameState:=(1-myGame.gameState);
        myGame.players[clr].MakeMove(a[i*5], a[i*5+3], a[i*5+4], a[i*5+1], a[i*5+2], 9);
        if alpha>=beta then goto 2;
      end;
2:    result:=alpha;
    end;
  end;
end;


...

Sporna funkcija je Negamax koju poziva Rootsearch, a ovu poziva sledeca...

Code:
procedure TAI.YourTurn;
var n, x, y, depth: byte;
begin
    LoadGens(
    strtoint(form1.memo3.Lines[0]),
    strtoint(form1.memo3.Lines[1]),
    strtoint(form1.memo3.Lines[2]),
    strtoint(form1.memo3.Lines[3]),
    strtoint(form1.memo3.Lines[4]),
    strtoint(form1.memo3.Lines[5]),
    strtoint(form1.memo3.Lines[6]),
    strtoint(form1.memo3.Lines[7]),
    strtoint(form1.memo3.Lines[8]));

  movementStarted:=false;
  jumped:=0;
  steped:=0;
  myTurn:=true;
  timer.Tag:=0;
  timer.Interval:=100;
  myGame.AnounceTime;
  depth:=StrToInt(Form1.Edit1.Text);
  RootSearchAB(-maxint-1, maxint, depth, n, x, y);
  inc(game.numberOfMoves);
  setlength(game.moves, game.numberOfMoves*4);
  game.moves[length(game.moves)-4]:=Pawns[n].x;
  game.moves[length(game.moves)-3]:=Pawns[n].y;
  game.moves[length(game.moves)-2]:=x;
  game.moves[length(game.moves)-1]:=y;

  MakeMove(n, pawns[n].x, pawns[n].y, x, y, 9);

  game.PlayerDone;
end;


[Ovu poruku je menjao PeraKojotSuperGenije dana 09.02.2005. u 01:25 GMT+1]
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
217.26.66.*



+1 Profil

icon Re: Problem sa argumentima funkcije08.02.2005. u 17:16 - pre 233 meseci
Byte tip ima opseg 0..255, a ti gore pozivas sa 1-nesto, ako je 1-nesto < 0 onda se radi wrappovanje bajta tj. 1-nesto = 257 - nesto, ako je nesto>1. Mozda ovo helps, a mozda si tako i hteo, nisam preterano zalazio u kod.
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.40.EUnet.yu.



Profil

icon Re: Problem sa argumentima funkcije08.02.2005. u 20:54 - pre 233 meseci
Nije uopste u tome stvar. Onaj argument depth u proceduri YourTurn ima vrednost (konkretan primer) 2. Kada se pozove RootSearch depth tu ima vrednost 220. U prvom pozivu Negamax ima vrednost 120 umesto depth-1 sto je 219! A sto se tice onoga 1-nesto to nesto je color(boja). Ona je uvek 0 ili 1 pa 1-color invertuje boju.
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.dial.b92.net.



+1 Profil

icon Re: Problem sa argumentima funkcije08.02.2005. u 23:48 - pre 233 meseci
Postavi break point na liniju gde imas:

RootSearchAB(-maxint-1, maxint, depth, n, x, y);

Pa odatle pazljivo posmatraj sta se desava sa vrednoscu promenjivih, narocito pre i posle linija:

GenerateAllMoves(self.color, depth, a);
i
sign:=ord(self.color=clr)+ord(self.color<>clr)*(-1);


Kada ti je program pauziran i nalazis se u Delphi-u samo drzi pokazivac misa nad promenjivom i dobices njenu trenutnu vrednost. Ima i naprednijih tehnika pracenja, ali probaj za sada sa ovom.

Negde gresis, mozda na liniji

GenerateAllMoves(self.color, depth, a);

sta se tu desava? Da li se tu depth prosledjuje po imenu ili vrednosti?

Onda mozemo da vidimo dalje. Kompajler ne gresi na takvim stvarima inace ne bi mogao i najprostiji Delphi program da pokrenes.
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.90.EUnet.yu.



Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 00:23 - pre 233 meseci
Code:
procedure GenerateAllMoves(c: TColor;const  d: byte; var a: TDynamicArray);

Zbog const d:byte mislim da GenerateAllMoves ne moze da pravi probleme.

Code:
procedure TAI.RootSearchAB(alpha, beta: integer; const depth: byte; var n, x, y: byte);

Kada iz YourTurn pozovem RootSearchAB cim (sa F7) udjem u RootSearchAB st(r)anje je sledece:
alpha = -maxint-1 sto je i ocekivano;
beta = maxint sto je takodje ocekivano;
depth = 220 sto nije ocekivano;
n = Inaccessable value sto takodje nije ocekivano;
x = 0 OK;
y = 0 OK;

Sve ove vrednosti se vide u kako hintovima tako i u WatchList-u.
Slicne brlje se desavaju kada se pozove NegaMax.
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 01:19 - pre 233 meseci
Ne verujem da je u ovome problem, ali probaj da promenis "konvenciju pozivanja", valjda se tako zove... U produzetku problematicne fje koju pozivas probaj da stavis stdcall; ili cdecl;...
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.94.EUnet.yu.



Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 02:01 - pre 233 meseci
Calling Convection ?!?
Za ovo cujem prvi put u zivotu!, ali je pomoglo (bar za sada tako izgleda)!!! Mnogo HVALA (mada ti od toga nemas nista)! Ja sam se vec izgubio. Cak sam poceo da trazim zakrpe za Delphi 7.

Ima li neko posebno lepo mesto na ovom svetu (web, knjiga, e-knjiga, kurs, ...) gde bih mogao da naucim vise o ovome i slicnom stvarima (a da to nije regularni HELP, jer mi nikad ne bi palo na pamet da gledam sta ima pod calling convention)?

Jos jednom HVALA!
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.162.EUnet.yu.



+1 Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 12:08 - pre 233 meseci
Evo primera koji radi kod mene na D7. Probaj pa javi kako radi:


p.s. Ukljuci "Range checking" u Project->Options->Compiler pa uradi build programa pa javi kako radi.
Prikačeni fajlovi
 
Odgovor na temu

sasas
Saša Slavnić
radim za neke švabe

Član broj: 35478
Poruke: 617
*.zaslon-telecom.si.



Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 12:28 - pre 233 meseci
čekajte ljudi, polako... jel moze neko da objasni u čemu je fazon?
Zašto radi sa jednim a ne radi sa drugim calling conventionom (i sa kojim uopšte radi)? Zašto će mu pomoći range checking, ako je već algoritam ispravan?

Prvi put vidim da u Delphiju neko pomera opcije kompajlera (i generisanja kooda) i da to stvarno ima efekta na 'ispravniji' rad programa. Pa ako ima neko da malo razjasni stvari...

ss.
When something is hard to do, then it's not worth doing.
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.84.EUnet.yu.



Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 13:25 - pre 233 meseci
Ovo sto si ti poslao u sustini radi (smeta samo sto je self.color=10243, ali to nije vazno, jer se kod mene sve to desava u jednoj klasi koja ima polje color i koje uvek ima vrednosti 0 ili 1, bla bla bla...). Nije mi jasno zasto u kombinaciji sa ostalim linijama mog koda pravi problem, ali dodavanje bilo koje od onih "calling convention" direktiva koje cine da se argumenti ucitavaju sa desna na levo popravlja stvar.

Kako da znam kada ovo treba da koristim? Imam dosta metoda pa je malo mucno da proveravam da li na svaku pojedinacno treba da stavljam "nesrecnu" direktivu!

Inace "Range checking" mi je u ovoj fazi uvek ukljucen.


Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
217.119.242.*



+62 Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 13:39 - pre 233 meseci
Sta je OVO:
Code:

label 1;


Crni PeraKojote, sta to cinis? i to izmedju deklaracije funkcije i var dela...brrr; nikad to nisam video. U stvari nikad u zivotu nisam upotrebio goto() u Pascalu.

Rajko
 
Odgovor na temu

sasas
Saša Slavnić
radim za neke švabe

Član broj: 35478
Poruke: 617
*.zaslon-telecom.si.



Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 14:23 - pre 233 meseci
Citat:
... i to izmedju deklaracije funkcije i var dela...brrr; ...


Ne brini rajko, to je samo deklaracija labele, ne skače na to mesto, nego dole unutar funkcije. Daleko od toga da je lepo koristiti goto, ali verovatno se nije moglo bolje.

ss.
When something is hard to do, then it's not worth doing.
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.1.EUnet.yu.



Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 15:46 - pre 233 meseci
Jasno je i meni koliko je goto ruzna naredba. Moze umesto nje da stoji i break, sto bi u sustini radilo isto: izlazak iz for petlje. Goto isprobavam zbog toga sto mislim da ce biti brze od break.
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
212.102.134.*



+1 Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 18:09 - pre 233 meseci
Problem moze biti ako se zoves neku funkciju iz nekog dll-a. Tu jednostavno mora da se pazi na nacin na koji se nacin prosledjuju parametri. U ostatku programa nema sta da podesavas jer kompajler "zna" svaku funkciju, tj. kako prosledjuje parametre (uglavnom register varijanta zbog brzine). Ako onaj ko poziva neku funkciju promasi tip prosledjivanja argumenata moze doci do korupcije steka i tada obicno dolazi do "access violation" greske, ali kod tebe toga nema.

Dok razmisljam o tvom problemu uradi sledece: u opcijama kompajlera ukljuci "stack frames" i iskljuci "optimization" pa probaj (obrisi posle toga sve dcu fajlove iz projekta i uradi build). Da vidimo :)

p.s. Najlakse bi bilo kada bih mogao da sednem za tu masinu i preko CPU debug prozora prekontrolisao EBP i ESP registre procesora kako bih video sta se tu konkretno desava po pozivu funkcije, kao i sta je i kako prosledjeno od argumenata. Ali sad sta mozemo...

p.s. 2

Onaj primer sto sam ti poslao radi tako da obavezno obrises sve dcu fajlove iz projekta.
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.201.eunet.yu.



Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 19:18 - pre 233 meseci
Citat:
Dok razmisljam o tvom problemu uradi sledece: u opcijama kompajlera ukljuci "stack frames" i iskljuci "optimization" pa probaj (obrisi posle toga sve dcu fajlove iz projekta i uradi build). Da vidimo

Prob'o. Bez onih direktiva i dalje ne radi. Sa njima, kao i pre, radi.


Citat:
p.s. Najlakse bi bilo kada bih mogao da sednem za tu masinu i preko CPU debug prozora prekontrolisao EBP i ESP registre procesora kako bih video sta se tu konkretno desava po pozivu funkcije, kao i sta je i kako prosledjeno od argumenata. Ali sad sta mozemo...

Da li bi pomoglo ako bih ti poslao ceo projekat?

Citat:
Onaj primer sto sam ti poslao radi tako da obavezno obrises sve dcu fajlove iz projekta.

Kog projekta? Zasto?
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.vdial.verat.net.



+1 Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 21:52 - pre 233 meseci
Mozda je glupo, ali sta se desava ako promenis redosled parametara? Jel gresi samo sa byte tipom? Jel si probao druge tipove (iako nema logike da ne radi sa bytom)? Takodje nema logike da cdecl ili stdcall resava stvar.
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.scnet.yu.



Profil

icon Re: Problem sa argumentima funkcije09.02.2005. u 22:53 - pre 233 meseci
Promenu redosleda, kao i tipova (stavljao sam da svi argumenti budu integer) ne resava problem. To sam prvo probao...
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

neor
Nenad Orlovic

Član broj: 26828
Poruke: 74
*.metrohive.net.



Profil

icon Re: Problem sa argumentima funkcije10.02.2005. u 07:17 - pre 233 meseci
Mislim da ce ovako tesko neko uspeti da ti pomogne. Probaj da izbacis iz tog koda sve sta mozes (narocito pozivi finkcija koje nisi ovde dao) a da se problem i dalje javlja i stavi onda ovde neki kod koji moze da se kompajlira pa da moze da se proba. Ovako je sve samo nagadjanje.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Problem sa argumentima funkcije

Strane: 1 2

[ Pregleda: 6776 | Odgovora: 33 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.