Anzeige:
Ergebnis 1 bis 8 von 8

Thema: GCC - compiler-Fehler: error: invalid operands to binary *

  1. #1
    Registrierter Benutzer
    Registriert seit
    18.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150

    GCC - compiler-Fehler: error: invalid operands to binary *

    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:

    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
    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,s2Cur)-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

  2. #2
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Hallo.

    Zitat Zitat von nomad
    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
    Ein gebrechlich Wesen ist der X-Server.

  3. #3
    Registrierter Benutzer Avatar von lokicall
    Registriert seit
    17.12.2005
    Beiträge
    53
    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).

  4. #4
    Registrierter Benutzer
    Registriert seit
    18.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    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

    Code:
    // 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,s2Cur)-oldStateValue);
         
        
         // FEHLER with error: invalid operands to binary *
              
         return aReward;
    
      }

  5. #5
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    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?
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  6. #6
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Zitat Zitat von nomad Beitrag anzeigen
    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
    Ein gebrechlich Wesen ist der X-Server.

  7. #7
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von ContainerDriver Beitrag anzeigen
    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*’"

  8. #8
    Registrierter Benutzer
    Registriert seit
    18.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •