Bind parametra C funkcie

Sekcia: Programovanie 28.03.2020 | 06:39
Avatar Miroslav Bendík Gentoo  Administrátor

Ahojte,
riešim jeden projekt v C a potreboval by som v ňom zaregistrovať svoju funkciu ako callback. Problém je, že potrebujem tých registrácií viacej a potrebujem ich rozlíšiť. Keďže callback prijíma len void funkciu (je to externá knižnica, keby bol môj kód tak si tam ten parameter pridám), ja by som potreboval za behu vytvoriť "funkcionálny objekt" s nabindovaným parametrom.

Keby to bol projekt v C++ použil by som std::bind. Existuje niečo podobné, ako std::bind v C?

    • RE: Bind parametra C funkcie 28.03.2020 | 09:19
      Avatar debian+   Návštevník

      Myslis funkciu bind() pre sietarske veci?

      Ak nie, tak daj pseudokod, ako by malo robit, kedze c++ sa az tak nevvyznam a neprislo mi tam jednoznacne na pochopenie.

      • RE: Bind parametra C funkcie 28.03.2020 | 10:47
        Avatar Miroslav Bendík Gentoo  Administrátor
        // Kód knižnice
        
        typedef void(*callback)(void);
        
        void registerCallback(callback fn);
        
        // Môj kód
        void mojCallback(display *d) {
            ....
        }
        
        // Registrácia
        display *d;
        registerCallback(bind(mojCallback, d));
        

        Funkcia bind slúži na bindovanie parametrov funkcie, takže vráti funkciu bez parametrov.

        • RE: Bind parametra C funkcie 28.03.2020 | 11:27
          Avatar debian+   Návštevník

          Čo znamená slovo bindovat? Aby sme pod tým pojmom mysleli to isté.

          • RE: Bind parametra C funkcie 28.03.2020 | 11:29
            Avatar Miroslav Bendík Gentoo  Administrátor

            Jednoducho aby to robilo to isté, čo std::bind zo stdc++ knižnice.

            • RE: Bind parametra C funkcie 28.03.2020 | 12:00
              Avatar samalama   Návštevník

              nechapem, ze sa s nim bavis, ked chlapec tomu vobec, ale ze vobec nerozumie. a ani nie ze nerozumie, ale on ani nechape, o co tu ide...

    • RE: Bind parametra C funkcie 28.03.2020 | 12:13
      Avatar debian+   Návštevník
      Keby to bol projekt v C++ použil by som std::bind. Existuje niečo podobné, ako std::bind v C?

      Nie.

      1. riesenie: Nech autor knihovny zmeni na:

      typedef void(*callback)(void *data);
      
      void registerCallback(callback fn);
      

      A cez data vies dat hocijake data (i pointery na funkcie). Alebo podla cisla rozhodovat kt. funkciu zavola.

      2. riesenie Klasicky C-kovsky:

      static display *display_001=NULL;
      void display_001_callback()
      {
          if(display_001 == NULL)
          {
              fputs("display_001_callback() unknow parameter", stderr);
              exit(1);
          }
          
          /* pokracujes pracou s display_001 */
      }
      
      void pseudo_main(){
          display *d;
          
          display_001=d;
          registerCallback(display_001_callback);
      }
      

      • RE: Bind parametra C funkcie 28.03.2020 | 12:42
        Avatar Miroslav Bendík Gentoo  Administrátor

        1. nie, špecifikáciu glutDisplayFunc vážne nedokážem zmeniť.

        2. nie, pretože okná sú vytvárané dynamicky, nie staticky.

        • RE: Bind parametra C funkcie 28.03.2020 | 13:26
          Avatar debian+   Návštevník

          2) pozor, v C static znamena nieco ine, ako v C++ !!! Si si toho vedomy. To nevadi, ze sa hodnota display_001 bude x krat v programe menit.

        • RE: Bind parametra C funkcie 28.03.2020 | 13:30
          Avatar debian+   Návštevník

          1) Ak to nemozes zmenit, tak zmen kniznicu. Trebars na renderovanie pouzi SDL.

    • RE: Bind parametra C funkcie 28.03.2020 | 12:15
      Avatar debian+   Návštevník

      Oprava: Alebo podla cisla rozhodovat kt. funkciu zavola tvoja hlavna managerska callback funkcia. Kedze vsetko sa da zamenit na void * (tj. adresu), takze moze tam byt aj cislo alebo hocico.

    • RE: Bind parametra C funkcie 28.03.2020 | 13:03
      Avatar xkucf03   Používateľ

      Je to strašná prasárna, ale: udělat novou funkci, která bude mít lokální proměnnou (ten parametr) a bude s ní volat tu tvoji funkci. Pak tu novou funkci zkopírovat na jiné místo v paměti a hodnotu té proměnné tam přepsat.

      Možná existuje nějaká knihovna, která už tohle dělá… případně použít nějakou knihovnu pro dynamické generování/kompilování kódu za běhu.

      Jinak samozřejmě čisté řešení je, aby se upravila ta knihovna, která přijímá callback, aby vedle něj brala i ukazatel, kterým lze předat libovolný parametr.

      Ale nejsem expert na C, tak možná existuje nějaké jednodušší řešení…

    • RE: Bind parametra C funkcie 28.03.2020 | 13:58
      Avatar Miroslav Bendík Gentoo  Administrátor

      Ok, tak inak. V renderovacej funikcii viem získať ID aktuálneho okna, takže namiesto parametra funkcie si vytvorím zoznam okien, v ňom vyhľadám parameter, ktorý som chcel poslať funkcii a nejak to +/- funguje ak je to správne omutexované. Povedzme, že je to uzavreté.