PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GCC - compiler-Fehler: error: invalid operands to binary *



nomad
22-03-2008, 10:06
hi leute,
beschaeftige mich z.Z. mit Learning-Algos.
hab im web dazu ein java-prog gefunden. -> BotQLearning.java ss.Attachment ->
um dieses prog unter <C> verwenden zu koennen hab ich mich daran gemacht die einzelnen java-teile
als c-proceduren zu verwandeln.
ging gestern ganz gut:
ausser einen grossen compiler fehler:

qLearningSystem10.c: In function ‘updateQ’:
qLearningSystem10.c:569: error: invalid operands to binary *

in anweisung:
Q[s1Old][s2Old][move]=oldStateValue+alpha*(aReward+gamma*getMaxQ(s1Cur, s2Cur)-oldStateValue);


ich komm einfach nicht dahinter wie man diesen fehler beheben koennte:
Also:
1) java-code:



double updateQ(int move)

{

int s1Old=s1Cur, s2Old=s2Cur;

double oldStateValue, aReward;

System.out.println("updateQ");



if (move==indefinite) move=chooseMovement(s1Cur,s2Cur);



switch (move)

{

case armMinus: s1Cur--; break;

case armPlus: s1Cur++; break;

case handMinus: s2Cur--; break;

case handPlus: s2Cur++; break;

}

//

// Inside the paper about Q-learning, we are using a special notation.

// The correspondence between this notation and the variables of the

// program is the following:

// y = (s1cur,s2cur)

// x = (s1Old,s2old)

// a = move

// Q^*(x,a) = Q[s1Old][s2Old][move]

// V^*(y) = getMaxQ(s1Cur,s2Cur)

// r = aReward

//

oldStateValue=Q[s1Old][s2Old][move];

aReward=reward(s1Old,s2Old,s1Cur,s2Cur);

Xpos+=aReward;



--> Q[s1Old][s2Old][move]=oldStateValue+alpha*(aReward

+gamma*getMaxQ(s1Cur,s2Cur)

-oldStateValue);

System.out.println(Q[s1Old][s2Old][move]);


return aReward;

}


2) mein c-code


double updateQ(int move)
{
int s1Old=s1Cur, s2Old=s2Cur;
double oldStateValue;
//double aReward;

printf("updateQ");

if(move==indefinite) move=chooseMovement(s1Cur,s2Cur);

switch (move)
{
case 0: s1Cur--; break; // armMinus
case 1: s1Cur++; break; // armPlus
case 2: s2Cur--; break; // handMinus
case 3: s2Cur++; break; // handPlus
}

//
// Inside the paper about Q-learning, we are using a special notation.
// The correspondence between this notation and the variables of the
// program is the following:
// y = (s1cur,s2cur)
// x = (s1Old,s2old)
// a = move
// Q^*(x,a) = Q[s1Old][s2Old][move]
// V^*(y) = getMaxQ(s1Cur,s2Cur)
// r = aReward
//
oldStateValue = Q[s1Old][s2Old][move];
aReward = reward(s1Old,s2Old,s1Cur,s2Cur);
reward(s1Old,s2Old,s1Cur,s2Cur);
Xpos += aReward;

// FEHLER with error: invalid operands to binary *

Q[s1Old][s2Old][move] = oldStateValue+alpha*(aReward+gamma*getMaxQ(s1Cur,s 2Cur)-oldStateValue);

return aReward;

}


koennt mir mir bitte helfen diesen fehler zu beheben.
ohne diese funktion ist das ganze sinnlos.

ist es ueberhaupt moeglich, mit meiner zugegebenen blauaeugige
vorgehensweise dieses c-prog zu entwickeln.

waere um jede hilfe und tips sehr dankbar
frohe ostern
gruss
nomad

attachments:
- BotQLearning-java.txt
- gRLearning10-c.txt

ContainerDriver
22-03-2008, 13:26
Hallo.



ist es ueberhaupt moeglich, mit meiner zugegebenen blauaeugige
vorgehensweise dieses c-prog zu entwickeln.


Mmmh, keine Ahnung, aber warum sollte es nicht funktionieren, solange nur irgendwelche Dinge berechnet werden. :)

Zum Problem: ich kann in deinem C-Code keine Definition/Deklaration der Variable "gamma" finden. Daran stößt sich wohl auch der Compiler.

Gruß, Florian

lokicall
22-03-2008, 14:01
Hab den Code auch mal übersetzen lassen mit den entsprechenden Änderungen hat funktioniert soweit.
PS:
Irgendwo taucht mal ein Aufruf mit max auf, da stimmen die Datentypen nicht(double->int Warnung).

nomad
22-03-2008, 15:59
hi lokicall & ContainerDriver,

vielen DANK, jetzt funzzt es, bin ich froh,
aber wenn es an der nicht deklarierten var: gamma gelegen hat,
warum gibts dann diese fehlermeldung??
Die wege gcc sind sind unergruendlich.....:-)
also mit den untengemachten aenderungen (gamma deklariert) funzzts.
also nochmals vielen dank fuer eure hilfe
gruss
nomad



// PROCEDURE
double updateQ(int move)
{
int s1Old=s1Cur, s2Old=s2Cur;
double oldStateValue;
// double aReward;
double gamma;

printf("updateQ");

if(move==indefinite) move=chooseMovement(s1Cur,s2Cur);

switch (move)
{
case 0: s1Cur--; break; // armMinus
case 1: s1Cur++; break; // armPlus
case 2: s2Cur--; break; // handMinus
case 3: s2Cur++; break; // handPlus
}

//
// Inside the paper about Q-learning, we are using a special notation.
// The correspondence between this notation and the variables of the
// program is the following:
// y = (s1cur,s2cur)
// x = (s1Old,s2old)
// a = move
// Q^*(x,a) = Q[s1Old][s2Old][move]
// V^*(y) = getMaxQ(s1Cur,s2Cur)
// r = aReward
//
oldStateValue = Q[s1Old][s2Old][move];
aReward = reward(s1Old,s2Old,s1Cur,s2Cur);
reward(s1Old,s2Old,s1Cur,s2Cur);
Xpos += aReward;

Q[s1Old][s2Old][move] = oldStateValue+alpha*(aReward+gamma*getMaxQ(s1Cur,s 2Cur)-oldStateValue);


// FEHLER with error: invalid operands to binary *

return aReward;

}

jeebee
22-03-2008, 16:26
dir ist bewusst, dass beim Code den du jetzt gepostet hast, die Rechnung mit grösster Wahrscheinlichkeit Schwachsinn produzieren wird, da du gamma nirgends einen Wert zuweist und lokale Variablen in C nicht mit 0 oder sonstwas initialisiert werden?

ContainerDriver
22-03-2008, 16:29
hi lokicall & ContainerDriver,

vielen DANK, jetzt funzzt es, bin ich froh,
aber wenn es an der nicht deklarierten var: gamma gelegen hat,
warum gibts dann diese fehlermeldung??
Die wege gcc sind sind unergruendlich.....:-)


In math.h bzw. bits/mathcalls.h gibt es eine Funktion gamma, daher hat der Compiler wohl den Namen gekannt und sich nicht über eine unbekannte Variable beschwert. Wie der Compiler dieses gamma dann aber interpretiert hat, weiß ich auch nicht...

Gruß, Florian

BLUESCREEN3D
22-03-2008, 18:37
In math.h bzw. bits/mathcalls.h gibt es eine Funktion gamma, daher hat der Compiler wohl den Namen gekannt und sich nicht über eine unbekannte Variable beschwert. Wie der Compiler dieses gamma dann aber interpretiert hat, weiß ich auch nicht...
Der Compiler hat das wohl einfach als Funktion angesehen und man kann halt keine Funktion mit einem double multiplizieren. Daher der Fehler "invalid operands to binary *" (binary heißt hier, dass der Operator 2 Parameter hat).

Übrigens: Wenn man das in einem C++-Programm versucht, ist die Fehlermeldung aussagekräftiger:
"error: invalid operands of types ‘double ()(double)’ and ‘double’ to binary ‘operator*’"

nomad
23-03-2008, 08:43
hi,
@bluescreen: vielen dank fuer deine hinweise.

@jeebee: ist mir bewusst, in diesem fall ging es mir nur darum, den code
compilieren zu koennen.
das ausarbeiten und der einbau des codes in ein grafikprog, folgt (gtk 2D,
opengl fuer 3D).
vielen dank fuer deinen hinweis.
@ContainerDriver: auch dir vielen dank,

die fehler werden dann kommen, wenn ich das prog weiterentwickle.
im augenblick geht's mir nur um den algo von QReinforcement-learning.

gruss
nomad