Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 33 odgovora
  • 9.497 pregleda

Najnovija ↓

Problem sa argumentima funkcije 08.02.2005. u 01:43 · pre 264 meseca #1
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!
Potpis
Sendvic uvek pada na namazanu stranu!
Re: Problem sa argumentima funkcije 08.02.2005. u 02:29 · pre 264 meseca #2
Postuj celu fju i deo koda gde je pozivas ako nije problem, tako ce nam biti lakse da uocimo problem...
Re: Problem sa argumentima funkcije 08.02.2005. u 12:20 · pre 264 meseca
izmenjeno 1 put, poslednji put PeraKojotSuperGenije 09.02.2005. u 01:25
  1. PeraKojotSuperGenije09.02.2005. u 01:25zapis iz teksta poruke
#3
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;
Potpis
Sendvic uvek pada na namazanu stranu!
Re: Problem sa argumentima funkcije 08.02.2005. u 18:16 · pre 264 meseca #4
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.
Re: Problem sa argumentima funkcije 08.02.2005. u 21:54 · pre 264 meseca #5
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.
Potpis
Sendvic uvek pada na namazanu stranu!
Re: Problem sa argumentima funkcije 09.02.2005. u 00:48 · pre 264 meseca #6
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.
Re: Problem sa argumentima funkcije 09.02.2005. u 01:23 · pre 264 meseca #7
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.
Potpis
Sendvic uvek pada na namazanu stranu!
Re: Problem sa argumentima funkcije 09.02.2005. u 02:19 · pre 264 meseca #8
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;...
Re: Problem sa argumentima funkcije 09.02.2005. u 03:01 · pre 264 meseca #9
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!
Potpis
Sendvic uvek pada na namazanu stranu!
Re: Problem sa argumentima funkcije 09.02.2005. u 13:28 · pre 264 meseca #11
č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.
Potpis
When something is hard to do, then it's not worth doing.
Re: Problem sa argumentima funkcije 09.02.2005. u 14:25 · pre 264 meseca #12
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.

Potpis
Sendvic uvek pada na namazanu stranu!
Re: Problem sa argumentima funkcije 09.02.2005. u 14:39 · pre 264 meseca #13
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
Re: Problem sa argumentima funkcije 09.02.2005. u 15:23 · pre 264 meseca #14
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.
Potpis
When something is hard to do, then it's not worth doing.
Re: Problem sa argumentima funkcije 09.02.2005. u 16:46 · pre 264 meseca #15
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.
Potpis
Sendvic uvek pada na namazanu stranu!
Re: Problem sa argumentima funkcije 09.02.2005. u 19:09 · pre 264 meseca #16
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.
Re: Problem sa argumentima funkcije 09.02.2005. u 20:18 · pre 264 meseca #17
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?
Potpis
Sendvic uvek pada na namazanu stranu!
Re: Problem sa argumentima funkcije 09.02.2005. u 22:52 · pre 264 meseca #18
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.
Re: Problem sa argumentima funkcije 09.02.2005. u 23:53 · pre 264 meseca #19
Promenu redosleda, kao i tipova (stavljao sam da svi argumenti budu integer) ne resava problem. To sam prvo probao...
Potpis
Sendvic uvek pada na namazanu stranu!
Re: Problem sa argumentima funkcije 10.02.2005. u 08:17 · pre 264 meseca #20
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.
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme