« Return to Thread: %include directive.

Type mismatch...

by Guillaume Yziquel-4 :: Rate this Message:

Reply to Author | View in Thread

William S Fulton a écrit :

> I don't know the OCAML module and what files it generates, but in the
> code below, you don't have any %template directive for wrapping
> std::list. Please read the C++ chapter in the documentation on template
> wrapping. %module should also be at the top of the interface file, but
> it shouldn't matter given that you only have a %include of a templated
> library above it. As you've commented out most of your code, you will
> only get wrappers for tokenizer and spitter, it isn't clear if you were
> expecting more.
>
> William

OK.

Got a %template working. freeling.i is at the bottom of this email.

I'm surprised about the following compiler error.

> gcc -fPIC -O2 -c -xc++ freeling_wrap.cxx.c
> freeling_wrap.cxx.c: In function ‘caml_value_t _wrap_word_select_analysisswig_Freeling(caml_value_t)’:
> freeling_wrap.cxx.c:5107: error: no matching function for call to ‘word::select_analysis(analysis&)’
> /usr/include/fries/language.h:214: note: candidates are: void word::select_analysis(std::_List_iterator<analysis>)

Seems to me that the wrapping code make a mistake concerning the
select_analysis function wrapper. Line 5107 expects an *arg2 of type
analysis...

> freeling_wrap.cxx.c:
>
>   5090  SWIGEXT CAML_VALUE _wrap_word_select_analysisswig_Freeling (CAML_VALUE args)
>   5091  {
>   5092    CAMLparam1(args);
>   5093    SWIG_CAMLlocal2(swig_result,rv);
>   5094    int _v = 0;
>   5095    word *arg1 = (word *) 0 ;
>   5096    analysis *arg2 = 0 ;
>   5097    
>   5098    swig_result = Val_unit;
>   5099    {
>   5100      /* %typemap(in) SWIGTYPE * */
>   5101      arg1 = (word *)caml_ptr_val(caml_list_nth(args,0),SWIGTYPE_p_word);
>   5102    }
>   5103    {
>   5104      /* %typemap(in) SWIGTYPE & */
>   5105      arg2 = (analysis *) caml_ptr_val(caml_list_nth(args,1),SWIGTYPE_p_analysis);
>   5106    }
>   5107    (arg1)->select_analysis(*arg2);
>   5108    rv = Val_unit;
>   5109    swig_result = caml_list_append(swig_result,rv);
>   5110    CAMLreturn(swig_result);
>   5111  }

But it is declared in language.h as void select_analysis(word::iterator);

So there's a typing mismatch in the wrapper code. Is it a bug of swig,
or a bug of my brain?

freeling.i file follows at the bottom of the mail.

> language.h:
>
>    102  class word : public std::list<analysis> {
>    103     private:
>    104       /// lexical form
>    105       std::string form;                
>    106       /// first selected analysis (if any)
>    107       word::iterator selected;
>    108       /// empty list if not a multiword
>    109       std::list<word> multiword;
>    110       /// token span
>    111       unsigned long start, finish;
>    112       /// word form found in dictionary
>    113       bool in_dict;
>    114       /// word morphological shouldn't be further modified
>    115       bool locked;
>    116  
>    117     public:
>    118        /// user-managed data, we just store it.
>    119        std::vector<std::string> user;
>    120  
>    121        /// constructor
>    122        word();
>    123        /// constructor
>    124        word(const std::string &);
>    125        /// constructor
>    126        word(const std::string &, const std::list<word> &);
>    127        /// constructor
>    128        word(const std::string &, const std::list<analysis> &, const std::list<word> &);
>    129        /// Copy constructor
>    130        word(const word &);
>    131        /// assignment
>    132        word& operator=(const word&);
>    133  
>    134        /// Get the number of selected analysis
>    135        int get_n_selected(void) const;
>    136        /// get the number of unselected analysis
>    137        int get_n_unselected(void) const;
>    138        /// true iff the word is a multiword compound
>    139        bool is_multiword(void) const;
>    140        /// get number of words in compound
>    141        int get_n_words_mw(void) const;
>    142        /// get word objects that compound the multiword
>    143        std::list<word> get_words_mw(void) const;
>    144        /// get word form
>    145        std::string get_form(void) const;
>    146        /// Get an iterator to the first selected analysis
>    147        word::iterator selected_begin(void);
>    148        /// Get an iterator to the first selected analysis
>    149        word::const_iterator selected_begin(void) const;
>    150        /// Get an iterator to the end of selected analysis list
>    151        word::iterator selected_end(void);
>    152        /// Get an iterator to the end of selected analysis list
>    153        word::const_iterator selected_end(void) const;
>    154        /// Get an iterator to the first unselected analysis
>    155        word::iterator unselected_begin(void);
>    156        /// Get an iterator to the first unselected analysis
>    157        word::const_iterator unselected_begin(void) const;
>    158        /// Get an iterator to the end of unselected analysis list
>    159        word::iterator unselected_end(void);
>    160        /// Get an iterator to the end of unselected analysis list
>    161        word::const_iterator unselected_end(void) const;
>    162        /// get lemma for the selected analysis in list
>    163        std::string get_lemma(void) const;
>    164        /// get parole for the selected analysis  
>    165        std::string get_parole(void) const;
>    166        /// get parole (short version) for the selected analysis  
>    167        std::string get_short_parole(const std::string &) const;
>    168  
>    169        /// get sense list for the selected analysis  
>    170        std::list<std::string> get_senses(void) const;
>    171        // useful for java API
>    172        std::string get_senses_string(void) const;
>    173        /// set sense list for the selected analysis  
>    174        void set_senses(const std::list<std::string> &);
>    175    
>    176        /// get token span.
>    177        unsigned long get_span_start(void) const;
>    178        unsigned long get_span_finish(void) const;
>    179  
>    180        /// get in_dict
>    181        bool found_in_dict(void) const;
>    182        /// set in_dict
>    183        void set_found_in_dict(bool);
>    184        /// check if there is any retokenizable analysis
>    185        bool has_retokenizable(void) const;
>    186        /// mark word as having definitive analysis
>    187        void lock_analysis();
>    188        /// check if word is marked as having definitive analysis
>    189        bool is_locked(void) const;
>    190  
>    191        /// add one analysis to current analysis list  (no duplicate check!)
>    192        void add_analysis(const analysis &);
>    193        /// set analysis list to one single analysis, overwriting current values
>    194        void set_analysis(const analysis &);
>    195        /// set analysis list, overwriting current values
>    196        void set_analysis(const std::list<analysis> &);
>    197        /// set word form
>    198        void set_form(const std::string &);
>    199        /// set token span
>    200        void set_span(unsigned long, unsigned long);
>    201        
>    202        /// look for an analysis with a parole matching given regexp
>    203        bool find_tag_match(RegEx &);
>    204  
>    205        /// get number of analysis in current list
>    206        int get_n_analysis(void) const;
>    207        /// copy analysis list
>    208        void copy_analysis(const word &);
>    209        /// empty the list of selected analysis
>    210        void unselect_all_analysis();
>    211        /// mark all analysisi as selected
>    212        void select_all_analysis();
>    213        /// add the given analysis to selected list.
>    214        void select_analysis(word::iterator);
>    215        /// remove the given analysis from selected list.
>    216        void unselect_analysis(word::iterator);
>    217        /// get list of analysis (useful for perl API)
>    218        std::list<analysis> get_analysis(void) const;
>    219        /// get begin iterator to analysis list (useful for perl/java API)
>    220        word::iterator analysis_begin(void);
>    221        word::const_iterator analysis_begin(void) const;
>    222        /// get end iterator to analysis list (useful for perl/java API)
>    223        word::iterator analysis_end(void);
>    224        word::const_iterator analysis_end(void) const;
>    225  };

All the best,

Guillaume Yziquel.

freeling.i file:

> %module swig_Freeling
> %{
>   #include "freeling.h"
>   #include "fries.h"
> %}
>
> %include std_list.i
>
> %template(ListAnalysis) std::list<analysis>;
>
> // Fries declarations.
>
> class analysis {
>    public:
>       /// user-managed data, we just store it.
>       std::vector<std::string> user;
>
>       /// constructor
>       analysis();
>       /// constructor
>       analysis(const std::string &, const std::string &);
>       /// assignment
>       analysis& operator=(const analysis&);
>
>       void set_lemma(const std::string &);
>       void set_parole(const std::string &);
>       void set_prob(double);
>       void set_retokenizable(const std::list<word> &);
>
>       bool has_prob(void) const;  
>       std::string get_lemma(void) const;
>       std::string get_parole(void) const;
>       std::string get_short_parole(const std::string &) const;
>       double get_prob(void) const;
>       bool is_retokenizable(void) const;
>       std::list<word> get_retokenizable(void) const;
>
>       std::list<std::string> get_senses(void) const;
>       std::string get_senses_string(void) const;
>       void set_senses(const std::list<std::string> &);
>
> };
>
> class word : public std::list<analysis> {
>    public:
>       /// user-managed data, we just store it.
>       std::vector<std::string> user;
>
>       /// constructor
>       word();
>       /// constructor
>       word(const std::string &);
>       /// constructor
>       word(const std::string &, const std::list<word> &);
>       /// constructor
>       word(const std::string &, const std::list<analysis> &, const std::list<word> &);
>       /// Copy constructor
>       word(const word &);
>       /// assignment
>       word& operator=(const word&);
>
>       /// Get the number of selected analysis
>       int get_n_selected(void) const;
>       /// get the number of unselected analysis
>       int get_n_unselected(void) const;
>       /// true iff the word is a multiword compound
>       bool is_multiword(void) const;
>       /// get number of words in compound
>       int get_n_words_mw(void) const;
>       /// get word objects that compound the multiword
>       std::list<word> get_words_mw(void) const;
>       /// get word form
>       std::string get_form(void) const;
>       /// Get an iterator to the first selected analysis
>       word::iterator selected_begin(void);
>       /// Get an iterator to the first selected analysis
>       word::const_iterator selected_begin(void) const;
>       /// Get an iterator to the end of selected analysis list
>       word::iterator selected_end(void);
>       /// Get an iterator to the end of selected analysis list
>       word::const_iterator selected_end(void) const;
>       /// Get an iterator to the first unselected analysis
>       word::iterator unselected_begin(void);
>       /// Get an iterator to the first unselected analysis
>       word::const_iterator unselected_begin(void) const;
>       /// Get an iterator to the end of unselected analysis list
>       word::iterator unselected_end(void);
>       /// Get an iterator to the end of unselected analysis list
>       word::const_iterator unselected_end(void) const;
>       /// get lemma for the selected analysis in list
>       std::string get_lemma(void) const;
>       /// get parole for the selected analysis  
>       std::string get_parole(void) const;
>       /// get parole (short version) for the selected analysis  
>       std::string get_short_parole(const std::string &) const;
>
>       /// get sense list for the selected analysis  
>       std::list<std::string> get_senses(void) const;
>       std::string get_senses_string(void) const;
>       /// set sense list for the selected analysis  
>       void set_senses(const std::list<std::string> &);
>    
>       /// get token span.
>       unsigned long get_span_start(void) const;
>       unsigned long get_span_finish(void) const;
>
>       /// get in_dict
>       bool found_in_dict(void) const;
>       /// set in_dict
>       void set_found_in_dict(bool);
>       /// check if there is any retokenizable analysis
>       bool has_retokenizable(void) const;
>
>       /// add one analysis to current analysis list  (no duplicate check!)
>       void add_analysis(const analysis &);
>       /// set analysis list to one single analysis, overwriting current values
>       void set_analysis(const analysis &);
>       /// set analysis list, overwriting current values
>       void set_analysis(const std::list<analysis> &);
>       /// set word form
>       void set_form(const std::string &);
>       /// set token span
>       void set_span(unsigned long, unsigned long);
>      
>       /// look for an analysis with a parole matching given regexp
>       bool find_tag_match(RegEx &);
>
>       /// get number of analysis in current list
>       int get_n_analysis(void) const;
>       /// copy analysis list
>       void copy_analysis(const word &);
>       /// empty the list of selected analysis
>       void unselect_all_analysis();
>       /// mark all analysisi as selected
>       void select_all_analysis();
>       /// add the given analysis to selected list.
>       void select_analysis(word::iterator);
>       /// remove the given analysis from selected list.
>       void unselect_analysis(word::iterator);
>       /// get list of analysis (useful for perl API)
>       std::list<analysis> get_analysis(void) const;
>       /// get begin iterator to analysis list (useful for perl/java API)
>       word::iterator analysis_begin(void);
>       word::const_iterator analysis_begin(void) const;
>       /// get end iterator to analysis list (useful for perl/java API)
>       word::iterator analysis_end(void);
>       word::const_iterator analysis_end(void) const;
> };
>
>
> // Freeling declarations.
>
> class tokenizer {
>    public:
>        /// Constructor
>        tokenizer(const std::string &);
>
>        /// tokenize string with default options
>        std::list<word> tokenize(const std::string &);
>        /// tokenize string with default options, tracking offset in given int param.
>        std::list<word> tokenize(const std::string &, unsigned long &);
> };

--
      Guillaume Yziquel
http://yziquel.homelinux.org/

------------------------------------------------------------------------------
_______________________________________________
Swig-user mailing list
Swig-user@...
https://lists.sourceforge.net/lists/listinfo/swig-user

 « Return to Thread: %include directive.