2 Stimmen

Problem mit der Anzahl/Typ der Argumente, die an einen überladenen C++-Konstruktor übergeben werden, der mit Swig umhüllt ist

Ich versuche, eine C++-Klasse (nennen wir sie "Spam"), die von jemand anderem geschrieben wurde, mit Swig zu verpacken, um sie für Python freizugeben. Nachdem ich mehrere Probleme gelöst habe, kann ich das Modul in Python importieren, aber wenn ich versuche, ein Objekt einer solchen Klasse zu erstellen, erhalte ich den folgenden Fehler:

 foo = Spam.Spam('abc',3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "Spam.py", line 96, in __init__
    this = _Spam.new_Spam(*args)
NotImplementedError: Wrong number of arguments for overloaded function 'new_Spam'.
  Possible C/C++ prototypes are:
    Spam(unsigned char *,unsigned long,bool,unsigned int,SSTree::io_action,char const *)
    Spam(unsigned char *,unsigned long,bool,unsigned int,SSTree::io_action)
    Spam(unsigned char *,unsigned long,bool,unsigned int)
    Spam(unsigned char *,unsigned long,bool)
    Spam(unsigned char *,unsigned long)

Beim Googeln habe ich festgestellt, dass der Fehler wahrscheinlich durch die Art der Argumente und nicht durch die Anzahl verursacht wird (was ziemlich verwirrend ist), aber ich kann ihn immer noch nicht identifizieren. Ich vermute, dass das Problem in der Übergabe einer Zeichenkette als erstes Argument liegt, habe aber keine Ahnung, wie man es beheben kann (bedenken Sie, dass ich fast kein C/C++ kenne).

2voto

Aaron Saarela Punkte 3816

SWIG behandelt Strings als 'char*'. Ihre Verwendung von 'unsigned char *' verwirrt es höchstwahrscheinlich. Sie können entweder die Signatur in 'char *' ändern oder eine Typemap bereitstellen:

%typemap(in) unsigned char * = char*

2voto

mab Punkte 431

Versuchen Sie es mit:

%typemap(in) (unsigned char *) = (char *);

-2voto

George John Punkte 1

Dies kann durch Änderung der Zeilen 100 bis 110 gelöst werden

self.source = uhd_receiver(options.args, symbol_rate,
                           options.samples_per_symbol,
                           options.rx_freq, 
                           options.rx_gain, options.spec, options.antenna,
                           options.verbose)

self.sink = uhd_transmitter(options.args, symbol_rate,
                            options.samples_per_symbol,
                            options.tx_freq, 
                            options.tx_gain, options.spec, options.antenna,
                            options.verbose)

zum Folgenden

self.source = uhd_receiver(options.args, symbol_rate,
                           options.samples_per_symbol, 
                           options.rx_freq, 
              ---------->  options.lo_offset,
                           options.rx_gain, options.spec, options.antenna,
              ---------->  options.clock_source,
                           options.verbose)

self.sink = uhd_transmitter(options.args, symbol_rate,
                            options.samples_per_symbol, 
                            options.tx_freq,
              ---------->   options.lo_offset, 
                            options.tx_gain, options.spec, options.antenna,
              ---------->   options.clock_source, 
                            options.verbose)

Viel Glück

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X