Zum Forum springen
OO-Basic-Problem[25...
 
Benachrichtigungen
Alles löschen

[Geschlossen] OO-Basic-Problem[25$ inside]

16 Beiträge
6 Benutzer
0 Reactions
870 Ansichten
Rolo23
Beigetreten: 18.04.2005

will meinen eigenen icm-calculator basteln und
kriege folgende Fehlermeldung, unten markiert:
"Unzulässiger Wert oder Datentyp. Index außerhalb des definierten Bereichs."
Sieht jemand meinen Fehler?
25$ für den, ders mir zum laufen bringt!

Sub Main
mydoc= thisComponent
mysheet=mydoc.sheets(0)

Spielerzelle=mysheet.getCellByPosition(1,15)
Spieler=Spielerzelle.value

Dim payouts(1 to Spieler) as double
anzpayouts=Spieler
for i=1 to Spieler
piz=mysheet.getCellByPosition(4,2+i)
payouts(i)=piz.value
if payouts(i)=0 then
anzpayouts=i-1
end if
next i

Dim stacks(1 to Spieler) as double
total=0
for j=1 to Spieler
stz=mysheet.getCellByPosition(1,2+j)
stacks(j)=stz.value
total= total+stacks(j)
next j

Bis hier hin müsste alles passen

Dim equity(1 to Spieler) as double
for k=1 to Spieler
eqz=mysheet.getCellByPosition(7,17+k)
equity(k)=getequity(k, payouts, stacks,total,1,anzpayouts)
eqz.value=equity(k)
next k

End Sub

Function getequity(player as integer, payoffs() as double, chipstacks() as double, totalchips as double, depth as integer,priceplaces as integer) as double

eq = (chipstacks(player)/totalchips)*payoffs(depth)

if depth<priceplaces then
for l=l ubound(chipstacks())
if l<>player then
c = chipstacks (l) [HIER]
chipstacks (l) = 0
eq = eq+getequity(player, payoffs, chipstacks, totalchips - c, depth+1,priceplaces) * (c/totalchips)
chipstacks(i)= c
end if
next l
end if
getequity=eq

End Function


15 Antworten
Rolo23
Beigetreten: 18.04.2005

keiner? ;(


Chaos-I
Beigetreten: 01.03.2005

Original von Rolo23
..........................

Sub Main
mydoc= thisComponent
mysheet=mydoc.sheets(0)

Spielerzelle=mysheet.getCellByPosition(1,15)
Spieler=Spielerzelle.value

Dim payouts(1 to Spieler) as double
anzpayouts=Spieler
for i=1 to Spieler
piz=mysheet.getCellByPosition(4,2+i)
payouts(i)=piz.value
if payouts(i)=0 then
anzpayouts=i-1
end if
next i

Dim stacks(1 to Spieler) as double
total=0
for j=1 to Spieler
stz=mysheet.getCellByPosition(1,2+j)
stacks(j)=stz.value
total= total+stacks(j)
next j

Bis hier hin müsste alles passen

Dim equity(1 to Spieler) as double
for k=1 to Spieler
eqz=mysheet.getCellByPosition(7,17+k)
equity(k)=getequity(k, payouts, stacks,total,1,anzpayouts)
eqz.value=equity(k)
next k

End Sub

Function getequity(player as integer, payoffs() as double, chipstacks() as double, totalchips as double, depth as integer,priceplaces as integer) as double

eq = (chipstacks(player)/totalchips)*payoffs(depth)

if depth<priceplaces then
for l=l ubound(chipstacks())
if l<>player then
c = chipstacks (l) [HIER]
chipstacks (l) = 0
eq = eq+getequity(player, payoffs, chipstacks, totalchips - c, depth+1,priceplaces) * (c/totalchips)
chipstacks(i)= c
end if
next l
end if
getequity=eq

End Function

Bin zwar ein absoluter Noob, aber irgendwie blicke ich die Zeilen nicht ...
Du definierst den Array Stacks und legst da die einzelnen Stacks der Spieler ab.
Deine Funktion Rufst Du mit der übergabe von Stacks auf ( was ist das für ein wert ) sollte da nicht stacks(k) heissen ?
equity(k)=getequity(k, payouts, stacks,total,1,anzpayouts)

Chipstacks wurde auch als Array deklariert, aber ich kann keine Zuweisung finden wo der Array gefüllt wird ...
for l=l ubound(chipstacks())

For l=l to ubound(chipstacks()) ??? Weiss ich nicht weil ich die Ubound Funktion so noch nicht benutzt habe. Jedenfalls weiss ich nicht was er Dir da zurückliefern soll, bei Ubound stacks() würde er dir die anzahl spieler zurückliefern. Aber dann haettest du dir das Ubound sparen können.

Wie gesagt ist nur aus dem Bauch raus, aber vielleicht ist ja irgendwie ein Gedankengang dabei der Dir weiterhilft :)


ich kenn zwar die sprache nicht (sieht btw. ziemlich scheiße aus), aber 2 dinge find ich seltsam:

for l=l ubound(chipstacks())

did you mean for I=1 lbound(chipstacks) to ubound(chipstacks) oder gibt es in basic wirklich so hässliche syntax?

und

chipstacks(i)= c

ich seh nicht, wo i definiert wird. meinst du dort I?


knuddelhundi
Beigetreten: 26.09.2007

for l=l ubound(chipstacks()) // for l=1 to ubound(chipstacks(),1)
if l<>player then
c = chipstacks (l-1)
chipstacks (l-1) = 0
eq = eq+getequity(player, payoffs, chipstacks, totalchips - c, depth+1,priceplaces) * (c/totalchips)
chipstacks(l-1)= c
end if
next l

evtl...?


was ist das für ein code?
Und womit läst du ihn laufen?


Chaos-I
Beigetreten: 01.03.2005

Original von KissKiss114
was ist das für ein code?
Und womit läst du ihn laufen?

VB und läuft in Excel als Macro.. Vermute ich mal schwer


larseda
Beigetreten: 06.08.2006

function eq=equity(payout,stack,total,player,depth)
eq=stack(player)/total*payout(depth);
if (depth < length(payout))
for i=1:length(stack)
if (i~=player&stack(i)>1)
c=stack(i);
stack(i)=0;
eq = equity(payout,stack,total-c,player,depth+1)*(c/total)+eq;
stack(i)=c;
end
end
end

so sieht das letzte in matlab aus
ich vermute auch den fehler in der for schleife, die syntax kann doch never stimmen
auch finde ich diese I komisch ... weil unten nutzt du dann i
weiss nicht, ob für excel I=i ist

sehe auch grade, dass du drüber ne andere syntax für for verwendet

falls es mal läuft ... würde mich mal interessieren, für wieviel spieler es klappt
weil matlab braucht für 13 spieler 30min und 14 spieler hab ich nie lange genug gewartet ...


falls jemand performanceprobleme hat, würd ich empfehlen das mal mit ner kompilierten sprache zu bauen.


larseda
Beigetreten: 06.08.2006

Original von pokersille
falls jemand performanceprobleme hat, würd ich empfehlen das mal mit ner kompilierten sprache zu bauen.

zb ?

das is aber nen generelles problem, weil sich die rekusionen einfach extrem hochschaukeln, für jeden weiteren platz
hab auch noch keien iterative lösung gesehen


hast recht, mit ner kompilierten sprache packt man auch max 1 player mehr. man sollte sich wirklich mal gedanken machen, ob man nicht nen effizienteren algorithmus findet.


larseda
Beigetreten: 06.08.2006

wobei bei meinem noch eine simple verbesserung wäre, wenn an nur die plätze berechnen lässt, die auch bezahlt werden ...
da spart man ja, je nach bsp, doch einiges


Rolo23
Beigetreten: 18.04.2005

danke leute, es läuft jetzt problemlos!

ein "l" sollte eine Eins sein und ein "i" ein "l" und das "to" hab ich iwie beim kopieren hierher verschlampt

wer will jetzt die belohnung ;-)


larseda
Beigetreten: 06.08.2006

pokersile, me oder spenden ^^
is mir egal ;9 ich streit nicht um 25$ aber ich lehn sie auch nicht ab


Rolo23
Beigetreten: 18.04.2005

hey pokersille wenn du stars oder FTP-account hast, posten und the money is urz


ty, Pedoteddy auf FTP.