OO-Basic-Problem[25$ inside]

    • Rolo23
      Rolo23
      Bronze
      Dabei seit: 18.04.2005 Beiträge: 743
      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
      Rolo23
      Bronze
      Dabei seit: 18.04.2005 Beiträge: 743
      keiner? ;(
    • Chaos-I
      Chaos-I
      Bronze
      Dabei seit: 01.03.2005 Beiträge: 805
      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 :)
    • pokersille
      pokersille
      Bronze
      Dabei seit: 28.01.2008 Beiträge: 565
      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
      knuddelhundi
      Bronze
      Dabei seit: 26.09.2007 Beiträge: 5.142
      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...?
    • KissKiss114
      KissKiss114
      Einsteiger
      Dabei seit: 24.08.2008 Beiträge: 11
      was ist das für ein code?
      Und womit läst du ihn laufen?
    • Chaos-I
      Chaos-I
      Bronze
      Dabei seit: 01.03.2005 Beiträge: 805
      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
      larseda
      Bronze
      Dabei seit: 06.08.2006 Beiträge: 9.299
      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 ...
    • pokersille
      pokersille
      Bronze
      Dabei seit: 28.01.2008 Beiträge: 565
      falls jemand performanceprobleme hat, würd ich empfehlen das mal mit ner kompilierten sprache zu bauen.
    • larseda
      larseda
      Bronze
      Dabei seit: 06.08.2006 Beiträge: 9.299
      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
    • pokersille
      pokersille
      Bronze
      Dabei seit: 28.01.2008 Beiträge: 565
      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
      larseda
      Bronze
      Dabei seit: 06.08.2006 Beiträge: 9.299
      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
      Rolo23
      Bronze
      Dabei seit: 18.04.2005 Beiträge: 743
      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
      larseda
      Bronze
      Dabei seit: 06.08.2006 Beiträge: 9.299
      pokersile, me oder spenden ^^
      is mir egal ;9 ich streit nicht um 25$ aber ich lehn sie auch nicht ab :D
    • Rolo23
      Rolo23
      Bronze
      Dabei seit: 18.04.2005 Beiträge: 743
      hey pokersille wenn du stars oder FTP-account hast, posten und the money is urz
    • pokersille
      pokersille
      Bronze
      Dabei seit: 28.01.2008 Beiträge: 565
      ty, Pedoteddy auf FTP.